changeset 50:e30a4bd074db

more cleaning up projects.
author casties
date Mon, 29 Apr 2013 20:34:17 +0200
parents e40ff9829108
children d456fe185649
files MPIWGProjects.py MPIWGProjects_removed.py MPIWGRoot.py MPIWGRoot_deleted_methods.py zpt/MPIWGProject_index.zpt zpt/MPIWGProject_newfile.zpt zpt/MPIWGProject_versionManageForm.zpt zpt/edit_MPIWGBasis.zpt zpt/project/description_only_html.zpt zpt/project/edit_basic.zpt zpt/project/edit_description.zpt zpt/project/edit_template.zpt zpt/project/manage_newfile.zpt zpt/project/project_template.zpt
diffstat 14 files changed, 872 insertions(+), 966 deletions(-) [+]
line wrap: on
line diff
--- a/MPIWGProjects.py	Mon Apr 29 18:00:46 2013 +0200
+++ b/MPIWGProjects.py	Mon Apr 29 20:34:17 2013 +0200
@@ -74,8 +74,7 @@
 
 definedFields = fieldLabels.keys() # TODO: should this be sorted?
 
-checkFields = ['xdata_01']
-
+editableFields = ('xdata_01', 'xdata_05', 'xdata_07', 'xdata_08', 'xdata_11', 'xdata_12', 'xdata_13')
 
 # die folgenden Klassen sind jetzt in einzelne Files ausgelagert aus Kompatibilitaetsgruenden, bleiben die Klassen hier noch drin.
 # Sonst funktionieren die alten Webseiten nicht mehr.
@@ -301,16 +300,20 @@
     #
     # templates
     #
+    project_template = PageTemplateFile('zpt/project/project_template', globals())
+    # edit templates
     edit_css = ImageFile('css/edit.css', globals())
     # make css refreshable for development
     edit_css.index_html = refreshingImageFileIndexHtml
     edit_basic = PageTemplateFile('zpt/project/edit_basic', globals())
     editForm = PageTemplateFile('zpt/project/edit_description', globals())
     edit_template = PageTemplateFile('zpt/project/edit_template', globals())
-    project_template = PageTemplateFile('zpt/project/project_template', globals())
+    # management templates
+    loadNewFileForm = PageTemplateFile('zpt/project/manage_newfile', globals())
+    description_only_html = PageTemplateFile('zpt/project/description_only_html', globals())
+
     # TODO: this should go away
     extendedBibliography = PageTemplateFile('zpt/project/extendedBibliography_template', globals())
-
     # TODO: compat
     edit_MPIWGProject_main = edit_template
 
@@ -356,383 +359,6 @@
         logging.debug(email.Utils.formatdate() + ' GMT')
         RESPONSE.redirect(url + addStr % timeStamp)
 
-    def decode(self, str):
-        """return unicode object"""
-        return unicodify(str)
-
-    def isCheckField(self, fieldname):
-        """return chechfield"""
-        return (fieldname in checkFields)
- 
-    def sortedByPlace(self, metatype):
-        """find metatype and sort by place"""
-        def sort(x, y):
-            return cmp(getattr(x[1], 'place', 0), getattr(y[1], 'place', 0))
-
-        logging.debug("MPIWGProjects begin: sorted by place: " + metatype)
-        founds = self.ZopeFind(self, obj_metatypes=[metatype]);
-        
-        founds.sort(sort)
-        logging.debug("MPIWGProjects end: sorted by place: " + metatype)
-        return founds
-    
-
-    def copyPublicationsToList(self, RESPONSE=None):
-        """copy publications in to list"""
-
-        publicationTxt = self.getContent('WEB_related_pub')
-
-        pubSplits = publicationTxt.split("<p>")
-
-        for pubSplit in pubSplits:
-            pubSplit = pubSplit.replace("</p>", "")
-            self.addPublication(pubSplit)
-
-        setattr(self, "WEB_related_pub_copied", True);
-        
-        if RESPONSE:
-                
-            self.redirect(RESPONSE, 'managePublications')
-        
-    def hasRelatedPublicationsOldVersion(self):
-        """teste ob es related publications gibt"""
-        
-        ret = True;
-        if (self.getContent('WEB_related_pub') == ''):
-            ret = False;  # nichts im alten feld
-        logging.debug("webrel:" + repr(ret))
-        if (getattr(self, 'WEB_related_pub_copied', False)):
-            ret = False;  # alte daten sind schon kopiert worden
-        
-        logging.debug("webrel_copied:" + repr(ret))
-        publications = self.ZopeFind(self, obj_metatypes=['MPIWGProject_publication']);
-        
-        if(len(publications) > 0):
-            ret = False;  # es gibt publicationen in der neuen liste
-      
-        
-        logging.debug("len(publ)" + repr(ret))
-        
-        return ret;
-
-
-    def hasInlineImage(self):
-        """Return the number of inline images in the description."""
-        text = self.getDescription()
-        cnt = text.count('<p class="picture">')
-        return cnt
-    
-    
-    def copyImageToMargin(self, RESPONSE=None):  
-        """copy inline images to marginal images"""
-        # getImages from WEB_project_description
-        description = self.getDescription()
-        
-        text2 = description
-        splitted = text2.split("""<p class="picture">""")
-        
-        imageURLs = []
-        imageCaptions = []
-        for split in splitted[1:]:
-                tmp = split.split("</p>")
-                # return repr(splitted[1])
-                
-                try:
-                    imageURLs.append(tmp[0].split("\"")[1].encode('utf-8'))
-                except:
-                    
-                    try:
-                        imageURLs.append(tmp[0].split("src=")[1].split(" ")[0].encode('utf-8'))
-                    except:
-                        imageURLs.append("")
-                
-                split2 = "</p>".join(tmp[1:])
-                splitted = split2.split("""<p class="picturetitle">""")
-                if len(splitted) > 1:
-                    tmp = splitted[1].split("</p>")
-                    imageCaptions.append(tmp[0].encode('utf-8'))
-
-                else:
-                    # keine caption
-                    imageCaptions.append("")
-     
-        # eintragen:
-        for imageURL in imageURLs:
-            if not imageURL:
-                # no URL - no image
-                continue
-            
-            filename = imageURL.split("/")[-1]
-            # lege neues images object an, mit leerem bild
-
-            if filename in self:
-                # existiert das bild schon, dann neuen filenamen
-                filename = "project_image_" + filename
-                if filename in self:
-                    # exists too - assume its already converted
-                    logging.warn("copyImageToMargin: image %s exists - skipping!"%filename)
-                    continue
-            
-            self.addImage(None, imageCaptions[imageURLs.index(imageURL)], filename=filename)
-            # hole die bilddaten aus der url
-            url = self.absolute_url() + "/" + imageURL
-            # url=self.absolute_url()+"/"+filename
-        
-            try:  # relative url
-                data = urllib.urlopen(url).read()
-            except:
-                try:  # absolute
-                    data = urllib.urlopen(self.imageURL).read()
-                except:
-                    logging.error("copyImageToMargin: can't open: %s" % url)
-            
-            obj = getattr(self, filename)
-            obj.update_data(data)
-        
-        # clean description
-        logging.debug("copyImageToMargin: description:%s"%repr(description))
-        dom = ET.fromstring("<html>%s</html>"%description)
-        for e in dom.findall(".//p[@class='picture']"):
-            # remove contents
-            e.clear()
-            # remove tag
-            e.tag = None
-            
-        for e in dom.findall(".//p[@class='picturetitle']"):
-            # remove contents
-            e.clear()
-            # remove tag
-            e.tag = None
-            
-        # remove html tag
-        dom.tag = None
-        # set as new description
-        description = serialize(dom)
-        logging.debug("copyImageToMargin: new description:%s"%repr(description))
-        setattr(self, 'WEB_project_description', description)
-        
-        if RESPONSE:
-            self.redirect(RESPONSE, 'manageImages')
-
-            
-    def manageImages(self, imageName=None, op=None):
-        """managage images"""
-        if imageName and op:
-            if op == 'up':
-                images = self.getImages()
-                for image in images:
-                    if image[0] == imageName:
-                        nr = images.index(image)
-                        if not nr == 0:
-                            images[nr - 1][1].place += 1
-                            images[nr][1].place -= 1
-                        pass
-            elif op == 'down':
-                images = self.getImages()
-                for image in images:
-                    if image[0] == imageName:
-                        nr = images.index(image)
-                        if not (nr == len(images) - 1):
-                            images[nr + 1][1].place -= 1
-                            images[nr][1].place += 1
-                        pass
-
-
-        pt = PageTemplateFile('zpt/project/edit_images', globals()).__of__(self)
-        return pt()
-
-    def managePublications(self, pubName=None, op=None):
-        """managage images"""
-        if pubName and op:
-            if op == 'up':
-                publications = self.getPublications()
-                for publication in publications:
-                    if publication[0] == pubName:
-                        nr = publications.index(publication)
-                        if not nr == 0:
-                            publications[nr - 1][1].place += 1
-                            publications[nr][1].place -= 1
-                        pass
-            elif op == 'down':
-                publications = self.getPublications()
-                for publication in publications:
-                    if publication[0] == pubName:
-                        nr = publications.index(publication)
-                        if not (nr == len(publications) - 1):
-                            publications[nr + 1][1].place -= 1
-                            publications[nr][1].place += 1
-                        pass
-
-
-        pt = PageTemplateFile('zpt/project/edit_publications', globals()).__of__(self)
-        return pt()
-    
-    def manageRelatedProjects(self, pubName=None, op=None):
-        """managage relatedProjectd"""
-        if pubName and op:
-            if op == 'up':
-                relatedProjects = self.getRelatedProjects()
-                for project in relatedProjects:
-                    if project[0] == pubName:
-                        nr = relatedProjects.index(project)
-                        if not nr == 0:
-                            relatedProjects[nr - 1][1].place += 1
-                            relatedProjects[nr][1].place -= 1
-                        pass
-            elif op == 'down':
-                relatedProjects = self.getRelatedProjects()
-                for project in relatedProjects:
-                    if project[0] == pubName:
-                        nr = relatedProjects.index(project)
-                        if not (nr == len(relatedProjects) - 1):
-                            relatedProjects[nr + 1][1].place -= 1
-                            relatedProjects[nr][1].place += 1
-                        pass
-
-
-        pt = PageTemplateFile('zpt/project/edit_related_projects', globals()).__of__(self)
-        return pt()
-    
-    
-    def hasExtendedPublicationList(self):
-        """test if extended publication list exists"""
-        if not hasattr(self, "publicationList"):
-            return False
-        else:
-            return True
-        
-    def createExtendedPublicationList(self, RESPONSE=None):
-        """erzeuge erweiterte publications liste"""
-        pl = BibliographyManager("publicationList", "", "institutsbiblio", self.connection_id)
-        self._setObject("publicationList", pl)
-    
-        zt = ZopePageTemplate('index.html')
-        pl._setObject('index.html', zt)
-        default_content_fn = os.path.join(package_home(globals()),
-                                              'zpt/showExtendedProjectBibliography.zpt')
-        text = open(default_content_fn).read()
-        zt.pt_edit(text, 'text/html')
-    
-        if RESPONSE:
-            self.redirect(RESPONSE, "managePublications")
-
-
-    def getPublications(self):
-        """get all Publications"""
-        def sort_images(x, y):
-            return cmp(getattr(x[1], 'place', 0), getattr(y[1], 'place', 0))
-
-        publications = self.ZopeFind(self, obj_metatypes=['MPIWGProject_publication'])
-        
-        publications.sort(sort_images)
-        return publications
-
-    def getRelatedProjects(self):
-        """get all Publications"""
-        def sort_images(x, y):
-            return cmp(getattr(x[1], 'place', 0), getattr(y[1], 'place', 0))
-
-        publications = self.ZopeFind(self, obj_metatypes=['MPIWGProject_relatedProject'])
-        
-        publications.sort(sort_images)
-        return publications
-
-    def addPublication(self, text, RESPONSE=None):
-        """add an MPIWG_Publication"""
-        number = self.getLastPublicationNumber() + 1
-        name = "publication_" + str(number)
-        while hasattr(self, name):
-            number += 1
-            name = "publication_" + str(number)
-        
-        newPublication = MPIWGProject_publication(name)
-
-        self._setObject(name, newPublication)
-        obj = getattr(self, name)
-        obj.text = text[0:]
-        obj.enabled = True;
-        obj.place = self.getLastPublicationNumber() + 1
-        obj.id = name
-        self.ZCacheable_invalidate()
-        if RESPONSE is not None:
-        
-            self.redirect(RESPONSE, 'managePublications')
-
-    def errorRelatedProjects(self, link):
-        """error creating a related project"""
-        pt = PageTemplateFile(os.path.join(package_home(globals()), 'zpt', 'edit_project_error_relatedProject.zpt')).__of__(self)
-        return pt(link=link)
-
-    def addRelatedProject(self, link, RESPONSE=None):
-        """add an MPIWG_Publication"""
-        number = self.getLastPublicationNumber() + 1
-        name = "RelatedProject" + str(number)
-        while hasattr(self, name):
-            number += 1
-            name = "RelatedProject_" + str(number)
-        
-        # hole die id des projektes
-        splitted = link.split("/")
-        
-        # teste ob es das project gibt
-        if len(splitted) < 1:
-            self.redirect(RESPONSE, 'errorRelatedProjects?link=' + link)
-        
-        objid = splitted[-1]
-        object = getattr(self.projects, objid, None)
-        
-        if object == None:
-            self.redirect(RESPONSE, 'errorRelatedProjects?link=' + link)
-            return
-        
-        newPublication = MPIWGProject_relatedProject(name)
-
-        self._setObject(name, newPublication)
-        obj = getattr(self, name)
-        obj.orginallink = link[0:]
-        obj.objid = objid[0:]
-        logging.debug("add relobj:objid" + repr(obj.objid))
-        obj.projectWEB_title = object.getContent('WEB_title')[0:]
-        logging.debug("add relobj:webtitle" + repr(obj.projectWEB_title))
-        obj.enabled = True;
-        obj.place = self.getLastRelatedProjectNumber() + 1
-        obj.id = name
-        self.ZCacheable_invalidate()
-        if RESPONSE is not None:
-            self.redirect(RESPONSE, 'manageRelatedProjects')
-
- 
-    
-    def getLastPublicationNumber(self):
-        publications = self.getPublications()
-       
-        if not publications:
-            return 0
-        else:
-            return getattr(publications[-1][1], 'place', 0)
-        
-    def getLastRelatedProjectNumber(self):
-        publications = self.getRelatedProjects()
-        
-        if not publications:
-            return 0
-        else:
-            return getattr(publications[-1][1], 'place', 0)
-        
-    def deletePublication(self, id, RESPONSE=None):
-            """delete Publication id"""
-            self.manage_delObjects([id])
-            self.ZCacheable_invalidate()
-            if RESPONSE:
-                self.redirect(RESPONSE, 'managePublications')
-              
-    def deleteRelatedProject(self, id, RESPONSE=None):
-            """delete Publication id"""
-            self.manage_delObjects([id])
-            self.ZCacheable_invalidate()
-            if RESPONSE:
-                self.redirect(RESPONSE, 'manageRelatedProjects')
-
 
     def getNumber(self):
         """returns sorting number"""
