Mercurial > hg > MPIWGWeb
changeset 52:1ed79b33200c
more work on projects and cleanup.
author | casties |
---|---|
date | Tue, 30 Apr 2013 16:00:56 +0200 |
parents | d456fe185649 |
children | 4600e31a0431 |
files | HashTree.py MPIWGProjects.py MPIWGProjects_removed.py MPIWGRoot.py MPIWGRoot_deleted_methods.py zpt/project/edit_related_projects.zpt |
diffstat | 6 files changed, 149 insertions(+), 144 deletions(-) [+] |
line wrap: on
line diff
--- a/HashTree.py Tue Apr 30 12:49:26 2013 +0200 +++ b/HashTree.py Tue Apr 30 16:00:56 2013 +0200 @@ -76,7 +76,7 @@ keyFn = None def __init__(self, keySeparator='.', keyFn=None): - """creates a HashTree. + """Create 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) @@ -87,7 +87,7 @@ def _splitkey(self, key): - """returns a list of key parts""" + """Return a list of key parts""" if isinstance(key, basestring): # its a string - split keys = key.split(self.keySeparator) @@ -106,7 +106,8 @@ def getNode(self, key): - """gets node under key from the tree. + """Return node under key from the tree. + key can be sequence of key string or a single string using keySeparator. If key is None, returns root node. """ @@ -125,7 +126,8 @@ def get(self, key): - """gets value under key from the tree. + """Return value under key from the tree. + key can be sequence of key string or a single string using keySeparator. """ node = self.getNode(key) @@ -136,7 +138,8 @@ def add(self, key, value): - """adds value under key to the tree. + """Add value under key to the tree. + key can be sequence of key string or a single string using keySeparator. """ keys = self._splitkey(key) @@ -153,7 +156,7 @@ def getChildrenOf(self, key): - """returns the list of child (values) of the node under key.""" + """Return the list of child (values) of the node under key.""" node = self.getNode(key) if node.children is None: return [] @@ -165,8 +168,9 @@ def getAncestorsOf(self, key): - """returns the list of ancestor (values) of the node under key. - ordered from root up.""" + """Return the list of ancestor (values) of the node under key. + + Order: root element first.""" keys = self._splitkey(key) node = self.root ancestors = []
--- a/MPIWGProjects.py Tue Apr 30 12:49:26 2013 +0200 +++ b/MPIWGProjects.py Tue Apr 30 16:00:56 2013 +0200 @@ -239,10 +239,9 @@ self.orginallink = link[0:] self.objid = objid[0:] - self.projectWEB_title = object.getContent('WEB_title')[0:] + self.projectWEB_title = object.getProjectTitle() self.enabled = True; - self.ZCacheable_invalidate() if RESPONSE: self.redirect(RESPONSE, "../manageRelatedProjects") @@ -308,6 +307,7 @@ 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()) # management templates loadNewFileForm = PageTemplateFile('zpt/project/manage_newfile', globals()) description_only_html = PageTemplateFile('zpt/project/description_only_html', globals()) @@ -464,15 +464,15 @@ """returns the URL of the project thumbnail image""" thumb = self.projectThumb if thumb is None: - # get thumb from list + # get thumb from list (thumb is last image) imgs = self.getImageList() url = default if len(imgs) > 0: - thumb = imgs[0] + thumb = imgs[-1] self.projectThumb = thumb if thumb is None: - return None + return default return thumb.absolute_url() @@ -530,7 +530,7 @@ items = self.objectValues(spec='MPIWGProject_relatedProject') # sort by place items.sort(key=lambda x:int(getattr(x, 'place', 0))) - return items + return items def getRelatedPublications(self): @@ -616,7 +616,7 @@ return pt() def manageRelatedProjects(self, pubName=None, op=None): - """managage relatedProjectd""" + """manage related projects""" if pubName and op: if op == 'up': relatedProjects = self.getRelatedProjects() @@ -638,7 +638,7 @@ pass - pt = PageTemplateFile('zpt/project/edit_related_projects', globals()).__of__(self) + pt = self.edit_related_projects return pt() @@ -1223,14 +1223,6 @@ return pt() - def getPathStyle(self, path, selected, style=""): - """returns a string with the given style + 'sel' if path == selected.""" - - if path == selected: - return style + 'sel' - else: - return style - def getBreadcrumbs(self): """return list of breadcrumbs from here to the root""" crumbs = [] @@ -1247,28 +1239,19 @@ baseUrl = "/en/research/projects/" # add in the internal project hierarchy - - ct = self.getContexts(parents=self.getContent('xdata_05')) + tree = self.getProjectTree() + ap = tree.getAncestorsOf(self.getNumber()) # start with grandparents - ct.reverse() - for c in ct: - label = shortenString(c[0].getLabel(), 13) - crumbs.append((label, baseUrl + c[0].getId(), c[0])) + for p in ap: + label = shortenString(p.getLabel(), 13) + crumbs.append((label, p.getUrl(baseUrl=baseUrl), p)) # add this project - crumbs.append((self.getLabel(), baseUrl + self.getId(), self)) + crumbs.append((self.getLabel(), self.getUrl(baseUrl=baseUrl), self)) return crumbs - 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] - else: - return self - - + # TODO: is this used? def preview(self, description): """preview""" # logging.debug("preview description=%s"%description) @@ -1464,28 +1447,10 @@ 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""" - + """teste ob es related publications gibt""" ret = True; - if (self.getContent('WEB_related_pub') == ''): + if (self.getRelatedPublications() == ''): ret = False; # nichts im alten feld logging.debug("webrel:" + repr(ret)) if (getattr(self, 'WEB_related_pub_copied', False)): @@ -1503,6 +1468,23 @@ return ret; + def copyPublicationsToList(self, RESPONSE=None): + """copy publications in to list""" + publicationTxt = self.getRelatedPublications() + + 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 hasInlineImage(self): """Return the number of inline images in the description.""" text = self.getDescription() @@ -1820,6 +1802,48 @@ if RESPONSE is not None: RESPONSE.redirect(self.en.MPIWGrootURL()+'/admin/showTree') + + # TODO: it's broken. is this used? + def getAllProjectsAndTagsAsCSV(self,archived=1,RESPONSE=None): + """alle projekte auch die nicht getaggten""" + retList=[] + headers=['projectId','sortingNumber','projectName','scholars','startedAt','completedAt','lastChangeThesaurusAt','lastChangeProjectAt','projectCreatedAt','persons','places','objects'] + headers.extend(list(self.thesaurus.tags.keys())) + retList.append("\t".join(headers)) + if not hasattr(self,'thesaurus'): + return "NON thesaurus (there have to be a MPIWGthesaurus object, with object ID thesaurus)" + + projectTags = self.thesaurus.getProjectsAndTags() + for project in self.getProjectFields('WEB_title_or_short'): + proj = project[0] + p_name = project[1] + retProj=[] + #if (not proj.isArchivedProject() and archived==1) or (proj.isArchivedProject() and archived==2): + retProj.append(self.utf8ify(proj.getId())) + retProj.append(self.utf8ify(proj.getContent('xdata_05'))) + retProj.append(self.utf8ify(p_name)) + retProj.append(self.utf8ify(proj.getContent('xdata_01'))) + retProj.append(self.utf8ify(proj.getStartedAt())) + retProj.append(self.utf8ify(proj.getCompletedAt())) + changeDate=self.thesaurus.lastChangeInThesaurus.get(proj.getId(),'') + n = re.sub("[:\- ]","",str(changeDate)) + retProj.append(n) + retProj.append(self.utf8ify(getattr(proj,'creationTime','20050101000000'))) + retProj.append("")#TODO: project created at + retProj.append(";".join([person[1] for person in self.thesaurus.getPersonsFromProject(proj.getId())])) + retProj.append(";".join([person[1] for person in self.thesaurus.getHistoricalPlacesFromProject(proj.getId())])) + retProj.append(";".join([person[1] for person in self.thesaurus.getObjectsFromProject(proj.getId())])) + retProj+=self.thesaurus.getTags(proj.getId(),projectTags) + retList.append("\t".join(retProj)) + + if RESPONSE: + + RESPONSE.setHeader('Content-Disposition','attachment; filename="ProjectsAndTags.tsv"') + RESPONSE.setHeader('Content-Type', "application/octet-stream") + + return "\n".join(retList); + + security.declareProtected('View management screens', 'updateAllProjectMembers') def updateAllProjectMembers(self, updateResponsibleScientistsList=False):
--- a/MPIWGProjects_removed.py Tue Apr 30 12:49:26 2013 +0200 +++ b/MPIWGProjects_removed.py Tue Apr 30 16:00:56 2013 +0200 @@ -239,3 +239,14 @@ return 1 return 0 + + 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] + else: + return self + + +
--- a/MPIWGRoot.py Tue Apr 30 12:49:26 2013 +0200 +++ b/MPIWGRoot.py Tue Apr 30 16:00:56 2013 +0200 @@ -217,6 +217,13 @@ else: return style + def getPathStyle(self, path, selected, style=""): + """returns a string with the given style + 'sel' if path == selected.""" + if path == selected: + return style + 'sel' + else: + return style + def getFeatures(self, num=None): """returns a list of the last num Features""" dir = getattr(self, 'features', None) @@ -394,84 +401,6 @@ if RESPONSE is not None: RESPONSE.redirect('manage_main') - - def getContexts(self,childs=None,parents=None,depth=None,date=None,onlyActive=True): - """childs alle childs, alle parents""" - ret=[] - - if parents: - pnums=parents.split(".") - while len(pnums) > 1: - pnums.pop() - parentId=string.join(pnums,".") - - for project in self.getProjectFields('xdata_05',sort='int',date=date): - if project[1]==parentId: - ret.append(project) - - if (depth is not None) and (len(ret) >= depth): - break - - if childs: - for project in self.getProjectFields('xdata_05',sort='int',date=date): - searchStr=childs+"(\..*)" - - if (onlyActive and project[0].isActiveProject()) or (not onlyActive): - if re.match(searchStr,project[1]): - - if depth: - - if int(depth)>=len(project[1].split("."))-len(childs.split(".")): - - ret.append(project) - else: - ret.append(project) - - #logging.debug("getContexts: childs=%s parents=%s depth=%s => %s"%(childs,parents,depth,repr(ret))) - - return ret - - - def getAllProjectsAndTagsAsCSV(self,archived=1,RESPONSE=None): - """alle projekte auch die nicht getaggten""" - retList=[] - headers=['projectId','sortingNumber','projectName','scholars','startedAt','completedAt','lastChangeThesaurusAt','lastChangeProjectAt','projectCreatedAt','persons','places','objects'] - headers.extend(list(self.thesaurus.tags.keys())) - retList.append("\t".join(headers)) - if not hasattr(self,'thesaurus'): - return "NON thesaurus (there have to be a MPIWGthesaurus object, with object ID thesaurus)" - - projectTags = self.thesaurus.getProjectsAndTags() - for project in self.getProjectFields('WEB_title_or_short'): - proj = project[0] - p_name = project[1] - retProj=[] - #if (not proj.isArchivedProject() and archived==1) or (proj.isArchivedProject() and archived==2): - retProj.append(self.utf8ify(proj.getId())) - retProj.append(self.utf8ify(proj.getContent('xdata_05'))) - retProj.append(self.utf8ify(p_name)) - retProj.append(self.utf8ify(proj.getContent('xdata_01'))) - retProj.append(self.utf8ify(proj.getStartedAt())) - retProj.append(self.utf8ify(proj.getCompletedAt())) - changeDate=self.thesaurus.lastChangeInThesaurus.get(proj.getId(),'') - n = re.sub("[:\- ]","",str(changeDate)) - retProj.append(n) - retProj.append(self.utf8ify(getattr(proj,'creationTime','20050101000000'))) - retProj.append("")#TODO: project created at - retProj.append(";".join([person[1] for person in self.thesaurus.getPersonsFromProject(proj.getId())])) - retProj.append(";".join([person[1] for person in self.thesaurus.getHistoricalPlacesFromProject(proj.getId())])) - retProj.append(";".join([person[1] for person in self.thesaurus.getObjectsFromProject(proj.getId())])) - retProj+=self.thesaurus.getTags(proj.getId(),projectTags) - retList.append("\t".join(retProj)) - - if RESPONSE: - - RESPONSE.setHeader('Content-Disposition','attachment; filename="ProjectsAndTags.tsv"') - RESPONSE.setHeader('Content-Type', "application/octet-stream") - - return "\n".join(retList); - - def updatePublicationDB(self,personId=None):
--- a/MPIWGRoot_deleted_methods.py Tue Apr 30 12:49:26 2013 +0200 +++ b/MPIWGRoot_deleted_methods.py Tue Apr 30 16:00:56 2013 +0200 @@ -812,4 +812,41 @@ return "" + def getContexts(self,childs=None,parents=None,depth=None,date=None,onlyActive=True): + """childs alle childs, alle parents""" + ret=[] + + if parents: + pnums=parents.split(".") + while len(pnums) > 1: + pnums.pop() + parentId=string.join(pnums,".") + + for project in self.getProjectFields('xdata_05',sort='int',date=date): + if project[1]==parentId: + ret.append(project) + + if (depth is not None) and (len(ret) >= depth): + break + + if childs: + for project in self.getProjectFields('xdata_05',sort='int',date=date): + searchStr=childs+"(\..*)" + + if (onlyActive and project[0].isActiveProject()) or (not onlyActive): + if re.match(searchStr,project[1]): + + if depth: + + if int(depth)>=len(project[1].split("."))-len(childs.split(".")): + + ret.append(project) + else: + ret.append(project) + + #logging.debug("getContexts: childs=%s parents=%s depth=%s => %s"%(childs,parents,depth,repr(ret))) + + return ret + +
--- a/zpt/project/edit_related_projects.zpt Tue Apr 30 12:49:26 2013 +0200 +++ b/zpt/project/edit_related_projects.zpt Tue Apr 30 16:00:56 2013 +0200 @@ -10,14 +10,14 @@ <tal:block tal:repeat="publication here/getRelatedProjects"> <tr> <td> - <a tal:attributes="href python:here.absolute_url()+'/manageRelatedProjects?pubName='+publication[0]+'&op=up'">up</a><br> - <a tal:attributes="href python:here.absolute_url()+'/manageRelatedProjects?pubName='+publication[0]+'&op=down'">down</a> + <a tal:attributes="href python:here.absolute_url()+'/manageRelatedProjects?pubName='+publication.getId()+'&op=up'">up</a><br> + <a tal:attributes="href python:here.absolute_url()+'/manageRelatedProjects?pubName='+publication.getId()+'&op=down'">down</a> </td> - <td tal:content="structure python:getattr(publication[1],'objid','')" /> - <td tal:content="structure python:getattr(publication[1],'projectWEB_title','')" /> + <td tal:content="structure python:getattr(publication,'objid','')" /> + <td tal:content="structure python:getattr(publication,'projectWEB_title','')" /> <td> - <a tal:attributes="href python:publication[1].getId()+'/editRelatedProject'">Edit</a><br/> - <a tal:attributes="href python:'deleteRelatedProject?id='+publication[1].getId()">Delete</a> + <a tal:attributes="href python:publication.getId()+'/editRelatedProject'">Edit</a><br/> + <a tal:attributes="href python:'deleteRelatedProject?id='+publication.getId()">Delete</a> </td> </tr> </tal:block>