1: ###objects to store and manage objects in baskets
2:
3: import os
4: import os.path
5: import urllib
6: import cgi
7:
8:
9: from OFS.OrderedFolder import OrderedFolder
10: from OFS.SimpleItem import SimpleItem
11:
12: from AccessControl import ClassSecurityInfo
13: from AccessControl.User import UserFolder
14: from Globals import InitializeClass
15: from Globals import DTMLFile
16: import Globals
17: from Products.PageTemplates.PageTemplateFile import PageTemplateFile
18: from Products.PageTemplates.PageTemplate import PageTemplate
19: from Products.PageTemplates.ZopePageTemplate import ZopePageTemplate
20: from Globals import Persistent, package_home
21: from Acquisition import Implicit
22: from Products.ZCatalog.CatalogPathAwareness import CatalogAware
23:
24: refBasis="http://vlp.mpiwg-berlin.mpg.de/references?id=%s"
25: #basis url for references
26:
27: publicationStatus=['private','restricted','open','published']
28: # private only access for the owner, restricted only for users in accessGroup, open open for everyone, published occurs in basket list
29:
30: class Basket(OrderedFolder):
31: """Basket class"""
32:
33: meta_type="basket"
34:
35: security=ClassSecurityInfo()
36:
37: manage_options=OrderedFolder.manage_options+(
38: {'label':'manage main','action':'changeBasketForm'},
39: )
40:
41: def __init__(self,id,title,comment,owner,publicationStatus,shortDescription,accessGroups=None):
42: '''
43: init the basket
44: @param id: id
45: @param title: title of the basket
46: @param comment: description of the basket
47: @param shortDescription: short description of the basket for the overviewList
48: @param owner: user object describing the owner
49: @param publication_status: one of publicationStatus if restricted, optional parameter accessGroups has to be set
50: @param aaccessGroups: default value is none, contains list of groups which are allowed to access this basket
51: '''
52:
53: self.id=id
54: self.title=title
55: self.comment=comment
56: self.owner=owner
57: self.publicationStatus=publicationStatus
58: self.accessGroups=accessGroups
59: self.shortDecription=shortDescription
60:
61: security.declareProtected('View','getOwner')
62:
63: def getNewId(self):
64: """createIds"""
65: last=getattr(self,'last',0)
66: last +=1
67: while len(self.ZopeFind(self,obj_ids=[str(last)]))>0:
68: last+=1
69: return last
70:
71: def addBasketText(self,REQUEST=None):
72: """add a text"""
73: id=self.getNewId()
74: manage_addBasketText(self,str(id),'','',RESPONSE=None)
75: if REQUEST:
76: REQUEST.RESPONSE.redirect(self.absolute_url()+"/manageBasket")
77:
78: def deleteObject(self,id,REQUEST=None):
79: """delete object"""
80: self.manage_delObjects([id])
81: if REQUEST:
82: REQUEST.RESPONSE.redirect(self.absolute_url()+"/manageBasket")
83:
84: def moveUp(self,id,REQUEST=None):
85: """move id one up"""
86: self.moveObjectsUp([id], 1)
87: if REQUEST:
88: REQUEST.RESPONSE.redirect(self.absolute_url()+"/manageBasket")
89:
90: def moveDown(self,id,REQUEST=None):
91: """move id one up"""
92: self.moveObjectsDown([id], 1)
93: if REQUEST:
94: REQUEST.RESPONSE.redirect(self.absolute_url()+"/manageBasket")
95:
96: def moveTop(self,id,REQUEST=None):
97: """move to top"""
98: self.moveObjectsToTop([id])
99: if REQUEST:
100: REQUEST.RESPONSE.redirect(self.absolute_url()+"/manageBasket")
101:
102: def moveBottom(self,id,REQUEST=None):
103: """move to top"""
104: self.moveObjectsToBottom([id])
105: if REQUEST:
106: REQUEST.RESPONSE.redirect(self.absolute_url()+"/manageBasket")
107:
108: def getOwner(self):
109: """get Owner as string"""
110: return self.owner
111:
112: def changeBasketForm(self):
113: """form for changing the basket"""
114: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','changeBasket.zpt')).__of__(self)
115: return pt()
116:
117: def changeBasket(self,title,comment,shortDescription,publicationStatus=None,username=None,accessGroups=None,RESPONSE=None,target=None):
118: '''
119: init the basket
120: @param title: title of the basket
121: @param comment: description of the basket
122: @param owner: user object describing the owner
123: @param publication_status: one of publicationStatus if restricted, optional parameter accessGroups has to be set
124: @param aaccessGroups: default value is none, contains list of groups which are allowed to access this basket
125: '''
126: #TODO:what happens in username does not exists
127: #find username
128: owner=username
129:
130: self.title=title
131: self.comment=comment
132: if owner:
133: self.owner=owner
134: if publicationStatus:
135: self.publicationStatus=publicationStatus
136: if accessGroups:
137: self.accessGroups=accessGroups
138: self.shortDescription=shortDescription
139:
140:
141: if RESPONSE is not None:
142: if target:
143: RESPONSE.redirect(target)
144: else:
145: RESPONSE.redirect('manage_main')
146:
147: def index_html(self):
148: """generische ansicht"""
149:
150: if hasattr(self,"BasketMain_template"):
151: obj=getattr(self,"BasketMain_template")
152: return obj()
153: else:
154: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','BasketMain_template_standard.zpt')).__of__(self)
155: pt.content_type="text/html"
156: return pt()
157:
158: def manageBasket(self):
159: """manage the basket"""
160:
161: if hasattr(self,"BasketMain_manage_template"):
162: obj=getattr(self,"BasketMain_manage_template")
163: return obj()
164: else:
165: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','BasketMain_manage_template_standard.zpt')).__of__(self)
166: pt.content_type="text/html"
167: return pt()
168:
169: def isAuthorized(self,role="read"):
170: """check whether actual user is authorized"""
171: #TODO implement isAuthorized to do type, read or edit
172: return True
173:
174: def getActualUserName(self):
175: """get username of actual user"""
176: return self.REQUEST['AUTHENTICATED_USER'].getUserName()
177:
178: def getObjects(self):
179: """"get objects"""
180: return [getattr(self,x['id']) for x in self._objects]
181:
182: def numberOfObjects(self):
183: """anzahl der elemente im basket"""
184: return len(self._objects)
185:
186: def changeBasketComments(self,REQUEST):
187: """Change comment of basket elements"""
188: form=REQUEST.form
189:
190: for key in form.keys():
191: splitted=key.split("_")
192: objects=self.ZopeFind(self,obj_ids=[splitted[0]])
193: if len(objects)>0:
194: objects[0][1].comment=form[key]
195:
196: if REQUEST:
197: REQUEST.RESPONSE.redirect(self.absolute_url()+"/manageBasket")
198:
199:
200: def selectThisBasketAsCurrent(self,REQUEST=None):
201: """select this basket for further work"""
202: REQUEST.RESPONSE.setCookie('vlp_basket',self.getId(),path="/")
203:
204: if REQUEST:
205: REQUEST.RESPONSE.redirect(self.absolute_url()+"/manageBasket")
206:
207: def getCurrentBasket(self):
208: """select this basket for further work"""
209: return self.REQUEST.cookies.get('vlp_basket',None)
210:
211: def generateNewObject(self,type,link,title='',comment='',REQUEST=None):
212: """generate a new object in the basket"""
213:
214: if type=="xref":
215:
216: splitted=urllib.unquote(link).split("?")
217: if len(splitted)>1:
218: #assumes references id is contained in the url as parameter id=
219: params=cgi.parse_qs(splitted[1])
220: xref=params.get('id',None)
221: return False
222: else:
223: #addumes link contains only the reference id
224: xref=link
225:
226: id=self.getNewId()
227: title=""
228:
229: if xref is None:
230: #no parameter id
231: return False
232: manage_addBasketXRef(self,str(id),title,comment,xref)
233:
234: if REQUEST:
235: REQUEST.RESPONSE.redirect(REQUEST['HTTP_REFERER'])
236: else:
237: return True
238:
239: def manage_addBasketForm(self):
240: """form for adding a basket"""
241: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addBasket.zpt')).__of__(self)
242: return pt()
243:
244: def manage_addBasket(self,id,title,comment,username,publicationStatus,accessGroups=None,RESPONSE=None):
245: """add a basket object"""
246: #TODO:what happens in username does not exists
247: #find username
248: owner=username
249:
250: newObj=Basket(id,title,comment,owner,publicationStatus,accessGroups=None)
251:
252: self._setObject(id,newObj)
253:
254: if RESPONSE is not None:
255: RESPONSE.redirect('manage_main')
256:
257: class BasketBasis(SimpleItem):
258: """basic class for baskets"""
259:
260: security=ClassSecurityInfo()
261:
262: manage_options=SimpleItem.manage_options+(
263: {'label':'manage main','action':'changeBasketBasisForm'},
264: )
265:
266: def __init__(self,id,title,comment):
267: '''
268: init basket basis
269: @param id: id
270: @param title: title
271: @param comment commentar:
272: '''
273: self.id=id
274: self.title=title
275: self.comment=comment
276:
277: def changeBasketBasisForm(self):
278: """form for changing the basket"""
279: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','changeBasketBasis.zpt')).__of__(self)
280: return pt()
281:
282: def changeBasketBasis(self,title,comment,RESPONSE=None):
283: '''
284: init the basket
285: @param title: title of the basket
286: @param comment: description of the basket
287: '''
288:
289: self.title=title
290: self.comment=comment
291:
292: if RESPONSE is not None:
293: RESPONSE.redirect('manage')
294:
295: def linkToObject(self):
296: """generate url to open the resource, has to be implemented in the different objects, generic return None"""
297: return None
298:
299: def content_html(self,type):
300: """generische ausgabe des objectes als html"""
301: if hasattr(self,type+"_template"):
302: obj=getattr(self,type+"_template")
303: return obj()
304: else:
305: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','%s_template_standard.zpt'%type)).__of__(self)
306: pt.content_type="text/html"
307: return pt()
308:
309: class BasketXRef(BasketBasis):
310: """class for internal references based on xrefs"""
311:
312: security=ClassSecurityInfo()
313: meta_type="BasketXRef"
314:
315: manage_options=BasketBasis.manage_options+(
316: {'label':'manage xref','action':'changeBasketXRefForm'},
317: )
318:
319: def changeBasketXRefForm(self):
320: """form for changing the basket"""
321: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','changeBasketXRef.zpt')).__of__(self)
322: return pt()
323:
324: def changeBasketXRef(self,xref,RESPONSE=None):
325: '''
326: change the basket
327: @param xref: reference
328: '''
329:
330: self.xref=xref
331:
332: if RESPONSE is not None:
333: RESPONSE.redirect('manage')
334:
335: def linkToObject(self):
336: """generate url to open the resource"""
337: return refBasis%self.xref
338:
339: def content_html(self):
340: """format object as html fragment"""
341:
342: type=self.xref[0:3]
343: return BasketBasis.content_html(self,"BasketXRef_%s"%type)
344:
345: def manage_addBasketXRefForm(self):
346: """form for adding a basket"""
347: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addBasketXRef.zpt')).__of__(self)
348: return pt()
349:
350: def manage_addBasketXRef(self,id,title,comment,xref,RESPONSE=None):
351: """add a basketXRef object"""
352:
353:
354: newObj=BasketXRef(id,title,comment)
355: newObj.xref=xref
356:
357: self._setObject(id,newObj)
358:
359: if RESPONSE is not None:
360: RESPONSE.redirect('manage_main')
361:
362: class BasketInternalLink(BasketBasis):
363: """class for internal referencens based on links"""
364:
365: security=ClassSecurityInfo()
366: meta_type="BasketInternalLink"
367:
368: manage_options=BasketBasis.manage_options+(
369: {'label':'manage internal link','action':'changeBasketInternalLinkForm'},
370: )
371:
372: def changeBasketInternalLinkForm(self):
373: """form for changing the basket"""
374: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','changeBasketInternalLink.zpt')).__of__(self)
375: return pt()
376:
377: def changeBasketInternalLink(self,link,linkText,RESPONSE=None):
378: '''
379: change the Internallink
380: @param link: reference
381: @param linkText: reference
382: '''
383:
384: self.link=link
385: self.linkText=linkText
386:
387: if RESPONSE is not None:
388: RESPONSE.redirect('manage')
389:
390: def content_html(self):
391: """format object as html fragment"""
392:
393: return BasketBasis.content_html(self,"BasketInternalLink")
394:
395: def linkToObject(self):
396: """link to the object (internalLink)"""
397: return self.link
398:
399: def manage_addBasketInternalLinkForm(self):
400: """form for adding a basket"""
401: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addBasketInternalLink.zpt')).__of__(self)
402: return pt()
403:
404: def manage_addBasketInternalLink(self,id,title,comment,link,linkText,RESPONSE=None):
405: """add a basketXRef object"""
406:
407:
408: newObj=BasketInternalLink(id,title,comment)
409: newObj.link=link
410: newObj.linkText=linkText
411:
412: self._setObject(id,newObj)
413:
414: if RESPONSE is not None:
415: RESPONSE.redirect('manage_main')
416:
417:
418: class BasketExternalLink(BasketBasis):
419: """class for external links"""
420:
421: security=ClassSecurityInfo()
422: meta_type="BasketExternalLink"
423:
424: manage_options=BasketBasis.manage_options+(
425: {'label':'manage internal link','action':'changeBasketExternalLinkForm'},
426: )
427:
428: def changeBasketExternalLinkForm(self):
429: """form for changing the basket"""
430: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','changeBasketExternalLink.zpt')).__of__(self)
431: return pt()
432:
433: def changeBasketExternalLink(self,link,linkText,RESPONSE=None):
434: '''
435: change the Externallink
436: @param link: reference
437: @param linkText: reference
438: '''
439:
440: self.link=link
441: self.linkText=linkText
442:
443: if RESPONSE is not None:
444: RESPONSE.redirect('manage')
445:
446: def content_html(self):
447: """format object as html fragment"""
448:
449: return BasketBasis.content_html(self,"BasketExternalLink")
450:
451: def linkToObject(self):
452: """link to the object (externalLink)"""
453: return self.link
454:
455: def manage_addBasketExternalLinkForm(self):
456: """form for adding a basket"""
457: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addBasketExternalLink.zpt')).__of__(self)
458: return pt()
459:
460: def manage_addBasketExternalLink(self,id,title,comment,link,linkText,RESPONSE=None):
461: """add a basket external link object"""
462:
463: newObj=BasketExternalLink(id,title,comment)
464: newObj.link=link
465: newObj.linkText=linkText
466:
467: self._setObject(id,newObj)
468:
469: if RESPONSE is not None:
470: RESPONSE.redirect('manage_main')
471:
472:
473: class BasketText(BasketBasis):
474: """class for text elements in baskets"""
475:
476: security=ClassSecurityInfo()
477: meta_type="BasketText"
478:
479: def content_html(self):
480: """format object as html fragment"""
481: return "" # text has no content
482: #return BasketBasis.content_html(self,"BasketText")
483:
484: def manage_addBasketTextForm(self):
485: """form for adding a basket"""
486: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addBasketText.zpt')).__of__(self)
487: return pt()
488:
489: def manage_addBasketText(self,id,title,comment,RESPONSE=None):
490: """add a basketXRef object"""
491:
492:
493: newObj=BasketText(id,title,comment)
494:
495: self._setObject(id,newObj)
496:
497: if RESPONSE is not None:
498: RESPONSE.redirect('manage_main')
499:
500:
501:
502:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>