--- MPIWGWeb/MPIWGProjects.py 2007/07/02 15:50:22 1.47.2.78
+++ MPIWGWeb/MPIWGProjects.py 2008/06/18 11:29:25 1.47.2.80
@@ -110,6 +110,29 @@ def sortI(x,y):
except:
return cmp(x[1],y[1])
+
+def unicodify(str):
+ """decode str (utf-8 or latin-1 representation) into unicode object"""
+ 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 utf8ify(str):
+ """encode unicode object or string into byte string in utf-8 representation"""
+ if not str:
+ return ""
+ if type(str) is StringType:
+ return str
+ else:
+ return str.encode('utf-8')
+
+
class MPIWGLink(SimpleItem):
"""create a symbolic link to another page"""
@@ -507,6 +530,8 @@ class MPIWGRoot(ZSQLExtendFolder):
"""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:
@@ -1061,10 +1086,21 @@ class MPIWGRoot(ZSQLExtendFolder):
return entry
- def getTree(self,dep=None,date=None,onlyActive=None):
- """generate Tree from project list"""
+ 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
+ """
+ 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
@@ -1080,10 +1116,25 @@ class MPIWGRoot(ZSQLExtendFolder):
project[0].setActiveFlag(False)
if (not dep) or (idNr[0]==dep): #falls dep gesetzt ist nur dieses hinzufuegen.
- if onlyActive and project[0].isActiveProject(): #nur active projekte
- returnList.append((depth,nr,title,project[0]))
- elif not onlyActive:
- returnList.append((depth,nr,title,project[0]))
+
+ 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
@@ -1124,24 +1175,49 @@ class MPIWGRoot(ZSQLExtendFolder):
"""change the complete tree"""
form=self.REQUEST.form
hashList={}
- fields=self.getTree()
-
+ onlyArchived=int(form.get("onlyArchived",0))
+ onlyActive=int(form.get("onlyActive",0))
+
+
+ fields=self.getTree(onlyArchived=onlyArchived,onlyActive=onlyActive)
- for idNr in form.keys():
+ logging.info("GOT TREE!----------------------------------------------------")
+ for field in form.keys():
- splitted=idNr.split('_')
+ splitted=field.split('_')
+ if (len(splitted)>1) and (splitted[1]=="runningNumber"): #feld hat die Form Nummer_name und runnignNumber
- if len(splitted)==1: # name des Feldes = idNr, dann Aendere id_nr
- if not (fields[int(idNr)][3].xdata_05==form[idNr]):
- fields[int(idNr)][3].xdata_05=form[idNr]
- fields[int(idNr)][3].copyObjectToArchive()
-
- if form.has_key(idNr+'_active'): # active flag is set
-
- fields[int(splitted[0])][3].setActiveFlag(True)
+
+ 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[int(splitted[0])][3].setActiveFlag(False)
+ fields[nr][3].setActiveFlag(False)
+
+ #nummer hat sich geŠndert
+
+ entryChanged = False;
+
+
+ if not (fields[nr][3].xdata_05==form[str(nr)+'_number']):
+ logging.info("Changed!Number+++++++++++++++++++++++++++++++++")
+ fields[nr][3].xdata_05=form[str(nr)+'_number']
+ entryChanged = True
+
+ #completed har sich geaendert
+
+ if not (fields[nr][3].getCompletedAt()==fields[nr][3].transformDate(form[str(nr)+'_completed'])):
+ fields[nr][3].setCompletedAt(form[str(nr)+'_completed'])
+ logging.info("Changed!Completed+++++++++++++++++++++++++++++++++")
+ entryChanged = True
+
+
+ if entryChanged:
+ logging.info("Changed!+++++++++++++++++++++++++++++++++")
+ fields[nr][3].copyObjectToArchive()
+
if RESPONSE is not None:
RESPONSE.redirect('showTree')
@@ -1204,13 +1280,17 @@ class MPIWGRoot(ZSQLExtendFolder):
if not search=='':
try:
+
member=self.MembersCatalog({'title':search})
+
except:
member=None
-
+ if member:
+ logging.error("search publ %s:"%member[0].getObject().isPublished())
if member and (member[0].getObject().isPublished()):
if person =="Otto Sibum" : person="H. Otto Sibum"
if person =="Norton Wise" : person="M. Norton Wise"
+
#memberlist.append("%s"%(member[0].absolute_url,person.encode('utf-8')))
memberlist.append((person, member[0].getObject().getId()))
else:
@@ -1266,28 +1346,27 @@ class MPIWGRoot(ZSQLExtendFolder):
return ret
- def getProjectsOfMember(self,name=None,key=None,date=None):
+ def getProjectsOfMember(self,name=None,key=None,date=None,onlyArchived=1):
"""get projects of a member
@param name: (optional)Vorname + Nachname
@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"""
- #print x.xdata_05,y.xdata_05
return cmp(x.WEB_title,y.WEB_title)
-
- ret=[]
- logging.error("XXXXXXXXXXXXXXXXX")
+ ret=[]
if key:
-
- #members=self.ZopeFind(self.members,obj_metatypes=['MPIWGStaff'],obj_ids=[email],search_sub=1)
+
members=self.MembersCatalog({'getKey':key})
if len(members)==0:
- return ret
-
+ return ret
splitted = [members[0].lastName,members[0].firstName]
elif name:
@@ -1296,15 +1375,13 @@ class MPIWGRoot(ZSQLExtendFolder):
else:
return ret # name oder key mussen definiert sein
- #XXXX
+
splitNeu=["\'"+splitted[1]+" "+splitted[0]+"\'"]
- #for s in splitted:
- # splitNeu.append("\""+s+"\"")
search=string.join(splitNeu,' AND ')
proj=self.ProjectCatalog({'xdata_01':search})
- logging.error("XXXXXXXXXXX %s"%proj)
+
if proj:
proj2=[]
for x in proj:
@@ -1327,8 +1404,23 @@ class MPIWGRoot(ZSQLExtendFolder):
proj2.sort(sortP)
- if len(proj2)>0:
- ret.append((name,proj2))
+ projectListe=[]
+
+ for proj in proj2:
+ obj=proj.getObject()
+ if onlyArchived==1: #nur aktuell projecte
+ if not obj.isArchivedProject():
+ projectListe.append(proj)
+ elif onlyArchived==2: #nur archivierte
+ if obj.isArchivedProject():
+ projectListe.append(proj)
+ else: #alle
+ projectListe.append(proj)
+
+
+
+ if len(projectListe)>0:
+ ret.append((name,projectListe))
return ret
@@ -1594,6 +1686,9 @@ class MPIWGProject(CatalogAware,Folder):
meta_type='MPIWGProject'
default_catalog='ProjectCatalog'
+ def decode(self,str):
+ """return unicode object"""
+ return unicodify(str)
def sortedByPlace(self,metatype):
"""find metatype and sort by place"""
@@ -1823,7 +1918,7 @@ class MPIWGProject(CatalogAware,Folder):
RESPONSE.redirect('manageImages')
- def hasChildren(self,date=None,onlyActive=True):
+ 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)
@@ -2017,11 +2112,94 @@ class MPIWGProject(CatalogAware,Folder):
def isActiveProject(self):
"""check if the project is still active, default is true, set to false is the project is accomplished"""
return getattr(self,'isActiveFlag',True)
+
+ def isArchivedProject(self):
+ """check if the project is archived"""
+
+ completed=getattr(self,'completedAt',0)
+
+ #completed leer
+ if completed=="" :
+ return False;
+ if completed == 0:
+ return False;
+
+
+ return True
+
def setActiveFlag(self,status=True):
"""set the active flag"""
self.isActiveFlag=status
+ def setCompletedAt(self,date):
+ """set the date of completion, date should be in the form DD.MM.YYYY or MM.YYYY or YYYY"""
+ logging.info("DATE:"+repr(date))
+ transformedDate=self.transformDate(date);
+ logging.info("transformed"+repr(transformedDate))
+ if transformedDate is not None:
+ setattr(self,"completedAt",transformedDate)
+ return True;
+ else:
+ return False;
+
+ def getCompletedAt(self):
+ """gibt das transformierte Datum zurźck"""
+ date=getattr(self,'completedAt','')
+ if date:
+ return self.reTransformDate(date);
+ else:
+ return '';
+
+ def reTransformDate(self,date):
+ """transformiert , transformdate zurueck"""
+ year=int(date/10000)
+ month=int((date-year*10000)/100)
+ day=int((date-year*10000-month*100))
+ return """%s.%s.%s"""%(day,month,year);
+
+
+ def transformDate(self,date):
+ """transformiert ein Datum von DD.MM.YYYY, MM.YYYY,YYYY nach YYYYMMDD, alle nicht angebebenn Werte
+ werden auf 0 gesetzt, es wird null zurźckgegeben falls das Datum ungueltig ist"""
+
+ if (date=="" ) :
+ return "";
+
+ if (date==None):
+ return None;
+
+ splitted=date.split(".")
+ length=len(splitted)
+ year=0
+ month=0
+ day=0
+ if length > 3:
+ return "";
+ if length==3:
+ day = int(splitted[0])
+ if length>1:
+ month=int(splitted[length-2])
+
+ if length > 0:
+ try:
+ year = int(splitted[length-1])
+ except:
+ pass
+
+ ## logging.info("month:"+(month))
+ if not (0<=month<13):
+ return None;
+
+ if not(0<=day<32):
+ return None;
+
+ if (year>0) and (year<1900): #jahr nicht vierstellig eingegeben
+ year=2000+year;
+ return year*10000+month*100+day
+
+
+
def checkDate(self,date):
"""teste ob zum Zeitpunkt date eine andere version existierte"""
@@ -2280,7 +2458,10 @@ class MPIWGProject(CatalogAware,Folder):
if (text5=="
") or (text5=="
"):
text5=""
- return text5.encode('utf-8')
+ logging.debug("getcontent: field=%s filter=%s -> %s"%(field,filter,repr(text5)))
+ #return unicodify(text5)
+ return utf8ify(text5) # return as utf-8 byte string
+
def showImagesOfPage(self,imageUrl=None):
"""show Images of project"""
@@ -2400,6 +2581,10 @@ class MPIWGProject(CatalogAware,Folder):
setattr(self,x,[self.REQUEST[x].decode('utf-8')])
+ completedAt = self.REQUEST.get('completedAt')
+ if not self.setCompletedAt(completedAt):
+ RESPONSE.redirect('./editMPIWGBasisEditor?error="dateWrong')
+
if self.REQUEST.has_key('historicalNames'):
self.en.changeHistoricalNames(self.getId(),self.REQUEST['historicalNames'].split("\n"))