Mercurial > hg > MPIWGWeb
annotate MPIWGProjects.py @ 97:7b96a85552aa
fix bugs in project editing.
only show images with captions in project description.
| author | casties |
|---|---|
| date | Tue, 21 May 2013 15:51:32 +0200 |
| parents | 2dd8e3be4a8e |
| children | 84fa3f62ed85 |
| rev | line source |
|---|---|
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1 """This contains the class MPIWG Projects |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
2 for organizing and maintaining the different project pages |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
3 |
| 39 | 4 $author dwinter 26.06.2008 |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
5 |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
6 """ |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
7 from Products.PageTemplates.PageTemplateFile import PageTemplateFile |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
8 from OFS.Image import Image |
| 22 | 9 from App.ImageFile import ImageFile |
| 10 from OFS.SimpleItem import SimpleItem | |
| 11 from OFS.Folder import Folder | |
| 12 from AccessControl import ClassSecurityInfo | |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
13 from Globals import package_home |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
14 import urllib |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
15 import re |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
16 import os |
| 22 | 17 import sys |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
18 import logging |
| 22 | 19 import time |
| 80 | 20 import unicodedata |
| 22 | 21 |
| 49 | 22 import xml.etree.ElementTree as ET |
| 23 | |
| 65 | 24 from SrvTxtUtils import getInt, unicodify, utf8ify, serialize, refreshingImageFileIndexHtml, shortenString |
| 33 | 25 from Products.ZDBInterface.ZDBInterfaceFolder import ZDBInterfaceFolder |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
26 |
| 80 | 27 import xmlhelper # Methoden zur Verwaltung der projekt xml |
| 27 | 28 from HashTree import HashTree |
| 80 | 29 import MPIWGHelper |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
30 |
| 39 | 31 # TODO: better names for the fields |
| 35 | 32 fieldLabels = {'WEB_title':'WEB_Title', |
| 33 | 33 'xdata_01':'Responsible Scientists', |
| 34 'xdata_02':'Department', | |
| 35 'xdata_03':'Historical Persons', | |
| 36 'xdata_04':'Time period', | |
| 37 'xdata_05':'Sorting number', | |
| 38 'xdata_06':'Keywords', | |
| 39 'xdata_07':'Short title', | |
| 40 'xdata_08':'Other involved scholars' , | |
| 41 'xdata_09':'Disciplines', | |
| 42 'xdata_10':'Themes', | |
| 43 'xdata_11':'Object Digitallibrary', | |
| 44 'xdata_12':'Cooperation partners', | |
| 45 'xdata_13':'Funding institutions', | |
| 46 'WEB_project_header':'WEB_project_header', | |
| 47 'WEB_project_description':'WEB_project_description', | |
| 48 'WEB_related_pub':'WEB_related_pub'} | |
| 49 | |
| 39 | 50 definedFields = fieldLabels.keys() # TODO: should this be sorted? |
| 51 | |
| 81 | 52 editableFields = ('xdata_07', 'xdata_01', 'xdata_05', 'xdata_08', 'xdata_12', 'xdata_13') |
| 33 | 53 |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
54 # die folgenden Klassen sind jetzt in einzelne Files ausgelagert aus Kompatibilitaetsgruenden, bleiben die Klassen hier noch drin. |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
55 # Sonst funktionieren die alten Webseiten nicht mehr. |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
56 |
| 80 | 57 import MPIWGRoot |
| 58 import MPIWGLink | |
| 59 import MPIWGTemplate | |
| 60 | |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
61 class MPIWGRoot(MPIWGRoot.MPIWGRoot): |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
62 """depricated""" |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
63 |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
64 class MPIWGLink(MPIWGLink.MPIWGLink): |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
65 """depricated""" |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
66 |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
67 class MPIWGTemplate(MPIWGTemplate.MPIWGTemplate): |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
68 """depricated""" |
| 80 | 69 |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
70 |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
71 class MPIWGProject_publication(Folder): |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
72 """publications object fuer project""" |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
73 |
| 35 | 74 meta_type = "MPIWGProject_publication" |
| 61 | 75 |
| 76 text = None | |
| 77 link = None | |
| 78 bookId = None | |
| 79 | |
| 65 | 80 # templates |
| 81 | 81 edit = PageTemplateFile('zpt/project/related_publication/edit_basic', globals()) |
| 61 | 82 |
| 83 | |
| 81 | 84 redirect = MPIWGHelper.redirect |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
85 |
| 61 | 86 |
| 87 def hasLinkToBookPage(self): | |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
88 """teste ob eingebener link zu einer MPIWG Book page geht""" |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
89 logging.debug("MPIWGProject_publication - begin hasLinkToBookPage") |
| 61 | 90 if not self.link: |
| 35 | 91 return False # es gibt keinen link |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
92 |
| 61 | 93 paths = self.link.split('/') |
| 94 if len(paths) > 2: | |
| 95 # book page should be in folder books | |
| 96 bookid = None | |
| 97 try: | |
| 98 idx = paths.index('books') | |
| 99 bookid = paths[idx + 1] | |
| 100 book = self.en.books[bookid] | |
| 101 self.bookId = bookid | |
| 102 return True | |
| 103 | |
| 104 except: | |
| 105 logging.debug("hasLinkToBookPage: not a book page link=%s"%self.link) | |
| 106 | |
| 107 self.bookId = None | |
| 108 return False | |
| 109 | |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
110 |
| 61 | 111 def getBookId(self): |
| 112 """Return the book page id.""" | |
| 113 return self.bookId | |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
114 |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
115 |
| 80 | 116 getUrl = MPIWGHelper.getUrl |
| 117 | |
| 118 | |
| 61 | 119 def editPublication(self, text=None, description=None, link=None, RESPONSE=None): |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
120 """edit a publication""" |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
121 |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
122 if (not text) and (not description): |
| 81 | 123 pt = self.edit |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
124 return pt() |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
125 |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
126 if text: |
| 61 | 127 self.text = text |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
128 |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
129 if description: |
| 35 | 130 self.description = description |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
131 |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
132 if link: |
| 61 | 133 self.link = link |
| 134 self.hasLinkToBookPage() | |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
135 |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
136 if RESPONSE: |
| 35 | 137 self.redirect(RESPONSE, "../managePublications") |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
138 |
| 39 | 139 |
| 81 | 140 class MPIWGProject_relatedProject(SimpleItem): |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
141 """publications object fuer project""" |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
142 |
| 35 | 143 meta_type = "MPIWGProject_relatedProject" |
| 60 | 144 |
| 61 | 145 objid = None |
| 146 projectLabel = None | |
| 147 | |
| 80 | 148 # templates |
| 81 | 149 edit = PageTemplateFile('zpt/project/related_project/edit_basic', globals()) |
| 61 | 150 |
| 81 | 151 |
| 152 redirect = MPIWGHelper.redirect | |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
153 |
| 60 | 154 |
| 61 | 155 def getProjectId(self): |
| 156 """Return the related project id.""" | |
| 157 return self.objid | |
| 158 | |
| 159 | |
| 160 def getProject(self): | |
| 161 """Return the related project object.""" | |
| 162 return getattr(self.projects, self.objid, None) | |
| 163 | |
| 164 | |
| 60 | 165 def getProjectTitle(self): |
| 166 """Return the title of the related project.""" | |
| 167 return getattr(self, 'projectWEB_title', None) | |
| 61 | 168 |
| 60 | 169 |
| 61 | 170 def getProjectLabel(self): |
| 171 """Return the label of the related project.""" | |
| 172 label = getattr(self, 'projectLabel', None) | |
| 173 if not label: | |
| 174 proj = self.getProject() | |
| 175 if proj is not None: | |
| 176 label = proj.getLabel() | |
| 177 | |
| 178 self.projectLabel = label | |
| 179 | |
| 180 return label | |
| 181 | |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
182 |
| 80 | 183 getUrl = MPIWGHelper.getUrl |
| 184 | |
| 185 | |
| 35 | 186 def editRelatedProject(self, link=None, RESPONSE=None): |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
187 """edit a publication""" |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
188 |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
189 if (not link): |
| 63 | 190 pt = self.editDescription |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
191 return pt() |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
192 |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
193 # hole die id des projektes |
| 35 | 194 splitted = link.split("/") |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
195 |
| 35 | 196 # teste ob es das project gibt |
| 197 if len(splitted) < 1: | |
| 198 self.redirect(RESPONSE, 'errorRelatedProjects?link=' + link) | |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
199 |
| 35 | 200 objid = splitted[-1] |
| 201 object = getattr(self.projects, objid, None) | |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
202 |
| 61 | 203 if object is None: |
| 35 | 204 self.redirect(RESPONSE, 'errorRelatedProjects?link=' + link) |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
205 |
| 35 | 206 self.orginallink = link[0:] |
| 207 self.objid = objid[0:] | |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
208 |
| 52 | 209 self.projectWEB_title = object.getProjectTitle() |
| 61 | 210 self.projectLabel = object.getLabel() |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
211 |
| 35 | 212 self.enabled = True; |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
213 |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
214 if RESPONSE: |
| 35 | 215 self.redirect(RESPONSE, "../manageRelatedProjects") |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
216 |
| 39 | 217 |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
218 class MPIWGProject_image(Image): |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
219 """Images for Projects""" |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
220 |
| 35 | 221 meta_type = "MPIWGProject_image" |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
222 |
| 65 | 223 # templates |
|
96
2dd8e3be4a8e
add project image link. fix edit image template bug.
casties
parents:
95
diff
changeset
|
224 oldShowImage = PageTemplateFile('zpt/project/image/projectImageView', globals()) |
| 65 | 225 editForm = PageTemplateFile('zpt/project/image/edit_basic', globals()) |
| 226 | |
| 80 | 227 getUrl = MPIWGHelper.getUrl |
| 228 | |
|
96
2dd8e3be4a8e
add project image link. fix edit image template bug.
casties
parents:
95
diff
changeset
|
229 |
|
2dd8e3be4a8e
add project image link. fix edit image template bug.
casties
parents:
95
diff
changeset
|
230 def getCaption(self): |
|
2dd8e3be4a8e
add project image link. fix edit image template bug.
casties
parents:
95
diff
changeset
|
231 """Return the image caption.""" |
|
2dd8e3be4a8e
add project image link. fix edit image template bug.
casties
parents:
95
diff
changeset
|
232 return getattr(self, 'caption', None) |
|
2dd8e3be4a8e
add project image link. fix edit image template bug.
casties
parents:
95
diff
changeset
|
233 |
|
2dd8e3be4a8e
add project image link. fix edit image template bug.
casties
parents:
95
diff
changeset
|
234 |
|
2dd8e3be4a8e
add project image link. fix edit image template bug.
casties
parents:
95
diff
changeset
|
235 def getLink(self): |
|
2dd8e3be4a8e
add project image link. fix edit image template bug.
casties
parents:
95
diff
changeset
|
236 """Return the image link.""" |
|
2dd8e3be4a8e
add project image link. fix edit image template bug.
casties
parents:
95
diff
changeset
|
237 return getattr(self, 'link', None) |
|
2dd8e3be4a8e
add project image link. fix edit image template bug.
casties
parents:
95
diff
changeset
|
238 |
|
2dd8e3be4a8e
add project image link. fix edit image template bug.
casties
parents:
95
diff
changeset
|
239 |
|
2dd8e3be4a8e
add project image link. fix edit image template bug.
casties
parents:
95
diff
changeset
|
240 def editImage(self, file=None, caption=None, link=None, RESPONSE=None): |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
241 """edit the Image""" |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
242 if (not file) and (not caption): |
| 65 | 243 pt = self.editForm |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
244 return pt() |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
245 |
|
96
2dd8e3be4a8e
add project image link. fix edit image template bug.
casties
parents:
95
diff
changeset
|
246 if file and (not file.filename.strip() == ""): |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
247 self.manage_upload(file) |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
248 |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
249 if caption: |
|
96
2dd8e3be4a8e
add project image link. fix edit image template bug.
casties
parents:
95
diff
changeset
|
250 if isinstance(caption, list): |
|
2dd8e3be4a8e
add project image link. fix edit image template bug.
casties
parents:
95
diff
changeset
|
251 caption = caption[0] |
|
2dd8e3be4a8e
add project image link. fix edit image template bug.
casties
parents:
95
diff
changeset
|
252 |
|
2dd8e3be4a8e
add project image link. fix edit image template bug.
casties
parents:
95
diff
changeset
|
253 self.caption = caption |
|
2dd8e3be4a8e
add project image link. fix edit image template bug.
casties
parents:
95
diff
changeset
|
254 |
|
2dd8e3be4a8e
add project image link. fix edit image template bug.
casties
parents:
95
diff
changeset
|
255 if link: |
|
2dd8e3be4a8e
add project image link. fix edit image template bug.
casties
parents:
95
diff
changeset
|
256 self.link = link |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
257 |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
258 if RESPONSE: |
| 35 | 259 self.redirect(RESPONSE, "../manageImages") |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
260 |
| 24 | 261 |
| 81 | 262 class MPIWGProject_InfoBlock(SimpleItem): |
| 263 """publications object fuer project""" | |
| 264 | |
| 265 meta_type = "MPIWGProject_InfoBlock" | |
| 266 | |
| 267 # templates | |
| 268 edit = PageTemplateFile('zpt/project/infoblock/edit_items', globals()) | |
| 269 | |
| 270 | |
| 271 redirect = MPIWGHelper.redirect | |
| 272 | |
| 273 | |
| 274 def __init__(self, id, title=None): | |
| 275 """Create info block.""" | |
| 276 self.id = id | |
| 277 self.title = title | |
| 278 self.place = 0 | |
| 279 self.items = [] | |
| 280 | |
| 281 | |
| 282 def getTitle(self): | |
| 283 """Return the title.""" | |
| 284 return self.title | |
| 285 | |
| 286 | |
| 287 def getItems(self): | |
| 288 """Return the list of items.""" | |
| 289 return self.items | |
| 290 | |
| 291 | |
| 292 def setItems(self, items): | |
| 293 """Set the list of items.""" | |
| 294 self.items = items | |
| 295 self._p_changed = True | |
| 296 | |
| 297 | |
| 298 def addItem(self, item=None, text=None, link=None, RESPONSE=None): | |
| 299 """Add an item to the InfoBox""" | |
| 300 if item is None: | |
| 301 item = {'text': text, 'link': link} | |
| 302 | |
| 303 self.items.append(item) | |
| 304 self._p_changed = True | |
| 305 if RESPONSE is not None: | |
| 306 self.redirect(RESPONSE, 'edit') | |
| 307 | |
| 308 | |
| 309 def deleteItem(self, idx, RESPONSE=None): | |
| 310 """Delete an item from the info block.""" | |
| 311 try: | |
| 312 del self.items[int(idx)] | |
| 313 self._p_changed = True | |
| 314 except: | |
| 315 logging.error("InfoBlock deleteItem: error deleting item %s!"%idx) | |
| 316 | |
| 317 if RESPONSE is not None: | |
| 318 self.redirect(RESPONSE, 'edit') | |
| 319 | |
| 320 | |
| 321 def moveItem(self, idx, op, RESPONSE=None): | |
| 322 """Move items up or down the list.""" | |
| 323 try: | |
| 324 idx = int(idx) | |
| 325 if op == 'up': | |
| 326 if idx > 0: | |
| 327 self.items[idx-1], self.items[idx] = self.items[idx], self.items[idx-1] | |
| 328 elif op == 'down': | |
| 329 if idx < len(self.items)-1: | |
| 330 self.items[idx], self.items[idx+1] = self.items[idx+1], self.items[idx] | |
| 331 | |
| 332 self._p_changed = True | |
| 333 except: | |
| 334 logging.error("InfoBlock moveItem: error moving item at %s!"%idx) | |
| 335 | |
| 336 if RESPONSE is not None: | |
| 337 self.redirect(RESPONSE, 'edit') | |
| 338 | |
| 339 | |
| 340 def editItems(self, REQUEST, RESPONSE=None): | |
| 341 """Change items from request form.""" | |
| 342 form = REQUEST.form | |
| 343 for k in form: | |
| 344 t, n = k.split('_') | |
| 345 if t in ['text', 'link']: | |
| 346 try: | |
| 347 logging.debug("editItems: change[%s].%s = %s"%(n,t,repr(form[k]))) | |
| 348 self.items[int(n)][t] = form[k] | |
| 349 except: | |
| 350 logging.error("InfoBlock editItems: error changing item %s!"%k) | |
| 351 | |
| 352 self._p_changed = True | |
| 353 if RESPONSE is not None: | |
| 354 self.redirect(RESPONSE, 'edit') | |
| 355 | |
| 356 | |
| 357 | |
| 65 | 358 class MPIWGProject(Folder): |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
359 """Class for Projects""" |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
360 |
| 33 | 361 security = ClassSecurityInfo() |
| 362 meta_type = 'MPIWGProject' | |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
363 |
| 35 | 364 manage_options = Folder.manage_options + ( |
| 365 {'label':'Load New File', 'action':'loadNewFileForm'}, | |
| 63 | 366 {'label':'Edit', 'action':'editDescription'}, |
| 22 | 367 ) |
| 35 | 368 # {'label':'Edit ProjectInfo','action':'editMPIWGProjectForm'}, |
| 369 # {'label':'Edit BasisInfo','action':'editMPIWGBasisForm'}, | |
| 370 # {'label':'Edit Publications','action':'editMPIWGRelatedPublicationsForm'}, | |
| 371 # {'label':'Edit Themes & Disciplines','action':'editMPIWGDisciplinesThemesForm'}, | |
| 372 # {'label':'Versionmanager','action':'versionManageForm'}, | |
| 22 | 373 |
| 33 | 374 # |
| 375 # templates | |
| 376 # | |
| 90 | 377 project_html = PageTemplateFile('zpt/project/project_index_html', globals()) |
| 50 | 378 # edit templates |
| 22 | 379 edit_css = ImageFile('css/edit.css', globals()) |
| 380 # make css refreshable for development | |
| 381 edit_css.index_html = refreshingImageFileIndexHtml | |
| 61 | 382 # user-accessible editing templates |
| 90 | 383 edit_template = PageTemplateFile('zpt/project/edit_template', globals()) |
| 63 | 384 security.declareProtected('View management screens', 'editBasic') |
| 385 editBasic = PageTemplateFile('zpt/project/edit_basic', globals()) | |
| 90 | 386 security.declareProtected('View management screens', 'editDescription') |
| 63 | 387 editDescription = PageTemplateFile('zpt/project/edit_description', globals()) |
| 90 | 388 security.declareProtected('View management screens', 'editRelatedProjectsForm') |
| 60 | 389 editRelatedProjectsForm = PageTemplateFile('zpt/project/edit_related_projects', globals()) |
| 61 | 390 editRelatedProjectsError = PageTemplateFile('zpt/project/edit_related_projects_error', globals()) |
| 95 | 391 security.declareProtected('View management screens', 'editImagesForm') |
| 392 editImagesForm = PageTemplateFile('zpt/project/edit_images', globals()) | |
| 90 | 393 security.declareProtected('View management screens', 'editPublicationsForm') |
| 60 | 394 editPublicationsForm = PageTemplateFile('zpt/project/edit_publications', globals()) |
| 90 | 395 security.declareProtected('View management screens', 'editInfoBlocksForm') |
| 81 | 396 editInfoBlocksForm = PageTemplateFile('zpt/project/edit_infoblocks', globals()) |
| 90 | 397 security.declareProtected('View management screens', 'editAdditionalPublicationsForm') |
| 61 | 398 editAdditionalPublicationsForm = PageTemplateFile('zpt/project/pubman/change_publications', globals()) |
| 90 | 399 security.declareProtected('View management screens', 'editAddAdditionalPublications') |
| 62 | 400 editAddAdditionalPublications = PageTemplateFile('zpt/project/pubman/add_publications', globals()) |
| 63 | 401 security.declareProtected('View management screens', 'edit') |
| 402 edit = editDescription | |
| 50 | 403 # management templates |
| 90 | 404 security.declareProtected('View management screens', 'loadNewFileForm') |
| 50 | 405 loadNewFileForm = PageTemplateFile('zpt/project/manage_newfile', globals()) |
| 406 description_only_html = PageTemplateFile('zpt/project/description_only_html', globals()) | |
| 61 | 407 # additional pages |
|
74
e424b68244c8
better template for additional project publications.
casties
parents:
65
diff
changeset
|
408 additional_publications_html = PageTemplateFile('zpt/project/pubman/show_publications', globals()) |
| 22 | 409 |
| 410 | |
| 411 def __init__(self, id, argv=None): | |
| 412 """initiere classe""" | |
| 35 | 413 self.creationTime = time.strftime("%Y%m%d%H%M%S", time.localtime())[0:] |
| 414 self.id = id | |
| 415 self.title = id | |
| 416 self.isActiveFlag = True # Flag is true is the project is still active, False if accomplished | |
| 417 self.responsibleScientistsList = [] # enthaelt die Lister der verantwortlichen Wissenschaftler in der Form (NAME, KEY), key ist "" flass Wissenschaftler nicht an unserem Haus | |
| 97 | 418 self.projectThumb = None |
| 22 | 419 |
| 420 if argv: | |
| 421 for arg in definedFields: | |
| 422 try: | |
| 35 | 423 setattr(self, arg, argv[arg]) |
| 22 | 424 except: |
| 35 | 425 setattr(self, arg, "") |
| 22 | 426 else: |
| 427 for arg in definedFields: | |
| 35 | 428 setattr(self, arg, '') |
| 22 | 429 |
| 430 | |
| 35 | 431 def index_html(self): |
| 432 """default html representation""" | |
| 433 # TODO: do we need to do date-stuff? | |
| 434 # get template | |
|
74
e424b68244c8
better template for additional project publications.
casties
parents:
65
diff
changeset
|
435 pt = self.project_html |
| 35 | 436 # render template |
| 437 return pt() | |
| 438 | |
| 81 | 439 |
| 440 redirect = MPIWGHelper.redirect | |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
441 |
| 27 | 442 |
| 60 | 443 def getDefinedFields(self): |
| 444 """show all defined fields.""" | |
| 445 return definedFields | |
| 446 | |
| 447 | |
| 448 def getFieldLabels(self): | |
| 449 """Return the field labels dict.""" | |
| 450 return fieldLabels | |
| 451 | |
| 452 | |
| 453 def getEditableFields(self): | |
| 454 """giveListofDatafields""" | |
| 455 return editableFields | |
| 456 | |
| 457 | |
| 27 | 458 def getNumber(self): |
| 459 """returns sorting number""" | |
| 33 | 460 n = getattr(self, 'xdata_05', None) |
| 461 if isinstance(n, list): | |
| 462 # compat with old lists | |
| 463 return n[0] | |
| 464 else: | |
| 465 return n | |
| 27 | 466 |
| 35 | 467 |
| 80 | 468 def getProjectTitle(self, forSorting=False): |
| 35 | 469 """returns the project title""" |
| 470 t = getattr(self, 'WEB_title', None) | |
| 471 if isinstance(t, list): | |
| 472 # compat with old lists | |
| 80 | 473 t = t[0] |
| 474 | |
| 475 if forSorting and t is not None: | |
| 476 # remove stopwords and signs for sorting | |
| 477 if t.lower().startswith('a '): | |
| 478 t = t[2:] | |
| 479 elif isinstance(t, unicode) and unicodedata.category(t[0])[0] != 'L': | |
| 480 t = t[1:] | |
| 481 | |
| 482 return t | |
| 35 | 483 |
| 39 | 484 |
| 485 def getLabel(self): | |
| 486 """returns label (or title) of this project""" | |
| 487 l = getattr(self, 'xdata_07', None) | |
| 488 if isinstance(l, list): | |
| 489 # compat with old lists | |
| 490 l = l[0] | |
| 491 | |
| 492 if l: | |
| 493 return l | |
| 494 else: | |
| 495 return self.getProjectTitle() | |
| 496 | |
| 497 | |
| 35 | 498 def getResponsibleScientists(self): |
| 499 """returns the responsible scientists as string""" | |
| 500 t = getattr(self, 'xdata_01', None) | |
| 501 if isinstance(t, list): | |
| 502 # compat with old lists | |
| 503 return t[0] | |
| 504 else: | |
| 505 return t | |
| 506 | |
| 507 | |
| 508 def getResponsibleScientistsList(self): | |
| 509 """returns a list with the responsible scientists as dicts with name, key, and shortname""" | |
| 97 | 510 return getattr(self, 'responsibleScientistsList', []) |
| 35 | 511 |
| 512 | |
| 513 def setResponsibleScientistsList(self, nameDict): | |
| 514 """sets the responsibleScientistsList from nameDict. | |
| 515 List will be ordered like the responsible scientists field.""" | |
| 516 names = self.getResponsibleScientists() | |
| 517 if names.find(";") > -1: # rate Trenner ist ; | |
| 518 nameList = names.split(";") | |
| 519 else: | |
| 520 nameList = names.split(",") | |
| 521 | |
| 522 scientistsList = [] | |
| 523 for name in nameList: | |
| 524 name = unicodify(name.strip()) | |
| 525 logging.debug("setResponsibleScientistsList: name=%s"%repr(name)) | |
| 526 if name in nameDict: | |
| 527 # found in data | |
| 528 data = nameDict[name] | |
| 529 scientistsList.append({'name': name, 'key': data['key'], 'username': data['username']}) | |
| 530 else: | |
| 531 scientistsList.append({'name': name}) | |
| 532 | |
| 533 logging.debug("setResponsibleScientistsList: nameDict=%s new list=%s"%(repr(nameDict),repr(scientistsList))) | |
| 534 self.responsibleScientistsList = scientistsList | |
| 535 | |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
536 |
| 39 | 537 def getInvolvedScholars(self): |
| 538 """returns the other involved scholars""" | |
| 539 t = getattr(self, 'xdata_08', None) | |
| 540 if isinstance(t, list): | |
| 541 # compat with old lists | |
| 542 return t[0] | |
| 543 else: | |
| 544 return t | |
| 545 | |
| 546 | |
| 547 def getCooperationPartners(self): | |
| 548 """returns the cooperation partners""" | |
| 549 t = getattr(self, 'xdata_12', None) | |
| 550 if isinstance(t, list): | |
| 551 # compat with old lists | |
| 552 return t[0] | |
| 553 else: | |
| 554 return t | |
| 555 | |
| 61 | 556 |
|
96
2dd8e3be4a8e
add project image link. fix edit image template bug.
casties
parents:
95
diff
changeset
|
557 def getMPIWGProject(self): |
|
2dd8e3be4a8e
add project image link. fix edit image template bug.
casties
parents:
95
diff
changeset
|
558 """Return this project for acquisition.""" |
|
2dd8e3be4a8e
add project image link. fix edit image template bug.
casties
parents:
95
diff
changeset
|
559 return self |
|
2dd8e3be4a8e
add project image link. fix edit image template bug.
casties
parents:
95
diff
changeset
|
560 |
|
2dd8e3be4a8e
add project image link. fix edit image template bug.
casties
parents:
95
diff
changeset
|
561 |
| 61 | 562 def getMPIWGProjectUrl(self): |
| 563 """Return this project for acquisition.""" | |
| 564 return self.absolute_url() | |
| 565 | |
| 39 | 566 |
| 80 | 567 getUrl = MPIWGHelper.getUrl |
| 27 | 568 |
| 569 | |
| 65 | 570 def getThumbUrl(self, default=None): |
| 24 | 571 """returns the URL of the project thumbnail image""" |
| 97 | 572 thumb = getattr(self, 'projectThumb', None) |
| 36 | 573 if thumb is None: |
| 52 | 574 # get thumb from list (thumb is last image) |
| 36 | 575 imgs = self.getImageList() |
| 576 if len(imgs) > 0: | |
| 52 | 577 thumb = imgs[-1] |
| 36 | 578 self.projectThumb = thumb |
| 579 | |
| 580 if thumb is None: | |
| 52 | 581 return default |
| 36 | 582 |
| 583 return thumb.absolute_url() | |
| 584 | |
| 24 | 585 |
| 39 | 586 def getDepartment(self): |
| 587 """returns the department of this project""" | |
| 588 num = self.getNumber() | |
| 589 pp = num.find('.') | |
| 590 if pp > 0: | |
| 591 num = num[:pp] | |
| 592 | |
| 80 | 593 return self.en.getMPIWGRoot().getDepartment(projectNumber=num) |
| 39 | 594 |
| 595 | |
| 596 def getDepartmentId(self): | |
| 597 """returns the id of the department of this project""" | |
| 598 dep = self.getDepartment() | |
| 599 if dep is not None: | |
| 600 return dep.getId() | |
| 601 | |
| 602 return None | |
| 603 | |
| 604 | |
| 605 def getDescription(self, filter=False): | |
| 606 """returns the project description""" | |
| 49 | 607 text = getattr(self, 'WEB_project_description', None) |
| 608 if isinstance(text, list): | |
| 39 | 609 # compat with old lists |
| 49 | 610 text = text[0] |
| 611 | |
| 612 return text | |
| 613 | |
| 39 | 614 |
| 615 def getSuperProjects(self): | |
| 616 """returns a list of ancestor projects to the root""" | |
| 617 tree = self.getProjectTree() | |
| 618 return tree.getAncestorsOf(self.getNumber()) | |
| 619 | |
| 620 | |
| 621 def getSubProjects(self, active=1): | |
| 622 """returns a list of child projects""" | |
| 623 tree = self.getProjectTree() | |
| 624 return [p for p in tree.getChildrenOf(self.getNumber()) if p.checkActive(active)] | |
| 625 | |
| 626 | |
| 627 def getRelatedDigitalSources(self): | |
| 628 """returns the related digital sources""" | |
| 629 t = getattr(self, 'xdata_11', None) | |
| 630 if isinstance(t, list): | |
| 631 # compat with old lists | |
| 632 return t[0] | |
| 633 else: | |
| 634 return t | |
| 43 | 635 |
| 39 | 636 |
| 637 def getFundingInstitutions(self): | |
| 638 """returns the funding institutions""" | |
| 639 t = getattr(self, 'xdata_13', None) | |
| 640 if isinstance(t, list): | |
| 641 # compat with old lists | |
| 642 return t[0] | |
| 643 else: | |
| 644 return t | |
| 645 | |
| 24 | 646 |
| 63 | 647 def _moveObjectPlace(self, objectList, objectId, direction): |
| 60 | 648 """Move object with objectId from objectList in direction |
| 649 by changing its place attribute.""" | |
| 650 if not objectId or not direction: | |
| 651 return | |
| 652 | |
| 653 for idx in range(len(objectList)): | |
| 654 object = objectList[idx] | |
| 61 | 655 if object.getId() == objectId: |
| 60 | 656 if direction == 'up': |
| 657 if idx > 0: | |
| 658 # move up | |
| 659 objectList[idx -1].place += 1 | |
| 660 objectList[idx].place -= 1 | |
| 661 | |
| 662 elif direction == 'down': | |
| 663 if idx < len(objectList) - 1: | |
| 664 # move down | |
| 665 objectList[idx + 1].place -= 1 | |
| 666 objectList[idx].place += 1 | |
| 667 | |
| 668 return | |
| 669 | |
| 63 | 670 |
| 671 def getImageList(self): | |
| 672 """returns the sorted list of images for this project""" | |
| 673 items = self.objectValues(spec='MPIWGProject_image') | |
| 674 # sort by place | |
| 675 return sorted(items, key=lambda x:int(getattr(x, 'place', 0))) | |
| 676 | |
| 677 | |
| 678 def addImage(self, fileHd, caption, RESPONSE=None, filename=None): | |
| 679 """add an MPIWG_Project_image""" | |
| 680 | |
| 681 if not filename: | |
| 682 filename = fileHd.filename | |
| 683 | |
| 684 if not fileHd: | |
| 685 fileHd = file(os.path.join(package_home(globals()), 'blank.gif')) | |
| 686 | |
| 687 newImage = MPIWGProject_image(filename, filename, fileHd) | |
| 688 | |
| 689 self._setObject(filename, newImage) | |
| 690 obj = getattr(self, filename) | |
| 691 obj.caption = caption[:] | |
| 692 obj.enabled = True; | |
| 693 obj.place = self._getLastImageNumber() + 1 | |
| 694 obj.id = filename | |
| 695 | |
| 696 # invalidate thumbnail | |
| 697 self.projectThumb = None | |
| 698 | |
| 699 if RESPONSE is not None: | |
| 700 self.redirect(RESPONSE, 'manageImages') | |
| 701 | |
| 702 | |
| 703 def _getLastImageNumber(self): | |
| 704 items = self.getImageList() | |
| 705 if not items: | |
| 706 return 0 | |
| 707 else: | |
| 708 return getattr(items[-1], 'place', 0) | |
| 709 | |
| 710 | |
| 61 | 711 def manageImages(self, name=None, op=None): |
| 60 | 712 """manage images""" |
| 63 | 713 self._moveObjectPlace(self.getImageList(), name, op) |
| 60 | 714 |
| 51 | 715 # invalidate thumbnail |
| 716 self.projectThumb = None | |
| 60 | 717 |
| 718 pt = self.editImagesForm | |
| 50 | 719 return pt() |
| 720 | |
| 60 | 721 |
| 63 | 722 def deleteImage(self, id, RESPONSE=None): |
| 723 """delete Image id""" | |
| 724 try: | |
| 725 self.manage_delObjects([id]) | |
| 726 except: | |
| 727 logging.error("ERROR MPIWG: %s %s" % sys.exc_info()[0:2]) | |
| 728 | |
| 729 # invalidate thumbnail | |
| 730 self.projectThumb = None | |
| 731 | |
| 732 if RESPONSE: | |
| 733 self.redirect(RESPONSE, 'manageImages') | |
| 50 | 734 |
| 63 | 735 |
| 736 def getPublicationList(self): | |
| 737 """returns the list of related publications""" | |
| 738 items = self.objectValues(spec='MPIWGProject_publication') | |
| 739 # sort by place | |
| 740 items.sort(key=lambda x:int(getattr(x, 'place', 0))) | |
| 741 return items | |
| 742 | |
| 50 | 743 |
| 64 | 744 def addPublication(self, text=None, link=None, RESPONSE=None): |
| 50 | 745 """add an MPIWG_Publication""" |
| 64 | 746 if text or link: |
| 747 number = self._getLastPublicationNumber() + 1 | |
| 50 | 748 name = "publication_" + str(number) |
| 64 | 749 while hasattr(self, name): |
| 750 number += 1 | |
| 751 name = "publication_" + str(number) | |
| 752 | |
| 753 newPublication = MPIWGProject_publication(name) | |
| 50 | 754 |
| 64 | 755 self._setObject(name, newPublication) |
| 756 obj = getattr(self, name) | |
| 757 obj.text = text | |
| 758 obj.link = link | |
| 759 obj.enabled = True; | |
| 760 obj.place = self._getLastPublicationNumber() + 1 | |
| 761 obj.id = name | |
| 762 # hasLinkToBookPage updates bookid if available | |
| 763 if obj.hasLinkToBookPage() and not text: | |
| 764 # take title from book page | |
| 765 try: | |
| 766 book = self.en.books[obj.bookId] | |
| 767 obj.text = book.getInfo('title') | |
| 768 except: | |
| 769 pass | |
| 50 | 770 |
| 771 if RESPONSE is not None: | |
| 772 self.redirect(RESPONSE, 'managePublications') | |
| 773 | |
| 60 | 774 |
| 63 | 775 def _getLastPublicationNumber(self): |
| 776 items = self.getPublicationList() | |
| 777 if not items: | |
| 778 return 0 | |
| 779 else: | |
| 780 return getattr(items[-1], 'place', 0) | |
| 781 | |
| 782 | |
| 783 def managePublications(self, name=None, op=None): | |
| 784 """manage publications""" | |
| 785 self._moveObjectPlace(self.getPublicationList(), name, op) | |
| 786 | |
| 787 pt = self.editPublicationsForm | |
| 788 return pt() | |
| 50 | 789 |
| 63 | 790 |
| 791 def deletePublication(self, id, RESPONSE=None): | |
| 792 """delete Publication id""" | |
| 793 self.manage_delObjects([id]) | |
| 794 if RESPONSE: | |
| 795 self.redirect(RESPONSE, 'managePublications') | |
| 796 | |
| 797 | |
| 798 def getRelatedProjectList(self): | |
| 799 """returns the list of related projects""" | |
| 800 items = self.objectValues(spec='MPIWGProject_relatedProject') | |
| 801 # sort by place | |
| 802 items.sort(key=lambda x:int(getattr(x, 'place', 0))) | |
| 803 return items | |
| 804 | |
| 60 | 805 |
| 50 | 806 def addRelatedProject(self, link, RESPONSE=None): |
| 60 | 807 """add a MPIWGProject_relatedProject""" |
| 63 | 808 number = self._getLastRelatedProjectNumber() + 1 |
| 61 | 809 name = "related_project_" + str(number) |
| 50 | 810 while hasattr(self, name): |
| 811 number += 1 | |
| 61 | 812 name = "related_project_" + str(number) |
| 50 | 813 |
| 814 # hole die id des projektes | |
| 815 splitted = link.split("/") | |
| 816 | |
| 817 # teste ob es das project gibt | |
| 818 if len(splitted) < 1: | |
| 819 self.redirect(RESPONSE, 'errorRelatedProjects?link=' + link) | |
| 820 | |
| 821 objid = splitted[-1] | |
| 822 object = getattr(self.projects, objid, None) | |
| 823 | |
| 824 if object == None: | |
| 825 self.redirect(RESPONSE, 'errorRelatedProjects?link=' + link) | |
| 826 return | |
| 827 | |
| 828 newPublication = MPIWGProject_relatedProject(name) | |
| 829 | |
| 830 self._setObject(name, newPublication) | |
| 831 obj = getattr(self, name) | |
| 832 obj.orginallink = link[0:] | |
| 833 obj.objid = objid[0:] | |
| 834 logging.debug("add relobj:objid" + repr(obj.objid)) | |
| 60 | 835 obj.projectWEB_title = object.getProjectTitle() |
| 50 | 836 logging.debug("add relobj:webtitle" + repr(obj.projectWEB_title)) |
| 837 obj.enabled = True; | |
| 63 | 838 obj.place = self._getLastRelatedProjectNumber() + 1 |
| 50 | 839 obj.id = name |
| 840 if RESPONSE is not None: | |
| 841 self.redirect(RESPONSE, 'manageRelatedProjects') | |
| 842 | |
| 843 | |
| 63 | 844 def _getLastRelatedProjectNumber(self): |
| 61 | 845 items = self.getRelatedProjectList() |
| 846 if not items: | |
| 50 | 847 return 0 |
| 848 else: | |
| 61 | 849 return getattr(items[-1], 'place', 0) |
| 60 | 850 |
| 50 | 851 |
| 63 | 852 def manageRelatedProjects(self, name=None, op=None): |
| 853 """manage related projects""" | |
| 854 self._moveObjectPlace(self.getRelatedProjectList(), name, op) | |
| 855 | |
| 856 pt = self.editRelatedProjectsForm | |
| 857 return pt() | |
| 858 | |
| 859 | |
| 860 def deleteRelatedProject(self, id, RESPONSE=None): | |
| 861 """delete Publication id""" | |
| 862 self.manage_delObjects([id]) | |
| 863 if RESPONSE: | |
| 864 self.redirect(RESPONSE, 'manageRelatedProjects') | |
| 865 | |
| 60 | 866 |
| 63 | 867 def errorRelatedProjects(self, link): |
| 868 """error creating a related project""" | |
| 869 pt = self.editRelatedProjectsError | |
| 870 return pt(link=link) | |
| 871 | |
| 872 | |
| 81 | 873 def getInfoBlockList(self): |
| 874 """returns the list of related projects""" | |
| 875 items = self.objectValues(spec='MPIWGProject_InfoBlock') | |
| 876 # sort by place | |
| 877 items.sort(key=lambda x:int(getattr(x, 'place', 0))) | |
| 878 return items | |
| 879 | |
| 880 | |
| 881 def addInfoBlock(self, block_title=None, item_text=None, item_link=None, RESPONSE=None): | |
| 882 """add a MPIWGProject_InfoBlock""" | |
| 883 if block_title: | |
| 884 number = self._getLastInfoBlockNumber() + 1 | |
| 885 name = "infoblock_" + str(number) | |
| 886 while hasattr(self, name): | |
| 887 number += 1 | |
| 888 name = "infoblock_" + str(number) | |
| 889 | |
| 890 newBlock = MPIWGProject_InfoBlock(name, block_title) | |
| 891 # add block to project | |
| 892 self._setObject(name, newBlock) | |
| 893 obj = getattr(self, name) | |
| 894 obj.place = self._getLastInfoBlockNumber() + 1 | |
| 895 if item_text: | |
| 896 obj.addItem(text=item_text, link=item_link) | |
| 897 | |
| 898 if RESPONSE is not None: | |
| 899 self.redirect(RESPONSE, 'manageInfoBlocks') | |
| 900 | |
| 901 | |
| 902 def _getLastInfoBlockNumber(self): | |
| 903 items = self.getInfoBlockList() | |
| 904 if not items: | |
| 905 return 0 | |
| 906 else: | |
| 907 return getattr(items[-1], 'place', 0) | |
| 908 | |
| 909 | |
| 910 def manageInfoBlocks(self, name=None, op=None): | |
| 911 """manage related projects""" | |
| 912 self._moveObjectPlace(self.getInfoBlockList(), name, op) | |
| 913 | |
| 914 pt = self.editInfoBlocksForm | |
| 915 return pt() | |
| 916 | |
| 917 | |
| 918 def deleteInfoBlock(self, id, RESPONSE=None): | |
| 919 """delete Publication id""" | |
| 920 self.manage_delObjects([id]) | |
| 921 if RESPONSE: | |
| 922 self.redirect(RESPONSE, 'manageInfoBlocks') | |
| 923 | |
| 924 | |
| 63 | 925 def getAdditionalPublicationList(self): |
| 926 """hole publications aus der datenbank""" | |
| 927 query="select * from pubmanbiblio_projects where lower(key_main) = lower(%s) order by priority DESC" | |
| 928 return self.executeZSQL(query,[self.getId()]) | |
| 929 | |
| 930 | |
| 931 def hasAdditionalPublications(self): | |
| 932 """test if extended publication list exists""" | |
| 933 query="select count(*) from pubmanbiblio_projects where lower(key_main) = lower(%s)" | |
| 934 res= self.executeZSQL(query,[self.getId()]) | |
| 935 if res[0].count > 0: | |
| 936 return True | |
| 937 else: | |
| 938 return False | |
| 50 | 939 |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
940 |
| 63 | 941 def addAdditionalPublicationsFromPubman(self,REQUEST): |
| 942 """addPublications from pubman""" | |
| 943 data=REQUEST.form | |
| 944 if data.get("method",None) is None: | |
| 945 pt = self.editAddAdditionalPublications | |
| 946 return pt() | |
| 947 | |
| 948 if data.get("method") == "search": | |
| 949 entries= self.mpiwgPubman.search(data) | |
| 950 pt = self.editAddAdditionalPublications | |
| 951 return pt(values=entries) | |
| 952 | |
| 953 if data.get("method") == "add": | |
| 954 return self.addEntriesToAdditionalPublicationList(data) | |
| 955 #pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt/staff/pubman','add_publications.zpt')).__of__(self) | |
| 956 | |
| 957 | |
| 958 def addEntriesToAdditionalPublicationList(self,data): | |
| 959 """fuege eintrage aus data zur publications liste. | |
| 960 | |
| 961 @param data Map mit escidocID --> value | |
| 962 value muss "add" sein damit hinzugefuegt wird""" | |
| 963 for key in data.keys(): | |
| 964 if key.startswith('escidoc:'): | |
| 965 query="INSERT INTO pubmanbiblio_projects (key_main,escidocId) values (%s,%s)" | |
| 966 if data.get(key)=="add": | |
| 967 self.executeZSQL(query,[self.getId(),key]) | |
| 968 | |
| 969 if hasattr(self,'REQUEST'): | |
| 970 return self.REQUEST.response.redirect("changeAdditionalPublications") | |
| 971 | |
| 972 | |
| 973 def changeAdditionalPublications(self,REQUEST): | |
| 974 """change published publications""" | |
| 975 data=REQUEST.form | |
| 976 if data.get("method","change"): | |
| 977 for key in data.keys(): | |
| 978 splitted=key.split("__") #format escidoc_id__p fuer priority, nur escidocid | |
| 979 value=data[key] | |
| 980 if len(splitted)==1: | |
| 981 self.deleteFromAdditionalPublicationList(key); | |
| 44 | 982 |
| 63 | 983 elif(splitted[1]) == "p": |
| 984 self.setAdditionalPublicationPriority(splitted[0],value); | |
| 985 | |
| 986 pt = self.editAdditionalPublicationsForm | |
| 987 return pt() | |
| 988 | |
| 989 | |
| 990 def deleteFromAdditionalPublicationList(self,escidocid): | |
| 991 """Loessche publication with escidoc id from publication list""" | |
| 992 query ="DELETE FROM pubmanbiblio_projects WHERE escidocid=%s and key_main=%s" | |
| 993 self.executeZSQL(query,[escidocid,self.getId()]); | |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
994 |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
995 |
| 63 | 996 def setAdditionalPublicationPriority(self,escidocid,value): |
| 997 query="update pubmanbiblio_projects set priority=%s where escidocid=%s and key_main=%s" | |
| 998 try: | |
| 999 value = int(value) | |
| 1000 self.executeZSQL(query,[value,escidocid,self.getId()]); | |
| 1001 except: | |
| 1002 logging.error("couldn't change:") | |
| 1003 logging.error(escidocid) | |
| 1004 logging.error(value) | |
| 44 | 1005 |
| 50 | 1006 |
| 35 | 1007 def getActualVersion(self, date=None): |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1008 """actuelle version""" |
| 35 | 1009 def sortProjectsByTime(x, y): |
| 1010 return cmp(x[1].archiveTime, y[1].archiveTime) | |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1011 |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1012 if not date: |
| 44 | 1013 if self.isCurrentVersion(): |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1014 return self |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1015 else: |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1016 return None |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1017 |
| 35 | 1018 # suche ob aeltere versionen vorhanden sind |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1019 |
| 35 | 1020 finds = self.ZopeFind(self, obj_metatypes=['MPIWGProject']) |
| 1021 if not finds: # wenn nicht dann teste ob die aktuelle version schon existiert hat. | |
| 1022 ad = getattr(self, 'creationTime', '20050101000000') | |
| 1023 if int(date) > int(ad): | |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1024 return self |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1025 else: |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1026 return None |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1027 |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1028 else: |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1029 finds.sort(sortProjectsByTime) |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1030 |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1031 for find in finds: |
| 35 | 1032 # gehe durch die alten Projekte und finde das entprechende |
| 1033 if (int(find[1].archiveTime) > int(date)) and (int(date) > int(getattr(find[1], 'creationTime', '20050101000000'))): | |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1034 return find[1] |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1035 |
| 35 | 1036 # kein passendes gefunden, dann teste ob das aktuelle in frage kommt |
| 1037 ad = getattr(self, 'creationTime', '20050101000000') | |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1038 |
| 35 | 1039 if int(date) > int(ad): |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1040 |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1041 return self |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1042 else: |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1043 return None |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1044 |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1045 |
| 44 | 1046 def isCurrentVersion(self): |
| 1047 """Return if project is the current version.""" | |
| 1048 currentTime = time.localtime() | |
| 1049 # print getattr(self,'archiveTime',currentTime) | |
| 1050 return (getattr(self, 'archiveTime', currentTime) >= currentTime) | |
| 1051 | |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1052 |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1053 def copyObjectToArchive(self): |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1054 """kopiere aktuelles objekt ins archiv""" |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1055 logging.info("copytoarchive 1") |
| 35 | 1056 cb = self.aq_parent.manage_copyObjects(self.getId()) |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1057 logging.info("copytoarchive 2") |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1058 self.manage_pasteObjects(cb) |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1059 logging.info("copytoarchive 3") |
| 35 | 1060 actualTime = time.localtime() |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1061 |
| 35 | 1062 self.manage_renameObject(self.getId(), self.getId() + "_" + time.strftime("%Y%m%d%H%M%S", actualTime)) |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1063 logging.info("copytoarchive 4") |
| 35 | 1064 obj = getattr(self, self.getId() + "_" + time.strftime("%Y%m%d%H%M%S", actualTime)) |
| 1065 obj.setArchiveTime(time.strftime("%Y%m%d%H%M%S", actualTime)) | |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1066 logging.info("copytoarchive 5") |
| 35 | 1067 ids = [x[0] for x in self.ZopeFind(obj, obj_metatypes=['MPIWGProject'])] |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1068 logging.info("copytoarchive 6") |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1069 obj.manage_delObjects(ids) |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1070 logging.info("copytoarchive 7") |
| 60 | 1071 |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1072 |
| 35 | 1073 def setArchiveTime(self, time): |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1074 """set Archive Time""" |
| 35 | 1075 self.archiveTime = time[0:] |
| 60 | 1076 |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1077 |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1078 def delArchiveTime(self): |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1079 """delete archive time""" |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1080 del self.archiveTime |
| 60 | 1081 |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1082 |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1083 def isActiveProject(self): |
| 39 | 1084 """check if the project is still active, default is true.""" |
| 35 | 1085 return getattr(self, 'isActiveFlag', True) |
| 60 | 1086 |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1087 |
| 27 | 1088 def checkActive(self, active): |
| 1089 """returns if the project state matches the active state. | |
| 1090 active = 0 : all projects | |
| 1091 active = 1 : active projects | |
| 1092 active = 2 : inactive projects | |
| 1093 """ | |
| 35 | 1094 act = getattr(self, 'isActiveFlag', True) |
| 27 | 1095 return (active == 1 and act) or (active == 0) or (active == 2 and not act) |
| 60 | 1096 |
| 27 | 1097 |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1098 def isArchivedProject(self): |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1099 """check if the project is archived""" |
| 35 | 1100 completed = self.getCompletedAt() |
| 1101 # completed leer | |
| 1102 if completed == "" : | |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1103 return False; |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1104 if completed == 0: |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1105 return False; |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1106 |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1107 return True |
| 60 | 1108 |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1109 |
| 27 | 1110 def checkArchived(self, archived): |
| 1111 """returns if the project state matches the archived state. | |
| 1112 archived = 0 : all projects | |
| 1113 archived = 1 : current projects | |
| 1114 archived = 2 : archived projects | |
| 1115 """ | |
| 1116 arch = self.isArchivedProject() | |
| 1117 return (archived == 1 and not arch) or (archived == 0) or (archived == 2 and arch) | |
| 60 | 1118 |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1119 |
| 35 | 1120 def setActiveFlag(self, status=True): |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1121 """set the active flag""" |
| 35 | 1122 self.isActiveFlag = status |
| 60 | 1123 |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1124 |
| 35 | 1125 def setCompletedAt(self, date): |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1126 """set the date of completion, date should be in the form DD.MM.YYYY or MM.YYYY or YYYY""" |
| 35 | 1127 # logging.info("DATE:"+repr(date)) |
| 1128 transformedDate = self.transformDate(date); | |
| 1129 # logging.info("transformed"+repr(transformedDate)) | |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1130 if transformedDate is not None: |
| 35 | 1131 setattr(self, "completedAt", transformedDate) |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1132 return True; |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1133 else: |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1134 return False; |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1135 |
| 35 | 1136 def setStartedAt(self, date): |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1137 """set the date of start, date should be in the form DD.MM.YYYY or MM.YYYY or YYYY""" |
| 35 | 1138 # logging.info("DATE:"+repr(date)) |
| 1139 transformedDate = self.transformDate(date); | |
| 1140 # logging.info("transformed"+repr(transformedDate)) | |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1141 if transformedDate is not None: |
| 35 | 1142 setattr(self, "startedAt", transformedDate) |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1143 return True; |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1144 else: |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1145 return False; |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1146 |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1147 def getCompletedAt(self): |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1148 """gibt das transformierte Datum zurueck, an dem das Projekt beendet wurde.""" |
| 35 | 1149 date = getattr(self, 'completedAt', '') |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1150 if date: |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1151 return self.reTransformDate(date); |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1152 else: |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1153 return "" |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1154 |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1155 def getStartedAt(self): |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1156 """gibt das transformierte Datum zurueck, an dem Projekt begonnen wurde.""" |
| 35 | 1157 date = getattr(self, 'startedAt', '') |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1158 if date: |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1159 return self.reTransformDate(date); |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1160 else: |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1161 return ''; |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1162 |
| 35 | 1163 def reTransformDate(self, date): |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1164 """transformiert , transformdate zurueck""" |
| 35 | 1165 year = int(date / 10000) |
| 1166 month = int((date - year * 10000) / 100) | |
| 1167 day = int((date - year * 10000 - month * 100)) | |
| 1168 if (day == 0) and (month == 0): | |
| 1169 return """%s""" % year; | |
| 1170 if day == 0 : | |
| 1171 return """%s.%s""" % (month, year); | |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1172 |
| 35 | 1173 return """%s.%s.%s""" % (day, month, year); |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1174 |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1175 |
| 35 | 1176 def transformDate(self, date): |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1177 """transformiert ein Datum von DD.MM.YYYY, MM.YYYY,YYYY nach YYYYMMDD, alle nicht angebenen Werte |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1178 werden auf 0 gesetzt, es wird null zurueckgegeben falls das Datum ungueltig ist""" |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1179 |
| 35 | 1180 if (date == None): |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1181 return None; |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1182 |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1183 |
| 35 | 1184 if (date.lstrip().rstrip() == "") : |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1185 return ""; |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1186 |
| 35 | 1187 splitted = date.split(".") |
| 1188 length = len(splitted) | |
| 1189 year = 0 | |
| 1190 month = 0 | |
| 1191 day = 0 | |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1192 if length > 3: |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1193 return ""; |
| 35 | 1194 if length == 3: |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1195 day = int(splitted[0]) |
| 35 | 1196 if length > 1: |
| 1197 month = int(splitted[length - 2]) | |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1198 |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1199 if length > 0: |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1200 try: |
| 35 | 1201 year = int(splitted[length - 1]) |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1202 except: |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1203 pass |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1204 |
| 35 | 1205 # # logging.info("month:"+(month)) |
| 1206 if not (0 <= month < 13): | |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1207 return None; |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1208 |
| 35 | 1209 if not(0 <= day < 32): |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1210 return None; |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1211 |
| 35 | 1212 if (year > 0) and (year < 1900): # jahr nicht vierstellig eingegeben |
| 1213 year = 2000 + year; | |
| 1214 return year * 10000 + month * 100 + day | |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1215 |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1216 |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1217 |
| 35 | 1218 def checkDate(self, date): |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1219 """teste ob zum Zeitpunkt date eine andere version existierte""" |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1220 |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1221 |
| 35 | 1222 def sortProjectsByTime(x, y): |
| 1223 return cmp(x[1].archiveTime, y[1].archiveTime) | |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1224 |
| 35 | 1225 # suche ob aeltere versionen vorhanden sind |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1226 |
| 35 | 1227 finds = self.ZopeFind(self, obj_metatypes=['MPIWGProject']) |
| 1228 if not finds: # wenn nicht dann teste ob die aktuelle version schon existiert hat. | |
| 1229 ad = getattr(self, 'creationTime', '20050101000000') | |
| 1230 if int(date) > int(ad): | |
| 1231 return self.REQUEST['URL1'] + "/" + self.getId() | |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1232 else: |
| 35 | 1233 return self.REQUEST['URL1'] + "/no_project" |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1234 |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1235 else: |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1236 finds.sort(sortProjectsByTime) |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1237 |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1238 for find in finds: |
| 35 | 1239 # gehe durch die alten Projekte und finde das entprechende |
| 1240 if (int(find[1].archiveTime) > int(date)) and (int(date) > int(getattr(find[1], 'creationTime', '20050101000000'))): | |
| 1241 return self.REQUEST['URL1'] + "/" + find[1].getId() | |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1242 |
| 35 | 1243 # kein passendes gefunden, dann teste ob das aktuelle in frage kommt |
| 1244 ad = getattr(self, 'creationTime', '20050101000000') | |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1245 |
| 60 | 1246 if int(date) > int(ad): |
| 35 | 1247 return self.REQUEST['URL1'] + "/" + self.getId() |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1248 else: |
| 35 | 1249 return self.REQUEST['URL1'] + "/no_project" |
| 60 | 1250 |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1251 |
| 97 | 1252 def saveFromPreview(self, RESPONSE=None): |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1253 """save content aus preview""" |
| 35 | 1254 self.WEB_project_description = self.previewTemplate.WEB_project_description[0:] |
| 97 | 1255 #self.REQUEST.RESPONSE.redirect("./index.html") |
| 1256 if RESPONSE is not None: | |
| 1257 return self.editDescription() | |
| 63 | 1258 |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1259 |
| 97 | 1260 def saveEditedContent(self, kupu=None, preview=None, RESPONSE=None): |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1261 """save Edited content""" |
| 35 | 1262 # logging.debug("saveEditedContent kupu=%s preview=%s"%(kupu,preview)) |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1263 |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1264 if preview: |
| 35 | 1265 kupu = preview |
| 97 | 1266 |
| 35 | 1267 # find content of body tags |
| 1268 start = kupu.find("<body>") | |
| 1269 end = kupu.find("</body>") | |
| 1270 newcontent = kupu[start + 6:end] | |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1271 |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1272 if preview: |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1273 return self.preview(newcontent) |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1274 |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1275 self.copyObjectToArchive() |
| 35 | 1276 self.WEB_project_description = newcontent[0:] |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1277 |
| 97 | 1278 #self.REQUEST.RESPONSE.redirect("./index.html") |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1279 |
| 97 | 1280 if RESPONSE is not None: |
| 1281 return self.editDescription() | |
| 1282 | |
| 60 | 1283 |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1284 def getBreadcrumbs(self): |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1285 """return list of breadcrumbs from here to the root""" |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1286 crumbs = [] |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1287 # skip direct parent Folder /projects/ |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1288 parent = self.aq_parent.aq_parent |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1289 # get parents breadcrumbs |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1290 if hasattr(parent, 'getBreadcrumbs'): |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1291 crumbs = parent.getBreadcrumbs() |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1292 |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1293 # try to get acquisition URL from parent |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1294 if hasattr(parent, 'absolute_url'): |
| 35 | 1295 baseUrl = "%s/%s/" % (parent.absolute_url(), 'projects') |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1296 else: |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1297 baseUrl = "/en/research/projects/" |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1298 |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1299 # add in the internal project hierarchy |
| 52 | 1300 tree = self.getProjectTree() |
| 1301 ap = tree.getAncestorsOf(self.getNumber()) | |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1302 # start with grandparents |
| 52 | 1303 for p in ap: |
| 1304 label = shortenString(p.getLabel(), 13) | |
| 1305 crumbs.append((label, p.getUrl(baseUrl=baseUrl), p)) | |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1306 |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1307 # add this project |
| 52 | 1308 crumbs.append((self.getLabel(), self.getUrl(baseUrl=baseUrl), self)) |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1309 |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1310 return crumbs |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1311 |
| 52 | 1312 # TODO: is this used? |
| 35 | 1313 def preview(self, description): |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1314 """preview""" |
| 35 | 1315 # logging.debug("preview description=%s"%description) |
| 1316 tmpPro = getattr(self, "previewTemplate", None) | |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1317 if not tmpPro: |
| 35 | 1318 tmpPro = MPIWGProject("previewTemplate") |
| 1319 self._setObject("previewTemplate", tmpPro) | |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1320 for field in definedFields: |
| 35 | 1321 setattr(tmpPro, field, getattr(self, field)) |
| 1322 tmpPro.WEB_project_description = description[0:] | |
| 1323 tmpPro.invisible = True | |
| 97 | 1324 pt = PageTemplateFile('zpt/project/edit_preview_frame', globals()).__of__(self) |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1325 return pt() |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1326 |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1327 |
| 35 | 1328 def isResponsibleScientist(self, key): |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1329 """teste ob eine Person in der Liste der respl. scientists auftaucht""" |
| 35 | 1330 for resp in self.getResponsibleScientistsList(): |
| 60 | 1331 logging.debug("resp=%s key=%s"%(repr(resp),repr(key))) |
| 63 | 1332 # TODO: we need to get ASCII keys!! |
| 80 | 1333 if utf8ify(resp.get('key', '')).lower() == utf8ify(key).lower(): |
| 35 | 1334 return True |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1335 |
| 35 | 1336 return False |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1337 |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1338 |
| 35 | 1339 def identifyNames(self, nameList): |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1340 """Bekommt eine Komma oder Semikolon getrennte Liste mit Name der Form Vorname MittelName(n) Nachname |
| 33 | 1341 und ordnet diese dann Mitarbeiter IDs zu. |
| 1342 | |
| 1343 Returns a dict with full names as keys and a row of person objects from the database as values. | |
| 1344 | |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1345 @param nameList |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1346 """ |
| 35 | 1347 if nameList.find(";") > -1: # rate Trenner ist ; |
| 1348 names = nameList.split(";") | |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1349 else: |
| 35 | 1350 names = nameList.split(",") |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1351 |
| 35 | 1352 # #nameList=nameList.replace(";",",") # falls ; als Trenner ersetze |
| 1353 returnNamesDict = {} | |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1354 |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1355 for name in names: |
| 35 | 1356 name = name.strip() |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1357 nameSplitted = name.split(" ") |
| 35 | 1358 if len(nameSplitted) > 1: # vor und nachname angegeben) |
| 1359 lastname = nameSplitted[-1] | |
| 1360 firstname = nameSplitted[0] | |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1361 else: |
| 35 | 1362 firstname = "" |
| 1363 lastname = nameSplitted[0] | |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1364 |
| 35 | 1365 # finde Mitarbeiter mit den entsprechenden Name |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1366 |
| 35 | 1367 # firstname=self.myCapitalize(firstname).encode('utf-8') |
| 1368 # lastname=self.myCapitalize(lastname).encode('utf-8') | |
| 1369 logging.debug("Search: %s %s %s" % (name, repr(firstname), repr(lastname))) | |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1370 try: |
| 35 | 1371 # cataloggedNames=self.MembersCatalog(firstName=firstname,lastName=lastname) |
| 33 | 1372 # TODO: I think this does not work without firstname |
| 1373 # try to find names in members db by searching for sub-words | |
| 1374 cataloggedNames = self.executeZSQL("select * from personal_www where first_name ~* ('\m'||%s||'\M') and last_name ~* ('\m'||%s||'\M')", (firstname, lastname)) | |
| 1375 if len(cataloggedNames) == 0: | |
| 1376 # PostgreSQL has a bug with \m and words ending in non-ASCII :-( | |
| 1377 cataloggedNames = self.executeZSQL("select * from personal_www where %s in (select regexp_split_to_table(lower(first_name), '\s+')) and %s in (select regexp_split_to_table(lower(last_name), '\s+'))", (firstname.lower(), lastname.lower())) | |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1378 except: |
| 35 | 1379 cataloggedNames = [] |
| 1380 logging.error("ERROR: identifyNames %s %s" % sys.exc_info()[0:2]) | |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1381 |
| 35 | 1382 if len(cataloggedNames) > 0: |
| 1383 returnNamesDict[name] = cataloggedNames | |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1384 else: |
| 35 | 1385 returnNamesDict[name] = [] |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1386 |
| 50 | 1387 logging.debug("identified names: %s" % repr(returnNamesDict)) |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1388 return returnNamesDict |
| 33 | 1389 |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1390 |
| 49 | 1391 def editMPIWGProject(self, fromEdit=None, createNewVersion=True, RESPONSE=None): |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1392 """edit the project and archive the old version""" |
| 49 | 1393 logging.debug("editMPIWGProject(fromEdit=%s, createNewVersion=%s)"%(fromEdit,createNewVersion)) |
| 1394 if createNewVersion: | |
| 1395 self.copyObjectToArchive() # archive the object | |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1396 |
| 35 | 1397 formdata = self.REQUEST.form |
| 1398 | |
| 1399 # set all definedFields | |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1400 for x in definedFields: |
| 35 | 1401 if formdata.has_key(x): |
| 50 | 1402 setattr(self, x, unicodify(formdata[x])) |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1403 |
| 35 | 1404 # TODO: What does this do? |
| 1405 completedAt = formdata.get('completedAt') | |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1406 if not self.setCompletedAt(completedAt): |
| 35 | 1407 RESPONSE.redirect('./editMPIWGBasisEditor?error=dateWrong') |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1408 |
| 35 | 1409 startedAt = formdata.get('startedAt') |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1410 if not self.setStartedAt(startedAt): |
| 35 | 1411 RESPONSE.redirect('./editMPIWGBasisEditor?error=dateWrong') |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1412 |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1413 if self.REQUEST.has_key('active'): |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1414 self.setActiveFlag(True) |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1415 else: |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1416 self.setActiveFlag(False) |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1417 |
| 35 | 1418 # make dict of responsible scientists |
| 1419 checkedScientists = {} | |
| 1420 names = {} | |
| 1421 keys = {} | |
| 43 | 1422 for key in formdata: |
| 35 | 1423 # gehe durch das Formular |
| 1424 keyParts = key.split("_") | |
| 1425 if keyParts[0] == "responsibleScientist": | |
| 1426 # wenn es ein Feld der Form reponsibleScientist_nr_KEY gibt | |
| 1427 nr = keyParts[2] | |
| 1428 if keyParts[1] == "name": | |
| 50 | 1429 names[nr] = unicodify(formdata[key]) |
| 35 | 1430 elif keyParts[1] == "key": |
| 1431 keys[nr] = formdata[key] | |
| 1432 | |
| 43 | 1433 for nr in names: |
| 35 | 1434 name = names[nr] |
| 1435 key = keys.get(nr, None) | |
| 1436 username = None | |
| 1437 if key: | |
| 1438 # get username from db | |
| 80 | 1439 member = self.en.getMPIWGRoot().getStaffFolder().getMember(key=key) |
| 40 | 1440 if member is not None: |
| 1441 username = member.getUsername() | |
| 35 | 1442 |
| 1443 # schreibe keys und namen in die Liste | |
| 1444 checkedScientists[names[nr]] = {'name' : name, 'key' : key, 'username' : username} | |
| 1445 | |
| 44 | 1446 # update responsibleScientistsList |
| 35 | 1447 self.setResponsibleScientistsList(checkedScientists) |
| 39 | 1448 self.updateProjectMembers() |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1449 |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1450 if fromEdit and (RESPONSE is not None): |
| 35 | 1451 return self.editBasic() |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1452 |
| 60 | 1453 if RESPONSE is not None: |
| 1454 RESPONSE.redirect('manage_main') | |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1455 |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1456 |
| 60 | 1457 def getContent(self, field, filter=None): |
| 1458 """Inhalt des Feldes""" | |
| 1459 val = getattr(self, field, '') | |
| 1460 if isinstance(val, list): | |
| 1461 val = val[0] | |
| 1462 | |
| 1463 return val | |
| 1464 | |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1465 |
| 35 | 1466 def loadNewFile(self, RESPONSE=None): |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1467 """einlesen des neuen files""" |
| 35 | 1468 fileupload = self.REQUEST['fileupload'] |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1469 if fileupload: |
| 35 | 1470 file_name = fileupload.filename |
| 1471 filedata = fileupload.read() | |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1472 |
| 35 | 1473 argv = xmlhelper.proj2hash(filedata) |
| 1474 # print argv.keys() | |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1475 for arg in definedFields: |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1476 |
| 35 | 1477 # print arg,argv[arg],getattr(self,arg) |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1478 try: |
| 35 | 1479 temp = argv[arg][0:] |
| 1480 # old=getattr(self,arg) | |
| 1481 setattr(self, arg, temp) | |
| 1482 # print old,getattr(self,arg) | |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1483 except: |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1484 """nothing""" |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1485 |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1486 if RESPONSE is not None: |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1487 RESPONSE.redirect('manage_main') |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1488 |
| 60 | 1489 |
| 35 | 1490 def tagTheProject(self, RESPONSE=None): |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1491 """TAG""" |
| 35 | 1492 id = self.getId(); |
| 1493 tmpl = getattr(self.thesaurus, "main.html") | |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1494 if RESPONSE: |
| 35 | 1495 RESPONSE.redirect("./thesaurus/main.html?project=" + id) |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1496 return |
| 36 | 1497 |
| 1498 | |
| 81 | 1499 def moveObjectDigitallibraryToInfoBlock(self): |
| 1500 """Move text from 'Object Digitallibrary' to InfoBlock.""" | |
| 1501 text = self.getRelatedDigitalSources() | |
| 1502 if text: | |
| 1503 logging.debug("Moving 'Object Digitallibrary' to InfoBlock: %s"%repr(text)) | |
| 1504 self.addInfoBlock(block_title='Related digital sources', item_text=text, item_link=None) | |
| 1505 delattr(self, 'xdata_11') | |
| 1506 | |
| 1507 | |
| 50 | 1508 def hasRelatedPublicationsOldVersion(self): |
| 52 | 1509 """teste ob es related publications gibt""" |
| 50 | 1510 ret = True; |
| 61 | 1511 if (getattr(self, 'WEB_related_pub', '') == ''): |
| 50 | 1512 ret = False; # nichts im alten feld |
| 1513 logging.debug("webrel:" + repr(ret)) | |
| 1514 if (getattr(self, 'WEB_related_pub_copied', False)): | |
| 1515 ret = False; # alte daten sind schon kopiert worden | |
| 1516 | |
| 1517 logging.debug("webrel_copied:" + repr(ret)) | |
| 1518 publications = self.ZopeFind(self, obj_metatypes=['MPIWGProject_publication']); | |
| 1519 | |
| 1520 if(len(publications) > 0): | |
| 1521 ret = False; # es gibt publicationen in der neuen liste | |
| 60 | 1522 |
| 50 | 1523 logging.debug("len(publ)" + repr(ret)) |
| 1524 | |
| 1525 return ret; | |
| 1526 | |
| 1527 | |
| 52 | 1528 def copyPublicationsToList(self, RESPONSE=None): |
| 1529 """copy publications in to list""" | |
| 60 | 1530 publicationTxt = getattr(self, 'WEB_related_pub', '') |
| 1531 if isinstance(publicationTxt, list): | |
| 1532 publicationTxt = publicationTxt[0] | |
| 52 | 1533 |
| 1534 pubSplits = publicationTxt.split("<p>") | |
| 1535 | |
| 1536 for pubSplit in pubSplits: | |
| 1537 pubSplit = pubSplit.replace("</p>", "") | |
| 1538 self.addPublication(pubSplit) | |
| 1539 | |
| 1540 setattr(self, "WEB_related_pub_copied", True); | |
| 1541 | |
| 1542 if RESPONSE: | |
| 1543 self.redirect(RESPONSE, 'managePublications') | |
| 1544 | |
| 1545 | |
| 50 | 1546 def hasInlineImage(self): |
| 1547 """Return the number of inline images in the description.""" | |
| 1548 text = self.getDescription() | |
| 1549 cnt = text.count('<p class="picture">') | |
| 1550 return cnt | |
| 1551 | |
| 1552 | |
| 1553 def copyImageToMargin(self, RESPONSE=None): | |
| 1554 """copy inline images to marginal images""" | |
| 1555 # getImages from WEB_project_description | |
| 1556 description = self.getDescription() | |
| 1557 | |
| 1558 text2 = description | |
| 1559 splitted = text2.split("""<p class="picture">""") | |
| 1560 | |
| 1561 imageURLs = [] | |
| 1562 imageCaptions = [] | |
| 1563 for split in splitted[1:]: | |
| 1564 tmp = split.split("</p>") | |
| 1565 # return repr(splitted[1]) | |
| 1566 | |
| 1567 try: | |
| 1568 imageURLs.append(tmp[0].split("\"")[1].encode('utf-8')) | |
| 1569 except: | |
| 1570 | |
| 1571 try: | |
| 1572 imageURLs.append(tmp[0].split("src=")[1].split(" ")[0].encode('utf-8')) | |
| 1573 except: | |
| 1574 imageURLs.append("") | |
| 1575 | |
| 1576 split2 = "</p>".join(tmp[1:]) | |
| 1577 splitted = split2.split("""<p class="picturetitle">""") | |
| 1578 if len(splitted) > 1: | |
| 1579 tmp = splitted[1].split("</p>") | |
| 1580 imageCaptions.append(tmp[0].encode('utf-8')) | |
| 1581 | |
| 1582 else: | |
| 1583 # keine caption | |
| 1584 imageCaptions.append("") | |
| 1585 | |
| 1586 # eintragen: | |
| 1587 for imageURL in imageURLs: | |
| 1588 if not imageURL: | |
| 1589 # no URL - no image | |
| 1590 continue | |
| 1591 | |
| 1592 filename = imageURL.split("/")[-1] | |
| 1593 # lege neues images object an, mit leerem bild | |
| 1594 | |
| 1595 if filename in self: | |
| 1596 # existiert das bild schon, dann neuen filenamen | |
| 1597 filename = "project_image_" + filename | |
| 1598 if filename in self: | |
| 1599 # exists too - assume its already converted | |
| 1600 logging.warn("copyImageToMargin: image %s exists - skipping!"%filename) | |
| 1601 continue | |
| 1602 | |
| 1603 self.addImage(None, imageCaptions[imageURLs.index(imageURL)], filename=filename) | |
| 1604 # hole die bilddaten aus der url | |
| 1605 url = self.absolute_url() + "/" + imageURL | |
| 1606 # url=self.absolute_url()+"/"+filename | |
| 1607 | |
| 1608 try: # relative url | |
| 1609 data = urllib.urlopen(url).read() | |
| 1610 except: | |
| 1611 try: # absolute | |
| 1612 data = urllib.urlopen(self.imageURL).read() | |
| 1613 except: | |
| 1614 logging.error("copyImageToMargin: can't open: %s" % url) | |
| 1615 | |
| 1616 obj = getattr(self, filename) | |
| 1617 obj.update_data(data) | |
| 1618 | |
| 1619 # clean description | |
| 1620 logging.debug("copyImageToMargin: description:%s"%repr(description)) | |
| 1621 dom = ET.fromstring(utf8ify("<html>%s</html>"%description)) | |
| 1622 for e in dom.findall(".//p[@class='picture']"): | |
| 1623 # remove contents | |
| 1624 e.clear() | |
| 1625 # remove tag | |
| 1626 e.tag = None | |
| 1627 | |
| 1628 for e in dom.findall(".//p[@class='picturetitle']"): | |
| 1629 # remove contents | |
| 1630 e.clear() | |
| 1631 # remove tag | |
| 1632 e.tag = None | |
| 1633 | |
| 1634 # remove html tag | |
| 1635 dom.tag = None | |
| 1636 # set as new description | |
| 1637 description = unicodify(serialize(dom)) | |
| 1638 logging.debug("copyImageToMargin: new description:%s"%repr(description)) | |
| 1639 setattr(self, 'WEB_project_description', description) | |
| 1640 | |
| 1641 if RESPONSE: | |
| 1642 self.redirect(RESPONSE, 'manageImages') | |
| 1643 | |
| 1644 | |
| 36 | 1645 def updateProjectMembers(self, updateResponsibleScientistsList=False): |
| 60 | 1646 """Update project-member table.""" |
| 1647 # projects are identified by id | |
| 1648 pid = self.getId() | |
| 1649 | |
| 36 | 1650 # clear projects_members table |
| 60 | 1651 self.executeZSQL("delete from projects_members where project_id = %s", [pid]) |
| 36 | 1652 |
| 60 | 1653 for m in self.getResponsibleScientistsList(): |
| 42 | 1654 memberKey = m.get('key', None) |
| 36 | 1655 if not memberKey or not isinstance(memberKey, basestring): |
| 1656 logging.error("updateProjectMembers: not a valid member key: %s" % repr(memberKey)) | |
| 1657 continue | |
| 1658 | |
| 60 | 1659 # fill projects_members table |
| 1660 self.executeZSQL("insert into projects_members (project_id, member_key) values (%s, %s)", (pid, memberKey)) | |
| 56 | 1661 |
| 1662 | |
| 60 | 1663 |
| 56 | 1664 |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1665 def manage_addMPIWGProjectForm(self): |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1666 """form for adding the project""" |
| 35 | 1667 pt = PageTemplateFile(os.path.join(package_home(globals()), 'zpt', 'addMPIWGProjectForm.zpt')).__of__(self) |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1668 return pt() |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1669 |
| 35 | 1670 def manage_addMPIWGProject(self, id, RESPONSE=None): |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1671 """method to add a project""" |
| 35 | 1672 # print argv |
| 1673 fileupload = self.REQUEST.get('fileupload', None) | |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1674 if fileupload: |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1675 |
| 35 | 1676 file_name = fileupload.filename |
| 1677 filedata = fileupload.read() | |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1678 |
| 35 | 1679 argv = xmlhelper.proj2hash(filedata) |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1680 |
| 35 | 1681 # print argv |
| 1682 newObj = MPIWGProject(id, argv) | |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1683 else: |
| 35 | 1684 newObj = MPIWGProject(id) |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1685 |
| 35 | 1686 self._setObject(id, newObj) |
|
0
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1687 |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1688 if RESPONSE is not None: |
|
bca61e893fcc
first checkin of MPIWGWeb r2 branch from CVS into mercurial
casties
parents:
diff
changeset
|
1689 RESPONSE.redirect('manage_main') |
| 27 | 1690 |
| 1691 | |
| 33 | 1692 class MPIWGProjectFolder(ZDBInterfaceFolder): |
| 27 | 1693 """Folder of project objects""" |
| 1694 | |
| 35 | 1695 meta_type = "MPIWGProjectFolder" |
| 1696 security = ClassSecurityInfo() | |
| 1697 | |
| 27 | 1698 # cached HashTree with project hierarchy |
| 1699 _v_projectTree = None | |
| 53 | 1700 |
| 34 | 1701 def getProjectTree(self): |
| 43 | 1702 """Return the project hierarchy tree (and cache it). |
| 34 | 1703 |
| 43 | 1704 Returns HashTree instance.""" |
| 27 | 1705 tree = self._v_projectTree |
| 1706 if tree is None: | |
| 43 | 1707 tree = HashTree(keySeparator='.', keyFn=getInt) |
| 27 | 1708 for p in self.objectValues(spec='MPIWGProject'): |
| 51 | 1709 # add all projects |
| 27 | 1710 tree.add(p.getNumber(), p) |
| 1711 | |
| 1712 self._v_projectTree = tree | |
| 35 | 1713 # logging.debug("getProjectTree: tree=%s"%(tree.root.getSubtreeAsText())) |
| 27 | 1714 |
| 1715 return tree | |
| 1716 | |
| 1717 | |
| 51 | 1718 def getProjectsAsList(self, start=None, active=1, archived=1): |
| 43 | 1719 """Return flattened list of projects, starting from start. |
| 33 | 1720 |
| 27 | 1721 active = 0 : all projects |
| 1722 active = 1 : active projects | |
| 1723 active = 2 : inactive projects | |
| 1724 archived = 0 : all projects | |
| 1725 archived = 1 : current projects | |
| 1726 archived = 2 : archived projects | |
| 1727 """ | |
| 35 | 1728 # logging.debug("getProjectsAsList(start=%s,active=%s,archived=%s)"%(repr(start),active,archived)) |
| 34 | 1729 tree = self.getProjectTree() |
| 27 | 1730 node = tree.getNode(start) |
| 1731 if node is None: | |
| 1732 return [] | |
| 1733 | |
| 29 | 1734 pl = node.getSubtreeAsList() |
| 35 | 1735 # logging.debug("getProjectsAsList: node=(%s,%s) pl=%s"%(node.key,node.value,pl)) |
| 27 | 1736 # return filtered list |
| 1737 return [p for p in pl if (p.checkActive(active) and p.checkArchived(archived))] | |
| 33 | 1738 |
| 39 | 1739 |
| 1740 def getProject(self, projectNumber=None): | |
| 43 | 1741 """Return the matching project""" |
| 39 | 1742 tree = self.getProjectTree() |
| 1743 if projectNumber is not None: | |
| 1744 return tree.get(projectNumber) | |
| 1745 | |
| 1746 return None | |
| 1747 | |
| 33 | 1748 |
| 1749 def getProjectsOfMember(self, key, active=1, archived=1): | |
| 43 | 1750 """Return a list of all projects of a member. |
| 33 | 1751 |
| 1752 @param key: member's key | |
| 1753 active = 0 : all projects | |
| 1754 active = 1 : active projects | |
| 1755 active = 2 : inactive projects | |
| 1756 archived = 0 : all projects | |
| 1757 archived = 1 : current projects | |
| 1758 archived = 2 : archived projects | |
| 1759 """ | |
| 1760 projects = [] | |
| 1761 # search project numbers | |
| 1762 res = self.executeZSQL("select * from projects_members where lower(member_key) = %s", [key.lower()]) | |
| 77 | 1763 # find projects in folder |
| 33 | 1764 for r in res: |
| 77 | 1765 p = self.get(r.project_id, None) |
| 43 | 1766 # check if active |
| 33 | 1767 if p is not None and p.checkActive(active) and p.checkArchived(archived): |
| 1768 projects.append(p) | |
| 77 | 1769 |
| 1770 # sort by project number | |
| 79 | 1771 projects.sort(key=lambda p:[getInt(n) for n in p.getNumber().split('.')]) |
| 77 | 1772 return projects |
| 1773 | |
| 1774 | |
| 79 | 1775 def getMembersWithProjects(self, onlyActive=True): |
| 77 | 1776 """Return a list of all members that have projects. |
| 1777 | |
| 79 | 1778 @param onlyActive: only active members |
| 1779 | |
| 1780 Returns a list of member objects. | |
| 77 | 1781 """ |
| 79 | 1782 members = [] |
| 1783 sf = self.en.getStaffFolder() | |
| 78 | 1784 res = self.executeZSQL("select distinct member_key from projects_members") |
| 79 | 1785 if onlyActive: |
| 1786 for r in res: | |
| 1787 m = sf.getMember(key=r.member_key) | |
| 1788 if m is not None and m.isActive(): | |
| 1789 members.append(m) | |
| 1790 | |
| 1791 else: | |
| 1792 # not only active | |
| 1793 members = [sf.getMember(key=r.member_key) for r in res] | |
| 1794 | |
| 1795 return members | |
| 27 | 1796 |
| 1797 | |
| 51 | 1798 security.declareProtected('View management screens', 'changeProjectTree') |
| 1799 def changeProjectTree(self, RESPONSE=None): | |
| 1800 """change the complete tree""" | |
| 1801 form=self.REQUEST.form | |
| 1802 onlyArchived=int(form.get("onlyArchived",0)) | |
| 1803 onlyActive=int(form.get("onlyActive",0)) | |
| 1804 dep=form.get("dep",None) | |
| 1805 | |
| 1806 fields = self.getProjectsAsList(start=dep, archived=onlyArchived, active=onlyActive) | |
| 1807 | |
| 1808 logging.info("GOT TREE!----------------------------------------------------") | |
| 1809 for field in form.keys(): | |
| 1810 | |
| 1811 splitted=field.split('_') | |
| 1812 if (len(splitted)>1) and (splitted[1]=="runningNumber"): | |
| 1813 #feld hat die Form Nummer_name und runnignNumber | |
| 1814 nr=int(splitted[0]) # nummer des Datensatzes | |
| 1815 project = fields[nr] | |
| 1816 | |
| 1817 # | |
| 1818 # change active | |
| 1819 # | |
| 1820 if form.has_key('%s_active'%nr): # active flag is set | |
| 1821 project.setActiveFlag(True) | |
| 1822 else: | |
| 1823 project.setActiveFlag(False) | |
| 1824 | |
| 1825 # | |
| 1826 # nummer hat sich geaendert | |
| 1827 # | |
| 1828 entryChanged = False; | |
| 1829 pronum = project.getNumber() | |
| 1830 formnum = form['%s_number'%nr] | |
| 1831 | |
| 1832 if not (pronum == formnum): | |
| 1833 logging.debug("Changed!Number+++++++++++++++++++++++++++++++++") | |
| 1834 logging.debug(repr(fields[nr].xdata_05)+" ---> "+ repr(form[str(nr)+'_number'])) | |
| 1835 entryChanged = True | |
| 1836 | |
| 1837 # | |
| 1838 # completed hat sich geaendert | |
| 1839 # | |
| 1840 td = project.transformDate # hole die funktion zum transformieren des datums | |
| 1841 formstarted = form[str(nr)+'_started'] | |
| 1842 formcompleted = form[str(nr)+'_completed'] | |
| 1843 | |
| 1844 if not (td(project.getCompletedAt()) == td(formcompleted)): | |
| 1845 logging.info(repr(td(project.getCompletedAt()))+" ---> "+ repr(td(form[str(nr)+'_completed']))) | |
| 1846 logging.info("Changed!Completed+++++++++++++++++++++++++++++++++") | |
| 1847 entryChanged = True | |
| 1848 | |
| 1849 if not (td(project.getStartedAt()) == td(formstarted)): | |
| 1850 logging.info(repr(td(project.getStartedAt()))+" ---> "+ repr(td(form[str(nr)+'_started']))) | |
| 1851 logging.info("Changed!Started+++++++++++++++++++++++++++++++++") | |
| 1852 entryChanged = True | |
| 1853 | |
| 1854 if entryChanged: | |
| 1855 logging.info("Changed!+++++++++++++++++++++++++++++++++") | |
| 1856 project.copyObjectToArchive() | |
| 1857 project.xdata_05 = formnum | |
| 1858 project.setCompletedAt(formcompleted) | |
| 1859 project.setStartedAt(formstarted) | |
| 1860 # reset tree | |
| 1861 self._v_projectTree = None | |
| 1862 | |
| 1863 if RESPONSE is not None: | |
| 1864 RESPONSE.redirect(self.en.MPIWGrootURL()+'/admin/showTree') | |
| 1865 | |
| 52 | 1866 |
| 35 | 1867 security.declareProtected('View management screens', 'updateAllProjectMembers') |
| 33 | 1868 def updateAllProjectMembers(self, updateResponsibleScientistsList=False): |
| 43 | 1869 """Re-create responsibleScientistsLists and projects_members table from all current projects.""" |
| 33 | 1870 # empty table |
| 1871 self.executeZSQL('truncate table projects_members') | |
| 1872 cnt = 0 | |
| 1873 # go through all projects | |
| 1874 for p in self.objectValues(spec='MPIWGProject'): | |
| 1875 cnt += 1 | |
| 1876 memberlist = [] | |
| 35 | 1877 logging.debug("updateAllProjectMembers: updating project %s" % p) |
| 36 | 1878 p.updateProjectMembers(updateResponsibleScientistsList=updateResponsibleScientistsList) |
| 33 | 1879 |
| 35 | 1880 return "updated %s projects!" % cnt |
| 33 | 1881 |
| 40 | 1882 |
| 39 | 1883 security.declareProtected('View management screens', 'updateAllProjects') |
| 50 | 1884 def updateAllProjects(self, updateResponsibleScientistsList=False, RESPONSE=None): |
| 43 | 1885 """Patch all current projects for legacy problems.""" |
| 39 | 1886 cnt = 0 |
| 50 | 1887 fulllog = "" |
| 39 | 1888 # go through all projects |
| 44 | 1889 for (id, project) in self.ZopeFind(self, obj_metatypes=['MPIWGProject'], search_sub=1): |
| 50 | 1890 log = "" |
| 39 | 1891 cnt += 1 |
| 1892 # | |
| 1893 # hasRelatedPublicationsOldVersion | |
| 1894 # | |
| 1895 if project.hasRelatedPublicationsOldVersion(): | |
| 49 | 1896 log += "%s: update relatedPublicationsOldVersion!\n"%project.getId() |
| 39 | 1897 logging.debug("updateAllProjects(%s): update relatedPublicationsOldVersion!"%project.getId()) |
| 1898 project.copyPublicationsToList() | |
| 1899 | |
| 1900 # | |
| 60 | 1901 # create responsibleScientistsList automatically |
| 39 | 1902 # |
| 60 | 1903 if updateResponsibleScientistsList: |
| 39 | 1904 newScientists = {} |
| 65 | 1905 names = project.identifyNames(project.getResponsibleScientists()) |
| 60 | 1906 for name in names: |
| 1907 logging.debug("updateAllProjectMembers: name=%s" % repr(name)) | |
| 1908 members = names[name] | |
| 1909 if len(members) > 0: | |
| 1910 # take the first matching name | |
| 1911 newScientists[name] = {'name': name, 'key' : members[0].key, 'username' : re.sub('@mpiwg-berlin\.mpg\.de', '', members[0].e_mail)} | |
| 39 | 1912 |
| 1913 project.setResponsibleScientistsList(newScientists) | |
| 60 | 1914 |
| 1915 else: | |
| 1916 # | |
| 1917 # old format responsibleScientistsList | |
| 1918 # | |
| 1919 memberlist = project.getResponsibleScientistsList() | |
| 1920 if len(memberlist) > 0 and isinstance(memberlist[0], tuple): | |
| 1921 log += "%s: updating memberlist!\n"%project.getId() | |
| 1922 logging.debug("updateAllProjects(%s): updating memberlist" % project.getId()) | |
| 1923 newScientists = {} | |
| 1924 for m in memberlist: | |
| 1925 name = m[0] | |
| 1926 key = m[1] | |
| 1927 username = None | |
| 1928 if key: | |
| 1929 if isinstance(key, list): | |
| 1930 key = key[0] | |
| 1931 | |
| 1932 # get username from db | |
| 80 | 1933 member = self.en.getMPIWGRoot().getStaffFolder().getMember(key=key) |
| 60 | 1934 if member is not None: |
| 1935 username = member.getUsername() | |
| 1936 | |
| 1937 newScientists[name] = {'name': name, 'key' : key, 'username' : username} | |
| 1938 | |
| 1939 # set new list | |
| 1940 project.setResponsibleScientistsList(newScientists) | |
| 39 | 1941 |
| 1942 # | |
| 49 | 1943 # old inline images |
| 1944 # | |
| 1945 if project.hasInlineImage(): | |
| 1946 log += "%s: has inlineImage!\n"%project.getId() | |
| 1947 logging.debug("updateAllProjects(%s): has inlineImage!"%project.getId()) | |
| 1948 try: | |
| 1949 project.copyImageToMargin() | |
| 1950 except Exception, e: | |
| 1951 log += "%s: ERROR in copyImageToMargin!\n"%project.getId() | |
| 1952 logging.debug("updateAllProjects(%s): ERROR in copyImageToMargin: %s"%(project.getId(), e)) | |
| 1953 | |
| 1954 | |
| 1955 # | |
| 39 | 1956 # remove old attributes |
| 1957 # | |
| 1958 if hasattr(project, 'definedFields'): | |
| 49 | 1959 log += "%s: has definedFields!\n"%project.getId() |
| 39 | 1960 logging.debug("updateAllProjects(%s): has definedFields!"%project.getId()) |
| 1961 delattr(project, 'definedFields') | |
| 61 | 1962 |
| 45 | 1963 # |
| 61 | 1964 # update related publications |
| 45 | 1965 # |
| 61 | 1966 for pub in project.getPublicationList(): |
| 62 | 1967 if not pub.text: |
| 1968 msg = "%s: publication has no text: %s!\n"%(project.getId(), pub) | |
| 1969 log += msg | |
| 1970 logging.warn(msg) | |
| 1971 if not pub.link: | |
| 1972 msg = "%s: publication has no link either! Deleting: %s!\n"%(project.getId(), pub) | |
| 1973 log += msg | |
| 1974 logging.error(msg) | |
| 1975 project.deletePublication(pub.getId()) | |
| 1976 | |
| 1977 else: | |
| 1978 # hasLinkToBookPage updates the bookId | |
| 1979 pub.hasLinkToBookPage() | |
| 61 | 1980 |
| 81 | 1981 |
| 1982 # | |
| 1983 # update RelatedDigitalSources | |
| 1984 # | |
| 1985 project.moveObjectDigitallibraryToInfoBlock() | |
| 1986 | |
| 50 | 1987 # |
| 1988 # unicodify | |
| 1989 # | |
| 1990 for field in ('WEB_title', 'xdata_01', 'xdata_07', 'xdata_08', 'xdata_11', 'xdata_12', 'xdata_13', | |
| 1991 'WEB_project_description', 'WEB_related_pub'): | |
| 1992 text = getattr(project, field, None) | |
| 1993 if isinstance(text, str): | |
| 1994 log += "%s: has non-unicode field %s\n"%(project.getId(), field) | |
| 1995 logging.debug("updateAllProjects(%s): has has non-unicode field %s\n"%(project.getId(), field)) | |
| 1996 setattr(project, field, unicodify(text)) | |
| 1997 | |
| 1998 fulllog += log | |
| 1999 if RESPONSE is not None: | |
| 2000 RESPONSE.write(log) | |
| 62 | 2001 |
| 50 | 2002 log += "\n DONE! updated %s projects!" % cnt |
| 2003 fulllog += log | |
| 2004 if RESPONSE is not None: | |
| 2005 RESPONSE.write(log) | |
| 2006 RESPONSE.flush() | |
| 2007 else: | |
| 2008 return fulllog | |
| 39 | 2009 |
| 33 | 2010 |
| 27 | 2011 def manage_addMPIWGProjectFolderForm(self): |
| 29 | 2012 """form for adding a MPIWGProjectFolder""" |
| 27 | 2013 pt = PageTemplateFile('zpt/project/manage_add_MPIWGProjectFolder', globals()).__of__(self) |
| 2014 return pt() | |
| 2015 | |
| 35 | 2016 def manage_addMPIWGProjectFolder(self, id, title, RESPONSE=None): |
| 29 | 2017 """add a MPIWGProjectFolder""" |
| 35 | 2018 newObj = MPIWGProjectFolder(id, title) |
| 27 | 2019 |
| 35 | 2020 self._setObject(id, newObj) |
| 27 | 2021 |
| 2022 if RESPONSE is not None: | |
| 2023 RESPONSE.redirect('manage_main') | |
| 2024 |
