Annotation of cdli/cdli_files.py, revision 1.106
1.22 dwinter 1: """CDLI extensions of the filearchive"""
1.47 dwinter 2: from Products.versionedFile.extVersionedFile import *
1.1 dwinter 3: from Products.ZCatalog.CatalogPathAwareness import CatalogAware
4: import os.path
5: import os
1.3 dwinter 6: import urlparse
1.49 dwinter 7: import urllib
8: import cgi
1.4 dwinter 9: from OFS.OrderedFolder import OrderedFolder
10: from OFS.SimpleItem import SimpleItem
11: import time
1.12 dwinter 12: from OFS.Folder import manage_addFolder
13: import re
1.19 dwinter 14: from AccessControl import ClassSecurityInfo
15: from Acquisition import Implicit
1.39 dwinter 16: from Globals import Persistent
1.19 dwinter 17: from threading import Thread
18: from ZPublisher.HTTPRequest import HTTPRequest
19: from ZPublisher.HTTPResponse import HTTPResponse
20: from ZPublisher.BaseRequest import RequestContainer
1.20 dwinter 21: import threading
1.57 dwinter 22: import logging
1.58 dwinter 23: import transaction
1.61 dwinter 24: import copy
1.66 dwinter 25: import codecs
1.76 dwinter 26: import sys
1.83 dwinter 27: from BTrees.IOBTree import IOBTree
1.81 casties 28: import cdliSplitter
1.83 dwinter 29: from sets import Set
30: import md5
1.87 dwinter 31: from DownloadBasket import DownloadBasketFinallyThread
1.102 dwinter 32: from types import *
1.103 dwinter 33: import pickle
1.104 dwinter 34: import tempfile
35:
1.105 dwinter 36: from cdli_helpers import *
1.87 dwinter 37:
1.46 dwinter 38: class CDLIFileObject(CatalogAware,extVersionedFileObject):
1.1 dwinter 39: """CDLI file object"""
40:
41: meta_type="CDLI File Object"
1.25 dwinter 42: default_catalog='CDLIObjectsCatalog'
1.1 dwinter 43:
1.12 dwinter 44: security=ClassSecurityInfo()
45:
1.78 dwinter 46: security.declareProtected('manage','index_html')
1.81 casties 47:
48: security.declarePublic('view')
49: view = PageTemplateFile('zpt/viewCDLIFile.zpt', globals())
50:
51: security.declarePublic('editATF')
52: editATF = PageTemplateFile('zpt/editATFFile.zpt', globals())
53:
1.28 dwinter 54: def PrincipiaSearchSource(self):
55: """Return cataloguable key for ourselves."""
56: return str(self)
57:
1.89 dwinter 58: def setAuthor(self, author):
59: """change the author"""
60: self.author = author
61:
1.26 dwinter 62: def makeThisVersionCurrent_html(self):
1.85 dwinter 63: """form for mthis version current"""
1.26 dwinter 64:
65: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','makeThisVersionCurrent.zpt')).__of__(self)
66: return pt()
1.81 casties 67:
68: security.declarePublic('makeThisVersionCurrent')
1.27 dwinter 69: def makeThisVersionCurrent(self,comment,author,RESPONSE=None):
1.26 dwinter 70: """copy this version to current"""
71: parent=self.aq_parent
1.81 casties 72: parent.manage_addVersionedFileObject(id=None,vC=comment,author=author,file=self.getData(),RESPONSE=RESPONSE)
73: #newversion=parent.manage_addCDLIFileObject('',comment,author)
74: #newversion.manage_upload(self.getData())
1.27 dwinter 75:
1.81 casties 76: #if RESPONSE is not None:
77: # RESPONSE.redirect(self.aq_parent.absolute_url()+'/history')
1.27 dwinter 78:
1.26 dwinter 79: return True
80:
1.52 dwinter 81: def getFormattedData(self):
82: """fromat text"""
83: data=self.getData()
1.70 dwinter 84: # return re.sub("\s\#lem"," #lem",data) #remove return vor #lem
85: return re.sub("#lem"," #lem",data) #remove return vor #lem
1.52 dwinter 86:
1.1 dwinter 87:
1.40 dwinter 88: security.declarePublic('getPNumber')
89: def getPNumber(self):
1.46 dwinter 90: """get the pnumber"""
91: try:
1.49 dwinter 92: txt=re.match("&[Pp](\d*)\s*=([^\r\n]*)",self.getData()[0:])
1.40 dwinter 93: except:
1.49 dwinter 94: txt=self.getData()[0:]
1.40 dwinter 95:
96: return "ERROR"
97: try:
98: return "P"+txt.group(1)
99: except:
100: return "ERROR"
101:
1.12 dwinter 102: security.declarePublic('getDesignation')
103: def getDesignation(self):
104: """get the designation out of the file"""
1.16 dwinter 105: try:
1.46 dwinter 106: txt=re.match("&[Pp](\d*)\s*=([^\r\n]*)",self.getData()[0:])
1.13 dwinter 107: except:
1.46 dwinter 108: txt=self.getData()[0:]
1.16 dwinter 109:
110: return "ERROR"
1.12 dwinter 111: try:
112: return txt.group(2)
113: except:
114: return "ERROR"
1.81 casties 115:
1.12 dwinter 116:
1.1 dwinter 117: manage_addCDLIFileObjectForm=DTMLFile('dtml/fileAdd', globals(),Kind='CDLIFileObject',kind='CDLIFileObject', version='1')
118:
1.81 casties 119: def manage_addCDLIFileObject(self,id,vC='',author='', file='',title='',versionNumber=0,
120: precondition='', content_type='',
1.48 dwinter 121: from_tmp=False,REQUEST=None):
1.1 dwinter 122: """Add a new File object.
123: Creates a new File object 'id' with the contents of 'file'"""
1.48 dwinter 124:
1.1 dwinter 125: id=str(id)
126: title=str(title)
127: content_type=str(content_type)
128: precondition=str(precondition)
129:
130: id, title = cookId(id, title, file)
131:
132: self=self.this()
133:
134: # First, we create the file without data:
1.81 casties 135: self._setObject(id, CDLIFileObject(id,title,versionNumber=versionNumber,versionComment=vC,time=time.localtime(),author=author))
1.80 casties 136: fob = self._getOb(id)
1.45 dwinter 137:
1.1 dwinter 138: # Now we "upload" the data. By doing this in two steps, we
139: # can use a database trick to make the upload more efficient.
1.48 dwinter 140:
141: if file and not from_tmp:
1.80 casties 142: fob.manage_upload(file)
1.48 dwinter 143: elif file and from_tmp:
1.81 casties 144: fob.manage_file_upload(file) # manage_upload_from_tmp doesn't exist in ExtFile2
145: # fob.manage_upload_from_tmp(file) # manage_upload_from_tmp doesn't exist in ExtFile2
1.1 dwinter 146: if content_type:
1.80 casties 147: fob.content_type=content_type
1.1 dwinter 148:
1.81 casties 149: #logging.debug("manage_add: lastversion=%s"%self.getData())
150: logging.debug("reindex1: %s in %s"%(repr(self),repr(self.default_catalog)))
1.45 dwinter 151: self.reindex_object()
1.81 casties 152: #logging.debug("manage_add: fob_data=%s"%fob.getData())
1.80 casties 153: logging.debug("reindex2: %s in %s"%(repr(fob), repr(fob.default_catalog)))
1.81 casties 154: fob.index_object()
1.49 dwinter 155:
1.85 dwinter 156: self.CDLIRoot.updateOrAddToFileBTree(ob)
1.1 dwinter 157: if REQUEST is not None:
158: REQUEST['RESPONSE'].redirect(self.absolute_url()+'/manage_main')
1.3 dwinter 159:
1.80 casties 160:
1.46 dwinter 161: class CDLIFile(extVersionedFile,CatalogAware):
1.3 dwinter 162: """CDLI file"""
163:
1.77 dwinter 164: security=ClassSecurityInfo()
1.3 dwinter 165: meta_type="CDLI file"
1.81 casties 166: content_meta_type = ["CDLI File Object"]
167:
1.3 dwinter 168: default_catalog='CDLICatalog'
1.81 casties 169:
1.78 dwinter 170: security.declareProtected('manage','index_html')
1.81 casties 171:
1.51 dwinter 172: def getLastVersionData(self):
173: """get last version data"""
1.81 casties 174: return self.getData()
1.51 dwinter 175:
1.52 dwinter 176: def getLastVersionFormattedData(self):
177: """get last version data"""
1.81 casties 178: return self.getContentObject().getFormattedData()
179:
180: def getTextId(self):
181: """returns P-number of text"""
182: # assuming that its the beginning of the title
183: return self.title[:7]
1.52 dwinter 184:
1.51 dwinter 185: #security.declarePublic('history')
1.26 dwinter 186: def history(self):
187: """history"""
188:
189: ext=self.ZopeFind(self.aq_parent,obj_ids=["history_template.html"])
190: if ext:
191: return getattr(self,ext[0][1].getId())()
192:
193: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','versionHistory')).__of__(self)
194: return pt()
195:
196:
1.44 dwinter 197: def getBasketFromId(self,basketid, context=None):
198: """get basket from id"""
199:
200: if not context:
201: context=self
202:
203: for basket in self.ZopeFind(context,obj_metatypes=["CDLIBasket"]):
204: if basket[0]==basketid:
205: return basket[1]
206: else:
207: None
208:
1.12 dwinter 209:
1.8 dwinter 210: def isContainedInBaskets(self,context=None):
211: """check is this file is part of any basket
212: @param context: (optional) necessessary if CDLIBasketCatalog is not an (inherited) attribute of self, context.CDLIBasketCatalog
213: has to exist.
214: """
215:
216: if not context:
217: context=self
1.12 dwinter 218:
219: ret=[]
220: for x in context.CDLIBasketCatalog.search({'getFileNamesInLastVersion':self.getId()}):
221: #if the basket x is deleted it seemes to be that x is sometimes still in the Catalog, why?
222: try:
223: ret.append(x.getObject())
224: except:
225: pass
226: return ret
227: #return [x.getObject() for x in context.CDLIBasketCatalog.search({'getFileNamesInLastVersion':self.getId()})]
1.5 dwinter 228:
229:
1.81 casties 230: def _newContentObject(self, id, title='', versionNumber=0, versionComment=None, time=None, author=None):
231: """factory for content objects. to be overridden in derived classes."""
232: logging.debug("_newContentObject(CDLI)")
233: return CDLIFileObject(id,title,versionNumber=versionNumber,versionComment=versionComment,time=time,author=author)
234:
235:
1.5 dwinter 236: def addCDLIFileObjectForm(self):
237: """add a new version"""
238:
239: if str(self.REQUEST['AUTHENTICATED_USER']) in ["Anonymous User"]:
240: return "please login first"
241: if (self.lockedBy==self.REQUEST['AUTHENTICATED_USER']) or (self.lockedBy==''):
242: out=DTMLFile('dtml/fileAdd', globals(),Kind='CDLIFileObject',kind='CDLIFileObject',version=self.getVersion()).__of__(self)
243: return out()
244: else:
245: return "Sorry file is locked by somebody else"
246:
1.37 dwinter 247: def manage_addCDLIFileObject(self,id,vC,author,
248: file='',title='',
249: precondition='',
250: content_type='',
251: changeName='no',newName='',
1.48 dwinter 252: come_from=None,
253: from_tmp=False,RESPONSE=None):
1.3 dwinter 254: """add"""
1.48 dwinter 255:
1.3 dwinter 256: try: #TODO: der ganze vC unsinn muss ueberarbeitet werden
257: vC=self.REQUEST['vC']
258: except:
259: pass
260:
1.81 casties 261: ob = self.addContentObject(id, vC, author, file, title, changeName=changeName, newName=newName, from_tmp=from_tmp,
262: precondition=precondition, content_type=content_type)
1.3 dwinter 263:
1.22 dwinter 264: try:
1.81 casties 265: #FIXME: wozu ist das gut?
266: self.REQUEST.SESSION['objID_parent']=self.getId()
1.22 dwinter 267: except:
1.81 casties 268: pass
1.37 dwinter 269:
1.85 dwinter 270: #self.cdliRoot.updateOrAddToFileBTree(self)# now update the object in the cache
271:
272:
1.3 dwinter 273: if RESPONSE:
1.81 casties 274: if ob.getSize()==0:
275: self.REQUEST.SESSION['objID']=ob.getId()
1.3 dwinter 276: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','errorUploadFile')).__of__(self)
277: return pt()
278: else:
1.37 dwinter 279: if come_from and (come_from!=""):
1.81 casties 280: RESPONSE.redirect(come_from+"?change="+self.getId())
1.37 dwinter 281: else:
282: RESPONSE.redirect(self.REQUEST['URL2']+'?uploaded=%s'%self.title)
1.3 dwinter 283: else:
1.81 casties 284: return ob
1.3 dwinter 285:
286:
287: def manage_addCDLIFileForm(self):
288: """interface for adding the OSAS_root"""
289: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addCDLIFile.zpt')).__of__(self)
290: return pt()
291:
292: def manage_addCDLIFile(self,id,title,lockedBy, author=None, RESPONSE=None):
293: """add the OSAS_root"""
294: newObj=CDLIFile(id,title,lockedBy,author)
1.22 dwinter 295:
296: tryToggle=True
297: tryCount=0
298:
299: self._setObject(id,newObj)
1.45 dwinter 300: getattr(self,id).reindex_object()
1.22 dwinter 301:
1.3 dwinter 302: if RESPONSE is not None:
303: RESPONSE.redirect('manage_main')
304:
1.81 casties 305:
1.69 dwinter 306: def checkUTF8(data):
307: """check utf 8"""
308: try:
309: data.encode('utf-8')
310: return True
311: except:
312: return False
313:
1.1 dwinter 314:
1.45 dwinter 315: def checkFile(filename,data,folder):
316: """check the files"""
317: # first check the file name
318: fn=filename.split(".") # no extension
1.48 dwinter 319:
1.45 dwinter 320: if not fn[0][0]=="P":
1.46 dwinter 321: return False,"P missing in the filename"
1.45 dwinter 322: elif len(fn[0])!=7:
1.46 dwinter 323: return False,"P number has not the right length 6"
1.69 dwinter 324: elif not checkUTF8(data):
325: return False,"not utf-8"
1.45 dwinter 326: else:
1.69 dwinter 327: return True,""
328:
1.45 dwinter 329:
1.25 dwinter 330: def splitatf(fh,dir=None,ext=None):
1.2 dwinter 331: """split it"""
1.4 dwinter 332: ret=None
1.2 dwinter 333: nf=None
1.25 dwinter 334: i=0
1.49 dwinter 335:
1.81 casties 336: #ROC: why split \n first and then \r???
1.73 dwinter 337: if (type(fh) is StringType) or (type(fh) is UnicodeType):
338: iter=fh.split("\n")
339: else:
340: iter=fh.readlines()
341:
342: for lineTmp in iter:
1.66 dwinter 343: lineTmp=lineTmp.replace(codecs.BOM_UTF8,'') # make sure that all BOM are removed..
344: for line in lineTmp.split("\r"):
345: #logging.log("Deal with: %s"%line)
346: if ext:
347: i+=1
348: if (i%100)==0:
349: ext.result+="."
350: if i==10000:
351: i=0
352: ext.result+="<br>"
353: #check if basket name is in the first line
354: if line.find("#atf basket")>=0: #old convention
355: ret=line.replace('#atf basket ','')
356: ret=ret.split('_')[0]
357: elif line.find("#basket:")>=0: #new convention
358: ret=line.replace('#basket: ','')
359: ret=ret.split('_')[0]
360:
361: else:
362: if (len(line.lstrip())>0) and (line.lstrip()[0]=="&"): #newfile
363: if nf:
364: nf.close() #close last file
365:
1.49 dwinter 366:
1.66 dwinter 367: filename=line[1:].split("=")[0].rstrip()+".atf"
368: if dir:
369: filename=os.path.join(dir,filename)
370: nf=file(filename,"w")
371: logging.info("open %s"%filename)
372: if nf:
373: nf.write(line.replace("\n","")+"\n")
374:
375: try:
376: nf.close()
1.61 dwinter 377: except:
1.66 dwinter 378: pass
1.73 dwinter 379:
380: if not((type(fh) is StringType) or (type(fh) is UnicodeType)):
381: fh.close()
1.5 dwinter 382: return ret,len(os.listdir(dir))
1.4 dwinter 383:
1.19 dwinter 384:
1.46 dwinter 385: class CDLIFileFolder(extVersionedFileFolder):
1.4 dwinter 386: """CDLI File Folder"""
1.1 dwinter 387:
1.19 dwinter 388: security=ClassSecurityInfo()
1.1 dwinter 389: meta_type="CDLI Folder"
1.81 casties 390: file_meta_type=['CDLI file']
391: folder_meta_type=['CDLI Folder']
392:
393: file_catalog='CDLICatalog'
394:
1.45 dwinter 395: #downloadCounter=0 # counts how many download for all files currently run, be mehr als 5 wird verweigert.
1.24 dwinter 396: tmpStore2={}
1.81 casties 397:
398: def _newVersionedFile(self, id, title='', lockedBy=None, author=None):
399: """factory for versioned files. to be overridden in derived classes."""
400: logging.debug("_newVersionedFile(CDLI)")
401: return CDLIFile(id, title, lockedBy=lockedBy, author=author)
402:
1.19 dwinter 403: def setTemp(self,name,value):
404: """set tmp"""
405:
406: setattr(self,name,value)
407:
1.81 casties 408: deleteFileForm = PageTemplateFile("zpt/doDeleteFile", globals())
1.19 dwinter 409:
1.81 casties 410: def delete(self,ids,REQUEST=None):
411: """delete these files"""
1.12 dwinter 412: if type(ids) is not ListType:
413: ids=[ids]
1.81 casties 414:
415: self.manage_delObjects(ids)
1.12 dwinter 416:
1.81 casties 417: if REQUEST is not None:
418: return self.index_html()
419:
420:
1.4 dwinter 421: def getVersionNumbersFromIds(self,ids):
422: """get the numbers of the current versions of documents described by their ids"""
423:
424: ret=[]
425: searchStr=" OR ".join(ids)
426:
1.9 dwinter 427: founds=self.CDLICatalog.search({'title':searchStr})
1.4 dwinter 428:
429: for found in founds:
1.81 casties 430: lastVersion=found.getObject().getContentObject()
1.4 dwinter 431: ret.append((found.getId,lastVersion))
432:
433: return ret
434:
1.67 dwinter 435: def getFile(self,fn):
436: """get the content of the file fn"""
1.81 casties 437: logging.debug("getFile: %s"%repr(fn))
438: if not self.hasObject(fn):
439: # search deeper
440: founds=getattr(self, self.file_catalog).search({'textid':fn})
441: if founds:
442: obj=founds[0].getObject().getContentObject()
443: else:
444: return ""
1.67 dwinter 445: else:
1.81 casties 446: obj = self[fn].getContentObject()
1.68 dwinter 447:
1.81 casties 448: return obj.getData()[0:]
449:
1.67 dwinter 450:
1.14 dwinter 451: def checkCatalog(self,fn):
452: """check if fn is in the catalog"""
1.19 dwinter 453: #TODO add checkCatalog
1.14 dwinter 454:
1.19 dwinter 455:
1.45 dwinter 456: def findObjectsFromListWithVersion(self,list,author=None):
1.26 dwinter 457: """find objects from a list with versions
458: @param list: list of tuples (cdliFile,version)
459: """
460: #self.REQUEST.SESSION['fileIds']=list#store fieldIds in session for further usage
461: #self.REQUEST.SESSION['searchList']=self.REQUEST.SESSION['fileIds']
462:
463: pt=getattr(self,'filelistVersioned.html')
464:
1.45 dwinter 465: return pt(search=list,author=author)
1.26 dwinter 466:
467:
1.67 dwinter 468: def getAllPNumbers(self):
469: """get a list of all files (resp their p-numbers) stored"""
470:
471: ret=[x.getId for x in self.CDLICatalog()]
472:
473: return ret
474:
1.83 dwinter 475: def expandFile(self,fileId,fileTree):
476: """wildcard in fileID suche alle Treffer"""
477: founds=self.CDLICatalog({'title':fileId})
478: for found in founds:
479: fileTree.add(found.getId)
480: logging.debug("ADDD:"+found.getId)
481:
1.85 dwinter 482: def findObjectsFromList(self,enterList=None,display=False,start=None,upload=None,list=None,basketName=None,numberOfObjects=None,RESPONSE=None,REQUEST=None,returnHash=False,hash=None):
1.1 dwinter 483: """findObjectsFromList (, TAB oder LINE separated)"""
1.15 dwinter 484:
1.83 dwinter 485: logging.debug("start: findObjectsFromList")
1.85 dwinter 486: #logging.debug("start: findObjectsFromList"+repr(list))
487:
488:
1.6 dwinter 489: if upload: # list from file upload
490: txt=upload.read()
1.35 dwinter 491:
492: if enterList:
493: txt=enterList
494:
495: if upload or enterList:
1.6 dwinter 496: txt=txt.replace(",","\n")
497: txt=txt.replace("\t","\n")
1.12 dwinter 498: txt=txt.replace("\r","\n")
1.6 dwinter 499: idsTmp=txt.split("\n")
500: ids=[]
501: for id in idsTmp: # make sure that no empty lines
502: idTmp=id.lstrip().rstrip()
503: if len(idTmp)>0:
504:
505: ids.append(idTmp)
506:
507: #self.REQUEST.SESSION['ids']=" OR ".join(ids)
1.12 dwinter 508:
1.6 dwinter 509: pt=getattr(self,'filelist.html')
1.7 dwinter 510: self.REQUEST.SESSION['searchList']=ids
1.6 dwinter 511: return pt(search=ids)
1.7 dwinter 512:
1.6 dwinter 513: if basketName:
1.7 dwinter 514: #TODO: get rid of one of these..
515:
1.6 dwinter 516: pt=getattr(self,'filelist.html')
1.7 dwinter 517: return pt(basketName=basketName,numberOfObjects=numberOfObjects)
1.6 dwinter 518:
1.102 dwinter 519:
520: result =self.CDLICache.retrieve(hash)
521: if result:
522: logging.debug("give result from storage2")
523: return hash,result
524:
1.15 dwinter 525: if list is not None: # got already a list
1.83 dwinter 526:
527: logging.debug(" ----List version")
1.6 dwinter 528: ret=[]
1.83 dwinter 529: fileTree=Set()
530:
1.6 dwinter 531: for fileId in list:
1.83 dwinter 532:
533: if fileId.find("*")>-1: #check for wildcards
534: self.expandFile(fileId,fileTree)
535:
1.35 dwinter 536: elif len(fileId.split("."))==1:
1.6 dwinter 537: fileId=fileId+".atf"
1.83 dwinter 538: fileTree.add(fileId)
539: #logging.debug(" -----:"+fileId)
540: #ret+=self.CDLICatalog({'title':fileId})
541: #x =self.getFileObject(fileId)
542: #if x is not None:
543: # ret.append(x)
1.35 dwinter 544:
1.83 dwinter 545:
546:
547: ids = fileTree & self.v_file_ids
1.85 dwinter 548: #self.REQUEST.SESSION['fileIds']=ids#store fieldIds in session for further usage
549: l=makelist(fileTree)[0:]
1.93 dwinter 550: #logging.debug("l-list:"+repr(l))
1.85 dwinter 551: self.REQUEST.SESSION['fileIds']=l#store fieldIds in session for further usage
552: self.REQUEST.SESSION['searchList']=l
553: #self.REQUEST.SESSION['searchList']=['P000001.atf']
554:
1.83 dwinter 555:
1.85 dwinter 556: hash = md5.new(repr(makelist(fileTree))).hexdigest() # erzeuge hash als identification
557: self.REQUEST.SESSION['hash']=hash
558: #TODO: do I need garbage collection for v_tmpStore ?
1.83 dwinter 559:
1.84 dwinter 560: #logging.debug("Hash:"+repr(hash))
1.85 dwinter 561: #
562: # if hasattr(self.cdliRoot,'v_tmpStore') and self.cdliRoot.v_tmpStore.has_key(hash):
563: # logging.debug("asking for storage")
564: # res=self.cdliRoot.v_tmpStore[hash]
565: # if res:
566: # if returnHash == True:
567: # return hash,res
568: # return res
1.83 dwinter 569:
1.7 dwinter 570: #TODO: get rid of one of these..
1.83 dwinter 571: #ids=[x.getObject().getId() for x in ret]
572: ret=[(self.getFileObject(x),self.getFileObjectLastVersion(x)) for x in ids]
1.84 dwinter 573:
574: #self.REQUEST.SESSION['fileIds']=ids#store fieldIds in session for further usage
575: #self.REQUEST.SESSION['searchList']=self.REQUEST.SESSION['fileIds']
1.85 dwinter 576:
1.25 dwinter 577: if display:
578: pt=getattr(self,'filelist.html')
579:
580: return pt(search=ids)
1.83 dwinter 581: else:
582: #self.REQUEST.SESSION['hash'] = ret # store in session
1.102 dwinter 583:
1.83 dwinter 584: #logging.debug("HHHHHHNEU:"+repr(self.makelist(ids)))
1.84 dwinter 585: #logging.debug("HHHHHHNEU:"+repr(hash))
1.102 dwinter 586: self.CDLICache.store(hash,ret)
587:
1.85 dwinter 588: if returnHash == True:
589: return hash,ret
1.25 dwinter 590: return ret
591:
592:
1.1 dwinter 593:
1.7 dwinter 594: if start:
595: RESPONSE.redirect("filelist.html?start:int="+str(start))
1.85 dwinter 596:
1.19 dwinter 597: security.declareProtected('Manage','createAllFilesAsSingleFile')
1.1 dwinter 598: def createAllFilesAsSingleFile(self,RESPONSE=None):
599: """download all files"""
600:
601: def sortF(x,y):
602: return cmp(x[0],y[0])
603:
1.81 casties 604: catalog=getattr(self,self.file_catalog)
1.1 dwinter 605: #tf,tfilename=mkstemp()
1.66 dwinter 606: if not hasattr(self.temp_folder,'downloadCounter'):
607: self.temp_folder.downloadCounter=0
1.49 dwinter 608:
609: if getattr(self.temp_folder,'downloadCounter',0) > 5:
1.46 dwinter 610: return """I am sorry, currently the server has to many requests for downloads, please come back later!"""
1.45 dwinter 611:
1.46 dwinter 612: self.temp_folder.downloadCounter+=1
613: self._p_changed=1
1.58 dwinter 614: transaction.get().commit()
1.45 dwinter 615:
1.1 dwinter 616: list=[(x.getId,x) for x in catalog()]
617: list.sort(sortF)
1.46 dwinter 618:
1.45 dwinter 619:
1.1 dwinter 620:
621: RESPONSE.setHeader("Content-Disposition","""attachement; filename=%s"""%"all.atf")
622: RESPONSE.setHeader("Content-Type","application/octet-stream")
1.46 dwinter 623: tmp=""
1.1 dwinter 624: for l in list:
625: obj=l[1].getObject()
626:
627: if obj.meta_type=="CDLI file":
628:
629: #os.write(tf,obj.getLastVersion().data)
630: if RESPONSE:
1.81 casties 631: RESPONSE.write(obj.getData()[0:])
1.71 dwinter 632: RESPONSE.write("\n")
1.46 dwinter 633: self.temp_folder.downloadCounter-=1
634: self._p_changed=1
1.58 dwinter 635: transaction.get().commit()
1.1 dwinter 636: #os.close(tf)
637: #RESPONSE.redirect(self.absolute_url()+"/downloadFile?fn="%tfilename)
638: return True
639:
640: def downloadFile(self,fn):
641: """download fn - not used yet"""
642: self.REQUEST.RESPONSE.setHeader("Content-Disposition","""attachement; filename=%s"""%self.getLastVersion().getId())
643: self.REQUEST.RESPONSE.setHeader("Content-Type","application/octet-stream")
644: self.REQUEST.RESPONSE.write(file(fn).read())
645:
646:
647:
648: def hasParent(self):
649: """returns true falls subfolder"""
650:
1.81 casties 651: if self.aq_parent.meta_type in self.folder_meta_type:
1.1 dwinter 652: return True
653: else:
654: return False
655:
656: def getFolders(self):
657: """get all subfolders"""
658: ret=[]
1.81 casties 659: folders=self.ZopeFind(self,obj_metatypes=self.folder_meta_type)
1.1 dwinter 660: for folder in folders:
661: ret.append((folder[1],
1.81 casties 662: len(self.ZopeFind(folder[1],obj_metatypes=self.folder_meta_type)),
663: len(self.ZopeFind(folder[1],obj_metatypes=self.file_meta_type))
1.1 dwinter 664: ))
665: return ret
666:
667:
1.77 dwinter 668: security.declareProtected('manage','index_html')
1.1 dwinter 669: def index_html(self):
670: """main"""
671: ext=self.ZopeFind(self,obj_ids=["index.html"])
672: if ext:
673: return ext[0][1]()
674:
675: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','CDLIFileFolderMain')).__of__(self)
676: return pt()
677:
1.22 dwinter 678:
679: manage_addCDLIFileFolderForm=DTMLFile('dtml/folderAdd', globals())
680:
681:
682: def manage_addCDLIFileFolder(self, id, title='',
683: createPublic=0,
684: createUserF=0,
685: REQUEST=None):
686: """Add a new Folder object with id *id*.
687:
688: If the 'createPublic' and 'createUserF' parameters are set to any true
689: value, an 'index_html' and a 'UserFolder' objects are created respectively
690: in the new folder.
691: """
692: ob=CDLIFileFolder()
693: ob.id=str(id)
694: ob.title=title
695: self._setObject(id, ob)
696: ob=self._getOb(id)
697:
698: checkPermission=getSecurityManager().checkPermission
699:
700: if createUserF:
701: if not checkPermission('Add User Folders', ob):
702: raise Unauthorized, (
703: 'You are not authorized to add User Folders.'
704: )
705: ob.manage_addUserFolder()
706:
707:
708: if REQUEST is not None:
709: return self.manage_main(self, REQUEST, update_menu=1)
710:
711: class CDLIRoot(Folder):
712: """main folder for cdli"""
713:
714: meta_type="CDLIRoot"
1.81 casties 715: downloadCounterBaskets=0 # counts the current basket downloads if counter > 10 no downloads are possible
716:
717: file_catalog = 'CDLICatalog'
718:
719: # word splitter for search
720: splitter = {'words':cdliSplitter.wordSplitter(),
721: 'graphemes':cdliSplitter.graphemeSplitter()}
722:
1.51 dwinter 723:
1.102 dwinter 724: def unicodify(self,txt):
725: return unicodify(txt)
726: def invalidateOldCacheVersion(self):
727: """loescht die alte Version des Cache"""
728: del self.v_tmpStore
729: return "done"
730:
1.86 dwinter 731: def viewATF(self,id,RESPONSE):
732: """view an Object"""
733: ob = self.CDLICatalog({'title':id})
734: logging.debug(ob[0].getObject().getLastVersion().absolute_url()+"/view")
735: if len(ob)>0:
736: RESPONSE.redirect(ob[0].getObject().getLastVersion().absolute_url()+"/view")
737: return "not found"
738:
739: def history(self,id,RESPONSE):
740: """view an Object"""
741: ob = self.CDLICatalog({'title':id})
742: if len(ob)>0:
743: RESPONSE.redirect(ob[0].absolute_url+"/history")
744: return "not found"
745:
746:
747: def downloadLocked(self,id,RESPONSE):
748: """view an Object"""
749: ob = self.CDLICatalog({'title':id})
750: if len(ob)>0:
751: RESPONSE.redirect(ob[0].absolute_url+"/downloadLocked")
752: return "not found"
753:
754: def download(self,id,RESPONSE):
755: """view an Object"""
756: ob = self.CDLICatalog({'title':id})
757: if len(ob)>0:
758: RESPONSE.redirect(ob[0].getLastVersion().absolute_url())
759: return "not found"
760: def addCDLIFileObjectForm(self,id,RESPONSE):
761: """view an Object"""
762: ob = self.CDLICatalog({'title':id})
763: if len(ob)>0:
764: RESPONSE.redirect(ob[0].absolute_url+"/addCDLIFileObjectForm")
765: return "not found"
766:
767: def addVersionedFileObjectForm(self,id,RESPONSE):
768: """view an Object"""
769: ob = self.CDLICatalog({'title':id})
770: if len(ob)>0:
771: RESPONSE.redirect(ob[0].absolute_url+"/addVersionedFileObjectForm")
772: return "not found"
773:
774: def unlock(self,id,RESPONSE):
775: """view an Object"""
776: ob = self.CDLICatalog({'title':id})
777: if len(ob)>0:
778: RESPONSE.redirect(ob[0].absolute_url+"/unlock")
779: return "not found"
780:
1.83 dwinter 781: def getFileObject(self,fileId):
1.85 dwinter 782: """get an object"""
1.83 dwinter 783: x=self.v_files.get(fileId)
784: #logging.debug(x)
785: return x
786:
787: def getFileObjectLastVersion(self,fileId):
1.85 dwinter 788: """get an object"""
1.83 dwinter 789: x=self.v_files_lastVersion.get(fileId)
1.95 dwinter 790: #logging.debug("lastVersion: "+repr(x))
1.83 dwinter 791: return x
792:
1.85 dwinter 793: def showFileIds(self):
794: """showIds"""
795: return self.v_file_ids
796:
1.83 dwinter 797: def generateFileBTree(self):
798: """erzeuge einen Btree aus allen Files"""
799: self.v_files = OOBTree()
800: self.v_files_lastVersion = OOBTree()
801: self.v_file_ids = Set()
802:
803: for x in self.CDLICatalog.searchResults():
804:
805: self.v_files.update({x.getId:x.getObject()})
806: self.v_files_lastVersion.update({x.getId:x.getObject().getLastVersion()})
807: self.v_file_ids.add(x.getId)
808: logging.debug("add:"+x.getId+"XXX"+repr(x.getObject()))
809:
1.85 dwinter 810: return True
811:
812:
813: def updateOrAddToFileBTree(self,obj):
814: """update a BTree"""
815: self.v_files.update({obj.getId():obj})
816: self.v_files_lastVersion.update({obj.getId():obj.getLastVersion()})
817:
818: self.v_file_ids.add(obj.getId())
819: logging.debug("update:"+obj.getId()+"XXX"+repr(obj))
820:
821: def deleteFromBTree(self,objId):
822: """delete an obj"""
823: self.v_files.pop(objId)
824: self.v_files_lastVersion.pop(objId)
825: self.v_file_ids.remove(objId)
826:
827:
828:
1.73 dwinter 829: def deleteFiles(self,ids):
1.81 casties 830: """delete files"""
1.73 dwinter 831: for id in ids:
832: founds=self.CDLICatalog.search({'title':id.split(".")[0]})
833: if founds:
1.81 casties 834: logging.debug("deleting %s"%founds)
1.73 dwinter 835: folder=founds[0].getObject().aq_parent #get the parent folder of the object
1.81 casties 836: logging.debug("deleting from %s"%folder)
837: cut=folder.delete([founds[0].getId]) #cut it out
838:
1.73 dwinter 839:
840:
1.81 casties 841: def searchText(self, query, index='graphemes'):
842: """searches query in the fulltext index and returns a list of file ids/P-numbers"""
843: # see also: http://www.plope.com/Books/2_7Edition/SearchingZCatalog.stx#2-13
844: logging.debug("searchtext for '%s' in index %s"%(query,index))
845: #import Products.ZCTextIndex.QueryParser
846: #qp = QueryParser.QueryParser()
847: #logging.debug()
848: idxQuery = {index:{'query':query}}
849: idx = getattr(self, self.file_catalog)
850: # do search
851: resultset = idx.search(query_request=idxQuery,sort_index='textid')
852: # put only the P-Number in the result
853: results = [res.getId[:7] for res in resultset]
854: logging.debug("searchtext: found %d texts"%len(results))
855: return results
856:
857:
858: def getFile(self, pnum):
859: """get the translit file with the given pnum"""
860: f = getattr(self, self.file_catalog).search({'textid':pnum})
861: if not f:
862: return ""
1.71 dwinter 863:
1.81 casties 864: return f[0].getObject().getData()
865:
1.57 dwinter 866:
1.74 dwinter 867: def showFile(self,fileId,wholePage=False):
1.71 dwinter 868: """show a file
869: @param fileId: P-Number of the document to be displayed
870: """
1.81 casties 871: f=getattr(self, self.file_catalog).search({'textid':fileId})
1.51 dwinter 872: if not f:
873: return ""
874:
1.74 dwinter 875: if wholePage:
1.81 casties 876: logging.debug("show whole page")
877: return f[0].getObject().getContentObject().view()
1.74 dwinter 878: else:
879: return f[0].getObject().getLastVersionFormattedData()
1.55 dwinter 880:
1.56 dwinter 881:
1.81 casties 882: def showWordInFile(self,fileId,word,indexName='graphemes',regExp=False,):
883: """get lines with word from FileId"""
884: logging.debug("showwordinfile word='%s' index=%s file=%s"%(word,indexName,fileId))
1.56 dwinter 885:
1.81 casties 886: file = formatAtfFullLineNum(self.getFile(fileId))
1.66 dwinter 887: ret=[]
1.71 dwinter 888:
1.81 casties 889: # add whitespace before and whitespace and line-end to splitter bounds expressions
890: bounds = self.splitter[indexName].bounds
891: splitexp = "(%s|\s)(%%s)(%s|\s|\Z)"%(bounds,bounds)
892: # clean word expression
893: # TODO: this should use QueryParser itself
894: # take out double quotes
895: word = word.replace('"','')
896: # take out ignorable signs
897: ignorable = self.splitter[indexName].ignorex
898: word = ignorable.sub('', word)
899: # compile into regexp objects and escape parens
900: wordlist = [re.compile(splitexp%re.escape(w)) for w in word.split(' ')]
901:
902: for line in file.splitlines():
1.71 dwinter 903: for word in wordlist:
1.81 casties 904: #logging.debug("showwordinfile: searching for %s in %s"%(word.pattern,ignoreable.sub('',line)))
905: if word.search(ignorable.sub('',line)):
906: line = formatAtfLineHtml(line)
907: ret.append(line)
908: break
909:
1.66 dwinter 910: return ret
1.56 dwinter 911:
1.81 casties 912:
913: def showWordInFiles(self,fileIds,word,indexName='graphemes',regExp=False):
914: """
915: get lines with word from all ids in list FileIds.
916: returns dict with id:lines pairs.
917: """
918: logging.debug("showwordinfiles word='%s' index=%s file=%s"%(word,indexName,fileIds))
1.51 dwinter 919:
1.81 casties 920: return dict([(id,self.showWordInFile(id, word, indexName, regExp)) for id in fileIds])
921:
922:
923: def tagWordInFile(self,fileId,word,indexName='graphemes',regExp=False):
924: """get text with word highlighted from FileId"""
925: logging.debug("tagwordinfile word='%s' index=%s file=%s"%(word,indexName,fileId))
926:
927: file=self.getFile(fileId)
928: tagStart=u'<span class="found">'
929: tagEnd=u'</span>'
930: tagStr=tagStart + u'%%s' + tagEnd
1.66 dwinter 931: ret=[]
1.71 dwinter 932:
1.81 casties 933: # add whitespace to splitter bounds expressions and compile into regexp object
934: bounds = self.splitter[indexName].bounds
935: wordsplit = re.compile("(%s|\s)"%bounds)
936: # clean word expression
937: # TODO: this should use QueryParser itself
938: word = word.replace('"','') # take out double quotes
939: # take out ignoreable signs
940: ignorable = self.splitter[indexName].ignorex
941: word = ignorable.sub('', word)
942: # split search terms by blanks
943: words = word.split(' ')
944: # split search terms again (for grapheme search with words)
945: splitwords = dict(((w,self.splitter[indexName].process([w])) for w in words))
1.71 dwinter 946:
1.81 casties 947: for line in file.splitlines():
1.79 casties 948: line = unicodify(line)
1.81 casties 949: # ignore lemma and other lines
950: if line.lstrip().startswith('#lem:'):
951: continue
952: # ignore p-num line
953: if line.startswith('&P'):
954: continue
955: # ignore version lines
956: if line.startswith('#version'):
957: continue
958: # ignore atf type lines
959: if line.startswith('#atf:'):
960: continue
961:
962: # first scan
963: hitwords = []
964: for w in words:
965: if ignorable.sub('',line).find(w) > -1:
966: # word is in line
967: # append split word for grapheme search with words
968: hitwords.extend(splitwords[w])
969: #hitwords.extend(wordsplit.split(w))
970:
971: # examine hits closer
972: if hitwords:
973: # split line into words
974: parts = wordsplit.split(line)
975: line = ""
976: for p in parts:
977: #logging.debug("tagwordinfile: searching for %s in %s"%(p,hitwords))
978: # reassemble line
979: if ignorable.sub('', p) in hitwords:
980: #logging.debug("tagwordinfile: found %s in %s"%(p,hitwords))
981: # this part was found
982: line += tagStart + formatAtfHtml(p) + tagEnd
983: else:
984: line += formatAtfHtml(p)
985:
986: else:
987: # no hits
988: line = formatAtfHtml(line)
989:
990: ret.append(line)
991:
992: return u'<br>\n'.join(ret)
993:
1.66 dwinter 994:
995:
1.81 casties 996: def tagWordInFiles(self,fileIds,word,indexName='graphemes',regExp=False):
997: """
998: get texts with highlighted word from all ids in list FileIds.
999: returns dict with id:text pairs.
1000: """
1001: logging.debug("tagwordinfiles word='%s' index=%s file=%s"%(word,indexName,fileIds))
1002: return dict([(id,self.tagWordInFile(id, word, indexName, regExp)) for id in fileIds])
1003:
1.56 dwinter 1004:
1.82 casties 1005: def getFileVersionList(self, pnum):
1006: """get the version history as a list for the translit file with the given pnum"""
1007: f = getattr(self, self.file_catalog).search({'textid':pnum})
1008: if not f:
1009: return []
1010:
1011: return f[0].getObject().getVersionList()
1012:
1013:
1.37 dwinter 1014: def URLquote(self,str):
1015: """quote url"""
1016: return urllib.quote(str)
1017:
1018: def URLunquote(self,str):
1019: """unquote url"""
1020: return urllib.unquote(str)
1021:
1.58 dwinter 1022: def URLquote_plus(self,str):
1023: """quote url"""
1024: return urllib.quote_plus(str)
1025:
1026: def URLunquote_plus(self,str):
1027: """unquote url"""
1028: return urllib.unquote_plus(str)
1029:
1.106 ! dwinter 1030: def changeUserForPObjectFromFile(self,user,fname):
! 1031: """aendere user fuer alle p in fiele"""
! 1032: pns = file(fname,"r")
! 1033: for p in pns.readline():
! 1034: f = getattr(self, self.file_catalog).search({'textid':pnum})
! 1035: pObj=f.getObject()
! 1036: lv=pObj.getContentObject()
! 1037: logging.info("author:"+lv.author)
! 1038:
1.37 dwinter 1039:
1.106 ! dwinter 1040:
! 1041:
! 1042:
1.105 dwinter 1043: def forceunlock(self,REQUEST=None,user=None):
1.26 dwinter 1044: "break all locks"
1045: ret=[]
1.105 dwinter 1046:
1.26 dwinter 1047: for f in self.ZopeFind(self,obj_metatypes="CDLI file",search_sub=1):
1.105 dwinter 1048: un=f[1].forceunlock(user=user)
1049: logging.info("check:"+f[0])
1.26 dwinter 1050: if un and un !="":
1051: ret.append((f[0],un))
1.46 dwinter 1052:
1.105 dwinter 1053: if REQUEST is not None:
1054: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','breakLockResponse.zpt')).__of__(self)
1055:
1056: return pt(ret=ret)
1057:
1.61 dwinter 1058: return ret
1.71 dwinter 1059:
1.61 dwinter 1060:
1.105 dwinter 1061: def getLockedFiles(self,REQUEST=None,user=None):
1062: """hole alle gesperrten files"""
1063: ret={}
1064:
1065: for f in self.ZopeFind(self,obj_metatypes="CDLI file",search_sub=1):
1066: lb = f[1].lockedBy
1067: add=False
1068: if (lb is not None) and (lb!=""):
1069:
1070: if user is None:
1071: add=True
1072: else:
1073: if str(lb)==user:
1074: add=True
1075: if add==True:
1076: if not ret.has_key(lb):
1077: ret[lb]=[]
1078: ret[lb].append(f[0])
1079:
1080:
1081: if REQUEST is not None:
1082: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','showlockResponse.zpt')).__of__(self)
1083:
1084: return pt(ret=ret)
1085:
1086: return ret
1087:
1.26 dwinter 1088: def getChangesByAuthor(self,author,n=100):
1.25 dwinter 1089: """getChangesByAuthor"""
1.26 dwinter 1090: zcat=self.CDLIObjectsCatalog
1091: res=zcat({'lastEditor':author,
1.25 dwinter 1092: 'sort_on':'getTime',
1093: 'sort_order':'descending',
1094: 'sort_limit':n})[:n ]
1.26 dwinter 1095:
1096: return res
1097:
1098: def getChangesByAuthor_html(self,author,n=100):
1099: """html output for changes by author"""
1100: tmp={}
1101: list=[]
1102: for x in self.getChangesByAuthor(author):
1103: nr=x.getObject().getVersionNumber()
1104: id=x.getObject().aq_parent.getId()
1105: #hinzufuegen, wenn Version neuer als die
1106: if tmp.get(id,(0,0))[1] < nr:
1107: tmp[id]=(x.getObject().aq_parent,nr)
1108:
1109:
1.45 dwinter 1110: return self.cdli_main.findObjectsFromListWithVersion(list=tmp.values(),author=author)
1.26 dwinter 1111:
1.25 dwinter 1112: def getLastChanges(self,n=100):
1113: """get the last n changes"""
1114: n=int(n)
1115: zcat=self.CDLICatalog
1116: return zcat({'sort_on':'getLastChangeDate',
1117: 'sort_order':'descending',
1118: 'sort_limit':n})[:n ]
1119:
1120:
1121: def getLastChanges_html(self,n=100):
1122: """get the last n changes"""
1123: list = [x.getId for x in self.getLastChanges(n)]
1124: return self.cdli_main.findObjectsFromList(list=list,display=True)
1125:
1.24 dwinter 1126: def refreshTxt(self,txt="",threadName=None):
1.22 dwinter 1127: """txt fuer refresh"""
1128:
1.24 dwinter 1129: return """ 2;url=%s?repeat=%s """%(self.absolute_url()+txt,threadName)
1.22 dwinter 1130:
1.87 dwinter 1131: def refreshTxtBasket(self,txt="",threadName=None):
1132: """txt fuer refresh"""
1133:
1134: return """ 2;url=%s?repeat=%s """%(txt,threadName)
1135:
1.22 dwinter 1136:
1.24 dwinter 1137: def getResult(self,threadName=None):
1.22 dwinter 1138: """result of thread"""
1139: try:
1.24 dwinter 1140: return self._v_uploadATF[threadName].getResult()
1.22 dwinter 1141: except:
1142: return "One moment, please"
1143:
1.24 dwinter 1144:
1145: def checkThreads(self):
1146: """check threads"""
1.42 dwinter 1147: ret="<html><body>"
1148: for thread in threading.enumerate():
1.45 dwinter 1149: ret+="<p>%s (%s): %s</p>"%(repr(thread),thread.getName(),thread.isAlive())
1.42 dwinter 1150:
1151: return ret
1152:
1153:
1.73 dwinter 1154: def uploadATFRPC(self,data,username):
1155: """upload an atffile via xml-rpc"""
1156: uploader=uploadATFThread()
1157:
1158: #generate an random id for the upload object
1159: from random import randint
1160: if (not self.REQUEST.SESSION.get('idTmp',None)):
1161:
1162: idTmp=str(randint(0,1000000000))
1163: self.REQUEST.SESSION['idTmp']=idTmp
1164: else:
1165: idTmp=self.REQUEST.SESSION.get('idTmp',None)
1166:
1167:
1168: uploader.set(data,0,username,idTmp)
1169:
1170: stObj=uploader.run()
1171:
1172: processor=uploadATFfinallyThread()
1173:
1174: basketname=stObj.returnValue['basketNameFromFile']
1175:
1176: processor.set("uploadchanged",basketname=basketname,SESSION=stObj.returnValue,username=username,serverport=self.REQUEST['SERVER_PORT'])
1177:
1178: processor.run()
1179:
1180:
1181: return generateXMLReturn(stObj.returnValue)
1182:
1.22 dwinter 1183: def uploadATF(self,repeat=None,upload=None,basketId=0,RESPONSE=None):
1.69 dwinter 1184: """upload an atf file / basket file"""
1.22 dwinter 1185: #self._v_uploadATF.returnValue=None
1.71 dwinter 1186:
1187: #generate an random id for the upload thread
1.60 dwinter 1188: from random import randint
1.61 dwinter 1189: if (not self.REQUEST.SESSION.get('idTmp',None)):
1.22 dwinter 1190:
1.60 dwinter 1191: idTmp=str(randint(0,1000000000))
1192: self.REQUEST.SESSION['idTmp']=idTmp
1193: else:
1194: idTmp=self.REQUEST.SESSION.get('idTmp',None)
1195:
1.71 dwinter 1196:
1.22 dwinter 1197: threadName=repeat
1198: if not threadName or threadName=="":
1.71 dwinter 1199: #new thread not called from the waiting page
1.22 dwinter 1200: tmpVar=False
1.24 dwinter 1201:
1.22 dwinter 1202: thread=uploadATFThread()
1.24 dwinter 1203: threadName=thread.getName()[0:]
1.36 dwinter 1204: if (not hasattr(self,'_v_uploadATF')):
1.24 dwinter 1205: self._v_uploadATF={}
1206:
1207: self._v_uploadATF[threadName]=thread
1.22 dwinter 1208: #self._xmltrans.start()
1209: #thread=Thread(target=self._v_uploadATF)
1.60 dwinter 1210: logging.info("set thread. extern")
1211: self._v_uploadATF[threadName].set(upload,basketId,self.REQUEST['AUTHENTICATED_USER'],idTmp,serverport=self.REQUEST['SERVER_PORT'])
1.22 dwinter 1212: #thread.start()
1.60 dwinter 1213: logging.info("start thread. extern")
1.24 dwinter 1214: self._v_uploadATF[threadName].start()
1.22 dwinter 1215:
1216:
1.24 dwinter 1217: self.threadName=self._v_uploadATF[threadName].getName()[0:]
1.22 dwinter 1218: wait_template=self.aq_parent.ZopeFind(self.aq_parent,obj_ids=['wait_template'])
1219:
1220: if wait_template:
1221: return wait_template[0][1]()
1222: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','uploadATFWait.zpt')).__of__(self)
1.24 dwinter 1223: return pt(txt='/uploadATF',threadName=threadName)
1.22 dwinter 1224: #_v_xmltrans.run()
1225:
1226: else:
1227: #recover thread, if lost
1.36 dwinter 1228: if (not hasattr(self,'_v_uploadATF')):
1.24 dwinter 1229: self._v_uploadATF={}
1230: if not self._v_uploadATF.get(threadName,None):
1.22 dwinter 1231: for thread in threading.enumerate():
1232: if threadName == thread.getName():
1.24 dwinter 1233: self._v_uploadATF[threadName]=thread
1234:
1.60 dwinter 1235: if self._v_uploadATF.get(threadName,None) and (not self._v_uploadATF[threadName].returnValue):
1.22 dwinter 1236:
1237:
1238: wait_template=self.aq_parent.ZopeFind(self.aq_parent,obj_ids=['wait_template'])
1239: if wait_template:
1240: return wait_template[0][1]()
1241:
1242: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','uploadATFWait.zpt')).__of__(self)
1243:
1.24 dwinter 1244: return pt(txt='/uploadATF',threadName=threadName)
1.22 dwinter 1245:
1246: else:
1.60 dwinter 1247: tmp=getattr(self.temp_folder,idTmp).returnValue
1.71 dwinter 1248:
1.22 dwinter 1249: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','uploadCheck.zpt')).__of__(self)
1.39 dwinter 1250:
1.47 dwinter 1251: return pt(changed=tmp['changed'],lockerrors=tmp['lockerrors'],errors=tmp['errors'],dir=tmp['dir'],newPs=tmp['newPs'],basketLen=tmp['basketLen'],numberOfFiles=tmp['numberOfFiles'],
1.22 dwinter 1252: basketNameFromId=tmp['basketNameFromId'],basketNameFromFile=tmp['basketNameFromFile'],basketId=tmp['basketId'])
1.30 dwinter 1253:
1254: def redoUpload(self,threadName):
1255: """redo the upload"""
1256: tmp=self.cdli_main.tmpStore2[threadName]
1257: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','uploadCheck.zpt')).__of__(self)
1.45 dwinter 1258: return pt(changed=tmp['changed'],lockerrors=tmp['lockerrors'],errors=tmp['errors'],dir=tmp['dir'],newPs=tmp['newPs'],basketLen=tmp['basketLen'],numberOfFiles=tmp['numberOfFiles'],
1.30 dwinter 1259: basketNameFromId=tmp['basketNameFromId'],basketNameFromFile=tmp['basketNameFromFile'],basketId=tmp['basketId'])
1260:
1.22 dwinter 1261: def uploadATFfinally(self,procedure='',comment="",basketname='',unlock=None,repeat=None,RESPONSE=None):
1262: """nowupload the files"""
1263:
1264:
1265:
1266: threadName=repeat
1267: if not threadName or threadName=="":
1.24 dwinter 1268: thread=uploadATFfinallyThread()
1269: threadName=thread.getName()[0:]
1.36 dwinter 1270:
1.35 dwinter 1271: if (not hasattr(self,'_v_uploadATF')):
1.46 dwinter 1272: self._v_uploadATF={}
1.36 dwinter 1273:
1.43 dwinter 1274:
1.24 dwinter 1275: self._v_uploadATF[threadName]=thread
1.22 dwinter 1276:
1.60 dwinter 1277: idTmp=self.REQUEST.SESSION['idTmp']
1278: stObj=getattr(self.temp_folder,idTmp)
1279: self._v_uploadATF[threadName].set(procedure,comment=comment,basketname=basketname,unlock=unlock,SESSION=stObj.returnValue,username=self.REQUEST['AUTHENTICATED_USER'],serverport=self.REQUEST['SERVER_PORT'])
1.22 dwinter 1280:
1.24 dwinter 1281: self._v_uploadATF[threadName].start()
1.22 dwinter 1282:
1283:
1.24 dwinter 1284:
1.22 dwinter 1285: wait_template=self.aq_parent.ZopeFind(self.aq_parent,obj_ids=['wait_template'])
1286:
1287: if wait_template:
1288: return wait_template[0][1]()
1289: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','uploadATFWait.zpt')).__of__(self)
1290:
1.24 dwinter 1291: return pt(txt='/uploadATFfinally',threadName=threadName)
1.22 dwinter 1292: #_v_xmltrans.run()
1293:
1294: else:
1295: #recover thread, if lost
1296: if not hasattr(self,'_v_uploadATF'):
1.24 dwinter 1297: self._v_uploadATF={}
1298: if not self._v_uploadATF.get(threadName,None):
1.22 dwinter 1299: for thread in threading.enumerate():
1300: if threadName == thread.getName():
1.24 dwinter 1301: self._v_uploadATF[threadName]=thread
1.22 dwinter 1302:
1.24 dwinter 1303: if self._v_uploadATF.get(threadName,None) and (self._v_uploadATF[threadName] is not None) and (not self._v_uploadATF[threadName].end) :
1.22 dwinter 1304:
1305: wait_template=self.aq_parent.ZopeFind(self.aq_parent,obj_ids=['wait_template'])
1306: if wait_template:
1307: return wait_template[0][1]()
1308:
1309: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','uploadATFWait.zpt')).__of__(self)
1.24 dwinter 1310: return pt(txt='/uploadATFfinally',threadName=threadName)
1.22 dwinter 1311: else:
1.85 dwinter 1312:
1313:
1314: idTmp=self.REQUEST.SESSION['idTmp']
1315: stObj=getattr(self.temp_folder,idTmp)
1.60 dwinter 1316: self.REQUEST.SESSION['idTmp']=None
1.85 dwinter 1317:
1318: #update changed
1319: logging.debug("dir:"+repr(stObj.returnValue['changed']))
1320: for x in stObj.returnValue['changed']:
1321: ob=self.CDLICatalog.search({'title':x[0]})
1.104 dwinter 1322: try:
1323: self.cdliRoot.updateOrAddToFileBTree(ob[0].getObject())
1324: except:
1325: logging.error("uploadATFfinally - cannot update Object %s Error: %s %s"%(ob[1],sys.exc_info()[0],sys.exc_info()[1]))
1.22 dwinter 1326: if RESPONSE is not None:
1327: RESPONSE.redirect(self.absolute_url())
1328:
1.49 dwinter 1329: def importFiles(self,comment="",author="" ,folderName="/Users/dwinter/atf", files=None,ext=None):
1.1 dwinter 1330: """import files"""
1.81 casties 1331: logging.debug("importFiles folderName=%s files=%s ext=%s"%(folderName,files,ext))
1.22 dwinter 1332: root=self.cdli_main
1.49 dwinter 1333: count=0
1.3 dwinter 1334: if not files:
1335: files=os.listdir(folderName)
1336:
1.1 dwinter 1337: for f in files:
1338: folder=f[0:3]
1339: f2=f[0:5]
1.85 dwinter 1340:
1341: #check if main folder PXX already exists
1.22 dwinter 1342: obj=self.ZopeFind(root,obj_ids=[folder])
1.81 casties 1343: logging.debug("importFiles: folder=%s f2=%s obj=%s"%(folder,f2,obj))
1.19 dwinter 1344: if ext:
1.65 dwinter 1345: ext.result="<p>adding: %s </p>"%f+ext.result
1.81 casties 1346:
1.85 dwinter 1347:
1348: if not obj: # if not create it
1.22 dwinter 1349: manage_addCDLIFileFolder(root,folder,folder)
1350: fobj=getattr(root,folder)
1.58 dwinter 1351: #transaction.get().commit()
1.81 casties 1352:
1.1 dwinter 1353: else:
1354: fobj=obj[0][1]
1355:
1.85 dwinter 1356: #check IF PYYYYY already exist
1.1 dwinter 1357: obj2=fobj.ZopeFind(fobj,obj_ids=[f2])
1.81 casties 1358: logging.debug("importFiles: fobj=%s obj2=%s"%(fobj,obj2))
1.1 dwinter 1359:
1.85 dwinter 1360: if not obj2:# if not create it
1.1 dwinter 1361: manage_addCDLIFileFolder(fobj,f2,f2)
1362: fobj2=getattr(fobj,f2)
1363:
1364: else:
1365: fobj2=obj2[0][1]
1366:
1.85 dwinter 1367: # not add the file
1.48 dwinter 1368: file2=os.path.join(folderName,f)
1.1 dwinter 1369: id=f
1.81 casties 1370: logging.debug("importFiles: addCDLIFile fobj2=%s, f=%s file2=%s"%(fobj2,repr(f),repr(file2)))
1371: fobj2.addFile(vC='',file=file(file2),author=author,newName=f)
1.66 dwinter 1372: count+=1
1.85 dwinter 1373:
1374: #now add the file to the storage
1375: ob = getattr(fobj2,f)
1376: self.cdliRoot.updateOrAddToFileBTree(ob)
1377:
1.81 casties 1378: if count%100==0:
1379: logging.debug("importfiles: committing")
1.66 dwinter 1380: transaction.get().commit()
1.81 casties 1381:
1382: transaction.get().commit()
1.3 dwinter 1383: return "ok"
1.22 dwinter 1384:
1385:
1386: manage_addCDLIRootForm=DTMLFile('dtml/rootAdd', globals())
1.1 dwinter 1387:
1388:
1.22 dwinter 1389: def manage_addCDLIRoot(self, id, title='',
1.1 dwinter 1390: createPublic=0,
1391: createUserF=0,
1392: REQUEST=None):
1393: """Add a new Folder object with id *id*.
1394:
1395: If the 'createPublic' and 'createUserF' parameters are set to any true
1396: value, an 'index_html' and a 'UserFolder' objects are created respectively
1397: in the new folder.
1398: """
1.22 dwinter 1399: ob=CDLIRoot()
1.1 dwinter 1400: ob.id=str(id)
1401: ob.title=title
1.61 dwinter 1402: try:
1.66 dwinter 1403: self._setObject(id, ob)
1.61 dwinter 1404: except:
1.66 dwinter 1405: pass
1.1 dwinter 1406: ob=self._getOb(id)
1407:
1408: checkPermission=getSecurityManager().checkPermission
1409:
1410: if createUserF:
1411: if not checkPermission('Add User Folders', ob):
1412: raise Unauthorized, (
1413: 'You are not authorized to add User Folders.'
1414: )
1415: ob.manage_addUserFolder()
1416:
1417:
1418: if REQUEST is not None:
1.22 dwinter 1419: return self.manage_main(self, REQUEST, update_menu=1)
1420:
1.105 dwinter 1421:
1422: import cdli_basket
1423:
1424:
1425: # Die folgenden Klassen sollte nicht mehr aus diesem Paket benutzt werden, sondern direkt aus
1426: # cdli_basket importiert werden.
1427: class uploadATFfinallyThread(cdli_basket.uploadATFfinallyThread):
1428: """depricates"""
1429: pass
1430:
1431: class tmpStore(cdli_basket.tmpStore):
1432: """depricated"""
1433: pass
1434:
1435: class uploadATFThread(cdli_basket.uploadATFThread):
1436: """depricated"""
1437: pass
1438:
1439: class CDLIBasketContainer(cdli_basket.CDLIBasketContainer):
1440: """depricated"""
1441: pass
1442:
1443: class CDLIBasket(cdli_basket.CDLIBasket):
1444: """depricated"""
1445: pass
1446:
1447: class CDLIBasketVersion(cdli_basket.CDLIBasketVersion):
1448: """depricated"""
1449: pass
1450:
1451: class BasketContent(cdli_basket.BasketContent):
1452: """depricated"""
1453: pass
1454:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>