@@ -935,6 +561,213 @@
             return t
 
               
+    def manageImages(self, imageName=None, op=None):
+        """managage images"""
+        if imageName and op:
+            if op == 'up':
+                images = self.getImages()
+                for image in images:
+                    if image[0] == imageName:
+                        nr = images.index(image)
+                        if not nr == 0:
+                            images[nr - 1][1].place += 1
+                            images[nr][1].place -= 1
+                        pass
+            elif op == 'down':
+                images = self.getImages()
+                for image in images:
+                    if image[0] == imageName:
+                        nr = images.index(image)
+                        if not (nr == len(images) - 1):
+                            images[nr + 1][1].place -= 1
+                            images[nr][1].place += 1
+                        pass
+
+
+        pt = PageTemplateFile('zpt/project/edit_images', globals()).__of__(self)
+        return pt()
+
+    def managePublications(self, pubName=None, op=None):
+        """managage images"""
+        if pubName and op:
+            if op == 'up':
+                publications = self.getPublications()
+                for publication in publications:
+                    if publication[0] == pubName:
+                        nr = publications.index(publication)
+                        if not nr == 0:
+                            publications[nr - 1][1].place += 1
+                            publications[nr][1].place -= 1
+                        pass
+            elif op == 'down':
+                publications = self.getPublications()
+                for publication in publications:
+                    if publication[0] == pubName:
+                        nr = publications.index(publication)
+                        if not (nr == len(publications) - 1):
+                            publications[nr + 1][1].place -= 1
+                            publications[nr][1].place += 1
+                        pass
+
+
+        pt = PageTemplateFile('zpt/project/edit_publications', globals()).__of__(self)
+        return pt()
+    
+    def manageRelatedProjects(self, pubName=None, op=None):
+        """managage relatedProjectd"""
+        if pubName and op:
+            if op == 'up':
+                relatedProjects = self.getRelatedProjects()
+                for project in relatedProjects:
+                    if project[0] == pubName:
+                        nr = relatedProjects.index(project)
+                        if not nr == 0:
+                            relatedProjects[nr - 1][1].place += 1
+                            relatedProjects[nr][1].place -= 1
+                        pass
+            elif op == 'down':
+                relatedProjects = self.getRelatedProjects()
+                for project in relatedProjects:
+                    if project[0] == pubName:
+                        nr = relatedProjects.index(project)
+                        if not (nr == len(relatedProjects) - 1):
+                            relatedProjects[nr + 1][1].place -= 1
+                            relatedProjects[nr][1].place += 1
+                        pass
+
+
+        pt = PageTemplateFile('zpt/project/edit_related_projects', globals()).__of__(self)
+        return pt()
+    
+    
+    def hasExtendedPublicationList(self):
+        """test if extended publication list exists"""
+        if not hasattr(self, "publicationList"):
+            return False
+        else:
+            return True
+        
+    def createExtendedPublicationList(self, RESPONSE=None):
+        """erzeuge erweiterte publications liste"""
+        pl = BibliographyManager("publicationList", "", "institutsbiblio", self.connection_id)
+        self._setObject("publicationList", pl)
+    
+        zt = ZopePageTemplate('index.html')
+        pl._setObject('index.html', zt)
+        default_content_fn = os.path.join(package_home(globals()),
+                                              'zpt/showExtendedProjectBibliography.zpt')
+        text = open(default_content_fn).read()
+        zt.pt_edit(text, 'text/html')
+    
+        if RESPONSE:
+            self.redirect(RESPONSE, "managePublications")
+
+
+    def getPublications(self):
+        """get all Publications"""
+        def sort_images(x, y):
+            return cmp(getattr(x[1], 'place', 0), getattr(y[1], 'place', 0))
+
+        publications = self.ZopeFind(self, obj_metatypes=['MPIWGProject_publication'])
+        
+        publications.sort(sort_images)
+        return publications
+
+    def addPublication(self, text, RESPONSE=None):
+        """add an MPIWG_Publication"""
+        number = self.getLastPublicationNumber() + 1
+        name = "publication_" + str(number)
+        while hasattr(self, name):
+            number += 1
+            name = "publication_" + str(number)
+        
+        newPublication = MPIWGProject_publication(name)
+
+        self._setObject(name, newPublication)
+        obj = getattr(self, name)
+        obj.text = text[0:]
+        obj.enabled = True;
+        obj.place = self.getLastPublicationNumber() + 1
+        obj.id = name
+        self.ZCacheable_invalidate()
+        if RESPONSE is not None:
+        
+            self.redirect(RESPONSE, 'managePublications')
+
+    def errorRelatedProjects(self, link):
+        """error creating a related project"""
+        pt = PageTemplateFile(os.path.join(package_home(globals()), 'zpt', 'edit_project_error_relatedProject.zpt')).__of__(self)
+        return pt(link=link)
+
+    def addRelatedProject(self, link, RESPONSE=None):
+        """add an MPIWG_Publication"""
+        number = self.getLastPublicationNumber() + 1
+        name = "RelatedProject" + str(number)
+        while hasattr(self, name):
+            number += 1
+            name = "RelatedProject_" + str(number)
+        
+        # hole die id des projektes
+        splitted = link.split("/")
+        
+        # teste ob es das project gibt
+        if len(splitted) < 1:
+            self.redirect(RESPONSE, 'errorRelatedProjects?link=' + link)
+        
+        objid = splitted[-1]
+        object = getattr(self.projects, objid, None)
+        
+        if object == None:
+            self.redirect(RESPONSE, 'errorRelatedProjects?link=' + link)
+            return
+        
+        newPublication = MPIWGProject_relatedProject(name)
+
+        self._setObject(name, newPublication)
+        obj = getattr(self, name)
+        obj.orginallink = link[0:]
+        obj.objid = objid[0:]
+        logging.debug("add relobj:objid" + repr(obj.objid))
+        obj.projectWEB_title = object.getContent('WEB_title')[0:]
+        logging.debug("add relobj:webtitle" + repr(obj.projectWEB_title))
+        obj.enabled = True;
+        obj.place = self.getLastRelatedProjectNumber() + 1
+        obj.id = name
+        self.ZCacheable_invalidate()
+        if RESPONSE is not None:
+            self.redirect(RESPONSE, 'manageRelatedProjects')
+
+     
+    def getLastPublicationNumber(self):
+        publications = self.getPublications()
+       
+        if not publications:
+            return 0
+        else:
+            return getattr(publications[-1][1], 'place', 0)
+        
+    def getLastRelatedProjectNumber(self):
+        publications = self.getRelatedProjects()
+        
+        if not publications:
+            return 0
+        else:
+            return getattr(publications[-1][1], 'place', 0)
+        
+    def deletePublication(self, id, RESPONSE=None):
+            """delete Publication id"""
+            self.manage_delObjects([id])
+            self.ZCacheable_invalidate()
+            if RESPONSE:
+                self.redirect(RESPONSE, 'managePublications')
+              
+    def deleteRelatedProject(self, id, RESPONSE=None):
+            """delete Publication id"""
+            self.manage_delObjects([id])
+            self.ZCacheable_invalidate()
+            if RESPONSE:
+                self.redirect(RESPONSE, 'manageRelatedProjects')
+
     def getImages(self):
         """get all Images"""
 
