1:
2:
3:
4: #BAUSTELLE
5:
6:
7: """Methoden zum hinzufügen von Dokumenten ins Archiv"""
8: #import archive
9: import os
10: from Products.PageTemplates.PageTemplateFile import PageTemplateFile
11: from Products.PageTemplates.PageTemplate import PageTemplate
12: import string
13: import urllib
14: import xml.dom.minidom
15:
16: #referencetypes=['Book','Bic','Journal Article','Manuscript','jiji']
17:
18: import re
19: def add(self, no_upload=0):
20: """ Add metadata or metadata and documents to the repository
21: no_upload=0 kein upload sonst upload von documententen"""
22:
23: self.referencetypes=['Book','Journal Article','Manuscript']
24:
25: newtemplate=PageTemplateFile('products/OSA_system/OSAS_add_new').__of__(self)
26: self.REQUEST.SESSION['path']=self.REQUEST['path']
27: if no_upload==0:
28: self.REQUEST.SESSION['no_upload']='yes'
29: else:
30: if self.REQUEST.SESSION.has_key('no_upload'):
31: del self.REQUEST.SESSION['no_upload']
32:
33: return newtemplate()
34: return self.referencetypes
35:
36:
37:
38: def getISO():
39: f=file('/Users/dwinter/Documents/Projekte/OSAS/OSA_system/iso639-1.inc','r').readlines()
40: ret={}
41: for lineraw in f:
42: line=lineraw.encode('ascii','replace')
43: value=string.split(line,'\t')[0].encode('ascii','replace')
44: key=string.split(line,'\t')[1].encode('ascii','replace')
45:
46: ret[key]=value
47: return ret
48:
49: def add2(self):
50: self.reftype=self.REQUEST['Reference Type']
51: self.REQUEST.SESSION['reftype']=self.reftype
52: self.bibdata={'Book':['author','year','title','series editor','series title','series volume','number of pages','city','publisher','edition','number of volumes','translator','ISBN ISSN'],
53: 'Journal Article':['author','year','title','journal','volume','issue','pages','alternate journal','call number'],
54: 'Manuscript':['author','year','title','location','signature','pages','editorial remarks','description','keywords']}
55:
56: self.fields=self.bibdata[self.reftype]
57: self.isolist=getISO()
58: #listed=[ x for x in self.isolist.keys()]
59: #print listed
60: #sorted=listed.sort()
61: #print sorted
62:
63: newtemplate=PageTemplateFile('products/OSA_system/OSAS_add_bibdata').__of__(self)
64: return newtemplate()
65: #return self.fields
66:
67:
68: def parse_query_string(str):
69: queries={}
70: key=""
71: value=""
72: tmp=""
73: toggle="key"
74: str=urllib.unquote(str)
75: for i in str:
76: if i=="=":
77: key=tmp
78: toggle="value"
79: tmp=""
80: elif i=="&":
81: queries[key]=tmp
82: tmp=""
83: toggle="key"
84: else:
85: if toggle=="key":
86: if i=="+" : i="-"
87: else:
88: if i=="+" : i=" "
89: tmp=tmp+i
90: queries[key]=tmp
91: return queries
92:
93: def add3(self):
94: """Foldername"""
95: metadata=parse_query_string(self.REQUEST['QUERY_STRING'])
96: self.REQUEST.SESSION['metadata']=metadata
97: vorschlag_naming=metadata['author'][:5]+"_"+metadata['title'][:5]+"_"+metadata['year']
98: self.vorschlag_naming=vorschlag_naming.decode('ascii','ignore')
99: if self.REQUEST.SESSION.has_key('no_upload'):
100: self.REQUEST.SESSION['folder_name']=self.REQUEST.SESSION['path']
101: return add5(self)
102: else:
103: newtemplate=PageTemplateFile('products/OSA_system/OSAS_add_naming').__of__(self)
104: return newtemplate()
105:
106:
107: def add4(self):
108: self.path=re.search(r"/mpiwg(.*)",self.REQUEST.SESSION['path']).group(1)
109:
110: self.folder_name=self.REQUEST['folder_name']
111: # netx has to be changed -> error if back button is used!!
112: self.REQUEST.SESSION['path']=self.REQUEST.SESSION['path']+"/"+self.REQUEST['folder_name']
113:
114:
115: self.REQUEST.SESSION['folder_name']=self.folder_name
116: self.image_folder_name="pageimg"
117: newtemplate=PageTemplateFile('products/OSA_system/OSAS_upload').__of__(self)
118: return newtemplate()
119:
120: def add5(self):
121: """ADD INDEX.META"""
122: newtemplate=PageTemplateFile('products/OSA_system/OSAS_add_metadata').__of__(self)
123: return newtemplate()
124:
125: def add6(self):
126: metadata=parse_query_string(self.REQUEST['QUERY_STRING'])
127: metadata['archive-path']=os.path.split(self.REQUEST.SESSION['path'])[0]
128: #metadata['folder_name']=self.REQUEST.SESSION['folder_name']
129: metadata['folder_name']=os.path.split(self.REQUEST.SESSION['path'])[1]
130: metadata['content-type']="scanned document"
131: self.reftype=self.REQUEST.SESSION['reftype']
132: self.REQUEST.SESSION['add_metadata']=metadata
133: self.add_metadata=metadata
134: self.metadata=self.REQUEST.SESSION['metadata']
135: self.metadataprint=""
136: for tag in self.metadata.keys():
137: self.metadataprint=self.metadataprint+"<"+tag+">"+self.metadata[tag]+"</"+tag+">\n"
138:
139: newtemplate=PageTemplateFile('products/OSA_system/index_meta').__of__(self)
140: newtemplate.content_type="text/plain"
141: renderxml = newtemplate()
142: if self.REQUEST.SESSION.has_key('no_upload'):
143: metapath=self.REQUEST.SESSION['path']+"/index.meta"
144: else:
145: metapath=self.add_metadata['archive-path']+"/"+self.add_metadata['folder_name']+"/index.meta"
146:
147: f=open(metapath,'w')
148: f.writelines(renderxml)
149: f.close()
150: os.chmod(metapath,0644)
151: if self.REQUEST.SESSION.has_key('no_upload'):
152:
153: #newtemplate2=PageTemplateFile('/usr/local/mpiwg/Zope/Extensions/done',"text/html").__of__(self)
154: return self.REQUEST.response.redirect(self.REQUEST['URL2']+"?path="+self.REQUEST.SESSION['path'])
155: else:
156: #print self.add_metadata['archive-path']
157: self.viewpath=re.search(r"/mpiwg/online/(.*)",self.add_metadata['archive-path']).group(1)
158: newtemplate2=PageTemplateFile('products/OSA_system/OSAS_saved').__of__(self)
159:
160:
161: newtemplate2.content_type="text/html"
162: self.REQUEST.response.setHeader('Content-Type','text/html')
163:
164:
165: return newtemplate2()
166:
167:
168: from time import localtime,strftime
169:
170: def date(self):
171: return strftime("%d.%m.%Y",localtime())
172:
173:
174: def addPresentation(self,path):
175: """add presentation to the path"""
176:
177: dom=xml.dom.minidom.parse(path+"/index.meta")
178:
179: try:
180: author=archive.getText(dom.getElementsByTagName('author')[0].childNodes)
181: except:
182: author=archive.getText(dom.getElementsByTagName('Author')[0].childNodes)
183: title=archive.getText(dom.getElementsByTagName('title')[0].childNodes)
184: try:
185: date=archive.getText(dom.getElementsByTagName('year')[0].childNodes)
186: except:
187: try:
188: date=archive.getText(dom.getElementsByTagName('Year')[0].childNodes)
189: except:
190: date=archive.getText(dom.getElementsByTagName('date')[0].childNodes)
191: i=1
192: while os.path.exists("%02d-presentation"%i):
193: i+=1
194: self.REQUEST.SESSION['presentationname']="%02d-presentation"%i
195: self.REQUEST.SESSION['path']=path
196: self.REQUEST.SESSION['xmlvorschlag']="""<info>
197: <author>%s</author>
198: <title>%s</title>
199: <date>%s</date>
200: <display>yes</display>
201: </info>"""%(author,title,date)
202:
203: newtemplate=PageTemplateFile('/usr/local/mpiwg/Zope/Extensions/addPresentation').__of__(self)
204: return newtemplate()
205:
206: def addPresentation2(self):
207: """add presentation """
208: self.folder_name=self.REQUEST['folder_name']
209: #print self.REQUEST['folder_name']
210: self.content_description=self.REQUEST['content_description']
211:
212: self.path=self.REQUEST.SESSION['path']
213:
214: if not self.REQUEST.has_key('fileupload'):
215: self.xmlinfo=self.REQUEST['xmltext']
216: file_name="info.xml"
217:
218: else:
219: file_name=self.REQUEST['fileupload'].filename
220: self.xmlinfo=self.REQUEST.form['fileupload'].read()
221: # hack dW
222: file_name="info.xml"
223: self.xmlinfo=self.REQUEST['xmltext']
224: try:
225: os.mkdir(self.path+"/"+self.folder_name)
226: except:
227: """nothing"""
228: print "NAME:",file_name
229: f=open(self.path+"/"+self.folder_name+"/"+file_name,"w")
230: f.write(self.xmlinfo)
231: f.close()
232: os.chmod(self.path+"/"+self.folder_name,0755)
233: os.chmod(self.path+"/"+self.folder_name+"/"+file_name,0644)
234: addDirsToIndexMeta(self.path,self.folder_name,self.content_description,'presentation')
235:
236: return self.REQUEST.RESPONSE.redirect('storefiles?path='+self.path)
237:
238: def addText(self,path):
239: """add fulltext to the path"""
240: self.REQUEST.SESSION['existing_names']=['pageimg'] # to be done generate list of existing text files
241: self.REQUEST.SESSION['path']=path
242: newtemplate=PageTemplateFile('/usr/local/mpiwg/Zope/Extensions/addText').__of__(self)
243: return newtemplate()
244:
245: def addText2(self):
246: self.folder_name=self.REQUEST['folder_name']
247: #print self.REQUEST['folder_name']
248: self.content_description=self.REQUEST['content_description']
249: self.path=self.REQUEST.SESSION['path']
250: self.file_name=self.REQUEST['fileupload'].filename
251: self.file=self.REQUEST.form['fileupload'].read()
252: os.mkdir(self.path+"/"+self.folder_name)
253: f=open(self.path+"/"+self.folder_name+"/"+self.file_name,"w")
254: f.write(self.file)
255: f.close()
256: os.chmod(self.path+"/"+self.folder_name,0755)
257: os.chmod(self.path+"/"+self.folder_name+"/"+self.file_name,0644)
258: addDirsToIndexMeta(self.path,self.folder_name,self.content_description,'fulltext')
259:
260: return self.REQUEST.RESPONSE.redirect('storefiles?path='+self.path)
261:
262: def addTextExternal(self,path,texturl,version):
263: """hinzufügen eines externen textes"""
264: try: #neue text version einlesen
265: texttemp=urllib.urlopen(texturl).readlines()
266: text=""
267: for line in texttemp:
268: text=text+line
269: except: #fehler beim lesen des textes
270: return "ERROR: cannot read: %s"%texturl
271: if TextExternalError(text): #kein xml header
272: return "ERROR: cannot read: %s"%texturl, "received:",text
273: textpath=getNewTextPath(path) #erzeuge neuen Ornder für den Text
274: splitted=string.split(texturl,"/")
275: name=splitted[len(splitted)-1] #Name des XML-files
276: try:
277: writefile=file(path+"/"+textpath+"/"+name,"w")
278: except:
279: return"ERROR: cannot write: %s"%path+"/"+textpath+"/"+name
280: writefile.write(text)
281: writefile.close()
282: os.chmod(path+"/"+textpath+"/"+name,0644)
283:
284: #add new file to XML
285: dom=xml.dom.minidom.parse(path+"/index.meta")
286: node=dom.getElementsByTagName('resource')[0] #getNode
287:
288: subnode=dom.createElement('dir')
289:
290: namenode=dom.createElement('name')
291: namenodetext=dom.createTextNode(textpath)
292: namenode.appendChild(namenodetext)
293: subnode.appendChild(namenode)
294:
295: descriptionnode=dom.createElement('description')
296: descriptionnodetext=dom.createTextNode('archimedes text:'+version)
297: descriptionnode.appendChild(descriptionnodetext)
298: subnode.appendChild(descriptionnode)
299:
300: contentnode=dom.createElement('content-type')
301: contentnodetext=dom.createTextNode('fulltext')
302: contentnode.appendChild(contentnodetext)
303: subnode.appendChild(contentnode)
304:
305: node.appendChild(subnode)
306:
307: writefile=file(path+"/index.meta","w")
308: writefile.write(dom.toxml().encode('utf-8'))
309: writefile.close()
310:
311: #change texttool tag
312: dom=xml.dom.minidom.parse(path+"/index.meta")
313: node=dom.getElementsByTagName('meta')[0] #getNode
314:
315: try: #texttool existiert schon
316: subnode=node.getElementsByTagName('texttool')[0]
317: except: #wenn nicht Fehler ausgeben
318: return "ERROR:no presentation configured yet, user Web Front End to do so!"
319:
320:
321: try:
322: texttoolnodelist=subnode.getElementsByTagName('text')
323:
324: if not len(texttoolnodelist)==0: #texttool tag existiert schon, dann löschen
325: subsubnode=subnode.removeChild(texttoolnodelist[0])
326: subsubnode.unlink()
327: except:
328: """nothing"""
329: # text neu anlegen
330: textfoldernode=dom.createElement('text')
331: textfoldernodetext=dom.createTextNode(textpath+"/"+name)
332: textfoldernode.appendChild(textfoldernodetext)
333: subnode.appendChild(textfoldernode)
334:
335: #index.meta ausgeben
336: writefile=file(path+"/index.meta","w")
337: writefile.write(dom.toxml().encode('utf-8'))
338: writefile.close()
339:
340: #registrieren
341: print urllib.urlopen("http://nausikaa2.rz-berlin.mpg.de:86/cgi-bin/toc/admin/reg.cgi?path=%s"%path).readlines()
342:
343: return "DONE:"+textpath+"/"+name
344:
345: def TextExternalError(text):
346: firsts=text[0:10]
347: print firsts
348: try:
349: match=re.search(r".*<?xml.*",firsts)
350: except:
351: return 1
352: return 0
353:
354: def getNewTextPath(path):
355: i=1
356: while os.path.exists(path+"/fulltext%i"%i):
357: i+=1
358: os.mkdir(path+"/fulltext%i"%i)
359: os.chmod(path+"/fulltext%i"%i,0755)
360: return "fulltext%i"%i
361:
362: def addImages(self,path):
363: """Imagesfolder to the path"""
364: self.REQUEST.SESSION['existing_names']=['pageimg'] # to be done generate list of existing pageimages files
365: self.REQUEST.SESSION['path']=path
366: newtemplate=PageTemplateFile('products/OSA_system/OSAS_addImages').__of__(self)
367: return newtemplate()
368:
369: def addImages2(self):
370: self.image_folder_name=self.REQUEST['folder_name']
371: #print self.REQUEST['folder_name']
372: self.content_description=self.REQUEST['content_description']
373: #self.path=self.REQUEST.SESSION['path']
374:
375:
376: self.content_type='images'
377: addDirsToIndexMeta(self.REQUEST.SESSION['path'],self.image_folder_name,self.content_description,self.content_type)
378: self.REQUEST.SESSION['path']=re.search(r"/mpiwg(.*)",self.REQUEST.SESSION['path']).group(1)
379: newtemplate=PageTemplateFile('products/OSA_system/OSAS_upload2').__of__(self)
380: return newtemplate()
381:
382:
383: def addDirsToIndexMeta(path,folder_name,content_description,content_type):
384: #f=file(path+"/index.meta",r)
385: dom=xml.dom.minidom.parse(path+"/index.meta")
386: node=dom.getElementsByTagName('resource')[0] #getNode
387:
388: subnode=dom.createElement('dir')
389:
390: namenode=dom.createElement('name')
391: namenodetext=dom.createTextNode(folder_name)
392: namenode.appendChild(namenodetext)
393: subnode.appendChild(namenode)
394:
395: descriptionnode=dom.createElement('description')
396: descriptionnodetext=dom.createTextNode(content_description)
397: descriptionnode.appendChild(descriptionnodetext)
398: subnode.appendChild(descriptionnode)
399:
400: contentnode=dom.createElement('content-type')
401: contentnodetext=dom.createTextNode(content_type)
402: contentnode.appendChild(contentnodetext)
403: subnode.appendChild(contentnode)
404:
405: node.appendChild(subnode)
406:
407: writefile=file(path+"/index.meta","w")
408: writefile.write(dom.toxml().encode('utf-8'))
409: writefile.close()
410:
411: def combineTextImage(self,path):
412: """gibt input formular zur erstellung des texttools meta tag aus"""
413: files = os.listdir(path)
414:
415: texts=[]
416: imagefolders=[]
417: presentationfolders=[]
418:
419: for filename in files:
420:
421: if archive.isdigilib2(path+"/"+filename):
422: imagefolders.append(filename)
423:
424: if archive.isFullText(path,filename):
425: texts.append(filename)
426: if archive.isPresentation(path,filename):
427: presentationfolders.append(filename)
428:
429: dom=xml.dom.minidom.parse(path+"/index.meta")
430: try:
431: filelanguage=archive.getText(dom.getElementsByTagName('lang')[0].childNodes)
432: except:
433: filelanguage=""
434: self.REQUEST.SESSION['isolist']=getISO()
435: self.REQUEST.SESSION['path']=path
436: self.REQUEST.SESSION['texts']=texts
437: self.REQUEST.SESSION['imagefolders']=imagefolders
438: self.REQUEST.SESSION['presentationfolders']=presentationfolders
439: self.REQUEST.SESSION['filelanguage']=filelanguage
440: newtemplate=PageTemplateFile('/usr/local/mpiwg/Zope/Extensions/ImageandText').__of__(self)
441: return newtemplate()
442:
443:
444:
445: def combineTextImage2(self,path):
446: """erstellt bzw. ändert texttool meta tag"""
447: dom=xml.dom.minidom.parse(path+"/index.meta")
448: node=dom.getElementsByTagName('meta')[0] #getNode
449:
450:
451: subnodelist=node.getElementsByTagName('texttool')
452: if not len(subnodelist)==0: #texttool tag existiert schon, dann löschen
453: subnode=node.removeChild(subnodelist[0])
454: subnode.unlink()
455:
456: subnode=dom.createElement('texttool') #neu erzeugen
457:
458:
459: presentfile=os.listdir(path+"/"+self.REQUEST['presentation'])[0]
460:
461:
462: displaynode=dom.createElement('display')
463: displaynodetext=dom.createTextNode('yes')
464: displaynode.appendChild(displaynodetext)
465: subnode.appendChild(displaynode)
466:
467: if self.REQUEST.has_key('image'):
468: namenode=dom.createElement('image')
469: namenodetext=dom.createTextNode(self.REQUEST['image'])
470: namenode.appendChild(namenodetext)
471: subnode.appendChild(namenode)
472:
473: if self.REQUEST.has_key('text'):
474: textfile=os.listdir(path+"/"+self.REQUEST['text'])[0]
475: textfoldernode=dom.createElement('text')
476: textfoldernodetext=dom.createTextNode(self.REQUEST['text']+"/"+textfile)
477: textfoldernode.appendChild(textfoldernodetext)
478: subnode.appendChild(textfoldernode)
479:
480: if self.REQUEST.has_key('pagebreak'):
481: pagebreaknode=dom.createElement('pagebreak')
482: pagebreaknodetext=dom.createTextNode(self.REQUEST['pagebreak'])
483: pagebreaknode.appendChild(pagebreaknodetext)
484: subnode.appendChild(pagebreaknode)
485:
486: if self.REQUEST.has_key('presentation'):
487: presentationnode=dom.createElement('presentation')
488: presentationnodetext=dom.createTextNode(self.REQUEST['presentation']+"/"+presentfile)
489: presentationnode.appendChild(presentationnodetext)
490: subnode.appendChild(presentationnode)
491:
492: node.appendChild(subnode)
493:
494: # node=dom.getElementsByTagName('lang')[0] #getNode
495:
496: writefile=file(path+"/index.meta","w")
497: writefile.write(dom.toxml().encode('utf-8'))
498: writefile.close()
499:
500:
501:
502: print urllib.urlopen("http://nausikaa2.rz-berlin.mpg.de:86/cgi-bin/toc/admin/reg.cgi?path=%s"%path).readlines()
503: #return urllib.quote("http://nausikaa2.rz-berlin.mpg.de:86/cgi-bin/toc/admin/reg.cgi?path=%s"%path)
504: os.popen("ssh nausikaa2.rz-berlin.mpg.de /usr/local/mpiwg/scripts/scaleomat.pl %s /mpiwg/temp/online/scaled/thumb 90 &"% re.sub('mpiwg/online/','',self.REQUEST['path']+"/"+self.REQUEST['image']))
505: return self.REQUEST.RESPONSE.redirect('storefiles?path='+self.REQUEST['path'])
506:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>