File:  [Repository] / OSAS / OSA_system / OSAS_add.py
Revision 1.9: download - view: text, annotated - select for diffs - revision graph
Wed Jan 21 07:43:01 2004 UTC (20 years, 4 months ago) by dwinter
Branches: MAIN
CVS tags: HEAD
small changes

#BAUSTELLE


"""Methoden zum hinzufügen von Dokumenten ins Archiv"""
import archive
import os
from Products.PageTemplates.PageTemplateFile import PageTemplateFile
from Products.PageTemplates.PageTemplate import PageTemplate
import string
import urllib
import xml.dom.minidom

#referencetypes=['Book','Bic','Journal Article','Manuscript','jiji']

import re
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=['Book','Journal Article','Manuscript']

	newtemplate=PageTemplateFile('Products/OSA_system/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()
	return self.referencetypes



def getISO():
	try:
		f=file('/usr/local/mpiwg/Zope/lib/python/Products/OSA_system/iso639-1.inc','r').readlines()
		#f=file('OSA_system/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={'Book':['author','year','title','series editor','series title','series volume','number of pages','city','publisher','edition','number of volumes','translator','ISBN ISSN'],
'Journal Article':['author','year','title','journal','volume','issue','pages','alternate journal','call number'],
'Manuscript':['author','year','title','location','signature','pages','editorial remarks','description','keywords']}

	self.fields=self.bibdata[self.reftype]
	self.isolist=getISO()
        #listed=[ x for x in self.isolist.keys()]
	#print listed
        #sorted=listed.sort()
	#print sorted
	
	newtemplate=PageTemplateFile('Products/OSA_system/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_naming=metadata['author'][:5]+"_"+metadata['title'][:5]+"_"+metadata['year']
	self.vorschlag_naming=vorschlag_naming.decode('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/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']
	# netx has to be changed -> error if back button is used!!
	self.REQUEST.SESSION['path']=self.REQUEST.SESSION['path']+"/"+self.REQUEST['folder_name']


	self.REQUEST.SESSION['folder_name']=self.folder_name
	self.image_folder_name="pageimg"
	newtemplate=PageTemplateFile('Products/OSA_system/OSAS_upload').__of__(self)
	return newtemplate()
	
def add5(self):
	"""ADD INDEX.META"""
	newtemplate=PageTemplateFile('Products/OSA_system/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():
		self.metadataprint=self.metadataprint+"<"+tag+">"+self.metadata[tag]+"</"+tag+">\n"

	newtemplate=PageTemplateFile('Products/OSA_system/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,0644)
	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) 
		newtemplate2=PageTemplateFile('Products/OSA_system/OSAS_saved').__of__(self)
	
		
		newtemplate2.content_type="text/html"
		self.REQUEST.response.setHeader('Content-Type','text/html')
	

		return newtemplate2()


from time import localtime,strftime

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:
			author=archive.getText(dom.getElementsByTagName('Editor')[0].childNodes)
			
	title=archive.getText(dom.getElementsByTagName('title')[0].childNodes)
	try:
		date=archive.getText(dom.getElementsByTagName('year')[0].childNodes)
	except:
		try:
			date=archive.getText(dom.getElementsByTagName('Year')[0].childNodes)
		except:
			date=archive.getText(dom.getElementsByTagName('date')[0].childNodes)
	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/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()
	os.chmod(path+"/"+folder_name,0755)
	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):
	"""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/addText').__of__(self)
	return newtemplate()

def addText2(self):
	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/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/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 combineTextImage(self,path):
	"""gibt input formular zur erstellung des texttools meta tag aus"""
	files = os.listdir(path)
	
	texts=[]
	imagefolders=[]
	presentationfolders=[]

	splitted=path.split("/")
	externxml=readArchimedesXML(splitted[len(splitted)-1])
	
	for filename in files:
		#print "FN",filename
		if archive.isdigilib2(path+"/"+filename):
			imagefolders.append(filename)
			
		if archive.isFullText(path,filename):
			#print "HI"
			texts.append(filename)
		if archive.isPresentation(path,filename):
			presentationfolders.append(filename)
	
	dom=xml.dom.minidom.parse(path+"/index.meta")
	try:
		filelanguage=archive.getText(dom.getElementsByTagName('lang')[0].childNodes)
	except:
		filelanguage=""
	self.REQUEST.SESSION['isolist']=getISO()
	self.REQUEST.SESSION['path']=path
	self.REQUEST.SESSION['texts']=texts
	self.REQUEST.SESSION['imagefolders']=imagefolders
	self.REQUEST.SESSION['presentationfolders']=presentationfolders
	self.REQUEST.SESSION['filelanguage']=filelanguage
	self.REQUEST.SESSION['externxml']=externxml

	newtemplate=PageTemplateFile('Products/OSA_system/ImageandText').__of__(self)
	return newtemplate()
	


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)

	node.appendChild(subnode)
	
	try:
		node2=node.getElementsByTagName('bib')[0]
		subs=node2.getElementsByTagName('lang')
		for sub in subs:
			print "X",sub
			node2.removeChild(sub)
	except:
		"""nothing"""
	try:
		main=dom.getElementsByTagName('bib')[0]
		node=dom.createElement('lang')
		textnode=dom.createTextNode(self.REQUEST['lang'])
		print "LANG:",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()
	#return urllib.quote("http://nausikaa2.rz-berlin.mpg.de:86/cgi-bin/toc/admin/reg.cgi?path=%s"%path)
	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']))
	
	#return self.REQUEST.RESPONSE.redirect(self.REQUEST['URL2']+'?path='+self.REQUEST['path'])
	

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>