@@ -978,17 +811,6 @@
 
 
  
-    def hasChildren(self, date=None, onlyActive=1, onlyArchived=1):
-        """check if project has children"""
-        ct = self.getContexts(childs=self.getContent('xdata_05'),
-                                 depth=1, date=date, onlyActive=onlyActive)
-        
-        if ct and len(ct) > 0:
-             return True
-        else:
-             return False
-
-         
     def addImage(self, fileHd, caption, RESPONSE=None, filename=None):
         """add an MPIWG_Project_image"""
 
@@ -1014,17 +836,11 @@
             
             self.redirect(RESPONSE, 'manageImages')
 
-    def versionHeader(self):
-        """version Header, gibt header text entsprechend der aktuellen version aus"""
-        
-        actualTime = time.localtime()
-        retTXT = """<h2>This is an outdated version, for the actual version please refer to <a href="%s">%s</a></h2>"""
-        s = self.aq_parent.absolute_url()
-        # print getattr(self,'archiveTime',actualTime)
-        if getattr(self, 'archiveTime', actualTime) < actualTime:
-            return retTXT % (s, s)
-        else:
-            return ""
+
+    def getEditableFields(self):
+        """giveListofDatafields"""
+        return editableFields
+    
 
     def getActualVersion(self, date=None):
         """actuelle version"""
@@ -1098,19 +914,6 @@
     def delArchiveTime(self):
         """delete archive time"""
         del self.archiveTime
-
-    def versionManageForm(self):
-        """version Manage form:currently only set to invisible"""
-        pt = PageTemplateFile(os.path.join(package_home(globals()), 'zpt', 'MPIWGProject_versionManageForm.zpt')).__of__(self)
-        return pt()
-
-    def versionManage(self, invisible=None, RESPONSE=None):
-        """version Manage form:currently only set to invisible"""
-        self.invisible = invisible
-
-        if RESPONSE is not None:
-            self.redirect(RESPONSE, 'manage_main')
-
    
     def isActiveProject(self):
         """check if the project is still active, default is true."""
@@ -1278,125 +1081,6 @@
             return self.REQUEST['URL1'] + "/no_project"
         
             
-    def no_project(self):
-        """warnung: project noch nicht existent"""
-        pt = PageTemplateFile(os.path.join(package_home(globals()), 'zpt', 'no_project')).__of__(self)
-        return pt()
-    
-  
-    def harvest_page(self, context=None, mode="normal"):
-        """seite fuer harvesting fuer die Projektsuche"""
-       
-        if not context:
-            context = self
-            
-        if self.isActiveProject() and self.isCurrentVersion():
-             templates = self.en.getHarvestCache()
-            
-             ext = getattr(self, "harvest_main", None)
-             if ext:
-                 rendered = getattr(self, ext.getId())()
-                 templates[self.absolute_url()] = rendered
-                 transaction.commit()
-                 return rendered
-                 
-
-             pt = PageTemplateFile(os.path.join(package_home(globals()), 'zpt', 'harvest_main')).__of__(context)    
-             
-             rendered = pt()
-             templates[self.absolute_url()] = rendered
-             transaction.commit()
-             return rendered
-                 
- 
-      
-    def index_html_old(self, request=True, context=None):
-        """show homepage"""
-    
-        bound_names = {}
-         
-        if not context:
-            context = self
-        if request:
-            if self.REQUEST.has_key('date') and self.REQUEST.SESSION.get('MPI_redirected', None) == None:
-                self.REQUEST.SESSION['MPI_redirected'] = 1
-                self.REQUEST.RESPONSE.redirect(self.checkDate(self.REQUEST['date']) + "?date=" + self.REQUEST['date'])
-            else:
-                self.REQUEST.SESSION['MPI_redirected'] = None
-        
-        # ext=self.ZopeFind(self.aq_parent,obj_ids=["project_main"])
-      
-   
-        request2 = getattr(self, 'REQUEST', None)
-        
-        if request2 is not None:
-            response = request2.response
-            if not response.headers.has_key('content-type'):
-                response.setHeader('content-type', 'text/html')
-
-        security = getSecurityManager()
-        bound_names['user'] = security.getUser()
-      
-        # Retrieve the value from the cache.
-        keyset = None
-        if self.ZCacheable_isCachingEnabled():
-            
-            # Prepare a cache key.
-            keyset = {'here': self, 'params':request2['QUERY_STRING']}
-                      
-            result = self.ZCacheable_get(keywords=keyset)
-           
-            if result is not None:
-                # Got a cached value.
-                return result
-        
-        pt = getTemplate(self, "project_main")
-         # Execute the template in a new security context.
-        security.addContext(self)
-
-        try:
-            # logging.debug("index_html pt=%s"%repr(pt))
-            result = pt.pt_render(extra_context=bound_names)
-            # logging.debug("index_html result=%s"%repr(result))
-            if keyset is not None:
-                # Store the result in the cache.
-                self.ZCacheable_set(result, keywords=keyset)
-               
-            return result
-        finally:
-            security.removeContext(self)
-       
-
-      
-    def index_html_old2(self, request=True, context=None):
-        """show homepage"""
-        if not context:
-            context = self
-        if request:
-            if self.REQUEST.has_key('date') and self.REQUEST.SESSION.get('MPI_redirected', None) == None:
-                self.REQUEST.SESSION['MPI_redirected'] = 1
-                self.REQUEST.RESPONSE.redirect(self.checkDate(self.REQUEST['date']) + "?date=" + self.REQUEST['date'])
-            else:
-                self.REQUEST.SESSION['MPI_redirected'] = None
-        
-        # ext=self.ZopeFind(self.aq_parent,obj_ids=["project_main"])
-      
-        ext = getattr(self, "project_main", None)
-        if ext:
-            return getattr(self, ext.getId())()
-        
-        pt = PageTemplateFile(os.path.join(package_home(globals()), 'zpt', 'project_main')).__of__(context)    
-
-        return pt()
-
-    
-    def getDataFields(self):
-        """giveListofDatafields"""
-        ret = []
-        for x in range(1, 14):
-            if not x in [6, 10, 9]:  # not used fields
-                ret.append('xdata_%02i' % x)
-        return ret
             
     def getDefinedFields(self):
         """show all defined fields"""
