Mercurial > hg > MPIWGWeb
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) |