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