diff MPIWGProjects.py @ 60:dc41deabc8f8

more work on projects. more cleanup.
author casties
date Thu, 02 May 2013 11:26:57 +0200
parents 09900782c855
children 04fb655633ef
line wrap: on
line diff
--- a/MPIWGProjects.py	Thu May 02 10:14:52 2013 +0200
+++ b/MPIWGProjects.py	Thu May 02 11:26:57 2013 +0200
@@ -201,6 +201,7 @@
     """publications object fuer project"""
 
     meta_type = "MPIWGProject_relatedProject"
+    
     def redirect(self, RESPONSE, url):
         """mache ein redirect mit einem angehaengten time stamp um ein reload zu erzwingen"""
         
@@ -215,6 +216,11 @@
         logging.debug(email.Utils.formatdate() + ' GMT')
         RESPONSE.redirect(url + addStr % timeStamp)
 
+    
+    def getProjectTitle(self):
+        """Return the title of the related project."""
+        return getattr(self, 'projectWEB_title', None)
+    
         
     def editRelatedProject(self, link=None, RESPONSE=None):
         """edit a publication"""
@@ -254,7 +260,7 @@
 
     def showImage(self, imageUrl=None):
         """show Images at an extra page"""
-        self.getContent('WEB_project_description', filter='yes')  # get the content and store image infos into session
+        #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()
     
@@ -307,7 +313,9 @@
     edit_basic = PageTemplateFile('zpt/project/edit_basic', globals())
     editForm = PageTemplateFile('zpt/project/edit_description', globals())
     edit_template = PageTemplateFile('zpt/project/edit_template', globals())
-    edit_related_projects = PageTemplateFile('zpt/project/edit_related_projects', globals())
+    editRelatedProjectsForm = PageTemplateFile('zpt/project/edit_related_projects', globals())
+    editImagesForm = PageTemplateFile('zpt/project/edit_images', globals())    
+    editPublicationsForm = PageTemplateFile('zpt/project/edit_publications', globals())
     # management templates
     loadNewFileForm = PageTemplateFile('zpt/project/manage_newfile', globals())
     description_only_html = PageTemplateFile('zpt/project/description_only_html', globals())
@@ -360,6 +368,21 @@
         RESPONSE.redirect(url + addStr % timeStamp)
 
 
+    def getDefinedFields(self):
+        """show all defined fields."""
+        return definedFields
+
+
+    def getFieldLabels(self):
+        """Return the field labels dict."""
+        return fieldLabels
+    
+
+    def getEditableFields(self):
+        """giveListofDatafields"""
+        return editableFields
+    
+
     def getNumber(self):
         """returns sorting number"""
         n = getattr(self, 'xdata_05', None)
@@ -561,97 +584,55 @@
             return t
 
               
+    def moveObjectPlace(self, objectList, objectId, direction):
+        """Move object with objectId from objectList in direction 
+        by changing its place attribute."""
+        if not objectId or not direction:
+            return
+
+        for idx in range(len(objectList)):
+            object = objectList[idx]
+            if object.getId() == objectId():
+                if direction == 'up':
+                    if idx > 0:
+                        # move up
+                        objectList[idx -1].place += 1
+                        objectList[idx].place -= 1
+                        
+                elif direction == 'down':
+                    if idx < len(objectList) - 1:
+                        # move down
+                        objectList[idx + 1].place -= 1
+                        objectList[idx].place += 1
+                        
+                return
+                      
     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
-
-
+        """manage images"""
+        self.moveObjectPlace(self.getImageList(), imageName, op)
+ 
         # invalidate thumbnail
         self.projectThumb = None
-        pt = PageTemplateFile('zpt/project/edit_images', globals()).__of__(self)
+        
+        pt = self.editImagesForm
         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
+
+    def managePublications(self, name=None, op=None):
+        """manage publications"""
+        self.moveObjectPlace(self.getRelatedPublications(), name, op)
 
-
-        pt = PageTemplateFile('zpt/project/edit_publications', globals()).__of__(self)
+        pt = self.editPublicationsForm
         return pt()
+
     
-    def manageRelatedProjects(self, pubName=None, op=None):
+    def manageRelatedProjects(self, name=None, op=None):
         """manage related projects"""
-        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
+        self.moveObjectPlace(self.getRelatedProjects(), name, op)
 
