# HG changeset patch # User casties # Date 1367001081 -7200 # Node ID bbad6a0928610c56bd1755ab3afb2407e12dcb79 # Parent 3c98cc79dd1498b043e5c777311baa5afe218298 more work on projects. extended bibliography still borked. diff -r 3c98cc79dd14 -r bbad6a092861 HashTree.py --- a/HashTree.py Fri Apr 26 19:09:50 2013 +0200 +++ b/HashTree.py Fri Apr 26 20:31:21 2013 +0200 @@ -67,6 +67,8 @@ return sub + "] " + + class HashTree: """Tree using dictionaries""" @@ -82,6 +84,23 @@ self.keyFn = keyFn + def _splitkey(self, key): + """returns a list of key parts""" + if isinstance(key, basestring): + # its a string - split + keys = key.split(self.keySeparator) + if self.keyFn is not None: + keys = [self.keyFn(k) for k in keys] + elif isinstance(key, list): + # its a list - keep + keys = key + else: + # not a list - wrap in list + keys = [key] + + return keys + + def getNode(self, key): """gets node under key from the tree. key can be sequence of key string or a single string using keySeparator. @@ -90,22 +109,11 @@ if key is None: return self.root - if isinstance(key, basestring): - keys = key.split(self.keySeparator) - if self.keyFn is not None: - keys = [self.keyFn(k) for k in keys] - - elif isinstance(key, list): - keys = key - - else: - keys = [key] + keys = self._splitkey(key) node = self.root for k in keys: - #logging.debug("getNode node=%s k=%s"%(node, repr(k))) node = node.getNode(k) - #logging.debug("getNode got:%s"%(node)) if node is None: return None @@ -127,16 +135,7 @@ """adds value under key to the tree. key can be sequence of key string or a single string using keySeparator. """ - #logging.debug("add(key=%s, value=%s)"%(repr(key), value)) - if isinstance(key, basestring): - keys = key.split(self.keySeparator) - if self.keyFn is not None: - keys = [self.keyFn(k) for k in keys] - elif isinstance(key, list): - keys = key - else: - keys = [key] - + keys = self._splitkey(key) node = self.root for k in keys: nextnode = node.getNode(k) @@ -147,6 +146,31 @@ node = nextnode node.value = value + - + def getChildrenOf(self, key): + """returns the list of child (values) of the node under key.""" + node = self.getNode(key) + if node.children is None: + return [] + else: + return [n.value for (k, n) in node.children.items() if n.value is not None] + + + def getAncestorsOf(self, key): + """returns the list of ancestor (values) of the node under key. + ordered from root up.""" + keys = self._splitkey(key) + node = self.root + ancestors = [] + for k in keys: + if node.value is not None: + ancestors.append(node.value) + + node = node.getNode(k) + if node is None: + return ancestors + + return ancestors + diff -r 3c98cc79dd14 -r bbad6a092861 MPIWGDepartment.py --- a/MPIWGDepartment.py Fri Apr 26 19:09:50 2013 +0200 +++ b/MPIWGDepartment.py Fri Apr 26 20:31:21 2013 +0200 @@ -91,12 +91,12 @@ """returns the name of the director""" return self.director - def getDirectorId(self): - """returns the id of the director""" + def getDirectorUsername(self): + """returns the username of the director""" return self.director_id - def getProjectId(self): - """return the project id""" + def getProjectNumber(self): + """return the project number""" return self.project_id def getUrl(self, baseUrl=None): @@ -141,8 +141,9 @@ def getProject(self): """returns the default project""" - proj = self.getProjects(count=1, onlyActive=1, onlyArchived=1) - return getAt(proj, 0, None) + pf = self.getMPIWGRoot().getProjectFolder() + proj = pf.getProject(projectNumber=self.getProjectNumber()) + return proj def getProjects(self, count=0, onlyActive=0, onlyArchived=0): """returns a list of projects of this department. @@ -155,8 +156,8 @@ onlyArchived = 1 : current projects onlyArchived = 2 : archived projects """ - pf = self.en.getProjectFolder() - projects = pf.getProjectsAsList(self.getProjectId(), active=onlyActive, archived=onlyArchived) + pf = self.getMPIWGRoot().getProjectFolder() + projects = pf.getProjectsAsList(self.getProjectNumber(), active=onlyActive, archived=onlyArchived) #logging.debug("getProjects projects=%s"%repr(projects)) if count > 0: return projects[:count] @@ -168,7 +169,7 @@ self.weight=weight if RESPONSE is not None: RESPONSE.redirect('manage_main') - + def changeMPIWGDepartment(self, title=None, weight=None, project_id=None, director=None, director_id=None, type_en=None, type_de=None, title_en=None, title_de=None, RESPONSE=None): """change everything""" diff -r 3c98cc79dd14 -r bbad6a092861 MPIWGProjects.py --- a/MPIWGProjects.py Fri Apr 26 19:09:50 2013 +0200 +++ b/MPIWGProjects.py Fri Apr 26 20:31:21 2013 +0200 @@ -1,7 +1,7 @@ """This contains the class MPIWG Projects for organizing and maintaining the different project pages -$author dwinter - last change 26.06.2008 +$author dwinter 26.06.2008 """ from Products.PageTemplates.PageTemplateFile import PageTemplateFile @@ -51,25 +51,7 @@ import transaction -# TODO: fix this -definedFields = ['WEB_title', - 'xdata_01', - 'xdata_02', - 'xdata_03', - 'xdata_04', - 'xdata_05', - 'xdata_06', - 'xdata_07', - 'xdata_08', - 'xdata_09', - 'xdata_10', - 'xdata_11', - 'xdata_12', - 'xdata_13', - 'WEB_project_header', - 'WEB_project_description', - 'WEB_related_pub'] - +# TODO: better names for the fields fieldLabels = {'WEB_title':'WEB_Title', 'xdata_01':'Responsible Scientists', 'xdata_02':'Department', @@ -88,6 +70,8 @@ 'WEB_project_description':'WEB_project_description', 'WEB_related_pub':'WEB_related_pub'} +definedFields = fieldLabels.keys() # TODO: should this be sorted? + checkFields = ['xdata_01'] @@ -146,7 +130,6 @@ logging.debug("MPIWGProject_publication - end FALSE ") self._v_hasLinkToBookPage = True return False - def getImageUrls(self, mode="not_cached"): @@ -175,6 +158,7 @@ return [] self._v_imageUrls = ret[0:] return ret + def editPublication(self, text=None, image1=None, image2=None, description=None, link=None, RESPONSE=None): """edit a publication""" @@ -206,12 +190,12 @@ else: nO = Image('publicationImage2', '', image2) self._setObject('publicationImage2', nO) - - + self.ZCacheable_invalidate() if RESPONSE: self.redirect(RESPONSE, "../managePublications") + class MPIWGProject_relatedProject(Folder): """publications object fuer project""" @@ -237,10 +221,6 @@ if (not link): pt = PageTemplateFile(os.path.join(package_home(globals()), 'zpt', 'edit_relatedProjectForm.zpt')).__of__(self) return pt() - - - - # hole die id des projektes splitted = link.split("/") @@ -254,10 +234,6 @@ if object == None: self.redirect(RESPONSE, 'errorRelatedProjects?link=' + link) - - - - self.orginallink = link[0:] self.objid = objid[0:] @@ -270,6 +246,7 @@ if RESPONSE: self.redirect(RESPONSE, "../manageRelatedProjects") + class MPIWGProject_image(Image): """Images for Projects""" @@ -329,6 +306,8 @@ editForm = PageTemplateFile('zpt/project/edit_description', globals()) edit_template = PageTemplateFile('zpt/project/edit_template', globals()) project_template = PageTemplateFile('zpt/project/project_template', globals()) + # TODO: this should go away + extendedBibliography = PageTemplateFile('zpt/project/extendedBibliography_template', globals()) # TODO: compat edit_MPIWGProject_main = edit_template @@ -434,23 +413,8 @@ return ret; - def hasRelatedDigitalSources(self): - """test ob es digital sources gibt""" - - - ret = (self.getContent('xdata_11').lstrip().rstrip() == '') - - - - return not ret; - - - - def copyImageToMargin(self, RESPONSE=None): """copy inline images to marginal images""" - - # getImages from WEB_project_description description = self.getContent('WEB_project_description') @@ -480,12 +444,10 @@ tmp = splitted[1].split("
") imageCaptions.append(tmp[0].encode('utf-8')) - else: # keine caption imageCaptions.append("") - # eintragen: for imageURL in imageURLs: @@ -513,8 +475,8 @@ obj.update_data(data) if RESPONSE: - self.redirect(RESPONSE, 'manageImages') + def manageImages(self, imageName=None, op=None): """managage images""" @@ -606,7 +568,6 @@ """erzeuge erweiterte publications liste""" pl = BibliographyManager("publicationList", "", "institutsbiblio", self.connection_id) self._setObject("publicationList", pl) - zt = ZopePageTemplate('index.html') pl._setObject('index.html', zt) @@ -614,12 +575,11 @@ '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): @@ -727,7 +687,6 @@ self.manage_delObjects([id]) self.ZCacheable_invalidate() if RESPONSE: - self.redirect(RESPONSE, 'managePublications') def deleteRelatedProject(self, id, RESPONSE=None): @@ -735,7 +694,6 @@ self.manage_delObjects([id]) self.ZCacheable_invalidate() if RESPONSE: - self.redirect(RESPONSE, 'manageRelatedProjects') @@ -758,6 +716,20 @@ else: return t + + def getLabel(self): + """returns label (or title) of this project""" + l = getattr(self, 'xdata_07', None) + if isinstance(l, list): + # compat with old lists + l = l[0] + + if l: + return l + else: + return self.getProjectTitle() + + def getResponsibleScientists(self): """returns the responsible scientists as string""" t = getattr(self, 'xdata_01', None) @@ -797,6 +769,26 @@ self.responsibleScientistsList = scientistsList + def getInvolvedScholars(self): + """returns the other involved scholars""" + t = getattr(self, 'xdata_08', None) + if isinstance(t, list): + # compat with old lists + return t[0] + else: + return t + + + def getCooperationPartners(self): + """returns the cooperation partners""" + t = getattr(self, 'xdata_12', None) + if isinstance(t, list): + # compat with old lists + return t[0] + else: + return t + + def getUrl(self, baseUrl=None): """returns URL to this Project""" if baseUrl is None: @@ -829,6 +821,82 @@ items.sort(key=lambda x:int(getattr(x, 'place', 0))) return items + + def getDepartment(self): + """returns the department of this project""" + num = self.getNumber() + pp = num.find('.') + if pp > 0: + num = num[:pp] + + return self.getMPIWGRoot().getDepartment(projectNumber=num) + + + def getDepartmentId(self): + """returns the id of the department of this project""" + dep = self.getDepartment() + if dep is not None: + return dep.getId() + + return None + + + def getDescription(self, filter=False): + """returns the project description""" + t = getattr(self, 'WEB_project_description', None) + if isinstance(t, list): + # compat with old lists + return t[0] + else: + return t + + + def getSuperProjects(self): + """returns a list of ancestor projects to the root""" + tree = self.getProjectTree() + return tree.getAncestorsOf(self.getNumber()) + + + def getSubProjects(self, active=1): + """returns a list of child projects""" + tree = self.getProjectTree() + return [p for p in tree.getChildrenOf(self.getNumber()) if p.checkActive(active)] + + + def getRelatedProjects(self): + """returns the list of related projects""" + items = self.objectValues(spec='MPIWGProject_relatedProject') + # sort by place + items.sort(key=lambda x:int(getattr(x, 'place', 0))) + return items + + + def getRelatedPublications(self): + """returns the list of related publications""" + items = self.objectValues(spec='MPIWGProject_publication') + # sort by place + items.sort(key=lambda x:int(getattr(x, 'place', 0))) + return items + + + def getRelatedDigitalSources(self): + """returns the related digital sources""" + t = getattr(self, 'xdata_11', None) + if isinstance(t, list): + # compat with old lists + return t[0] + else: + return t + + def getFundingInstitutions(self): + """returns the funding institutions""" + t = getattr(self, 'xdata_13', None) + if isinstance(t, list): + # compat with old lists + return t[0] + else: + return t + def getImages(self): """get all Images""" @@ -871,7 +939,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) @@ -957,8 +1024,6 @@ def isActual(self): """gibt 1 zurueck wenn aktuell, 0 sonst""" actualTime = time.localtime() - - # print getattr(self,'archiveTime',actualTime) if getattr(self, 'archiveTime', actualTime) < actualTime: return 0 @@ -1005,43 +1070,8 @@ self.redirect(RESPONSE, 'manage_main') - def crossLinker(self): - """experimental crosslinker""" - splitted = self.WEB_project_description[0].split() - new = [] - for split in splitted: - try: - found = self.DescriptionCatalog({'fulltext':split}) - - if len(found) > 1: - - new.append("%s" % (split, split)) - else: - new.append(split) - except: - new.append(split) - return " ".join(new) - - - - - def generateTemplate(self, RESPONSE=None): - """Erzeuge Template fuer defined fields not_used""" - - id = "index_html" - title = id - if self._getOb('index_html'): - self._delObject('index_html') - - - newObj = ZopePageTemplate(id, 'TEXT') - self._setObject(id, newObj) - # self.manage_addPageTemplate(id,title) - if RESPONSE is not None: - self.redirect(RESPONSE, 'manage_main') - def isActiveProject(self): - """check if the project is still active, default is true, set to false is the project is accomplished""" + """check if the project is still active, default is true.""" return getattr(self, 'isActiveFlag', True) def checkActive(self, active): @@ -1102,19 +1132,10 @@ def getCompletedAt(self): """gibt das transformierte Datum zurueck, an dem das Projekt beendet wurde.""" date = getattr(self, 'completedAt', '') - if date: return self.reTransformDate(date); else: return "" - # test ob parent abgeschlossen ist - try: # TODO: ersetzte try except durch vernuenftige abfrage - ct = self.getContexts(parents=self.getContent('xdata_05'), depth=1) - if (len(ct) > 0): # is there are parent - return ct[0][0].getCompletedAt() - return ''; - except: - return ''; def getStartedAt(self): """gibt das transformierte Datum zurueck, an dem Projekt begonnen wurde.""" @@ -1337,7 +1358,6 @@ def getDefinedFields(self): """show all defined fields""" - return definedFields def getAttribute(self, field): @@ -1496,7 +1516,7 @@ else: return style - def getLabel(self): + def getLabel_old(self): """returns label (or title) of this project""" l = self.getContent('xdata_07') if l: @@ -1537,7 +1557,6 @@ def getRootProject(self): """returns the root (=top level) project of the current project""" - ct = self.getContexts(parents=self.getContent('xdata_05')) if len(ct) > 0: return ct[-1][0] @@ -1748,6 +1767,7 @@ checkedScientists[names[nr]] = {'name' : name, 'key' : key, 'username' : username} self.setResponsibleScientistsList(checkedScientists) + self.updateProjectMembers() if fromEdit and (RESPONSE is not None): return self.editBasic() @@ -1861,29 +1881,6 @@ if len(memberlist) == 0: return - # update old format responsibleScientistsList - if isinstance(memberlist[0], tuple): - logging.debug("updateAllProjectMembers: updating memberlist for project %s" % self) - 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.executeZSQL("select * from personal_www where lower(key) = %s", [key.lower()]) - if len(member) > 0: - username = re.sub('@mpiwg-berlin\.mpg\.de', '', member[0].e_mail) - - newScientists[name] = {'name': name, 'key' : key, 'username' : username} - - # set and re-read new list - self.setResponsibleScientistsList(newScientists) - memberlist = self.getResponsibleScientistsList() - # fill projects_members table self.executeZSQL("delete from projects_members where project_number = %s", [pNum]) for m in memberlist: @@ -1970,6 +1967,15 @@ # return filtered list return [p for p in pl if (p.checkActive(active) and p.checkArchived(archived))] + + def getProject(self, projectNumber=None): + """returns the matching project""" + tree = self.getProjectTree() + if projectNumber is not None: + return tree.get(projectNumber) + + return None + def getProjectsOfMember(self, key, active=1, archived=1): """returns a list of all projects of a member. @@ -2010,6 +2016,55 @@ return "updated %s projects!" % cnt + security.declareProtected('View management screens', 'updateAllProjects') + def updateAllProjects(self, updateResponsibleScientistsList=False): + """patches all current projects for old problems""" + cnt = 0 + # go through all projects + for project in self.objectValues(spec='MPIWGProject'): + cnt += 1 + # + # hasRelatedPublicationsOldVersion + # + if project.hasRelatedPublicationsOldVersion(): + logging.debug("updateAllProjects(%s): update relatedPublicationsOldVersion!"%project.getId()) + project.copyPublicationsToList() + + # + # old format responsibleScientistsList + # + memberlist = project.getResponsibleScientistsList() + if len(memberlist) > 0 and isinstance(memberlist[0], tuple): + logging.debug("updateAllProjects(%s): updating memberlist for project %s" % 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.executeZSQL("select * from personal_www where lower(key) = %s", [key.lower()]) + if len(member) > 0: + username = re.sub('@mpiwg-berlin\.mpg\.de', '', member[0].e_mail) + + newScientists[name] = {'name': name, 'key' : key, 'username' : username} + + # set new list + project.setResponsibleScientistsList(newScientists) + + # + # remove old attributes + # + if hasattr(project, 'definedFields'): + logging.debug("updateAllProjects(%s): has definedFields!"%project.getId()) + delattr(project, 'definedFields') + + return "updated %s projects!" % cnt + + def manage_addMPIWGProjectFolderForm(self): """form for adding a MPIWGProjectFolder""" diff -r 3c98cc79dd14 -r bbad6a092861 MPIWGRoot.py --- a/MPIWGRoot.py Fri Apr 26 19:09:50 2013 +0200 +++ b/MPIWGRoot.py Fri Apr 26 20:31:21 2013 +0200 @@ -273,6 +273,19 @@ items.sort(key=lambda x:int(x.weight)) return items + def getDepartment(self, projectNumber=None): + """returns a Department object""" + dir = getattr(self, 'departments', None) + if dir is None: + return None + + if projectNumber is not None: + for dep in dir.objectValues(spec='MPIWGDepartment'): + if dep.getProjectNumber() == projectNumber: + return dep + + return None + def getProjectFolder(self): """returns the MPIWGProjectFolder""" dir = getattr(self, 'projects', None) @@ -447,18 +460,13 @@ pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','changeMPIWGRootForm')).__of__(self) return pt() - def changeMPIWGRoot(self,title,connection_id,coneServiceURL,harvestPort,harvestServer,lang=None,autocommit=None,RESPONSE=None): + def changeMPIWGRoot(self,title,connection_id,coneServiceURL,lang=None,autocommit=None,RESPONSE=None): """change""" self.title=title self.connection_id=connection_id #self.disciplineList=disciplineList #self.themesList=themesList self.coneServiceURL=coneServiceURL - self.harvestServer=harvestServer - try: - self.harvestPort=int(harvestPort) - except: - logging.error("couldn't change port!: no number:"+harvestPort) if lang is not None: self.lang = lang diff -r 3c98cc79dd14 -r bbad6a092861 zpt/changeMPIWGRootForm.zpt --- a/zpt/changeMPIWGRootForm.zpt Fri Apr 26 19:09:50 2013 +0200 +++ b/zpt/changeMPIWGRootForm.zpt Fri Apr 26 20:31:21 2013 +0200 @@ -19,21 +19,6 @@Cone Service URL:
Harvester ZEO server:
-
-
Harvester ZEO server port:
-
-
+ (Completed: ) +
++ Other involved scholars: Scholars +
++ Cooperation Partners: Partners +
+ +
- (
-
- Other involved scholars: Scholars +
+ Other involved scholars: Scholars
-- Cooperation Partners: Partners +
+ Cooperation Partners: Partners
-