# HG changeset patch # User dwinter # Date 1367244144 -7200 # Node ID f59bdd5f489095571fe74f5fa6bcb1177ed5d28b # Parent 225179dfd89229af3d46750bc1babd0ada266532# Parent 5c6ad316e1ceef48e323907ab81dd50e7ef743b2 Merge with 5c6ad316e1ceef48e323907ab81dd50e7ef743b2 diff -r 225179dfd892 -r f59bdd5f4890 HashTree.py --- a/HashTree.py Mon Apr 29 16:01:24 2013 +0200 +++ b/HashTree.py Mon Apr 29 16:02:24 2013 +0200 @@ -44,10 +44,7 @@ else: sub = [self.value] - keys = self.children.keys() - keys.sort() - for k in keys: - #logging.debug("getSubtreeList: k=%s sub=%s"%(k,sub)) + for k in sorted(self.children.keys()): sub.extend(self.children.get(k).getSubtreeAsList()) return sub @@ -59,29 +56,55 @@ return "(%s:%s)"%(self.key, self.value) else: sub = "(%s:%s):["%(self.key, self.value) - keys = self.children.keys() - keys.sort() - for k in keys: + for k in sorted(self.children.keys()): sub += self.children.get(k).getSubtreeAsText() sub += ", " return sub + "] " + + class HashTree: """Tree using dictionaries""" + # root HashTreeNode root = None + # separator by which key strings are split into parts keySeparator = '.' + # function applied to key parts keyFn = None def __init__(self, keySeparator='.', keyFn=None): - """creates a HashTree""" + """creates a HashTree. + + @param keySeparator string by which key strings are split into parts + @param keyFn function applied to key parts (e.g. int if key parts are numbers) + """ self.root = HashTreeNode() self.keySeparator = keySeparator 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 +113,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 +139,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 +150,34 @@ 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: + # sort children by key + childlist = sorted(node.children.items(), key=lambda x:x[0]) + # and return the values + return [n.value for (k, n) in childlist 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 225179dfd892 -r f59bdd5f4890 MPIWGDepartment.py --- a/MPIWGDepartment.py Mon Apr 29 16:01:24 2013 +0200 +++ b/MPIWGDepartment.py Mon Apr 29 16:02:24 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 225179dfd892 -r f59bdd5f4890 MPIWGProjects.py --- a/MPIWGProjects.py Mon Apr 29 16:01:24 2013 +0200 +++ b/MPIWGProjects.py Mon Apr 29 16:02:24 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: @@ -824,10 +816,86 @@ def getImageList(self): """returns the sorted list of images for this project""" - items = self.objectValues(spec='MPIWGProject_image')[:] + items = self.objectValues(spec='MPIWGProject_image') + # sort by place + return sorted(items, key=lambda x:int(getattr(x, 'place', 0))) + + + 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): @@ -864,6 +932,10 @@ self.manage_delObjects([id]) except: logging.error("ERROR MPIWG: %s %s" % sys.exc_info()[0:2]) + + # invalidate thumbnail + self.projectThumb = None + if RESPONSE: self.redirect(RESPONSE, 'manageImages') @@ -871,7 +943,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) @@ -899,6 +970,9 @@ obj.place = self.getLastImageNumber() + 1 obj.id = filename + # invalidate thumbnail + self.projectThumb = None + if RESPONSE is not None: self.redirect(RESPONSE, 'manageImages') @@ -921,7 +995,7 @@ return cmp(x[1].archiveTime, y[1].archiveTime) if not date: - if self.isActual(): + if self.isCurrentVersion(): return self else: return None @@ -954,16 +1028,12 @@ return None - def isActual(self): - """gibt 1 zurueck wenn aktuell, 0 sonst""" - actualTime = time.localtime() - + def isCurrentVersion(self): + """Return if project is the current version.""" + currentTime = time.localtime() + # print getattr(self,'archiveTime',currentTime) + return (getattr(self, 'archiveTime', currentTime) >= currentTime) - # print getattr(self,'archiveTime',actualTime) - if getattr(self, 'archiveTime', actualTime) < actualTime: - return 0 - else: - return 1 def copyObjectToArchive(self): """kopiere aktuelles objekt ins archiv""" @@ -1005,43 +1075,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 +1137,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.""" @@ -1227,7 +1253,7 @@ if not context: context = self - if self.isActiveProject() and self.isActual(): + if self.isActiveProject() and self.isCurrentVersion(): templates = self.en.getHarvestCache() ext = getattr(self, "harvest_main", None) @@ -1337,7 +1363,6 @@ def getDefinedFields(self): """show all defined fields""" - return definedFields def getAttribute(self, field): @@ -1496,7 +1521,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 +1562,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] @@ -1723,7 +1747,7 @@ checkedScientists = {} names = {} keys = {} - for key in formdata.keys(): + for key in formdata: # gehe durch das Formular keyParts = key.split("_") if keyParts[0] == "responsibleScientist": @@ -1734,20 +1758,22 @@ elif keyParts[1] == "key": keys[nr] = formdata[key] - for nr in names.keys(): + for nr in names: name = names[nr] key = keys.get(nr, None) username = None if key: # 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) + member = self.getMPIWGRoot().getStaffFolder().getMember(key=key) + if member is not None: + username = member.getUsername() # schreibe keys und namen in die Liste checkedScientists[names[nr]] = {'name' : name, 'key' : key, 'username' : username} + # update responsibleScientistsList self.setResponsibleScientistsList(checkedScientists) + self.updateProjectMembers() if fromEdit and (RESPONSE is not None): return self.editBasic() @@ -1841,7 +1867,7 @@ # create responsibleScientistsList automatically newScientists = {} names = p.identifyNames(p.getResponsibleScientists()) - for name in names.keys(): + for name in names: logging.debug("updateAllProjectMembers: name=%s" % repr(name)) members = names[name] if len(members) > 0: @@ -1861,33 +1887,10 @@ 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: - memberKey = m.get('key') + 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 @@ -1934,12 +1937,12 @@ def getProjectTree(self): - """returns the project hierarchy tree (and caches it). + """Return the project hierarchy tree (and cache it). - returns HashTree instance.""" + Returns HashTree instance.""" tree = self._v_projectTree if tree is None: - tree = HashTree(keySeparator='.', keyFn=lambda x:getInt(x)) + tree = HashTree(keySeparator='.', keyFn=getInt) for p in self.objectValues(spec='MPIWGProject'): tree.add(p.getNumber(), p) @@ -1950,7 +1953,7 @@ def getProjectsAsList(self, start, active=1, archived=1): - """returns flattened list of projects, starting from start. + """Return flattened list of projects, starting from start. active = 0 : all projects active = 1 : active projects @@ -1970,9 +1973,18 @@ # return filtered list return [p for p in pl if (p.checkActive(active) and p.checkArchived(archived))] + + def getProject(self, projectNumber=None): + """Return 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. + """Return a list of all projects of a member. @param key: member's key active = 0 : all projects @@ -1989,15 +2001,17 @@ # find projects in tree for r in res: p = tree.get(r.project_number) + # check if active if p is not None and p.checkActive(active) and p.checkArchived(archived): projects.append(p) + projects.sort(key=lambda p:[int(n) for n in p.getNumber().split('.')]) return projects security.declareProtected('View management screens', 'updateAllProjectMembers') def updateAllProjectMembers(self, updateResponsibleScientistsList=False): - """re-creates responsibleScientistsLists and projects_members table from all current projects""" + """Re-create responsibleScientistsLists and projects_members table from all current projects.""" # empty table self.executeZSQL('truncate table projects_members') cnt = 0 @@ -2010,6 +2024,66 @@ return "updated %s projects!" % cnt + + security.declareProtected('View management screens', 'updateAllProjects') + def updateAllProjects(self, updateResponsibleScientistsList=False): + """Patch all current projects for legacy problems.""" + cnt = 0 + # go through all projects + for (id, project) in self.ZopeFind(self, obj_metatypes=['MPIWGProject'], search_sub=1): + 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" % 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) + + # + # remove old attributes + # + if hasattr(project, 'definedFields'): + logging.debug("updateAllProjects(%s): has definedFields!"%project.getId()) + delattr(project, 'definedFields') + + # + # update extended bibliography + # + if hasattr(project, 'publicationList'): + logging.debug("updateAllProjects(%s): has publicationList!"%project.getId()) + extpub = project.publicationList + if hasattr(extpub, 'connection_id'): + logging.debug("updateAllProjects(%s): extended publication %s has connection_id=%s!"%(project.getId(),extpub.getId(),extpub.connection_id)) + + + return "updated %s projects!" % cnt + + def manage_addMPIWGProjectFolderForm(self): """form for adding a MPIWGProjectFolder""" diff -r 225179dfd892 -r f59bdd5f4890 MPIWGRoot.py --- a/MPIWGRoot.py Mon Apr 29 16:01:24 2013 +0200 +++ b/MPIWGRoot.py Mon Apr 29 16:02:24 2013 +0200 @@ -273,28 +273,48 @@ 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) return dir + + def getStaffFolder(self): + """returns the MPIWGStaffFolder""" + dir = getattr(self, 'members_test', None) # TODO: fix the test + return dir + + def getMPIWGRoot(self): """returns the MPIWG root""" return self + def MPIWGrootURL(self): """returns the URL to the root""" return self.absolute_url() - - #WTF? - def patchProjects(self,RESPONSE): - """patch""" - projects=self.ZopeFind(self.projects,obj_metatypes=['MPIWGProject']) - for project in projects: - tmp=project[1].WEB_project_description[0].replace("/CD/projects/","")[0:] - setattr(project[1],'WEB_project_description',[tmp[0:]]) - RESPONSE.write("%s
\n"%project[0]) - + + + # TODO: make obsolete + def decode(self, s): + """unicodify""" + return unicodify(s) + + # TODO: remove def replaceNotEmpty(self,format,field): """replace not empty""" if field and (not field.lstrip()==''): @@ -304,6 +324,7 @@ return "" + # TODO: remove def isActiveMember(self,key): """tested ob Mitarbeiter key ist aktiv""" key=utf8ify(key) @@ -312,12 +333,13 @@ _op_publish_the_data='eq', publish_the_data='yes'), 0) - logging.info("ACTIVE_MEMBER %s"%ret) + logging.info("MPIWGROOT ACTIVE_MEMBER %s"%ret) if ret: return True else: return False + # TODO: remove def isActual(self,project): """checke if project is actual""" actualTime=time.localtime() @@ -447,18 +469,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 225179dfd892 -r f59bdd5f4890 MPIWGStaff.py --- a/MPIWGStaff.py Mon Apr 29 16:01:24 2013 +0200 +++ b/MPIWGStaff.py Mon Apr 29 16:02:24 2013 +0200 @@ -1093,13 +1093,20 @@ member = MPIWGStaffMember(self, dbresult=content) elif key is not None: - content = folder.executeZSQL("select * from personal_www where key = %s", [key]) + # TODO: sometimes key is lowercased (e.g. responsibleScientistsList), we should fix the data + content = self.executeZSQL("select * from personal_www where lower(key) = %s", [key.lower()]) if len(content) > 0: member = MPIWGStaffMember(self, dbresult=content) return member + def isActiveMember(self, key): + """returns if member key is active""" + res = self.executeZSQL("select * from personal_www where lower(key) = %s and publish_the_data = 'yes'", [key.lower()]) + return len(res) > 0 + + def sortPriority(self,list): def sort(x,y): try: @@ -1578,7 +1585,7 @@ REQUEST.response.redirect(self.REQUEST['HTTP_REFERER']) - def invalidate_chache(self): + def invalidate_cache(self): #TODO: How to invalidate the varnish cache from the member object pass; diff -r 225179dfd892 -r f59bdd5f4890 zpt/changeMPIWGRootForm.zpt --- a/zpt/changeMPIWGRootForm.zpt Mon Apr 29 16:01:24 2013 +0200 +++ b/zpt/changeMPIWGRootForm.zpt Mon Apr 29 16:02:24 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
-