-
-        pt = self.edit_related_projects
-        return pt()
-    
-
+        pt = self.editRelatedProjectsForm
+        return pt()    
 
-    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"""
@@ -669,18 +650,18 @@
         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"""
+        """add a MPIWGProject_relatedProject"""
         number = self.getLastPublicationNumber() + 1
         name = "RelatedProject" + str(number)
         while hasattr(self, name):
@@ -708,7 +689,7 @@
         obj.orginallink = link[0:]
         obj.objid = objid[0:]
         logging.debug("add relobj:objid" + repr(obj.objid))
-        obj.projectWEB_title = object.getContent('WEB_title')[0:]
+        obj.projectWEB_title = object.getProjectTitle()
         logging.debug("add relobj:webtitle" + repr(obj.projectWEB_title))
         obj.enabled = True;
         obj.place = self.getLastRelatedProjectNumber() + 1
@@ -719,63 +700,35 @@
 
      
     def getLastPublicationNumber(self):
-        publications = self.getPublications()
-       
+        publications = self.getRelatedPublications()
         if not publications:
             return 0
         else:
-            return getattr(publications[-1][1], 'place', 0)
+            return getattr(publications[-1], 'place', 0)
+
         
     def getLastRelatedProjectNumber(self):
         publications = self.getRelatedProjects()
-        
         if not publications:
             return 0
         else:
-            return getattr(publications[-1][1], 'place', 0)
+            return getattr(publications[-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"""
 
-        def sort_images(x, y):
-            return cmp(getattr(x[1], 'place', 0), getattr(y[1], 'place', 0))
-
-
-        if (getattr(self, 'imageURL', '') != '') or  (getattr(self, 'imagecap', '') != '')  :
-            try:
-                self.addImage(None, getattr(self, 'imagecap', ''), RESPONSE=None, filename=getattr(self, 'imageURL', ''))
-            except:
-                pass
-            self.imageURL = ''
-            self.imagecap = ''
-
-        images = self.ZopeFind(self, obj_metatypes=['MPIWGProject_image'])
-        
-        images.sort(sort_images)
-        return images
-
-    def getLastImageNumber(self):
-        images = self.getImages()
-        
-        if not images:
-            return 0
-        else:
-            return getattr(images[-1][1], 'place', 0)
-        
     def deleteImage(self, id, RESPONSE=None):
         """delete Image id"""
         try:
@@ -789,7 +742,6 @@
         if RESPONSE:
             self.redirect(RESPONSE, 'manageImages')
 
-
  
     def addImage(self, fileHd, caption, RESPONSE=None, filename=None):
         """add an MPIWG_Project_image"""
@@ -816,11 +768,6 @@
             self.redirect(RESPONSE, 'manageImages')
 
 
-    def getEditableFields(self):
-        """giveListofDatafields"""
-        return editableFields
-    
-
     def getActualVersion(self, date=None):
         """actuelle version"""
         def sortProjectsByTime(x, y):
@@ -885,18 +832,22 @@
         logging.info("copytoarchive 6")
         obj.manage_delObjects(ids)
         logging.info("copytoarchive 7")
+
         
     def setArchiveTime(self, time):
         """set Archive Time"""
         self.archiveTime = time[0:]
+
         
     def delArchiveTime(self):
         """delete archive time"""
         del self.archiveTime
+
    
     def isActiveProject(self):
         """check if the project is still active, default is true."""
         return getattr(self, 'isActiveFlag', True)
+
  
     def checkActive(self, active):
         """returns if the project state matches the active state.
@@ -906,6 +857,7 @@
         """
         act = getattr(self, 'isActiveFlag', True)
         return (active == 1 and act) or (active == 0) or (active == 2 and not act)
+
  
     def isArchivedProject(self):
         """check if the project is archived"""
@@ -917,6 +869,7 @@
             return False;
         
         return True
+
         
     def checkArchived(self, archived):
         """returns if the project state matches the archived state.
@@ -926,10 +879,12 @@
         """
         arch = self.isArchivedProject()
         return (archived == 1 and not arch) or (archived == 0) or (archived == 2 and arch)        
+
         
     def setActiveFlag(self, status=True):
         """set the active flag"""
         self.isActiveFlag = status
+
         
     def setCompletedAt(self, date):
         """set the date of completion, date should be in the form DD.MM.YYYY or MM.YYYY or YYYY"""
@@ -1041,7 +996,6 @@
             else:
                 return self.REQUEST['URL1'] + "/no_project"
 
-
         else:
             finds.sort(sortProjectsByTime)
 
@@ -1053,116 +1007,12 @@
         # kein passendes gefunden, dann teste ob das aktuelle in frage kommt
         ad = getattr(self, 'creationTime', '20050101000000')
         
-        if int(date) > int(ad):
-        
+        if int(date) > int(ad):        
             return self.REQUEST['URL1'] + "/" + self.getId()
         else:
             return self.REQUEST['URL1'] + "/no_project"
-        
-            
-            
-    def getDefinedFields(self):
-        """show all defined fields"""
-        return definedFields
-
-    def getAttribute(self, field):
-        """get attrbiute"""
-        return getattr(self, field)
-
-    def getContent(self, field, filter=None):
-        """Inhalt des Feldes"""
-        # logging.debug("getContent field=%s filter=%s"%(field,filter))
-        
-        if field == "short_title":
-                text = self.getContent("xdata_07")
-                if text == "":
-                        text = self.getContent("WEB_title")
-                return text
-
-        text = u''
-
-        f = getattr(self, field)
-        if isinstance(f, list):
-            # compat with old lists
-            for x in f:
-                try:
-                    text += x
-                except:
-                    text = x
-        else:
-            text = f
-
-        try:
-            if text[len(text) - 1] == ";":
-                text = text[0:len(text) - 1]
-                
-        except:
-            pass
-        
-        if text == '':  # # wozu die folgenden Zeilen??
-            text2 = text
-        else:
-            text2 = re.sub(r';([^\s])', '; \g<1>', text)
-       
-        if field == "WEB_project_description":  # #Jedenfalls darf letzteres nicht gemacht werden, falls normaler text
-            text2 = text
+                    
             
-        # teste ob ergebnis leer und header dann nehme title
-        
-        if (text2 == '') and (field == 'WEB_project_header'):
-            return self.getContent('WEB_title')
-
-        if filter:
-            splitted = text2.split("""<p class="picture">""")
-            if len(splitted) > 1:
-                tmp = splitted[1].split("</p>")
-                # return repr(splitted[1])
-                try:
-                        self.imageURL = tmp[0].split("\"")[1].encode('utf-8')
-                except:
-                    try:
-                        self.imageURL = tmp[0].split("src=")[1].split(" ")[0].encode('utf-8')
-                    except:
-                        self.imageURL = ""
-
-                split2 = "</p>".join(tmp[1:])
-
-                text3 = splitted[0] + split2
-
-                splitted = text3.split("""<p class="picturetitle">""")
-                if len(splitted) > 1:
-                    tmp = splitted[1].split("</p>")
-                    self.imagecap = tmp[0].encode('utf-8')
-                
-                    split4 = "".join(tmp[1:])
-
-                    text5 = splitted[0] + split4
-                else:
-                    # keine caption
-                    text5 = text3
-            else:
-                # kein bild
-                text5 = text2
-        else:
-            text5 = text2
-
-        # teste ob WEB_project_description und keine fuehrenden p tags
-        if (len(text5) > 4) and (not text5[0:3] == '<p>') and (field == 'WEB_project_description'):
-            text5 = "<p>" + text5 + "</p>"
-
-
-        # filter image
-        
-        text5 = text5.lstrip().rstrip()  # loescher leerzeichen und einzelndes br
-        if (text5 == "<br>") or (text5 == "<br/>"):
-            text5 = ""
-
-        # logging.debug("getcontent: field=%s filter=%s -> %s"%(field,filter,repr(text5)))
-        return unicodify(text5)
-        # return utf8ify(text5) # return as utf-8 byte string
-
-
-
     def saveFromPreview(self):
         """save content aus preview"""
         self.WEB_project_description = self.previewTemplate.WEB_project_description[0:]
@@ -1190,6 +1040,7 @@
         
         return True
 
+
     security.declareProtected('View management screens', 'edit')
     def edit(self, western=None):
         """Edit pages"""
@@ -1255,8 +1106,10 @@
 
     def isResponsibleScientist(self, key):
         """teste ob eine Person in der Liste der respl. scientists auftaucht"""
+        #key = utf8ify(key)
         for resp in self.getResponsibleScientistsList():
-            if resp.get('key', None) == utf8ify(key):
+            logging.debug("resp=%s key=%s"%(repr(resp),repr(key)))
+            if resp.get('key', '').lower() == key.lower():
                 return True
         
         return False
@@ -1376,9 +1229,8 @@
         if fromEdit and (RESPONSE is not None):
             return self.editBasic()
             
-        else:
-            if RESPONSE is not None:
-                RESPONSE.redirect('manage_main')
+        if RESPONSE is not None:
+            RESPONSE.redirect('manage_main')
 
 
     security.declareProtected('View management screens', 'editBasic')
@@ -1392,6 +1244,14 @@
         return pt(identifiedNames=identifiedNames)
 
 
+    def getContent(self, field, filter=None):
+        """Inhalt des Feldes"""
+        val = getattr(self, field, '')
+        if isinstance(val, list):
+            val = val[0]
+            
+        return val
+
 
     def loadNewFile(self, RESPONSE=None):
         """einlesen des neuen files"""
@@ -1416,6 +1276,7 @@
         if RESPONSE is not None:
             RESPONSE.redirect('manage_main')
 
+
     def tagTheProject(self, RESPONSE=None):
         """TAG"""
         id = self.getId();
@@ -1439,8 +1300,7 @@
         
         if(len(publications) > 0):
             ret = False;  # es gibt publicationen in der neuen liste
-      
-        
+              
         logging.debug("len(publ)" + repr(ret))
         
         return ret;
@@ -1448,7 +1308,9 @@
 
     def copyPublicationsToList(self, RESPONSE=None):
         """copy publications in to list"""
-        publicationTxt = self.getRelatedPublications()
+        publicationTxt = getattr(self, 'WEB_related_pub', '')
+        if isinstance(publicationTxt, list):
+            publicationTxt = publicationTxt[0]
 
         pubSplits = publicationTxt.split("<p>")
 
@@ -1459,7 +1321,6 @@
         setattr(self, "WEB_related_pub_copied", True);
         
         if RESPONSE:
-                
             self.redirect(RESPONSE, 'managePublications')
         
 
@@ -1563,41 +1424,21 @@
 
 
     def updateProjectMembers(self, updateResponsibleScientistsList=False):
-        """updates project-member table"""
-        if updateResponsibleScientistsList:
-            # create responsibleScientistsList automatically
-            newScientists = {}
-            names = p.identifyNames(p.getResponsibleScientists())
-            for name in names:
-                logging.debug("updateAllProjectMembers: name=%s" % repr(name))
-                members = names[name]
-                if len(members) > 0:
-                    # take the first matching name
-                    newScientists[name] = {'name': name, 'key' : members[0].key, 'username' : re.sub('@mpiwg-berlin\.mpg\.de', '', members[0].e_mail)}
-                
-            self.setResponsibleScientistsList(newScientists)
-            
-        memberlist = self.getResponsibleScientistsList()
-           
+        """Update project-member table."""
+        # projects are identified by id
+        pid = self.getId()
+
         # clear projects_members table
-        pNum = self.getNumber()
-        if not pNum or not isinstance(pNum, basestring):
-            logging.error("updateProjectMembers: not a valid project number: %s" % repr(pNum))
-            return
+        self.executeZSQL("delete from projects_members where project_id = %s", [pid])
 
-        if len(memberlist) == 0:
-            return
-         
-        # fill projects_members table
-        self.executeZSQL("delete from projects_members where project_number = %s", [pNum])
-        for m in memberlist:
+        for m in self.getResponsibleScientistsList():
             memberKey = m.get('key', None)
             if not memberKey or not isinstance(memberKey, basestring):
                 logging.error("updateProjectMembers: not a valid member key: %s" % repr(memberKey))
                 continue
                         
-            self.executeZSQL("insert into projects_members (project_number, member_key) values (%s, %s)", (pNum, memberKey))
-
+            # fill projects_members table
+            self.executeZSQL("insert into projects_members (project_id, member_key) values (%s, %s)", (pid, memberKey))
     
     
     def addPublicationsFromPubman(self,REQUEST):
@@ -1691,38 +1532,29 @@
             logging.error(escidocid)
             logging.error(value)
         
+
     def getSelectedPublications(self):
         """hole publications aus der datenbank"""
-    
-    
         query="select * from pubmanbiblio_projects where lower(key_main) = lower(%s) order by priority DESC"
-            
-           
         return self.executeZSQL(query,[self.getId()])
- 
-     
+
         
     def hasExtendedPublicationList(self):
         """test if extended publication list exists"""
-        
-    
-    
         query="select count(*) from pubmanbiblio_projects where lower(key_main) = lower(%s)"
-            
-           
         res= self.executeZSQL(query,[self.getId()])
         
         if res[0].count>0:
             return True
         else:
             return False
+
         
     def publicationsFull(self,REQUEST):
         """show publication"""
         pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt/project/pubman','show_publications.zpt')).__of__(self)
         return pt()
         
-
         
 def manage_addMPIWGProjectForm(self):
     """form for adding the project"""
@@ -1746,7 +1578,6 @@
         newObj = MPIWGProject(id)
 
     self._setObject(id, newObj)
-
     
     if RESPONSE is not None:
         RESPONSE.redirect('manage_main')
@@ -1760,9 +1591,6 @@
     
     # cached HashTree with project hierarchy
     _v_projectTree = None
-
-    
-   
                     
     def getProjectTree(self):
         """Return the project hierarchy tree (and cache it).
@@ -1908,7 +1736,7 @@
             RESPONSE.redirect(self.en.MPIWGrootURL()+'/admin/showTree')
 
 
-    # TODO: it's broken. is this used?
+    # TODO: this is broken. is this used?
     def getAllProjectsAndTagsAsCSV(self,archived=1,RESPONSE=None):
         """alle projekte auch die nicht getaggten"""
         retList=[]
@@ -1948,7 +1776,6 @@
       
         return "\n".join(retList);
     
-    
         
     security.declareProtected('View management screens', 'updateAllProjectMembers')
     def updateAllProjectMembers(self, updateResponsibleScientistsList=False):
@@ -1984,30 +1811,46 @@
                 project.copyPublicationsToList()
                                 
             #
-            # old format responsibleScientistsList
+            # create responsibleScientistsList automatically
             #
-            memberlist = project.getResponsibleScientistsList()
-            if len(memberlist) > 0 and isinstance(memberlist[0], tuple):
-                log += "%s: updating memberlist!\n"%project.getId()
-                logging.debug("updateAllProjects(%s): updating memberlist" % project.getId())
+            if updateResponsibleScientistsList:
                 newScientists = {}
-                for m in memberlist:
-                    name = m[0]
-                    key = m[1] 
-                    username = None
-                    if key:
-                        if isinstance(key, list):
-                            key = key[0]
-                            
-                        # get username from db
-                        member = self.getMPIWGRoot().getStaffFolder().getMember(key=key)
-                        if member is not None:
-                            username = member.getUsername()
-                            
-                    newScientists[name] = {'name': name, 'key' : key, 'username' : username}
+                names = project.identifyNames(p.getResponsibleScientists())
+                for name in names:
+                    logging.debug("updateAllProjectMembers: name=%s" % repr(name))
+                    members = names[name]
+                    if len(members) > 0:
+                        # take the first matching name
+                        newScientists[name] = {'name': name, 'key' : members[0].key, 'username' : re.sub('@mpiwg-berlin\.mpg\.de', '', members[0].e_mail)}
                     
-                # set new list
                 project.setResponsibleScientistsList(newScientists)
+                
+            else:
+                #
+                # old format responsibleScientistsList
+                #
+                memberlist = project.getResponsibleScientistsList()
+                if len(memberlist) > 0 and isinstance(memberlist[0], tuple):
+                    log += "%s: updating memberlist!\n"%project.getId()
+                    logging.debug("updateAllProjects(%s): updating memberlist" % project.getId())
+                    newScientists = {}
+                    for m in memberlist:
+                        name = m[0]
+                        key = m[1] 
+                        username = None
+                        if key:
+                            if isinstance(key, list):
+                                key = key[0]
+                                
+                            # get username from db
+                            member = self.getMPIWGRoot().getStaffFolder().getMember(key=key)
+                            if member is not None:
+                                username = member.getUsername()
+                                
+                        newScientists[name] = {'name': name, 'key' : key, 'username' : username}
+                        
+                    # set new list
+                    project.setResponsibleScientistsList(newScientists)
 
             #
             # old inline images