Annotation of cdli/cdli_files.py, revision 1.4
1.1 dwinter 1: """CDLI extensions of the filearchive"""
2: from Products.versionedFile.versionedFile import *
3: from Products.ZCatalog.CatalogPathAwareness import CatalogAware
1.2 dwinter 4: from tempfile import mkstemp,mkdtemp
1.1 dwinter 5: import os.path
6: import os
7: from types import *
1.3 dwinter 8: import urlparse
1.4 ! dwinter 9: from OFS.OrderedFolder import OrderedFolder
! 10: from OFS.SimpleItem import SimpleItem
! 11: import time
1.1 dwinter 12:
1.4 ! dwinter 13:
! 14:
! 15: class Basket_old(Folder):
! 16: """shopping basket - alte fassung """
1.1 dwinter 17:
18: meta_type="Basket"
19: _v_stack={}
20:
1.3 dwinter 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:
1.4 ! dwinter 27: else: #assume version number
1.3 dwinter 28: splitted=objId.split("_")
29: founds=self.CDLICatalog.search({'path':splitted[1]})
30: return founds[0].getObject().absolute_url()+'/'+objId
31:
1.1 dwinter 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:
1.4 ! dwinter 97: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','orizeBasketUser.zpt')).__of__(self)
1.1 dwinter 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:
1.4 ! dwinter 111: def manage_addBasket_oldForm(self):
1.1 dwinter 112: """add the basket form"""
113: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addBasket.zpt')).__of__(self)
114: return pt()
115:
1.4 ! dwinter 116: def manage_addBasket_old(self,id,title,RESPONSE=None):
1.1 dwinter 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:
1.4 ! dwinter 129: class BasketObject_old(Folder):
! 130: """Basket Object - alte fassung"""
1.1 dwinter 131:
1.2 dwinter 132: meta_type="basketObject"
1.1 dwinter 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:
1.2 dwinter 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):
1.1 dwinter 180: """download all selected files in one file"""
1.2 dwinter 181:
1.1 dwinter 182: ret=""
1.2 dwinter 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
1.1 dwinter 212: for object in self.contents:
1.2 dwinter 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:
1.1 dwinter 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")
1.2 dwinter 223: length=len(ret)
224: self.REQUEST.RESPONSE.setHeader("Content-Length",length)
1.1 dwinter 225: self.REQUEST.RESPONSE.write(ret)
1.2 dwinter 226:
227:
1.4 ! dwinter 228: def manage_addBasket_oldObjectForm(self):
1.1 dwinter 229: """add form"""
230: pass
231:
1.4 ! dwinter 232: def manage_addBasket_oldObject(self,id,title='',RESPONSE=None):
1.1 dwinter 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:
1.4 ! dwinter 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:
1.1 dwinter 659: class CDLIFileObject(versionedFileObject):
660: """CDLI file object"""
661:
662: meta_type="CDLI File Object"
663:
1.3 dwinter 664:
1.1 dwinter 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')
1.3 dwinter 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:
1.1 dwinter 778:
779:
1.2 dwinter 780: def splitatf(fh,dir=None):
781: """split it"""
1.4 ! dwinter 782: ret=None
1.2 dwinter 783: nf=None
784: for line in fh.readlines():
1.4 ! dwinter 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)
1.2 dwinter 800:
801: nf.close()
802: fh.close()
1.4 ! dwinter 803: return ret.split('_')[0],len(os.listdir(dir))
! 804:
1.1 dwinter 805: class CDLIFileFolder(versionedFileFolder):
1.4 ! dwinter 806: """CDLI File Folder"""
1.1 dwinter 807:
808: meta_type="CDLI Folder"
809: filesMetaType=['CDLI file']
810: folderMetaType=['CDLI Folder']
811: default_catalog='CDLICatalog'
812:
1.4 ! dwinter 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):
1.1 dwinter 829: """upload an atf file"""
1.3 dwinter 830: #TODO: add comments
1.2 dwinter 831: #TODO: finish uploadATF
1.4 ! dwinter 832: basketId=str(basketId)
! 833:
! 834:
! 835:
1.2 dwinter 836: dir=mkdtemp()
837: changed=[]
838: errors=[]
1.3 dwinter 839: newPs=[]
1.4 ! dwinter 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:
1.2 dwinter 849: for fn in os.listdir(dir):
1.4 ! dwinter 850: founds=self.CDLICatalog.search({'title':fn})
! 851:
1.3 dwinter 852: if len(founds)==0:
853: newPs.append(fn)
854:
1.2 dwinter 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:
1.3 dwinter 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
1.4 ! dwinter 871:
1.2 dwinter 872: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','uploadCheck.zpt')).__of__(self)
1.4 ! dwinter 873: return pt(changed=changed,errors=errors,dir=dir,newPs=newPs,basketLen=basketLen,numberOfFiles=numberOfFiles,
! 874: basketNameFromId=basketNameFromId,basketNameFromFile=basketNameFromFile,basketId=basketId)
1.2 dwinter 875:
1.4 ! dwinter 876: def uploadATFfinally(self,procedure,comment="",basketId='0',unlock=None,RESPONSE=None):
1.3 dwinter 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:
1.1 dwinter 904:
905:
1.3 dwinter 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:
1.4 ! dwinter 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:
1.3 dwinter 925: if RESPONSE is not None:
926: RESPONSE.redirect(self.aq_parent.absolute_url())
927:
928:
1.1 dwinter 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:
1.3 dwinter 1020: def importFiles(self,comment="",author="" ,folderName="/Users/dwinter/Documents/workspace/cdli/atf", files=None):
1.1 dwinter 1021: """import files"""
1022:
1.3 dwinter 1023: if not files:
1024: files=os.listdir(folderName)
1025:
1.1 dwinter 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='')
1.3 dwinter 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"
1.1 dwinter 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>