@@ -1499,18 +1183,6 @@
         # return utf8ify(text5) # return as utf-8 byte string
 
 
-    def showImagesOfPage(self, imageUrl=None):
-        """show Images of project"""
-        self.getContent('WEB_project_description', filter='yes')  # get the content and store image infos into session
-        pt = PageTemplateFile(os.path.join(package_home(globals()), 'zpt', 'projectImageView.zpt')).__of__(self)
-        return pt()
-        
-    
-    def show_html(self):
-        """simple index"""
-        # return "HI"
-        pt = PageTemplateFile(os.path.join(package_home(globals()), 'zpt', 'MPIWGProject_index.zpt')).__of__(self)
-        return pt()
 
     def saveFromPreview(self):
         """save content aus preview"""
@@ -1558,16 +1230,6 @@
         else:
             return style    
 
-    def getLabel_old(self):
-        """returns label (or title) of this project"""
-        l = self.getContent('xdata_07')
-        if l:
-            return l
-        l = self.getContent('WEB_title')
-        if l:
-            return l
-        return self.title
-
     def getBreadcrumbs(self):
         """return list of breadcrumbs from here to the root"""
         crumbs = []
@@ -1623,82 +1285,20 @@
         # return self.REQUEST.RESPONSE.redirect(self.REQUEST['URL1']+"/previewTemplate")
         
 
-    def getWebProject_description(self):
-        """get description"""
-        debug = self.REQUEST.cookies.get("MP_debug_code", None)
-        
-        if debug and debug == "western":
-            return """
-            <html>
-            <head>
-            <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-            </head>
-            <body>%s</body>
-            </html>
-            """ % self.WEB_project_description[0]
-        
-        return """
-            <html>
-            <head>
-            <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-            </head>
-            <body>%s</body>
-            </html>
-            """ % self.getContent('WEB_project_description')
-        
-        
-        
     def editMPIWGProjectForm(self):
         """editform"""
         pt = PageTemplateFile(os.path.join(package_home(globals()), 'zpt', 'edit_MPIWGProject.zpt')).__of__(self)
         return pt()
 
+
     def isResponsibleScientist(self, key):
         """teste ob eine Person in der Liste der respl. scientists auftaucht"""
         for resp in self.getResponsibleScientistsList():
-            if resp['key'] == key:
+            if resp.get('key', None) == utf8ify(key):
                 return True
         
         return False
         
