--- MPIWGWeb/Attic/MPIWGRoot.py 2008/06/24 11:16:27 1.1 +++ MPIWGWeb/Attic/MPIWGRoot.py 2008/09/05 14:08:24 1.1.2.16 @@ -0,0 +1,1486 @@ +from Products.PageTemplates.PageTemplateFile import PageTemplateFile +from Products.PageTemplates.PageTemplate import PageTemplate +from Products.PageTemplates.ZopePageTemplate import ZopePageTemplate +from Products.ZSQLExtend.ZSQLExtend import ZSQLExtendFolder +from Products.ZCatalog.CatalogPathAwareness import CatalogAware +from OFS.Image import Image +from Globals import package_home +import urllib +import MPIWGStaff +import string +import re +import os +from types import * +import logging +import xmlhelper # Methoden zur Verwaltung der projekt xml +from OFS.SimpleItem import SimpleItem +from OFS.Folder import Folder +from Products.ZSQLMethods.SQL import SQLConnectionIDs +from AccessControl import ClassSecurityInfo +from bibliography import * +import time +import xml.dom.minidom +import sys +from Ft.Xml.XPath import Evaluate +from Ft.Xml.XPath.Context import Context +from Ft.Xml.Domlette import NonvalidatingReader,PrettyPrint, Print +from Ft.Xml import EMPTY_NAMESPACE +import copy +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""" + + 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'] + + # 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'): + proj.responsibleScientistsList=[] + + for person in persons.items(): + + if len(person[1]) >1: #nicht eindeutig + ret+="nicht eindeutig --- %s: %s\n"%(proj.getId(),person[0]) + + elif len(person[1]) ==0: #kein eintrage + ret+="kein eintrag--- %s: %s\n"%(proj.getId(),person[0]) + proj.responsibleScientistsList.append((person[0],"")) + else: + proj.responsibleScientistsList.append((person[0],person[1][0].getObject().getKey())) + + return ret + + + def harvestProjects(self): + """harvest""" + folder="/tmp" + try: + os.mkdir("/tmp/harvest_MPIWG") + except: + pass + founds=self.ZopeFind(self.aq_parent.projects,obj_metatypes=['MPIWGProject'],search_sub=1) + for found in founds: + txt=found[1].harvest_page() + + if txt and (txt != ""): + name=found[0].replace("/","_") + fh=file("/tmp/harvest_MPIWG/"+name,"w") + fh.write(txt) + fh.close() + + def decode(self,str): + """decoder""" + + if not str: + return "" + if type(str) is StringType: + try: + return str.decode('utf-8') + except: + return str.decode('latin-1') + else: + return str + + + def getat(self,array,idx=0,default=None): + """return array element idx or default (but no exception)""" + if len(array) <= idx: + return default + else: + return array[idx] + + + def browserCheck(self): + """check the browsers request to find out the browser type""" + bt = {} + ua = self.REQUEST.get_header("HTTP_USER_AGENT") + bt['ua'] = ua + bt['isIE'] = False + bt['isN4'] = False + if string.find(ua, 'MSIE') > -1: + bt['isIE'] = True + else: + bt['isN4'] = (string.find(ua, 'Mozilla/4.') > -1) + + try: + nav = ua[string.find(ua, '('):] + ie = string.split(nav, "; ")[1] + if string.find(ie, "MSIE") > -1: + bt['versIE'] = string.split(ie, " ")[1] + except: pass + + bt['isMac'] = string.find(ua, 'Macintosh') > -1 + bt['isWin'] = string.find(ua, 'Windows') > -1 + bt['isIEWin'] = bt['isIE'] and bt['isWin'] + bt['isIEMac'] = bt['isIE'] and bt['isMac'] + bt['staticHTML'] = False + + return bt + + + def versionHeaderEN(self): + """version header text""" + + date= self.REQUEST.get('date',None) + if date: + txt="""
%s
\n"%project[0]) + + def replaceNotEmpty(self,format,field): + """replace not empty""" + if field and (not field.lstrip()==''): + 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', + publish_the_data='yes')) + + logging.info("ACTIVE_MEMBER %s"%ret) + if ret: + return True + else: + return False + + 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' + + return urllib.urlopen(request['URL1']+'/index_html').read() + + + def formatBibliography(self,here,found): + """format""" + return formatBibliography(here,found) + + def getValue(self,fieldStr): + """Inhalt des Feldes""" + + if type(fieldStr)==StringType: + field=fieldStr + else: + field=fieldStr[0] + try: + if field[len(field)-1]==";": + field=field[0:len(field)-1] + except: + + """nothing""" + field=re.sub(r';([^\s])','; \g<1>',field) + return field.encode('utf-8') + + + + def sortedNames(self,list): + """sort names""" + + def sortLastName(x_c,y_c): + try: + x=urllib.unquote(x_c).encode('utf-8','ignore') + except: + x=urllib.unquote(x_c) + + try: + y=urllib.unquote(y_c).encode('utf-8','ignore') + except: + x=urllib.unquote(y_c) + + + + try: + last_x=x.split()[len(x.split())-1] + last_y=y.split()[len(y.split())-1] + + except: + + last_x="" + last_y="" + + + + if last_xNeueinträge erscheinen erst auf der Homepage, wenn ihnen eine e-mail Adresse zugeordnet wurde.
" + ret+="Neueinträge erscheinen erst auf der Homepage, wenn ihnen eine e-mail Adresse zugeordnet wurde.
" + ret+="Wenn nötig in Filemaker-db ändern:
" + + # konflicte + for conflict in conflicts.keys(): + ignoreEntries=[] + displayIgnored=[] + for cf in conflicts[conflict]: + if args[conflict.encode('utf-8')+'_'+cf[0]]=="stored": #use the stored one + ignoreEntries.append(cf[0]) #so ignore field cf[0] + displayIgnored.append(cf) + if len(displayIgnored)>0: + ret+="%s | %s | %s | "%(iE[0].encode('utf-8'),iE[1].encode('utf-8'),iE[2].encode('utf-8')) + ret+="" + + self.updatePersonEntry(resultSet[conflict],ignoreEntries=ignoreEntries) + + # rest + cl=list(conflicts.keys()) + + for key in resultSet.keys(): + if key not in cl: + self.updatePersonEntry(resultSet[key]) + return ret+"