# HG changeset patch # User dwinter # Date 1367573974 -7200 # Node ID c86ee1081b6265a8dd1c8e501dbf18f613f13b0d # Parent 2ad8aa9d306c2ad38b7752821a70036b4137b193# Parent fd6931bd49c869ea7b2fd377b18d3410185f066c Merge with fd6931bd49c869ea7b2fd377b18d3410185f066c diff -r 2ad8aa9d306c -r c86ee1081b62 MPIWGProjects.py --- a/MPIWGProjects.py Thu May 02 15:40:27 2013 +0200 +++ b/MPIWGProjects.py Fri May 03 11:39:34 2013 +0200 @@ -92,6 +92,89 @@ """publications object fuer project""" meta_type = "MPIWGProject_publication" + + text = None + link = None + bookId = None + + editDescription = PageTemplateFile('zpt/project/related_publication/edit_basic', globals()) + + + def redirect(self, RESPONSE, url): + """mache ein redirect mit einem angehaengten time stamp um ein reload zu erzwingen""" + timeStamp = time.time() + + if url.find("?") > -1: # giebt es schon parameter + addStr = "&time=%s" + else: + addStr = "?time=%s" + + RESPONSE.setHeader('Last-Modified', email.Utils.formatdate().split("-")[0] + 'GMT') + logging.debug(email.Utils.formatdate() + ' GMT') + RESPONSE.redirect(url + addStr % timeStamp) + + + def hasLinkToBookPage(self): + """teste ob eingebener link zu einer MPIWG Book page geht""" + logging.debug("MPIWGProject_publication - begin hasLinkToBookPage") + if not self.link: + return False # es gibt keinen link + + paths = self.link.split('/') + if len(paths) > 2: + # book page should be in folder books + bookid = None + try: + idx = paths.index('books') + bookid = paths[idx + 1] + book = self.en.books[bookid] + self.bookId = bookid + return True + + except: + logging.debug("hasLinkToBookPage: not a book page link=%s"%self.link) + + self.bookId = None + return False + + + def getBookId(self): + """Return the book page id.""" + return self.bookId + + + def editPublication(self, text=None, description=None, link=None, RESPONSE=None): + """edit a publication""" + + if (not text) and (not description): + pt = self.editDescription + return pt() + + if text: + self.text = text + + if description: + self.description = description + + if link: + self.link = link + self.hasLinkToBookPage() + + if RESPONSE: + self.redirect(RESPONSE, "../managePublications") + + +class MPIWGProject_relatedProject(Folder): + """publications object fuer project""" + + meta_type = "MPIWGProject_relatedProject" + + objid = None + projectLabel = None + + editDescription = PageTemplateFile('zpt/project/related_project/edit_basic', globals()) + + def redirect(self, RESPONSE, url): """mache ein redirect mit einem angehaengten time stamp um ein reload zu erzwingen""" @@ -106,121 +189,40 @@ logging.debug(email.Utils.formatdate() + ' GMT') RESPONSE.redirect(url + addStr % timeStamp) - def hasLinkToBookPage(self, mode="not_cached"): - """teste ob eingebener link zu einer MPIWG Book page geht""" - - - logging.debug("MPIWGProject_publication - begin hasLinkToBookPage") - if (getattr(self, 'link', '') == ''): - return False # es gibt keinen link - - logging.debug("MPIWGProject_publication - begin hasLinkToBookPage:" + self.link) - server = xmlrpclib.ServerProxy(self.link) - - if(mode == "cached"): - if (hasattr(self, "_v_hasLinkToBookPage")): - logging.debug("haslink cached") - return self._v_hasLinkToBookPage - - try: - server.getImageUrls() - logging.debug("MPIWGProject_publication - end TRUE") - self._v_hasLinkToBookPage = True - return True - except: - logging.debug("MPIWGProject_publication - end FALSE ") - self._v_hasLinkToBookPage = True - return False - - def getImageUrls(self, mode="not_cached"): - """get the image urls""" - - if (getattr(self, 'link', '') == ''): - return [] # es gibt keinen link - - server = xmlrpclib.ServerProxy(self.link) - - - if(mode == "cached"): - if (hasattr(self, "_v_imageUrls")): - logging.debug("getImageURL cached") - return self._v_imageUrls - - try: - urls = server.getImageUrls() - ret = [] - for url in urls: - url = os.path.join(self.link, url) - ret.append(url) - - except: - self._v_imageUrls = [] - 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""" - - if (not text) and (not description): - pt = PageTemplateFile(os.path.join(package_home(globals()), 'zpt', 'edit_publicationForm.zpt')).__of__(self) - return pt() - - - if text: - self.text = text[0:] - - if description: - self.description = description - - if link: - self.link = link[0:] - - if image1: - if hasattr(self, 'publicationImage1'): - self.publicationImage1.manage_upload(image1) - else: - nO = Image('publicationImage1', '', image1) - self._setObject('publicationImage1', nO) - - if image2: - if hasattr(self, 'publicationImage2'): - self.publicationImage2.manage_upload(image2) - else: - nO = Image('publicationImage2', '', image2) - self._setObject('publicationImage2', nO) - - self.ZCacheable_invalidate() - if RESPONSE: - self.redirect(RESPONSE, "../managePublications") + def getProjectId(self): + """Return the related project id.""" + return self.objid -class MPIWGProject_relatedProject(Folder): - """publications object fuer project""" + def getProject(self): + """Return the related project object.""" + return getattr(self.projects, self.objid, None) + + + def getProjectTitle(self): + """Return the title of the related project.""" + return getattr(self, 'projectWEB_title', None) - meta_type = "MPIWGProject_relatedProject" - def redirect(self, RESPONSE, url): - """mache ein redirect mit einem angehaengten time stamp um ein reload zu erzwingen""" - - timeStamp = time.time() - - if url.find("?") > -1: # giebt es schon parameter - addStr = "&time=%s" - else: - addStr = "?time=%s" + + def getProjectLabel(self): + """Return the label of the related project.""" + label = getattr(self, 'projectLabel', None) + if not label: + proj = self.getProject() + if proj is not None: + label = proj.getLabel() + + self.projectLabel = label - RESPONSE.setHeader('Last-Modified', email.Utils.formatdate().split("-")[0] + 'GMT') - logging.debug(email.Utils.formatdate() + ' GMT') - RESPONSE.redirect(url + addStr % timeStamp) + return label def editRelatedProject(self, link=None, RESPONSE=None): """edit a publication""" if (not link): - pt = PageTemplateFile(os.path.join(package_home(globals()), 'zpt', 'edit_relatedProjectForm.zpt')).__of__(self) + pt = self.editDescription return pt() # hole die id des projektes @@ -233,13 +235,14 @@ objid = splitted[-1] object = getattr(self.projects, objid, None) - if object == None: + if object is None: self.redirect(RESPONSE, 'errorRelatedProjects?link=' + link) self.orginallink = link[0:] self.objid = objid[0:] self.projectWEB_title = object.getProjectTitle() + self.projectLabel = object.getLabel() self.enabled = True; @@ -254,7 +257,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() @@ -282,7 +285,7 @@ manage_options = Folder.manage_options + ( {'label':'Load New File', 'action':'loadNewFileForm'}, - {'label':'Edit', 'action':'editForm'}, + {'label':'Edit', 'action':'editDescription'}, ) # {'label':'Edit ProjectInfo','action':'editMPIWGProjectForm'}, # {'label':'Edit BasisInfo','action':'editMPIWGBasisForm'}, @@ -304,13 +307,24 @@ 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()) + # user-accessible editing templates + security.declareProtected('View management screens', 'editBasic') + editBasic = PageTemplateFile('zpt/project/edit_basic', globals()) + editDescription = 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()) + editRelatedProjectsError = PageTemplateFile('zpt/project/edit_related_projects_error', globals()) + editImagesForm = PageTemplateFile('zpt/project/edit_images', globals()) + editPublicationsForm = PageTemplateFile('zpt/project/edit_publications', globals()) + editAdditionalPublicationsForm = PageTemplateFile('zpt/project/pubman/change_publications', globals()) + editAddAdditionalPublications = PageTemplateFile('zpt/project/pubman/add_publications', globals()) + security.declareProtected('View management screens', 'edit') + edit = editDescription # management templates loadNewFileForm = PageTemplateFile('zpt/project/manage_newfile', globals()) description_only_html = PageTemplateFile('zpt/project/description_only_html', globals()) + # additional pages + additionalPublications = PageTemplateFile('zpt/project/pubman/show_publications', globals()) # TODO: this should go away extendedBibliography = PageTemplateFile('zpt/project/extendedBibliography_template', globals()) @@ -360,6 +374,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) @@ -451,6 +480,11 @@ else: return t + + def getMPIWGProjectUrl(self): + """Return this project for acquisition.""" + return self.absolute_url() + def getUrl(self, baseUrl=None): """returns URL to this Project""" @@ -477,13 +511,6 @@ return thumb.absolute_url() - def getImageList(self): - """returns the sorted list of images for this project""" - 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() @@ -525,22 +552,6 @@ 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) @@ -561,101 +572,106 @@ 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 + 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 getImageList(self): + """returns the sorted list of images for this project""" + items = self.objectValues(spec='MPIWGProject_image') + # sort by place + return sorted(items, key=lambda x:int(getattr(x, 'place', 0))) + + + def addImage(self, fileHd, caption, RESPONSE=None, filename=None): + """add an MPIWG_Project_image""" + + if not filename: + filename = fileHd.filename + + if not fileHd: + fileHd = file(os.path.join(package_home(globals()), 'blank.gif')) + + newImage = MPIWGProject_image(filename, filename, fileHd) + + self._setObject(filename, newImage) + obj = getattr(self, filename) + obj.caption = caption[:] + obj.enabled = True; + obj.place = self._getLastImageNumber() + 1 + obj.id = filename # invalidate thumbnail self.projectThumb = None - pt = PageTemplateFile('zpt/project/edit_images', globals()).__of__(self) - return pt() + + if RESPONSE is not None: + self.redirect(RESPONSE, 'manageImages') + - 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 _getLastImageNumber(self): + items = self.getImageList() + if not items: + return 0 + else: + return getattr(items[-1], 'place', 0) + + + def manageImages(self, name=None, op=None): + """manage images""" + self._moveObjectPlace(self.getImageList(), name, op) + + # invalidate thumbnail + self.projectThumb = None + + pt = self.editImagesForm + return pt() - pt = PageTemplateFile('zpt/project/edit_publications', globals()).__of__(self) - return pt() + def deleteImage(self, id, RESPONSE=None): + """delete Image id""" + try: + 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') + + + def getPublicationList(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 manageRelatedProjects(self, pubName=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 - - - pt = self.edit_related_projects - 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""" - number = self.getLastPublicationNumber() + 1 + number = self._getLastPublicationNumber() + 1 name = "publication_" + str(number) while hasattr(self, name): number += 1 @@ -667,25 +683,50 @@ obj = getattr(self, name) obj.text = text[0:] obj.enabled = True; - obj.place = self.getLastPublicationNumber() + 1 + 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 _getLastPublicationNumber(self): + items = self.getPublicationList() + if not items: + return 0 + else: + return getattr(items[-1], 'place', 0) + + + def managePublications(self, name=None, op=None): + """manage publications""" + self._moveObjectPlace(self.getPublicationList(), name, op) + + pt = self.editPublicationsForm + return pt() + + + def deletePublication(self, id, RESPONSE=None): + """delete Publication id""" + self.manage_delObjects([id]) + if RESPONSE: + self.redirect(RESPONSE, 'managePublications') + + + def getRelatedProjectList(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 addRelatedProject(self, link, RESPONSE=None): - """add an MPIWG_Publication""" - number = self.getLastPublicationNumber() + 1 - name = "RelatedProject" + str(number) + """add a MPIWGProject_relatedProject""" + number = self._getLastRelatedProjectNumber() + 1 + name = "related_project_" + str(number) while hasattr(self, name): number += 1 - name = "RelatedProject_" + str(number) + name = "related_project_" + str(number) # hole die id des projektes splitted = link.split("/") @@ -708,118 +749,125 @@ 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 + 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: + def _getLastRelatedProjectNumber(self): + items = self.getRelatedProjectList() + if not items: return 0 else: - return getattr(publications[-1][1], 'place', 0) + return getattr(items[-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 manageRelatedProjects(self, name=None, op=None): + """manage related projects""" + self._moveObjectPlace(self.getRelatedProjectList(), name, op) + + pt = self.editRelatedProjectsForm + return pt() + + def deleteRelatedProject(self, id, RESPONSE=None): - """delete Publication id""" - self.manage_delObjects([id]) - self.ZCacheable_invalidate() - if RESPONSE: - self.redirect(RESPONSE, 'manageRelatedProjects') + """delete Publication id""" + self.manage_delObjects([id]) + if RESPONSE: + self.redirect(RESPONSE, 'manageRelatedProjects') + + + def errorRelatedProjects(self, link): + """error creating a related project""" + pt = self.editRelatedProjectsError + return pt(link=link) + - def getImages(self): - """get all Images""" + def getAdditionalPublicationList(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 sort_images(x, y): - return cmp(getattr(x[1], 'place', 0), getattr(y[1], 'place', 0)) + + def hasAdditionalPublications(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 - 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 = '' + def addAdditionalPublicationsFromPubman(self,REQUEST): + """addPublications from pubman""" + data=REQUEST.form + if data.get("method",None) is None: + pt = self.editAddAdditionalPublications + return pt() + + if data.get("method") == "search": + entries= self.mpiwgPubman.search(data) + pt = self.editAddAdditionalPublications + return pt(values=entries) + + if data.get("method") == "add": + return self.addEntriesToAdditionalPublicationList(data) + #pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt/staff/pubman','add_publications.zpt')).__of__(self) - images = self.ZopeFind(self, obj_metatypes=['MPIWGProject_image']) - - images.sort(sort_images) - return images - - def getLastImageNumber(self): - images = self.getImages() + + def addEntriesToAdditionalPublicationList(self,data): + """fuege eintrage aus data zur publications liste. - if not images: - return 0 - else: - return getattr(images[-1][1], 'place', 0) + @param data Map mit escidocID --> value + value muss "add" sein damit hinzugefuegt wird""" + for key in data.keys(): + if key.startswith('escidoc:'): + query="INSERT INTO pubmanbiblio_projects (key_main,escidocId) values (%s,%s)" + if data.get(key)=="add": + self.executeZSQL(query,[self.getId(),key]) - def deleteImage(self, id, RESPONSE=None): - """delete Image id""" - try: - self.manage_delObjects([id]) - except: - logging.error("ERROR MPIWG: %s %s" % sys.exc_info()[0:2]) + if hasattr(self,'REQUEST'): + return self.REQUEST.response.redirect("changeAdditionalPublications") + + + def changeAdditionalPublications(self,REQUEST): + """change published publications""" + data=REQUEST.form + if data.get("method","change"): + for key in data.keys(): + splitted=key.split("__") #format escidoc_id__p fuer priority, nur escidocid + value=data[key] + if len(splitted)==1: + self.deleteFromAdditionalPublicationList(key); - # invalidate thumbnail - self.projectThumb = None - - if RESPONSE: - self.redirect(RESPONSE, 'manageImages') + elif(splitted[1]) == "p": + self.setAdditionalPublicationPriority(splitted[0],value); + + pt = self.editAdditionalPublicationsForm + return pt() + + def deleteFromAdditionalPublicationList(self,escidocid): + """Loessche publication with escidoc id from publication list""" + query ="DELETE FROM pubmanbiblio_projects WHERE escidocid=%s and key_main=%s" + self.executeZSQL(query,[escidocid,self.getId()]); - def addImage(self, fileHd, caption, RESPONSE=None, filename=None): - """add an MPIWG_Project_image""" - - if not filename: - filename = fileHd.filename - - if not fileHd: - fileHd = file(os.path.join(package_home(globals()), 'blank.gif')) - - newImage = MPIWGProject_image(filename, filename, fileHd) - - self._setObject(filename, newImage) - obj = getattr(self, filename) - obj.caption = caption[0:] - obj.enabled = True; - obj.place = self.getLastImageNumber() + 1 - obj.id = filename - - # invalidate thumbnail - self.projectThumb = None + def setAdditionalPublicationPriority(self,escidocid,value): + query="update pubmanbiblio_projects set priority=%s where escidocid=%s and key_main=%s" + try: + value = int(value) + self.executeZSQL(query,[value,escidocid,self.getId()]); + except: + logging.error("couldn't change:") + logging.error(escidocid) + logging.error(value) - if RESPONSE is not None: - self.redirect(RESPONSE, 'manageImages') - - - def getEditableFields(self): - """giveListofDatafields""" - return editableFields - def getActualVersion(self, date=None): """actuelle version""" @@ -885,18 +933,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 +958,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 +970,7 @@ return False; return True + def checkArchived(self, archived): """returns if the project state matches the archived state. @@ -926,10 +980,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 +1097,6 @@ else: return self.REQUEST['URL1'] + "/no_project" - else: finds.sort(sortProjectsByTime) @@ -1053,120 +1108,17 @@ # 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("""
""") - if len(splitted) > 1: - tmp = splitted[1].split("
") - # 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 = "".join(tmp[1:]) - - text3 = splitted[0] + split2 - - splitted = text3.split("""""") - if len(splitted) > 1: - tmp = splitted[1].split("
") - 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] == '') and (field == 'WEB_project_description'): - text5 = "
" + text5 + "
" - - - # filter image - - text5 = text5.lstrip().rstrip() # loescher leerzeichen und einzelndes br - if (text5 == "") @@ -1459,7 +1395,6 @@ setattr(self, "WEB_related_pub_copied", True); if RESPONSE: - self.redirect(RESPONSE, 'managePublications') @@ -1563,165 +1498,23 @@ 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): - """addPublications from pubman""" - - data=REQUEST.form - - if data.get("method",None) is None: - pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt/project/pubman','add_publications.zpt')).__of__(self) - return pt() - - - - if data.get("method") == "search": - entries= self.mpiwgPubman.search(data) - pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt/project/pubman','add_publications.zpt')).__of__(self) - - - return pt(values=entries) - - - - if data.get("method") == "add": - - return self.addEntriesToPublicationList(data) - #pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt/staff/pubman','add_publications.zpt')).__of__(self) - - def addEntriesToPublicationList(self,data): - """fuege eintrage aus data zur publications liste, - @param data Map mit escidocID --> value - value muss "add" sein damit hinzugefuegt wird""" - - for key in data.keys(): - - if key.startswith('escidoc:'): - - query="INSERT INTO pubmanbiblio_projects (key_main,escidocId) values (%s,%s)" - - if data.get(key)=="add": - self.executeZSQL(query,[self.getId(),key]) - - - #selectedPublications = self.getSelectedPublications() - - #pt = PageTemplateFile(os.path.join(package_home(globals()),'zpt/project/pubman','change_publications.zpt')).__of__(self) - - #return pt() - - if hasattr(self,'REQUEST'): - return self.REQUEST.response.redirect("changePublications") - - def changePublications(self,REQUEST): - """change published publications""" - - data=REQUEST.form - - - if data.get("method","change"): - for key in data.keys(): - splitted=key.split("__") #format escidoc_id__p fuer priority, nur escidocid - value=data[key] - if len(splitted)==1: - self.deleteFromPublicationList(key); - - elif(splitted[1]) == "p": - self.setPublicationPriority(splitted[0],value); - - - pt = PageTemplateFile(os.path.join(package_home(globals()),'zpt/project/pubman','change_publications.zpt')).__of__(self) - return pt() - - def deleteFromPublicationList(self,escidocid): - """Loessche publication with escidoc id from publication list""" - - query ="DELETE FROM pubmanbiblio_projects WHERE escidocid=%s and key_main=%s" - - self.executeZSQL(query,[escidocid,self.getId()]); - - def setPublicationPriority(self,escidocid,value): - - query="update pubmanbiblio_projects set priority=%s where escidocid=%s and key_main=%s" - - try: - - value = int(value) - self.executeZSQL(query,[value,escidocid,self.getId()]); - - - except: - logging.error("couldn't change:") - 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): @@ -1746,7 +1539,6 @@ newObj = MPIWGProject(id) self._setObject(id, newObj) - if RESPONSE is not None: RESPONSE.redirect('manage_main') @@ -1760,9 +1552,6 @@ # cached HashTree with project hierarchy _v_projectTree = None - - - def getProjectTree(self): """Return the project hierarchy tree (and cache it). @@ -1908,7 +1697,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 +1737,6 @@ return "\n".join(retList); - security.declareProtected('View management screens', 'updateAllProjectMembers') def updateAllProjectMembers(self, updateResponsibleScientistsList=False): @@ -1984,30 +1772,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 @@ -2029,17 +1833,25 @@ log += "%s: has definedFields!\n"%project.getId() logging.debug("updateAllProjects(%s): has definedFields!"%project.getId()) delattr(project, 'definedFields') - + # - # update extended bibliography + # update related publications # - if hasattr(project, 'publicationList'): - log += "%s: has publicationList!\n"%project.getId() - 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)) - + for pub in project.getPublicationList(): + if not pub.text: + msg = "%s: publication has no text: %s!\n"%(project.getId(), pub) + log += msg + logging.warn(msg) + if not pub.link: + msg = "%s: publication has no link either! Deleting: %s!\n"%(project.getId(), pub) + log += msg + logging.error(msg) + project.deletePublication(pub.getId()) + + else: + # hasLinkToBookPage updates the bookId + pub.hasLinkToBookPage() + # # unicodify # @@ -2054,8 +1866,7 @@ fulllog += log if RESPONSE is not None: RESPONSE.write(log) - - + log += "\n DONE! updated %s projects!" % cnt fulllog += log if RESPONSE is not None: @@ -2064,9 +1875,6 @@ else: return fulllog - - - def manage_addMPIWGProjectFolderForm(self): """form for adding a MPIWGProjectFolder""" diff -r 2ad8aa9d306c -r c86ee1081b62 MPIWGProjects_removed.py --- a/MPIWGProjects_removed.py Thu May 02 15:40:27 2013 +0200 +++ b/MPIWGProjects_removed.py Fri May 03 11:39:34 2013 +0200 @@ -249,4 +249,125 @@ return self + 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("""
""") + if len(splitted) > 1: + tmp = splitted[1].split("
") + # 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 = "".join(tmp[1:]) + + text3 = splitted[0] + split2 + + splitted = text3.split("""""") + if len(splitted) > 1: + tmp = splitted[1].split("
") + 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] == '') and (field == 'WEB_project_description'): + text5 = "
" + text5 + "
" + + + # filter image + + text5 = text5.lstrip().rstrip() # loescher leerzeichen und einzelndes br + if (text5 == "Project id: | -- |
WEB title: | -- |
Project Title | -+ | |
+ | |
@@ -46,19 +46,18 @@
value python:here.getCompletedAt()"
type="text" len="15" /> (format dd.mm.yyyy or mm.yyyy or yyyy)
-
Name in project | MPIWG member object | |||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Add an Image- - - -(if the marginal image from your current project description is not in this list, click here.) -
+ up |
+ + down +
+ |
+ + +
+ | Edit |
+ Delete + The image for the project description should have a width of 220px. + +
+ The last image in the list is used as the project thumbnail image (140x87px): Add an Image+ + + ++ (if the marginal image from your current project description is not in this list, click here.) + + |