-    def getPersonKeyList(self):
-        """gibt die key Liste der beteiligten Personen zurueck (utf8 codiert)"""
-        # logging.error("getPersonKeyList:%s"%getattr(self,'responsibleScientistsList',[]))
-        try:
-            return [utf8ify(x[1]) for x in getattr(self, 'responsibleScientistsList', [])]
-        except:
-            return[]
-        
-       
-    def myCapitalize(self, txt):
-        """kapitalisiere auch Namen mit -"""
-        splitted = [x.capitalize() for x in txt.split("-")]
-        return "-".join(splitted)
-    
-    def getNamesOrdered(self, list):
-        """Sortiert die Liste nach der Reihenfolge in xdata_01"""
-        
-        nameList = self.getContent('xdata_01')
-        if nameList.find(";") > -1:  # rate Trenner ist ;
-            names = nameList.split(";")  
-        else:
-            names = nameList.split(",")
-            
-        self._v_names = []
-        for name in names:
-            self._v_names.append(name.rstrip().lstrip())
-            
-            
-        def sort(x, y):
-            try:
-                return cmp(self._v_names.index(x[0]), self._v_names.index(y[0]))
-            except:
-                return 0
-            
-        list.sort(sort)
-        
-        return list
-        
         
     def identifyNames(self, nameList):
         """Bekommt eine Komma oder Semikolon getrennte Liste mit Name der Form Vorname MittelName(n) Nachname
@@ -1748,7 +1348,7 @@
             else:
                 returnNamesDict[name] = []
        
-        logging.debug("id: %s" % repr(returnNamesDict))
+        logging.debug("identified names: %s" % repr(returnNamesDict))
         return returnNamesDict
 
         
@@ -1763,7 +1363,7 @@
         # set all definedFields
         for x in definedFields:
             if formdata.has_key(x):
-                setattr(self, x, formdata[x])
+                setattr(self, x, unicodify(formdata[x]))
 
         # TODO: What does this do?
         completedAt = formdata.get('completedAt')
@@ -1790,7 +1390,7 @@
                 # wenn es ein Feld der Form reponsibleScientist_nr_KEY gibt
                 nr = keyParts[2]
                 if keyParts[1] == "name":
-                    names[nr] = formdata[key]
+                    names[nr] = unicodify(formdata[key])
                 elif keyParts[1] == "key":
                     keys[nr] = formdata[key]
          
@@ -1819,23 +1419,6 @@
                 RESPONSE.redirect('manage_main')
 
 
-    def isChecked(self, wert, list):
-        """check if wert is in ; seperated list"""
-
-        # felder sind manchmnal als liste mit einem element definiert
-        if type(list) is StringType or UnicodeType: 
-            splitted = list.split(";")
-        else:
-            splitted = list[0].split(";")
-
-        splitted = [y.rstrip().lstrip() for y in splitted]
-        
-        for x in splitted:
-            x = re.sub(r"[^A-z ]", "", x)
-            if (not x == u'') and x in wert:
-                return 1
-        return 0
-
     security.declareProtected('View management screens', 'editBasic')
     def editBasic(self, identifiedNames=None):
         """editform"""
@@ -1847,23 +1430,6 @@
         return pt(identifiedNames=identifiedNames)
 
 
-    security.declareProtected('View management screens', 'editMPIWGBasisForm')
-    def editMPIWGBasisForm(self):
-        """editform"""
-        pt = PageTemplateFile(os.path.join(package_home(globals()), 'zpt', 'edit_MPIWGBasis.zpt')).__of__(self)
-        return pt()
-
-    security.declareProtected('View management screens', 'editMPIWGRelatedPublicationsForm')
-    def editMPIWGRelatedPublicationsForm(self):
-        """Edit related Publications"""
-        pt = PageTemplateFile(os.path.join(package_home(globals()), 'zpt', 'edit_MPIWGRelatedPublications.zpt')).__of__(self)
-        return pt()
-        
-    
-    def loadNewFileForm(self):
-        """Neues XML-File einlesen"""
-        pt = PageTemplateFile(os.path.join(package_home(globals()), 'zpt', 'MPIWGProject_newfile.zpt')).__of__(self)
-        return pt()
 
     def loadNewFile(self, RESPONSE=None):
         """einlesen des neuen files"""
@@ -1897,6 +1463,144 @@
         return
     
     
+    def copyPublicationsToList(self, RESPONSE=None):
+        """copy publications in to list"""
+
+        publicationTxt = self.getContent('WEB_related_pub')
+
+        pubSplits = publicationTxt.split("<p>")
+
+        for pubSplit in pubSplits:
+            pubSplit = pubSplit.replace("</p>", "")
+            self.addPublication(pubSplit)
+
+        setattr(self, "WEB_related_pub_copied", True);
+        
+        if RESPONSE:
+                
+            self.redirect(RESPONSE, 'managePublications')
+        
+    def hasRelatedPublicationsOldVersion(self):
+        """teste ob es related publications gibt"""
+        
+        ret = True;
+        if (self.getContent('WEB_related_pub') == ''):
+            ret = False;  # nichts im alten feld
+        logging.debug("webrel:" + repr(ret))
+        if (getattr(self, 'WEB_related_pub_copied', False)):
+            ret = False;  # alte daten sind schon kopiert worden
+        
+        logging.debug("webrel_copied:" + repr(ret))
+        publications = self.ZopeFind(self, obj_metatypes=['MPIWGProject_publication']);
+        
+        if(len(publications) > 0):
+            ret = False;  # es gibt publicationen in der neuen liste
+      
+        
+        logging.debug("len(publ)" + repr(ret))
+        
+        return ret;
+
+
+    def hasInlineImage(self):
+        """Return the number of inline images in the description."""
+        text = self.getDescription()
+        cnt = text.count('<p class="picture">')
+        return cnt
+    
+    
+    def copyImageToMargin(self, RESPONSE=None):  
+        """copy inline images to marginal images"""
+        # getImages from WEB_project_description
+        description = self.getDescription()
+        
+        text2 = description
+        splitted = text2.split("""<p class="picture">""")
+        
+        imageURLs = []
+        imageCaptions = []
+        for split in splitted[1:]:
+                tmp = split.split("</p>")
+                # return repr(splitted[1])
+                
+                try:
+                    imageURLs.append(tmp[0].split("\"")[1].encode('utf-8'))
+                except:
+                    
+                    try:
+                        imageURLs.append(tmp[0].split("src=")[1].split(" ")[0].encode('utf-8'))
+                    except:
+                        imageURLs.append("")
+                
+                split2 = "</p>".join(tmp[1:])
+                splitted = split2.split("""<p class="picturetitle">""")
+                if len(splitted) > 1:
+                    tmp = splitted[1].split("</p>")
+                    imageCaptions.append(tmp[0].encode('utf-8'))
+
+                else:
+                    # keine caption
+                    imageCaptions.append("")
+     
+        # eintragen:
+        for imageURL in imageURLs:
+            if not imageURL:
+                # no URL - no image
+                continue
+            
+            filename = imageURL.split("/")[-1]
+            # lege neues images object an, mit leerem bild
+
+            if filename in self:
+                # existiert das bild schon, dann neuen filenamen
+                filename = "project_image_" + filename
+                if filename in self:
+                    # exists too - assume its already converted
+                    logging.warn("copyImageToMargin: image %s exists - skipping!"%filename)
+                    continue
+            
+            self.addImage(None, imageCaptions[imageURLs.index(imageURL)], filename=filename)
+            # hole die bilddaten aus der url
+            url = self.absolute_url() + "/" + imageURL
+            # url=self.absolute_url()+"/"+filename
+        
+            try:  # relative url
+                data = urllib.urlopen(url).read()
+            except:
+                try:  # absolute
+                    data = urllib.urlopen(self.imageURL).read()
+                except:
+                    logging.error("copyImageToMargin: can't open: %s" % url)
+            
+            obj = getattr(self, filename)
+            obj.update_data(data)
+        
+        # clean description
+        logging.debug("copyImageToMargin: description:%s"%repr(description))
+        dom = ET.fromstring(utf8ify("<html>%s</html>"%description))
+        for e in dom.findall(".//p[@class='picture']"):
+            # remove contents
+            e.clear()
+            # remove tag
+            e.tag = None
+            
+        for e in dom.findall(".//p[@class='picturetitle']"):
+            # remove contents
+            e.clear()
+            # remove tag
+            e.tag = None
+            
+        # remove html tag
+        dom.tag = None
+        # set as new description
+        description = unicodify(serialize(dom))
+        logging.debug("copyImageToMargin: new description:%s"%repr(description))
+        setattr(self, 'WEB_project_description', description)
+        
+        if RESPONSE:
+            self.redirect(RESPONSE, 'manageImages')
+
+
     def updateProjectMembers(self, updateResponsibleScientistsList=False):
         """updates project-member table"""
         if updateResponsibleScientistsList:
@@ -2062,12 +1766,13 @@
 
 
     security.declareProtected('View management screens', 'updateAllProjects')
-    def updateAllProjects(self, updateResponsibleScientistsList=False):
+    def updateAllProjects(self, updateResponsibleScientistsList=False, RESPONSE=None):
         """Patch all current projects for legacy problems."""
         cnt = 0
-        log = ""
+        fulllog = ""
         # go through all projects
         for (id, project) in self.ZopeFind(self, obj_metatypes=['MPIWGProject'], search_sub=1):
+            log = ""
             cnt += 1
             #
             # hasRelatedPublicationsOldVersion
@@ -2134,7 +1839,29 @@
                 if hasattr(extpub, 'connection_id'):
                     logging.debug("updateAllProjects(%s): extended publication %s has connection_id=%s!"%(project.getId(),extpub.getId(),extpub.connection_id))
             
-        return log + "\n DONE! updated %s projects!" % cnt
+            #
+            # unicodify
+            #
+            for field in ('WEB_title', 'xdata_01', 'xdata_07', 'xdata_08', 'xdata_11', 'xdata_12', 'xdata_13', 
+                      'WEB_project_description', 'WEB_related_pub'):
+                text = getattr(project, field, None)
+                if isinstance(text, str):
+                    log += "%s: has non-unicode field %s\n"%(project.getId(), field)
+                    logging.debug("updateAllProjects(%s): has has non-unicode field %s\n"%(project.getId(), field))
+                    setattr(project, field, unicodify(text))
+                
+            fulllog += log    
+            if RESPONSE is not None:
+                RESPONSE.write(log)
+                
+            
+        log += "\n DONE! updated %s projects!" % cnt
+        fulllog += log
+        if RESPONSE is not None:
+                RESPONSE.write(log)
+                RESPONSE.flush()
+        else:
+            return fulllog
                 
 
         
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MPIWGProjects_removed.py	Mon Apr 29 20:34:17 2013 +0200
@@ -0,0 +1,241 @@
+#
+# removed methods
+#
+class MPIWGProjects_notused:
+
+    def decode(self, str):
+        """return unicode object"""
+        return unicodify(str)
+
+    def isCheckField(self, fieldname):
+        """return chechfield"""
+        return (fieldname in checkFields)
+ 
+    def sortedByPlace(self, metatype):
+        """find metatype and sort by place"""
+        def sort(x, y):
+            return cmp(getattr(x[1], 'place', 0), getattr(y[1], 'place', 0))
+
+        logging.debug("MPIWGProjects begin: sorted by place: " + metatype)
+        founds = self.ZopeFind(self, obj_metatypes=[metatype]);
+        
+        founds.sort(sort)
+        logging.debug("MPIWGProjects end: sorted by place: " + metatype)
+        return founds
+    
+
+    def harvest_page(self, context=None, mode="normal"):
+        """seite fuer harvesting fuer die Projektsuche"""
+       
+        if not context:
+            context = self
+            
+        if self.isActiveProject() and self.isCurrentVersion():
+             templates = self.en.getHarvestCache()
+            
+             ext = getattr(self, "harvest_main", None)
+             if ext:
+                 rendered = getattr(self, ext.getId())()
+                 templates[self.absolute_url()] = rendered
+                 transaction.commit()
+                 return rendered
+                 
+
+             pt = PageTemplateFile(os.path.join(package_home(globals()), 'zpt', 'harvest_main')).__of__(context)    
+             
+             rendered = pt()
+             templates[self.absolute_url()] = rendered
+             transaction.commit()
+             return rendered
+                 
+ 
+      
+    def index_html_old(self, request=True, context=None):
+        """show homepage"""
+    
+        bound_names = {}
+         
+        if not context:
+            context = self
+        if request:
+            if self.REQUEST.has_key('date') and self.REQUEST.SESSION.get('MPI_redirected', None) == None:
+                self.REQUEST.SESSION['MPI_redirected'] = 1
+                self.REQUEST.RESPONSE.redirect(self.checkDate(self.REQUEST['date']) + "?date=" + self.REQUEST['date'])
+            else:
+                self.REQUEST.SESSION['MPI_redirected'] = None
+        
+        # ext=self.ZopeFind(self.aq_parent,obj_ids=["project_main"])
+      
+   
+        request2 = getattr(self, 'REQUEST', None)
+        
+        if request2 is not None:
+            response = request2.response
+            if not response.headers.has_key('content-type'):
+                response.setHeader('content-type', 'text/html')
+
+        security = getSecurityManager()
+        bound_names['user'] = security.getUser()
+      
+        # Retrieve the value from the cache.
+        keyset = None
+        if self.ZCacheable_isCachingEnabled():
+            
+            # Prepare a cache key.
+            keyset = {'here': self, 'params':request2['QUERY_STRING']}
+                      
+            result = self.ZCacheable_get(keywords=keyset)
+           
+            if result is not None:
+                # Got a cached value.
+                return result
+        
+        pt = getTemplate(self, "project_main")
+         # Execute the template in a new security context.
+        security.addContext(self)
+
+        try:
+            # logging.debug("index_html pt=%s"%repr(pt))
+            result = pt.pt_render(extra_context=bound_names)
+            # logging.debug("index_html result=%s"%repr(result))
+            if keyset is not None:
+                # Store the result in the cache.
+                self.ZCacheable_set(result, keywords=keyset)
+               
+            return result
+        finally:
+            security.removeContext(self)
+       
+
+      
+    def index_html_old2(self, request=True, context=None):
+        """show homepage"""
+        if not context:
+            context = self
+        if request:
+            if self.REQUEST.has_key('date') and self.REQUEST.SESSION.get('MPI_redirected', None) == None:
+                self.REQUEST.SESSION['MPI_redirected'] = 1
+                self.REQUEST.RESPONSE.redirect(self.checkDate(self.REQUEST['date']) + "?date=" + self.REQUEST['date'])
+            else:
+                self.REQUEST.SESSION['MPI_redirected'] = None
+        
+        # ext=self.ZopeFind(self.aq_parent,obj_ids=["project_main"])
+      
+        ext = getattr(self, "project_main", None)
+        if ext:
+            return getattr(self, ext.getId())()
+        
+        pt = PageTemplateFile(os.path.join(package_home(globals()), 'zpt', 'project_main')).__of__(context)    
+
+        return pt()
+
+    
+    def no_project(self):
+        """warnung: project noch nicht existent"""
+        pt = PageTemplateFile(os.path.join(package_home(globals()), 'zpt', 'no_project')).__of__(self)
+        return pt()
+    
+  
+    def showImagesOfPage(self, imageUrl=None):
+        """show Images of project"""
+        self.getContent('WEB_project_description', filter='yes')  # get the content and store image infos into session
+        pt = PageTemplateFile(os.path.join(package_home(globals()), 'zpt', 'projectImageView.zpt')).__of__(self)
+        return pt()
+        
+    
+    def show_html(self):
+        """simple index"""
+        # return "HI"
+        pt = PageTemplateFile(os.path.join(package_home(globals()), 'zpt', 'MPIWGProject_index.zpt')).__of__(self)
+        return pt()
+
+    def getLabel_old(self):
+        """returns label (or title) of this project"""
+        l = self.getContent('xdata_07')
+        if l:
+            return l
+        l = self.getContent('WEB_title')
+        if l:
+            return l
+        return self.title
+
+    def getPersonKeyList(self):
+        """gibt die key Liste der beteiligten Personen zurueck (utf8 codiert)"""
+        # logging.error("getPersonKeyList:%s"%getattr(self,'responsibleScientistsList',[]))
+        try:
+            return [utf8ify(x[1]) for x in getattr(self, 'responsibleScientistsList', [])]
+        except:
+            return[]
+        
+       
+    def myCapitalize(self, txt):
+        """kapitalisiere auch Namen mit -"""
+        splitted = [x.capitalize() for x in txt.split("-")]
+        return "-".join(splitted)
+    
+    def getNamesOrdered(self, list):
+        """Sortiert die Liste nach der Reihenfolge in xdata_01"""
+        
+        nameList = self.getContent('xdata_01')
+        if nameList.find(";") > -1:  # rate Trenner ist ;
+            names = nameList.split(";")  
+        else:
+            names = nameList.split(",")
+            
+        self._v_names = []
+        for name in names:
+            self._v_names.append(name.rstrip().lstrip())
+            
+            
+        def sort(x, y):
+            try:
+                return cmp(self._v_names.index(x[0]), self._v_names.index(y[0]))
+            except:
+                return 0
+            
+        list.sort(sort)
+        
+        return list
+        
+    def getWebProject_description(self):
+        """get description"""
+        debug = self.REQUEST.cookies.get("MP_debug_code", None)
+        
+        if debug and debug == "western":
+            return """
+            <html>
+            <head>
+            <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+            </head>
+            <body>%s</body>
+            </html>
+            """ % self.WEB_project_description[0]
+        
+        return """
+            <html>
+            <head>
+            <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+            </head>
+            <body>%s</body>
+            </html>
+            """ % self.getContent('WEB_project_description')
+        
+        
+        
+    def isChecked(self, wert, list):
+        """check if wert is in ; seperated list"""
+
+        # felder sind manchmnal als liste mit einem element definiert
+        if type(list) is StringType or UnicodeType: 
+            splitted = list.split(";")
+        else:
+            splitted = list[0].split(";")
+
+        splitted = [y.rstrip().lstrip() for y in splitted]
+        
+        for x in splitted:
+            x = re.sub(r"[^A-z ]", "", x)
+            if (not x == u'') and x in wert:
+                return 1
+        return 0
+
--- a/MPIWGRoot.py	Mon Apr 29 18:00:46 2013 +0200
+++ b/MPIWGRoot.py	Mon Apr 29 20:34:17 2013 +0200
@@ -324,35 +324,6 @@
             return ""
         
 
-    # TODO: remove
-    def isActiveMember(self,key):
-        """tested ob Mitarbeiter key ist aktiv"""
-        key=utf8ify(key)
-        ret=getAt(self.ZSQLInlineSearch(_table='personal_www',
-                                            _op_key='eq',key=key,
-                                            _op_publish_the_data='eq',
-                                            publish_the_data='yes'), 0)
-        
-        logging.info("MPIWGROOT ACTIVE_MEMBER  %s"%ret)
-        if ret:
-            return True
-        else:
-            return False
-        
-    # TODO: remove
-    def isActual(self,project):
-        """checke if project is actual"""
-        actualTime=time.localtime()
-        
-        if hasattr(project,'getObject'): #obj ist aus einer catalogTrefferList
-            obj=project.getObject()
-        else:
-            obj=project
-            
-        if getattr(obj,'archiveTime',actualTime)< actualTime:
-            return False
-        else:
-            return True
         
     def redirectIndex_html(self,request):
         #return request['URL1']+'/index_html'
@@ -1143,178 +1114,7 @@
 
             
 
-    def getProjectsOfMembers(self,date=None):
-        """give tuple member /projects"""
-        ret=[]
-        members=self.getAllMembers()
-        logging.debug("X %s"%repr(members))
-        #return str(members)
-        for x in members:
-            #logging.debug("X %s"%repr(x))
-            projects=self.getProjectsOfMember(key=x[1],date=date)
-            if len(projects)>0:
-                ret.append((x[0],projects))
-            
-        return ret
-
-    def getProjectsOfMember(self,key=None,date=None,onlyArchived=1,onlyActive=1):
-        """get projects of a member
-    
-        @param key: (optional) Key zur Idenfikation des Benutzer
-        @param date: (optional) Version die zum Zeitpunkt date gueltig war
-        @param onlyArchived: 
-        onlyArchived=0: alle Projekte
-        onlyArchived= 1 : nur aktuelle Projekte
-        onlyArchived = 2: nur archivierte Projekte
-        """
-        # TODO: Die ganze Loesung
-        def sortP(x,y):
-            """sort by sorting number"""
-            return cmp(x.WEB_title,y.WEB_title)
-        
-        ret=[]  
-        if key:     
-            logging.debug("MPIWGROOT (getProjectsOfMember):"+key)
-            proj=self.ProjectCatalog({'getPersonKeyList':utf8ify(key)})
-        else:
-            return ret # key muss definiert sein
-        
-        #logging.debug("MPIWGROOT (getProjectsOfMember):"+repr(proj))
-        if proj:
-            proj2=[]
-            for x in proj:
-                #logging.error("proj:%s"%repr(x.getPath()))
-                if (not getattr(x.getObject(),'invisible',None)) and (getattr(x.getObject(),'archiveTime','')==''):   
-                      proj2.append(x)
-
-        else:
-            proj2=[]
-            
-       
-       
-        proj2.sort(sortP)
-
-        projectListe=[]
-        #logging.error("getprojectsofmember proj2: %s"%repr(proj2))
-        for proj in proj2:   
-            obj=proj.getObject()
-            add=False
-            if onlyArchived==1: #nur aktuell projecte
-                if not obj.isArchivedProject():
-                    add=True
-            elif onlyArchived==2: #nur archivierte
-                if obj.isArchivedProject():
-                    add=True
-            else: #alle
-               add=True 
-               
-            if onlyActive==1: #nur active projecte
-                if obj.isActiveProject():
-                    add=add & True
-                else:
-                    add=add & False
-                
-            elif onlyArchived==2: #nur nicht aktvive
-                if not obj.isActiveProject():
-                    add=add & True
-            else: #alle
-               add=add & True
-                    
-            if add:
-                projectListe.append(obj)
-                
-        #logging.error("getprojectsofmember projectliste: %s"%repr(projectListe))
-        return projectListe
      
-    def givePersonList(self,name):
-        """check if person is in personfolder and return list of person objects"""
-        
-        splitted=name.split(",")
-        if len(splitted)==1:
-            splitted=name.lstrip().rstrip().split(" ")
-        splittedNew=[split.lstrip() for split in splitted]
-        
-        if splittedNew[0]=='':
-            del splittedNew[0]
-        search=string.join(splittedNew,' AND ')
-        
-        if not search=='':
-            proj=self.MembersCatalog({'title':search})
-
-        if proj:
-            return [[x.lastName,x.firstName] for x in proj]
-        else:
-            return []
-            
-##         splitted=name.split(",") # version nachname, vorname...
-##         if len(splitted)>1:
-##             lastName=splitted[0] 
-##             firstName=splitted[1]
-##         else: 
-##             splitted=name.split(" ") #version vorname irgenwas nachnamae
-        
-##             lastName=splitted[len(splitted)-1]
-##             firstName=string.join(splitted[0:len(splitted)-1])
-
-##         objs=[]
-
-        #print  self.members 
-      ##   for x in self.members.__dict__:
-##             obj=getattr(self.members,x)
-##             if hasattr(obj,'lastName') and hasattr(obj,'firstName'):
-                
-##                 if (re.match(".*"+obj.lastName+".*",lastName) or re.match(".*"+lastName+".*",obj.lastName)) and (re.match(".*"+obj.firstName+".*",firstName) or re.match(".*"+firstName+".*",obj.firstName)):
-                    
-##                     objs.append((obj,lastName+", "+firstName))
-
-        
-##        return objs
-
-
-    def personCheck(self,names):
-        """all persons for list"""
-        #print "names",names
-        splitted=names.split(";")
-        ret={}
-        for name in splitted:
-
-            if not (name==""):
-                try:
-                    ret[name]=self.givePersonList(name)
-                except:
-                    """NOTHIHN"""
-        #print "RET",ret
-        return ret
-
-    def giveCheckList(self,person,fieldname):
-        """return checklist"""
-        #print "GCL",fieldname
-        if fieldname=='xdata_01':
-            x=self.personCheck(person.getContent(fieldname))
-            #print "GCLBACKX",x
-            return x
-        
-
-    # TODO: do we need this here?
-    def isCheckField(self,fieldname):
-        """return chechfield"""
-        return (fieldname in checkFields)
-
-    
-
-    def sortResults(self,results):
-        """search the catalog and give results back sorted by meta_type"""
-        ret = {}
-        logging.debug(results())
-        for result in results():
-            metaType = result.meta_type
-            resultList= ret.get(metaType,[])
-            resultList.append(result)
-            ret[metaType]=resultList
-        
-        logging.debug(ret)
-        return ret
-        
             
 def manage_addMPIWGRootForm(self):
     """form for adding the root"""
--- a/MPIWGRoot_deleted_methods.py	Mon Apr 29 18:00:46 2013 +0200
+++ b/MPIWGRoot_deleted_methods.py	Mon Apr 29 20:34:17 2013 +0200
@@ -1,3 +1,6 @@
+class MPIWGRoot_deleted:
+    
+    
     def removeStopWords(self,xo):
         """remove stop words from xo"""
         if not hasattr(self,'_v_stopWords'):
@@ -301,4 +304,207 @@
         """restore"""
         self.nameIndexEdited=self.nameIndex
         return "done"
+ 
+    def getProjectsOfMembers(self,date=None):
+        """give tuple member /projects"""
+        ret=[]
+        members=self.getAllMembers()
+        logging.debug("X %s"%repr(members))
+        #return str(members)
+        for x in members:
+            #logging.debug("X %s"%repr(x))
+            projects=self.getProjectsOfMember(key=x[1],date=date)
+            if len(projects)>0:
+                ret.append((x[0],projects))
+            
+        return ret
+
+    def getProjectsOfMember(self,key=None,date=None,onlyArchived=1,onlyActive=1):
+        """get projects of a member
     
