# -*- coding: utf-8 # $Id$ # # Copyright 2001, 2002 by IVA Team and contributors # # This file is part of IVA. # # IVA is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # IVA is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with IVA; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA """Contains class WebtopItem, which contains common methods that are inherited to all specific webtop items.""" __version__ = "$Revision$"[11:-2] #from Globals import Persistent, HTMLFile import AccessControl import Globals import OFS from AccessControl import ClassSecurityInfo from Products.ZCatalog.CatalogPathAwareness import CatalogAware import time import re from common import translate import TraversableWrapper #from UserInfo import UserInf from common import perm_view, perm_edit, perm_manage, perm_add_lo, \ get_local_roles, get_roles from Errors import FleError from Cruft import Cruft class WebtopItem( CatalogAware, TraversableWrapper.Traversable, AccessControl.Role.RoleManager, Globals.Persistent, #OFS.SimpleItem.Item, #OFS.Folder.Folder Cruft,): """A generic Webtop item. This is an 'abstract' class and should not be used directly. Instantiate a WebtopFile, WebtopFolder, WebtopLink or WebtopMemo instead.""" meta_type = "WebtopItem" security = ClassSecurityInfo() def __init__(self, parent, name): """Construct the webtop item object. NOTE: This constructor must be called from the subclass's constructor.""" self.default_catalog = 'catalog_webtop_items' if parent: self.id = parent.generate_id() else: self.id = 'wt0' self.set_name(name) self.set_icon('document_gif.gif') self.do_stamp() self.weight = 1000 self.userComments = [] self.docStatus = 0 self.userRating = None self.userCommentsAllowed = 1 self.commentsVisible = 1 self.ratingVisible = 1 self.userRatingAllowed = 1 self.objPermission = 0 # default viewable by the same course members self.timeFunc = 0 self.timeLimitStart = time.time() #not sure this is needed self.timeLimitEnd = time.time() #not sure this is needed self.subgroup_public = '' security.declarePrivate('manage_afterAdd') def manage_afterAdd(self,item,container): """...""" # Check if we're being added inside a Webtop (not inside a GroupFolder) # and if our owner differs from the webtop owner, change ownership import Webtop import GroupFolderProxy ob=self.parent() whi_alg = time.time() while 1: if isinstance(ob,Webtop.Webtop): #raise 'foo',"YES, it's a webtop!" if self.get_author_name() != ob.parent().get_uname(): self.set_author(ob.parent().get_uname()) elif isinstance(ob,GroupFolderProxy.GroupFolderProxy): break try: ob=ob.parent() except: break whi_lopp = time.time() self.findWeight() self.index_object() for x in self.aq_chain[:-1]: try: if x.is_assignment(): self.setObjPermission(4) #self.setObjPermission(x.getObjPermission()) if getattr(x, 'subgroup_top', None): self.setObjPermission(20) except AttributeError: pass security.declarePrivate('manage_beforeDelete') def manage_beforeDelete(self, item, container): """ manage before delete """ self.unindex_object() url = self.getRelativeURL(self) self.Statistics.delObjectHistory(url) def findWeight(self): algus = 1000 suurused = [] for mini in self.aq_parent.objectValues(): if mini.get_id() == self.get_id(): continue if hasattr(mini,'weight'): suurused.append(mini.weight) weight_found = 0 while not weight_found: if algus in suurused: algus = algus - 1 else: self.weight = algus weight_found = 1 return self.weight security.declareProtected(perm_view,'get_timestamp') def get_timestamp(self): """Return timestamp in time.time() format.""" return self.__timestamp security.declarePrivate('set_timestamp') def set_timestamp(self,time): """Set timestamp to new value.""" self.__timestamp=time security.declarePrivate('do_stamp') def do_stamp(self): """Set timestamp to current time.""" self.__timestamp = time.time() security.declareProtected(perm_view, 'getRelativeContentURL') def getRelativeContentURL(self): """ relative url from portal root """ return self.getRelativeURL(self) security.declarePrivate('set_icon') def set_icon(self, img): """Sets the icon path for this webtop item.""" self.iconpath=img security.declareProtected(perm_view,'get_icon') def get_icon(self): """Returns the icon object for the path stored in this item.""" if self.iconpath.endswith('_gif'): self.iconpath += '.gif' try: return self.unrestrictedTraverse(self.iconpath) except KeyError: return None security.declareProtected(perm_view, 'get_icon_tag') def get_icon_tag(self): """ return img tag """ if self.iconpath.endswith('_gif'): self.iconpath += '.gif' return """""" % (self.fle_root().absolute_url()+'/'+self.iconpath.split('/')[-1]) # FIXME: Add comment security.declareProtected(perm_view,'get_list_item_name') def get_list_item_name(self, REQUEST=None): """Returns the displayable string to be used when the item is shown in a folder contents list.""" return self.get_name() security.declareProtected(perm_view,'get_name') def get_name(self): """Returns the name of this item.""" return self.title security.declareProtected(perm_view,'get_name') def getTitle(self): """Returns the name of this item.""" return self.title security.declarePrivate('set_name') def set_name(self,newname): """Changes the name of this item.""" self.title=newname security.declareProtected(perm_view, 'get_author') def get_author(self): """Return author (owner) of this item.""" return self.getOwnerTuple()[1] def get_author_name(self): owner = self.getOwner() if not owner: return '' try: return owner.name except AttributeError: return owner.getUserName() security.declarePrivate('set_author') def set_author(self,author): """Set the author (owner) of this item.""" self.manage_setLocalRoles(author,('Owner',)) security.declarePrivate('get_content') def get_content(self): """This must be overridden in inherited class""" raise 'FLE Error', 'method get_content() not implemented.' security.declareProtected(perm_view,'get_size') def get_size(self): """Return size (in bytes) of the WebTop item. this must be overridden in inherited class.""" raise 'FLE Error', 'method get_size() not implemented.' def viimaneMuutus(self): "Viimane muutmisaeg" return self.get_timestamp() security.declareProtected(perm_view,'get_printable_size') def get_printable_size(self, REQUEST): """Return pritable size: scaled size + unit.""" size = self.get_size() if size >= 1024*1024: size = size / (1024.0 * 1024) retval = str(round(size, 1)) + ' ' + translate(self,'MB',target=self.giveLanguage(REQUEST)) elif size >= 1024: size = size / 1024.0 retval = str(round(size, 1)) + ' ' + translate(self,'KB',target=self.giveLanguage(REQUEST)) else: # Why don't we return the real size of small objects? retval = '1 ' + translate(self,'KB',target=self.giveLanguage(REQUEST)) return retval security.declareProtected(perm_edit, 're_index') def re_index(self): """ reindexes webtop """ raskus = 1000 for wi in self.objectValues(): wi.weight = raskus raskus = raskus + 1 return "done, hit back button" security.declareProtected(perm_edit, 'kaal') def kaal(self,REQUEST,alla=0,yles=0): """ kaal """ if not alla: alla = 0 if not yles: yles = 0 if not alla and not yles: return miinimum = 10000 maksimum = 1 for mini in self.aq_parent.objectValues(): if mini.get_id() == self.get_id(): continue try: if mini.weight < miinimum: miinimum = mini.weight if mini.weight > maksimum: maksimum = mini.weight except: mini.findWeight() if alla: if self.weight > miinimum or self.weight == miinimum: self.weight = self.weight-1 else: if self.weight < maksimum or self.weight == maksimum: self.weight = self.weight+1 suurused = [] for mini in self.aq_parent.objectValues(): if mini.get_id() == self.get_id(): continue if mini.weight == self.weight: if alla: mini.weight = mini.weight + 1 else: mini.weight = mini.weight - 1 found_weight = 0 while not found_weight: if self.weight in suurused: self.weight = self.weight + 1 else: found_weight = 1 #return dir(self) REQUEST.RESPONSE.redirect(self.aq_parent.absolute_url()+"?suund=weight") def may_edit(self,uname): """Returns whether user may edit this object or not.""" ## raise 'foo',str(self.get_local_roles()) + " vs. " + str(get_local_roles(self,uname)) + " with " + uname ## raise 'foo',self.get_name() + str(get_local_roles(self,uname)) objs = self.aq_chain for x in objs: if hasattr(x, '_is_subgroup'): if x._is_subgroup: #XXX: do the role checking lr = x.aq_self.get_local_roles() for y in lr: if str(y[0])==str(uname): return 1 if self.get_id() == 'subgroups': return 0 if 'Owner' in get_local_roles(self,uname): return 1 if 'Teacher' in get_roles(self,uname): return 1 if 'Manager' in get_roles(self,uname): return 1 return 0 security.declareProtected(perm_view, 'postComment') def postComment(self, REQUEST=None, addcomment='', comment='notCommentable', rating=None, cStatus=0,uname='',date=0): """ post user comment """ import time error = 0 if comment == 'notCommentable': comment = '' if not self.isCommentable() and not self.isRateable(): return REQUEST.RESPONSE.redirect('wt_usercomments?error=2') if not addcomment: return REQUEST.RESPONSE.redirect('wt_usercomments?error=1') if not self.isCommentable() and self.isRateable() and rating==None: error = 1 if not self.isRateable() and self.isCommentable() and comment=='notCommentable': error = 1 if comment == '' and rating == None: return REQUEST.RESPONSE.redirect('wt_usercomments?error=3') if date: timestamp = date else: timestamp = time.time() input = [] if uname and not REQUEST: input.append(uname) else: input.append(str(REQUEST.AUTHENTICATED_USER)) input.append(cStatus) input.append(timestamp) input.append(str(rating)) input.append(comment) self.userComments.append(input) # self.userComments.append((REQUEST.AUTHENTICATED_USER,str(rating),timestamp,comment),) self.userComments = self.userComments komm = self.getComments() count = 0 total = 0 for x in komm: if x[3] == None or x[3] == 'None' or x[1]!=0: continue count = count + 1 total = total + int(x[3]) if not count or not total: self.userRating = None else: self.userRating = total/count self.userRating = self.userRating if REQUEST: return REQUEST.RESPONSE.redirect('../index_html') else: return 1 security.declareProtected(perm_view, 'getComments') def getComments(self, REQUEST=None): """ get user comment """ return self.userComments security.declareProtected(perm_view, 'getCommentCount') def getCommentCount(self): """ counts comments """ return str(len(self.userComments)) def getDocStatus(self, REQUEST=None): return self.docStatus def hasComments(self): if self.userComments != []: return 1 else: return 0 def hasRating(self): if self.userRating != None: return 1 else: return 0 def getRating(self): return self.userRating def wordStatus(self,REQUEST, number): number = int(number) stats = ('Unset','','Draft','','Revising','','Final') return stats[number] def wordRating(self,REQUEST, number): if number == None: return 'not rated' if number == 'None': number = 0 else: try: number = int(number) except: number = 6 ratings = ('not rated','Bad','Poor','Average','Good','Excellent','System error') return ratings[number] def zeroComments(self): """ deletes all comments """ self.userComments = [] self.userComments = self.userComments return "done" def isCommentable(self): return getattr(self.aq_self, 'userCommentsAllowed') def isCommentsVisible(self): return getattr(self.aq_self, 'commentsVisible') def isRatingVisible(self): return getattr(self.aq_self, 'ratingVisible') security.declarePrivate('setCommentsVisible') def setCommentsVisible(self,value=0): self.commentsVisible = int(value) return self.commentsVisible security.declarePrivate('setRatingVisible') def setRatingVisible(self,value=0): self.ratingVisible = int(value) return self.ratingVisible def isRateable(self): return getattr(self.aq_self, 'userRatingAllowed') security.declarePrivate('setCommentable') def setCommentable(self, value=0): if value == '1' or value == 1: self.userCommentsAllowed = 1 else: self.userCommentsAllowed = 0 return self.userCommentsAllowed security.declarePrivate('setRateable') def setRateable(self, value=0): if value == '1': self.userRatingAllowed = 1 else: self.userRatingAllowed = 0 return self.userRatingAllowed security.declarePrivate('setStatus') def setStatus(self, value=0): #XXX: weird things happen if self==folder # wt_itemProp form doesn't have these fields try: self.docStatus = int(value) self.docStatus = self.docStatus except: pass return self.docStatus def getObjPermission(self): return self.objPermission security.declarePrivate('setObjPermission') def setObjPermission(self, value=0): if int(value) == 10: # everyone should be able to access it... self.manage_permission('View', ('Anonymous',), 1) else: self.manage_permission('View', (), 1) self.objPermission = int(value) self.objPermission = self.objPermission return self.objPermission security.declarePrivate('setTimeFunc') def setTimeFunc(self, value=0): self.timeFunc = int(value) self.timeFunc = self.timeFunc return self.timeFunc def getTimeFunc(self): return self.timeFunc security.declarePrivate('setTimeLimits') def setTimeLimits(self, start=0, end=0): self.timeLimitStart=start self.timeLimitEnd=end return 1 def getTimeBar(self, muutuja, aeg=0): if not aeg: aeg = time.time() from YlTest import LahendusLuba abi = LahendusLuba() return abi.ajaMuutmisElemendid(muutuja, aeg) def getStartTime(self): return self.timeLimitStart def getEndTime(self): return self.timeLimitEnd security.declarePrivate('setUsers') def setUsers(self, uname): # gives user a permission to view object #print self.fle_root().fle_users.is_valid_uname(uname) if self.fle_root().fle_users.leiaKasutajaKataloog(uname): old_roles = get_local_roles(self,uname) if 'Items' not in old_roles: new_roles = old_roles+('Items',) else: new_roles = old_roles self.manage_setLocalRoles(uname,new_roles) # try: #XXX: this is wrong! ui = self.fle_root().fle_users.get_user_info(uname) ui.setLongLink(self.aq_parent.absolute_url()+'/'+self.id) # except: # pass else: pass security.declarePrivate('removeUsers') def removeUsers(self,uname): if self.fle_root().fle_users.is_valid_uname(uname): old_roles = self.get_local_roles_for_userid(uname) new_roles = () for role in old_roles: if role!='Items': new_roles += (role,) if not new_roles: self.manage_delLocalRoles((uname,)) #delRoles takes tuple! else: self.manage_setLocalRoles(uname,new_roles) try: ui = self.fle_root().fle_users.get_user_info(uname) ui.unsetLongLink(self.absolute_url()) except: pass return 1 def hasPermissionToView(self,REQUEST): # student who has been assigned peer review task gets permission. Ofcourse, we check if # it IS an assignment folder. is_assign = self.is_assignment() try: is_parent_assign = self.aq_parent.is_assignment() except: is_parent_assign = 0 if is_assign or is_parent_assign: #thisAssign = self.kysiToo(REQUEST) thisAssign = self.get_assignment() m = self.absolute_url().split('/') jargmine = 0 selle_kausta_omanik = '' for x in m: if jargmine: selle_kausta_omanik = x break if x == 'fle_users': jargmine = 1 #get list of assignments. #get id of this assignment #filter out peer review assignments and see if list has this assignment id in it. nr = self.jooksva_kursuse_nr(REQUEST) as = getattr(self.fle_root().courses, str(nr)).kodutood list = as.listAssignments() tmp = [] for x in list: if int(x.getRawType()) == 4: tmp.append(x) for x in tmp: if x.hwID == thisAssign.get_id(): unames = x.getReviewers(str(REQUEST.AUTHENTICATED_USER)) if selle_kausta_omanik in unames: return 1 return 1 if self.getObjPermission()==10: return 1 if self.getOwnerTuple()[1] == str(REQUEST.AUTHENTICATED_USER): return 1 if self.getTimeFunc() and self.getStartTime()time.time(): # we fit timelimits pass elif not self.getTimeFunc(): #XXX: why is that here? pass else: return 0 if self.getObjPermission()==0: #XXX:check once more, if user is in give course if self.is_student(REQUEST) or self.kas_opetaja(REQUEST): return 1 elif self.getObjPermission()==6: #XXX:check if given user is owner of this object if self.getOwnerTuple()[1]==str(REQUEST.AUTHENTICATED_USER): return 1 else: return 0 elif self.getObjPermission()==4: if self.kas_opetaja(REQUEST): return 1 else: return 0 elif self.getObjPermission()==2: # see if given user has some rights if 'Items' in self.get_local_roles_for_userid(str(REQUEST.AUTHENTICATED_USER)): return 1 else: return 0 if self.getObjPermission()==20: tmp = getattr(self.fle_root().courses, self.jooksva_kursuse_nr(REQUEST)).subgroups # XXX: gives error. try: x = getattr(tmp, self.getSubgroupName()) except AttributeError: # if we can't get subgroup name, assume user can view it return 1 #XXX: do the role checking lr = x.aq_self.get_local_roles() for y in lr: if str(y[0])==str(REQUEST.AUTHENTICATED_USER): return 1 return 0 def listLocalUserRoles(self,roll): """ lists userroles """ roles = self.get_local_roles() uname=() for role in roles: if roll in role[1]: uname += (role[0],) return uname def hasLocalRole(self,uid,role): """ if user has local role """ if role in self.get_local_roles_for_userid(uid): return 1 else: return 0 def getSubgroupName(self): """ return subgroup name for which object is public """ sg = self.aq_self.subgroup_public if not sg: for x in self.aq_chain[:-1]: try: if x.aq_self.subgroup_public: self.setSubgroupName(x.aq_self.subgroup_public) return x.aq_self.subgroup_public except: return "" else: return sg security.declarePrivate('setSubgroupName') def setSubgroupName(self, sgname): """ set subgroup name for which object is public """ self.aq_self.subgroup_public = sgname security.declareProtected(perm_edit,'itemPropPoster') def itemPropPoster(self, REQUEST, ifcomment=0, saveProp='', ifrateable=0, docStatus='', objPermission='', ifShowComment=0, ifShowRating=0, permissionWho=0, timeFunc=0,subgroup_name=''): """ saves object properties """ if not saveProp: return REQUEST.RESPONSE.redirect('wt_itemProperties?error=1') self.setCommentable(ifcomment) self.setRateable(ifrateable) self.setStatus(docStatus) self.setObjPermission(objPermission) if subgroup_name and int(objPermission)==20: self.setSubgroupName(subgroup_name) self.setCommentsVisible(ifShowComment) self.setRatingVisible(ifShowRating) # self.setExtendedPermission(permissionWho) self.setTimeFunc(timeFunc) from common import mkTime self.setTimeLimits(mkTime(REQUEST,'Starting'), mkTime(REQUEST,'Ending')) return REQUEST.RESPONSE.redirect('index_html') security.declareProtected(perm_edit, 'itemPropUsers') def itemPropUsers(self, REQUEST=None, removePropUser='', savePropUser='', unames='', uname_hand=''): """ gives or takes permission to view object """ import types if savePropUser: if unames: if type(unames) is types.StringType: unames = (unames,) for uname in unames: self.setUsers(uname) if uname_hand: self.setUsers(uname_hand) elif removePropUser: if type(unames) is types.StringType: unames = (unames,) for uname in unames: self.removeUsers(uname) if REQUEST is not None: return REQUEST.RESPONSE.redirect("wt_userForm") else: return 1 security.declareProtected(perm_view, 'isFreshObject') def isFreshObject(self, REQUEST): """ has user seen this object or is this new or changed """ lastVisit = self.Statistics.getLastVisitTime( REQUEST, self.getRelativeURL(self), str(REQUEST.AUTHENTICATED_USER) ) lastChange = self.lastModification() return lastChange>lastVisit security.declareProtected(perm_view, 'is_assignment') def is_assignment(self): """ this is not assignment folder """ return 0 Globals.InitializeClass(WebtopItem) # EOF