1: """CDLI extensions of the filearchive"""
2: from Products.versionedFile.versionedFile import *
3: from Products.ZCatalog.CatalogPathAwareness import CatalogAware
4: from tempfile import mkstemp,mkdtemp
5: import os.path
6: import os
7: from types import *
8: import urlparse
9: from OFS.OrderedFolder import OrderedFolder
10: from OFS.SimpleItem import SimpleItem
11: import time
12:
13:
14:
15: class Basket_old(Folder):
16: """shopping basket - alte fassung """
17:
18: meta_type="Basket"
19: _v_stack={}
20:
21: def getObjUrl(self,objId):
22: """getUrl"""
23: founds=self.CDLICatalog.search({'path':objId})
24: if len(founds)>0:
25: return founds[0].getObject().absolute_url()
26:
27: else: #assume version number
28: splitted=objId.split("_")
29: founds=self.CDLICatalog.search({'path':splitted[1]})
30: return founds[0].getObject().absolute_url()+'/'+objId
31:
32: def storeAllLink(self,results):
33: """erzeuge link zum speicher aller results"""
34: nr=self.REQUEST['_ZopeId']
35:
36: if results:
37: self._v_stack[nr]=[x.getObject().getId() for x in results]
38:
39: return self.absolute_url()+"/storeAll?id="+nr
40:
41: def storeAll(self,id):
42: """store all"""
43: try:
44: results=self._v_stack[id]
45: except:
46: #TODO: write expired page
47: return "expired"
48:
49: return self.storeInBasketForm(results)
50:
51: def storeInBasketForm(self,ids):
52: """ store an object form"""
53:
54: if type(ids) is not ListType:
55: ids=[ids]
56: self.REQUEST.SESSION['ids']=ids[0:]
57:
58: self.REQUEST.SESSION['BACKLINK']=self.REQUEST['HTTP_REFERER']
59:
60: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','storeBasketObject.zpt')).__of__(self)
61: return pt()
62:
63: def storeInBasket(self,username,ids=None,RESPONSE=None,REQUEST=None):
64: """store it"""
65:
66: if not ids:
67: ids=REQUEST.SESSION['ids']
68:
69: self.REQUEST.SESSION['basketUser']=username
70:
71: baskets=self.ZopeFind(self,obj_ids=[username])
72: if len(baskets)>0:
73: basket=baskets[0][1]
74: else:
75: manage_addBasketObject(self,username)
76: basket=self._getOb(username)
77:
78:
79: basket.addObjects(ids)
80: back=self.REQUEST.SESSION.get('BACKLINK', None)
81:
82: if RESPONSE:
83: RESPONSE.redirect(back)
84:
85:
86:
87: def showBasket(self,user=None,set=None,RESPONSE=None):
88: """show the basket"""
89:
90: if user:
91: self.REQUEST.SESSION['basketUser']=user
92:
93: if not user and not set:
94: user=self.REQUEST.SESSION.get('basketUser',None)
95:
96: if not user:
97: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','orizeBasketUser.zpt')).__of__(self)
98: return pt()
99: else:
100: baskets=self.ZopeFind(self,obj_ids=[user])
101:
102:
103: if len(baskets)>0:
104: RESPONSE.redirect(baskets[0][1].absolute_url())
105: return True
106: else:
107: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','emptyBasket.zpt')).__of__(self)
108: return pt()
109:
110:
111: def manage_addBasket_oldForm(self):
112: """add the basket form"""
113: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addBasket.zpt')).__of__(self)
114: return pt()
115:
116: def manage_addBasket_old(self,id,title,RESPONSE=None):
117: """add the basket"""
118: ob=Basket()
119:
120: ob.id=str(id)
121: ob.title=title
122: self._setObject(id, ob)
123: ob=self._getOb(id)
124:
125: if RESPONSE is not None:
126: RESPONSE.redirect('manage_main')
127:
128:
129: class BasketObject_old(Folder):
130: """Basket Object - alte fassung"""
131:
132: meta_type="basketObject"
133: def __init__(self):
134: """init basket object"""
135: self.contents=[]
136:
137: def numberOfItems(self):
138: """return anzahl der elemente im basket"""
139: return len(self.contents)
140:
141: def addObjects(self,ids):
142: """addObjects"""
143:
144: for id in ids:
145: founds=self.CDLICatalog.search({'path':id})
146: for found in founds:
147: if found.getObject() not in self.contents:
148: tm=self.contents[0:]
149: tm.append(found.getObject())
150: self.contents=tm[0:]
151:
152: return True
153:
154: def index_html(self):
155: """view the basket"""
156: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','basketObject_index_html.zpt')).__of__(self)
157: return pt()
158:
159: def deleteObjects(self,ids,RESPONSE=None):
160: """delete objects"""
161: list = self.contents[0:]
162: for content in list:
163:
164: if content.getId() in ids:
165: self.contents.remove(content)
166:
167:
168: if RESPONSE:
169: RESPONSE.redirect(self.absolute_url())
170:
171:
172: def unlockTest(self):
173: """unlock all files of the testuser for debuggin"""
174: for object in self.contents:
175:
176: if str(object.lockedBy)=="test":
177: object.lockedBy=""
178:
179: def downloadObjectsAsOneFile(self,lock=None,procedure=None,REQUEST=None):
180: """download all selected files in one file"""
181:
182: ret=""
183: lockedObjects={}
184:
185:
186: if lock:
187:
188: if str(self.REQUEST['AUTHENTICATED_USER'])=='Anonymous User':
189:
190: return "please login first"
191:
192: #check if a locked object exist in the basket.
193: lockedObjects={}
194: for object in self.contents:
195:
196: if not object.lockedBy=="":
197: lockedObjects[object.title]=repr(object.lockedBy)
198:
199:
200: keys=lockedObjects.keys()
201:
202:
203: if len(keys)>0 and (not procedure):
204: self.REQUEST.SESSION['lockedObjects']=lockedObjects
205: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','lockedObjects.zpt')).__of__(self)
206: return pt()
207:
208: elif not procedure: #keine fails gesperrt dann alle donwloaden
209: procedure="downloadAll"
210:
211: print procedure
212: for object in self.contents:
213:
214: if (procedure=="downloadAll") or (object.lockedBy=='') or (object.lockedBy==self.REQUEST['AUTHENTICATED_USER']):
215: ret+=object.getLastVersion().data
216:
217: if lock and object.lockedBy=='':
218: object.lockedBy=self.REQUEST['AUTHENTICATED_USER']
219:
220:
221: self.REQUEST.RESPONSE.setHeader("Content-Disposition","""attachement; filename="basket_%s.atf" """%self.getId())
222: self.REQUEST.RESPONSE.setHeader("Content-Type","application/octet-stream")
223: length=len(ret)
224: self.REQUEST.RESPONSE.setHeader("Content-Length",length)
225: self.REQUEST.RESPONSE.write(ret)
226:
227:
228: def manage_addBasket_oldObjectForm(self):
229: """add form"""
230: pass
231:
232: def manage_addBasket_oldObject(self,id,title='',RESPONSE=None):
233: """add"""
234:
235: ob=BasketObject()
236:
237: ob.id=str(id)
238: ob.title=title
239: self._setObject(id, ob)
240: ob=self._getOb(id)
241:
242: if RESPONSE is not None:
243: RESPONSE.redirect('manage_main')
244:
245:
246: class CDLIBasketContainer(OrderedFolder):
247: """contains the baskets"""
248:
249:
250:
251: meta_type="CDLIBasketContainer"
252:
253:
254: def uploadBasket_html(self,basketId='0'):
255: """upload an atf file, html form"""
256: basketId=str(basketId)
257: if not basketId=='0':
258: basketName=getattr(self.basketContainer,basketId).title
259: else:
260: basketName=""
261:
262: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','uploadBasket_html.zpt')).__of__(self)
263: return pt(basketId=basketId,basketName=basketName)
264:
265:
266:
267: def index_html(self):
268: """stanadard ansicht"""
269: ext=self.ZopeFind(self,obj_ids=["index.html"])
270: if ext:
271: return ext[0][1]()
272:
273: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','BasketContainerMain')).__of__(self)
274: return pt()
275:
276: def getStorageFolderRoot(self):
277: """root des storage folders"""
278: return self.cdli_main
279:
280: def __init__(self,id,title):
281: """ init basket container"""
282: self.id=id
283: self.title=title
284:
285:
286: def getBaskets(self,sortField='title'):
287: """get all baskets files"""
288:
289: def sortName(x,y):
290: return cmp(x[1].title.lower(),y[1].title.lower())
291:
292: def sortDate(x,y):
293: return cmp(y[1].getLastVersion().getTime(),x[1].getLastVersion().getTime())
294:
295:
296: def sortComment(x,y):
297:
298:
299:
300: try:
301: xc=getattr(x[1],'comment','ZZZZZZZZZZZZZ').lower()
302: except:
303: xc='ZZZZZZZZZZZZZ'.lower()
304: try:
305: yc=getattr(y[1],'comment','ZZZZZZZZZZZZZ').lower()
306: except:
307: yc='ZZZZZZZZZZZZZ'.lower()
308:
309:
310: if (xc=='') or (xc=='ZZZZZZZZZZZZZ'.lower()):
311:
312: try:
313: xc=x[1].getLastVersion().getComment().lower()
314: except:
315: xc='ZZZZZZZZZZZZZ'.lower()
316:
317: if (yc=='') or (yc=='ZZZZZZZZZZZZZ'.lower()):
318: try:
319: yc=y[1].getLastVersion().getComment().lower()
320: except:
321: yc='ZZZZZZZZZZZZZ'.lower()
322:
323:
324: return cmp(xc,yc)
325:
326: def sortAuthor(x,y):
327:
328: return cmp(x[1].getLastVersion().getUser().lower(),y[1].getLastVersion().getUser().lower())
329:
330: baskets=self.ZopeFind(self,obj_metatypes=['CDLIBasket'])
331:
332:
333: if sortField=='title':
334: baskets.sort(sortName)
335: elif sortField=='date':
336: baskets.sort(sortDate)
337: elif sortField=='author':
338: baskets.sort(sortAuthor)
339: elif sortField=='comment':
340: baskets.sort(sortComment)
341:
342: return baskets
343:
344:
345:
346: def getNewId(self):
347: """createIds"""
348: last=getattr(self,'last',0)
349: last +=1
350: while len(self.ZopeFind(self,obj_ids=[str(last)]))>0:
351: last+=1
352:
353: self.last=last
354: return last
355:
356: def setActiveBasket(self,basketId):
357: """store active basketId in a cookie"""
358: self.REQUEST.RESPONSE.setCookie("CDLIActiveBasket",basketId,path="/")
359:
360: def getActiveBasket(self):
361: """get active basket from cookie"""
362:
363: id= self.REQUEST.cookies.get('CDLIActiveBasket',None)
364: obj=getattr(self,id,None)
365: return obj
366: def getActualUserName(self):
367: """get name of the actualuser"""
368: return str(self.REQUEST['AUTHENTICATED_USER'])
369:
370:
371: def addBasket(self,newBasketName):
372: """add a new basket"""
373:
374: ob=manage_addCDLIBasket(self,newBasketName)
375: return ob
376:
377: def storeInBasket(self,ids,submit,newBasketName=None,RESPONSE=None,REQUEST=None):
378: """store it"""
379:
380: if type(ids) is not ListType:
381: ids=[ids]
382:
383: if submit=="store in new basket":
384: basketRet=self.addBasket(newBasketName)
385: self.setActiveBasket(basketRet.getId())
386: basket=getattr(self,basketRet.getId())
387: elif submit=="store in active basket":
388: basket=self.getActiveBasket()
389:
390: basket.addObjects(ids)
391: back=self.REQUEST['HTTP_REFERER']
392:
393: if RESPONSE:
394: RESPONSE.redirect(back)
395:
396:
397: def manage_addCDLIBasketContainerForm(self):
398: """add the CDLIBasketContainer form"""
399: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addCDLIBasketContainer.zpt')).__of__(self)
400: return pt()
401:
402: def manage_addCDLIBasketContainer(self,id,title,RESPONSE=None):
403: """add the basket"""
404: ob=CDLIBasketContainer(id,title)
405:
406: self._setObject(id, ob)
407:
408: if RESPONSE is not None:
409: RESPONSE.redirect('manage_main')
410:
411: class CDLIBasket(Folder):
412: """basket"""
413:
414: meta_type="CDLIBasket"
415:
416: def getFile(self,obj):
417: return obj[1]
418:
419: def getFileLastVersion(self,obj):
420: return obj[0]
421:
422: def isActual(self,obj):
423: """teste ob im basket die aktuelle version ist"""
424: actualNo=obj[1].getLastVersion().getVersionNumber()
425: storedNo=obj[0].getVersionNumber()
426: if actualNo==storedNo:
427: return True
428: else:
429: return False
430:
431: def history(self):
432: """history"""
433:
434: ext=self.ZopeFind(self.aq_parent,obj_ids=["history_template.html"])
435: if ext:
436: return getattr(self,ext[0][1].getId())()
437:
438: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','BasketHistory')).__of__(self)
439: return pt()
440:
441: def getStorageFolderRoot(self):
442: """root des storage folders"""
443: return self.aq_parent.cdli_main
444:
445: def __init__(self,id,title,shortDescription="",comment=""):
446: """init a CDLIBasket"""
447:
448: self.id=id
449: self.title=title
450: self.shortDescription=shortDescription
451: self.comment=comment
452:
453:
454:
455: def getLastVersion(self):
456: """hole letzte version"""
457: ids=[int(x[0]) for x in self.ZopeFind(self,obj_metatypes=["CDLIBasketVersion"])]
458: ids.sort()
459: if len(ids)==0:
460: return None
461: else:
462: ob=getattr(self,str(ids[-1]))
463: return ob
464:
465: def getVersions(self):
466: """get versions"""
467: versions=self.ZopeFind(self,obj_metatypes=["CDLIBasketVersion"])
468: return versions
469:
470:
471:
472: def addObjects(self,ids,deleteOld=None):
473: """generate a new version of the basket with objects added"""
474:
475: lastVersion=self.getLastVersion()
476:
477: if lastVersion is None:
478: oldContent=[]
479: else:
480: oldContent=lastVersion.basketContent[0:]
481:
482: if deleteOld:
483: oldContent=[]
484:
485: newContent=[]
486:
487: for id in ids:
488: founds=self.CDLICatalog.search({'title':id})
489: print id,founds
490: for found in founds:
491: if found.getObject() not in oldContent:
492: #TODO: was passiert wenn, man eine Object dazufgt, das schon da ist aber eine neuere version
493: newContent.append((found.getObject().getLastVersion(),found.getObject()))
494:
495:
496: content=oldContent+newContent
497:
498: user=self.getActualUserName()
499:
500: ob=manage_addCDLIBasketVersion(self,user,comment="",basketContent=content)
501:
502:
503:
504: def deleteObjects(self,ids,RESPONSE=None):
505: """delete objects"""
506: #TODO: implement delete Objects
507:
508: def manage_addCDLIBasketForm(self):
509: """add the CDLIBasketContainer form"""
510: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addCDLIBasket.zpt')).__of__(self)
511: return pt()
512:
513: def manage_addCDLIBasket(self,title,shortDescription="",comment="",RESPONSE=None):
514: """add the basket"""
515:
516: id=str(self.getNewId())
517:
518: ob=CDLIBasket(id,title,shortDescription,comment)
519:
520: self._setObject(id, ob)
521:
522: if RESPONSE is not None:
523: RESPONSE.redirect('manage_main')
524: else:
525: return ob
526:
527: class CDLIBasketVersion(SimpleItem):
528: """version of a basket"""
529:
530: meta_type="CDLIBasketVersion"
531:
532: def downloadObjectsAsOneFile(self,lock=None,procedure=None,REQUEST=None):
533: """download all selected files in one file"""
534:
535: ret=""
536: lockedObjects={}
537:
538:
539: if lock:
540:
541: if str(self.REQUEST['AUTHENTICATED_USER'])=='Anonymous User':
542:
543: return "please login first"
544:
545: #check if a locked object exist in the basket.
546: lockedObjects={}
547: for object in self.basketContent:
548:
549: if not object[1].lockedBy=="":
550: lockedObjects[object[1].title]=repr(object[1].lockedBy)
551:
552:
553: keys=lockedObjects.keys()
554:
555:
556: if len(keys)>0 and (not procedure):
557: self.REQUEST.SESSION['lockedObjects']=lockedObjects
558: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','lockedObjects.zpt')).__of__(self)
559: return pt()
560:
561: elif not procedure: #keine fails gesperrt dann alle donwloaden
562: procedure="downloadAll"
563:
564:
565: for object in self.basketContent:
566:
567: if (procedure=="downloadAll") or (object[1].lockedBy=='') or (object[1].lockedBy==self.REQUEST['AUTHENTICATED_USER']):
568: ret+=object[0].data
569:
570: if lock and object[1].lockedBy=='':
571: object[1].lockedBy=self.REQUEST['AUTHENTICATED_USER']
572:
573: basket_name=self.aq_parent.title+"_V"+self.getId()
574:
575: #write basketname to header of atf file
576: ret="#atf basket %s\n"%basket_name+ret
577:
578: self.REQUEST.RESPONSE.setHeader("Content-Disposition","""attachement; filename="%s.atf" """%basket_name)
579: self.REQUEST.RESPONSE.setHeader("Content-Type","application/octet-stream")
580: length=len(ret)
581: self.REQUEST.RESPONSE.setHeader("Content-Length",length)
582: self.REQUEST.RESPONSE.write(ret)
583:
584:
585: def numberOfItems(self):
586: """return anzahl der elemente im basket"""
587: return len(self.basketContent)
588:
589: def getTime(self):
590: """getTime"""
591: #return self.bobobase_modification_time().ISO()
592:
593: if hasattr(self,'time'):
594: return time.strftime("%Y-%m-%d %H:%M:%S",self.time)
595: elif hasattr(self,'timefixed'):
596: return self.timefixed
597: else:
598: setattr(self,'timefixed',self.bobobase_modification_time().ISO())
599: return self.bobobase_modification_time().ISO()
600:
601: def getContent(self):
602: """get Basket Content"""
603: return self.basketContent
604:
605:
606: def __init__(self,id,user,comment="",basketContent=[]):
607: """ init a basket version"""
608: self.id=id
609: self.coment=comment
610: self.basketContent=basketContent[0:]
611: self.user=user
612: self.time=time.localtime()
613:
614: def getUser(self):
615: """get user"""
616: return self.user
617:
618: def getComment(self):
619: """get Comment"""
620: return self.comment
621:
622: def index_html(self):
623: """view the basket"""
624: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','BasketVersionMain.zpt')).__of__(self)
625: return pt()
626:
627: def getObjUrl(self,result):
628: """getUrl of the version of the object"""
629: objId=result[1].getTitle()
630: founds=self.CDLICatalog.search({'title':objId})
631: if len(founds)>0:
632: return founds[0].getObject().absolute_url()
633:
634: else: #assume version number
635: splitted=objId.split("_")
636: founds=self.CDLICatalog.search({'path':splitted[1]})
637: return founds[0].getObject().absolute_url()+'/'+objId
638:
639: def manage_addCDLIBasketVersion(self,user,comment="",basketContent=[],RESPONSE=None):
640: """add a version"""
641:
642: #check for already existing versions
643:
644: lastVersion=self.getLastVersion()
645: if lastVersion is None:
646: newId=str(1)
647: else:
648: newId=str(int(lastVersion.getId())+1)
649:
650: ob=CDLIBasketVersion(newId,user,comment,basketContent)
651:
652: self._setObject(newId, ob)
653:
654: if RESPONSE is not None:
655: RESPONSE.redirect('manage_main')
656: else:
657: return ob
658:
659: class CDLIFileObject(versionedFileObject):
660: """CDLI file object"""
661:
662: meta_type="CDLI File Object"
663:
664:
665: def view(self):
666: """view file"""
667: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','viewCDLIFile.zpt')).__of__(self)
668: return pt()
669:
670: manage_addCDLIFileObjectForm=DTMLFile('dtml/fileAdd', globals(),Kind='CDLIFileObject',kind='CDLIFileObject', version='1')
671:
672: def manage_addCDLIFileObject(self,id,vC='',author='', file='',title='',precondition='', content_type='',
673: REQUEST=None):
674: """Add a new File object.
675:
676: Creates a new File object 'id' with the contents of 'file'"""
677:
678: id=str(id)
679: title=str(title)
680: content_type=str(content_type)
681: precondition=str(precondition)
682:
683: id, title = cookId(id, title, file)
684:
685: self=self.this()
686:
687: # First, we create the file without data:
688: self._setObject(id, CDLIFileObject(id,title,'',content_type, precondition))
689: self._getOb(id).versionComment=str(vC)
690: self._getOb(id).time=time.localtime()
691:
692: setattr(self._getOb(id),'author',author)
693:
694: # Now we "upload" the data. By doing this in two steps, we
695: # can use a database trick to make the upload more efficient.
696: if file:
697: self._getOb(id).manage_upload(file)
698: if content_type:
699: self._getOb(id).content_type=content_type
700:
701: if REQUEST is not None:
702: REQUEST['RESPONSE'].redirect(self.absolute_url()+'/manage_main')
703:
704: class CDLIFile(versionedFile,CatalogAware):
705: """CDLI file"""
706:
707: meta_type="CDLI file"
708: default_catalog='CDLICatalog'
709:
710: def manage_addCDLIFileObject(self,id,vC,author,file='',title='',precondition='', content_type='',changeName='no',newName='', RESPONSE=None):
711: """add"""
712: try: #TODO: der ganze vC unsinn muss ueberarbeitet werden
713: vC=self.REQUEST['vC']
714: except:
715: pass
716:
717: author=self.REQUEST['author']
718:
719: if changeName=="yes":
720: filename=file.filename
721: self.title=filename[max(filename.rfind('/'),
722: filename.rfind('\\'),
723: filename.rfind(':'),
724: )+1:]
725:
726:
727: if not newName=='':
728: self.title=newName[0:]
729:
730:
731:
732:
733:
734: positionVersionNum=getattr(self,'positionVersionNum','front')
735:
736: if positionVersionNum=='front':
737: id="V%i"%self.getVersion()+"_"+self.title
738: else:
739: tmp=os.path.splitext(self.title)
740: if len(tmp)>1:
741: id=tmp[0]+"_V%i"%self.getVersion()+tmp[1]
742: else:
743: id=tmp[0]+"_V%i"%self.getVersion()
744:
745:
746: manage_addCDLIFileObject(self,id,vC,author,file,id,precondition, content_type)
747: objs=self.ZopeFind(self,obj_ids=[id])[0][1].setVersionNumber(int(self.getVersion()))
748: self.REQUEST.SESSION['objID_parent']=self.getId()
749:
750: if RESPONSE:
751: obj=self.ZopeFind(self,obj_ids=[id])[0][1]
752: if obj.getSize()==0:
753: self.REQUEST.SESSION['objID']=obj.getId()
754: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','errorUploadFile')).__of__(self)
755: return pt()
756:
757: else:
758: RESPONSE.redirect(self.REQUEST['URL2'])
759:
760: else:
761: return self.ZopeFind(self,obj_ids=[id])[0][1]
762:
763:
764: def manage_addCDLIFileForm(self):
765: """interface for adding the OSAS_root"""
766: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addCDLIFile.zpt')).__of__(self)
767: return pt()
768:
769: def manage_addCDLIFile(self,id,title,lockedBy, author=None, RESPONSE=None):
770: """add the OSAS_root"""
771: newObj=CDLIFile(id,title,lockedBy,author)
772: self._setObject(id,newObj)
773:
774: if RESPONSE is not None:
775: RESPONSE.redirect('manage_main')
776:
777:
778:
779:
780: def splitatf(fh,dir=None):
781: """split it"""
782: ret=None
783: nf=None
784: for line in fh.readlines():
785: #check if basket name is in the first line
786: if line.find("#atf basket")>=0:
787: ret=line.replace('#atf basket ','')
788: else:
789: if (len(line.lstrip())>0) and (line.lstrip()[0]=="&"): #newfile
790: if nf:
791: nf.close() #close last file
792:
793:
794: filename=line[1:].split("=")[0].rstrip()+".atf"
795: if dir:
796: filename=os.path.join(dir,filename)
797: nf=file(filename,"w")
798: if nf:
799: nf.write(line)
800:
801: nf.close()
802: fh.close()
803: return ret.split('_')[0],len(os.listdir(dir))
804:
805: class CDLIFileFolder(versionedFileFolder):
806: """CDLI File Folder"""
807:
808: meta_type="CDLI Folder"
809: filesMetaType=['CDLI file']
810: folderMetaType=['CDLI Folder']
811: default_catalog='CDLICatalog'
812:
813: def getVersionNumbersFromIds(self,ids):
814: """get the numbers of the current versions of documents described by their ids"""
815:
816: ret=[]
817: searchStr=" OR ".join(ids)
818:
819: founds=self.CDLICatalog.search({'path':searchStr})
820:
821: for found in founds:
822: lastVersion=found.getObject().getLastVersion()
823: ret.append((found.getId,lastVersion))
824:
825: return ret
826:
827:
828: def uploadATF(self,upload,basketId=0,RESPONSE=None):
829: """upload an atf file"""
830: #TODO: add comments
831: #TODO: finish uploadATF
832: basketId=str(basketId)
833:
834:
835:
836: dir=mkdtemp()
837: changed=[]
838: errors=[]
839: newPs=[]
840: basketNameFromFile, numberOfFiles=splitatf(upload,dir)
841: if basketId == '0':
842: basketNameFromId=""
843: basketLen=0
844: else:
845: basketNameFromId=getattr(self.basketContainer,basketId).title
846: basketLen=getattr(self.basketContainer,basketId).getLastVersion().numberOfItems()
847:
848:
849: for fn in os.listdir(dir):
850: founds=self.CDLICatalog.search({'title':fn})
851:
852: if len(founds)==0:
853: newPs.append(fn)
854:
855: for found in founds:
856: obj=found.getObject()
857:
858: if (not obj.lockedBy=='') and (not obj.lockedBy==self.REQUEST['AUTHENTICATED_USER']):
859: errors.append(obj)
860: else:
861: data=file(os.path.join(dir,fn)).read()
862: diffs=obj.diff(data)
863: if diffs[0]>0:
864: changed.append((obj,diffs))
865: #hochladen
866:
867: self.REQUEST.SESSION['changed']=[x[0].getId() for x in changed]
868: self.REQUEST.SESSION['errors']=[x.getId() for x in errors]
869: self.REQUEST.SESSION['newPs']=newPs
870: self.REQUEST.SESSION['tmpdir']=dir
871:
872: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','uploadCheck.zpt')).__of__(self)
873: return pt(changed=changed,errors=errors,dir=dir,newPs=newPs,basketLen=basketLen,numberOfFiles=numberOfFiles,
874: basketNameFromId=basketNameFromId,basketNameFromFile=basketNameFromFile,basketId=basketId)
875:
876: def uploadATFfinally(self,procedure,comment="",basketId='0',unlock=None,RESPONSE=None):
877: """upload the files"""
878:
879: if procedure=="uploadchanged":
880: uploadFns=self.REQUEST.SESSION['changed']+self.REQUEST.SESSION['newPs']
881:
882: elif procedure=="uploadAll":
883: uploadFns=[]
884: for x in os.listdir(self.REQUEST.SESSION['tmpdir']):
885: if not x in self.REQUEST.SESSION['errors']:
886: uploadFns.append(x)
887: else:
888: uploadFns=[]
889:
890: for fn in uploadFns:
891: founds=self.CDLICatalog.search({'path':fn})
892: if len(founds)>0:
893: self.REQUEST['author']=str(self.REQUEST['AUTHENTICATED_USER'])
894: founds[0].getObject().manage_addCDLIFileObject('',comment,self.REQUEST['author'],file=file(os.path.join(self.REQUEST.SESSION['tmpdir'],fn)))
895:
896:
897:
898: newPs=self.REQUEST.SESSION['newPs']
899: if len(newPs)>0:
900: tmpDir=self.REQUEST.SESSION['tmpdir']
901:
902: self.cdli_main.importFiles(comment=comment,author=str(self.REQUEST['AUTHENTICATED_USER']) ,folderName=tmpDir, files=newPs)
903:
904:
905:
906: #unlock
907: if unlock:
908: unlockFns=[]
909: for x in os.listdir(self.REQUEST.SESSION['tmpdir']):
910: if not x in self.REQUEST.SESSION['errors']:
911: unlockFns.append(x)
912:
913: for fn in unlockFns:
914: founds=self.CDLICatalog.search({'path':fn})
915: if len(founds)>0:
916: self.REQUEST['author']=str(self.REQUEST['AUTHENTICATED_USER'])
917:
918: founds[0].getObject().lockedBy=""
919:
920: if not (basketId =='0'):
921: basket=getattr(self.basketFolder,basketId)
922: ids=os.listdir(self.REQUEST.SESSION['tmpdir'])
923: basket.addObjects(ids,deleteOld=True)
924:
925: if RESPONSE is not None:
926: RESPONSE.redirect(self.aq_parent.absolute_url())
927:
928:
929: def findObjectsFromList(self,upload,RESPONSE):
930: """findObjectsFromList (, TAB oder LINE separated)"""
931: txt=upload.read()
932: txt=txt.replace(",","\n")
933: txt=txt.replace("\t","\n")
934: idsTmp=txt.split("\n")
935: ids=[]
936: for id in idsTmp: # make sure that no empty lines
937: idTmp=id.lstrip().rstrip()
938: if len(idTmp)>0:
939: ids.append(idTmp)
940: #self.REQUEST.SESSION['ids']=" OR ".join(ids)
941:
942: RESPONSE.redirect("filelist.html?path=%s"%" OR ".join(ids))
943:
944: def createAllFilesAsSingleFile(self,RESPONSE=None):
945: """download all files"""
946:
947: def sortF(x,y):
948: return cmp(x[0],y[0])
949:
950: catalog=getattr(self,self.default_catalog)
951: #tf,tfilename=mkstemp()
952:
953:
954: list=[(x.getId,x) for x in catalog()]
955: list.sort(sortF)
956:
957: RESPONSE.setHeader("Content-Disposition","""attachement; filename=%s"""%"all.atf")
958: RESPONSE.setHeader("Content-Type","application/octet-stream")
959:
960: for l in list:
961: obj=l[1].getObject()
962:
963: if obj.meta_type=="CDLI file":
964:
965: #os.write(tf,obj.getLastVersion().data)
966: if RESPONSE:
967: RESPONSE.write(obj.getLastVersion().data)
968: #os.close(tf)
969: #RESPONSE.redirect(self.absolute_url()+"/downloadFile?fn="%tfilename)
970: return True
971:
972: def downloadFile(self,fn):
973: """download fn - not used yet"""
974: self.REQUEST.RESPONSE.setHeader("Content-Disposition","""attachement; filename=%s"""%self.getLastVersion().getId())
975: self.REQUEST.RESPONSE.setHeader("Content-Type","application/octet-stream")
976: self.REQUEST.RESPONSE.write(file(fn).read())
977:
978:
979:
980: def hasParent(self):
981: """returns true falls subfolder"""
982:
983: if self.aq_parent.meta_type in self.folderMetaType:
984: return True
985: else:
986: return False
987:
988: def getFolders(self):
989: """get all subfolders"""
990: ret=[]
991: folders=self.ZopeFind(self,obj_metatypes=self.folderMetaType)
992: for folder in folders:
993: ret.append((folder[1],
994: len(self.ZopeFind(folder[1],obj_metatypes=self.folderMetaType)),
995: len(self.ZopeFind(folder[1],obj_metatypes=self.filesMetaType))
996: ))
997: return ret
998:
999:
1000: def getFolders_OLD(self):
1001: """get all subfolders"""
1002: ret=[]
1003: folders=self.ZopeFind(self,obj_metatypes=self.folderMetaType)
1004: for folder in folders:
1005: ret.append((folder[1],
1006: len(self.ZopeFind(folder[1],obj_metatypes=self.folderMetaType)),
1007: len(getattr(self,self.default_catalog)({'path':folder[0]}))
1008: ))
1009: return ret
1010:
1011: def index_html(self):
1012: """main"""
1013: ext=self.ZopeFind(self,obj_ids=["index.html"])
1014: if ext:
1015: return ext[0][1]()
1016:
1017: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','CDLIFileFolderMain')).__of__(self)
1018: return pt()
1019:
1020: def importFiles(self,comment="",author="" ,folderName="/Users/dwinter/Documents/workspace/cdli/atf", files=None):
1021: """import files"""
1022:
1023: if not files:
1024: files=os.listdir(folderName)
1025:
1026: for f in files:
1027: folder=f[0:3]
1028: f2=f[0:5]
1029: obj=self.ZopeFind(self,obj_ids=[folder])
1030:
1031: if not obj:
1032: manage_addCDLIFileFolder(self,folder,folder)
1033: fobj=getattr(self,folder)
1034:
1035: else:
1036: fobj=obj[0][1]
1037:
1038: obj2=fobj.ZopeFind(fobj,obj_ids=[f2])
1039:
1040: if not obj2:
1041: manage_addCDLIFileFolder(fobj,f2,f2)
1042: fobj2=getattr(fobj,f2)
1043:
1044: else:
1045: fobj2=obj2[0][1]
1046:
1047: file2=file(os.path.join(folderName,f))
1048: id=f
1049: manage_addCDLIFile(fobj2,f,'','')
1050: id=f
1051: ob=fobj2._getOb(f)
1052: ob.title=id
1053:
1054: manage_addCDLIFileObject(ob,id,comment,author,file2,content_type='')
1055: self.CDLICatalog.catalog_object(ob)
1056: #self.CDLICatalog.manage_catalogFoundItems(obj_ids=[id],search_sub=1)
1057: #self.CDLICatalog.manage_catalogObject(self.REQUEST, self.REQUEST.RESPONSE, 'CDLICatalog', urlparse.urlparse(ob.absolute_url())[1])
1058:
1059: return "ok"
1060:
1061: manage_addCDLIFileFolderForm=DTMLFile('dtml/folderAdd', globals())
1062:
1063:
1064: def manage_addCDLIFileFolder(self, id, title='',
1065: createPublic=0,
1066: createUserF=0,
1067: REQUEST=None):
1068: """Add a new Folder object with id *id*.
1069:
1070: If the 'createPublic' and 'createUserF' parameters are set to any true
1071: value, an 'index_html' and a 'UserFolder' objects are created respectively
1072: in the new folder.
1073: """
1074: ob=CDLIFileFolder()
1075: ob.id=str(id)
1076: ob.title=title
1077: self._setObject(id, ob)
1078: ob=self._getOb(id)
1079:
1080: checkPermission=getSecurityManager().checkPermission
1081:
1082: if createUserF:
1083: if not checkPermission('Add User Folders', ob):
1084: raise Unauthorized, (
1085: 'You are not authorized to add User Folders.'
1086: )
1087: ob.manage_addUserFolder()
1088:
1089:
1090: if REQUEST is not None:
1091: return self.manage_main(self, REQUEST, update_menu=1)
1092:
1093:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>