diff MPIWGProjects.py @ 50:e30a4bd074db

more cleaning up projects.
author casties
date Mon, 29 Apr 2013 20:34:17 +0200
parents e40ff9829108
children d456fe185649
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