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