comparison MPIWGStaff.py @ 3:ee3eb9a6665a

MPIWGStaffFolder shows members from db now.
author casties
date Fri, 08 Feb 2013 20:42:18 +0100
parents ddf6c1a27a4b
children dd765003647b
comparison
equal deleted inserted replaced
2:ddf6c1a27a4b 3:ee3eb9a6665a
1 """This file contains the classes for the organization of the staff""" 1 """This file contains the classes for the organization of the staff"""
2 # TODO: pruefe ob die id der einzelnen tabellen, wie id in publications noch benutzt werden 2 # TODO: pruefe ob die id der einzelnen tabellen, wie id in publications noch benutzt werden
3 # TODO: pruefe ob die bibliographischen felder in publications noch benutzt werden 3 # TODO: pruefe ob die bibliographischen felder in publications noch benutzt werden
4 # TODO: wird username gebraucht? 4 # TODO: wird username gebraucht?
5
6 from zExceptions import Redirect
5 7
6 from OFS.Folder import Folder 8 from OFS.Folder import Folder
7 from Products.PageTemplates.PageTemplateFile import PageTemplateFile 9 from Products.PageTemplates.PageTemplateFile import PageTemplateFile
8 from Products.PageTemplates.PageTemplate import PageTemplate 10 from Products.PageTemplates.PageTemplate import PageTemplate
9 from Products.PageTemplates.ZopePageTemplate import ZopePageTemplate 11 from Products.PageTemplates.ZopePageTemplate import ZopePageTemplate
10 from Products.ZCatalog.CatalogPathAwareness import CatalogAware 12 from Products.ZCatalog.CatalogPathAwareness import CatalogAware
11 from Products.versionedFile.extVersionedFile import extVersionedFileFolder 13 from Products.versionedFile.extVersionedFile import extVersionedFileFolder
12 from AccessControl import getSecurityManager 14 from AccessControl import getSecurityManager
13 15
14 from Products.ZSQLExtend.ZSQLExtend import ZSQLExtendFolder 16 from Products.ZSQLExtend.ZSQLExtend import ZSQLExtendFolder
17
15 from Products.ZDBInterface.ZDBInterfaceFolder import ZDBInterfaceFolder 18 from Products.ZDBInterface.ZDBInterfaceFolder import ZDBInterfaceFolder
19 from AccessControl import ClassSecurityInfo
20 from App.class_init import InitializeClass
16 21
17 import os 22 import os
18 import logging 23 import logging
19 import email 24 import email
20 from Globals import package_home 25 from Globals import package_home
21 from Products.PythonScripts.standard import sql_quote 26 from Products.PythonScripts.standard import sql_quote
22 from types import * 27 from types import *
23 from AccessControl import ClassSecurityInfo
24 import time 28 import time
25 import logging 29 import logging
26 import re 30 import re
27 from OFS.Cache import Cacheable 31 from OFS.Cache import Cacheable
28 import urllib2 32 import urllib2
29 import transaction 33 import transaction
30 34
31 import SrvTxtUtils 35 from SrvTxtUtils import getHttpData, getInt, unicodify, utf8ify
32 import bibliography 36 import bibliography
33 37
34 from MPIWGHelper import * 38 from MPIWGHelper import *
35 #ersetzt logging 39 #ersetzt logging
36 def logger(txt,method,txt2): 40 def logger(txt,method,txt2):
76 # queryStr="INSERT INTO current_work (key_main,current,publish) VALUES ('%s',%s,'%s')"%(key,self.ZSQLQuote(current_work),"yes") 80 # queryStr="INSERT INTO current_work (key_main,current,publish) VALUES ('%s',%s,'%s')"%(key,self.ZSQLQuote(current_work),"yes")
77 81
78 # self.ZSQLQuery(queryStr) 82 # self.ZSQLQuery(queryStr)
79 83
80 return True,msg 84 return True,msg
85
86
81 class MPIWGStaff(CatalogAware,ZSQLExtendFolder,Cacheable): 87 class MPIWGStaff(CatalogAware,ZSQLExtendFolder,Cacheable):
82 """Staff""" 88 """Staff"""
83 89
84 meta_type="MPIWGStaff" 90 meta_type="MPIWGStaff"
85 default_catalog='MembersCatalog' 91 default_catalog='MembersCatalog'
86 departmentList=departmentList 92 departmentList=departmentList
87 #_v_cone=None; 93 #_v_cone=None;
88 security=ClassSecurityInfo() 94 security=ClassSecurityInfo()
95
96 manage_options = Folder.manage_options+(
97 {'label':'Edit','action':'changeMPIWGStaffForm'},
98 {'label':'Change Publications Special','action':'changePublications_specialForm'},
99 ) + Cacheable.manage_options
100
101 __manager_id = "ramCache"
102 def __init__(self,id, lastName,firstName,key):
103 """init"""
104 self.id=id
105 self.title=key
106 self.lastName=lastName
107 self.firstName=firstName
108 self.key=key
89 109
90 def redirect(self,RESPONSE,url): 110 def redirect(self,RESPONSE,url):
91 """mache ein redirect mit einem angehaengten time stamp um ein reload zu erzwingen""" 111 """mache ein redirect mit einem angehaengten time stamp um ein reload zu erzwingen"""
92 112
93 timeStamp=time.time() 113 timeStamp=time.time()
312 332
313 def PrincipiaSearchSource(self): 333 def PrincipiaSearchSource(self):
314 """Return cataloguable key for ourselves.""" 334 """Return cataloguable key for ourselves."""
315 return str(self) 335 return str(self)
316 336
317 manage_options = Folder.manage_options+(
318 {'label':'Edit','action':'changeMPIWGStaffForm'},
319 {'label':'Change Publications Special','action':'changePublications_specialForm'},
320 ) + Cacheable.manage_options
321
322 __manager_id = "ramCache"
323 def __init__(self,id, lastName,firstName,key):
324 """init"""
325 self.id=id
326 self.title=key
327 self.lastName=lastName
328 self.firstName=firstName
329 self.key=key
330
331 def getPersonID(self): 337 def getPersonID(self):
332 """gibt den ID fuer die Person zurueck" 338 """gibt den ID fuer die Person zurueck"
333 im Moment ist personID = id, i.e. e-mail 339 im Moment ist personID = id, i.e. e-mail
334 """ 340 """
335 return self.id 341 return self.id
341 logging.debug("coneservice:"+self.coneService) 347 logging.debug("coneservice:"+self.coneService)
342 348
343 if getattr(self,'_v_cone',None)==None: 349 if getattr(self,'_v_cone',None)==None:
344 try: 350 try:
345 351
346 self._v_cone=SrvTxtUtils.getHttpData(self.coneService+self.getPersonID()) 352 self._v_cone=getHttpData(self.coneService+self.getPersonID())
347 #cone = urllib2.urlopen(self.coneService+self.getPersonID()) 353 #cone = urllib2.urlopen(self.coneService+self.getPersonID())
348 #self._v_cone=cone.read() 354 #self._v_cone=cone.read()
349 if self._v_cone==None: 355 if self._v_cone==None:
350 self._v_cone="" 356 self._v_cone=""
351 except: 357 except:
909 915
910 #in der neuen version ist definitions gemaess der key der Datenbank gleich dem key im Object. 916 #in der neuen version ist definitions gemaess der key der Datenbank gleich dem key im Object.
911 # TODO: remove all occurences of getDBId and replaces it by getKey 917 # TODO: remove all occurences of getDBId and replaces it by getKey
912 return self.getKey() 918 return self.getKey()
913 919
914 # search=self.ZSQLInlineSearch(_table='personal_www',key=self.getKey(),publish_the_data='yes')
915 # if search:#name existiert und published, dann nimm diesen falls es mehrereeventuell nich publizierte datensaetze gibt.
916 # return search[0].id
917 # else:#nicht publiziert dann nimm einen davon
918 # search2=self.ZSQLInlineSearch(_table='personal_www',username=self.getId())
919 # if search2:
920 # return search2[0].id
921 # else:
922 # return None
923
924
925
926 formatBiblHelp=bibliography.formatBiblHelp 920 formatBiblHelp=bibliography.formatBiblHelp
927 921
928 def sortBibliography(self,list,sortingMode=None,max=None): 922 def sortBibliography(self,list,sortingMode=None,max=None):
929 if not sortingMode: 923 if not sortingMode:
930 sortingMode=self.getSortingMode() 924 sortingMode=self.getSortingMode()
1000 self._setObject(id,newObj) 994 self._setObject(id,newObj)
1001 995
1002 if RESPONSE is not None: 996 if RESPONSE is not None:
1003 self.redirect(RESPONSE,'manage_main') 997 self.redirect(RESPONSE,'manage_main')
1004 998
999
1005 1000
1006 class MPIWGStaffFolder(ZDBInterfaceFolder): 1001 class MPIWGStaffFolder(ZDBInterfaceFolder):
1007 """Folder of staff objects""" 1002 """Folder of staff objects"""
1008 1003
1009 meta_type="MPIWGStaffFolder" 1004 meta_type="MPIWGStaffFolder"
1010 security=ClassSecurityInfo() 1005 security=ClassSecurityInfo()
1011 1006
1007 #
1008 # templates
1009 #
1010 member_index_html = PageTemplateFile('zpt/staff/member_index_html', globals())
1011
1012
1013 #
1014 # hook into traversal to create folder of virtual staff objects
1015 # like /members/$username/index_html
1016 #
1017 def __before_publishing_traverse__(self, object, request):
1018 stack = request.TraversalRequestNameStack
1019 logging.debug("MPIWGStaffFolder: traverse stack=%s self=%s"%(repr(stack),repr(self)))
1020
1021 # TODO: should we do more checks?
1022 if stack and len(stack) > 0:
1023 try:
1024 # id is the first path component
1025 id = stack[-1]
1026 member = self.getMember(id)
1027 if member is not None:
1028 request.set('MPIWGStaffMember', member)
1029 stack.pop(-1)
1030
1031 except (IndexError, ValueError):
1032 # missing context or not an integer id; perhaps some URL hacking going on?
1033 logging.error("error traversing user id!")
1034 raise Redirect(self.absolute_url()) # redirects to `/members`, adjust as needed
1035
1036
1037
1012 def index_html(self,REQUEST,RESPONSE): 1038 def index_html(self,REQUEST,RESPONSE):
1013 """show homepage""" 1039 """show homepage"""
1014 logging.debug("MPIWGStaffFolder: index_html!") 1040 logging.debug("MPIWGStaffFolder: index_html!")
1041 member = REQUEST.get('MPIWGStaffMember', None)
1042 if member is not None:
1043 logging.debug("member: key=%s"%(member.getKey()))
1044 pt = None
1045 try:
1046 # get template /template/member_index_html
1047 pt = getattr(self.template, 'member_index_html', None)
1048 except:
1049 logging.error("No template /template/member_index_html")
1050 # TODO: error page?
1051 return "No template /template/member_index_html"
1052
1053 if pt is not None:
1054 return pt(member=member)
1055
1015 return REQUEST 1056 return REQUEST
1057
1058
1059 def getMember(self, username=None, key=None):
1060 """returns a MPIWGStaffMember object if the username exists"""
1061 member = None
1062 if username is not None:
1063 # TODO: we should have a username column
1064 email = '%s@mpiwg-berlin.mpg.de'%username
1065 content = self.executeZSQL("select * from personal_www where e_mail = %s", [email])
1066 if len(content) > 0:
1067 member = MPIWGStaffMember(self, dbresult=content)
1068
1069 elif key is not None:
1070 content = folder.executeZSQL("select * from personal_www where key = %s", [key])
1071 if len(content) > 0:
1072 member = MPIWGStaffMember(self, dbresult=content)
1073
1074 return member
1075
1016 1076
1017 def manage_addMPIWGStaffFolderForm(self): 1077 def manage_addMPIWGStaffFolderForm(self):
1018 """form for adding the project""" 1078 """form for adding the project"""
1019 pt=PageTemplateFile('zpt/addMPIWGStaffFolderForm', globals()).__of__(self) 1079 pt=PageTemplateFile('zpt/addMPIWGStaffFolderForm', globals()).__of__(self)
1020 return pt() 1080 return pt()
1026 self._setObject(id,newObj) 1086 self._setObject(id,newObj)
1027 1087
1028 if RESPONSE is not None: 1088 if RESPONSE is not None:
1029 RESPONSE.redirect('manage_main') 1089 RESPONSE.redirect('manage_main')
1030 1090
1091
1092 class MPIWGStaffMember():
1093 """MPIWG staff member object from database"""
1094
1095 security = ClassSecurityInfo()
1096
1097 def __init__(self, folder, dbresult):
1098 """constructor: takes parent MPIWGStaffFolder and content"""
1099 self.folder = folder
1100 self.content = dbresult[0]
1101
1102 def isValid(self):
1103 """returns if this member exists"""
1104 return len(self.content) > 0
1105
1106 def getKey(self):
1107 """returns the db key"""
1108 return self.content.key
1109
1110 def getUsername(self):
1111 """returns the username"""
1112 id = re.sub('@mpiwg-berlin\.mpg\.de', '', self.content.e_mail)
1113 return id
1114
1115 def getPublishedImageUrl(self):
1116 """returns the URL to the image if it is published"""
1117 if self.content.image_p == 'yes':
1118 url = 'http://digilib.mpiwg-berlin.mpg.de/digitallibrary/Scaler?fn=permanent/mpiwg/staff/%s'%self.getUsername()
1119 return url
1120
1121 return None
1122
1123 def getContent(self):
1124 """returns the db content of this object"""
1125 return self.content
1126
1127 # TODO: ugly!
1128 security.declarePublic('sortBibliography')
1129 def sortBibliography(self,bib,sortingMode=None,max=None):
1130 """sort bibliography"""
1131 if not sortingMode:
1132 sortingMode= "priority"
1133
1134 l = [x for x in bib]
1135
1136 if sortingMode == "year":
1137 l.sort(key=lambda x: getInt(x.year))
1138 else:
1139 l.sort(key=lambda x: getInt(x.priority))
1140
1141 if max:
1142 return l[0:min(len(l),max)]
1143 else:
1144 return l
1145
1146
1147 InitializeClass(MPIWGStaffMember)