+        @param key: (optional) Key zur Idenfikation des Benutzer
+        @param date: (optional) Version die zum Zeitpunkt date gueltig war
+        @param onlyArchived: 
+        onlyArchived=0: alle Projekte
+        onlyArchived= 1 : nur aktuelle Projekte
+        onlyArchived = 2: nur archivierte Projekte
+        """
+        # TODO: Die ganze Loesung
+        def sortP(x,y):
+            """sort by sorting number"""
+            return cmp(x.WEB_title,y.WEB_title)
+        
+        ret=[]  
+        if key:     
+            logging.debug("MPIWGROOT (getProjectsOfMember):"+key)
+            proj=self.ProjectCatalog({'getPersonKeyList':utf8ify(key)})
+        else:
+            return ret # key muss definiert sein
+        
+        #logging.debug("MPIWGROOT (getProjectsOfMember):"+repr(proj))
+        if proj:
+            proj2=[]
+            for x in proj:
+                #logging.error("proj:%s"%repr(x.getPath()))
+                if (not getattr(x.getObject(),'invisible',None)) and (getattr(x.getObject(),'archiveTime','')==''):   
+                      proj2.append(x)
+
+        else:
+            proj2=[]
+            
+       
+       
+        proj2.sort(sortP)
+
+        projectListe=[]
+        #logging.error("getprojectsofmember proj2: %s"%repr(proj2))
+        for proj in proj2:   
+            obj=proj.getObject()
+            add=False
+            if onlyArchived==1: #nur aktuell projecte
+                if not obj.isArchivedProject():
+                    add=True
+            elif onlyArchived==2: #nur archivierte
+                if obj.isArchivedProject():
+                    add=True
+            else: #alle
+               add=True 
+               
+            if onlyActive==1: #nur active projecte
+                if obj.isActiveProject():
+                    add=add & True
+                else:
+                    add=add & False
+                
+            elif onlyArchived==2: #nur nicht aktvive
+                if not obj.isActiveProject():
+                    add=add & True
+            else: #alle
+               add=add & True
+                    
+            if add:
+                projectListe.append(obj)
+                
+        #logging.error("getprojectsofmember projectliste: %s"%repr(projectListe))
+        return projectListe
+
+
+    def givePersonList(self,name):
+        """check if person is in personfolder and return list of person objects"""
+        
+        splitted=name.split(",")
+        if len(splitted)==1:
+            splitted=name.lstrip().rstrip().split(" ")
+        splittedNew=[split.lstrip() for split in splitted]
+        
+        if splittedNew[0]=='':
+            del splittedNew[0]
+        search=string.join(splittedNew,' AND ')
+        
+        if not search=='':
+            proj=self.MembersCatalog({'title':search})
+
+        if proj:
+            return [[x.lastName,x.firstName] for x in proj]
+        else:
+            return []
+            
+##         splitted=name.split(",") # version nachname, vorname...
+##         if len(splitted)>1:
+##             lastName=splitted[0] 
+##             firstName=splitted[1]
+##         else: 
+##             splitted=name.split(" ") #version vorname irgenwas nachnamae
+        
+##             lastName=splitted[len(splitted)-1]
+##             firstName=string.join(splitted[0:len(splitted)-1])
+
+##         objs=[]
+
+        #print  self.members 
+      ##   for x in self.members.__dict__:
+##             obj=getattr(self.members,x)
+##             if hasattr(obj,'lastName') and hasattr(obj,'firstName'):
+                
+##                 if (re.match(".*"+obj.lastName+".*",lastName) or re.match(".*"+lastName+".*",obj.lastName)) and (re.match(".*"+obj.firstName+".*",firstName) or re.match(".*"+firstName+".*",obj.firstName)):
+                    
+##                     objs.append((obj,lastName+", "+firstName))
+
+        
+##        return objs
+
+
+    def personCheck(self,names):
+        """all persons for list"""
+        #print "names",names
+        splitted=names.split(";")
+        ret={}
+        for name in splitted:
+
+            if not (name==""):
+                try:
+                    ret[name]=self.givePersonList(name)
+                except:
+                    """NOTHIHN"""
+        #print "RET",ret
+        return ret
+
+    def giveCheckList(self,person,fieldname):
+        """return checklist"""
+        #print "GCL",fieldname
+        if fieldname=='xdata_01':
+            x=self.personCheck(person.getContent(fieldname))
+            #print "GCLBACKX",x
+            return x
+        
+
+    # TODO: do we need this here?
+    def isCheckField(self,fieldname):
+        """return chechfield"""
+        return (fieldname in checkFields)
+
+    
+
+    def sortResults(self,results):
+        """search the catalog and give results back sorted by meta_type"""
+        ret = {}
+        logging.debug(results())
+        for result in results():
+            metaType = result.meta_type
+            resultList= ret.get(metaType,[])
+            resultList.append(result)
+            ret[metaType]=resultList
+        
+        logging.debug(ret)
+        return ret
+        
+    # TODO: remove
+    def isActiveMember(self,key):
+        """tested ob Mitarbeiter key ist aktiv"""
+        key=utf8ify(key)
+        ret=getAt(self.ZSQLInlineSearch(_table='personal_www',
+                                            _op_key='eq',key=key,
+                                            _op_publish_the_data='eq',
+                                            publish_the_data='yes'), 0)
+        
+        logging.info("MPIWGROOT ACTIVE_MEMBER  %s"%ret)
+        if ret:
+            return True
+        else:
+            return False
+        
+    # TODO: remove
+    def isActual(self,project):
+        """checke if project is actual"""
+        actualTime=time.localtime()
+        
+        if hasattr(project,'getObject'): #obj ist aus einer catalogTrefferList
+            obj=project.getObject()
+        else:
+            obj=project
+            
+        if getattr(obj,'archiveTime',actualTime)< actualTime:
+            return False
+        else:
+            return True
+   
--- a/zpt/MPIWGProject_index.zpt	Mon Apr 29 18:00:46 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,13 +0,0 @@
-<html>
-<body>
-<table border="1">
-<tr tal:repeat="field here/getDefinedFields">
-<td valign="top" tal:content="field"/>
-<!--<td tal:repeat="attr python:here.getAttribute(field)" tal:content="structure python:attr.encode('ascii','ignore')"/>-->
-<td tal:repeat="attr python:here.getAttribute(field)" tal:content="structure python:attr"/>
-</tr>
-</table>
-</body>
-</html>
-
-
--- a/zpt/MPIWGProject_newfile.zpt	Mon Apr 29 18:00:46 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,18 +0,0 @@
-<html>
-<head>
-   <title>The title</title>
-</head>
-<body>
-
-<div>
-
-<h1>Project-Upload</h1>
-<form method="post" action="loadNewFile" enctype="multipart/form-data">
-
-<p>File:</p>
-<input type="file" name="fileupload"/>
-<input type="submit">
-</form>
-</div>
-</body>
-</html>
--- a/zpt/MPIWGProject_versionManageForm.zpt	Mon Apr 29 18:00:46 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,5 +0,0 @@
-<h1>Set invisible</h1>
-<form action="versionManage">
-<input type="checkbox" name="invisible">Invisible<br/>
-<input type="submit" value="submit">
-</form>
--- a/zpt/edit_MPIWGBasis.zpt	Mon Apr 29 18:00:46 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,47 +0,0 @@
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-</head>
-<body>
-<form method="POST" action="editMPIWGProject">
-<h2>Basis Information for <span tal:replace="here/getId"/></h2>
-<table>
-<tr>
-<td>Project Title</td>
-<td><input tal:attributes="name python:'WEB_title'; value python:here.getContent('WEB_title')" size=100/></td>
-</tr>
-<tal:block tal:repeat="field here/getDataFields">
-<tr>
-<td tal:content="python:here.fieldLabels[field]"/>
-<td> <input tal:attributes="name field; value python:here.getContent(field)" size=100/></td>
-</tr>
-<tr tal:condition="python:here.isCheckField(field)">
-<td colspan=2 height="20">
-<tal:block  tal:define="checkList python:here.giveCheckList(here,field)">
-<tal:block  repeat="item checkList/keys">
-<span tal:replace="item"/>:
-<tal:block tal:condition="python:len(checkList[item])>0">
-found
-</tal:block>
-<tal:block tal:condition="not:python:len(checkList[item])>0">
-<font color="#ff0000">not found</font>
-</tal:block>
-
-
-<!--<input tal:repeat="prop python:checkList[item]" 
-       type="radio" 
-       tal:attributes="name python:'val_%s'%field; value python:prop[0].getId()" 
-       tal:content="python:prop[1]"/>-->
-</tal:block>
-<br>
-</tal:block>
-</td>
-</tr>
-</tal:block>
-</table>
-
-  
-<input type="submit">
-</form>
-</body>
-</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/zpt/project/description_only_html.zpt	Mon Apr 29 20:34:17 2013 +0200
@@ -0,0 +1,10 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
+      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+</head>
+<body>
+  <div tal:replace="structure here/getDescription"/>
+</body>
+</html>
--- a/zpt/project/edit_basic.zpt	Mon Apr 29 18:00:46 2013 +0200
+++ b/zpt/project/edit_basic.zpt	Mon Apr 29 20:34:17 2013 +0200
@@ -11,28 +11,15 @@
       <table>
         <tr>
           <td><b>Project Title</b></td>
-          <td><input tal:attributes="name python:'WEB_title'; value python:here.getContent('WEB_title')" size="80" /></td>
+          <td><input name="WEB_title" tal:attributes="value python:here.getProjectTitle()" size="80" /></td>
         </tr>
-        <tal:block tal:repeat="field here/getDataFields">
+        <tal:block tal:repeat="field here/getEditableFields">
           <tr>
             <td><b tal:content="python:here.fieldLabels[field]" /></td>
             <td><input tal:attributes="name field; value python:here.getContent(field)" size=80 /></td>
           </tr>
-          <tr tal:condition="python:here.isCheckField(field)">
-            <td />
-            <td><tal:block tal:define="checkList python:here.giveCheckList(here,field)">
-                <tal:block repeat="item checkList/keys">
-                  <span tal:replace="item" />: 
-                  <tal:block tal:condition="python:len(checkList[item])>0">found</tal:block>
-                  <tal:block tal:condition="not:python:len(checkList[item])>0">
-                    <font color="#ff0000">not found</font>
-                  </tal:block>
-                </tal:block>
-                <br />
-              </tal:block></td>
-          </tr>
         </tal:block>
-        <tr tal:define="hasChildren python:here.hasChildren()">
+        <tr tal:define="hasChildren here/getSubProjects">
           <td>Project is visible</td>
           <tal:x tal:condition="python:hasChildren and here.isActiveProject()">
             <td>visible (status cannot be changed, because the project has visible children.) <input
--- a/zpt/project/edit_description.zpt	Mon Apr 29 18:00:46 2013 +0200
+++ b/zpt/project/edit_description.zpt	Mon Apr 29 20:34:17 2013 +0200
@@ -3,7 +3,7 @@
 <html metal:use-macro="here/edit_template/macros/page" xmlns:metal="http://xml.zope.org/namespaces/metal" >
 <head>
 <metal:block metal:fill-slot="html_head">
-<metal:macros xmlns:metal="http://xml.zope.org/namespaces/metal" use-macro="here/kupuEditor/kupumacros/macros/head">
+<metal:macros use-macro="here/kupuEditor/kupumacros/macros/head">
   <metal:macros fill-slot="bootstrap-editor">
     <script type="text/javascript" src="/kupuEditor/kupuinit_form.js"> </script>
     <script type="text/javascript" src="/kupuEditor/kupustart_form.js"> </script>
@@ -54,11 +54,11 @@
       <metal:macros fill-slot="editorframe">
         <tal:block tal:condition="not:python:here.REQUEST.get('fromPreview',None)">
           <iframe class="kupu-editor-iframe" id="kupu-editor" frameborder="0" scrolling="auto" src="fulldoc"
-            tal:attributes="src python:here.absolute_url()+'/getWebProject_description'"> </iframe>
+            tal:attributes="src python:here.absolute_url()+'/description_only_html'"> </iframe>
         </tal:block>
         <tal:block tal:condition="python:here.REQUEST.get('fromPreview',None)">
           <iframe class="kupu-editor-iframe" id="kupu-editor" frameborder="0" scrolling="auto" src="fulldoc"
-            tal:attributes="src python:here.absolute_url()+'/previewTemplate/getWebProject_description'"> </iframe>
+            tal:attributes="src python:here.absolute_url()+'/previewTemplate/description_only_html'"> </iframe>
         </tal:block>
       </metal:macros>
     </metal:macros>
--- a/zpt/project/edit_template.zpt	Mon Apr 29 18:00:46 2013 +0200
+++ b/zpt/project/edit_template.zpt	Mon Apr 29 20:34:17 2013 +0200
@@ -1,6 +1,7 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
           "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html metal:define-macro="page">
+<html xmlns="http://www.w3.org/1999/xhtml"
+  metal:define-macro="page">
 <head tal:define="global onload nothing;">
 <metal:block metal:define-slot="html_head"/>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/zpt/project/manage_newfile.zpt	Mon Apr 29 20:34:17 2013 +0200
@@ -0,0 +1,17 @@
+<html>
+<head>
+</head>
+<body>
+  <div tal:replace="structure here/manage_page_header">Header</div>
+  <!-- ZOPE management tabs -->
+  <h2 tal:define="manage_tabs_message options/manage_tabs_message | nothing" tal:replace="structure here/manage_tabs">Tabs</h2>
+  <!-- end of ZOPE management tabs -->
+
+  <h1>Upload new project</h1>
+  <form method="post" action="loadNewFile" enctype="multipart/form-data">
+
+    <p>File:</p>
+    <input type="file" name="fileupload" /> <input type="submit">
+  </form>
+</body>
+</html>
--- a/zpt/project/project_template.zpt	Mon Apr 29 18:00:46 2013 +0200
+++ b/zpt/project/project_template.zpt	Mon Apr 29 20:34:17 2013 +0200
@@ -30,8 +30,8 @@
     <h1 tal:content="here/getProjectTitle">History of Scientific Objectivity, 18th-19th Cs</h1>
     <p class="maintext_authors">
       <tal:block tal:repeat="person here/getResponsibleScientistsList">
-          <a tal:omit-tag="python:not (person['username'] and here.getStaffFolder().isActiveMember(key=person['key']))"
-            tal:attributes="href string:$root/${secmap/staff}/members/${person/username}" tal:content="person/name"> Name of
+          <a tal:define="username person/username|nothing" tal:omit-tag="python:not username or not here.getStaffFolder().isActiveMember(key=person.get('key',None))"
+            tal:attributes="href string:$root/${secmap/staff}/members/$username" tal:content="person/name"> Name of
             responsible person</a><tal:block tal:condition="not:repeat/person/end">, </tal:block>
       </tal:block>
     </p>