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: def getBasketIdfromName(self,basketname):
254: """get id from name"""
255:
256: for basket in self.ZopeFind(self,obj_metatypes=["CDLIBasket"]):
257: if basket[1].title==basketname:
258: return basket[0]
259: else:
260: None
261: def uploadBasket_html(self,basketId='0'):
262: """upload an atf file, html form"""
263: basketId=str(basketId)
264: if not basketId=='0':
265: basketName=getattr(self.basketContainer,basketId).title
266: else:
267: basketName=""
268:
269: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','uploadBasket_html.zpt')).__of__(self)
270: return pt(basketId=basketId,basketName=basketName)
271:
272:
273:
274: def index_html(self):
275: """stanadard ansicht"""
276: ext=self.ZopeFind(self,obj_ids=["index.html"])
277: if ext:
278: return ext[0][1]()
279:
280: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','BasketContainerMain')).__of__(self)
281: return pt()
282:
283: def getStorageFolderRoot(self):
284: """root des storage folders"""
285: return self.cdli_main
286:
287: def __init__(self,id,title):
288: """ init basket container"""
289: self.id=id
290: self.title=title
291:
292:
293: def getBaskets(self,sortField='title'):
294: """get all baskets files"""
295:
296: def sortName(x,y):
297: return cmp(x[1].title.lower(),y[1].title.lower())
298:
299: def sortDate(x,y):
300: return cmp(y[1].getLastVersion().getTime(),x[1].getLastVersion().getTime())
301:
302:
303: def sortComment(x,y):
304:
305:
306:
307: try:
308: xc=getattr(x[1],'comment','ZZZZZZZZZZZZZ').lower()
309: except:
310: xc='ZZZZZZZZZZZZZ'.lower()
311: try:
312: yc=getattr(y[1],'comment','ZZZZZZZZZZZZZ').lower()
313: except:
314: yc='ZZZZZZZZZZZZZ'.lower()
315:
316:
317: if (xc=='') or (xc=='ZZZZZZZZZZZZZ'.lower()):
318:
319: try:
320: xc=x[1].getLastVersion().getComment().lower()
321: except:
322: xc='ZZZZZZZZZZZZZ'.lower()
323:
324: if (yc=='') or (yc=='ZZZZZZZZZZZZZ'.lower()):
325: try:
326: yc=y[1].getLastVersion().getComment().lower()
327: except:
328: yc='ZZZZZZZZZZZZZ'.lower()
329:
330:
331: return cmp(xc,yc)
332:
333: def sortAuthor(x,y):
334:
335: return cmp(x[1].getLastVersion().getUser().lower(),y[1].getLastVersion().getUser().lower())
336:
337: baskets=self.ZopeFind(self,obj_metatypes=['CDLIBasket'])
338:
339:
340: if sortField=='title':
341: baskets.sort(sortName)
342: elif sortField=='date':
343: baskets.sort(sortDate)
344: elif sortField=='author':
345: baskets.sort(sortAuthor)
346: elif sortField=='comment':
347: baskets.sort(sortComment)
348:
349: return baskets
350:
351:
352:
353: def getNewId(self):
354: """createIds"""
355: last=getattr(self,'last',0)
356: last +=1
357: while len(self.ZopeFind(self,obj_ids=[str(last)]))>0:
358: last+=1
359:
360: self.last=last
361: return last
362:
363: def setActiveBasket(self,basketId,REQUEST=None):
364: """store active basketId in a cookie"""
365: self.REQUEST.RESPONSE.setCookie("CDLIActiveBasket",basketId,path="/")
366: if REQUEST:
367: REQUEST.RESPONSE.redirect(REQUEST['URL1'])
368:
369: def getActiveBasket(self):
370: """get active basket from cookie"""
371:
372: id= self.REQUEST.cookies.get('CDLIActiveBasket',None)
373: if id:
374: obj=getattr(self,str(id),None)
375: else:
376: obj=None
377: return obj
378:
379: def getActualUserName(self):
380: """get name of the actualuser"""
381: return str(self.REQUEST['AUTHENTICATED_USER'])
382:
383:
384: def addBasket(self,newBasketName):
385: """add a new basket"""
386:
387: ob=manage_addCDLIBasket(self,newBasketName)
388: return ob
389:
390: def storeInBasket(self,submit,ids=None,newBasketName=None,fromFileList=None,RESPONSE=None,REQUEST=None):
391: """store it"""
392: if not ids:
393: ids=self.REQUEST.SESSION['fileIds']
394:
395: if type(ids) is not ListType:
396: ids=[ids]
397:
398: if (submit.lower()=="store in new basket") or (submit.lower()=="new basket"):
399: basketRet=self.addBasket(newBasketName)
400: self.setActiveBasket(basketRet.getId())
401: basket=getattr(self,basketRet.getId())
402: elif (submit.lower()=="store in active basket") or (submit.lower()=="active basket"):
403: basket=self.getActiveBasket()
404:
405: added=basket.addObjects(ids)
406: back=self.REQUEST['HTTP_REFERER'].split("?")[0]+"?basketName="+basket.title+"&numberOfObjects="+str(added)
407:
408:
409: if fromFileList:
410: return self.cdli_main.findObjectsFromList(list=self.REQUEST.SESSION['fileIds'],basketName=basket.title,numberOfObjects=added)
411:
412: if RESPONSE:
413:
414: RESPONSE.redirect(back)
415:
416: return True
417:
418: def manage_addCDLIBasketContainerForm(self):
419: """add the CDLIBasketContainer form"""
420: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addCDLIBasketContainer.zpt')).__of__(self)
421: return pt()
422:
423: def manage_addCDLIBasketContainer(self,id,title,RESPONSE=None):
424: """add the basket"""
425: ob=CDLIBasketContainer(id,title)
426:
427: self._setObject(id, ob)
428:
429: if RESPONSE is not None:
430: RESPONSE.redirect('manage_main')
431:
432: class CDLIBasket(Folder,CatalogAware):
433: """basket"""
434:
435: meta_type="CDLIBasket"
436: default_catalog="CDLIBasketCatalog"
437:
438: def getFile(self,obj):
439: return obj[1]
440:
441: def getFileLastVersion(self,obj):
442: return obj[0]
443:
444: def getFileNamesInLastVersion(self):
445: """get content of the last version as list"""
446:
447: return [x[1].getId() for x in self.getLastVersion().getContent()]
448:
449: def isActual(self,obj):
450: """teste ob im basket die aktuelle version ist"""
451: actualNo=obj[1].getLastVersion().getVersionNumber()
452: storedNo=obj[0].getVersionNumber()
453: if actualNo==storedNo:
454: return True
455: else:
456: return False
457:
458: def history(self):
459: """history"""
460:
461: ext=self.ZopeFind(self.aq_parent,obj_ids=["history_template.html"])
462: if ext:
463: return getattr(self,ext[0][1].getId())()
464:
465: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','BasketHistory')).__of__(self)
466: return pt()
467:
468: def getStorageFolderRoot(self):
469: """root des storage folders"""
470: return self.aq_parent.cdli_main
471:
472: def __init__(self,id,title,shortDescription="",comment=""):
473: """init a CDLIBasket"""
474:
475: self.id=id
476: self.title=title
477: self.shortDescription=shortDescription
478: self.comment=comment
479:
480:
481:
482: def getLastVersion(self):
483: """hole letzte version"""
484: ids=[int(x[0]) for x in self.ZopeFind(self,obj_metatypes=["CDLIBasketVersion"])]
485: ids.sort()
486: if len(ids)==0:
487: return None
488: else:
489: ob=getattr(self,str(ids[-1]))
490: return ob
491:
492: def getVersions(self):
493: """get versions"""
494: versions=self.ZopeFind(self,obj_metatypes=["CDLIBasketVersion"])
495: return versions
496:
497:
498:
499: def addObjects(self,ids,deleteOld=None):
500: """generate a new version of the basket with objects added"""
501:
502: lastVersion=self.getLastVersion()
503:
504: if lastVersion is None:
505: oldContent=[]
506: else:
507: oldContent=lastVersion.basketContent[0:]
508:
509: if deleteOld:
510: oldContent=[]
511:
512: newContent=[]
513: added=0
514: for id in ids:
515: founds=self.CDLICatalog.search({'title':id})
516:
517: for found in founds:
518: if found.getObject() not in oldContent:
519: #TODO: was passiert wenn, man eine Object dazufgt, das schon da ist aber eine neuere version
520: newContent.append((found.getObject().getLastVersion(),found.getObject()))
521: added+=1
522:
523: content=oldContent+newContent
524:
525: user=self.getActualUserName()
526:
527: ob=manage_addCDLIBasketVersion(self,user,comment="",basketContent=content)
528:
529: return added
530:
531: def deleteObjects(self,ids,RESPONSE=None):
532: """delete objects"""
533: #TODO: implement delete Objects
534:
535: def manage_addCDLIBasketForm(self):
536: """add the CDLIBasketContainer form"""
537: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addCDLIBasket.zpt')).__of__(self)
538: return pt()
539:
540: def manage_addCDLIBasket(self,title,shortDescription="",comment="",RESPONSE=None):
541: """add the basket"""
542:
543: id=str(self.getNewId())
544:
545: ob=CDLIBasket(id,title,shortDescription,comment)
546:
547: self._setObject(id, ob)
548:
549: if RESPONSE is not None:
550: RESPONSE.redirect('manage_main')
551: else:
552: return ob
553:
554: class CDLIBasketVersion(SimpleItem):
555: """version of a basket"""
556:
557: meta_type="CDLIBasketVersion"
558:
559: def downloadObjectsAsOneFile(self,lock=None,procedure=None,REQUEST=None):
560: """download all selected files in one file"""
561:
562: ret=""
563: lockedObjects={}
564:
565:
566: if lock:
567:
568: if str(self.REQUEST['AUTHENTICATED_USER'])=='Anonymous User':
569:
570: return "please login first"
571:
572: #check if a locked object exist in the basket.
573: lockedObjects={}
574: for object in self.basketContent:
575:
576: if not object[1].lockedBy=="":
577: lockedObjects[object[1].title]=repr(object[1].lockedBy)
578:
579:
580: keys=lockedObjects.keys()
581:
582:
583: if len(keys)>0 and (not procedure):
584: self.REQUEST.SESSION['lockedObjects']=lockedObjects
585: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','lockedObjects.zpt')).__of__(self)
586: return pt()
587:
588: elif not procedure: #keine fails gesperrt dann alle donwloaden
589: procedure="downloadAll"
590:
591:
592: for object in self.basketContent:
593:
594: if (procedure=="downloadAll") or (object[1].lockedBy=='') or (object[1].lockedBy==self.REQUEST['AUTHENTICATED_USER']):
595: ret+=object[0].data
596:
597: if lock and object[1].lockedBy=='':
598: object[1].lockedBy=self.REQUEST['AUTHENTICATED_USER']
599:
600: basket_name=self.aq_parent.title+"_V"+self.getId()
601:
602: #write basketname to header of atf file
603: ret="#atf basket %s\n"%basket_name+ret
604:
605: self.REQUEST.RESPONSE.setHeader("Content-Disposition","""attachement; filename="%s.atf" """%basket_name)
606: self.REQUEST.RESPONSE.setHeader("Content-Type","application/octet-stream")
607: length=len(ret)
608: self.REQUEST.RESPONSE.setHeader("Content-Length",length)
609: self.REQUEST.RESPONSE.write(ret)
610:
611:
612: def numberOfItems(self):
613: """return anzahl der elemente im basket"""
614: return len(self.basketContent)
615:
616: def getTime(self):
617: """getTime"""
618: #return self.bobobase_modification_time().ISO()
619:
620: if hasattr(self,'time'):
621: return time.strftime("%Y-%m-%d %H:%M:%S",self.time)
622: elif hasattr(self,'timefixed'):
623: return self.timefixed
624: else:
625: setattr(self,'timefixed',self.bobobase_modification_time().ISO())
626: return self.bobobase_modification_time().ISO()
627:
628: def getContent(self):
629: """get Basket Content"""
630: return self.basketContent
631:
632:
633: def __init__(self,id,user,comment="",basketContent=[]):
634: """ init a basket version"""
635: self.id=id
636: self.coment=comment
637: self.basketContent=basketContent[0:]
638: self.user=user
639: self.time=time.localtime()
640:
641: def getUser(self):
642: """get user"""
643: return self.user
644:
645: def getComment(self):
646: """get Comment"""
647: return self.comment
648:
649: def index_html(self):
650: """view the basket"""
651: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','BasketVersionMain.zpt')).__of__(self)
652: return pt()
653:
654: def getObjUrl(self,result):
655: """getUrl of the version of the object"""
656: objId=result[1].getTitle()
657: founds=self.CDLICatalog.search({'title':objId})
658: if len(founds)>0:
659: return founds[0].getObject().absolute_url()
660:
661: else: #assume version number
662: splitted=objId.split("_")
663: founds=self.CDLICatalog.search({'path':splitted[1]})
664: return founds[0].getObject().absolute_url()+'/'+objId
665:
666: def manage_addCDLIBasketVersion(self,user,comment="",basketContent=[],RESPONSE=None):
667: """add a version"""
668:
669: #check for already existing versions
670:
671: lastVersion=self.getLastVersion()
672: if lastVersion is None:
673: newId=str(1)
674: else:
675: newId=str(int(lastVersion.getId())+1)
676:
677: ob=CDLIBasketVersion(newId,user,comment,basketContent)
678:
679: self._setObject(newId, ob)
680:
681: if RESPONSE is not None:
682: RESPONSE.redirect('manage_main')
683: else:
684: return ob
685:
686: class CDLIFileObject(versionedFileObject):
687: """CDLI file object"""
688:
689: meta_type="CDLI File Object"
690:
691:
692: def view(self):
693: """view file"""
694: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','viewCDLIFile.zpt')).__of__(self)
695: return pt()
696:
697: manage_addCDLIFileObjectForm=DTMLFile('dtml/fileAdd', globals(),Kind='CDLIFileObject',kind='CDLIFileObject', version='1')
698:
699: def manage_addCDLIFileObject(self,id,vC='',author='', file='',title='',precondition='', content_type='',
700: REQUEST=None):
701: """Add a new File object.
702:
703: Creates a new File object 'id' with the contents of 'file'"""
704:
705: id=str(id)
706: title=str(title)
707: content_type=str(content_type)
708: precondition=str(precondition)
709:
710: id, title = cookId(id, title, file)
711:
712: self=self.this()
713:
714: # First, we create the file without data:
715: self._setObject(id, CDLIFileObject(id,title,'',content_type, precondition))
716: self._getOb(id).versionComment=str(vC)
717: self._getOb(id).time=time.localtime()
718:
719: setattr(self._getOb(id),'author',author)
720:
721: # Now we "upload" the data. By doing this in two steps, we
722: # can use a database trick to make the upload more efficient.
723: if file:
724: self._getOb(id).manage_upload(file)
725: if content_type:
726: self._getOb(id).content_type=content_type
727:
728: if REQUEST is not None:
729: REQUEST['RESPONSE'].redirect(self.absolute_url()+'/manage_main')
730:
731: class CDLIFile(versionedFile,CatalogAware):
732: """CDLI file"""
733:
734: meta_type="CDLI file"
735: default_catalog='CDLICatalog'
736:
737: def isContainedInBaskets(self):
738: """check is this file is part of any basket"""
739:
740: return [x.getObject() for x in self.CDLIBasketCatalog.search({'getFileNamesInLastVersion':self.getId()})]
741:
742:
743: def addCDLIFileObjectForm(self):
744: """add a new version"""
745:
746: if str(self.REQUEST['AUTHENTICATED_USER']) in ["Anonymous User"]:
747: return "please login first"
748: if (self.lockedBy==self.REQUEST['AUTHENTICATED_USER']) or (self.lockedBy==''):
749: out=DTMLFile('dtml/fileAdd', globals(),Kind='CDLIFileObject',kind='CDLIFileObject',version=self.getVersion()).__of__(self)
750: return out()
751: else:
752: return "Sorry file is locked by somebody else"
753:
754: def manage_addCDLIFileObject(self,id,vC,author,file='',title='',precondition='', content_type='',changeName='no',newName='', RESPONSE=None):
755: """add"""
756: try: #TODO: der ganze vC unsinn muss ueberarbeitet werden
757: vC=self.REQUEST['vC']
758: except:
759: pass
760:
761: author=self.REQUEST['author']
762:
763: if changeName=="yes":
764: filename=file.filename
765: self.title=filename[max(filename.rfind('/'),
766: filename.rfind('\\'),
767: filename.rfind(':'),
768: )+1:]
769:
770:
771: if not newName=='':
772: self.title=newName[0:]
773:
774:
775:
776:
777:
778: positionVersionNum=getattr(self,'positionVersionNum','front')
779:
780: if positionVersionNum=='front':
781: id="V%i"%self.getVersion()+"_"+self.title
782: else:
783: tmp=os.path.splitext(self.title)
784: if len(tmp)>1:
785: id=tmp[0]+"_V%i"%self.getVersion()+tmp[1]
786: else:
787: id=tmp[0]+"_V%i"%self.getVersion()
788:
789:
790: manage_addCDLIFileObject(self,id,vC,author,file,id,precondition, content_type)
791: objs=self.ZopeFind(self,obj_ids=[id])[0][1].setVersionNumber(int(self.getVersion()))
792: self.REQUEST.SESSION['objID_parent']=self.getId()
793:
794: if RESPONSE:
795: obj=self.ZopeFind(self,obj_ids=[id])[0][1]
796: if obj.getSize()==0:
797: self.REQUEST.SESSION['objID']=obj.getId()
798: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','errorUploadFile')).__of__(self)
799: return pt()
800:
801: else:
802: RESPONSE.redirect(self.REQUEST['URL2'])
803:
804: else:
805: return self.ZopeFind(self,obj_ids=[id])[0][1]
806:
807:
808: def manage_addCDLIFileForm(self):
809: """interface for adding the OSAS_root"""
810: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addCDLIFile.zpt')).__of__(self)
811: return pt()
812:
813: def manage_addCDLIFile(self,id,title,lockedBy, author=None, RESPONSE=None):
814: """add the OSAS_root"""
815: newObj=CDLIFile(id,title,lockedBy,author)
816: self._setObject(id,newObj)
817:
818: if RESPONSE is not None:
819: RESPONSE.redirect('manage_main')
820:
821:
822:
823:
824: def splitatf(fh,dir=None):
825: """split it"""
826: ret=None
827: nf=None
828: for line in fh.readlines():
829: #check if basket name is in the first line
830: if line.find("#atf basket")>=0:
831: ret=line.replace('#atf basket ','')
832: ret=ret.split('_')[0]
833: else:
834: if (len(line.lstrip())>0) and (line.lstrip()[0]=="&"): #newfile
835: if nf:
836: nf.close() #close last file
837:
838:
839: filename=line[1:].split("=")[0].rstrip()+".atf"
840: if dir:
841: filename=os.path.join(dir,filename)
842: nf=file(filename,"w")
843: if nf:
844: nf.write(line)
845:
846: nf.close()
847: fh.close()
848: return ret,len(os.listdir(dir))
849:
850: class CDLIFileFolder(versionedFileFolder):
851: """CDLI File Folder"""
852:
853: meta_type="CDLI Folder"
854: filesMetaType=['CDLI file']
855: folderMetaType=['CDLI Folder']
856: default_catalog='CDLICatalog'
857:
858: def getVersionNumbersFromIds(self,ids):
859: """get the numbers of the current versions of documents described by their ids"""
860:
861: ret=[]
862: searchStr=" OR ".join(ids)
863:
864: founds=self.CDLICatalog.search({'path':searchStr})
865:
866: for found in founds:
867: lastVersion=found.getObject().getLastVersion()
868: ret.append((found.getId,lastVersion))
869:
870: return ret
871:
872:
873: def uploadATF(self,upload,basketId=0,RESPONSE=None):
874: """upload an atf file"""
875: #TODO: add comments
876: #TODO: finish uploadATF
877: basketId=str(basketId)
878:
879:
880:
881: dir=mkdtemp()
882: changed=[]
883: errors=[]
884: newPs=[]
885: basketNameFromFile, numberOfFiles=splitatf(upload,dir)
886: if basketId == '0':
887: basketNameFromId=""
888: basketLen=0
889: else:
890: basketNameFromId=getattr(self.basketContainer,basketId).title
891: basketLen=getattr(self.basketContainer,basketId).getLastVersion().numberOfItems()
892:
893:
894: for fn in os.listdir(dir):
895: founds=self.CDLICatalog.search({'title':fn})
896:
897: if len(founds)==0:
898: newPs.append(fn)
899:
900: for found in founds:
901: obj=found.getObject()
902:
903: if (not obj.lockedBy=='') and (not obj.lockedBy==self.REQUEST['AUTHENTICATED_USER']):
904: errors.append(obj)
905: else:
906: data=file(os.path.join(dir,fn)).read()
907: diffs=obj.diff(data)
908: if diffs[0]>0:
909: changed.append((obj,diffs))
910: #hochladen
911:
912: self.REQUEST.SESSION['changed']=[x[0].getId() for x in changed]
913: self.REQUEST.SESSION['errors']=[x.getId() for x in errors]
914: self.REQUEST.SESSION['newPs']=newPs
915: self.REQUEST.SESSION['tmpdir']=dir
916:
917: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','uploadCheck.zpt')).__of__(self)
918: return pt(changed=changed,errors=errors,dir=dir,newPs=newPs,basketLen=basketLen,numberOfFiles=numberOfFiles,
919: basketNameFromId=basketNameFromId,basketNameFromFile=basketNameFromFile,basketId=basketId)
920:
921: def uploadATFfinally(self,procedure,comment="",basketname='',unlock=None,RESPONSE=None):
922: """upload the files"""
923:
924: if procedure=="uploadchanged":
925: uploadFns=self.REQUEST.SESSION['changed']+self.REQUEST.SESSION['newPs']
926:
927: elif procedure=="uploadAll":
928: uploadFns=[]
929: for x in os.listdir(self.REQUEST.SESSION['tmpdir']):
930: if not x in self.REQUEST.SESSION['errors']:
931: uploadFns.append(x)
932: else:
933: uploadFns=[]
934:
935: for fn in uploadFns:
936: founds=self.CDLICatalog.search({'path':fn})
937: if len(founds)>0:
938: self.REQUEST['author']=str(self.REQUEST['AUTHENTICATED_USER'])
939: founds[0].getObject().manage_addCDLIFileObject('',comment,self.REQUEST['author'],file=file(os.path.join(self.REQUEST.SESSION['tmpdir'],fn)))
940:
941:
942:
943: newPs=self.REQUEST.SESSION['newPs']
944: if len(newPs)>0:
945: tmpDir=self.REQUEST.SESSION['tmpdir']
946:
947: self.cdli_main.importFiles(comment=comment,author=str(self.REQUEST['AUTHENTICATED_USER']) ,folderName=tmpDir, files=newPs)
948:
949:
950:
951: #unlock
952: if unlock:
953: unlockFns=[]
954: for x in os.listdir(self.REQUEST.SESSION['tmpdir']):
955: if not x in self.REQUEST.SESSION['errors']:
956: unlockFns.append(x)
957:
958: for fn in unlockFns:
959: founds=self.CDLICatalog.search({'path':fn})
960: if len(founds)>0:
961: self.REQUEST['author']=str(self.REQUEST['AUTHENTICATED_USER'])
962:
963: founds[0].getObject().lockedBy=""
964:
965: if not (basketname ==''):
966: basketId=self.basketFolder.getBasketIdfromName(basketname)
967:
968: basket=getattr(self.basketFolder,basketId)
969: ids=os.listdir(self.REQUEST.SESSION['tmpdir'])
970: basket.addObjects(ids,deleteOld=True)
971:
972: if RESPONSE is not None:
973: RESPONSE.redirect(self.aq_parent.absolute_url())
974:
975:
976: def findObjectsFromList(self,upload=None,list=None,basketName=None,numberOfObjects=None,RESPONSE=None):
977: """findObjectsFromList (, TAB oder LINE separated)"""
978: if upload: # list from file upload
979: txt=upload.read()
980: txt=txt.replace(",","\n")
981: txt=txt.replace("\t","\n")
982: idsTmp=txt.split("\n")
983: ids=[]
984: for id in idsTmp: # make sure that no empty lines
985: idTmp=id.lstrip().rstrip()
986: if len(idTmp)>0:
987:
988: ids.append(idTmp)
989:
990: #self.REQUEST.SESSION['ids']=" OR ".join(ids)
991:
992: pt=getattr(self,'filelist.html')
993: return pt(search=ids)
994: if basketName:
995: pt=getattr(self,'filelist.html')
996: return pt(search=list,basketName=basketName,numberOfObjects=numberOfObjects)
997:
998: if list: # got already a list
999: ret=[]
1000: for fileId in list:
1001: if len(fileId.split("."))==1:
1002: fileId=fileId+".atf"
1003:
1004: ret+=self.CDLICatalog({'title':fileId})
1005: self.REQUEST.SESSION['fileIds']=[x.getObject().getId() for x in ret]#store fieldIds in session for further usage
1006: return ret
1007:
1008: #RESPONSE.redirect("filelist.html?path=%s"%" OR ".join(ids))
1009:
1010: def createAllFilesAsSingleFile(self,RESPONSE=None):
1011: """download all files"""
1012:
1013: def sortF(x,y):
1014: return cmp(x[0],y[0])
1015:
1016: catalog=getattr(self,self.default_catalog)
1017: #tf,tfilename=mkstemp()
1018:
1019:
1020: list=[(x.getId,x) for x in catalog()]
1021: list.sort(sortF)
1022:
1023: RESPONSE.setHeader("Content-Disposition","""attachement; filename=%s"""%"all.atf")
1024: RESPONSE.setHeader("Content-Type","application/octet-stream")
1025:
1026: for l in list:
1027: obj=l[1].getObject()
1028:
1029: if obj.meta_type=="CDLI file":
1030:
1031: #os.write(tf,obj.getLastVersion().data)
1032: if RESPONSE:
1033: RESPONSE.write(obj.getLastVersion().data)
1034: #os.close(tf)
1035: #RESPONSE.redirect(self.absolute_url()+"/downloadFile?fn="%tfilename)
1036: return True
1037:
1038: def downloadFile(self,fn):
1039: """download fn - not used yet"""
1040: self.REQUEST.RESPONSE.setHeader("Content-Disposition","""attachement; filename=%s"""%self.getLastVersion().getId())
1041: self.REQUEST.RESPONSE.setHeader("Content-Type","application/octet-stream")
1042: self.REQUEST.RESPONSE.write(file(fn).read())
1043:
1044:
1045:
1046: def hasParent(self):
1047: """returns true falls subfolder"""
1048:
1049: if self.aq_parent.meta_type in self.folderMetaType:
1050: return True
1051: else:
1052: return False
1053:
1054: def getFolders(self):
1055: """get all subfolders"""
1056: ret=[]
1057: folders=self.ZopeFind(self,obj_metatypes=self.folderMetaType)
1058: for folder in folders:
1059: ret.append((folder[1],
1060: len(self.ZopeFind(folder[1],obj_metatypes=self.folderMetaType)),
1061: len(self.ZopeFind(folder[1],obj_metatypes=self.filesMetaType))
1062: ))
1063: return ret
1064:
1065:
1066: def getFolders_OLD(self):
1067: """get all subfolders"""
1068: ret=[]
1069: folders=self.ZopeFind(self,obj_metatypes=self.folderMetaType)
1070: for folder in folders:
1071: ret.append((folder[1],
1072: len(self.ZopeFind(folder[1],obj_metatypes=self.folderMetaType)),
1073: len(getattr(self,self.default_catalog)({'path':folder[0]}))
1074: ))
1075: return ret
1076:
1077: def index_html(self):
1078: """main"""
1079: ext=self.ZopeFind(self,obj_ids=["index.html"])
1080: if ext:
1081: return ext[0][1]()
1082:
1083: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','CDLIFileFolderMain')).__of__(self)
1084: return pt()
1085:
1086: def importFiles(self,comment="",author="" ,folderName="/Users/dwinter/Documents/workspace/cdli/atf", files=None):
1087: """import files"""
1088:
1089: if not files:
1090: files=os.listdir(folderName)
1091:
1092: for f in files:
1093: folder=f[0:3]
1094: f2=f[0:5]
1095: obj=self.ZopeFind(self,obj_ids=[folder])
1096:
1097: if not obj:
1098: manage_addCDLIFileFolder(self,folder,folder)
1099: fobj=getattr(self,folder)
1100:
1101: else:
1102: fobj=obj[0][1]
1103:
1104: obj2=fobj.ZopeFind(fobj,obj_ids=[f2])
1105:
1106: if not obj2:
1107: manage_addCDLIFileFolder(fobj,f2,f2)
1108: fobj2=getattr(fobj,f2)
1109:
1110: else:
1111: fobj2=obj2[0][1]
1112:
1113: file2=file(os.path.join(folderName,f))
1114: id=f
1115: manage_addCDLIFile(fobj2,f,'','')
1116: id=f
1117: ob=fobj2._getOb(f)
1118: ob.title=id
1119:
1120: manage_addCDLIFileObject(ob,id,comment,author,file2,content_type='')
1121: self.CDLICatalog.catalog_object(ob)
1122: #self.CDLICatalog.manage_catalogFoundItems(obj_ids=[id],search_sub=1)
1123: #self.CDLICatalog.manage_catalogObject(self.REQUEST, self.REQUEST.RESPONSE, 'CDLICatalog', urlparse.urlparse(ob.absolute_url())[1])
1124:
1125: return "ok"
1126:
1127: manage_addCDLIFileFolderForm=DTMLFile('dtml/folderAdd', globals())
1128:
1129:
1130: def manage_addCDLIFileFolder(self, id, title='',
1131: createPublic=0,
1132: createUserF=0,
1133: REQUEST=None):
1134: """Add a new Folder object with id *id*.
1135:
1136: If the 'createPublic' and 'createUserF' parameters are set to any true
1137: value, an 'index_html' and a 'UserFolder' objects are created respectively
1138: in the new folder.
1139: """
1140: ob=CDLIFileFolder()
1141: ob.id=str(id)
1142: ob.title=title
1143: self._setObject(id, ob)
1144: ob=self._getOb(id)
1145:
1146: checkPermission=getSecurityManager().checkPermission
1147:
1148: if createUserF:
1149: if not checkPermission('Add User Folders', ob):
1150: raise Unauthorized, (
1151: 'You are not authorized to add User Folders.'
1152: )
1153: ob.manage_addUserFolder()
1154:
1155:
1156: if REQUEST is not None:
1157: return self.manage_main(self, REQUEST, update_menu=1)
1158:
1159:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>