--- MPIWGWeb/Attic/MPIWGRoot.py 2008/06/25 06:41:25 1.1.2.2
+++ MPIWGWeb/Attic/MPIWGRoot.py 2008/09/05 14:08:24 1.1.2.16
@@ -30,26 +30,145 @@ import updatePersonalWWW
import MPIWGStaff
from MPIWGHelper import *
+
+def sortWeight(x,y):
+ x1=int(getattr(x[1],'weight','0'))
+ y1=int(getattr(y[1],'weight','0'))
+ return cmp(x1,y1)
+
+
class MPIWGRoot(ZSQLExtendFolder):
"""Stammordner fuer den Web-Server"""
- fieldLabels={'WEB_title':'WEB_Title','xdata_01':'Responsible Scientists','xdata_02':'Department',
- 'xdata_03':'Historical Persons','xdata_04':'Time period',
- 'xdata_05':'Sorting number','xdata_06':'Keywords','xdata_07':'Short title',
- 'xdata_08':'Other involved scholars' ,'xdata_09':'Disciplines','xdata_10':'Themes',
- 'xdata_11':'Object Digitallibrary','xdata_12':'Cooperation partners',
- 'xdata_13':'Funding institutions','WEB_project_header':'WEB_project_header',
- 'WEB_project_description':'WEB_project_description','WEB_related_pub':'WEB_related_pub'}
+ meta_type='MPIWGRoot'
+
+ fieldLabels={'WEB_title':'WEB_Title',
+ 'xdata_01':'Responsible Scientists',
+ 'xdata_02':'Department',
+ 'xdata_03':'Historical Persons',
+ 'xdata_04':'Time period',
+ 'xdata_05':'Sorting number',
+ 'xdata_06':'Keywords',
+ 'xdata_07':'Short title',
+ 'xdata_08':'Other involved scholars' ,
+ 'xdata_09':'Disciplines',
+ 'xdata_10':'Themes',
+ 'xdata_11':'Object Digitallibrary',
+ 'xdata_12':'Cooperation partners',
+ 'xdata_13':'Funding institutions',
+ 'WEB_project_header':'WEB_project_header',
+ 'WEB_project_description':'WEB_project_description',
+ 'WEB_related_pub':'WEB_related_pub'}
folders=['MPIWGProject','Folder','ECHO_Navigation']
- meta_type='MPIWGRoot'
+ # types of objects that show up in navigation
+ nav_meta_types = ['MPIWGTemplate','MPIWGLink','MPIWGFolder']
+
+ def getGetNeighbourhood(self,obj, wordStr, length=100,tagging=True):
+ """finde umgebung um die worte in wordStr, zurueckgegeben wird eine Array mit den Umgebungen von Fundstellen der Worte
+ alle Tags werden entfernt, die Fundstellen werden mit XX getaggt, die Umgebungen werden
+ case insensitive gesucht
+ @param wordStr: string mit Worten getrennt durch Leerzeichen, Phrasen sind mit " gekennzeichnet
+ "eine phrase", "*" bezeichnet wildcards und wird ignoriert"
+ @param length: optional, default wert 100, 2*length ist die groesse der Umgebung
+ @param tagging: optional default wert true, kein span tag wird erzweugt falls tag=false
+ """
+
+ ret=[] # nimmt das Array auf, dass spaeter zurueckgegeben wird
+ ranges=[] #Array mit tupeln x,y wobei x die Position des Anfang und y des Endes der i-ten Umgebung angiebt
+
+ def isInRanges(nr,length):
+ """test ob eine gegeben Position nr schon irgendwo in einer Umgebung ist, gibt den Index des ersten Wertes aus ranges zurueck,
+ -1, wenn kein Treffer
+
+ @param nr: Position die geprueft werden soll
+ @param length: Laenge des Wortes das geprueft werden soll
+ """
+ for x in ranges:
+ if (x[0]<=nr) and (nr < (x[1]-length)):
+ return ranges.index(x)
+ return -1
+
+ # deal with phrases, in Phrasen werden die Leerzeichen durch "_" ersetzt.
+ def rep_empty(str):
+ x= re.sub(" ","_",str.group(0))
+ return re.sub("\"","",x)
+
+ wordStr=re.sub("\".*?\"", rep_empty,wordStr)#ersetze leerzeichen in " " durch "_" und loesche "
+
+ #deal with wildcards, for our purposes it is enough to delete the wildcard
+ wordStr=wordStr.replace("*","")
+
+ words=wordStr.split(" ")
+ #if not words is ListType:
+ # words=[words]
+
+ txt=obj.harvest_page()
+ if not txt:
+ return ret
+ txt=re.sub("<.*?>", "", txt) # loesche alle Tags
+ for word in words:
+ word=re.sub("_"," ",word) # ersetze zurueck "_" durch " "
+ pos=0
+
+ n=txt.lower().count(word.lower()) # wie oft tritt das Wort auf
+
+ for i in range(n):
+ pos=txt.lower().find(word.lower(),pos)
+
+ if pos > 0:
+ x=max(0,pos-length)
+ y=min(len(txt),pos+length)
+
+
+ #is word already in one of the results
+ nr=isInRanges(pos,len(word))
+ if nr >=0:# word ist in einer schon gefunden Umgebung, dann vergroessere diese
+ x=min(ranges[nr][0],x)
+ y=max(ranges[nr][1],y)
+
+ str=txt[x:y]
+
+ if nr >=0: # word ist in einer schon gefunden Umgebung
+ ranges[nr]=(x,y) # neue Position der Umgebung
+
+ ret[nr]=str # neue Umgebung
+ else: # andernfalls neue Umgebung hinzufuegen
+ ranges.append((x,y))
+
+ ret.append(str)
+
+ pos=pos+len(word)
+ else:
+ break;
+
+ # now highlight everything
+ if tagging:
+ for x in range(len(ret)):
+ for word in words:
+ repl=re.compile(word,re.IGNORECASE)
+ ret[x]=repl.sub(""" %s"""%word.upper(),ret[x])
+
+ return ret
+ def copyAllImagesToMargin(self):
+ """tranformiere alle Bilder in die Margins"""
+ projects=self.getTree()
+ ret=""
+ for project in projects:
+ proj=project[3]
+ try:
+ persons=proj.copyImageToMargin();
+ except:
+ logging.error("Cannnot do: %s"%repr(project))
+
def transformProjectsToId(self):
"""trnasformiere zu ID, Hilfsfunktion die die alten Templates analysiert und mit der neuen Liste
verantwortlicher Personen versieht"""
projects=self.getTree()
ret=""
for project in projects:
+
proj=project[3]
persons=proj.identifyNames(proj.getContent('xdata_01'))
if not hasattr(proj,'responsibleScientistsList'):
@@ -67,6 +186,7 @@ class MPIWGRoot(ZSQLExtendFolder):
proj.responsibleScientistsList.append((person[0],person[1][0].getObject().getKey()))
return ret
+
def harvestProjects(self):
"""harvest"""
@@ -87,6 +207,7 @@ class MPIWGRoot(ZSQLExtendFolder):
def decode(self,str):
"""decoder"""
+
if not str:
return ""
if type(str) is StringType:
@@ -207,11 +328,6 @@ class MPIWGRoot(ZSQLExtendFolder):
def subNavStatic(self,obj):
"""subnav" von self"""
- def sortWeight(x,y):
- x1=int(getattr(x[1],'weight','0'))
- y1=int(getattr(y[1],'weight','0'))
- return cmp(x1,y1)
-
subs=self.ZopeFind(obj,obj_metatypes=['MPIWGTemplate','MPIWGLink'])
subret=[]
@@ -223,10 +339,6 @@ class MPIWGRoot(ZSQLExtendFolder):
def subNav(self,obj):
"""return subnav elemente"""
- def sortWeight(x,y):
- x1=int(getattr(x[1],'weight','0'))
- y1=int(getattr(y[1],'weight','0'))
- return cmp(x1,y1)
#if obj.meta_type in ['MPIWGTemplate','MPIWGLink']:
# id=obj.aq_parent.getId()
#else:
@@ -245,7 +357,7 @@ class MPIWGRoot(ZSQLExtendFolder):
if hasattr(self,obj.getId()):
- subs=self.ZopeFind(getattr(self,obj.getId()),obj_metatypes=['MPIWGTemplate','MPIWGLink'])
+ subs=self.ZopeFind(getattr(self,obj.getId()),obj_metatypes=self.nav_meta_types)
subret=[]
for x in subs:
@@ -256,6 +368,10 @@ class MPIWGRoot(ZSQLExtendFolder):
else:
return None
+ def isType(self,object,meta_type):
+ """teste ob ein object vom meta_type ist."""
+ return (object.meta_type==meta_type)
+
def isActive(self,name):
"""teste ob subnavigation aktiv"""
for part in self.REQUEST['URL'].split("/"):
@@ -263,21 +379,14 @@ class MPIWGRoot(ZSQLExtendFolder):
return True
return False
- def getSection(self):
- """returns the current section name"""
- root = self.absolute_url()
- url = self.REQUEST['URL']
- if not url:
- return None
- path = string.replace(url, root, '')
- paths = path.split('/')
- if len(paths) > 0:
- sec = paths[1]
- if sec.find('.') < 0:
- return sec
- else:
- return None
- return None
+
+ def getSections(self):
+ """returns a list of all sections i.e. top-level MPIWGFolders"""
+ secs = self.objectItems(['MPIWGFolder'])
+ secs.sort(sortWeight)
+ #logging.debug("root: %s secs: %s"%(repr(self.absolute_url()), repr(secs)))
+ # return pure list of objects
+ return [s[1] for s in secs]
def getSectionStyle(self, name, style=""):
"""returns a string with the given style + '-sel' if the current section == name"""
@@ -286,6 +395,15 @@ class MPIWGRoot(ZSQLExtendFolder):
else:
return style
+ def getFeatures(self):
+ """returns a list of all Features"""
+ dir = getattr(self, 'features')
+ features = dir.objectItems(['MPIWGFeature'])
+ features.sort(sortWeight)
+ # return pure list of objects
+ return [f[1] for f in features]
+
+
def MPIWGrootURL(self):
"""returns the URL to the root"""
return self.absolute_url()
@@ -310,13 +428,14 @@ class MPIWGRoot(ZSQLExtendFolder):
def replaceNotEmpty(self,format,field):
"""replace not empty"""
if field and (not field.lstrip()==''):
- return format%field
+ return self.decode(format%field)
else:
return ""
def isActiveMember(self,key):
"""tested ob Mitarbeiter key ist aktiv"""
+ key=utf8ify(key)
ret=self.getat(self.ZSQLInlineSearch(_table='personal_www',
_op_key='eq',key=key,
_op_publish_the_data='eq',
@@ -483,18 +602,22 @@ class MPIWGRoot(ZSQLExtendFolder):
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:
- splitted=parents.split(".")
- parentId=string.join(splitted[0:len(splitted)-1],".")
-
- for project in self.getProjectFields('xdata_05',sort='int',date=date):
- if project[1]==parentId:
- ret.append(project)
+ 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):
@@ -510,7 +633,10 @@ class MPIWGRoot(ZSQLExtendFolder):
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 getProjectFields(self,fieldName,date=None,folder=None,sort=None):
"""getListofFieldNames"""
@@ -561,7 +687,7 @@ class MPIWGRoot(ZSQLExtendFolder):
{'label':'Reindex catalogs','action':'reindexCatalogs'},
{'label':'Main config','action':'changeMPIWGRootForm'},
{'label':'add e-mails','action':'showNewDBEntries'},
- {'label':'update the institutsbibliography','action':'updateInstitutsbiliography'},
+ {'label':'update the institutsbibliography','action':'DONE