Mercurial > hg > MPIWGThesaurus
annotate MPIWGThesaurus.py @ 40:1eabc75b9180
remove link to getAllProjectsAndTagsAsCSV
author | casties |
---|---|
date | Wed, 30 Oct 2013 10:18:08 +0100 |
parents | 4342a81e0aa0 |
children | 9a23640f7f49 |
rev | line source |
---|---|
1 | 1 #Klasse zum Taggen und Anzeigen der Tags von Projekte bzw. allgemein Webseiten des Institutes |
2 #Tags werden in der Instanz abgespeichert | |
3 #Personenname kommen aus dem Virtuoso-Triplestore , lokal erzeugte zusaetliche Name werden dort abgespeichert | |
10 | 4 #Fuer die Suche ueber die Personenname wird das MetaDataManagerRestlet benoetigt. |
1 | 5 #TODO: Zur Zeit werden die entsprechenden Server URLs hier in der Klasse definiert. |
6 | |
7 | |
0 | 8 # TODO: generell verwaltung der tags im triple store und nicht in zope. |
1 | 9 # TODO: mache server und namespaces konfigurierbar im project |
10 | |
11 | |
0 | 12 from OFS.Folder import Folder |
13 from Globals import package_home | |
14 from Products.PageTemplates.PageTemplateFile import PageTemplateFile | |
15 from BTrees.OOBTree import OOBTree | |
16 from BTrees.OOBTree import OOSet | |
2 | 17 from AccessControl import ClassSecurityInfo |
18 | |
0 | 19 #import os |
20 import os.path | |
21 import logging | |
22 import time | |
23 import email.Utils | |
24 from types import ListType | |
25 import transaction | |
26 import random | |
27 import urllib2 | |
28 import urllib | |
20 | 29 |
18 | 30 |
0 | 31 |
17 | 32 class projectHolder: |
33 projectHolder="" | |
34 projectName="" | |
35 projectID="" | |
36 persons="" | |
37 tags={} | |
38 | |
39 def __init__(self,ID): | |
40 self.projectID=ID | |
41 self.tags={} | |
42 | |
1 | 43 #Entry beschreibt jeweils einen Tag mit dem Namen "title", entries enthaelt eine Liste von Subtags (der Klasse Entry), die diesem Tag untergeordnet sind. |
0 | 44 class Entry: |
45 """publicClass""" | |
1 | 46 |
47 #=========================================================================== | |
48 # __init__ | |
49 #=========================================================================== | |
0 | 50 def __init__(self,title,entries=[]): |
51 self.title=title | |
52 self.entries=entries | |
53 | |
54 def getTitle(self): | |
55 """getTitle""" | |
56 return self.title | |
57 | |
1 | 58 #Beschriebt einen von einem Benutzer vorgeschlagenen Tag |
0 | 59 class SuggestedTag: |
60 """publicClass""" | |
61 type="" | |
62 userName="" | |
63 def __init__(self,name,comment,type,userName): | |
64 self.name=name | |
65 self.comment=comment | |
66 self.type=type | |
67 self.userName=userName | |
68 | |
69 | |
70 class MPIWGThesaurus(Folder): | |
71 """MPIWGThesaurus main folder""" | |
2 | 72 security=ClassSecurityInfo() |
73 | |
0 | 74 meta_type="MPIWGThesaurus" |
75 | |
76 TMP_PERSON_NS="http://ontologies.mpiwg-berlin.mpg.de/tempObjects/person/" | |
77 ONTOLOGY_NS="http://ontologies.mpiwg-berlin.mpg.de/authorities/namedIdentities/" | |
7 | 78 personproviderURL="http://127.0.0.1:8280/MetaDataManagerRestlet/person/" |
79 #personproviderURL="http://virtuoso.mpiwg-berlin.mpg.de:8080/MetaDataManagerRestlet/person/" | |
80 #PERSONS_LOOKUP_URL="http://127.0.0.1:8280/MetaDataManagerRestlet/search/persons" | |
81 PERSONS_LOOKUP_URL="http://127.0.0.1:8280/MetaDataManagerRestlet/persons" | |
8 | 82 EDIT_URL="http://127.0.0.1:8280/MetaDataManagerRestlet/edit?id=" |
83 #PERSONS_LOOKUP_URL="http://virtuoso.mpiwg-berlin.mpg.de:8080/MetaDataManagerRestlet/person/" | |
7 | 84 |
0 | 85 additionalNamesGraphURL="file://newpersonsFromProjects" |
86 | |
87 #virtuosoServer="http://ontologies.mpiwg-berlin.mpg.de" | |
88 virtuosoServer="http://virtuoso.mpiwg-berlin.mpg.de:8890" | |
89 virtuosoDAV="/DAV/home/websiteuser/" | |
90 virtuosoDAVUser="websiteuser" | |
91 virtuosoDAVPW="w3s45us3" | |
92 virtuosoGraph="file://newpersonsFromProjects" | |
93 | |
15 | 94 logpathDefault="/var/tmp/tagchanges.log" |
95 | |
1 | 96 #BTrees fuer die Tags |
97 | |
7 | 98 projectPersons= OOBTree() #project --> personen IDs |
15 | 99 projectObjects= OOBTree() #project --> objects |
0 | 100 projectHistoricalPlaces= OOBTree() |
101 projectSuggestedTags= OOBTree() | |
7 | 102 persons2Projects= OOBTree() #personenID --> projects |
15 | 103 objects2Projects=OOBTree() #objects --> projects |
0 | 104 historicalPlaces2Projects=OOBTree() |
105 suggestedTags2Projects=OOBTree() | |
4 | 106 personIDtoNames=OOBTree() # weist den personenIDs Klartextnamen aus dem Triplestore zu |
5 | 107 personsIDForSort=[] # liste personenID sortiert nach dem tupel (nachname,vorname) |
108 personsIDForSortFull=[] # liste (personenID,(nachname,vorname)) nicht sortiert! | |
109 | |
0 | 110 suggestedPersons= OOBTree(); #TODO: das sollte die ueberfluessig werde und nur im triple store stehen. |
111 | |
112 tagList=[] | |
1 | 113 |
114 #default liste fuer tags, wird ueber das Managementinterface ueberschrieben | |
0 | 115 approachesTxt="""A |
116 --- | |
117 ent1 | |
118 --- | |
119 B | |
120 --- | |
121 enta | |
122 entb | |
123 entc | |
124 """ | |
125 | |
126 disciplines=[] | |
127 disciplinesTxt="""A | |
128 B | |
129 C | |
130 """ | |
131 | |
132 periods=[] | |
133 periodsTxt="""PA | |
134 PB | |
135 PC | |
136 """ | |
137 | |
138 spaces=[] | |
139 spacesTxt="""SPA | |
140 --- | |
141 sPent1 | |
142 --- | |
143 SPB | |
144 --- | |
145 SPenta | |
146 SPentb | |
147 SPentc | |
148 """ | |
149 technologies=[] | |
150 technologiesTxt="""TPA | |
151 --- | |
152 TPent1 | |
153 --- | |
154 TPB | |
155 --- | |
156 TPenta | |
157 TPentb | |
158 TPentc | |
159 """ | |
160 | |
161 knowledgeTransfers=[] | |
162 knowledgeTransfersTxt="""KTPA | |
163 --- | |
164 TPent1 | |
165 --- | |
166 TPB | |
167 --- | |
168 TPenta | |
169 TPentb | |
170 TPentc | |
171 """ | |
172 | |
173 | |
174 | |
175 | |
176 | |
177 | |
178 manage_options = Folder.manage_options+( | |
1 | 179 {'label':'Thesaurus entries','action':'changeMPIWGThesaurusForm'}, |
180 {'label':'Manage Thesaurus','action':'manageMPIWGThesaurus'}, | |
15 | 181 {'label':'Thesaurus Log','action':'manageMPIWGThesaurusLogs'}, |
0 | 182 #{'label':'Change Publications Special','action':'changePublications_specialForm'}, |
183 ) | |
184 | |
185 def __init__(self,id): | |
186 """init""" | |
187 self.id=id | |
188 | |
189 | |
190 def index_html(self): | |
191 """index file""" | |
1 | 192 |
0 | 193 pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','index.html')).__of__(self) |
194 return pt() | |
195 | |
2 | 196 security.declareProtected('View management screens','changeMPIWGThesaurusForm') |
0 | 197 def changeMPIWGThesaurusForm(self): |
198 """form for changing the project""" | |
199 pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','changeMPIWGThesaurusForm.zpt')).__of__(self) | |
200 return pt() | |
201 | |
2 | 202 security.declareProtected('View management screens','manageMPIWGThesaurus') |
1 | 203 def manageMPIWGThesaurus(self): |
204 """form for changing the project""" | |
205 pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','manageMPIWGThesaurus.zpt')).__of__(self) | |
206 return pt() | |
207 | |
15 | 208 security.declareProtected('View management screens','manageMPIWGThesaurusLogs') |
209 def manageMPIWGThesaurusLogs(self): | |
210 """form for changing the project""" | |
211 pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','manageMPIWGThesaurusLog.zpt')).__of__(self) | |
212 return pt() | |
213 | |
214 def changeMPIWGThesaurusLog(self,logpath,RESPONSE=None): | |
215 """change log file path""" | |
216 self.logpath=logpath | |
217 | |
218 if RESPONSE is not None: | |
219 redirect(RESPONSE,'manage_main') | |
220 | |
221 | |
2 | 222 security.declareProtected('View management screens','changeMPIWGThesaurus') |
0 | 223 def changeMPIWGThesaurus(self,approachesTxt,disciplinesTxt,periodsTxt,spacesTxt,technologiesTxt,knowledgeTransfersTxt,RESPONSE=None): |
224 """change it""" | |
225 self.approachesTxt=approachesTxt | |
226 self.disciplinesTxt=disciplinesTxt | |
227 self.periodsTxt=periodsTxt | |
228 self.spacesTxt=spacesTxt | |
229 self.technologiesTxt=technologiesTxt | |
230 self.knowledgeTransfersTxt=knowledgeTransfersTxt | |
231 | |
232 if RESPONSE is not None: | |
233 redirect(RESPONSE,'manage_main') | |
15 | 234 |
235 | |
24 | 236 # def getAllProjectsAndTagsAsCSV(self,archived=1): |
237 # """alle projekte auch die nicht getaggten""" | |
238 # retList=[] | |
239 # for project in self.getProjectFields('WEB_title_or_short'): | |
240 # proj = project[0] | |
241 # p_name = project[1] | |
242 # retProj=[] | |
243 # if (not proj.isArchivedProject() and archived==1) or (proj.isArchivedProject() and archived==2): | |
244 # retProj.append(self.utf8ify(p_name)) | |
245 # retProj.append(self.utf8ify(proj.getContent('xdata_01'))) | |
246 # retProj.append("|".join([person[1] for person in self.thesaurus.getPersonsFromProject(proj.getId())])) | |
247 # retProj.append("|".join([person[1] for person in self.thesaurus.getHistoricalPlacesFromProject(proj.getId())])) | |
248 # retProj.append("|".join([person[1] for person in self.thesaurus.getObjectsFromProject(proj.getId())])) | |
249 # retProj.append("|".join(self.thesaurus.getTags(proj.getId()))) | |
250 # retList.append("\t".join(retProj)) | |
251 # | |
252 # return "\n".join(retList); | |
253 # | |
17 | 254 def getProjectsAndTags(self): |
255 """projekte und tags""" | |
256 | |
257 | |
258 projectTags={} | |
259 for tag in self.tags.keys(): | |
260 logging.debug("getProjectsAndTags:"+tag) | |
261 # <div class="level1_projects" tal:repeat="proj | |
262 # python:here.getProjectsWithTag('approaches',here.getTitle(level1))"><a tal:attributes="href | |
263 # python:proj[0]"><span tal:content="python:proj[1]">my proj</span><tal:x define="person python:proj[2]"><span | |
264 # class="person_projects" tal:content="person"/></tal:x></a></div> | |
21 | 265 #</div> |
17 | 266 |
267 for subTag in self.tags.get(tag): | |
268 projs = self.getProjectsWithTag(tag,subTag) | |
269 if not isinstance(projs, ListType): | |
270 projs=[projs] | |
271 | |
272 for proj in projs: | |
25 | 273 if proj is None: |
274 continue | |
17 | 275 projectID=proj[0] |
276 logging.debug("PTS"+repr(projectTags)) | |
277 project=projectTags.get(projectID,projectHolder(projectID)) | |
278 project.projectName=proj[1] | |
279 project.persons=proj[2] | |
280 logging.debug(project) | |
281 logging.debug(tag) | |
282 logging.debug("PROTS"+repr(project.tags)) | |
283 tagsOfType=project.tags.get(tag,OOSet()) | |
284 logging.debug(tagsOfType) | |
285 tagsOfType.add(subTag.decode('utf-8')) | |
286 | |
287 logging.debug("Adding %s to %s"%(subTag,projectID)) | |
288 project.tags[tag]=tagsOfType | |
289 | |
290 projectTags[projectID]=project | |
291 logging.debug("Saved %s to %s"%(repr(list(tagsOfType)),projectID)) | |
292 logging.debug(projectTags) | |
293 | |
294 | |
295 | |
296 return projectTags | |
297 | |
22 | 298 def getProjectsAndTagsAsCSV(self): |
17 | 299 """get the projects as tab""" |
300 ret="" | |
301 | |
302 #genereate headers | |
303 headers=['date','projectPath','projectName','researchers resp'] | |
304 headers.extend(list(self.tags.keys())) | |
305 ret+="\t".join(headers)+"\n" | |
306 | |
307 projectTags = self.getProjectsAndTags() | |
308 for projectID in projectTags.keys(): | |
309 retarray=[] | |
310 splitted = projectID.split("/") # hiern nur die eingetliche ID ohne den Pfad | |
311 if len(splitted)>0: | |
312 projectIDShort=splitted[-1] | |
313 retarray.append(self.lastChangeInThesaurus.get(projectIDShort,'')) | |
314 else: | |
315 retarray.append('') | |
316 retarray.append(projectID) | |
317 project = projectTags.get(projectID) | |
318 retarray.append(project.projectName) | |
319 retarray.append(project.persons) | |
320 | |
321 | |
322 | |
323 for tagType in self.tags.keys(): | |
324 tags = project.tags.get(tagType,['']) | |
325 retarray.append(";".join(tags)) | |
326 | |
327 | |
328 ret+="\t".join(retarray)+"\n" | |
329 | |
330 return ret | |
331 | |
15 | 332 def getLogpath(self): |
333 return getattr(self,"logpath",self.logpathDefault) | |
334 | |
335 def getLogfile(self,projectID="",date=""): | |
336 | |
337 # logfile format : YYYY-MM-TT HH:mm:ss\tUSER\ttype\tprojectid\CHANGED_TAG_or_OBJECT_or_PERSON | |
338 if not os.path.exists(self.getLogpath()): | |
339 return "" | |
340 | |
341 fh = open(self.getLogpath(),"r") | |
342 lines=fh.readlines() | |
343 | |
344 if (projectID!=""): | |
345 ret=[] | |
346 for line in lines: | |
347 splitted=line.split("\t") | |
348 if splitted[3]==projectID: | |
349 ret.append(line) | |
350 | |
351 lines=ret[0:] | |
352 | |
353 if (date!=""): | |
354 ret=[] | |
355 for line in lines: | |
356 splitted=line.split("\t") | |
357 if splitted[0]>=date: | |
358 ret.append(line) | |
359 | |
360 | |
361 lines=ret[0:] | |
362 | |
363 txt= "".join(lines) | |
364 fh.close() | |
365 | |
366 | |
367 | |
368 | |
369 return txt | |
370 | |
0 | 371 #In der Anzeige soll der Name der zitierten Personen in Klartext angezeigt werden, ausserdem die Varianten, wie sie tatsaechlich |
372 #in den Projekten benutzt werden | |
2 | 373 |
5 | 374 |
375 def addPersonAndFirstNameFromTripleStore(self, personID): | |
376 mainName, sortName = self.getMainNameFromTripleStore(personID) # hole die hauptbezeichnung aus dem triplestore | |
377 personNames = [] | |
7 | 378 logging.debug("get person:"+ personID) |
379 logging.debug("names:"+repr(mainName)+":"+ repr(sortName)) | |
380 | |
381 projects=self.persons2Projects.get(personID) | |
382 logging.debug(repr(projects)) | |
383 if projects is None: | |
384 projects=[] | |
385 | |
386 for project in projects: #hole die personen aus dem projekte | |
5 | 387 logging.debug("Found:project:" + project) |
388 namesInProject = self.projectPersons.get(project) | |
389 for nameInProjectTuple in namesInProject: | |
390 logging.debug(repr(nameInProjectTuple)) | |
391 nameInProject = nameInProjectTuple[1] | |
392 logging.debug(nameInProjectTuple[0] + "??" + personID) | |
393 if nameInProjectTuple[0] == personID: | |
394 logging.debug("changing") | |
395 if mainName == "": # es gibt keinen Eintrag im Triplestore fuer name (sollte eigentlich nicht sein, ist dann ein Fehler dort) | |
396 mainName = nameInProject #nimm dann aber den ersten aus den projekten | |
397 if nameInProject != mainName: | |
398 personNames.append(nameInProject) | |
399 | |
400 logging.debug(str(mainName) + "- foundalso :" + ",".join(personNames)) | |
401 self.personIDtoNames.update({personID:(mainName, personNames)}) | |
402 self.personsIDForSortFull.append((personID, sortName)) | |
403 | |
404 | |
405 | |
406 def generateSortingOrderForPersonIDs(self): | |
407 def sort(x,y): | |
408 logging.debug("sort:") | |
409 logging.debug((x[1][0],y[1][0])) | |
410 return cmp(x[1][0],y[1][0]) | |
411 | |
412 self.personsIDForSortFull.sort(cmp=sort) | |
413 | |
414 self.personsIDForSort=[x[0] for x in self.personsIDForSortFull] | |
415 | |
416 self.personIDtoNames=self.personIDtoNames # make clear that it has changed #TODO: change this to variablen with names _p | |
417 | |
4 | 418 security.declareProtected('View management screens','collectPersonNamesToIds') |
0 | 419 def collectPersonNamesToIds(self): |
1 | 420 """Ordne Namen aus dem Triplestore bzw. die vergebenenden Label den Personen-Ids zu.""" |
5 | 421 #sollte z.B. gemacht werden, wenn im Triplestore editiert wurde. |
4 | 422 self.personIDtoNames=OOBTree() # loesche alle |
423 self.personsIDForSort=[] | |
5 | 424 self.personsIDForSortFull=[] |
0 | 425 for personID in self.persons2Projects: |
6 | 426 self.addPersonAndFirstNameFromTripleStore(personID) |
4 | 427 |
428 | |
429 | |
430 | |
431 #sortiere personIDs nach erstmal nach Nachnamene TODO: sortiere nach name,vorname | |
5 | 432 |
433 self.generateSortingOrderForPersonIDs(); | |
434 # def sort(x,y): | |
435 # logging.debug("sort:") | |
436 # logging.debug((x[1][0],y[1][0])) | |
437 # return cmp(x[1][0],y[1][0]) | |
438 # | |
439 # self.personsIDForSortFull.sort(cmp=sort) | |
440 # | |
441 # self.personsIDForSort=[x[0] for x in self.personsIDForSortFull] | |
442 # | |
443 # self.personIDtoNames=self.personIDtoNames # make clear that it has changed #TODO: change this to variablen with names _p | |
444 # | |
1 | 445 #Hole die Namen, die einer personID zugeordnet sind. |
0 | 446 def getNamesFromID(self,personID): |
7 | 447 personID=personID.rstrip().lstrip() #make sure no spaces |
448 logging.debug("<"+personID+">") | |
0 | 449 retStr="" |
7 | 450 |
451 retStr+=self.personIDtoNames.get(personID,[personID])[0] # hole die Hauptbezeichnung, falls keine angeben ist, wird die ID ausgegeben, das is jedoch ein Felher in den Daten!! | |
8 | 452 #additionalNames = self.personIDtoNames.get(personID,['',[]])[1] |
453 #if len(additionalNames)>0: | |
454 # retStr+=" ("+",".join(additionalNames)+","+")" | |
0 | 455 return retStr |
456 | |
457 | |
1 | 458 #Hole die Hauptnamemsansetzung aus dem Triplestore ),falls vorhanden, wenn nicht ist der String leer. |
4 | 459 #ausserdem einen Namen zum sortieren, = Tupel(nachname, vorname) |
0 | 460 def getMainNameFromTripleStore(self,personID): |
461 | |
462 | |
463 cmdString ="""select * where { <%s> <http://xmlns.com/foaf/0.1/name> ?name}"""%personID | |
464 | |
4 | 465 names= self.callSparql(cmdString) |
466 | |
467 cmdString ="""select * where { <%s> <http://xmlns.com/foaf/0.1/lastName> ?name}"""%personID | |
468 | |
469 lastName= self.callSparql(cmdString) | |
470 | |
471 cmdString ="""select * where { <%s> <http://xmlns.com/foaf/0.1/firstName> ?name}"""%personID | |
472 | |
473 firstName= self.callSparql(cmdString) | |
474 | |
475 return names,(lastName,firstName) | |
476 | |
477 | |
7 | 478 def callSparqlAll(self,cmdString): |
479 """list of results""" | |
480 auth_handler = urllib2.HTTPBasicAuthHandler() | |
481 auth_handler.add_password(realm='sparql', | |
482 uri=self.virtuosoServer+"/sparql", | |
483 user=self.virtuosoDAVUser, | |
484 passwd=self.virtuosoDAVPW) | |
485 | |
486 opener = urllib2.build_opener(auth_handler) | |
487 opener.addheaders = [('Content-Type','application/sparql-query')] | |
488 | |
489 logging.debug(cmdString) | |
490 try: | |
491 logging.debug(self.virtuosoServer+"/sparql?" + urllib.urlencode({'query':cmdString,'default-graph-uri':self.virtuosoGraph,'named-graph-uri':'','format':'text/csv'})) | |
492 #r= opener.open(self.virtuosoServer+"/sparql", urllib.urlencode({'query':cmdString,'default-graph-uri':self.virtuosoGraph,'named-graph-uri':'','format':'text/csv'})) | |
493 r= opener.open(self.virtuosoServer+"/sparql", urllib.urlencode({'query':cmdString,'default-graph-uri':'','named-graph-uri':'','format':'text/csv'})) | |
494 namesTxt=r.read() | |
495 except urllib2.URLError, e: | |
496 logging.error(e.code) | |
497 logging.error(e.read()) | |
498 | |
499 | |
500 return | |
501 logging.debug(namesTxt) | |
502 names=namesTxt.split("\n") | |
10 | 503 if len(names) < 2: #in der ersten Zeile stehen bei der Rueckgabe die Spaltennamen, <2 heiss also es gibt keinen Eintrag |
7 | 504 return [] |
505 | |
506 ret=[] | |
507 for name in names[1:]: | |
508 line=[] | |
509 for entry in name.split("\",\""): | |
510 | |
511 line.append(entry.replace('"','')); | |
512 ret.append(line); | |
513 return ret; | |
514 | |
4 | 515 def callSparql(self,cmdString): |
0 | 516 |
517 auth_handler = urllib2.HTTPBasicAuthHandler() | |
518 auth_handler.add_password(realm='sparql', | |
519 uri=self.virtuosoServer+"/sparql", | |
520 user=self.virtuosoDAVUser, | |
521 passwd=self.virtuosoDAVPW) | |
522 | |
523 opener = urllib2.build_opener(auth_handler) | |
524 opener.addheaders = [('Content-Type','application/sparql-query')] | |
525 | |
526 logging.debug(cmdString) | |
527 try: | |
4 | 528 logging.debug(self.virtuosoServer+"/sparql?" + urllib.urlencode({'query':cmdString,'default-graph-uri':self.virtuosoGraph,'named-graph-uri':'','format':'text/csv'})) |
529 #r= opener.open(self.virtuosoServer+"/sparql", urllib.urlencode({'query':cmdString,'default-graph-uri':self.virtuosoGraph,'named-graph-uri':'','format':'text/csv'})) | |
530 r= opener.open(self.virtuosoServer+"/sparql", urllib.urlencode({'query':cmdString,'default-graph-uri':'','named-graph-uri':'','format':'text/csv'})) | |
0 | 531 namesTxt=r.read() |
532 except urllib2.URLError, e: | |
533 logging.error(e.code) | |
534 logging.error(e.read()) | |
4 | 535 |
536 | |
0 | 537 return |
4 | 538 logging.debug(namesTxt) |
0 | 539 names=namesTxt.split("\n") |
10 | 540 if len(names) < 2: #in der ersten Zeile stehen bei der Rueckgabe die Spaltennamen, <2 heiss also es gibt keinen Eintrag |
0 | 541 return |
542 | |
543 return names[1].replace('"','') # wir nehmen nur den ersten treffer | |
544 | |
545 | |
2 | 546 security.declareProtected('View management screens','changeTags') |
0 | 547 def changeTags(self,projectID,approaches=[],disciplines=[],periods=[],spaces=[],technologies=[],transfers=[],RESPONSE=None): |
548 """change tags""" | |
549 self.changeTagFromList(projectID,"approaches", approaches) | |
550 self.changeTagFromList(projectID,"disciplines", disciplines) | |
551 self.changeTagFromList(projectID,"periods", periods) | |
552 self.changeTagFromList(projectID,"spaces", spaces) | |
553 self.changeTagFromList(projectID,"technologies", technologies) | |
554 self.changeTagFromList(projectID,"transfers", transfers) | |
555 | |
556 self.projectObjects=self.projectObjects #necessesary to make the object persistent after the first call | |
557 self.projectHistoricalPlaces=self.projectHistoricalPlaces #necessesary to make the object persistent after the first call | |
558 self.projectPersons=self.projectPersons #necessesary to make the object persistent after the first call | |
559 self.projectSuggestedTags=self.projectSuggestedTags | |
560 | |
561 self.persons2Projects=self.persons2Projects | |
3 | 562 self.objects2Projects=self.objects2Projects |
0 | 563 self.historicalPlaces2Projects=self.historicalPlaces2Projects |
564 self.suggestedTags2Projects=self.suggestedTags2Projects; | |
565 | |
566 self.suggestedPersons=self.suggestedPersons; | |
567 | |
2 | 568 security.declareProtected('View management screens','deleteAllTags') |
0 | 569 def deleteAllTags(self): |
570 """deleteAllTags - TODO: take this out!!,""" | |
571 setattr(self,"tags",None) | |
572 | |
573 return "DONE!" | |
574 | |
2 | 575 security.declareProtected('View management screens','deleteAllPersons') |
0 | 576 def deleteAllPersons(self): |
577 """deleteAllTags - TODO: take this out!!,""" | |
578 self.projectPersons= OOBTree() | |
579 self.persons2Projects= OOBTree() | |
580 self.personIDtoNames=OOBTree() | |
581 self.suggestedPersons= OOBTree(); #TODO: das sollte die ueberfluessig werde und nur im triple store stehen. | |
582 | |
583 | |
584 return "DONE!" | |
2 | 585 |
3 | 586 security.declareProtected('View management screens','deleteAllObjects') |
587 def deleteAllObjects(self): | |
588 """deleteAllTags - TODO: take this out!!,""" | |
589 logging.debug("delete all objects") | |
590 self.projectObjects= OOBTree() | |
591 self.objects2Projects=OOBTree() | |
592 | |
593 | |
594 return "DONE!" | |
595 | |
0 | 596 def changeTagFromList(self,projectID,tagType,tagList): |
597 | |
598 logging.debug("changing:"+projectID) | |
599 logging.debug("asking tag::"+tagType) | |
600 if type(tagList) is not ListType: | |
601 tagList=[tagList] | |
602 | |
603 | |
604 tags = getattr(self,"tags",None) | |
605 if tags is None: | |
606 logging.debug("Create new tags") | |
607 tags=OOBTree() | |
608 setattr(self,"tags",tags) | |
609 | |
610 | |
611 tagsStored=tags.get(tagType,None) | |
612 if tagsStored is None: | |
613 tagsStored=OOBTree(); | |
614 | |
615 | |
616 | |
617 for tag in tagsStored.keys(): #gehe durch alle gespeichteren tags | |
618 logging.debug("checking:"+tag) | |
15 | 619 projectsOfTag = tagsStored.get(tag,None) |
620 logging.debug(projectsOfTag) | |
621 if projectsOfTag is None: | |
622 projectsOfTag=OOSet() | |
0 | 623 |
624 if tag in tagList: #dieser ist getagged | |
15 | 625 projectsOfTag.update([projectID]); |
626 self.storeChange("added",projectID,tag) | |
0 | 627 tagList.remove(tag); |
628 else: | |
15 | 629 if projectsOfTag.has_key(projectID): |
630 projectsOfTag.remove(projectID); | |
631 self.storeChange("remove",projectID,tag) | |
632 | |
633 tagsStored.update({tag:projectsOfTag}); | |
0 | 634 |
15 | 635 for tag in tagList: # alle Tags, die nicht abgearbeitet worden sind, muessen noch angelegt werden |
0 | 636 logging.debug("adding:"+tag) |
637 newApproach=OOSet() | |
638 newApproach.update([projectID]); | |
639 tagsStored.insert(tag, newApproach); | |
640 | |
641 tags.update({tagType:tagsStored}) | |
642 | |
643 transaction.commit() | |
644 | |
645 def getTitle(self,entry): | |
646 return entry.title | |
647 | |
35
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
648 def thes_quote(self,txt): |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
649 import md5 |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
650 logging.debug("@*%s*@"%txt) |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
651 return md5.md5(txt.lower()).hexdigest() |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
652 |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
653 |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
654 def formatTag(self,tag): |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
655 splitted= tag.split("_") |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
656 return splitted[-1] |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
657 |
15 | 658 def getEntriesFormatted(self,entries,formatType): |
12 | 659 if not hasattr(self,'levelFormatted'): |
32 | 660 pt=PageTemplateFile('zpt/levelFormatted', globals()).__of__(self) |
15 | 661 return pt(level1_entries=entries,type=formatType) |
12 | 662 |
32 | 663 pt = getattr(self,'levelFormatted') |
28 | 664 return pt(level1_entries=entries,type=formatType) |
665 | |
666 | |
667 #return self.levelFormatted(level1_entries=entries,type=formatType) | |
12 | 668 |
0 | 669 def getEntries(self,entry): |
35
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
670 #logging.debug("GETENTRY:"+repr(entry)) |
0 | 671 return entry.entries |
672 | |
1 | 673 #nimmt ein eine Text der Form |
674 # TAG1 | |
675 # --- | |
676 # SUBTAG1_1 | |
677 # SUBTAG1_2 | |
678 # --- | |
679 # TAG2 | |
680 # --- | |
681 # SUBTAG2_1 | |
682 # SUBTAG2_2 | |
683 #.... | |
684 # und erzeugt daraus eine entsprechende Liste von Entries | |
0 | 685 def getEntriesFromTxt(self,txt): |
27 | 686 |
0 | 687 apps=[] |
688 lines=txt.split("\n"); | |
689 level=False | |
690 for line in lines: | |
691 line=line.rstrip().lstrip() | |
692 if line=="": | |
693 continue | |
694 if line=="---": | |
695 | |
696 if level: | |
697 level=False | |
698 else: | |
699 level=True | |
700 else: | |
701 if not level: | |
702 entry=Entry(line,[]) | |
703 apps.append(entry) | |
704 else: | |
705 entry.entries.append(Entry(line)) | |
706 | |
707 return apps[0:] | |
708 | |
709 def getApproaches(self): | |
710 | |
711 self.tagList=self.getEntriesFromTxt(self.approachesTxt) | |
712 return self.tagList | |
713 | |
2 | 714 |
35
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
715 def getTagsAsHash(self,projectID,tagType=None): |
36 | 716 """get all tags as hash or None if no tag exists""" |
35
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
717 retHash={} |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
718 |
36 | 719 tagCnt=0 |
35
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
720 tags = getattr(self,"tags",None) |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
721 |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
722 if tags is None: |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
723 return; |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
724 |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
725 #falls nicht gesetzt |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
726 if tagType is None: |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
727 tagTypes = tags.keys() |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
728 else: |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
729 tagTypes = [tagType] |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
730 |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
731 for tagType in tagTypes: |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
732 tagsStored=tags.get(tagType,None) |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
733 |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
734 if tagsStored is None: |
39 | 735 # WTF: was: return |
736 continue | |
35
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
737 |
39 | 738 retHash[tagType]=[] |
739 | |
35
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
740 for tag in tagsStored.keys(): #gehe durch alle gespeichteren approached |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
741 logging.debug("checking:"+tag) |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
742 currentTag = tagsStored.get(tag,None) |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
743 if currentTag is None: |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
744 continue |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
745 if currentTag.has_key(projectID): |
36 | 746 tagCnt+=1 |
35
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
747 retHash[tagType].append("""%s"""%tag) |
39 | 748 |
749 if len(retHash[tagType]) == 0: | |
750 # empty tag list | |
751 del retHash[tagType] | |
35
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
752 |
36 | 753 if tagCnt==0: |
754 return None | |
755 | |
35
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
756 return retHash |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
757 |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
758 |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
759 |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
760 |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
761 |
0 | 762 def getTagsJSON(self,projectID,tagType,RESPONSE=None): |
763 """get all selected tagList""" | |
35
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
764 #logging.debug("asking:"+projectID) |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
765 #logging.debug("asking tag::"+tagType) |
0 | 766 retList=[] |
767 tags = getattr(self,"tags",None) | |
768 if tags is None: | |
769 return; | |
770 | |
771 tagsStored=tags.get(tagType,None) | |
772 if tagsStored is None: | |
773 return; | |
774 | |
775 for tag in tagsStored.keys(): #gehe durch alle gespeichteren approached | |
776 logging.debug("checking:"+tag) | |
777 currentTag = tagsStored.get(tag,None) | |
778 if currentTag is None: | |
779 continue | |
780 if currentTag.has_key(projectID): | |
781 retList.append(""" "%s" """%tag) | |
782 | |
783 if RESPONSE: | |
784 RESPONSE.setHeader('Content-Type', "application/json") | |
785 | |
786 logging.debug(retList) | |
787 return "["+",".join(retList)+"]" | |
788 | |
21 | 789 |
790 | |
791 | |
25 | 792 def getTags(self,projectID,projectTags,RESPONSE=None): |
21 | 793 """get all selected tagList""" |
794 | |
25 | 795 #projectTags = self.getProjectsAndTags() |
35
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
796 #logging.debug(projectTags) |
21 | 797 |
25 | 798 project = projectTags.get(projectID) |
799 if project is None: | |
800 project = projectTags.get("/en/research/projects/"+projectID) #TODO fix this projectTag list from getProjectsAndTags()contains fullpath | |
801 if project is None: | |
802 return [] | |
803 retarray=[] | |
21 | 804 for tagType in self.tags.keys(): |
25 | 805 tags = project.tags.get(tagType,['']) |
806 retarray.append(self.utf8ify(";".join(tags))) | |
21 | 807 |
808 | |
25 | 809 return retarray |
810 # logging.debug("asking:"+projectID) | |
811 # | |
812 # | |
813 # apps = self.getApproaches()+ self.getDisciplines(); | |
814 # retList=[] | |
815 # for tagType in self.tags.keys(): | |
816 # | |
817 # logging.debug("asking tag::"+repr(tagType)) | |
818 # | |
819 # tags = getattr(self,"tags",None) | |
820 # if tags is None: | |
821 # continue; | |
822 # | |
823 # tagsStored=tags.get(tagType,None) | |
824 # if tagsStored is None: | |
825 # continue; | |
826 # | |
827 # for tag in tagsStored.keys(): #gehe durch alle gespeichteren approached | |
828 # logging.debug("checking:"+tag) | |
829 # currentTag = tagsStored.get(tag,None) | |
830 # if currentTag is None: | |
831 # continue | |
832 # if currentTag.has_key(projectID): | |
833 # retList.append(""" "%s" """%tag) | |
834 # | |
835 # if RESPONSE: | |
836 # RESPONSE.setHeader('Content-Type', "application/json") | |
837 # | |
838 # logging.debug(retList) | |
839 # return retList | |
21 | 840 |
0 | 841 def getDisciplines(self): |
842 | |
843 self.disciplines=self.getEntriesFromTxt(self.disciplinesTxt) | |
844 return self.disciplines | |
845 | |
846 | |
847 def getObjectsJSON(self,term="",RESPONSE=None): | |
848 """ get all stored objects as json list starting with term""" | |
849 term=term.lower(); | |
850 logging.debug("Asking:"+term) | |
851 #objectList=["baus","berg","lurg"] | |
852 objects = self.objects2Projects; | |
853 | |
854 objectList= [x for x in objects.keys()] | |
855 | |
856 logging.debug("Create:"+repr(objectList)) | |
857 retList=[] | |
858 for object in objectList: | |
859 if object.find(term)>-1: | |
860 retList.append(""" "%s" """%object) | |
861 ret="[" | |
862 ret+=",".join(retList) | |
863 ret+="]" | |
864 logging.debug("Objects:"+ret) | |
865 if RESPONSE: | |
866 RESPONSE.setHeader('Content-Type', "application/json") | |
867 return ret | |
868 | |
869 | |
870 def getHistoricalPlacesJSON(self,term="",RESPONSE=None): | |
871 """ get all stored historicalPlaces as json list starting with term""" | |
872 term=term.lower(); | |
873 logging.debug("Asking:"+term) | |
874 #historicalPlaceList=["baus","berg","lurg"] | |
875 historicalPlaces = self.historicalPlaces2Projects; | |
876 | |
877 historicalPlaceList= [x for x in historicalPlaces.keys()] | |
878 | |
879 logging.debug("Create:"+repr(historicalPlaceList)) | |
880 retList=[] | |
881 for historicalPlace in historicalPlaceList: | |
882 if historicalPlace.find(term)>-1: | |
883 retList.append(""" "%s" """%historicalPlace) | |
884 ret="[" | |
885 ret+=",".join(retList) | |
886 ret+="]" | |
887 logging.debug("historicalPlaces:"+ret) | |
888 if RESPONSE: | |
889 RESPONSE.setHeader('Content-Type', "application/json") | |
890 return ret | |
891 | |
892 | |
893 def getPeriods(self): | |
894 | |
895 self.periodes=self.getEntriesFromTxt(self.periodsTxt) | |
896 return self.periodes | |
897 | |
898 def getSpaces(self): | |
899 | |
900 self.spaces=self.getEntriesFromTxt(self.spacesTxt) | |
901 return self.spaces | |
902 | |
903 def getTechnologies(self): | |
904 | |
905 self.technologies=self.getEntriesFromTxt(self.technologiesTxt) | |
906 return self.technologies | |
907 | |
908 def getKnowledgeTransfers(self): | |
909 | |
910 self.knowledgeTransfers=self.getEntriesFromTxt(self.knowledgeTransfersTxt) | |
911 return self.knowledgeTransfers | |
912 | |
913 | |
914 def getObjectsFromProject(self,projectID): | |
915 return self.getFromProject(self.projectObjects,projectID); | |
916 | |
917 def getHistoricalPlacesFromProject(self,projectID): | |
918 return self.getFromProject(self.projectHistoricalPlaces,projectID); | |
919 | |
920 def getSuggestedTagsFromProject(self,projectID): | |
921 return self.getFromProject(self.projectSuggestedTags,projectID); | |
922 | |
923 | |
924 def getPersonsFromProject(self,projectID): | |
5 | 925 #hole alle personenID die zu einem Projekt gehoeren. |
926 #zurueckgegeben wird ein OOSet() | |
0 | 927 return self.getFromProject(self.projectPersons,projectID); |
928 | |
5 | 929 def getFromProject(self,objects,projectID): |
930 #holt die zu projectID gehoerigen objekte aus dem objects-set. | |
931 #oder legt einen neuen leeren Satz zu dieser ProjektID an. | |
932 #zuruecgegeben wird ein OOSet() | |
933 if objects.has_key(projectID): #wenn zu der ProjektID schon etwas abgespeichter ist, gieb es zurueck | |
0 | 934 logging.debug("key exists:"+projectID) |
935 persons=objects.get(projectID); | |
5 | 936 else: # andernfalls lege einen neuen Satz an. |
0 | 937 persons=OOSet() |
938 objects.update({projectID:persons}) | |
939 logging.debug("key does not exists:"+projectID) | |
940 | |
941 | |
942 return persons | |
943 | |
944 def getHistoricalPlacesFromProjectAsHTML(self,projectID): | |
945 """gertobjects""" | |
946 return self.getFromProjectAsHTML(self.projectHistoricalPlaces, projectID, "HistoricalPlace"); | |
947 | |
948 def getObjectsFromProjectAsHTML(self,projectID): | |
949 """gertobjects""" | |
950 return self.getFromProjectAsHTML(self.projectObjects, projectID, "Object"); | |
951 | |
952 def getPersonsFromProjectAsHTML(self,projectID): | |
953 """getpersons""" | |
954 return self.getFromProjectAsHTML(self.projectPersons, projectID, "Person"); | |
955 | |
956 | |
957 def getFromProjectAsHTML(self,objects,projectID,type): | |
958 """getpersons""" | |
959 ret="" | |
960 if objects.has_key(projectID): | |
961 persons=objects.get(projectID); | |
962 else: | |
963 persons=OOSet() | |
964 | |
965 | |
966 for person in persons: | |
967 ret+="""<div class="removeButton"> | |
968 <span>%s </span><div style="display:inline" class="remove%s"><span style="display:none" class="removeValue">%s</span>remove</div> | |
969 </div>"""%(person[1],type,person[0]) | |
970 | |
971 | |
972 # ret+="""<div> | |
973 # <input type="checkbox" name="persons_remove" | |
974 # value="%s"> | |
975 # <span>%s</span> | |
976 # </div>"""%(person[0],person[1]) | |
977 # | |
978 logging.debug(type+":"+ret) | |
979 return ret | |
980 | |
2 | 981 security.declareProtected('View management screens','removeHistoricalPlaceFromProject') |
0 | 982 def removeHistoricalPlaceFromProject(self,projectID,value): |
983 """remove""" | |
984 logging.debug("removeHP:"+projectID+":"+value); | |
985 | |
986 HistoricalPlaces = self.getHistoricalPlacesFromProject(projectID) | |
987 for HistoricalPlace in HistoricalPlaces.keys(): | |
988 | |
989 logging.debug("trying:"+repr(HistoricalPlace[0])+"::"+repr(value)+"__") | |
990 if HistoricalPlace[0]==value: | |
991 logging.debug("---removed!") | |
992 HistoricalPlaces.remove(HistoricalPlace) | |
993 | |
994 self.projectHistoricalPlaces.update({projectID:HistoricalPlaces}) | |
995 retstring = self.getHistoricalPlacesFromProjectAsHTML(projectID) | |
996 logging.debug(retstring) | |
997 return retstring | |
998 | |
2 | 999 security.declareProtected('View management screens','removeObjectFromProject') |
0 | 1000 def removeObjectFromProject(self,projectID,value): |
1001 """remove""" | |
1002 logging.debug("remove:"+projectID+":"+value); | |
1003 | |
15 | 1004 |
1005 self.storeChange("removeObject",projectID,value) | |
1006 | |
0 | 1007 objects = self.getObjectsFromProject(projectID) |
1008 for object in objects.keys(): | |
1009 | |
1010 logging.debug("trying:"+repr(object[0])+"::"+repr(value)+"__") | |
1011 if object[0]==value: | |
1012 logging.debug("---removed!") | |
1013 objects.remove(object) | |
1014 | |
15 | 1015 #now also delete the project from the object. |
1016 objectsOfPerson=self.objects2Projects.get(object[0]) | |
1017 | |
1018 | |
1019 if projectID in list(objectsOfPerson): | |
1020 objectsOfPerson.remove(projectID) | |
1021 #self.persons2Projects.update({person:projectsList}) | |
1022 if (len(objectsOfPerson)==0): #loesche person aus der liste wenn keine Projekte dazu existieren. | |
1023 del self.objects2Projects[object[0]] | |
1024 | |
0 | 1025 self.projectObjects.update({projectID:objects}) |
1026 retstring = self.getObjectsFromProjectAsHTML(projectID) | |
1027 logging.debug(retstring) | |
1028 return retstring | |
1029 | |
2 | 1030 security.declareProtected('View management screens','removePersonFromProject') |
0 | 1031 def removePersonFromProject(self,projectID,value): |
5 | 1032 """remove a person from the projeckt""" |
0 | 1033 logging.debug("remove:"+projectID+":"+value); |
15 | 1034 self.storeChange("removePerson",projectID,value) |
0 | 1035 |
5 | 1036 persons = self.getPersonsFromProject(projectID) # hole alle personen die mit dem Projekt verbunden sind. |
0 | 1037 for person in persons.keys(): |
1038 | |
1039 logging.debug("trying:"+repr(person[0])+"::"+repr(value)+"__") | |
5 | 1040 if person[0]==value:#person ist die zuloeschende, dann raus damit |
1041 | |
0 | 1042 logging.debug("---removed!") |
1043 persons.remove(person) | |
5 | 1044 |
1045 #now also delete the project from the person. | |
1046 projectsOfPerson=self.persons2Projects.get(person[0]) | |
1047 logging.debug(projectsOfPerson) | |
1048 if projectID in list(projectsOfPerson): | |
1049 projectsOfPerson.remove(projectID) | |
1050 #self.persons2Projects.update({person:projectsList}) | |
1051 if (len(projectsOfPerson)==0): #loesche person aus der liste wenn keine Projekte dazu existieren. | |
1052 del self.persons2Projects[person[0]] | |
1053 | |
1054 | |
1055 #self.projectPersons.update({projectID:persons}) | |
0 | 1056 retstring = self.getPersonsFromProjectAsHTML(projectID) |
1057 logging.debug(retstring) | |
1058 return retstring | |
1059 | |
10 | 1060 |
1061 #fuegt die neue Person zur personIDtoNames hinzu, fuer die spaetere Anzeige in der Personenliste | |
0 | 1062 def addNameTOPersonIDNames(self,personID,label): |
1063 personName = self.personIDtoNames.get(personID) | |
1064 if personName==None: # Anlegen falls noch nicht existent | |
1065 personName=(label,[]) | |
1066 else: | |
1067 if (not label in personName[1]) and (not label==personName[0]): # hinzufuegen falls der neuen name noch nicht als bezeichnugn fuer personID eingetragen ist | |
1068 personName[1].append(label) | |
1069 | |
1070 self.personIDtoNames.update({personID:personName}) | |
1071 | |
2 | 1072 security.declareProtected('View management screens','addPersonToProject') |
0 | 1073 def addPersonToProject(self,projectID,value,label): |
1074 """ add a person so the project""" | |
15 | 1075 self.storeChange("addPerson",projectID,value+":"+label) |
1076 | |
0 | 1077 persons=self.getPersonsFromProject(projectID); |
1078 | |
1079 logging.debug("adding:"+projectID+":"+value+":"+label); | |
1080 | |
1081 persons.insert([value,label]) | |
1082 self.projectPersons.update({projectID:persons}) | |
1083 | |
1084 for personTuple in persons: | |
1085 #hole die abgespeicherten Projekte zu einer Person | |
1086 person=personTuple[0] #hole die ID | |
1087 | |
1088 | |
1089 if getattr(self,"persons2Projects",None)==None: | |
1090 setattr(self,"persons2Projects",OOBTree()) | |
1091 | |
1092 projects = self.persons2Projects.get(person,None) | |
7 | 1093 logging.debug("found projects:"+ repr(projects)) |
1094 if projects is None: #person hatte noch keine projekte | |
0 | 1095 projects=OOSet(); |
5 | 1096 |
0 | 1097 projects.insert(projectID ) |
1098 logging.debug("update:"+person) | |
1099 self.persons2Projects.update({person:projects}) | |
7 | 1100 |
1101 self.addPersonAndFirstNameFromTripleStore(person) | |
1102 self.generateSortingOrderForPersonIDs(); | |
1103 | |
0 | 1104 self.addNameTOPersonIDNames(value,label) |
1105 retstring = self.getPersonsFromProjectAsHTML(projectID) | |
1106 logging.debug(retstring) | |
1107 transaction.commit() | |
1108 return retstring | |
1109 | |
7 | 1110 |
1111 | |
1112 def rearangePersonIDsHTML(self,REQUEST=None): | |
1113 """setze neue ID zu personen""" | |
1114 ret=[] | |
1115 for personID in self.persons2Projects.keys(): | |
1116 logging.debug(personID) | |
1117 | |
1118 masterID,name=self.findMasterIDAndName(personID.rstrip().lstrip()) | |
1119 logging.debug(" masterID -appending") | |
1120 logging.debug(repr(name)) | |
1121 if len(name)==0: | |
1122 name=[''] | |
1123 ret.append((personID,self.personIDtoNames.get(personID,[''])[0],masterID,self.personIDtoNames.get(masterID,name)[0])) | |
1124 | |
1125 | |
1126 if REQUEST: | |
1127 pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','rearrangePersons.zpt')).__of__(self) | |
8 | 1128 return pt(changeList=ret,lookupUrl=self.PERSONS_LOOKUP_URL,editURL=self.EDIT_URL); |
7 | 1129 else: |
1130 return ret; | |
1131 | |
1132 def rearangePersonIDs(self,REQUEST): | |
1133 """unify a list of persons""" | |
1134 | |
1135 argv=REQUEST.form; | |
1136 logging.debug(repr(argv)) | |
1137 changes=argv['changes'] | |
1138 if isinstance(changes,str): | |
1139 changes=[changes] | |
1140 | |
1141 changeList=self.rearangePersonIDsHTML() | |
1142 personToMaster={} | |
1143 logging.debug("changelist:"+repr(changeList)) | |
1144 #aendere person2project | |
1145 for change in changes: | |
1146 changeItem=changeList[int(change)]; | |
1147 masterID=argv['newID_'+change].lstrip().rstrip() #make sure no spaces | |
1148 personID=changeItem[0] | |
1149 | |
1150 personToMaster[personID]=masterID | |
1151 masterIDProjects = self.persons2Projects.get(masterID,None); | |
1152 if masterIDProjects==None: | |
1153 masterIDProjects=OOSet(); | |
1154 #ret.append((personID,self.personIDtoNames.get(personID,[''])[0],masterID,self.personIDtoNames.get(masterID,[''])[0])) | |
1155 | |
1156 oldProjects= self.persons2Projects.get(personID) | |
1157 logging.debug("personID:"+repr(personID)) | |
1158 logging.debug("masterID:"+repr(masterID)) | |
1159 logging.debug("keys:"+repr(self.persons2Projects.keys())) | |
1160 logging.debug("oldProjects:"+repr(oldProjects)) | |
1161 masterIDProjects.update(oldProjects) | |
1162 self.persons2Projects.update({masterID:masterIDProjects}) | |
1163 self.persons2Projects.pop(personID) | |
1164 | |
1165 self.addPersonAndFirstNameFromTripleStore(masterID) #addpersontotiplestore | |
1166 | |
1167 logging.debug("Change:" +personID+":"+ masterID) | |
1168 | |
1169 if personID!=masterID: | |
1170 self.addSameAsRelationToTripleStore(personID,masterID) | |
1171 | |
1172 #aendere nun projectperson | |
1173 logging.debug(personToMaster) | |
1174 for project in self.projectPersons.keys(): | |
1175 personsNew=OOSet() | |
1176 | |
1177 persons=self.projectPersons.get(project) | |
1178 for person in persons: | |
1179 personsNew.insert([personToMaster.get(person[0],person[0]),person[1]]) | |
1180 logging.debug("REPLACE in:"+project+":" +repr(person)+" by "+ repr(personToMaster.get(person[0],person[0]))) | |
1181 self.projectPersons.update({project:personsNew}) | |
1182 | |
1183 self.generateSortingOrderForPersonIDs(); #now sort the new names | |
1184 return personToMaster | |
1185 #fuehre personen zusammen die ueber owl:sameAs verbunden sind | |
1186 def getUnifyPersonsList(self,REQUEST=None): | |
1187 """vereinheitlichung der personen auf eine ID aus der GND, wenn moeglich""" | |
1188 ret=[] | |
1189 for personID in self.persons2Projects.keys(): | |
1190 masterID,name=self.findMasterIDAndName(personID) | |
1191 logging.debug("masterID:"+masterID) | |
1192 if (masterID is not None) and (masterID is not "") and (not personID==masterID): | |
1193 #masterIDProjects = self.persons2Projects.get(masterID,None); | |
1194 ##if masterIDProjects==None: | |
1195 # masterIDProjects=OOSet(); | |
1196 logging.debug(" masterID -appending") | |
1197 logging.debug(repr(name)) | |
1198 | |
1199 | |
1200 ret.append((personID,self.personIDtoNames.get(personID,[''])[0],masterID,self.personIDtoNames.get(masterID,name)[0])) | |
1201 #masterIDProjects.update(self.persons2Projects.get(personID)); | |
1202 #self.persons2Projects.update({masterID:masterIDProjects}); | |
1203 | |
1204 | |
1205 if REQUEST: | |
1206 pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','unifyPersons.zpt')).__of__(self) | |
1207 return pt(changeList=ret); | |
1208 | |
1209 else: | |
1210 return ret; | |
1211 | |
1212 def unifyPersons(self,changes,REQUEST=None): | |
1213 """unify a list of persons""" | |
1214 | |
1215 if isinstance(changes,str): | |
1216 changes=[changes] | |
1217 | |
1218 changeList=self.getUnifyPersonsList(); | |
1219 personToMaster={} | |
1220 logging.debug("changelist:"+repr(changeList)) | |
1221 #aendere person2project | |
1222 for change in changes: | |
1223 changeItem=changeList[int(change)]; | |
1224 masterID=changeItem[2] | |
1225 personID=changeItem[0] | |
1226 | |
1227 personToMaster[personID]=masterID | |
1228 masterIDProjects = self.persons2Projects.get(masterID,None); | |
1229 if masterIDProjects==None: | |
1230 masterIDProjects=OOSet(); | |
1231 #ret.append((personID,self.personIDtoNames.get(personID,[''])[0],masterID,self.personIDtoNames.get(masterID,[''])[0])) | |
1232 | |
1233 oldProjects= self.persons2Projects.get(personID) | |
1234 logging.debug("personID:"+repr(personID)) | |
1235 logging.debug("masterID:"+repr(masterID)) | |
1236 logging.debug("keys:"+repr(self.persons2Projects.keys())) | |
1237 logging.debug("oldProjects:"+repr(oldProjects)) | |
1238 masterIDProjects.update(oldProjects) | |
1239 self.persons2Projects.update({masterID:masterIDProjects}) | |
1240 self.persons2Projects.pop(personID) | |
1241 | |
1242 self.addPersonAndFirstNameFromTripleStore(masterID) #addpersontotiplestore | |
1243 | |
1244 logging.debug("Change:" +personID+":"+ masterID) | |
1245 | |
1246 #aendere nun projectperson | |
1247 logging.debug(personToMaster) | |
1248 for project in self.projectPersons.keys(): | |
1249 personsNew=OOSet() | |
1250 | |
1251 persons=self.projectPersons.get(project) | |
1252 for person in persons: | |
1253 personsNew.insert([personToMaster.get(person[0],person[0]),person[1]]) | |
1254 logging.debug("REPLACE in:"+project+":" +repr(person)+" by "+ repr(personToMaster.get(person[0],person[0]))) | |
1255 self.projectPersons.update({project:personsNew}) | |
1256 | |
1257 self.generateSortingOrderForPersonIDs(); #now sort the new names | |
1258 return personToMaster | |
1259 | |
1260 | |
1261 | |
1262 def findMasterIDAndName(self,ressourceID): | |
1263 queryString="""select * | |
1264 FROM <file://mpiwg_persons_dnb.rdf> | |
1265 FROM <file://mpiwg_persons_2.rdf> | |
1266 FROM <file:///GND.rdf> | |
1267 FROM <http://identifiedNames> | |
1268 where { | |
1269 ?person <http://www.w3.org/2002/07/owl#sameAs> <%s>. | |
1270 | |
1271 ?ident <http://ontologies.mpiwg-berlin.mpg.de/authorities/namedIdentities/identifies_NamedEntity> ?person. | |
1272 ?gnd crm:P1_is_identified_by ?ident. | |
1273 | |
1274 ?gnd <http://RDVocab.info/ElementsGr2/dateOfBirth> ?birthDate. | |
1275 ?gnd <http://RDVocab.info/ElementsGr2/dateOfDeath> ?deathDate. | |
1276 ?person <http://xmlns.com/foaf/0.1/name> ?name. | |
1277 ?person <http://xmlns.com/foaf/0.1/lastName> ?lastName. | |
1278 ?person <http://xmlns.com/foaf/0.1/firstName> ?firstName. | |
1279 } | |
1280 """%ressourceID | |
1281 entries = self.callSparqlAll(queryString); | |
1282 if len(entries)>0: | |
1283 return entries[0][0],entries[0][5:8] #nur den ersten Treffer und nur die personID | |
1284 | |
1285 | |
1286 return None,None | |
1287 | |
9 | 1288 security.declareProtected('View','getPersonsWithProjectIDs') |
5 | 1289 def getPersonsWithProjectIDs(self,check=False): |
0 | 1290 """holt die getaggted Personen mit Projekten""" |
1291 persons = self.persons2Projects; | |
1292 ret={} | |
4 | 1293 |
0 | 1294 logging.debug("Check Person:"+repr(persons.keys())) |
4 | 1295 personsList=[x for x in persons.keys()] |
1296 | |
1297 def sort(x,y): | |
7 | 1298 try: |
1299 sortNrx=self.personsIDForSort.index(x) | |
1300 except: | |
1301 logging.warn("couldn't find personsIDForSort:"+x) | |
1302 sortNrx=0 | |
1303 | |
1304 try: | |
1305 sortNry=self.personsIDForSort.index(y) | |
1306 except: | |
1307 logging.warn("couldn't find personsIDForSort:"+y) | |
1308 sortNry=0 | |
4 | 1309 #logging.debug("INSORT***") |
1310 #logging.debug((sortNrx,sortNry)) | |
1311 return cmp(sortNrx,sortNry) | |
1312 | |
1313 logging.debug("SORT***") | |
1314 logging.debug(self.personsIDForSort) | |
1315 logging.debug("SORT.list") | |
1316 logging.debug(personsList) | |
1317 personsList.sort(cmp=sort) | |
1318 #for person in persons.keys(): | |
1319 logging.debug("AFTERSORT***") | |
1320 logging.debug(personsList) | |
1321 for person in personsList: | |
0 | 1322 logging.debug("Check:"+person) |
4 | 1323 #TODO: person muss duch den namen von provider geholt werden |
5 | 1324 retlist=[] |
1325 projectsList=persons.get(person) | |
7 | 1326 if projectsList is None: |
1327 projectsList=[] | |
5 | 1328 for projectID in list(projectsList): #list notwendig da projectList in der folgenden iteration veraendert wird. |
1329 if check: #teste ob im Projekt noch ein Verweis auf den Namen steht | |
1330 #sollte eigentlich nicht sein. | |
1331 personsProjects=self.getPersonsFromProject(projectID) | |
1332 logging.debug("persons check mode") | |
1333 personsProjectsCheck=[x[0] for x in personsProjects] | |
1334 if not person in personsProjectsCheck: #falls es so ist korrigiere die Projektliste der Person | |
1335 #loesche die person von projectListe | |
1336 projectsList.remove(projectID) | |
1337 persons.update({person:projectsList}) | |
1338 | |
1339 retlist.append(self.getProjectDetails(projectID)) | |
1340 | |
1341 if check and (len(projectsList)==0): #loesche person aus der liste wenn keine Projekte dazu existieren. | |
1342 del persons[person] | |
1343 | |
1344 ret[person]=retlist[0:] | |
4 | 1345 |
1346 logging.debug("AFTERSORT-ret***") | |
1347 logging.debug(ret.keys()) | |
1348 return ret,personsList | |
0 | 1349 |
1350 def getHistoricalPlacesWithProjectIDs(self): | |
1351 """holt die getaggted Personen mit Projekten""" | |
1352 HistoricalPlaces = self.HistoricalPlaces2Projects; | |
1353 ret={} | |
1354 logging.debug("Check HistoricalPlace:"+repr(HistoricalPlaces.keys())) | |
1355 for HistoricalPlace in HistoricalPlaces.keys(): | |
1356 logging.debug("Check:"+HistoricalPlace) | |
1357 #TODO: HistoricalPlace muss duch den namen von provuder geholt werden | |
1358 list=[] | |
1359 for projectID in HistoricalPlaces.get(HistoricalPlace): | |
1360 list.append(self.getProjectDetails(projectID)) | |
1361 | |
1362 ret[HistoricalPlace]=list[0:] | |
1363 return ret | |
1364 | |
12 | 1365 def getObjectsWithProjectIDsSortedkeys(self): |
1366 | |
1367 def sortF(x,y): | |
1368 return cmp(x.lower(),y.lower()) | |
1369 keys = [x for x in self.getObjectsWithProjectIDs().keys()] | |
1370 keys.sort(sortF) | |
1371 return keys | |
1372 | |
0 | 1373 def getObjectsWithProjectIDs(self): |
15 | 1374 """holt die getagten Personen mit Projekten""" |
0 | 1375 objects = self.objects2Projects; |
1376 ret={} | |
1377 logging.debug("Check Object:"+repr(objects.keys())) | |
1378 for object in objects.keys(): | |
1379 logging.debug("Check:"+object) | |
1380 #TODO: object muss duch den namen von provuder geholt werden | |
1381 list=[] | |
1382 for projectID in objects.get(object): | |
1383 list.append(self.getProjectDetails(projectID)) | |
1384 | |
1385 ret[object]=list[0:] | |
28 | 1386 |
1387 logging.debug(ret) | |
0 | 1388 return ret |
1389 | |
2 | 1390 security.declareProtected('View management screens','listAllSuggestedTags') |
0 | 1391 def listAllSuggestedTags(self): |
1392 """list all tags""" | |
1393 ret="<html><body>" | |
1394 for projectID in self.projectSuggestedTags: | |
1395 ret+="<h3>"+projectID+"</h3><table>" | |
1396 for tags in self.projectSuggestedTags.get(projectID): | |
1397 ret+="<tr><td>"+tags[0]+"</td><td>"+tags[1].type+"</td><td>"+tags[1].comment+"</td><td>"+tags[1].userName+"</td></tr>" | |
1398 ret+="</table>" | |
1399 ret+="</body></html>" | |
1400 logging.debug(ret); | |
1401 return ret | |
2 | 1402 |
1403 security.declareProtected('View management screens','suggestTag') | |
0 | 1404 def suggestTag(self,projectID,tagName,tagComment,tagType,tagUserName): |
1405 """suggest a new tag""" | |
1406 """ add a person so the project""" | |
1407 SuggestedTags=self.getSuggestedTagsFromProject(projectID); | |
1408 | |
1409 logging.debug("suggested:"+projectID+":"+tagName); | |
1410 | |
1411 | |
1412 #TODO: Im moment noch keine Zuordnung zu einer ID. | |
1413 newTag = SuggestedTag(tagName,tagComment,tagType,tagUserName) | |
1414 SuggestedTags.insert([tagName,newTag]) | |
1415 self.projectSuggestedTags.update({projectID:SuggestedTags}) | |
1416 | |
1417 | |
1418 | |
1419 for SuggestedTagTuple in SuggestedTags: | |
1420 #hole die abgespeicherten Projekte zu einer Person | |
1421 person=SuggestedTagTuple[0] #hile die ID | |
1422 | |
1423 | |
1424 if getattr(self,"SuggestedTags2Projects",None)==None: | |
1425 setattr(self,"SuggestedTags2Projects",OOBTree()) | |
1426 | |
1427 projects = self.SuggestedTags2Projects.get(person,None) | |
1428 | |
1429 if projects==None: | |
1430 projects=OOSet(); | |
1431 | |
1432 projects.insert(projectID ) | |
1433 logging.debug("update:"+person) | |
1434 self.SuggestedTags2Projects.update({person:projects}) | |
1435 | |
1436 | |
1437 | |
1438 #retstring = self.getSuggestedTagsFromProjectAsHTML(projectID) | |
1439 #logging.debug(retstring) | |
1440 | |
1441 | |
1442 | |
1443 #return retstring | |
1444 | |
2 | 1445 security.declareProtected('View management screens','addHistoricalPlaceToProject') |
0 | 1446 def addHistoricalPlaceToProject(self,projectID,value): |
1447 """ add a person so the project""" | |
1448 HistoricalPlaces=self.getHistoricalPlacesFromProject(projectID); | |
1449 | |
1450 logging.debug("adding:"+projectID+":"+value); | |
1451 | |
1452 | |
1453 #TODO: Im moment noch keine Zuordnung zu einer ID. | |
1454 HistoricalPlaces.insert([value,value]) | |
1455 self.projectHistoricalPlaces.update({projectID:HistoricalPlaces}) | |
1456 | |
1457 | |
1458 | |
1459 for HistoricalPlaceTuple in HistoricalPlaces: | |
1460 #hole die abgespeicherten Projekte zu einer Person | |
1461 person=HistoricalPlaceTuple[0] #hile die ID | |
1462 | |
1463 | |
1464 if getattr(self,"HistoricalPlaces2Projects",None)==None: | |
1465 setattr(self,"HistoricalPlaces2Projects",OOBTree()) | |
1466 | |
1467 projects = self.HistoricalPlaces2Projects.get(person,None) | |
1468 | |
1469 if projects==None: | |
1470 projects=OOSet(); | |
1471 | |
1472 projects.insert(projectID ) | |
1473 logging.debug("update:"+person) | |
1474 self.HistoricalPlaces2Projects.update({person:projects}) | |
1475 | |
1476 | |
1477 | |
1478 retstring = self.getHistoricalPlacesFromProjectAsHTML(projectID) | |
1479 logging.debug(retstring) | |
1480 | |
1481 | |
1482 | |
1483 return retstring | |
1484 | |
2 | 1485 security.declareProtected('View management screens','addObjectToProject') |
0 | 1486 def addObjectToProject(self,projectID,value): |
1487 """ add a person so the project""" | |
1488 objects=self.getObjectsFromProject(projectID); | |
1489 | |
1490 logging.debug("adding:"+projectID+":"+value); | |
1491 | |
15 | 1492 self.storeChange("addObject",projectID,value) |
0 | 1493 |
1494 #TODO: Im moment noch keine Zuordnung zu einer ID. | |
1495 objects.insert([value,value]) | |
1496 self.projectObjects.update({projectID:objects}) | |
1497 | |
1498 | |
1499 | |
1500 for objectTuple in objects: | |
1501 #hole die abgespeicherten Projekte zu einer Person | |
1502 person=objectTuple[0] #hile die ID | |
1503 | |
1504 | |
1505 if getattr(self,"objects2Projects",None)==None: | |
1506 setattr(self,"objects2Projects",OOBTree()) | |
1507 | |
1508 projects = self.objects2Projects.get(person,None) | |
1509 | |
1510 if projects==None: | |
1511 projects=OOSet(); | |
1512 | |
1513 projects.insert(projectID ) | |
1514 logging.debug("update:"+person) | |
1515 self.objects2Projects.update({person:projects}) | |
1516 | |
1517 | |
1518 | |
1519 retstring = self.getObjectsFromProjectAsHTML(projectID) | |
1520 logging.debug(retstring) | |
1521 | |
1522 | |
1523 | |
1524 return retstring | |
1525 | |
1526 | |
1527 def getProjectsWithTag(self,tagType,tagName): | |
1528 tags = getattr(self,"tags",None) | |
1529 if tags is None: | |
1530 logging.debug("can't find Tags") | |
1531 return [] | |
1532 | |
1533 | |
1534 | |
1535 tagsStored=tags.get(tagType,None) | |
1536 if tagsStored is None: | |
1537 logging.debug("can't find Tag:"+tagType) | |
1538 return [] | |
1539 | |
1540 projects = tagsStored.get(tagName,None) | |
1541 if projects is None: | |
1542 logging.debug("can't find any projects for Tag:"+tagName+"("+tagType+")") | |
1543 return [] | |
1544 | |
1545 ret=[] | |
1546 for project in projects: | |
1547 logging.debug("found:"+project) | |
30 | 1548 proj =self.getProjectDetails(project); |
1549 if proj is not None: | |
1550 ret.append(proj) | |
0 | 1551 |
1552 return ret | |
1553 | |
38 | 1554 def getProjectDetails(self,projectId): |
1555 project=getattr(self.projects,projectId,None) | |
0 | 1556 if project is None: |
38 | 1557 logging.debug("no project!! " +projectId) |
30 | 1558 return None |
0 | 1559 |
38 | 1560 link=projectId |
0 | 1561 |
27 | 1562 title=project.getContent("WEB_title") |
0 | 1563 #persons=project.getPersonKeyList() |
1564 persons=project.getContent('xdata_01') | |
1565 logging.debug("%s %s %s"%(link,title,persons)) | |
28 | 1566 |
1567 thumb = project.getThumbUrl() | |
1568 | |
1569 return link,title,persons,thumb | |
0 | 1570 |
1571 # $.post("addNewPerson",{"projectID": | |
1572 # $('#projectID').val(), | |
1573 # "personName":$("#suggest_newPerson").val(), | |
1574 # "personComment":$("#suggest_newPerson_comment").val()} | |
1575 # | |
1576 # ); | |
1577 # | |
2 | 1578 |
1579 security.declareProtected('View management screens','addAndCreateNewPerson') | |
0 | 1580 def addAndCreateNewPerson(self,projectID,personName,personComment,personUserName): |
1581 """adds anew person to the project which is not in the authority file""" | |
1582 | |
1583 id = random.randint(0, 1000000); | |
1584 idstring="http://ontologies.mpiwg-berlin.mpg.de/tempObjects/person/"+str(id) | |
1585 while self.suggestedPersons.has_key(idstring): | |
1586 id = random.randint(0, 1000000); | |
1587 #idstring="http://ontologies.mpiwg-berlin.mpg.de/tempObjects/person/"+str(id); | |
1588 idstring=self.TEMP_PERSON_NS+str(id); | |
1589 | |
1590 | |
1591 self.suggestedPersons.update({idstring:(personName,personComment,projectID,personUserName)}) | |
1592 self.createTempPersonInVirtuoso(projectID, idstring, personName, personComment) #TODO: add suername to the triplestore | |
1593 return self.addPersonToProject(projectID, idstring, personName); | |
2 | 1594 |
7 | 1595 def addSameAsRelationToTripleStore(self,personID,masterID): |
1596 cmdString ="insert in GRAPH <"+self.virtuosoGraph+"> {" | |
1597 cmdString +="<%s> <http://www.w3.org/2002/07/owl#sameAs> <%s>."%(personID,masterID) | |
1598 cmdString +="<%s> <http://www.w3.org/2002/07/owl#sameAs> <%s>."%(masterID,personID) | |
1599 cmdString+="}" | |
1600 | |
1601 auth_handler = urllib2.HTTPBasicAuthHandler() | |
1602 auth_handler.add_password(realm='sparql', | |
1603 uri=self.virtuosoServer+"/sparql", | |
1604 user=self.virtuosoDAVUser, | |
1605 passwd=self.virtuosoDAVPW) | |
1606 | |
1607 opener = urllib2.build_opener(auth_handler) | |
1608 opener.addheaders = [('Content-Type','application/sparql-query')] | |
1609 | |
1610 logging.debug(cmdString) | |
1611 try: | |
1612 r= opener.open(self.virtuosoServer+"/sparql", urllib.urlencode({'query':cmdString,'default-graph-uri':self.virtuosoGraph,'named-graph-uri':None})) | |
1613 logging.debug(r.read()) | |
1614 except urllib2.URLError, e: | |
1615 logging.error(e.code) | |
1616 logging.error(e.read()) | |
1617 return | |
1618 | |
1619 | |
2 | 1620 security.declareProtected('View management screens','createTempPersonInVirtuoso') |
0 | 1621 def createTempPersonInVirtuoso(self,projectID,personURI, personName,personComment): |
1622 """add a new person to the triple store of tempory persons""" | |
1623 triples=[]; | |
1624 personID="<"+personURI+">" | |
1625 triples.append((personID,"<http://www.w3.org/1999/02/22-rdf-syntax-ns#type>","<http://ontologies.mpiwg-berlin.mpg.de/authorities/namedIdentities/Person>")) | |
1626 triples.append((personID,"<http://erlangen-crm.org/110404/P3_has_note>",'"'+personComment+'"')) | |
1627 triples.append((personID,"<http://xmlns.com/foaf/0.1/name>",'"'+personName+'"')) | |
1628 triples.append((personID,"<http://ontologies.mpiwg-berlin.mpg.de/general/isMentionedOn>","<http://www.mpiwg-berlin.mpg.de/en/research/projects/"+projectID+">")) | |
1629 | |
1630 cmdString ="insert in GRAPH <"+self.virtuosoGraph+"> {" | |
1631 for triple in triples: | |
1632 cmdString+=" ".join(triple)+"." | |
1633 | |
1634 cmdString+="}" | |
1635 | |
1636 auth_handler = urllib2.HTTPBasicAuthHandler() | |
1637 auth_handler.add_password(realm='sparql', | |
1638 uri=self.virtuosoServer+"/sparql", | |
1639 user=self.virtuosoDAVUser, | |
1640 passwd=self.virtuosoDAVPW) | |
1641 | |
1642 opener = urllib2.build_opener(auth_handler) | |
1643 opener.addheaders = [('Content-Type','application/sparql-query')] | |
1644 | |
1645 logging.debug(cmdString) | |
1646 try: | |
1647 r= opener.open(self.virtuosoServer+"/sparql", urllib.urlencode({'query':cmdString,'default-graph-uri':self.virtuosoGraph,'named-graph-uri':None})) | |
1648 logging.debug(r.read()) | |
1649 except urllib2.URLError, e: | |
1650 logging.error(e.code) | |
1651 logging.error(e.read()) | |
1652 return | |
1653 | |
1654 opener2 = urllib2.build_opener() | |
1655 | |
1656 | |
1657 personIDencoded=urllib.quote(personURI,safe="") | |
1658 graphEncoded=urllib.quote(self.additionalNamesGraphURL,safe="") | |
1659 url = self.personproviderURL+"id/"+personIDencoded+"/"+graphEncoded | |
1660 | |
1661 try: | |
1662 request = urllib2.Request(url); | |
1663 request.get_method = lambda : 'PUT' | |
1664 r= opener2.open(request); | |
1665 logging.debug(r.read()) | |
1666 except urllib2.URLError, e: | |
1667 logging.error(e.code) | |
1668 logging.error(e.read()) | |
1669 return | |
1670 | |
1671 | |
1672 | |
1673 return | |
15 | 1674 |
1675 # self.storeChange("removePerson",projectID,value) | |
1676 def storeChange(self,typeString,projectID,value): | |
1677 | |
1678 from time import gmtime,strftime | |
1679 | |
17 | 1680 |
1681 | |
1682 | |
1683 | |
15 | 1684 |
1685 fl = open(self.getLogpath(),"a") | |
1686 person = self.REQUEST.AUTHENTICATED_USER.getId() | |
1687 date = strftime("%Y-%m-%d %H:%M:%S", gmtime()) | |
1688 writeString ="\t".join((date,person,typeString,projectID,value)) | |
1689 fl.write(writeString+"\n") | |
1690 fl.flush() | |
1691 fl.close() | |
0 | 1692 |
17 | 1693 lastChangeInThesaurus = getattr(self,'lastChangeInThesaurus',OOBTree()) |
1694 lastChangeInThesaurus.update({projectID:date}) | |
1695 self.lastChangeInThesaurus=lastChangeInThesaurus | |
1696 | |
0 | 1697 def redirect(RESPONSE,url): |
1698 """mache ein redirect mit einem angehaengten time stamp um ein reload zu erzwingen""" | |
1699 | |
1700 timeStamp=time.time() | |
1701 | |
1702 if url.find("?")>-1: #giebt es schon parameter | |
1703 addStr="&time=%s" | |
1704 else: | |
1705 addStr="?time=%s" | |
1706 | |
1707 RESPONSE.setHeader('Last-Modified',email.Utils.formatdate().split("-")[0]+'GMT') | |
1708 logging.error(email.Utils.formatdate()+' GMT') | |
1709 RESPONSE.redirect(url+addStr%timeStamp) | |
1710 | |
1711 def manage_addMPIWGThesaurusForm(self): | |
1712 """form for adding the project""" | |
1713 pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addMPIWGThesaurusForm.zpt')).__of__(self) | |
1714 return pt() | |
1715 | |
1716 | |
1717 | |
1718 def manage_addMPIWGThesaurus(self,id,RESPONSE=None): | |
1719 """add it""" | |
1720 newObj=MPIWGThesaurus(id) | |
1721 | |
1722 self._setObject(id,newObj) | |
1723 | |
1724 | |
1725 if RESPONSE is not None: | |
24 | 1726 redirect(RESPONSE,'manage_main') |