Changeset 1907 for trunk/Resources.py


Ignore:
Timestamp:
07/30/07 14:21:50 (12 years ago)
Author:
jukka
Message:

Closed #1476, spent 20h. I'm allowing editing and deleting resource discussions like any other forum posts: if the discussion is deleted, new one will be created next time someone tries discussion. The default discussion post bodytext is i18n:translated, but once someone changes it, it won't try to translate it anymore.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Resources.py

    r1903 r1907  
    566566                changedFields = [x for x in set(changedFields + prev_changes) if x[0] != '_'] 
    567567            self.storeInHistory(changedFields) 
     568 
     569    def isID(self, s): 
     570        """ Stupid heuristic to decide s is an id or not. """ 
     571        if len(s) != 32: 
     572            return False 
     573        for i in range(len(s)): 
     574            if s[i] not in ['0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f']: 
     575                return False 
     576        return True                 
     577 
     578    def correctReferences(self, oldBodyText, newBodyText): 
     579        """ Delete unused references after restore. """ 
     580        oldIDs = [x for x in oldBodyText if self.isID(x)] 
     581        newIDs = [x for x in newBodyText if self.isID(x)] 
     582        real_newIDs = [x for x in newIDs if x not in oldIDs] 
     583        real_oldIDs = [x for x in oldIDs if x not in newIDs] 
     584        tool = getToolByName(self, 'reference_catalog') 
     585        for x in real_oldIDs: 
     586             tool.deleteReference(self, x, 'uses')     
    568587 
    569588    security.declareProtected(MODIFY_CONTENT, 'restoreAVersion') 
     
    953972    def setGroupsShared(self, value): 
    954973        """ share a material/resource with a group(s) """ 
    955         # adjust security to members of portal 
     974        gtool = getToolByName(self, 'portal_groups') 
     975        reftool= getToolByName(self, 'reference_catalog') 
    956976        create_new = self.REQUEST.get('new_group_name', '') 
     977        blog=None 
    957978        if create_new and value=='__new_group': 
    958979            # create a new group here 
    959980            from Products.CMFPlone.utils import normalizeString 
    960981            new_group_id = normalizeString(create_new, context=self) 
    961             gtool = getToolByName(self, 'portal_groups') 
    962982            try: 
    963983                gtool.addGroup(new_group_id, (), ()) 
     
    969989            blog.setProperties(id=new_group_id, title=create_new, description="") 
    970990            value = new_group_id 
     991            discussion=self.getDiscussion(do_create=False) 
     992            if discussion: 
     993                self.moveDiscussion(discussion, blog)                 
     994 
    971995        if value == '__new_group': 
    972996            return 
    973997        f = self.getField('groups') 
    974998        old_value = f.get(self) 
     999        destination=None 
    9751000        if old_value: 
    9761001            if old_value!='no_group': 
     
    9791004            if value!='no_group': 
    9801005                self.manage_setLocalRoles(value, ('CoAuthor',)) 
     1006                destination = gtool.getGroupareaFolder(value) 
    9811007            else: 
    9821008                # make sure that all CoAuthors are deleted 
     
    9841010                for (key,dvalue) in roles.items(): 
    9851011                    if not 'Owner' in dvalue: self.manage_delLocalRoles((key,)) 
     1012                destination=self.community.unassigned_discussions 
     1013 
    9861014            f.set(self, value) 
     1015            discussion=self.getDiscussion(do_create=False) 
     1016            if discussion and destination: 
     1017                self.moveDiscussion(discussion, destination) 
     1018 
     1019    ######################### 
     1020    ###    Discussions    ### 
     1021    ######################### 
     1022 
     1023    def moveDiscussion(self, discussion, destination): 
     1024        """ moves a discussion from one group to another, called when resource changes groups """ 
     1025        reftool= getToolByName(self, 'reference_catalog') 
     1026        source=discussion.aq_parent 
     1027        reftool.deleteReference(discussion, self,  'is_discussion_about') 
     1028        destination.manage_pasteObjects(source.manage_cutObjects(discussion.id)) 
     1029        discussion=getattr(destination, discussion.id) 
     1030        reftool.addReference(discussion, self, 'is_discussion_about') 
     1031 
     1032 
     1033    def getDiscussion(self, do_create=True): 
     1034        """get discussion object or create one """ 
     1035        # If discussion exists, find it 
     1036        reftool= getToolByName(self, 'reference_catalog') 
     1037        obj_uid = self.UID() 
     1038        found = [] 
     1039        ref_query = { 'targetUID': obj_uid, 'type': 'is_discussion_about' } 
     1040        refresults = reftool(ref_query) 
     1041        for q in refresults: 
     1042            refobject = reftool.lookupObject(q.UID) 
     1043            source = refobject.getSourceObject() 
     1044            if source.meta_type == 'BlogPost': 
     1045                 found.append(source) 
     1046        if found: 
     1047            return found[0] 
     1048        elif not do_create: 
     1049            return None             
     1050        # If no discussion found and we do_create, then we create one 
     1051        gtool = getToolByName(self, 'portal_groups') 
     1052        group=self.getGroupsEditing() 
     1053        if group: 
     1054            group = getattr(self.community, str(group), None) 
     1055        else: 
     1056            group=self.community.unassigned_discussions 
     1057 
     1058        body=self.defaultDiscussionMessage() 
     1059        title="Discussion about %s" % self.Title() 
     1060        post_id = self.generateUniqueId('BlogPost') 
     1061        post_id=group.invokeFactory('BlogPost',post_id) 
     1062        post=getattr(group, post_id, None) 
     1063        post.edit(bodyText=body, is_discussion=True, title=title) 
     1064        post._renameAfterCreation() 
     1065        reftool.addReference(post, self, 'is_discussion_about') 
     1066        return post 
     1067 
     1068    def defaultDiscussionMessage(self, bodytext=None): 
     1069        """ return bodytext to default message or compare it with given bodytext 
     1070         (if they match we can put i18n:tags around it)""" 
     1071        body="""Here you can discuss about <a href="%s/view">%s</a>.""" % (self.absolute_url(), self.Title()) 
     1072        if bodytext: 
     1073            return body==bodytext 
     1074        else: 
     1075            return body       
    9871076 
    9881077 
Note: See TracChangeset for help on using the changeset viewer.