#Neue Version Begin 5.4.2004
"""Methoden zum hinzufügen von Dokumenten ins Archiv"""
from OSAS_helpers import readArchimedesXML
try:
import archive
except:
print "archive not imported"
import os
from Products.PageTemplates.PageTemplateFile import PageTemplateFile
from Products.PageTemplates.PageTemplate import PageTemplate
import string
import urllib
import xml.dom.minidom
from time import localtime,strftime
from Globals import package_home
import re
def showHelp(helptext):
"""show helptext"""
return """<html>
<body>
%
</body>
</html>"""%helptext
def add(self, no_upload=0):
""" Add metadata or metadata and documents to the repository
no_upload=0 kein upload sonst upload von documententen"""
#self.referencetypes=self.ZopeFind(self,obj_metatypes=['OSAS_MetadataMapping'])
self.referencetypes=self.ZopeFind(self)
newtemplate=PageTemplateFile('Products/OSA_system/zpt/OSAS_add_new').__of__(self)
self.REQUEST.SESSION['path']=self.REQUEST['path']
if no_upload==0:
self.REQUEST.SESSION['no_upload']='yes'
else:
if self.REQUEST.SESSION.has_key('no_upload'):
del self.REQUEST.SESSION['no_upload']
return newtemplate()
def getISO():
"""ISO"""
try:
f=file(os.path.join(package_home(globals()),'iso639-1.inc'),'r').readlines()
ret={}
for lineraw in f:
line=lineraw.encode('ascii','replace')
value=string.split(line,'\t')[0].encode('ascii','replace')
key=string.split(line,'\t')[1].encode('ascii','replace')
ret[key]=value
except:
ret={}
return ret
def add2(self):
self.reftype=self.REQUEST['Reference Type']
self.REQUEST.SESSION['reftype']=self.reftype
self.bibdata={}
for referenceType in self.referencetypes:
#print referenceType
self.bibdata[referenceType[1].title]=referenceType[1].fields
self.bibdata['data']=referenceType[1]
self.fields=self.bibdata[self.reftype]
self.isolist=getISO()
tmp=getISO().keys()
tmp.sort()
self.isokeys=tmp
#listed=[ x for x in self.isolist.keys()]
#print listed
#sorted=listed.sort()
#print sorted
newtemplate=PageTemplateFile('Products/OSA_system/zpt/OSAS_add_bibdata').__of__(self)
return newtemplate()
#return self.fields
def parse_query_string(str):
queries={}
key=""
value=""
tmp=""
toggle="key"
str=urllib.unquote(str)
for i in str:
if i=="=":
key=tmp
toggle="value"
tmp=""
elif i=="&":
queries[key]=tmp
tmp=""
toggle="key"
else:
if toggle=="key":
if i=="+" : i="-"
else:
if i=="+" : i=" "
tmp=tmp+i
queries[key]=tmp
return queries
def add3(self):
"""Foldername"""
metadata=parse_query_string(self.REQUEST['QUERY_STRING'])
self.REQUEST.SESSION['metadata']=metadata
vorschlag=[]
if metadata.has_key('author'):
vorschlag.append(metadata['author'][:5])
if metadata.has_key('title'):
vorschlag.append(metadata['title'][:5])
if metadata.has_key('year'):
vorschlag.append(metadata['year'])
vorschlag_naming=string.join(vorschlag,"_")
self.vorschlag_naming=unicode(vorschlag_naming,'ascii','ignore')
if self.REQUEST.SESSION.has_key('no_upload'):
self.REQUEST.SESSION['folder_name']=self.REQUEST.SESSION['path']
return add5(self)
else:
newtemplate=PageTemplateFile('Products/OSA_system/zpt/OSAS_add_naming').__of__(self)
return newtemplate()
def add4(self):
self.path=re.search(r"/mpiwg(.*)",self.REQUEST.SESSION['path']).group(1)
self.folder_name=self.REQUEST['folder_name']
# next has to be changed -> error if back button is used!!
self.REQUEST.SESSION['folder_name']=self.folder_name
if self.REQUEST['submit']=="upload images":
self.REQUEST.SESSION['path']=os.path.join(self.REQUEST.SESSION['path'],self.REQUEST['folder_name'])
self.image_folder_name="pageimg"
newtemplate=PageTemplateFile('Products/OSA_system/zpt/OSAS_upload').__of__(self)
return newtemplate()
else:
os.mkdir(os.path.join(self.REQUEST.SESSION['path'],self.REQUEST['folder_name']))
return addText(self,os.path.join(self.REQUEST.SESSION['path'],self.REQUEST['folder_name']))
def add5(self):
"""ADD INDEX.META"""
newtemplate=PageTemplateFile('Products/OSA_system/zpt/OSAS_add_metadata').__of__(self)
return newtemplate()
def add6(self):
metadata=parse_query_string(self.REQUEST['QUERY_STRING'])
metadata['archive-path']=os.path.split(self.REQUEST.SESSION['path'])[0]
#metadata['folder_name']=self.REQUEST.SESSION['folder_name']
metadata['folder_name']=os.path.split(self.REQUEST.SESSION['path'])[1]
metadata['content-type']="scanned document"
self.reftype=self.REQUEST.SESSION['reftype']
self.REQUEST.SESSION['add_metadata']=metadata
self.add_metadata=metadata
self.metadata=self.REQUEST.SESSION['metadata']
self.metadataprint=""
for tag in self.metadata.keys():
if tag!="":
self.metadataprint=self.metadataprint+"<"+tag+">"+self.metadata[tag]+"</"+tag+">\n"
newtemplate=PageTemplateFile('Products/OSA_system/zpt/index_meta').__of__(self)
newtemplate.content_type="text/plain"
renderxml = newtemplate()
if self.REQUEST.SESSION.has_key('no_upload'):
metapath=self.REQUEST.SESSION['path']+"/index.meta"
else:
metapath=self.add_metadata['archive-path']+"/"+self.add_metadata['folder_name']+"/index.meta"
f=open(metapath,'w')
f.writelines(renderxml)
f.close()
os.chmod(metapath,0664)
os.popen('chmod -R 0775 %s'%self.add_metadata['archive-path']+"/"+self.add_metadata['folder_name'])
if self.REQUEST.SESSION.has_key('no_upload'):
#newtemplate2=PageTemplateFile('/usr/local/mpiwg/Zope/Extensions/done',"text/html").__of__(self)
return self.REQUEST.response.redirect(self.REQUEST['URL2']+"?path="+self.REQUEST.SESSION['path'])
else:
#print self.add_metadata['archive-path']
self.viewpath=re.search(r"/mpiwg/online/(.*)",self.add_metadata['archive-path']).group(1)
if not (self.REQUEST.SESSION['no_upload']=="text"):
newtemplate2=PageTemplateFile('Products/OSA_system/zpt/OSAS_saved').__of__(self)
newtemplate2.content_type="text/html"
self.REQUEST.response.setHeader('Content-Type','text/html')
return newtemplate2()
else:
"""text upload"""
return 1
def date(self):
return strftime("%d.%m.%Y",localtime())
def addPresentation(self,path):
"""add presentation to the path"""
dom=xml.dom.minidom.parse(path+"/index.meta")
try:
author=archive.getText(dom.getElementsByTagName('author')[0].childNodes)
except:
try:
author=archive.getText(dom.getElementsByTagName('Author')[0].childNodes)
except:
try:
author=archive.getText(dom.getElementsByTagName('Editor')[0].childNodes)
except:
author=""
try:
title=archive.getText(dom.getElementsByTagName('title')[0].childNodes)
except:
title=""
try:
date=archive.getText(dom.getElementsByTagName('year')[0].childNodes)
except:
try:
date=archive.getText(dom.getElementsByTagName('Year')[0].childNodes)
except:
try:
date=archive.getText(dom.getElementsByTagName('date')[0].childNodes)
except:
date=""
i=1
while os.path.exists("%02d-presentation"%i):
i+=1
self.REQUEST.SESSION['presentationname']="%02d-presentation"%i
self.REQUEST.SESSION['path']=path
self.REQUEST.SESSION['xmlvorschlag']="""<info>
<author>%s</author>
<title>%s</title>
<date>%s</date>
<display>yes</display>
</info>"""%(author,title,date)
newtemplate=PageTemplateFile('Products/OSA_system/zpt/addPresentation').__of__(self)
return newtemplate()
def addPresentation2(self):
"""add presentation """
folder_name=self.REQUEST['folder_name']
#print self.REQUEST['folder_name']
content_description=self.REQUEST['content_description']
path=self.REQUEST.SESSION['path']
if not self.REQUEST.has_key('fileupload'):
xmlinfo=self.REQUEST['xmltext']
file_name="info.xml"
else:
file_name=self.REQUEST['fileupload'].filename
xmlinfo=self.REQUEST.form['fileupload'].read()
# hack Multipart auswertung funktioniert nicht ausser bei mozilla
file_name="info.xml"
xmlinfo=self.REQUEST['xmltext']
try:
os.mkdir(path+"/"+folder_name)
except:
"""nothing"""
#print "NAME:",file_name
f=open(path+"/"+folder_name+"/"+file_name,"w")
f.write(xmlinfo)
f.close()
try:
os.chmod(path+"/"+folder_name,0755)
except:
"""NO"""
os.chmod(path+"/"+folder_name+"/"+file_name,0644)
addDirsToIndexMeta(path,folder_name,content_description,'presentation')
return self.REQUEST.RESPONSE.redirect(self.REQUEST['URL2']+'?path='+path)
def addText(self,path,folder=None):
"""add fulltext to the path"""
self.REQUEST.SESSION['existing_names']=['pageimg'] # to be done generate list of existing text files
self.REQUEST.SESSION['path']=path
newtemplate=PageTemplateFile('Products/OSA_system/zpt/addText').__of__(self)
return newtemplate()
def addText2(self):
"""addtext"""
folder_name=self.REQUEST['folder_name']
#print self.REQUEST['folder_name']
content_description=self.REQUEST['content_description']
path=self.REQUEST.SESSION['path']
file_name=self.REQUEST['fileupload'].filename
filedata=self.REQUEST.form['fileupload'].read()
os.mkdir(path+"/"+folder_name)
f=open(path+"/"+folder_name+"/"+file_name,"w")
f.write(filedata)
f.close()
os.chmod(path+"/"+folder_name,0755)
os.chmod(path+"/"+folder_name+"/"+file_name,0644)
addDirsToIndexMeta(path,folder_name,content_description,'fulltext')
return self.REQUEST.RESPONSE.redirect(self.REQUEST['URL2']+'?path='+path)
def addTextExternal(self,path,texturl,version):
"""hinzufügen eines externen textes"""
try: #neue text version einlesen
texttemp=urllib.urlopen(texturl).readlines()
text=""
for line in texttemp:
text=text+line
except: #fehler beim lesen des textes
return "ERROR: cannot read: %s"%texturl
if TextExternalError(text): #kein xml header
return "ERROR: cannot read: %s"%texturl, "received:",text
textpath=getNewTextPath(path) #erzeuge neuen Ornder für den Text
splitted=string.split(texturl,"/")
name=splitted[len(splitted)-1] #Name des XML-files
try:
writefile=file(path+"/"+textpath+"/"+name,"w")
except:
return"ERROR: cannot write: %s"%path+"/"+textpath+"/"+name
writefile.write(text)
writefile.close()
os.chmod(path+"/"+textpath+"/"+name,0644)
#add new file to XML
dom=xml.dom.minidom.parse(path+"/index.meta")
node=dom.getElementsByTagName('resource')[0] #getNode
subnode=dom.createElement('dir')
namenode=dom.createElement('name')
namenodetext=dom.createTextNode(textpath)
namenode.appendChild(namenodetext)
subnode.appendChild(namenode)
descriptionnode=dom.createElement('description')
descriptionnodetext=dom.createTextNode('archimedes text:'+version)
descriptionnode.appendChild(descriptionnodetext)
subnode.appendChild(descriptionnode)
contentnode=dom.createElement('content-type')
contentnodetext=dom.createTextNode('fulltext')
contentnode.appendChild(contentnodetext)
subnode.appendChild(contentnode)
node.appendChild(subnode)
writefile=file(path+"/index.meta","w")
writefile.write(dom.toxml().encode('utf-8'))
writefile.close()
#change texttool tag
dom=xml.dom.minidom.parse(path+"/index.meta")
node=dom.getElementsByTagName('meta')[0] #getNode
try: #texttool existiert schon
subnode=node.getElementsByTagName('texttool')[0]
except: #wenn nicht Fehler ausgeben
return "ERROR:no presentation configured yet, user Web Front End to do so!"
try:
texttoolnodelist=subnode.getElementsByTagName('text')
if not len(texttoolnodelist)==0: #texttool tag existiert schon, dann löschen
subsubnode=subnode.removeChild(texttoolnodelist[0])
subsubnode.unlink()
except:
"""nothing"""
# text neu anlegen
textfoldernode=dom.createElement('text')
textfoldernodetext=dom.createTextNode(textpath+"/"+name)
textfoldernode.appendChild(textfoldernodetext)
subnode.appendChild(textfoldernode)
#index.meta ausgeben
writefile=file(path+"/index.meta","w")
writefile.write(dom.toxml().encode('utf-8'))
writefile.close()
#registrieren
return urllib.urlopen("http://nausikaa2.rz-berlin.mpg.de:86/cgi-bin/toc/admin/reg.cgi?path=%s"%path).readlines()
def TextExternalError(text):
firsts=text[0:10]
#print firsts
try:
match=re.search(r".*<?xml.*",firsts)
except:
return 1
return 0
def getNewTextPath(path):
i=1
while os.path.exists(path+"/fulltext%i"%i):
i+=1
os.mkdir(path+"/fulltext%i"%i)
os.chmod(path+"/fulltext%i"%i,0755)
return "fulltext%i"%i
def addImages(self,path):
"""Imagesfolder to the path"""
self.REQUEST.SESSION['existing_names']=['pageimg'] # to be done generate list of existing pageimages files
self.REQUEST.SESSION['path']=path
newtemplate=PageTemplateFile('Products/OSA_system/zpt/OSAS_addImages').__of__(self)
return newtemplate()
def addImages2(self):
self.image_folder_name=self.REQUEST['folder_name']
#print self.REQUEST['folder_name']
self.content_description=self.REQUEST['content_description']
#self.path=self.REQUEST.SESSION['path']
self.content_type='images'
addDirsToIndexMeta(self.REQUEST.SESSION['path'],self.image_folder_name,self.content_description,self.content_type)
self.REQUEST.SESSION['path']=re.search(r"/mpiwg(.*)",self.REQUEST.SESSION['path']).group(1)
newtemplate=PageTemplateFile('Products/OSA_system/zpt/OSAS_upload2').__of__(self)
return newtemplate()
def addDirsToIndexMeta(path,folder_name,content_description,content_type):
#f=file(path+"/index.meta",r)
dom=xml.dom.minidom.parse(path+"/index.meta")
node=dom.getElementsByTagName('resource')[0] #getNode
subnode=dom.createElement('dir')
namenode=dom.createElement('name')
namenodetext=dom.createTextNode(folder_name)
namenode.appendChild(namenodetext)
subnode.appendChild(namenode)
descriptionnode=dom.createElement('description')
descriptionnodetext=dom.createTextNode(content_description)
descriptionnode.appendChild(descriptionnodetext)
subnode.appendChild(descriptionnode)
contentnode=dom.createElement('content-type')
contentnodetext=dom.createTextNode(content_type)
contentnode.appendChild(contentnodetext)
subnode.appendChild(contentnode)
node.appendChild(subnode)
writefile=file(path+"/index.meta","w")
writefile.write(dom.toxml().encode('utf-8'))
writefile.close()
def readArchimedesXML(folder):
"""gib URL aus """
XML=urllib.urlopen("http://archimedes.mpiwg-berlin.mpg.de/cgi-bin/toc/toc.cgi?step=xmlcorpusmanifest").read()
#print XML
dom=xml.dom.minidom.parseString(XML)
items=dom.getElementsByTagName('item')
dict={}
for item in items:
#print item.attributes['dir'].value
try:
dict[item.attributes['dir'].value]=item.attributes['xml'].value
#print item.attributes['dir'].value,item.attributes['text'].value
except:
"""nothing"""
if dict.has_key(folder):
return dict[folder]
else:
return ""
def combineTextImage2(self,path):
"""erstellt bzw. ändert texttool meta tag"""
dom=xml.dom.minidom.parse(path+"/index.meta")
node=dom.getElementsByTagName('meta')[0] #getNode
subnodelist=node.getElementsByTagName('texttool')
if not len(subnodelist)==0: #texttool tag existiert schon, dann löschen
subnode=node.removeChild(subnodelist[0])
subnode.unlink()
subnode=dom.createElement('texttool') #neu erzeugen
presentfile=os.listdir(path+"/"+self.REQUEST['presentation'])[0]
displaynode=dom.createElement('display')
displaynodetext=dom.createTextNode('yes')
displaynode.appendChild(displaynodetext)
subnode.appendChild(displaynode)
if self.REQUEST.has_key('image'):
namenode=dom.createElement('image')
namenodetext=dom.createTextNode(self.REQUEST['image'])
namenode.appendChild(namenodetext)
subnode.appendChild(namenode)
if self.REQUEST.has_key('text'):
textfile=os.listdir(path+"/"+self.REQUEST['text'])[0]
textfoldernode=dom.createElement('text')
textfoldernodetext=dom.createTextNode(path+"/"+self.REQUEST['text']+"/"+textfile)
textfoldernode.appendChild(textfoldernodetext)
subnode.appendChild(textfoldernode)
if self.REQUEST.has_key('external'):#USE CVS instead of local text
textfoldernode=dom.createElement('text')
textfoldernodetext=dom.createTextNode(self.REQUEST.SESSION['externxml'])
textfoldernode.appendChild(textfoldernodetext)
subnode.appendChild(textfoldernode)
if self.REQUEST.has_key('pagebreak'):
pagebreaknode=dom.createElement('pagebreak')
pagebreaknodetext=dom.createTextNode(self.REQUEST['pagebreak'])
pagebreaknode.appendChild(pagebreaknodetext)
subnode.appendChild(pagebreaknode)
if self.REQUEST.has_key('presentation'):
presentationnode=dom.createElement('presentation')
presentationnodetext=dom.createTextNode(self.REQUEST['presentation']+"/"+presentfile)
presentationnode.appendChild(presentationnodetext)
subnode.appendChild(presentationnode)
if self.REQUEST.has_key('xslt'):
if not self.REQUEST['xslt']=="":
xsltnode=dom.createElement('xslt')
xsltnodetext=dom.createTextNode(self.REQUEST['xslt'])
xsltnode.appendChild(xsltnodetext)
subnode.appendChild(xsltnode)
if self.REQUEST.has_key('thumbtemplate'):
if not self.REQUEST['thumbtemplate']=="":
xsltnode=dom.createElement('thumbtemplate')
xsltnodetext=dom.createTextNode(self.REQUEST['thumbtemplate'])
xsltnode.appendChild(xsltnodetext)
subnode.appendChild(xsltnode)
if self.REQUEST.has_key('topbar'):
if not self.REQUEST['topbar']=="":
xsltnode=dom.createElement('toptemplate')
xsltnodetext=dom.createTextNode(self.REQUEST['topbar'])
xsltnode.appendChild(xsltnodetext)
subnode.appendChild(xsltnode)
if self.REQUEST.has_key('startpage'):
if not self.REQUEST['startpage']=="":
xsltnode=dom.createElement('startpage')
xsltnodetext=dom.createTextNode(self.REQUEST['startpage'])
xsltnode.appendChild(xsltnodetext)
subnode.appendChild(xsltnode)
if self.REQUEST.has_key('project'):
if not self.REQUEST['project']=="":
xsltnode=dom.createElement('project')
xsltnodetext=dom.createTextNode(self.REQUEST['project'])
xsltnode.appendChild(xsltnodetext)
subnode.appendChild(xsltnode)
node.appendChild(subnode)
try:
node2=node.getElementsByTagName('bib')[0]
subs=node2.getElementsByTagName('lang')
for sub in subs:
node2.removeChild(sub)
except:
"""nothing"""
try:
main=dom.getElementsByTagName('bib')[0]
node=dom.createElement('lang')
textnode=dom.createTextNode(self.REQUEST['lang'])
node.appendChild(textnode)
main.appendChild(node)
except:
try:
subs=dom.getElementsByTagName('lang')
main=dom.getElementsByTagName('resource')[0]
for sub in subs:
main.removeChild(sub)
except:
"""nothing"""
try:
main=dom.getElementsByTagName('resource')[0]
node=dom.createElement('lang')
textnode=dom.createTextNode(self.REQUEST['lang'])
#print "LANG:",self.REQUEST['lang']
node.appendChild(textnode)
main.appendChild(node)
except:
"""nothing"""
writefile=file(path+"/index.meta","w")
writefile.write(dom.toxml().encode('utf-8'))
writefile.close()
urllib.urlopen("http://nausikaa2.rz-berlin.mpg.de:86/cgi-bin/toc/admin/reg.cgi?path=%s"%path).readlines()
if self.REQUEST.has_key('image'): # falls bilder
os.popen("ssh nausikaa2.rz-berlin.mpg.de /usr/local/mpiwg/scripts/scaleomat.pl %s /mpiwg/temp/online/scaled/thumb 90 >> /tmp/sc.out &"% re.sub('/mpiwg/online/','',self.REQUEST['path']+"/"+self.REQUEST['image']))
else: # falls keine Bilder (bug in reg.cgi info file ersetzen)
f=file("/tmp/tmp_info.xml","w")
f.write(patchedInfoXML(self.REQUEST['path']))
f.close()
splitted=path.split("/")
fn=splitted[len(splitted)-1]
remotePath="archive@nausikaa2.rz-berlin.mpg.de:/usr/local/share/archimedes/web/docs/proj/echo/1/docs/"+fn+"/info.xml"
os.popen("scp /tmp/tmp_info.xml %s"%remotePath)
def patchedInfoXML(path):
dom=xml.dom.minidom.parse(path+"/index.meta")
ret="<info>\n"
ret+="<remotetext>%s</remotetext>\n"%archive.getText(dom.getElementsByTagName('text')[0].childNodes)
ret+="<pagebreak>%s</pagebreak>\n"%archive.getText(dom.getElementsByTagName('pagebreak')[0].childNodes)
ret+="<display>%s</display>\n"%archive.getText(dom.getElementsByTagName('display')[0].childNodes)
try:
ret+="<toptemplate>%s</toptemplate>\n"%archive.getText(dom.getElementsByTagName('toptemplate')[0].childNodes)
except:
"""not"""
try:
ret+="<thumbtemplate>%s</thumbtemplate>\n"%archive.getText(dom.getElementsByTagName('thumbtemplate')[0].childNodes)
except:
"""not"""
try:
ret+="<startpage>%s</startpage>\n"%archive.getText(dom.getElementsByTagName('startpage')[0].childNodes)
except:
"""not"""
ret+="<lang>%s</lang>\n"%archive.getText(dom.getElementsByTagName('lang')[0].childNodes)
try:
ret+="<author>%s</author>\n"%archive.getText(dom.getElementsByTagName('author')[0].childNodes)
except:
"""not"""
try:
ret+="<title>%s</title>\n"%archive.getText(dom.getElementsByTagName('title')[0].childNodes)
except:
"""not"""
ret+="</info>"
return ret
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>