--- MPIWGWeb/MPIWGProjects.py 2004/11/03 17:33:31 1.41
+++ MPIWGWeb/MPIWGProjects.py 2005/09/15 12:57:41 1.47.2.23
@@ -1,11 +1,13 @@
"""This contains the class MPIWG Projects
-for organizing and maintaining the different projectspages
+for organizing and maintaining the different project pages
"""
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
@@ -14,11 +16,13 @@ import re
import os
from types import *
import zLOG
-import xmlhelper # Methoden zur Verwaltung der projekt xmls
+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
definedFields=['WEB_title','xdata_01','xdata_02','xdata_03','xdata_04','xdata_05','xdata_06','xdata_07','xdata_08','xdata_09','xdata_10','xdata_11','xdata_12','xdata_13','WEB_project_header','WEB_project_description','WEB_related_pub']
@@ -33,7 +37,7 @@ def sortF(x,y):
try:
return cmp(str(x[1]),str(y[1]))
except:
- print "error",x[1],y[1]
+
return 0
def sortI(x,y):
@@ -58,11 +62,111 @@ def sortI(x,y):
except:
return cmp(x[1],y[1])
+class MPIWGLink(SimpleItem):
+ """create a symbolic link to another page"""
+
+ meta_type="MPIWGLink"
+
+ def isActiveItem(self):
+ """teste ob ausgewaehlt"""
+ #url1 beim link anstelle von url1, da link jeweils index_html als url hat.
+ if self.absolute_url()==self.REQUEST['URL1']:
+ return "aktiv"
+ else:
+ return ""
+
+ def __init__(self,id,link,title='',weight=''):
+ """init mpiwglink"""
+ self.id=id
+ self.link=link
+ self.title=title
+ self.weight=weight
+
+ def getObj(self):
+ """bekomme original"""
+ ## objpath=self.link.replace("/",".")
+## if objpath[0]!=".":
+## objpath="."+objpath
+
+## print objpath
+## return eval("self"+objpath)
+
+
+ splitted=self.link.lstrip().split("/")
+ obj=self
+ for x in splitted:
+ if not x=="":
+ obj=getattr(obj,x)
+
+ return obj
+
+ def getWeight(self):
+ if self.linkWeight and linkWeight!="":
+ return self.linkWeight
+ else:
+ return self.getObj().weight
+
+ manage_options=SimpleItem.manage_options+(
+ {'label':'main config','action':'changeLinkForm'},
+ )
+
+
+ def changeLinkForm(self):
+ """change MPIWG link"""
+ pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','MPIWGLinkChange.zpt')).__of__(self)
+ return pt()
+
+ def changeLink(self,link,title,weight,RESPONSE=None):
+ """change links"""
+ self.link=link
+ self.title=title
+ self.weight=weight
+
+ if RESPONSE is not None:
+ RESPONSE.redirect('manage')
+
+ def index_html(self):
+ """index"""
+
+ return self.getObj().pt_render(extra_context={'here':self})
+
+
+def manage_addMPIWGLinkForm(self):
+ """Form for adding link"""
+ pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt/AddMPIWGLink.zpt')).__of__(self)
+ return pt()
+
+def manage_addMPIWGLink(self,id,link,title,weight,RESPONSE=None):
+ """add link"""
+ newObj=MPIWGLink(id,link,title,weight)
+
+ self._setObject(id,newObj)
+
+ if RESPONSE is not None:
+ RESPONSE.redirect('manage_main')
+
+
class MPIWGTemplate(ZopePageTemplate):
"""Create a layout Template for different purposes"""
meta_type="MPIWGTemplate"
+ manage_options=ZopePageTemplate.manage_options+(
+ {'label':'Change Weight','action':'changeWeightForm'},
+ )
+
+ def changeWeightForm(self):
+ """change weight form"""
+ pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','MPIWGTemplateChangeWeight.zpt')).__of__(self)
+ return pt()
+
+ def changeWeight(self,weight,RESPONSE=None):
+ """change weight"""
+ self.weight=weight
+ if RESPONSE is not None:
+ RESPONSE.redirect('manage')
+
+
def __init__(self, id, text=None, content_type=None,MPIWGType=None):
self.id = str(id)
@@ -78,7 +182,13 @@ class MPIWGTemplate(ZopePageTemplate):
"""change form"""
-
+ def isActiveItem(self):
+ """teste ob ausgewaehlt"""
+ if self.absolute_url()==self.REQUEST['URL']:
+ return "aktiv"
+ else:
+ return ""
+
def manage_addMPIWGTemplateForm(self):
"""Form for adding"""
pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt/AddMPIWGTemplate.zpt')).__of__(self)
@@ -87,7 +197,7 @@ def manage_addMPIWGTemplateForm(self):
from urllib import quote
-def manage_addMPIWGTemplate(self, MPIWGType,id, title=None,REQUEST=None):
+def manage_addMPIWGTemplate(self, MPIWGType,id, title=None,weight=0,REQUEST=None):
"Add a Page Template with optional file content."
if type(MPIWGType)==StringType:
MPIWGTypes=[MPIWGType]
@@ -122,7 +232,9 @@ def manage_addMPIWGTemplate(self, MPIWGT
except AttributeError:
u = REQUEST['URL1']
-
+ ob = getattr(self, id)
+ ob.weight=weight
+
REQUEST.RESPONSE.redirect(u+'/manage_main')
return ''
@@ -133,7 +245,7 @@ class MPIWGRoot(ZSQLExtendFolder):
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':'Part of','xdata_10':'Covered by',
+ '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'}
@@ -141,6 +253,99 @@ class MPIWGRoot(ZSQLExtendFolder):
folders=['MPIWGProject','Folder','ECHO_Navigation']
meta_type='MPIWGRoot'
+ 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 queryLink(self,link):
+ """append querystring to the link"""
+ return "%s?%s"%(link,self.REQUEST.get('QUERY_STRING',''))
+
+ def getKategory(self,url):
+ """kategorie"""
+ 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 reset:
+ self.REQUEST['capital']="A"
+ return True
+ else:
+ if len(text)>0 and not (text[0]==self.REQUEST['capital']):
+ self.REQUEST['capital']=text[0]
+ return True
+ else:
+ return False
+
+ 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:
+
+ #id=obj.getId()
+
+
+ #suche die zweite ebene
+ if not obj.aq_parent.getId() in ['de','en']:
+ obj=obj.aq_parent
+
+ while not self.ZopeFind(self,obj_ids=[obj.getId()]):
+ obj=obj.aq_parent
+
+ if hasattr(self,obj.getId()):
+
+ subs=self.ZopeFind(getattr(self,obj.getId()),obj_metatypes=['MPIWGTemplate','MPIWGLink'])
+ subret=[]
+
+ for x in subs:
+ if not(x[1].title==""):
+ subret.append(x)
+ subret.sort(sortWeight)
+ return subret
+ else:
+ return None
+
+ def isActive(self,name):
+ """teste ob subnavigation aktiv"""
+ for part in self.REQUEST['URL'].split("/"):
+ if part==name:
+ return True
+ return False
+
+
def upDateSQL(self,fileName):
"""updates SQL databases using fm.jar"""
fmJarPath=os.path.join(package_home(globals()), 'updateSQL/fm.jar')
@@ -160,12 +365,22 @@ class MPIWGRoot(ZSQLExtendFolder):
def replaceNotEmpty(self,format,field):
"""replace not empty"""
- if field and (not field==''):
+ if field and (not field.lstrip()==''):
return format%field
else:
return ""
+ def isActual(self,project):
+ """checke if project is actual"""
+ actualTime=time.localtime()
+ obj= project.getObject()
+
+ if getattr(obj,'archiveTime',actualTime)< actualTime:
+ return False
+ else:
+ return True
+
def redirectIndex_html(self,request):
#return request['URL1']+'/index_html'
@@ -286,7 +501,8 @@ class MPIWGRoot(ZSQLExtendFolder):
list[urllib.quote(personNormal)]=(personNormal,[project[1]])
except:
- print "ERROR",project
+ zLOG.LOG("MPIWG Web (harvestHistoricalPerson)",zLOG.ERROR,"cannot annalyize: %s"%repr(project))
+
return list
@@ -317,34 +533,51 @@ class MPIWGRoot(ZSQLExtendFolder):
def showHistoricalPersons(self):
"""show persons"""
- pt=PageTemplateFile('Products/MPIWGWeb/zpt/showHistoricalPersons').__of__(self)
+ pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','showHistoricalPersons')).__of__(self)
return pt()
def editHistoricalPersonsForm(self):
"""edit historical persons for consistency"""
- pt=PageTemplateFile('Products/MPIWGWeb/zpt/editHistoricalPersonsForm').__of__(self)
+ pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','editHistoricalPersonsForm')).__of__(self)
return pt()
- def getProjectsByFieldContent(self,fieldName,fieldContentsEntry):
+ def getProjectsByFieldContent(self,fieldName,fieldContentsEntry, date=None):
"""gib alle Projekte aus mit Value von field mit fieldName enthält ein Element der Liste fieldContents"""
- if type(fieldContentsEntry) is StringType:
- fieldContents=[fieldContentsEntry]
+ def sort(x,y):
+ return cmp(x.WEB_title[0],y.WEB_title[0])
+
+ if type(fieldContentsEntry) is StringType:
+ fieldContentsTmp=[fieldContentsEntry]
else:
- fieldContents=fieldContentsEntry
-
- projects=self.ProjectCatalog({fieldName:string.join(fieldContents,' OR')})
+ fieldContentsTmp=fieldContentsEntry
+
+ fieldContents=[]
+ for x in fieldContentsTmp:
+ fieldContents.append(" AND ".join(x.split()))
+ projects=self.ProjectCatalog({fieldName:string.join(fieldContents,' AND')})
#print projects
- return 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"""
- pt=PageTemplateFile('Products/MPIWGWeb/zpt/changeMPIWGRootForm').__of__(self)
+ pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','changeMPIWGRootForm')).__of__(self)
return pt()
- def changeMPIWGRoot(self,title,disciplineList,themesList,RESPONSE=None):
+ def changeMPIWGRoot(self,title,disciplineList,themesList,connection_id,RESPONSE=None):
"""change"""
self.title=title
+ self.connection_id=connection_id
self.disciplineList=disciplineList
self.themesList=themesList
@@ -353,29 +586,32 @@ class MPIWGRoot(ZSQLExtendFolder):
def getDisciplineList(self):
"""get disciplines as list"""
- return self.disciplineList.split("\n")
+ list= self.disciplineList.split("\n")
+ return [x.rstrip().lstrip() for x in list]
def getThemeList(self):
"""get themes as list"""
- return self.themesList.split("\n")
+ list= self.themesList.split("\n")
+ return [x.rstrip().lstrip() for x in list]
def test(self):
"""test"""
return self.getProjectsByFieldContent('xdata_09',['biology'])[0].absolute_url
- def getContexts(self,childs=None,parents=None,depth=None):
+ def getContexts(self,childs=None,parents=None,depth=None,date=None):
"""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'):
+ for project in self.getProjectFields('xdata_05',sort='int',date=date):
if project[1]==parentId:
ret.append(project)
if childs:
- for project in self.getProjectFields('xdata_05',sort='int'):
+ for project in self.getProjectFields('xdata_05',sort='int',date=date):
searchStr=childs+"(\..*)"
if re.match(searchStr,project[1]):
@@ -388,17 +624,17 @@ class MPIWGRoot(ZSQLExtendFolder):
ret.append(project)
return ret
- def getProjectFields(self,fieldName,folder=None,sort=None):
+ def getProjectFields(self,fieldName,date=None,folder=None,sort=None):
"""getListofFieldNames"""
ret=[]
- objects=self.ZopeFind(self,obj_metatypes=['MPIWGProject'],search_sub=1)
+ objects=self.ZopeFind(self.projects,obj_metatypes=['MPIWGProject'],search_sub=0)
for object in objects:
obj=object[1]
-
- if not getattr(obj,'invisible',None):
+ 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
@@ -421,7 +657,7 @@ class MPIWGRoot(ZSQLExtendFolder):
def showNewProjects(self):
projects=[]
for objs in self.getProjectFields('WEB_title_or_short'): # Get all Projets
- if objs[0].xdata_05[0] == "":
+ if objs[0].xdata_05 and (objs[0].xdata_05[0] == ""):
projects.append(objs)
@@ -437,7 +673,7 @@ class MPIWGRoot(ZSQLExtendFolder):
def importNamesForm(self):
"""Form"""
- pt=PageTemplateFile('Products/MPIWGWeb/zpt/MPIWGNamesForm.zpt').__of__(self)
+ pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','MPIWGNamesForm.zpt')).__of__(self)
return pt()
def importNames(self,fileupload,folderName,RESPONSE=None):
@@ -458,7 +694,8 @@ class MPIWGRoot(ZSQLExtendFolder):
project._setObject(splitted[0],newObj)
#print "done:",splitted[0]
except:
- print "not done:",splitted[0]
+ zLOG.LOG("MPIWG Web (importNames)",zLOG.INFO,"cannot import: %s"%splitted[0])
+
if RESPONSE is not None:
RESPONSE.redirect('manage_main')
@@ -490,9 +727,11 @@ class MPIWGRoot(ZSQLExtendFolder):
if member[1].getId() not in foundUserNames:
member[1].aq_parent.manage_delObjects(ids=[member[1].getId()])
RESPONSE.write("deleted:%s
\n"%member[1].getId())
-
- self.MembersCatalog.manage_catalogReindex(self.REQUEST,RESPONSE,self.REQUEST['URL1'])
-
+ try:
+ self.MembersCatalog.manage_catalogReindex(self.REQUEST,RESPONSE,self.REQUEST['URL1'])
+ except:
+ pass
+ self.ProjectCatalog.manage_catalogReindex(self.REQUEST,RESPONSE,self.REQUEST['URL1'])
if RESPONSE is not None:
@@ -532,10 +771,11 @@ class MPIWGRoot(ZSQLExtendFolder):
return entry
- def getTree(self):
+ def getTree(self,date=None):
"""generate Tree from project list"""
+
returnList=[]
- for project in self.getProjectFields('xdata_05',sort="int"): # get Projects sorted by xdata_05
+ 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=="":
@@ -545,11 +785,65 @@ class MPIWGRoot(ZSQLExtendFolder):
#title=project[0].WEB_title
title=[project[0].getContent('WEB_title')]
#print title
- returnList.append((depth,nr,title,project[0]))
+ if idNr[0]!="x":
+ returnList.append((depth,nr,title,project[0]))
return returnList
+ def formatElementsAsList(self,elements):
+ """formatiere tree als liste"""
+
+ actualDepth=0
+ ret=""
+ for element in elements:
+ if (element[0]>actualDepth):
+ #fuege soviele ul ein wie unterschied in tiefe
+ if element[0]==1:
+ ret+="""\n
\n"""
+ else:
+ for i in range(element[0]-actualDepth):
+ if i>0:
+ ret+="- "
+ ret+="""
\n"""
+
+ actualDepth=element[0]
+
+ elif (element[0]
\n"
+
+ #ret+="
\n\n\n\n"
+
+ if element[0]==1:
+ department=int(element[3].getContent('xdata_05'))-1
+
+ ret+="""
\n"""
+ if department==4: #hack
+ department=3
+
+ ret+="""
+ \n
\n
+ """%department
+
+ actualDepth=element[0]
+ else:
+ ret+="""\n\n"""
+ ret+="""- \n"""
+
+ if actualDepth==1:
+ departmentName={'1':'Department I','2':'Department II','3':'Department III', '4':'Ind. Research Group','5':'Ind. Research Group'}
+ department=element[3].getContent('xdata_05')
+ ret+="""
%s: """%(department,departmentName[department])
+
+ if self.REQUEST.has_key('date'):
+ ret+="""%s"""%(self.generateUrlProject(element[3].absolute_url())+"/index.html",self.REQUEST['date'],element[3].getContent('WEB_title'))
+ else:
+ ret+="""%s"""%(self.generateUrlProject(element[3].absolute_url())+"/index.html",element[3].getContent('WEB_title'))
+ return ret
+
def formatElementForOverview(self,element):
"""format the element for output in overview"""
if element[0]==1: #department
@@ -608,8 +902,9 @@ class MPIWGRoot(ZSQLExtendFolder):
for idNr in form.keys():
- fields[int(idNr)][3].xdata_05=form[idNr]
-
+ if not (fields[int(idNr)][3].xdata_05==form[idNr]):
+ fields[int(idNr)][3].xdata_05=form[idNr]
+ fields[int(idNr)][3].copyObjectToArchive()
if RESPONSE is not None:
@@ -689,17 +984,17 @@ class MPIWGRoot(ZSQLExtendFolder):
ret.append("%s"%person)
return string.join(ret,";")
- def getProjectsOfMembers(self):
+ def getProjectsOfMembers(self,date=None):
"""give tuple member /projects"""
ret=[]
members=self.getAllMembers()
#return str(members)
for x in members:
- ret+=self.getProjectsOfMember(name=x)
+ ret+=self.getProjectsOfMember(name=x,date=date)
return ret
- def getProjectsOfMember(self,name=None,email=None):
+ def getProjectsOfMember(self,name=None,email=None,date=None):
"""get project of a member"""
def sortP(x,y):
"""sort by sorting number"""
@@ -710,8 +1005,8 @@ class MPIWGRoot(ZSQLExtendFolder):
ret=[]
splitNeu=[]
if email:
- #print "IIII:",self.getId()
- members=self.ZopeFind(self,obj_metatypes=['MPIWGStaff'],obj_ids=[email],search_sub=1)
+
+ members=self.ZopeFind(self.members,obj_metatypes=['MPIWGStaff'],obj_ids=[email],search_sub=1)
name = members[0][1].title.decode('utf-8')
y=name
@@ -728,8 +1023,7 @@ class MPIWGRoot(ZSQLExtendFolder):
if proj:
proj2=[]
for x in proj:
-
- if not getattr(x.getObject(),'invisible',None):
+ if (not getattr(x.getObject(),'invisible',None)) and (getattr(x.getObject(),'archiveTime','')==''):
if not((splitted[1]==" Christoph") and (splitted[0]=="Hoffmann") and (str(x.WEB_title).find('Einstein')>0)):
proj2.append(x)
@@ -740,8 +1034,8 @@ class MPIWGRoot(ZSQLExtendFolder):
if proj:
names=[x.WEB_title for x in proj]
for x in proj:
-
- if not x.WEB_title in names:
+
+ if (not x.WEB_title in names) and (getattr(x.getObject(),'archiveTime','')==''):
proj2.append(x)
@@ -831,23 +1125,344 @@ class MPIWGRoot(ZSQLExtendFolder):
def manage_addMPIWGRootForm(self):
"""form for adding the root"""
- pt=PageTemplateFile('Products/MPIWGWeb/zpt/addMPIWGRootForm.zpt').__of__(self)
+ pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addMPIWGRootForm.zpt')).__of__(self)
return pt()
-def manage_addMPIWGRoot(self,id,title,RESPONSE=None):
+def manage_addMPIWGRoot(self,id,title,connection_id="",RESPONSE=None):
"""add a root folder"""
newObj=MPIWGRoot(id,title)
self._setObject(id,newObj)
-
+ ob=getattr(self,id)
+ setattr(ob,'connection_id',connection_id)
if RESPONSE is not None:
RESPONSE.redirect('manage_main')
-class MPIWGProject(Folder):
+class MPIWGProject_publication(SimpleItem):
+ """publications object fuer project"""
+
+ meta_type="MPIWGProject_publication"
+
+ def editPublication(self,text=None,RESPONSE=None):
+ """edit a publication"""
+
+ if (not text):
+ pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','edit_publicationForm.zpt')).__of__(self)
+ return pt()
+
+
+ self.text=text[0:]
+
+ if RESPONSE:
+ RESPONSE.redirect("../managePublications")
+
+class MPIWGProject_image(Image):
+ """Images for Projects"""
+
+ meta_type="MPIWGProject_image"
+
+ def showImage(self,imageUrl=None):
+ """show Images at an extra page"""
+ self.getContent('WEB_project_description',filter='yes') #get the content and store image infos into session
+ pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','projectImageView.zpt')).__of__(self)
+ return pt()
+
+ def editImage(self,file=None,caption=None,RESPONSE=None):
+ """edit the Image"""
+ if (not file) and (not caption):
+ pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','edit_imageForm.zpt')).__of__(self)
+ return pt()
+
+ if file and (not file.filename.lstrip().rstrip()==""):
+ self.manage_upload(file)
+
+ if caption:
+ self.caption=caption[0:]
+
+ if RESPONSE:
+ RESPONSE.redirect("../manageImages")
+
+class MPIWGProject(CatalogAware,Folder):
"""Class for Projects"""
+
+ security=ClassSecurityInfo()
meta_type='MPIWGProject'
+ default_catalog='ProjectCatalog'
+
+ 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))
+
+ founds=self.ZopeFind(self,obj_metatypes=[metatype]);
+
+ founds.sort(sort)
+
+ 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)
+
+ if RESPONSE:
+ RESPONSE.redirect('managePublications')
+
+
+ def copyImageToMargin(self,RESPONSE=None):
+ """copy inline images to marginal images"""
+ self.getContent('WEB_project_description',filter='yes')
+
+ filename=self.imageURL.split("/")[-1]
+ #lege neues images object an, mit leerem bild
+
+ if self.ZopeFind(self,obj_ids=[filename]):
+ #existiert das bild schon, dann neueun filenamen
+ filename="project_image_"+filename
+
+ self.addImage(None,self.imagecap,filename=filename)
+ #hole die bilddaten aus der url
+ data=urllib.urlopen(self.absolute_url()+"/"+self.imageURL).read()
+
+ obj=getattr(self,filename)
+ obj.update_data(data)
+
+ if RESPONSE:
+ RESPONSE.redirect('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(os.path.join(package_home(globals()),'zpt','MPIWGProject_manageImagesForm.zpt')).__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(os.path.join(package_home(globals()),'zpt','MPIWGProject_managePublicationsForm.zpt')).__of__(self)
+ return pt()
+
+ def getPublications(self):
+ """get all Publications"""
+ def sort_images(x,y):
+ return cmp(getattr(x[1],'place',0),getattr(y[1],'place',0))
+ print self.getId()
+ publications=self.ZopeFind(self,obj_metatypes=['MPIWGProject_publication'])
+
+ publications.sort(sort_images)
+ return publications
+
+ def addPublication(self,text,RESPONSE=None):
+ """add an MPIWG_Publication"""
+
+ name="publication_"+str(self.getLastPublicationNumber()+1)
+
+ 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
+
+ if RESPONSE is not None:
+ RESPONSE.redirect('managePublications')
+
+
+ def getLastPublicationNumber(self):
+ publications=self.getPublications()
+
+ 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])
+ if RESPONSE:
+ RESPONSE.redirect('managePublications')
+
+ def getImages(self):
+ """get all Images"""
+ def sort_images(x,y):
+ return cmp(getattr(x[1],'place',0),getattr(y[1],'place',0))
+ print self.getId()
+ images=self.ZopeFind(self,obj_metatypes=['MPIWGProject_image'])
+
+ images.sort(sort_images)
+ return images
+
+ def getLastImageNumber(self):
+ images=self.getImages()
+
+ if not images:
+ return 0
+ else:
+ return getattr(images[-1][1],'place',0)
+
+ def deleteImage(self,id,RESPONSE=None):
+ """delete Image id"""
+ self.manage_delObjects([id])
+ if RESPONSE:
+ RESPONSE.redirect('manageImages')
+
+ def addImage(self,fileHd,caption,RESPONSE=None,filename=None):
+ """add an MPIWG_Project_image"""
+
+ if not filename:
+ filename=fileHd.filename
+
+ if not fileHd:
+ fileHd=file(os.path.join(package_home(globals()),'blank.gif'))
+
+ newImage=MPIWGProject_image(filename,filename,fileHd)
+
+ self._setObject(filename,newImage)
+ obj=getattr(self,filename)
+ obj.caption=caption[0:]
+ obj.enabled=True;
+ obj.place=self.getLastImageNumber()+1
+
+ if RESPONSE is not None:
+ RESPONSE.redirect('manageImages')
+
+ def PrincipiaSearchSource(self):
+ """Return cataloguable key for ourselves."""
+ return str(self)
+
+ 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 getActualVersion(self,date=None):
+ """actuelle version"""
+ def sortProjectsByTime(x,y):
+ return cmp(x[1].archiveTime,y[1].archiveTime)
+
+ if not date:
+ if self.isActual():
+ return self
+ else:
+ return None
+
+ #suche ob aeltere versionen vorhanden sind
+
+ finds=self.ZopeFind(self,obj_metatypes=['MPIWGProject'])
+ if not finds: #wenn nicht dann teste ob die aktuelle version schon existiert hat.
+ ad=getattr(self,'creationTime','20050101000000')
+ if int(date)>int(ad):
+ return self
+ else:
+ return None
+
+
+ else:
+ finds.sort(sortProjectsByTime)
+
+ for find in finds:
+ #gehe durch die alten Projekte und finde das entprechende
+ if (int(find[1].archiveTime) > int(date)) and (int(date)>int(getattr(find[1],'creationTime','20050101000000'))):
+ return find[1]
+
+ #kein passendes gefunden, dann teste ob das aktuelle in frage kommt
+ ad=getattr(self,'creationTime','20050101000000')
+
+ if int(date)>int(ad):
+
+ return self
+ else:
+ return None
+
+
+ def isActual(self):
+ """gibt 1 zurueck wenn aktuell, 0 sonst"""
+ actualTime=time.localtime()
+
+
+ #print getattr(self,'archiveTime',actualTime)
+ if getattr(self,'archiveTime',actualTime)< actualTime:
+ return 0
+ else:
+ return 1
+
+ def copyObjectToArchive(self):
+ """kopiere aktuelles objekt ins archiv"""
+ cb=self.aq_parent.manage_copyObjects(self.getId())
+ self.manage_pasteObjects(cb)
+ actualTime=time.localtime()
+
+ self.manage_renameObject(self.getId(),self.getId()+"_"+time.strftime("%Y%m%d%H%M%S",actualTime))
+ obj=getattr(self,self.getId()+"_"+time.strftime("%Y%m%d%H%M%S",actualTime))
+ obj.setArchiveTime(time.strftime("%Y%m%d%H%M%S",actualTime))
+ ids=[x[0] for x in self.ZopeFind(obj,obj_metatypes=['MPIWGProject'])]
+ obj.manage_delObjects(ids)
+
+ def setArchiveTime(self,time):
+ """set Archive Time"""
+ self.archiveTime=time[0:]
+
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)
@@ -897,8 +1512,9 @@ class MPIWGProject(Folder):
RESPONSE.redirect('manage_main')
def __init__(self, id, argv=None):
- """initieriere classe"""
-
+ """initiere classe"""
+
+ self.creationTime=time.strftime("%Y%m%d%H%M%S",time.localtime())[0:]
self.id=id
self.title=id
if argv:
@@ -921,14 +1537,65 @@ class MPIWGProject(Folder):
)
- def index_html(self):
- """show homepage"""
- ext=self.ZopeFind(self.aq_parent,obj_ids=["project_main"])
+ def checkDate(self,date):
+ """teste ob zum Zeitpunkt date eine andere version existierte"""
+
+
+ def sortProjectsByTime(x,y):
+ return cmp(x[1].archiveTime,y[1].archiveTime)
+
+ #suche ob aeltere versionen vorhanden sind
+ finds=self.ZopeFind(self,obj_metatypes=['MPIWGProject'])
+ if not finds: #wenn nicht dann teste ob die aktuelle version schon existiert hat.
+ ad=getattr(self,'creationTime','20050101000000')
+ if int(date)>int(ad):
+ return self.REQUEST['URL1']+"/"+self.getId()
+ else:
+ return self.REQUEST['URL1']+"/no_project"
+
+
+ else:
+ finds.sort(sortProjectsByTime)
+
+ for find in finds:
+ #gehe durch die alten Projekte und finde das entprechende
+ if (int(find[1].archiveTime) > int(date)) and (int(date)>int(getattr(find[1],'creationTime','20050101000000'))):
+ return self.REQUEST['URL1']+"/"+find[1].getId()
+
+ #kein passendes gefunden, dann teste ob das aktuelle in frage kommt
+ ad=getattr(self,'creationTime','20050101000000')
+
+ if int(date)>int(ad):
+
+ return self.REQUEST['URL1']+"/"+self.getId()
+ else:
+ 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 index_html(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[0][1].getId())()
+ return getattr(self,ext.getId())()
+
+ pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','project_main')).__of__(context)
- pt=PageTemplateFile('Products/MPIWGWeb/zpt/project_main').__of__(self)
return pt()
@@ -949,77 +1616,196 @@ class MPIWGProject(Folder):
"""get attrbiute"""
return getattr(self,field)
- def getContent(self,field):
+ def getContent(self,field,filter=None):
"""Inhalt des Feldes"""
text=u''
- #print "FIELD",field
+
for x in getattr(self,field):
- #print "HIHIIII"
try:
- text +=x.encode('utf-8')
+ text +=x
except:
- try:
- text =x.encode('utf-8')
- except:
- text=x.decode('latin-1').encode('utf-8')
+ text = x
+
- #delete separator (;) if is there is one
- ## try:
-## print text, text[len(text)-1]
-## except:
-## print "error:",text
+
try:
if text[len(text)-1]==";":
text=text[0:len(text)-1]
except:
- """nothing"""
+ pass
+
+ if text=='':
+ text2=text
+ else:
+ text2=re.sub(r';([^\s])','; \g<1>',text)
- text2=re.sub(r';([^\s])','; \g<1>',text)
#teste ob ergebnis leer und header dann nehme title
if (text2=='') and (field=='WEB_project_header'):
return self.getContent('WEB_title')
+ if filter:
+ splitted=text2.split("""""")
+ if len(splitted)>1:
+ tmp=splitted[1].split("
")
+ #return repr(splitted[1])
+ try:
+ self.imageURL=tmp[0].split("\"")[1].encode('utf-8')
+ except:
+ self.imageURL=tmp[0].split("src=")[1].split(" ")[0].encode('utf-8')
+
+ split2="".join(tmp[1:])
+
+ text3=splitted[0]+split2
+
+ splitted=text3.split("""""")
+ if len(splitted)>1:
+ tmp=splitted[1].split("
")
+ self.imagecap=tmp[0].encode('utf-8')
+
+ split4="".join(tmp[1:])
+
+ text5=splitted[0]+split4
+ else:
+ #keine caption
+ text5=text3
+ else:
+ #kein bild
+ text5=text2
+ else:
+ text5=text2
+
#teste ob WEB_project_description und keine führenden p tags
- if (len(text2)>4) and (not text2[0:3]=='') and (field=='WEB_project_description'):
- return "
"+text2+"
"
- #if text2=="Otto Sibum":
- #text2="H. Otto Sibum"
- return text2
+ if (len(text5)>4) and (not text5[0:3]=='') and (field=='WEB_project_description'):
+ text5= "
"+text5+"
"
+
+
+ #filter image
+
+
+ return text5.encode('utf-8')
+
+ 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('Products/MPIWGWeb/zpt/MPIWGProject_index.zpt').__of__(self)
+ pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','MPIWGProject_index.zpt')).__of__(self)
return pt()
+ def saveFromPreview(self):
+ """save content aus preview"""
+ self.WEB_project_description=self.previewTemplate.WEB_project_description[0:]
+ self.REQUEST.RESPONSE.redirect("./index.html")
+
+ def saveEditedContent(self,kupu=None,preview=None):
+ """save Edited content"""
+
+ if preview:
+ kupu=preview
+ #find content of body tags
+ start=kupu.find("")
+ end=kupu.find("")
+ newcontent= kupu[start+6:end]
+
+ if preview:
+
+ return self.preview(newcontent)
+
+ self.copyObjectToArchive()
+ self.WEB_project_description=newcontent[0:]
+
+ self.REQUEST.RESPONSE.redirect("./index.html")
+
+ return True
+
+ security.declareProtected('View managment screens','edit')
+ def edit(self):
+ """Edit pages"""
+ pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','edit_MPIWGProjectNeu.zpt')).__of__(self)
+ return pt()
+
+ def preview(self,description):
+ """preview"""
+ tmpPro=getattr(self,"previewTemplate",None)
+ if not tmpPro:
+ tmpPro=MPIWGProject("previewTemplate")
+ self._setObject("previewTemplate",tmpPro)
+ for field in definedFields:
+ setattr(tmpPro,field,getattr(self,field))
+ tmpPro.WEB_project_description=description[0:]
+
+ pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','previewFrame.zpt')).__of__(self)
+ return pt()
+
+ #return self.REQUEST.RESPONSE.redirect(self.REQUEST['URL1']+"/previewTemplate")
+
+
+ def getWebProject_description(self):
+ """get description"""
+
+ if type(self.WEB_project_description) is ListType:
+ return """
+
+
+
+
+ %s
+
+ """%self.getContent('WEB_project_description')
+ else:
+ return self.WEB_project_description
+
+
def editMPIWGProjectForm(self):
"""editform"""
- pt=PageTemplateFile('Products/MPIWGWeb/zpt/edit_MPIWGProject.zpt').__of__(self)
+ pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','edit_MPIWGProject.zpt')).__of__(self)
return pt()
- def editMPIWGProject(self,RESPONSE=None):
- """edit the project"""
+
+ def editMPIWGProject(self,RESPONSE=None,fromEdit=None):
+ """edit the project and archive the old version"""
+
+ self.copyObjectToArchive() # archive the object
+
- #return self.REQUEST
for x in definedFields:
if self.REQUEST.has_key(x):
setattr(self,x,[self.REQUEST[x].decode('utf-8')])
-
- if RESPONSE is not None:
- RESPONSE.redirect('manage_main')
+ if fromEdit and (RESPONSE is not None):
+ RESPONSE.redirect('./editMPIWGBasisEditor')
+
+ else:
+ if RESPONSE is not None:
+ RESPONSE.redirect('manage_main')
+
+
+
+ security.declareProtected('View managment screens','editMPIWGDisciplinesThemesEditor')
+ def editMPIWGDisciplinesThemesEditor(self):
+ """edit from edit"""
+ pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','edit_MPIWGDisciplinesThemesNeu.zpt')).__of__(self)
+ return pt()
+
+
def editMPIWGDisciplinesThemesForm(self):
"""edit the disciplines and themes Form"""
- pt=PageTemplateFile('Products/MPIWGWeb/zpt/edit_MPIWGDisciplinesThemes.zpt').__of__(self)
+
+ pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','edit_MPIWGDisciplinesThemes.zpt')).__of__(self)
return pt()
- def editMPIWGDisciplinesThemes(self,disciplines=None,themes=None,RESPONSE=None):
+ def editMPIWGDisciplinesThemes(self,disciplines=None,themes=None,RESPONSE=None,fromEdit=None):
"""edit disciplin and form"""
if disciplines:
if type(disciplines) is StringType:
@@ -1035,40 +1821,53 @@ class MPIWGProject(Folder):
self.xdata_10=string.join(themes,";")
else:
self.xdata_10=""
-
- if RESPONSE is not None:
- RESPONSE.redirect('manage_main')
+
+ if fromEdit and (RESPONSE is not None):
+ RESPONSE.redirect('./editMPIWGDisciplinesThemesEditor')
+
+ else:
+ if RESPONSE is not None:
+ RESPONSE.redirect('manage_main')
def isChecked(self,wert,list):
"""check if wert is in ; seperated list"""
- print "W:",wert
- print "L:",list,type(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(";")
- print splitted
+ splitted=[y.rstrip().lstrip() for y in splitted]
+
for x in splitted:
if (not x==u'') and x in wert:
return 1
return 0
+
+ security.declareProtected('View management screens','editMPIWGBasisEditor')
+ def editMPIWGBasisEditor(self):
+ """editform"""
+ pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','edit_MPIWGBasisNeu.zpt')).__of__(self)
+ return pt()
+
def editMPIWGBasisForm(self):
"""editform"""
- pt=PageTemplateFile('Products/MPIWGWeb/zpt/edit_MPIWGBasis.zpt').__of__(self)
+ pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','edit_MPIWGBasis.zpt')).__of__(self)
return pt()
+
+
def editMPIWGRelatedPublicationsForm(self):
"""Edit related Publications"""
- pt=PageTemplateFile('Products/MPIWGWeb/zpt/edit_MPIWGRelatedPublications.zpt').__of__(self)
+ 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('Products/MPIWGWeb/zpt/MPIWGProject_newfile.zpt').__of__(self)
+ pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','MPIWGProject_newfile.zpt')).__of__(self)
return pt()
def loadNewFile(self,RESPONSE=None):
@@ -1096,7 +1895,7 @@ class MPIWGProject(Folder):
def manage_addMPIWGProjectForm(self):
"""form for adding the project"""
- pt=PageTemplateFile('Products/MPIWGWeb/zpt/addMPIWGProjectForm.zpt').__of__(self)
+ pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addMPIWGProjectForm.zpt')).__of__(self)
return pt()
def manage_addMPIWGProject(self,id,RESPONSE=None):
@@ -1104,7 +1903,7 @@ def manage_addMPIWGProject(self,id,RESPO
#print argv
fileupload=self.REQUEST.get('fileupload',None)
if fileupload:
- print fileupload
+
file_name=fileupload.filename
filedata=fileupload.read()
@@ -1117,6 +1916,6 @@ def manage_addMPIWGProject(self,id,RESPO
self._setObject(id,newObj)
-
+
if RESPONSE is not None:
RESPONSE.redirect('manage_main')