Mercurial > hg > MPIWGThesaurus
comparison MPIWGThesaurus.py @ 15:f9a65eaaa59c
bug beim L?schen von objekte im Tagger fixed.
Logger eingebaut um die Ver?nderungen beim Taggen festzuhalten,
author | dwinter |
---|---|
date | Wed, 18 Jan 2012 12:51:43 +0100 |
parents | 51ed6ad43383 |
children | 8e2ddcef1e8d |
comparison
equal
deleted
inserted
replaced
14:a85d5f111592 | 15:f9a65eaaa59c |
---|---|
76 virtuosoDAV="/DAV/home/websiteuser/" | 76 virtuosoDAV="/DAV/home/websiteuser/" |
77 virtuosoDAVUser="websiteuser" | 77 virtuosoDAVUser="websiteuser" |
78 virtuosoDAVPW="w3s45us3" | 78 virtuosoDAVPW="w3s45us3" |
79 virtuosoGraph="file://newpersonsFromProjects" | 79 virtuosoGraph="file://newpersonsFromProjects" |
80 | 80 |
81 logpathDefault="/var/tmp/tagchanges.log" | |
82 | |
81 #BTrees fuer die Tags | 83 #BTrees fuer die Tags |
82 | 84 |
83 projectPersons= OOBTree() #project --> personen IDs | 85 projectPersons= OOBTree() #project --> personen IDs |
84 projectObjects= OOBTree() | 86 projectObjects= OOBTree() #project --> objects |
85 projectHistoricalPlaces= OOBTree() | 87 projectHistoricalPlaces= OOBTree() |
86 projectSuggestedTags= OOBTree() | 88 projectSuggestedTags= OOBTree() |
87 persons2Projects= OOBTree() #personenID --> projects | 89 persons2Projects= OOBTree() #personenID --> projects |
88 objects2Projects=OOBTree() | 90 objects2Projects=OOBTree() #objects --> projects |
89 historicalPlaces2Projects=OOBTree() | 91 historicalPlaces2Projects=OOBTree() |
90 suggestedTags2Projects=OOBTree() | 92 suggestedTags2Projects=OOBTree() |
91 personIDtoNames=OOBTree() # weist den personenIDs Klartextnamen aus dem Triplestore zu | 93 personIDtoNames=OOBTree() # weist den personenIDs Klartextnamen aus dem Triplestore zu |
92 personsIDForSort=[] # liste personenID sortiert nach dem tupel (nachname,vorname) | 94 personsIDForSort=[] # liste personenID sortiert nach dem tupel (nachname,vorname) |
93 personsIDForSortFull=[] # liste (personenID,(nachname,vorname)) nicht sortiert! | 95 personsIDForSortFull=[] # liste (personenID,(nachname,vorname)) nicht sortiert! |
161 | 163 |
162 | 164 |
163 manage_options = Folder.manage_options+( | 165 manage_options = Folder.manage_options+( |
164 {'label':'Thesaurus entries','action':'changeMPIWGThesaurusForm'}, | 166 {'label':'Thesaurus entries','action':'changeMPIWGThesaurusForm'}, |
165 {'label':'Manage Thesaurus','action':'manageMPIWGThesaurus'}, | 167 {'label':'Manage Thesaurus','action':'manageMPIWGThesaurus'}, |
168 {'label':'Thesaurus Log','action':'manageMPIWGThesaurusLogs'}, | |
166 #{'label':'Change Publications Special','action':'changePublications_specialForm'}, | 169 #{'label':'Change Publications Special','action':'changePublications_specialForm'}, |
167 ) | 170 ) |
168 | 171 |
169 def __init__(self,id): | 172 def __init__(self,id): |
170 """init""" | 173 """init""" |
187 def manageMPIWGThesaurus(self): | 190 def manageMPIWGThesaurus(self): |
188 """form for changing the project""" | 191 """form for changing the project""" |
189 pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','manageMPIWGThesaurus.zpt')).__of__(self) | 192 pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','manageMPIWGThesaurus.zpt')).__of__(self) |
190 return pt() | 193 return pt() |
191 | 194 |
195 security.declareProtected('View management screens','manageMPIWGThesaurusLogs') | |
196 def manageMPIWGThesaurusLogs(self): | |
197 """form for changing the project""" | |
198 pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','manageMPIWGThesaurusLog.zpt')).__of__(self) | |
199 return pt() | |
200 | |
201 def changeMPIWGThesaurusLog(self,logpath,RESPONSE=None): | |
202 """change log file path""" | |
203 self.logpath=logpath | |
204 | |
205 if RESPONSE is not None: | |
206 redirect(RESPONSE,'manage_main') | |
207 | |
208 | |
192 security.declareProtected('View management screens','changeMPIWGThesaurus') | 209 security.declareProtected('View management screens','changeMPIWGThesaurus') |
193 def changeMPIWGThesaurus(self,approachesTxt,disciplinesTxt,periodsTxt,spacesTxt,technologiesTxt,knowledgeTransfersTxt,RESPONSE=None): | 210 def changeMPIWGThesaurus(self,approachesTxt,disciplinesTxt,periodsTxt,spacesTxt,technologiesTxt,knowledgeTransfersTxt,RESPONSE=None): |
194 """change it""" | 211 """change it""" |
195 self.approachesTxt=approachesTxt | 212 self.approachesTxt=approachesTxt |
196 self.disciplinesTxt=disciplinesTxt | 213 self.disciplinesTxt=disciplinesTxt |
199 self.technologiesTxt=technologiesTxt | 216 self.technologiesTxt=technologiesTxt |
200 self.knowledgeTransfersTxt=knowledgeTransfersTxt | 217 self.knowledgeTransfersTxt=knowledgeTransfersTxt |
201 | 218 |
202 if RESPONSE is not None: | 219 if RESPONSE is not None: |
203 redirect(RESPONSE,'manage_main') | 220 redirect(RESPONSE,'manage_main') |
204 | 221 |
222 | |
223 def getLogpath(self): | |
224 return getattr(self,"logpath",self.logpathDefault) | |
225 | |
226 def getLogfile(self,projectID="",date=""): | |
227 | |
228 # logfile format : YYYY-MM-TT HH:mm:ss\tUSER\ttype\tprojectid\CHANGED_TAG_or_OBJECT_or_PERSON | |
229 if not os.path.exists(self.getLogpath()): | |
230 return "" | |
231 | |
232 fh = open(self.getLogpath(),"r") | |
233 lines=fh.readlines() | |
234 | |
235 if (projectID!=""): | |
236 ret=[] | |
237 for line in lines: | |
238 splitted=line.split("\t") | |
239 if splitted[3]==projectID: | |
240 ret.append(line) | |
241 | |
242 lines=ret[0:] | |
243 | |
244 if (date!=""): | |
245 ret=[] | |
246 for line in lines: | |
247 splitted=line.split("\t") | |
248 if splitted[0]>=date: | |
249 ret.append(line) | |
250 | |
251 | |
252 lines=ret[0:] | |
253 | |
254 txt= "".join(lines) | |
255 fh.close() | |
256 | |
257 | |
258 | |
259 | |
260 return txt | |
261 | |
205 #In der Anzeige soll der Name der zitierten Personen in Klartext angezeigt werden, ausserdem die Varianten, wie sie tatsaechlich | 262 #In der Anzeige soll der Name der zitierten Personen in Klartext angezeigt werden, ausserdem die Varianten, wie sie tatsaechlich |
206 #in den Projekten benutzt werden | 263 #in den Projekten benutzt werden |
207 | 264 |
208 | 265 |
209 def addPersonAndFirstNameFromTripleStore(self, personID): | 266 def addPersonAndFirstNameFromTripleStore(self, personID): |
448 | 505 |
449 | 506 |
450 | 507 |
451 for tag in tagsStored.keys(): #gehe durch alle gespeichteren tags | 508 for tag in tagsStored.keys(): #gehe durch alle gespeichteren tags |
452 logging.debug("checking:"+tag) | 509 logging.debug("checking:"+tag) |
453 currentApproach = tagsStored.get(tag,None) | 510 projectsOfTag = tagsStored.get(tag,None) |
454 logging.debug(currentApproach) | 511 logging.debug(projectsOfTag) |
455 if currentApproach is None: | 512 if projectsOfTag is None: |
456 currentApproach=OOSet() | 513 projectsOfTag=OOSet() |
457 | 514 |
458 if tag in tagList: #dieser ist getagged | 515 if tag in tagList: #dieser ist getagged |
459 currentApproach.update([projectID]); | 516 projectsOfTag.update([projectID]); |
517 self.storeChange("added",projectID,tag) | |
460 tagList.remove(tag); | 518 tagList.remove(tag); |
461 else: | 519 else: |
462 if currentApproach.has_key(projectID): | 520 if projectsOfTag.has_key(projectID): |
463 currentApproach.remove(projectID); | 521 projectsOfTag.remove(projectID); |
464 | 522 self.storeChange("remove",projectID,tag) |
465 tagsStored.update({tag:currentApproach}); | 523 |
466 | 524 tagsStored.update({tag:projectsOfTag}); |
467 for tag in tagList: # alle die nich nicht abearbeitet worden muessen noch angelegt werden | 525 |
526 for tag in tagList: # alle Tags, die nicht abgearbeitet worden sind, muessen noch angelegt werden | |
468 logging.debug("adding:"+tag) | 527 logging.debug("adding:"+tag) |
469 newApproach=OOSet() | 528 newApproach=OOSet() |
470 newApproach.update([projectID]); | 529 newApproach.update([projectID]); |
471 tagsStored.insert(tag, newApproach); | 530 tagsStored.insert(tag, newApproach); |
472 | 531 |
475 transaction.commit() | 534 transaction.commit() |
476 | 535 |
477 def getTitle(self,entry): | 536 def getTitle(self,entry): |
478 return entry.title | 537 return entry.title |
479 | 538 |
480 def getEntriesFormatted(self,entries,type): | 539 def getEntriesFormatted(self,entries,formatType): |
481 errorString="<H1>template with name <em>levelFormatted</em> does not exist in the thesaurus folder!" | 540 errorString="<H1>template with name <em>levelFormatted</em> does not exist in the thesaurus folder!" |
482 if not hasattr(self,'levelFormatted'): | 541 if not hasattr(self,'levelFormatted'): |
483 pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','levelFormatted.zpt')).__of__(self) | 542 pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','levelFormatted.zpt')).__of__(self) |
484 return pt(level1_entries=entries,type=type) | 543 return pt(level1_entries=entries,type=formatType) |
485 | 544 |
486 | 545 |
487 return self.levelFormatted(level1_entries=entries,type=type) | 546 return self.levelFormatted(level1_entries=entries,type=formatType) |
488 | 547 |
489 def getEntries(self,entry): | 548 def getEntries(self,entry): |
490 return entry.entries | 549 return entry.entries |
491 | 550 |
492 #nimmt ein eine Text der Form | 551 #nimmt ein eine Text der Form |
718 security.declareProtected('View management screens','removeObjectFromProject') | 777 security.declareProtected('View management screens','removeObjectFromProject') |
719 def removeObjectFromProject(self,projectID,value): | 778 def removeObjectFromProject(self,projectID,value): |
720 """remove""" | 779 """remove""" |
721 logging.debug("remove:"+projectID+":"+value); | 780 logging.debug("remove:"+projectID+":"+value); |
722 | 781 |
782 | |
783 self.storeChange("removeObject",projectID,value) | |
784 | |
723 objects = self.getObjectsFromProject(projectID) | 785 objects = self.getObjectsFromProject(projectID) |
724 for object in objects.keys(): | 786 for object in objects.keys(): |
725 | 787 |
726 logging.debug("trying:"+repr(object[0])+"::"+repr(value)+"__") | 788 logging.debug("trying:"+repr(object[0])+"::"+repr(value)+"__") |
727 if object[0]==value: | 789 if object[0]==value: |
728 logging.debug("---removed!") | 790 logging.debug("---removed!") |
729 objects.remove(object) | 791 objects.remove(object) |
730 | 792 |
793 #now also delete the project from the object. | |
794 objectsOfPerson=self.objects2Projects.get(object[0]) | |
795 | |
796 | |
797 if projectID in list(objectsOfPerson): | |
798 objectsOfPerson.remove(projectID) | |
799 #self.persons2Projects.update({person:projectsList}) | |
800 if (len(objectsOfPerson)==0): #loesche person aus der liste wenn keine Projekte dazu existieren. | |
801 del self.objects2Projects[object[0]] | |
802 | |
731 self.projectObjects.update({projectID:objects}) | 803 self.projectObjects.update({projectID:objects}) |
732 retstring = self.getObjectsFromProjectAsHTML(projectID) | 804 retstring = self.getObjectsFromProjectAsHTML(projectID) |
733 logging.debug(retstring) | 805 logging.debug(retstring) |
734 return retstring | 806 return retstring |
735 | 807 |
736 security.declareProtected('View management screens','removePersonFromProject') | 808 security.declareProtected('View management screens','removePersonFromProject') |
737 def removePersonFromProject(self,projectID,value): | 809 def removePersonFromProject(self,projectID,value): |
738 """remove a person from the projeckt""" | 810 """remove a person from the projeckt""" |
739 logging.debug("remove:"+projectID+":"+value); | 811 logging.debug("remove:"+projectID+":"+value); |
812 self.storeChange("removePerson",projectID,value) | |
740 | 813 |
741 persons = self.getPersonsFromProject(projectID) # hole alle personen die mit dem Projekt verbunden sind. | 814 persons = self.getPersonsFromProject(projectID) # hole alle personen die mit dem Projekt verbunden sind. |
742 for person in persons.keys(): | 815 for person in persons.keys(): |
743 | 816 |
744 logging.debug("trying:"+repr(person[0])+"::"+repr(value)+"__") | 817 logging.debug("trying:"+repr(person[0])+"::"+repr(value)+"__") |
775 self.personIDtoNames.update({personID:personName}) | 848 self.personIDtoNames.update({personID:personName}) |
776 | 849 |
777 security.declareProtected('View management screens','addPersonToProject') | 850 security.declareProtected('View management screens','addPersonToProject') |
778 def addPersonToProject(self,projectID,value,label): | 851 def addPersonToProject(self,projectID,value,label): |
779 """ add a person so the project""" | 852 """ add a person so the project""" |
853 self.storeChange("addPerson",projectID,value+":"+label) | |
854 | |
780 persons=self.getPersonsFromProject(projectID); | 855 persons=self.getPersonsFromProject(projectID); |
781 | 856 |
782 logging.debug("adding:"+projectID+":"+value+":"+label); | 857 logging.debug("adding:"+projectID+":"+value+":"+label); |
783 | 858 |
784 persons.insert([value,label]) | 859 persons.insert([value,label]) |
1072 keys = [x for x in self.getObjectsWithProjectIDs().keys()] | 1147 keys = [x for x in self.getObjectsWithProjectIDs().keys()] |
1073 keys.sort(sortF) | 1148 keys.sort(sortF) |
1074 return keys | 1149 return keys |
1075 | 1150 |
1076 def getObjectsWithProjectIDs(self): | 1151 def getObjectsWithProjectIDs(self): |
1077 """holt die getaggted Personen mit Projekten""" | 1152 """holt die getagten Personen mit Projekten""" |
1078 objects = self.objects2Projects; | 1153 objects = self.objects2Projects; |
1079 ret={} | 1154 ret={} |
1080 logging.debug("Check Object:"+repr(objects.keys())) | 1155 logging.debug("Check Object:"+repr(objects.keys())) |
1081 for object in objects.keys(): | 1156 for object in objects.keys(): |
1082 logging.debug("Check:"+object) | 1157 logging.debug("Check:"+object) |
1188 """ add a person so the project""" | 1263 """ add a person so the project""" |
1189 objects=self.getObjectsFromProject(projectID); | 1264 objects=self.getObjectsFromProject(projectID); |
1190 | 1265 |
1191 logging.debug("adding:"+projectID+":"+value); | 1266 logging.debug("adding:"+projectID+":"+value); |
1192 | 1267 |
1268 self.storeChange("addObject",projectID,value) | |
1193 | 1269 |
1194 #TODO: Im moment noch keine Zuordnung zu einer ID. | 1270 #TODO: Im moment noch keine Zuordnung zu einer ID. |
1195 objects.insert([value,value]) | 1271 objects.insert([value,value]) |
1196 self.projectObjects.update({projectID:objects}) | 1272 self.projectObjects.update({projectID:objects}) |
1197 | 1273 |
1364 return | 1440 return |
1365 | 1441 |
1366 | 1442 |
1367 | 1443 |
1368 return | 1444 return |
1445 | |
1446 # self.storeChange("removePerson",projectID,value) | |
1447 def storeChange(self,typeString,projectID,value): | |
1448 | |
1449 from time import gmtime,strftime | |
1450 | |
1451 | |
1452 fl = open(self.getLogpath(),"a") | |
1453 person = self.REQUEST.AUTHENTICATED_USER.getId() | |
1454 date = strftime("%Y-%m-%d %H:%M:%S", gmtime()) | |
1455 writeString ="\t".join((date,person,typeString,projectID,value)) | |
1456 fl.write(writeString+"\n") | |
1457 fl.flush() | |
1458 fl.close() | |
1369 | 1459 |
1370 def redirect(RESPONSE,url): | 1460 def redirect(RESPONSE,url): |
1371 """mache ein redirect mit einem angehaengten time stamp um ein reload zu erzwingen""" | 1461 """mache ein redirect mit einem angehaengten time stamp um ein reload zu erzwingen""" |
1372 | 1462 |
1373 timeStamp=time.time() | 1463 timeStamp=time.time() |