# HG changeset patch
# User dwinter
# Date 1367332552 -7200
# Node ID 4600e31a04311021ddfad6ee71e109cedb4868dc
# Parent e718d9a72f19ea783a080e9f44530238a0ca7b9a# Parent 1ed79b33200c4c4879e3dc314744451eef083902
Merge with 1ed79b33200c4c4879e3dc314744451eef083902
diff -r e718d9a72f19 -r 4600e31a0431 HashTree.py
--- a/HashTree.py Tue Apr 30 16:31:57 2013 +0200
+++ b/HashTree.py Tue Apr 30 16:35:52 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 = []
diff -r e718d9a72f19 -r 4600e31a0431 MPIWGProjects.py
--- a/MPIWGProjects.py Tue Apr 30 16:31:57 2013 +0200
+++ b/MPIWGProjects.py Tue Apr 30 16:35:52 2013 +0200
@@ -27,7 +27,9 @@
import logging
import time
-from SrvTxtUtils import getInt, unicodify, utf8ify, refreshingImageFileIndexHtml
+import xml.etree.ElementTree as ET
+
+from SrvTxtUtils import getInt, unicodify, utf8ify, serialize, refreshingImageFileIndexHtml
from Products.MPIWGBibliography.BibliographyManager import BibliographyManager
from bibliography import *
from Products.ZDBInterface.ZDBInterfaceFolder import ZDBInterfaceFolder
@@ -72,8 +74,7 @@
definedFields = fieldLabels.keys() # TODO: should this be sorted?
-checkFields = ['xdata_01']
-
+editableFields = ('xdata_01', 'xdata_05', 'xdata_07', 'xdata_08', 'xdata_11', 'xdata_12', 'xdata_13')
# die folgenden Klassen sind jetzt in einzelne Files ausgelagert aus Kompatibilitaetsgruenden, bleiben die Klassen hier noch drin.
# Sonst funktionieren die alten Webseiten nicht mehr.
@@ -238,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")
@@ -299,16 +299,21 @@
#
# templates
#
+ project_template = PageTemplateFile('zpt/project/project_template', globals())
+ # edit templates
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())
edit_template = PageTemplateFile('zpt/project/edit_template', globals())
- project_template = PageTemplateFile('zpt/project/project_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())
+
# TODO: this should go away
extendedBibliography = PageTemplateFile('zpt/project/extendedBibliography_template', globals())
-
# TODO: compat
edit_MPIWGProject_main = edit_template
@@ -354,348 +359,6 @@
logging.debug(email.Utils.formatdate() + ' GMT')
RESPONSE.redirect(url + addStr % timeStamp)
- def decode(self, str):
- """return unicode object"""
- return unicodify(str)
-
- def isCheckField(self, fieldname):
- """return chechfield"""
- return (fieldname in checkFields)
-
- def sortedByPlace(self, metatype):
- """find metatype and sort by place"""
- def sort(x, y):
- return cmp(getattr(x[1], 'place', 0), getattr(y[1], 'place', 0))
-
- logging.debug("MPIWGProjects begin: sorted by place: " + metatype)
- founds = self.ZopeFind(self, obj_metatypes=[metatype]);
-
- founds.sort(sort)
- logging.debug("MPIWGProjects end: sorted by place: " + metatype)
- return founds
-
-
- def copyPublicationsToList(self, RESPONSE=None):
- """copy publications in to list"""
-
- publicationTxt = self.getContent('WEB_related_pub')
-
- pubSplits = publicationTxt.split("
")
-
- for pubSplit in pubSplits:
- pubSplit = pubSplit.replace("
", "")
- 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"""
-
- ret = True;
- if (self.getContent('WEB_related_pub') == ''):
- ret = False; # nichts im alten feld
- logging.debug("webrel:" + repr(ret))
- if (getattr(self, 'WEB_related_pub_copied', False)):
- ret = False; # alte daten sind schon kopiert worden
-
- logging.debug("webrel_copied:" + repr(ret))
- publications = self.ZopeFind(self, obj_metatypes=['MPIWGProject_publication']);
-
- if(len(publications) > 0):
- ret = False; # es gibt publicationen in der neuen liste
-
-
- logging.debug("len(publ)" + repr(ret))
-
- return ret;
-
- def copyImageToMargin(self, RESPONSE=None):
- """copy inline images to marginal images"""
- # getImages from WEB_project_description
- description = self.getContent('WEB_project_description')
-
- text2 = description
- splitted = text2.split("""""")
-
- imageURLs = []
- imageCaptions = []
- for split in splitted[1:]:
- tmp = split.split("
")
- # return repr(splitted[1])
-
- try:
- imageURLs.append(tmp[0].split("\"")[1].encode('utf-8'))
- except:
-
- try:
- imageURLs.append(tmp[0].split("src=")[1].split(" ")[0].encode('utf-8'))
- except:
- imageURLs.append("")
-
- split2 = "".join(tmp[1:])
-
-
- splitted = split2.split("""""")
- if len(splitted) > 1:
- tmp = splitted[1].split("
")
- imageCaptions.append(tmp[0].encode('utf-8'))
-
- else:
- # keine caption
-
- imageCaptions.append("")
-
- # eintragen:
- for imageURL in imageURLs:
- filename = imageURL.split("/")[-1]
- # lege neues images object an, mit leerem bild
-
- if self.ZopeFind(self, obj_ids=[filename]):
- # existiert das bild schon, dann neuen filenamen
- filename = "project_image_" + filename
-
- self.addImage(None, imageCaptions[imageURLs.index(imageURL)], filename=filename)
- # hole die bilddaten aus der url
- url = self.absolute_url() + "/" + imageURL
- # url=self.absolute_url()+"/"+filename
-
- try: # relative url
- data = urllib.urlopen(url).read()
- except:
- try: # absolute
- data = urllib.urlopen(self.imageURL).read()
- except:
- logger("MPIWG Project", logging.ERROR, "can't open: %s" % url)
-
- obj = getattr(self, filename)
- obj.update_data(data)
-
- if RESPONSE:
- self.redirect(RESPONSE, 'manageImages')
-
-
- 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
-
-
- pt = PageTemplateFile('zpt/project/edit_images', globals()).__of__(self)
- return pt()
-
- def managePublications(self, pubName=None, op=None):
- """managage images"""
- if pubName and op:
- if op == 'up':
- publications = self.getPublications()
- for publication in publications:
- if publication[0] == pubName:
- nr = publications.index(publication)
- if not nr == 0:
- publications[nr - 1][1].place += 1
- publications[nr][1].place -= 1
- pass
- elif op == 'down':
- publications = self.getPublications()
- for publication in publications:
- if publication[0] == pubName:
- nr = publications.index(publication)
- if not (nr == len(publications) - 1):
- publications[nr + 1][1].place -= 1
- publications[nr][1].place += 1
- pass
-
-
- pt = PageTemplateFile('zpt/project/edit_publications', globals()).__of__(self)
- return pt()
-
- def manageRelatedProjects(self, pubName=None, op=None):
- """managage relatedProjectd"""
- 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 = PageTemplateFile('zpt/project/edit_related_projects', globals()).__of__(self)
- return pt()
-
-
- def hasExtendedPublicationList(self):
- """test if extended publication list exists"""
- if not hasattr(self, "publicationList"):
- return False
- else:
- return True
-
- def createExtendedPublicationList(self, RESPONSE=None):
- """erzeuge erweiterte publications liste"""
- pl = BibliographyManager("publicationList", "", "institutsbiblio", self.connection_id)
- self._setObject("publicationList", pl)
-
- zt = ZopePageTemplate('index.html')
- pl._setObject('index.html', zt)
- default_content_fn = os.path.join(package_home(globals()),
- '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):
- 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 getRelatedProjects(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_relatedProject'])
-
- publications.sort(sort_images)
- return publications
-
- def addPublication(self, text, RESPONSE=None):
- """add an MPIWG_Publication"""
- number = self.getLastPublicationNumber() + 1
- name = "publication_" + str(number)
- while hasattr(self, name):
- number += 1
- name = "publication_" + str(number)
-
- newPublication = MPIWGProject_publication(name)
-
- self._setObject(name, newPublication)
- obj = getattr(self, name)
- obj.text = text[0:]
- obj.enabled = True;
- obj.place = self.getLastPublicationNumber() + 1
- obj.id = name
- self.ZCacheable_invalidate()
- if RESPONSE is not None:
-
- self.redirect(RESPONSE, 'managePublications')
-
- def errorRelatedProjects(self, link):
- """error creating a related project"""
- pt = PageTemplateFile(os.path.join(package_home(globals()), 'zpt', 'edit_project_error_relatedProject.zpt')).__of__(self)
- return pt(link=link)
-
- def addRelatedProject(self, link, RESPONSE=None):
- """add an MPIWG_Publication"""
- number = self.getLastPublicationNumber() + 1
- name = "RelatedProject" + str(number)
- while hasattr(self, name):
- number += 1
- name = "RelatedProject_" + str(number)
-
- # hole die id des projektes
- splitted = link.split("/")
-
- # teste ob es das project gibt
- if len(splitted) < 1:
- self.redirect(RESPONSE, 'errorRelatedProjects?link=' + link)
-
- objid = splitted[-1]
- object = getattr(self.projects, objid, None)
-
- if object == None:
- self.redirect(RESPONSE, 'errorRelatedProjects?link=' + link)
- return
-
- newPublication = MPIWGProject_relatedProject(name)
-
- self._setObject(name, newPublication)
- obj = getattr(self, name)
- obj.orginallink = link[0:]
- obj.objid = objid[0:]
- logging.debug("add relobj:objid" + repr(obj.objid))
- obj.projectWEB_title = object.getContent('WEB_title')[0:]
- logging.debug("add relobj:webtitle" + repr(obj.projectWEB_title))
- obj.enabled = True;
- 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:
- return 0
- else:
- return getattr(publications[-1][1], 'place', 0)
-
- def deletePublication(self, id, RESPONSE=None):
- """delete Publication id"""
- self.manage_delObjects([id])
- self.ZCacheable_invalidate()
- if RESPONSE:
- self.redirect(RESPONSE, 'managePublications')
-
- def deleteRelatedProject(self, id, RESPONSE=None):
- """delete Publication id"""
- self.manage_delObjects([id])
- self.ZCacheable_invalidate()
- if RESPONSE:
- self.redirect(RESPONSE, 'manageRelatedProjects')
-
def getNumber(self):
"""returns sorting number"""
@@ -801,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()
@@ -842,13 +505,13 @@
def getDescription(self, filter=False):
"""returns the project description"""
- t = getattr(self, 'WEB_project_description', None)
- if isinstance(t, list):
+ text = getattr(self, 'WEB_project_description', None)
+ if isinstance(text, list):
# compat with old lists
- return t[0]
- else:
- return t
-
+ text = text[0]
+
+ return text
+
def getSuperProjects(self):
"""returns a list of ancestor projects to the root"""
@@ -867,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):
@@ -898,6 +561,215 @@
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
+
+
+ # invalidate thumbnail
+ self.projectThumb = None
+ pt = PageTemplateFile('zpt/project/edit_images', globals()).__of__(self)
+ return pt()
+
+ def managePublications(self, pubName=None, op=None):
+ """managage images"""
+ if pubName and op:
+ if op == 'up':
+ publications = self.getPublications()
+ for publication in publications:
+ if publication[0] == pubName:
+ nr = publications.index(publication)
+ if not nr == 0:
+ publications[nr - 1][1].place += 1
+ publications[nr][1].place -= 1
+ pass
+ elif op == 'down':
+ publications = self.getPublications()
+ for publication in publications:
+ if publication[0] == pubName:
+ nr = publications.index(publication)
+ if not (nr == len(publications) - 1):
+ publications[nr + 1][1].place -= 1
+ publications[nr][1].place += 1
+ pass
+
+
+ pt = PageTemplateFile('zpt/project/edit_publications', globals()).__of__(self)
+ return pt()
+
+ 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 hasExtendedPublicationList(self):
+ """test if extended publication list exists"""
+ if not hasattr(self, "publicationList"):
+ return False
+ else:
+ return True
+
+ def createExtendedPublicationList(self, RESPONSE=None):
+ """erzeuge erweiterte publications liste"""
+ pl = BibliographyManager("publicationList", "", "institutsbiblio", self.connection_id)
+ self._setObject("publicationList", pl)
+
+ zt = ZopePageTemplate('index.html')
+ pl._setObject('index.html', zt)
+ default_content_fn = os.path.join(package_home(globals()),
+ '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):
+ 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
+ name = "publication_" + str(number)
+ while hasattr(self, name):
+ number += 1
+ name = "publication_" + str(number)
+
+ newPublication = MPIWGProject_publication(name)
+
+ self._setObject(name, newPublication)
+ obj = getattr(self, name)
+ obj.text = text[0:]
+ obj.enabled = True;
+ obj.place = self.getLastPublicationNumber() + 1
+ obj.id = name
+ self.ZCacheable_invalidate()
+ if RESPONSE is not None:
+
+ self.redirect(RESPONSE, 'managePublications')
+
+ def errorRelatedProjects(self, link):
+ """error creating a related project"""
+ pt = PageTemplateFile(os.path.join(package_home(globals()), 'zpt', 'edit_project_error_relatedProject.zpt')).__of__(self)
+ return pt(link=link)
+
+ def addRelatedProject(self, link, RESPONSE=None):
+ """add an MPIWG_Publication"""
+ number = self.getLastPublicationNumber() + 1
+ name = "RelatedProject" + str(number)
+ while hasattr(self, name):
+ number += 1
+ name = "RelatedProject_" + str(number)
+
+ # hole die id des projektes
+ splitted = link.split("/")
+
+ # teste ob es das project gibt
+ if len(splitted) < 1:
+ self.redirect(RESPONSE, 'errorRelatedProjects?link=' + link)
+
+ objid = splitted[-1]
+ object = getattr(self.projects, objid, None)
+
+ if object == None:
+ self.redirect(RESPONSE, 'errorRelatedProjects?link=' + link)
+ return
+
+ newPublication = MPIWGProject_relatedProject(name)
+
+ self._setObject(name, newPublication)
+ obj = getattr(self, name)
+ obj.orginallink = link[0:]
+ obj.objid = objid[0:]
+ logging.debug("add relobj:objid" + repr(obj.objid))
+ obj.projectWEB_title = object.getContent('WEB_title')[0:]
+ logging.debug("add relobj:webtitle" + repr(obj.projectWEB_title))
+ obj.enabled = True;
+ 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:
+ return 0
+ else:
+ return getattr(publications[-1][1], 'place', 0)
+
+ def deletePublication(self, id, RESPONSE=None):
+ """delete Publication id"""
+ self.manage_delObjects([id])
+ self.ZCacheable_invalidate()
+ if RESPONSE:
+ self.redirect(RESPONSE, 'managePublications')
+
+ def deleteRelatedProject(self, id, RESPONSE=None):
+ """delete Publication id"""
+ self.manage_delObjects([id])
+ self.ZCacheable_invalidate()
+ if RESPONSE:
+ self.redirect(RESPONSE, 'manageRelatedProjects')
+
def getImages(self):
"""get all Images"""
@@ -941,17 +813,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)
-
- if ct and len(ct) > 0:
- return True
- else:
- return False
-
-
def addImage(self, fileHd, caption, RESPONSE=None, filename=None):
"""add an MPIWG_Project_image"""
@@ -973,21 +834,14 @@
# invalidate thumbnail
self.projectThumb = None
- if RESPONSE is not None:
-
+ if RESPONSE is not None:
self.redirect(RESPONSE, 'manageImages')
- def versionHeader(self):
- """version Header, gibt header text entsprechend der aktuellen version aus"""
-
- actualTime = time.localtime()
- retTXT = """This is an outdated version, for the actual version please refer to %s
"""
- s = self.aq_parent.absolute_url()
- # print getattr(self,'archiveTime',actualTime)
- if getattr(self, 'archiveTime', actualTime) < actualTime:
- return retTXT % (s, s)
- else:
- return ""
+
+ def getEditableFields(self):
+ """giveListofDatafields"""
+ return editableFields
+
def getActualVersion(self, date=None):
"""actuelle version"""
@@ -1061,19 +915,6 @@
def delArchiveTime(self):
"""delete archive time"""
del self.archiveTime
-
- def versionManageForm(self):
- """version Manage form:currently only set to invisible"""
- pt = PageTemplateFile(os.path.join(package_home(globals()), 'zpt', 'MPIWGProject_versionManageForm.zpt')).__of__(self)
- return pt()
-
- def versionManage(self, invisible=None, RESPONSE=None):
- """version Manage form:currently only set to invisible"""
- self.invisible = invisible
-
- if RESPONSE is not None:
- self.redirect(RESPONSE, 'manage_main')
-
def isActiveProject(self):
"""check if the project is still active, default is true."""
@@ -1241,125 +1082,6 @@
return self.REQUEST['URL1'] + "/no_project"
- def no_project(self):
- """warnung: project noch nicht existent"""
- pt = PageTemplateFile(os.path.join(package_home(globals()), 'zpt', 'no_project')).__of__(self)
- return pt()
-
-
- def harvest_page(self, context=None, mode="normal"):
- """seite fuer harvesting fuer die Projektsuche"""
-
- if not context:
- context = self
-
- if self.isActiveProject() and self.isCurrentVersion():
- templates = self.en.getHarvestCache()
-
- ext = getattr(self, "harvest_main", None)
- if ext:
- rendered = getattr(self, ext.getId())()
- templates[self.absolute_url()] = rendered
- transaction.commit()
- return rendered
-
-
- pt = PageTemplateFile(os.path.join(package_home(globals()), 'zpt', 'harvest_main')).__of__(context)
-
- rendered = pt()
- templates[self.absolute_url()] = rendered
- transaction.commit()
- return rendered
-
-
-
- def index_html_old(self, request=True, context=None):
- """show homepage"""
-
- bound_names = {}
-
- if not context:
- context = self
- if request:
- if self.REQUEST.has_key('date') and self.REQUEST.SESSION.get('MPI_redirected', None) == None:
- self.REQUEST.SESSION['MPI_redirected'] = 1
- self.REQUEST.RESPONSE.redirect(self.checkDate(self.REQUEST['date']) + "?date=" + self.REQUEST['date'])
- else:
- self.REQUEST.SESSION['MPI_redirected'] = None
-
- # ext=self.ZopeFind(self.aq_parent,obj_ids=["project_main"])
-
-
- request2 = getattr(self, 'REQUEST', None)
-
- if request2 is not None:
- response = request2.response
- if not response.headers.has_key('content-type'):
- response.setHeader('content-type', 'text/html')
-
- security = getSecurityManager()
- bound_names['user'] = security.getUser()
-
- # Retrieve the value from the cache.
- keyset = None
- if self.ZCacheable_isCachingEnabled():
-
- # Prepare a cache key.
- keyset = {'here': self, 'params':request2['QUERY_STRING']}
-
- result = self.ZCacheable_get(keywords=keyset)
-
- if result is not None:
- # Got a cached value.
- return result
-
- pt = getTemplate(self, "project_main")
- # Execute the template in a new security context.
- security.addContext(self)
-
- try:
- # logging.debug("index_html pt=%s"%repr(pt))
- result = pt.pt_render(extra_context=bound_names)
- # logging.debug("index_html result=%s"%repr(result))
- if keyset is not None:
- # Store the result in the cache.
- self.ZCacheable_set(result, keywords=keyset)
-
- return result
- finally:
- security.removeContext(self)
-
-
-
- def index_html_old2(self, request=True, context=None):
- """show homepage"""
- if not context:
- context = self
- if request:
- if self.REQUEST.has_key('date') and self.REQUEST.SESSION.get('MPI_redirected', None) == None:
- self.REQUEST.SESSION['MPI_redirected'] = 1
- self.REQUEST.RESPONSE.redirect(self.checkDate(self.REQUEST['date']) + "?date=" + self.REQUEST['date'])
- else:
- self.REQUEST.SESSION['MPI_redirected'] = None
-
- # ext=self.ZopeFind(self.aq_parent,obj_ids=["project_main"])
-
- ext = getattr(self, "project_main", None)
- if ext:
- return getattr(self, ext.getId())()
-
- pt = PageTemplateFile(os.path.join(package_home(globals()), 'zpt', 'project_main')).__of__(context)
-
- return pt()
-
-
- def getDataFields(self):
- """giveListofDatafields"""
- ret = []
- for x in range(1, 14):
- if not x in [6, 10, 9]: # not used fields
- ret.append('xdata_%02i' % x)
- return ret
def getDefinedFields(self):
"""show all defined fields"""
@@ -1462,18 +1184,6 @@
# return utf8ify(text5) # return as utf-8 byte string
- def showImagesOfPage(self, imageUrl=None):
- """show Images of project"""
- 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()
-
-
- def show_html(self):
- """simple index"""
- # return "HI"
- pt = PageTemplateFile(os.path.join(package_home(globals()), 'zpt', 'MPIWGProject_index.zpt')).__of__(self)
- return pt()
def saveFromPreview(self):
"""save content aus preview"""
@@ -1513,24 +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 getLabel_old(self):
- """returns label (or title) of this project"""
- l = self.getContent('xdata_07')
- if l:
- return l
- l = self.getContent('WEB_title')
- if l:
- return l
- return self.title
-
def getBreadcrumbs(self):
"""return list of breadcrumbs from here to the root"""
crumbs = []
@@ -1547,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)
@@ -1586,82 +1269,20 @@
# return self.REQUEST.RESPONSE.redirect(self.REQUEST['URL1']+"/previewTemplate")
- def getWebProject_description(self):
- """get description"""
- debug = self.REQUEST.cookies.get("MP_debug_code", None)
-
- if debug and debug == "western":
- return """
-
-
-
-
- %s
-
- """ % self.WEB_project_description[0]
-
- return """
-
-
-
-
- %s
-
- """ % self.getContent('WEB_project_description')
-
-
-
def editMPIWGProjectForm(self):
"""editform"""
pt = PageTemplateFile(os.path.join(package_home(globals()), 'zpt', 'edit_MPIWGProject.zpt')).__of__(self)
return pt()
+
def isResponsibleScientist(self, key):
"""teste ob eine Person in der Liste der respl. scientists auftaucht"""
for resp in self.getResponsibleScientistsList():
- if resp['key'] == key:
+ if resp.get('key', None) == utf8ify(key):
return True
return False
- def getPersonKeyList(self):
- """gibt die key Liste der beteiligten Personen zurueck (utf8 codiert)"""
- # logging.error("getPersonKeyList:%s"%getattr(self,'responsibleScientistsList',[]))
- try:
- return [utf8ify(x[1]) for x in getattr(self, 'responsibleScientistsList', [])]
- except:
- return[]
-
-
- def myCapitalize(self, txt):
- """kapitalisiere auch Namen mit -"""
- splitted = [x.capitalize() for x in txt.split("-")]
- return "-".join(splitted)
-
- def getNamesOrdered(self, list):
- """Sortiert die Liste nach der Reihenfolge in xdata_01"""
-
- nameList = self.getContent('xdata_01')
- if nameList.find(";") > -1: # rate Trenner ist ;
- names = nameList.split(";")
- else:
- names = nameList.split(",")
-
- self._v_names = []
- for name in names:
- self._v_names.append(name.rstrip().lstrip())
-
-
- def sort(x, y):
- try:
- return cmp(self._v_names.index(x[0]), self._v_names.index(y[0]))
- except:
- return 0
-
- list.sort(sort)
-
- return list
-
def identifyNames(self, nameList):
"""Bekommt eine Komma oder Semikolon getrennte Liste mit Name der Form Vorname MittelName(n) Nachname
@@ -1711,23 +1332,22 @@
else:
returnNamesDict[name] = []
- logging.debug("id: %s" % repr(returnNamesDict))
+ logging.debug("identified names: %s" % repr(returnNamesDict))
return returnNamesDict
- def editMPIWGProject(self, RESPONSE=None, fromEdit=None):
+ def editMPIWGProject(self, fromEdit=None, createNewVersion=True, RESPONSE=None):
"""edit the project and archive the old version"""
-
- self.copyObjectToArchive() # archive the object
- self.ZCacheable_invalidate()
+ logging.debug("editMPIWGProject(fromEdit=%s, createNewVersion=%s)"%(fromEdit,createNewVersion))
+ if createNewVersion:
+ self.copyObjectToArchive() # archive the object
formdata = self.REQUEST.form
- logging.debug("REQUEST.form=%s" % repr(formdata))
# set all definedFields
for x in definedFields:
if formdata.has_key(x):
- setattr(self, x, formdata[x])
+ setattr(self, x, unicodify(formdata[x]))
# TODO: What does this do?
completedAt = formdata.get('completedAt')
@@ -1754,7 +1374,7 @@
# wenn es ein Feld der Form reponsibleScientist_nr_KEY gibt
nr = keyParts[2]
if keyParts[1] == "name":
- names[nr] = formdata[key]
+ names[nr] = unicodify(formdata[key])
elif keyParts[1] == "key":
keys[nr] = formdata[key]
@@ -1783,23 +1403,6 @@
RESPONSE.redirect('manage_main')
- def isChecked(self, wert, list):
- """check if wert is in ; seperated list"""
-
- # felder sind manchmnal als liste mit einem element definiert
- if type(list) is StringType or UnicodeType:
- splitted = list.split(";")
- else:
- splitted = list[0].split(";")
-
- splitted = [y.rstrip().lstrip() for y in splitted]
-
- for x in splitted:
- x = re.sub(r"[^A-z ]", "", x)
- if (not x == u'') and x in wert:
- return 1
- return 0
-
security.declareProtected('View management screens', 'editBasic')
def editBasic(self, identifiedNames=None):
"""editform"""
@@ -1811,23 +1414,6 @@
return pt(identifiedNames=identifiedNames)
- security.declareProtected('View management screens', 'editMPIWGBasisForm')
- def editMPIWGBasisForm(self):
- """editform"""
- pt = PageTemplateFile(os.path.join(package_home(globals()), 'zpt', 'edit_MPIWGBasis.zpt')).__of__(self)
- return pt()
-
- security.declareProtected('View management screens', 'editMPIWGRelatedPublicationsForm')
- def editMPIWGRelatedPublicationsForm(self):
- """Edit related Publications"""
- pt = PageTemplateFile(os.path.join(package_home(globals()), 'zpt', 'edit_MPIWGRelatedPublications.zpt')).__of__(self)
- return pt()
-
-
- def loadNewFileForm(self):
- """Neues XML-File einlesen"""
- pt = PageTemplateFile(os.path.join(package_home(globals()), 'zpt', 'MPIWGProject_newfile.zpt')).__of__(self)
- return pt()
def loadNewFile(self, RESPONSE=None):
"""einlesen des neuen files"""
@@ -1861,6 +1447,143 @@
return
+ def hasRelatedPublicationsOldVersion(self):
+ """teste ob es related publications gibt"""
+ ret = True;
+ if (self.getRelatedPublications() == ''):
+ ret = False; # nichts im alten feld
+ logging.debug("webrel:" + repr(ret))
+ if (getattr(self, 'WEB_related_pub_copied', False)):
+ ret = False; # alte daten sind schon kopiert worden
+
+ logging.debug("webrel_copied:" + repr(ret))
+ publications = self.ZopeFind(self, obj_metatypes=['MPIWGProject_publication']);
+
+ if(len(publications) > 0):
+ ret = False; # es gibt publicationen in der neuen liste
+
+
+ logging.debug("len(publ)" + repr(ret))
+
+ return ret;
+
+
+ def copyPublicationsToList(self, RESPONSE=None):
+ """copy publications in to list"""
+ publicationTxt = self.getRelatedPublications()
+
+ pubSplits = publicationTxt.split("")
+
+ for pubSplit in pubSplits:
+ pubSplit = pubSplit.replace("
", "")
+ 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()
+ cnt = text.count('')
+ return cnt
+
+
+ def copyImageToMargin(self, RESPONSE=None):
+ """copy inline images to marginal images"""
+ # getImages from WEB_project_description
+ description = self.getDescription()
+
+ text2 = description
+ splitted = text2.split("""
""")
+
+ imageURLs = []
+ imageCaptions = []
+ for split in splitted[1:]:
+ tmp = split.split("
")
+ # return repr(splitted[1])
+
+ try:
+ imageURLs.append(tmp[0].split("\"")[1].encode('utf-8'))
+ except:
+
+ try:
+ imageURLs.append(tmp[0].split("src=")[1].split(" ")[0].encode('utf-8'))
+ except:
+ imageURLs.append("")
+
+ split2 = "".join(tmp[1:])
+ splitted = split2.split("""""")
+ if len(splitted) > 1:
+ tmp = splitted[1].split("
")
+ imageCaptions.append(tmp[0].encode('utf-8'))
+
+ else:
+ # keine caption
+ imageCaptions.append("")
+
+ # eintragen:
+ for imageURL in imageURLs:
+ if not imageURL:
+ # no URL - no image
+ continue
+
+ filename = imageURL.split("/")[-1]
+ # lege neues images object an, mit leerem bild
+
+ if filename in self:
+ # existiert das bild schon, dann neuen filenamen
+ filename = "project_image_" + filename
+ if filename in self:
+ # exists too - assume its already converted
+ logging.warn("copyImageToMargin: image %s exists - skipping!"%filename)
+ continue
+
+ self.addImage(None, imageCaptions[imageURLs.index(imageURL)], filename=filename)
+ # hole die bilddaten aus der url
+ url = self.absolute_url() + "/" + imageURL
+ # url=self.absolute_url()+"/"+filename
+
+ try: # relative url
+ data = urllib.urlopen(url).read()
+ except:
+ try: # absolute
+ data = urllib.urlopen(self.imageURL).read()
+ except:
+ logging.error("copyImageToMargin: can't open: %s" % url)
+
+ obj = getattr(self, filename)
+ obj.update_data(data)
+
+ # clean description
+ logging.debug("copyImageToMargin: description:%s"%repr(description))
+ dom = ET.fromstring(utf8ify("%s"%description))
+ for e in dom.findall(".//p[@class='picture']"):
+ # remove contents
+ e.clear()
+ # remove tag
+ e.tag = None
+
+ for e in dom.findall(".//p[@class='picturetitle']"):
+ # remove contents
+ e.clear()
+ # remove tag
+ e.tag = None
+
+ # remove html tag
+ dom.tag = None
+ # set as new description
+ description = unicodify(serialize(dom))
+ logging.debug("copyImageToMargin: new description:%s"%repr(description))
+ setattr(self, 'WEB_project_description', description)
+
+ if RESPONSE:
+ self.redirect(RESPONSE, 'manageImages')
+
+
def updateProjectMembers(self, updateResponsibleScientistsList=False):
"""updates project-member table"""
if updateResponsibleScientistsList:
@@ -1946,6 +1669,7 @@
if tree is None:
tree = HashTree(keySeparator='.', keyFn=getInt)
for p in self.objectValues(spec='MPIWGProject'):
+ # add all projects
tree.add(p.getNumber(), p)
self._v_projectTree = tree
@@ -1954,7 +1678,7 @@
return tree
- def getProjectsAsList(self, start, active=1, archived=1):
+ def getProjectsAsList(self, start=None, active=1, archived=1):
"""Return flattened list of projects, starting from start.
active = 0 : all projects
@@ -2011,6 +1735,118 @@
return projects
+ security.declareProtected('View management screens', 'changeProjectTree')
+ def changeProjectTree(self, RESPONSE=None):
+ """change the complete tree"""
+ form=self.REQUEST.form
+ hashList={}
+ onlyArchived=int(form.get("onlyArchived",0))
+ onlyActive=int(form.get("onlyActive",0))
+ dep=form.get("dep",None)
+
+ fields = self.getProjectsAsList(start=dep, archived=onlyArchived, active=onlyActive)
+
+ logging.info("GOT TREE!----------------------------------------------------")
+ for field in form.keys():
+
+ splitted=field.split('_')
+ if (len(splitted)>1) and (splitted[1]=="runningNumber"):
+ #feld hat die Form Nummer_name und runnignNumber
+ nr=int(splitted[0]) # nummer des Datensatzes
+ project = fields[nr]
+
+ #
+ # change active
+ #
+ if form.has_key('%s_active'%nr): # active flag is set
+ project.setActiveFlag(True)
+ else:
+ project.setActiveFlag(False)
+
+ #
+ # nummer hat sich geaendert
+ #
+ entryChanged = False;
+ pronum = project.getNumber()
+ formnum = form['%s_number'%nr]
+
+ if not (pronum == formnum):
+ logging.debug("Changed!Number+++++++++++++++++++++++++++++++++")
+ logging.debug(repr(fields[nr].xdata_05)+" ---> "+ repr(form[str(nr)+'_number']))
+ entryChanged = True
+
+ #
+ # completed hat sich geaendert
+ #
+ td = project.transformDate # hole die funktion zum transformieren des datums
+ formstarted = form[str(nr)+'_started']
+ formcompleted = form[str(nr)+'_completed']
+
+ if not (td(project.getCompletedAt()) == td(formcompleted)):
+ logging.info(repr(td(project.getCompletedAt()))+" ---> "+ repr(td(form[str(nr)+'_completed'])))
+ logging.info("Changed!Completed+++++++++++++++++++++++++++++++++")
+ entryChanged = True
+
+ if not (td(project.getStartedAt()) == td(formstarted)):
+ logging.info(repr(td(project.getStartedAt()))+" ---> "+ repr(td(form[str(nr)+'_started'])))
+ logging.info("Changed!Started+++++++++++++++++++++++++++++++++")
+ entryChanged = True
+
+ if entryChanged:
+ logging.info("Changed!+++++++++++++++++++++++++++++++++")
+ project.copyObjectToArchive()
+ project.xdata_05 = formnum
+ project.setCompletedAt(formcompleted)
+ project.setStartedAt(formstarted)
+ # reset tree
+ self._v_projectTree = None
+
+ 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):
"""Re-create responsibleScientistsLists and projects_members table from all current projects."""
@@ -2028,16 +1864,19 @@
security.declareProtected('View management screens', 'updateAllProjects')
- def updateAllProjects(self, updateResponsibleScientistsList=False):
+ def updateAllProjects(self, updateResponsibleScientistsList=False, RESPONSE=None):
"""Patch all current projects for legacy problems."""
cnt = 0
+ fulllog = ""
# go through all projects
for (id, project) in self.ZopeFind(self, obj_metatypes=['MPIWGProject'], search_sub=1):
+ log = ""
cnt += 1
#
# hasRelatedPublicationsOldVersion
#
if project.hasRelatedPublicationsOldVersion():
+ log += "%s: update relatedPublicationsOldVersion!\n"%project.getId()
logging.debug("updateAllProjects(%s): update relatedPublicationsOldVersion!"%project.getId())
project.copyPublicationsToList()
@@ -2046,6 +1885,7 @@
#
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:
@@ -2067,9 +1907,23 @@
project.setResponsibleScientistsList(newScientists)
#
+ # old inline images
+ #
+ if project.hasInlineImage():
+ log += "%s: has inlineImage!\n"%project.getId()
+ logging.debug("updateAllProjects(%s): has inlineImage!"%project.getId())
+ try:
+ project.copyImageToMargin()
+ except Exception, e:
+ log += "%s: ERROR in copyImageToMargin!\n"%project.getId()
+ logging.debug("updateAllProjects(%s): ERROR in copyImageToMargin: %s"%(project.getId(), e))
+
+
+ #
# remove old attributes
#
if hasattr(project, 'definedFields'):
+ log += "%s: has definedFields!\n"%project.getId()
logging.debug("updateAllProjects(%s): has definedFields!"%project.getId())
delattr(project, 'definedFields')
@@ -2077,13 +1931,35 @@
# update extended bibliography
#
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))
+ #
+ # unicodify
+ #
+ for field in ('WEB_title', 'xdata_01', 'xdata_07', 'xdata_08', 'xdata_11', 'xdata_12', 'xdata_13',
+ 'WEB_project_description', 'WEB_related_pub'):
+ text = getattr(project, field, None)
+ if isinstance(text, str):
+ log += "%s: has non-unicode field %s\n"%(project.getId(), field)
+ logging.debug("updateAllProjects(%s): has has non-unicode field %s\n"%(project.getId(), field))
+ setattr(project, field, unicodify(text))
- return "updated %s projects!" % cnt
+ fulllog += log
+ if RESPONSE is not None:
+ RESPONSE.write(log)
+
+
+ log += "\n DONE! updated %s projects!" % cnt
+ fulllog += log
+ if RESPONSE is not None:
+ RESPONSE.write(log)
+ RESPONSE.flush()
+ else:
+ return fulllog
diff -r e718d9a72f19 -r 4600e31a0431 MPIWGProjects_removed.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/MPIWGProjects_removed.py Tue Apr 30 16:35:52 2013 +0200
@@ -0,0 +1,252 @@
+#
+# removed methods
+#
+class MPIWGProjects_notused:
+
+ def decode(self, str):
+ """return unicode object"""
+ return unicodify(str)
+
+ def isCheckField(self, fieldname):
+ """return chechfield"""
+ return (fieldname in checkFields)
+
+ def sortedByPlace(self, metatype):
+ """find metatype and sort by place"""
+ def sort(x, y):
+ return cmp(getattr(x[1], 'place', 0), getattr(y[1], 'place', 0))
+
+ logging.debug("MPIWGProjects begin: sorted by place: " + metatype)
+ founds = self.ZopeFind(self, obj_metatypes=[metatype]);
+
+ founds.sort(sort)
+ logging.debug("MPIWGProjects end: sorted by place: " + metatype)
+ return founds
+
+
+ def harvest_page(self, context=None, mode="normal"):
+ """seite fuer harvesting fuer die Projektsuche"""
+
+ if not context:
+ context = self
+
+ if self.isActiveProject() and self.isCurrentVersion():
+ templates = self.en.getHarvestCache()
+
+ ext = getattr(self, "harvest_main", None)
+ if ext:
+ rendered = getattr(self, ext.getId())()
+ templates[self.absolute_url()] = rendered
+ transaction.commit()
+ return rendered
+
+
+ pt = PageTemplateFile(os.path.join(package_home(globals()), 'zpt', 'harvest_main')).__of__(context)
+
+ rendered = pt()
+ templates[self.absolute_url()] = rendered
+ transaction.commit()
+ return rendered
+
+
+
+ def index_html_old(self, request=True, context=None):
+ """show homepage"""
+
+ bound_names = {}
+
+ if not context:
+ context = self
+ if request:
+ if self.REQUEST.has_key('date') and self.REQUEST.SESSION.get('MPI_redirected', None) == None:
+ self.REQUEST.SESSION['MPI_redirected'] = 1
+ self.REQUEST.RESPONSE.redirect(self.checkDate(self.REQUEST['date']) + "?date=" + self.REQUEST['date'])
+ else:
+ self.REQUEST.SESSION['MPI_redirected'] = None
+
+ # ext=self.ZopeFind(self.aq_parent,obj_ids=["project_main"])
+
+
+ request2 = getattr(self, 'REQUEST', None)
+
+ if request2 is not None:
+ response = request2.response
+ if not response.headers.has_key('content-type'):
+ response.setHeader('content-type', 'text/html')
+
+ security = getSecurityManager()
+ bound_names['user'] = security.getUser()
+
+ # Retrieve the value from the cache.
+ keyset = None
+ if self.ZCacheable_isCachingEnabled():
+
+ # Prepare a cache key.
+ keyset = {'here': self, 'params':request2['QUERY_STRING']}
+
+ result = self.ZCacheable_get(keywords=keyset)
+
+ if result is not None:
+ # Got a cached value.
+ return result
+
+ pt = getTemplate(self, "project_main")
+ # Execute the template in a new security context.
+ security.addContext(self)
+
+ try:
+ # logging.debug("index_html pt=%s"%repr(pt))
+ result = pt.pt_render(extra_context=bound_names)
+ # logging.debug("index_html result=%s"%repr(result))
+ if keyset is not None:
+ # Store the result in the cache.
+ self.ZCacheable_set(result, keywords=keyset)
+
+ return result
+ finally:
+ security.removeContext(self)
+
+
+
+ def index_html_old2(self, request=True, context=None):
+ """show homepage"""
+ if not context:
+ context = self
+ if request:
+ if self.REQUEST.has_key('date') and self.REQUEST.SESSION.get('MPI_redirected', None) == None:
+ self.REQUEST.SESSION['MPI_redirected'] = 1
+ self.REQUEST.RESPONSE.redirect(self.checkDate(self.REQUEST['date']) + "?date=" + self.REQUEST['date'])
+ else:
+ self.REQUEST.SESSION['MPI_redirected'] = None
+
+ # ext=self.ZopeFind(self.aq_parent,obj_ids=["project_main"])
+
+ ext = getattr(self, "project_main", None)
+ if ext:
+ return getattr(self, ext.getId())()
+
+ pt = PageTemplateFile(os.path.join(package_home(globals()), 'zpt', 'project_main')).__of__(context)
+
+ return pt()
+
+
+ def no_project(self):
+ """warnung: project noch nicht existent"""
+ pt = PageTemplateFile(os.path.join(package_home(globals()), 'zpt', 'no_project')).__of__(self)
+ return pt()
+
+
+ def showImagesOfPage(self, imageUrl=None):
+ """show Images of project"""
+ 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()
+
+
+ def show_html(self):
+ """simple index"""
+ # return "HI"
+ pt = PageTemplateFile(os.path.join(package_home(globals()), 'zpt', 'MPIWGProject_index.zpt')).__of__(self)
+ return pt()
+
+ def getLabel_old(self):
+ """returns label (or title) of this project"""
+ l = self.getContent('xdata_07')
+ if l:
+ return l
+ l = self.getContent('WEB_title')
+ if l:
+ return l
+ return self.title
+
+ def getPersonKeyList(self):
+ """gibt die key Liste der beteiligten Personen zurueck (utf8 codiert)"""
+ # logging.error("getPersonKeyList:%s"%getattr(self,'responsibleScientistsList',[]))
+ try:
+ return [utf8ify(x[1]) for x in getattr(self, 'responsibleScientistsList', [])]
+ except:
+ return[]
+
+
+ def myCapitalize(self, txt):
+ """kapitalisiere auch Namen mit -"""
+ splitted = [x.capitalize() for x in txt.split("-")]
+ return "-".join(splitted)
+
+ def getNamesOrdered(self, list):
+ """Sortiert die Liste nach der Reihenfolge in xdata_01"""
+
+ nameList = self.getContent('xdata_01')
+ if nameList.find(";") > -1: # rate Trenner ist ;
+ names = nameList.split(";")
+ else:
+ names = nameList.split(",")
+
+ self._v_names = []
+ for name in names:
+ self._v_names.append(name.rstrip().lstrip())
+
+
+ def sort(x, y):
+ try:
+ return cmp(self._v_names.index(x[0]), self._v_names.index(y[0]))
+ except:
+ return 0
+
+ list.sort(sort)
+
+ return list
+
+ def getWebProject_description(self):
+ """get description"""
+ debug = self.REQUEST.cookies.get("MP_debug_code", None)
+
+ if debug and debug == "western":
+ return """
+
+
+
+
+ %s
+
+ """ % self.WEB_project_description[0]
+
+ return """
+
+
+
+
+ %s
+
+ """ % self.getContent('WEB_project_description')
+
+
+
+ def isChecked(self, wert, list):
+ """check if wert is in ; seperated list"""
+
+ # felder sind manchmnal als liste mit einem element definiert
+ if type(list) is StringType or UnicodeType:
+ splitted = list.split(";")
+ else:
+ splitted = list[0].split(";")
+
+ splitted = [y.rstrip().lstrip() for y in splitted]
+
+ for x in splitted:
+ x = re.sub(r"[^A-z ]", "", x)
+ if (not x == u'') and x in wert:
+ 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
+
+
+
diff -r e718d9a72f19 -r 4600e31a0431 MPIWGRoot.py
--- a/MPIWGRoot.py Tue Apr 30 16:31:57 2013 +0200
+++ b/MPIWGRoot.py Tue Apr 30 16:35:52 2013 +0200
@@ -121,23 +121,6 @@
return bt
- def versionHeaderEN(self):
- """version header text"""
-
- date= self.REQUEST.get('date',None)
- if date:
- txt="""This pages shows the project which existed at %s
"""%str(date)
- return txt
- return ""
-
- def versionHeaderDE(self):
- """version header text"""
- date= self.REQUEST.get('date',None)
- if date:
- txt="""Auf dieser Seite finden Sie die Projekte mit Stand vom %s
"""%str(date)
- return ""
-
-
def createOrUpdateId_raw(self):
"""create sequence to create ids for bibliography"""
debug=None
@@ -165,22 +148,6 @@
splitted=url.split("/")
return splitted[4]
- def generateUrlProject(self,url,project=None):
- """erzeuge aus absoluter url, relative des Projektes"""
- if project:
- splitted=url.split("/")
- length=len(splitted)
- short=splitted[length-2:length]
-
- base=self.REQUEST['URL3']+"/"+"/".join(short)
-
- else:
- findPart=url.find("/projects/")
- base=self.REQUEST['URL1']+"/"+url[findPart:]
-
-
- return base
-
def isNewCapital(self,text=None,reset=None):
if text:
@@ -250,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)
@@ -324,35 +298,6 @@
return ""
- # TODO: remove
- def isActiveMember(self,key):
- """tested ob Mitarbeiter key ist aktiv"""
- key=utf8ify(key)
- ret=getAt(self.ZSQLInlineSearch(_table='personal_www',
- _op_key='eq',key=key,
- _op_publish_the_data='eq',
- publish_the_data='yes'), 0)
-
- 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()
-
- if hasattr(project,'getObject'): #obj ist aus einer catalogTrefferList
- obj=project.getObject()
- else:
- obj=project
-
- if getattr(obj,'archiveTime',actualTime)< actualTime:
- return False
- else:
- return True
def redirectIndex_html(self,request):
#return request['URL1']+'/index_html'
@@ -435,34 +380,6 @@
"""quote"""
return urllib.unquote(str)
-
-
- def getProjectsByFieldContent(self,fieldName,fieldContentsEntry, date=None):
- """gib alle Projekte aus mit Value von field mit fieldName enthaelt ein Element der Liste fieldContents"""
- def sort(x,y):
- return cmp(x.WEB_title[0],y.WEB_title[0])
-
- if type(fieldContentsEntry) is StringType:
- fieldContentsTmp=[fieldContentsEntry]
- else:
- fieldContentsTmp=fieldContentsEntry
-
- fieldContents=[]
- for x in fieldContentsTmp:
- fieldContents.append(" AND ".join(x.split()))
- projects=self.ProjectCatalog({fieldName:string.join(fieldContents,' AND')})
- #print projects
- #ret=[x for x in projects]
- ret=[]
- for x in projects:
- obj=x.getObject()
- obj=obj.getActualVersion(date)
- if obj and (not getattr(obj,'invisible',None)):
- #if not (x in ret):
- ret.append(x)
-
- ret.sort(sort)
- return ret
def changeMPIWGRootForm(self):
"""edit"""
@@ -484,128 +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 getProjectFields(self,fieldName,date=None,folder=None,sort=None):
- """getListofFieldNames"""
- ret=[]
-
- objects=self.ZopeFind(self.projects,obj_metatypes=['MPIWGProject'],search_sub=0)
-
-
- for object in objects:
- obj=object[1]
- obj=obj.getActualVersion(date)
- if obj and (not getattr(obj,'invisible',None)):
- if fieldName=="WEB_title_or_short":
-
- if len(obj.getContent('xdata_07'))<3: # hack weil z.Z. manchmal noch ein Trennzeichen ; oder , im Feld statt leer
- fieldNameTmp="WEB_title"
- else:
- fieldNameTmp="xdata_07"
- else:
- fieldNameTmp=fieldName
-
- ret.append((obj,obj.getContent(fieldNameTmp)))
-
-
- if sort=="int":
- ret.sort(sortI)
- elif sort=="stopWords":
-
- ret.sort(sortStopWords(self))
-
- else:
- ret.sort(sortF)
-
- return ret
-
- def showNewProjects(self):
- projects=[]
- for objs in self.getProjectFields('WEB_title_or_short'): # Get all Projets
- if objs[0].xdata_05 and (objs[0].xdata_05[0] == ""):
-
- projects.append(objs)
-
- return projects
def updatePublicationDB(self,personId=None):
@@ -843,43 +638,6 @@
- def reindexCatalogs(self,RESPONSE=None):
- """reindex members and project catalog"""
-
-
- try:
-
- self.ProjectCatalog.manage_catalogReindex(self.REQUEST,RESPONSE,self.REQUEST['URL1'])
- logger("MPIWG Root (reindexCatalog: projects)",logging.INFO,"DONE")
- except:
- logger("MPIWG Root (reindexCatalog: projects)",logging.WARNING," %s %s"%sys.exc_info()[:2])
-
- try:
-
- self.MembersCatalog.manage_catalogReindex(self.REQUEST,RESPONSE,self.REQUEST['URL1'])
- logger("MPIWG Root (reindexCatalog: members)",logging.INFO,"DONE")
- except:
- logger("MPIWG Root (reindexCatalog: members)",logging.WARNING," %s %s"%sys.exc_info()[:2])
-
-
-#
-# try:
-#
-# self.fulltextProjectsMembers.manage_catalogReindex(self.REQUEST,RESPONSE,self.REQUEST['URL1'])
-# logger("MPIWG Root (reindexCatalog: fulltextProjectsMembers)",logging.INFO,"DONE")
-# except:
-# logger("MPIWG Root (reindexCatalog: fulltextProjectsMembers)",logging.WARNING," %s %s"%sys.exc_info()[:2])
-#
-#
-#
-#
-
-
- if RESPONSE:
- RESPONSE.redirect('manage_main')
-
-
-
def getAllMembers(self):
#ret=[]
@@ -923,177 +681,14 @@
rss+=linkStr%obj[3].getId()
rss+=""""""
if hasattr(obj[3],'publicationList'):
- rss+="""- """
+ rss+="""
- """
rss+=linkStr%(obj[3].getId()+"/publicationList");
rss+="""
"""
rss+="""
"""
-
return rss
- def getTree(self,dep=None,date=None,onlyActive=0,onlyArchived=0):
- """generate Tree from project list
- als Liste, jeder Eintrag ist ein Tupel ,(Tiefe, ProjektNummer,ProjektObject
- onlyActive = 0 : alle Projekte
- onlyActive = 1 : nur active Projekte
- onlyActive = 2: nur inactive Projekte
-
- onlyArchived=0: alle Projekte
- onlyArchived= 1 : nur aktuelle Projekte
- onlyArchived = 2: nur archivierte Projekte
-
- department fuer das Tree geholt werden soll
- """
- logging.debug("MPIWGRoot.getTree()")
-
- returnListTmp=[]
- returnList=[]
-
- for project in self.getProjectFields('xdata_05',sort="int",date=date): # get Projects sorted by xdata_05
-
- for idNr in project[1].split(";"): # more than one number
- if not idNr=="":
- splittedId=idNr.split(".")
- depth=len(splittedId)
- nr=idNr
- #title=project[0].WEB_title
- title=[project[0].getContent('WEB_title')]
- #print title
-
- if idNr[0]=="x": # kompatibilitaet mit alter Konvention, x vor der Nummer macht project inactive
- project[0].setActiveFlag(False)
-
- if (not dep) or (splittedId[0]==dep): #falls dep gesetzt ist nur dieses hinzufuegen.
-
- if (onlyActive==0):
- returnListTmp.append((depth,nr,title,project[0]))
- elif (onlyActive==1) and project[0].isActiveProject(): #nur active projekte
- returnListTmp.append((depth,nr,title,project[0]))
- elif (onlyActive==2) and (not project[0].isActiveProject()): #nur active projekte
- returnListTmp.append((depth,nr,title,project[0]))
-
-
- #filter jetzt die Liste nach Archived oder nicht
- for entry in returnListTmp:
- if (onlyArchived==0):
- returnList.append(entry)
- elif (onlyArchived==1) and (not entry[3].isArchivedProject()): #nur active projekte
- returnList.append(entry)
- elif (onlyArchived==2) and (entry[3].isArchivedProject()): #nur active projekte
- returnList.append(entry)
-
-
- return returnList
-
-
-
- def changePosition(self,treeId,select,RESPONSE=None):
- """Change Postion Entry"""
- numbers=[]
-
- # Suche hoechste bisherige nummer
- projects=self.getProjectFields('xdata_05') # get Projects sorted by xdata_05
- #print "pj",projects
- for project in projects: #suche alle subtrees der treeId
- #print treeId
-
- founds=re.match(treeId+"\.(.*)",project[1].split(";")[0])
- if founds:
- #print "x",founds.group(0),len(founds.group(0).split("."))
- if len(founds.group(0).split("."))==len(treeId.split("."))+1: # nur ein punkt mehr, d.h. untere ebene
- try:
- numbers.append(int(founds.group(0).split(".")[len(founds.group(0).split("."))-1]))
- except:
- numbers.append(int(0))
-
- try:
- highest=max(numbers)
- except:
- highest=0
- projects=self.showNewProjects()
- for i in self.makeList(select):
- highest+=10
- projects[int(i)][0].xdata_05=treeId+"."+str(highest)
-
-
- if RESPONSE is not None:
- RESPONSE.redirect('showTree')
-
- def changeTree(self,RESPONSE=None):
- """change the complete tree"""
- form=self.REQUEST.form
- hashList={}
- onlyArchived=int(form.get("onlyArchived",0))
- onlyActive=int(form.get("onlyActive",0))
- dep=form.get("dep",None)
-
- fields=self.getTree(dep=dep,onlyArchived=onlyArchived,onlyActive=onlyActive)
-
- logging.info("GOT TREE!----------------------------------------------------")
- for field in form.keys():
-
- splitted=field.split('_')
- if (len(splitted)>1) and (splitted[1]=="runningNumber"): #feld hat die Form Nummer_name und runnignNumber
-
-
- nr=int(splitted[0]) # nummer des Datensatzes
- currentEntry = fields[nr]
-
- if form.has_key(str(nr)+'_active'): # active flag is set
- fields[nr][3].setActiveFlag(True)
- else:
- fields[nr][3].setActiveFlag(False)
-
- #nummer hat sich geaendert
-
- entryChanged = False;
-
- if isinstance(fields[nr][3].xdata_05,list): #for some reasons somtimes the content of the field is a list with one entry.
- fields[nr][3].xdata_05=fields[nr][3].xdata_05[0]
-
- if not (fields[nr][3].xdata_05==form[str(nr)+'_number']):
- logging.info("Changed!Number+++++++++++++++++++++++++++++++++")
- logging.info(repr(fields[nr][3].xdata_05)+" ---> "+ repr(form[str(nr)+'_number']))
- fields[nr][3].xdata_05=form[str(nr)+'_number']
- entryChanged = True
-
- #completed har sich geaendert
-
- td = fields[nr][3].transformDate # hole die funktion zum transformieren des datums
-
- if not (td(fields[nr][3].getCompletedAt())==td(form[str(nr)+'_completed'])):
- fields[nr][3].setCompletedAt(form[str(nr)+'_completed'])
- logging.info(repr(td(fields[nr][3].getCompletedAt()))+" ---> "+ repr(td(form[str(nr)+'_completed'])))
- logging.info("Changed!Completed+++++++++++++++++++++++++++++++++")
- entryChanged = True
-
- if not (td(fields[nr][3].getStartedAt())==td(form[str(nr)+'_started'])):
- fields[nr][3].setStartedAt(form[str(nr)+'_started'])
-
- logging.info(repr(td(fields[nr][3].getStartedAt()))+" ---> "+ repr(td(form[str(nr)+'_started'])))
- logging.info("Changed!Started+++++++++++++++++++++++++++++++++")
- entryChanged = True
-
-
- if entryChanged:
- logging.info("Changed!+++++++++++++++++++++++++++++++++")
- fields[nr][3].copyObjectToArchive()
-
-
- if RESPONSE is not None:
- RESPONSE.redirect('showTree')
-
- def getProjectWithId(self,id):
- fields=self.getProjectFields('xdata_05')
- for field in fields:
- if field[1]==id:
- return field[0]
-
- return None
-
-
-
def getRelativeUrlFromPerson(self,list):
"""get urls to person list"""
@@ -1143,202 +738,7 @@
- def getProjectsOfMembers(self,date=None):
- """give tuple member /projects"""
- ret=[]
- members=self.getAllMembers()
- logging.debug("X %s"%repr(members))
- #return str(members)
- for x in members:
- #logging.debug("X %s"%repr(x))
- projects=self.getProjectsOfMember(key=x[1],date=date)
- if len(projects)>0:
- ret.append((x[0],projects))
-
- return ret
-
- def getProjectsOfMember(self,key=None,date=None,onlyArchived=1,onlyActive=1):
- """get projects of a member
-
- @param key: (optional) Key zur Idenfikation des Benutzer
- @param date: (optional) Version die zum Zeitpunkt date gueltig war
- @param onlyArchived:
- onlyArchived=0: alle Projekte
- onlyArchived= 1 : nur aktuelle Projekte
- onlyArchived = 2: nur archivierte Projekte
- """
- # TODO: Die ganze Loesung
- def sortP(x,y):
- """sort by sorting number"""
- return cmp(x.WEB_title,y.WEB_title)
-
- ret=[]
- if key:
- logging.debug("MPIWGROOT (getProjectsOfMember):"+key)
- proj=self.ProjectCatalog({'getPersonKeyList':utf8ify(key)})
- else:
- return ret # key muss definiert sein
-
- #logging.debug("MPIWGROOT (getProjectsOfMember):"+repr(proj))
- if proj:
- proj2=[]
- for x in proj:
- #logging.error("proj:%s"%repr(x.getPath()))
- if (not getattr(x.getObject(),'invisible',None)) and (getattr(x.getObject(),'archiveTime','')==''):
- proj2.append(x)
-
- else:
- proj2=[]
-
-
-
- proj2.sort(sortP)
-
- projectListe=[]
- #logging.error("getprojectsofmember proj2: %s"%repr(proj2))
- for proj in proj2:
- obj=proj.getObject()
- add=False
- if onlyArchived==1: #nur aktuell projecte
- if not obj.isArchivedProject():
- add=True
- elif onlyArchived==2: #nur archivierte
- if obj.isArchivedProject():
- add=True
- else: #alle
- add=True
-
- if onlyActive==1: #nur active projecte
- if obj.isActiveProject():
- add=add & True
- else:
- add=add & False
-
- elif onlyArchived==2: #nur nicht aktvive
- if not obj.isActiveProject():
- add=add & True
- else: #alle
- add=add & True
-
- if add:
- projectListe.append(obj)
-
- #logging.error("getprojectsofmember projectliste: %s"%repr(projectListe))
- return projectListe
- def givePersonList(self,name):
- """check if person is in personfolder and return list of person objects"""
-
- splitted=name.split(",")
- if len(splitted)==1:
- splitted=name.lstrip().rstrip().split(" ")
- splittedNew=[split.lstrip() for split in splitted]
-
- if splittedNew[0]=='':
- del splittedNew[0]
- search=string.join(splittedNew,' AND ')
-
- if not search=='':
- proj=self.MembersCatalog({'title':search})
-
- if proj:
- return [[x.lastName,x.firstName] for x in proj]
- else:
- return []
-
-## splitted=name.split(",") # version nachname, vorname...
-## if len(splitted)>1:
-## lastName=splitted[0]
-## firstName=splitted[1]
-## else:
-## splitted=name.split(" ") #version vorname irgenwas nachnamae
-
-## lastName=splitted[len(splitted)-1]
-## firstName=string.join(splitted[0:len(splitted)-1])
-
-## objs=[]
-
- #print self.members
- ## for x in self.members.__dict__:
-## obj=getattr(self.members,x)
-## if hasattr(obj,'lastName') and hasattr(obj,'firstName'):
-
-## if (re.match(".*"+obj.lastName+".*",lastName) or re.match(".*"+lastName+".*",obj.lastName)) and (re.match(".*"+obj.firstName+".*",firstName) or re.match(".*"+firstName+".*",obj.firstName)):
-
-## objs.append((obj,lastName+", "+firstName))
-
-
-## return objs
-
-
- def personCheck(self,names):
- """all persons for list"""
- #print "names",names
- splitted=names.split(";")
- ret={}
- for name in splitted:
-
- if not (name==""):
- try:
- ret[name]=self.givePersonList(name)
- except:
- """NOTHIHN"""
- #print "RET",ret
- return ret
-
- def giveCheckList(self,person,fieldname):
- """return checklist"""
- #print "GCL",fieldname
- if fieldname=='xdata_01':
- x=self.personCheck(person.getContent(fieldname))
- #print "GCLBACKX",x
- return x
-
-
- # TODO: do we need this here?
- def isCheckField(self,fieldname):
- """return chechfield"""
- return (fieldname in checkFields)
-
-
-
- def sortResults(self,results):
- """search the catalog and give results back sorted by meta_type"""
- ret = {}
- logging.debug(results())
- for result in results():
- metaType = result.meta_type
- resultList= ret.get(metaType,[])
- resultList.append(result)
- ret[metaType]=resultList
-
- logging.debug(ret)
- return ret
-
-
- def getAllProjectPublications(self):
- """get all publications"""
- fw=file("/tmp/allProjectPublications","w")
- projects =self.projects.getProjectsAsList(None,active=0,archived=0)
-
- for project in projects:
- logging.debug(project)
- if hasattr(project,'publicationList'):
- try:
- x =project.publicationList.bibliolist.data
-
- except:
- logging.error("Can't do: %s"%project.absolute_url())
- continue
-
- id=project.getId()
- for l in x.split("\n"):
- fw.write("%s,%s\n"%(id,l))
- fw.flush()
-
- fw.close()
-
-
def manage_addMPIWGRootForm(self):
"""form for adding the root"""
diff -r e718d9a72f19 -r 4600e31a0431 MPIWGRoot_deleted_methods.py
--- a/MPIWGRoot_deleted_methods.py Tue Apr 30 16:31:57 2013 +0200
+++ b/MPIWGRoot_deleted_methods.py Tue Apr 30 16:35:52 2013 +0200
@@ -1,3 +1,6 @@
+class MPIWGRoot_deleted:
+
+
def removeStopWords(self,xo):
"""remove stop words from xo"""
if not hasattr(self,'_v_stopWords'):
@@ -301,4 +304,549 @@
"""restore"""
self.nameIndexEdited=self.nameIndex
return "done"
+
+ def getProjectsOfMembers(self,date=None):
+ """give tuple member /projects"""
+ ret=[]
+ members=self.getAllMembers()
+ logging.debug("X %s"%repr(members))
+ #return str(members)
+ for x in members:
+ #logging.debug("X %s"%repr(x))
+ projects=self.getProjectsOfMember(key=x[1],date=date)
+ if len(projects)>0:
+ ret.append((x[0],projects))
+
+ return ret
+
+ def getProjectsOfMember(self,key=None,date=None,onlyArchived=1,onlyActive=1):
+ """get projects of a member
+ @param key: (optional) Key zur Idenfikation des Benutzer
+ @param date: (optional) Version die zum Zeitpunkt date gueltig war
+ @param onlyArchived:
+ onlyArchived=0: alle Projekte
+ onlyArchived= 1 : nur aktuelle Projekte
+ onlyArchived = 2: nur archivierte Projekte
+ """
+ # TODO: Die ganze Loesung
+ def sortP(x,y):
+ """sort by sorting number"""
+ return cmp(x.WEB_title,y.WEB_title)
+
+ ret=[]
+ if key:
+ logging.debug("MPIWGROOT (getProjectsOfMember):"+key)
+ proj=self.ProjectCatalog({'getPersonKeyList':utf8ify(key)})
+ else:
+ return ret # key muss definiert sein
+
+ #logging.debug("MPIWGROOT (getProjectsOfMember):"+repr(proj))
+ if proj:
+ proj2=[]
+ for x in proj:
+ #logging.error("proj:%s"%repr(x.getPath()))
+ if (not getattr(x.getObject(),'invisible',None)) and (getattr(x.getObject(),'archiveTime','')==''):
+ proj2.append(x)
+
+ else:
+ proj2=[]
+
+
+
+ proj2.sort(sortP)
+
+ projectListe=[]
+ #logging.error("getprojectsofmember proj2: %s"%repr(proj2))
+ for proj in proj2:
+ obj=proj.getObject()
+ add=False
+ if onlyArchived==1: #nur aktuell projecte
+ if not obj.isArchivedProject():
+ add=True
+ elif onlyArchived==2: #nur archivierte
+ if obj.isArchivedProject():
+ add=True
+ else: #alle
+ add=True
+
+ if onlyActive==1: #nur active projecte
+ if obj.isActiveProject():
+ add=add & True
+ else:
+ add=add & False
+
+ elif onlyArchived==2: #nur nicht aktvive
+ if not obj.isActiveProject():
+ add=add & True
+ else: #alle
+ add=add & True
+
+ if add:
+ projectListe.append(obj)
+
+ #logging.error("getprojectsofmember projectliste: %s"%repr(projectListe))
+ return projectListe
+
+
+ def givePersonList(self,name):
+ """check if person is in personfolder and return list of person objects"""
+
+ splitted=name.split(",")
+ if len(splitted)==1:
+ splitted=name.lstrip().rstrip().split(" ")
+ splittedNew=[split.lstrip() for split in splitted]
+
+ if splittedNew[0]=='':
+ del splittedNew[0]
+ search=string.join(splittedNew,' AND ')
+
+ if not search=='':
+ proj=self.MembersCatalog({'title':search})
+
+ if proj:
+ return [[x.lastName,x.firstName] for x in proj]
+ else:
+ return []
+
+## splitted=name.split(",") # version nachname, vorname...
+## if len(splitted)>1:
+## lastName=splitted[0]
+## firstName=splitted[1]
+## else:
+## splitted=name.split(" ") #version vorname irgenwas nachnamae
+
+## lastName=splitted[len(splitted)-1]
+## firstName=string.join(splitted[0:len(splitted)-1])
+
+## objs=[]
+
+ #print self.members
+ ## for x in self.members.__dict__:
+## obj=getattr(self.members,x)
+## if hasattr(obj,'lastName') and hasattr(obj,'firstName'):
+
+## if (re.match(".*"+obj.lastName+".*",lastName) or re.match(".*"+lastName+".*",obj.lastName)) and (re.match(".*"+obj.firstName+".*",firstName) or re.match(".*"+firstName+".*",obj.firstName)):
+
+## objs.append((obj,lastName+", "+firstName))
+
+
+## return objs
+
+
+ def personCheck(self,names):
+ """all persons for list"""
+ #print "names",names
+ splitted=names.split(";")
+ ret={}
+ for name in splitted:
+
+ if not (name==""):
+ try:
+ ret[name]=self.givePersonList(name)
+ except:
+ """NOTHIHN"""
+ #print "RET",ret
+ return ret
+
+ def giveCheckList(self,person,fieldname):
+ """return checklist"""
+ #print "GCL",fieldname
+ if fieldname=='xdata_01':
+ x=self.personCheck(person.getContent(fieldname))
+ #print "GCLBACKX",x
+ return x
+
+
+ # TODO: do we need this here?
+ def isCheckField(self,fieldname):
+ """return chechfield"""
+ return (fieldname in checkFields)
+
+
+
+ def sortResults(self,results):
+ """search the catalog and give results back sorted by meta_type"""
+ ret = {}
+ logging.debug(results())
+ for result in results():
+ metaType = result.meta_type
+ resultList= ret.get(metaType,[])
+ resultList.append(result)
+ ret[metaType]=resultList
+
+ logging.debug(ret)
+ return ret
+
+ # TODO: remove
+ def isActiveMember(self,key):
+ """tested ob Mitarbeiter key ist aktiv"""
+ key=utf8ify(key)
+ ret=getAt(self.ZSQLInlineSearch(_table='personal_www',
+ _op_key='eq',key=key,
+ _op_publish_the_data='eq',
+ publish_the_data='yes'), 0)
+
+ 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()
+
+ if hasattr(project,'getObject'): #obj ist aus einer catalogTrefferList
+ obj=project.getObject()
+ else:
+ obj=project
+
+ if getattr(obj,'archiveTime',actualTime)< actualTime:
+ return False
+ else:
+ return True
+
+
+ def getTree(self,dep=None,date=None,onlyActive=0,onlyArchived=0):
+ """generate Tree from project list
+ als Liste, jeder Eintrag ist ein Tupel (Tiefe, ProjektNummer, Titel, ProjektObject)
+ onlyActive = 0 : alle Projekte
+ onlyActive = 1 : nur active Projekte
+ onlyActive = 2: nur inactive Projekte
+
+ onlyArchived=0: alle Projekte
+ onlyArchived= 1 : nur aktuelle Projekte
+ onlyArchived = 2: nur archivierte Projekte
+
+ department fuer das Tree geholt werden soll
+ """
+ logging.debug("MPIWGRoot.getTree()")
+
+ returnListTmp=[]
+ returnList=[]
+
+ for project in self.getProjectFields('xdata_05',sort="int",date=date): # get Projects sorted by xdata_05
+
+ for idNr in project[1].split(";"): # more than one number
+ if not idNr=="":
+ splittedId=idNr.split(".")
+ depth=len(splittedId)
+ nr=idNr
+ #title=project[0].WEB_title
+ title=[project[0].getContent('WEB_title')]
+ #print title
+
+ if idNr[0]=="x": # kompatibilitaet mit alter Konvention, x vor der Nummer macht project inactive
+ project[0].setActiveFlag(False)
+
+ if (not dep) or (splittedId[0]==dep): #falls dep gesetzt ist nur dieses hinzufuegen.
+
+ if (onlyActive==0):
+ returnListTmp.append((depth,nr,title,project[0]))
+ elif (onlyActive==1) and project[0].isActiveProject(): #nur active projekte
+ returnListTmp.append((depth,nr,title,project[0]))
+ elif (onlyActive==2) and (not project[0].isActiveProject()): #nur active projekte
+ returnListTmp.append((depth,nr,title,project[0]))
+
+
+ #filter jetzt die Liste nach Archived oder nicht
+ for entry in returnListTmp:
+ if (onlyArchived==0):
+ returnList.append(entry)
+ elif (onlyArchived==1) and (not entry[3].isArchivedProject()): #nur active projekte
+ returnList.append(entry)
+ elif (onlyArchived==2) and (entry[3].isArchivedProject()): #nur active projekte
+ returnList.append(entry)
+
+
+ return returnList
+
+ def changePosition(self,treeId,select,RESPONSE=None):
+ """Change Postion Entry"""
+ numbers=[]
+
+ # Suche hoechste bisherige nummer
+ projects=self.getProjectFields('xdata_05') # get Projects sorted by xdata_05
+ #print "pj",projects
+ for project in projects: #suche alle subtrees der treeId
+ #print treeId
+
+ founds=re.match(treeId+"\.(.*)",project[1].split(";")[0])
+ if founds:
+ #print "x",founds.group(0),len(founds.group(0).split("."))
+ if len(founds.group(0).split("."))==len(treeId.split("."))+1: # nur ein punkt mehr, d.h. untere ebene
+ try:
+ numbers.append(int(founds.group(0).split(".")[len(founds.group(0).split("."))-1]))
+ except:
+ numbers.append(int(0))
+
+ try:
+ highest=max(numbers)
+ except:
+ highest=0
+ projects=self.showNewProjects()
+ for i in self.makeList(select):
+ highest+=10
+ projects[int(i)][0].xdata_05=treeId+"."+str(highest)
+
+ if RESPONSE is not None:
+ RESPONSE.redirect('showTree')
+
+ def changeTree(self,RESPONSE=None):
+ """change the complete tree"""
+ form=self.REQUEST.form
+ hashList={}
+ onlyArchived=int(form.get("onlyArchived",0))
+ onlyActive=int(form.get("onlyActive",0))
+ dep=form.get("dep",None)
+
+ fields=self.getTree(dep=dep,onlyArchived=onlyArchived,onlyActive=onlyActive)
+
+ logging.info("GOT TREE!----------------------------------------------------")
+ for field in form.keys():
+
+ splitted=field.split('_')
+ if (len(splitted)>1) and (splitted[1]=="runningNumber"): #feld hat die Form Nummer_name und runnignNumber
+
+
+ nr=int(splitted[0]) # nummer des Datensatzes
+ currentEntry = fields[nr]
+
+ if form.has_key(str(nr)+'_active'): # active flag is set
+ fields[nr][3].setActiveFlag(True)
+ else:
+ fields[nr][3].setActiveFlag(False)
+
+ #nummer hat sich geaendert
+
+ entryChanged = False;
+
+ if isinstance(fields[nr][3].xdata_05,list): #for some reasons somtimes the content of the field is a list with one entry.
+ fields[nr][3].xdata_05=fields[nr][3].xdata_05[0]
+
+ if not (fields[nr][3].xdata_05==form[str(nr)+'_number']):
+ logging.info("Changed!Number+++++++++++++++++++++++++++++++++")
+ logging.info(repr(fields[nr][3].xdata_05)+" ---> "+ repr(form[str(nr)+'_number']))
+ fields[nr][3].xdata_05=form[str(nr)+'_number']
+ entryChanged = True
+
+ #completed har sich geaendert
+
+ td = fields[nr][3].transformDate # hole die funktion zum transformieren des datums
+
+ if not (td(fields[nr][3].getCompletedAt())==td(form[str(nr)+'_completed'])):
+ fields[nr][3].setCompletedAt(form[str(nr)+'_completed'])
+ logging.info(repr(td(fields[nr][3].getCompletedAt()))+" ---> "+ repr(td(form[str(nr)+'_completed'])))
+ logging.info("Changed!Completed+++++++++++++++++++++++++++++++++")
+ entryChanged = True
+
+ if not (td(fields[nr][3].getStartedAt())==td(form[str(nr)+'_started'])):
+ fields[nr][3].setStartedAt(form[str(nr)+'_started'])
+
+ logging.info(repr(td(fields[nr][3].getStartedAt()))+" ---> "+ repr(td(form[str(nr)+'_started'])))
+ logging.info("Changed!Started+++++++++++++++++++++++++++++++++")
+ entryChanged = True
+
+
+ if entryChanged:
+ logging.info("Changed!+++++++++++++++++++++++++++++++++")
+ fields[nr][3].copyObjectToArchive()
+
+
+ if RESPONSE is not None:
+ RESPONSE.redirect('showTree')
+
+
+
+ def getProjectWithId(self,id):
+ fields=self.getProjectFields('xdata_05')
+ for field in fields:
+ if field[1]==id:
+ return field[0]
+
+ return None
+
+
+
+ def reindexCatalogs(self,RESPONSE=None):
+ """reindex members and project catalog"""
+
+
+ try:
+
+ self.ProjectCatalog.manage_catalogReindex(self.REQUEST,RESPONSE,self.REQUEST['URL1'])
+ logger("MPIWG Root (reindexCatalog: projects)",logging.INFO,"DONE")
+ except:
+ logger("MPIWG Root (reindexCatalog: projects)",logging.WARNING," %s %s"%sys.exc_info()[:2])
+
+ try:
+
+ self.MembersCatalog.manage_catalogReindex(self.REQUEST,RESPONSE,self.REQUEST['URL1'])
+ logger("MPIWG Root (reindexCatalog: members)",logging.INFO,"DONE")
+ except:
+ logger("MPIWG Root (reindexCatalog: members)",logging.WARNING," %s %s"%sys.exc_info()[:2])
+
+
+#
+# try:
+#
+# self.fulltextProjectsMembers.manage_catalogReindex(self.REQUEST,RESPONSE,self.REQUEST['URL1'])
+# logger("MPIWG Root (reindexCatalog: fulltextProjectsMembers)",logging.INFO,"DONE")
+# except:
+# logger("MPIWG Root (reindexCatalog: fulltextProjectsMembers)",logging.WARNING," %s %s"%sys.exc_info()[:2])
+#
+#
+#
+#
+
+
+ if RESPONSE:
+ RESPONSE.redirect('manage_main')
+
+
+
+ def getProjectsByFieldContent(self,fieldName,fieldContentsEntry, date=None):
+ """gib alle Projekte aus mit Value von field mit fieldName enthaelt ein Element der Liste fieldContents"""
+ def sort(x,y):
+ return cmp(x.WEB_title[0],y.WEB_title[0])
+
+ if type(fieldContentsEntry) is StringType:
+ fieldContentsTmp=[fieldContentsEntry]
+ else:
+ fieldContentsTmp=fieldContentsEntry
+
+ fieldContents=[]
+ for x in fieldContentsTmp:
+ fieldContents.append(" AND ".join(x.split()))
+ projects=self.ProjectCatalog({fieldName:string.join(fieldContents,' AND')})
+ #print projects
+ #ret=[x for x in projects]
+ ret=[]
+ for x in projects:
+ obj=x.getObject()
+ obj=obj.getActualVersion(date)
+ if obj and (not getattr(obj,'invisible',None)):
+ #if not (x in ret):
+ ret.append(x)
+
+ ret.sort(sort)
+ return ret
+
+
+ def getProjectFields(self,fieldName,date=None,folder=None,sort=None):
+ """getListofFieldNames"""
+ ret=[]
+
+ objects=self.ZopeFind(self.projects,obj_metatypes=['MPIWGProject'],search_sub=0)
+
+
+ for object in objects:
+ obj=object[1]
+ obj=obj.getActualVersion(date)
+ if obj and (not getattr(obj,'invisible',None)):
+ if fieldName=="WEB_title_or_short":
+
+ if len(obj.getContent('xdata_07'))<3: # hack weil z.Z. manchmal noch ein Trennzeichen ; oder , im Feld statt leer
+ fieldNameTmp="WEB_title"
+ else:
+ fieldNameTmp="xdata_07"
+ else:
+ fieldNameTmp=fieldName
+
+ ret.append((obj,obj.getContent(fieldNameTmp)))
+
+
+ if sort=="int":
+ ret.sort(sortI)
+ elif sort=="stopWords":
+
+ ret.sort(sortStopWords(self))
+
+ else:
+ ret.sort(sortF)
+
+ return ret
+
+ def showNewProjects(self):
+ projects=[]
+ for objs in self.getProjectFields('WEB_title_or_short'): # Get all Projets
+ if objs[0].xdata_05 and (objs[0].xdata_05[0] == ""):
+
+ projects.append(objs)
+
+ return projects
+
+ def generateUrlProject(self,url,project=None):
+ """erzeuge aus absoluter url, relative des Projektes"""
+ if project:
+ splitted=url.split("/")
+ length=len(splitted)
+ short=splitted[length-2:length]
+
+ base=self.REQUEST['URL3']+"/"+"/".join(short)
+
+ else:
+ findPart=url.find("/projects/")
+ base=self.REQUEST['URL1']+"/"+url[findPart:]
+
+
+ return base
+
+
+ def versionHeaderEN(self):
+ """version header text"""
+
+ date= self.REQUEST.get('date',None)
+ if date:
+ txt="""This pages shows the project which existed at %s
"""%str(date)
+ return txt
+ return ""
+
+ def versionHeaderDE(self):
+ """version header text"""
+ date= self.REQUEST.get('date',None)
+ if date:
+ txt="""Auf dieser Seite finden Sie die Projekte mit Stand vom %s
"""%str(date)
+ 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
+
+
+
diff -r e718d9a72f19 -r 4600e31a0431 SrvTxtUtils.py
--- a/SrvTxtUtils.py Tue Apr 30 16:31:57 2013 +0200
+++ b/SrvTxtUtils.py Tue Apr 30 16:35:52 2013 +0200
@@ -10,7 +10,9 @@
import urllib2
import logging
-srvTxtUtilsVersion = "1.6"
+import xml.etree.ElementTree as ET
+
+srvTxtUtilsVersion = "1.7"
map_months = {'en': [u"",
u"January",
@@ -76,7 +78,7 @@
return s.encode('utf-8')
def getText(node, recursive=0):
- """returns all text content of a node and its subnodes"""
+ """returns all text content of a (etree) node and its subnodes"""
if node is None:
return ''
@@ -99,6 +101,18 @@
return text
+
+def serialize(node):
+ """returns a string containing an XML snippet of (etree) node"""
+ s = ET.tostring(node, 'UTF-8')
+ # snip off XML declaration
+ if s.startswith('')
+ return s[i+3:]
+
+ return s
+
+
def getMonthName(mon, lang):
"""returns the name of the month mon in the language lang"""
return map_months[lang][mon]
diff -r e718d9a72f19 -r 4600e31a0431 zpt/MPIWGProject_index.zpt
--- a/zpt/MPIWGProject_index.zpt Tue Apr 30 16:31:57 2013 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,13 +0,0 @@
-
-
-
-
-
-
-
diff -r e718d9a72f19 -r 4600e31a0431 zpt/MPIWGProject_newfile.zpt
--- a/zpt/MPIWGProject_newfile.zpt Tue Apr 30 16:31:57 2013 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,18 +0,0 @@
-
-
- The title
-
-
-
-
-
-
diff -r e718d9a72f19 -r 4600e31a0431 zpt/MPIWGProject_versionManageForm.zpt
--- a/zpt/MPIWGProject_versionManageForm.zpt Tue Apr 30 16:31:57 2013 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,5 +0,0 @@
-Set invisible
-
diff -r e718d9a72f19 -r 4600e31a0431 zpt/edit_MPIWGBasis.zpt
--- a/zpt/edit_MPIWGBasis.zpt Tue Apr 30 16:31:57 2013 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,47 +0,0 @@
-
-
-
-
-
-
-
-
diff -r e718d9a72f19 -r 4600e31a0431 zpt/project/description_only_html.zpt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/zpt/project/description_only_html.zpt Tue Apr 30 16:35:52 2013 +0200
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
diff -r e718d9a72f19 -r 4600e31a0431 zpt/project/edit_basic.zpt
--- a/zpt/project/edit_basic.zpt Tue Apr 30 16:31:57 2013 +0200
+++ b/zpt/project/edit_basic.zpt Tue Apr 30 16:35:52 2013 +0200
@@ -11,28 +11,15 @@
Project Title |
- |
+ |
-
+
|
|
-
- |
-
-
- :
- found
-
- not found
-
-
-
- |
-
-
+
Project is visible |
visible (status cannot be changed, because the project has visible children.) Names
+
+ Name in project | MPIWG member object |
+
-
+
@@ -54,11 +54,11 @@
+ tal:attributes="src python:here.absolute_url()+'/description_only_html'">
+ tal:attributes="src python:here.absolute_url()+'/previewTemplate/description_only_html'">
diff -r e718d9a72f19 -r 4600e31a0431 zpt/project/edit_related_projects.zpt
--- a/zpt/project/edit_related_projects.zpt Tue Apr 30 16:31:57 2013 +0200
+++ b/zpt/project/edit_related_projects.zpt Tue Apr 30 16:35:52 2013 +0200
@@ -10,14 +10,14 @@
- up
- down
+ up
+ down
|
- |
- |
+ |
+ |
- Edit
- Delete
+ Edit
+ Delete
|
diff -r e718d9a72f19 -r 4600e31a0431 zpt/project/edit_template.zpt
--- a/zpt/project/edit_template.zpt Tue Apr 30 16:31:57 2013 +0200
+++ b/zpt/project/edit_template.zpt Tue Apr 30 16:35:52 2013 +0200
@@ -1,6 +1,7 @@
-
+
diff -r e718d9a72f19 -r 4600e31a0431 zpt/project/manage_newfile.zpt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/zpt/project/manage_newfile.zpt Tue Apr 30 16:35:52 2013 +0200
@@ -0,0 +1,17 @@
+
+
+
+
+ Header
+
+ Tabs
+
+
+ Upload new project
+
+
+
diff -r e718d9a72f19 -r 4600e31a0431 zpt/project/project_template.zpt
--- a/zpt/project/project_template.zpt Tue Apr 30 16:31:57 2013 +0200
+++ b/zpt/project/project_template.zpt Tue Apr 30 16:35:52 2013 +0200
@@ -30,8 +30,8 @@
History of Scientific Objectivity, 18th-19th Cs
- Name of
+ Name of
responsible person,
@@ -60,7 +60,7 @@
- Project description
+ Project description
| |