Changeset 1354


Ignore:
Timestamp:
02/08/07 17:45:03 (13 years ago)
Author:
jukka
Message:

Worked on Title clouds, spent 5 hours. Sizes are calculated right but lots of small stuff is still needed.

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/ConfigurationMethods.py

    r1342 r1354  
    279279        pass 
    280280    catalog_tool.manage_addColumn("sortable_title")     
     281    try: 
     282        catalog_tool.delColumn("UID") 
     283    except: 
     284        pass 
     285    catalog_tool.manage_addColumn("UID")     
    281286 
    282287 
  • trunk/LargeSectionFolder.py

    r1321 r1354  
    537537        return 'hits' 
    538538 
    539     def getSimpleUniques(self, search_results): 
     539    def getTitleCloud(self, search_results, browse_type): 
    540540        """ Simplified version of getUniques that doesn't try to weigh results, used for equal-worth ordering like with titles """ 
    541541        # uniquetuplelist contains result metadata reordered: (sort_title, count, url, indexvalue, title) 
    542         uniquetuplelist=[(x.sortable_title,2,x.getURL(),x.sortable_title, x.Title) for x in search_results if x.Title!=''] 
    543         uniquetuplelist.sort() 
    544         return uniquetuplelist 
     542        from math import log 
     543        rc=getToolByName(self, 'reference_catalog') 
     544        uc=getToolByName(self, 'uid_catalog') 
     545        pc = getToolByName(self, 'portal_catalog') 
     546        if browse_type=='group_titles': 
     547            grouptool = getToolByName(self, 'portal_groups') 
     548 
     549        def getTypeForReferenceSource(ref_catalog_item): 
     550            return uc({'UID':ref_catalog_item.sourceUID})[0].portal_type 
     551 
     552        def adjust(i): 
     553            # helper method to adjust hit count of this tag to relative size (1,...,8)  
     554            (a,b,c,d,e)=i 
     555            b=int((8*log(b,2))/log(maxscore,2)) 
     556            if b==0: 
     557                b=1 
     558            i=(a,b,c,d,e) 
     559            return i         
     560        def calc_piece(x): 
     561            res=rc({'targetUID':x.UID}) 
     562            score=len(res) 
     563            return score 
     564        def calc_activity(x): 
     565            res=rc({'targetUID':x.UID}) 
     566            score=0 
     567            scores={'Collection':1,'Story':10} 
     568            for r in res: 
     569                typ = getTypeForReferenceSource(r) 
     570                if typ in scores.keys(): 
     571                    score+=scores[typ] 
     572            return score 
     573        calc_content=calc_activity 
     574        calc_tool=calc_activity 
     575        calc_reference=calc_activity 
     576        calc_material=calc_activity 
     577 
     578        def calc_member(x): 
     579            created=pc({'Creator':x.id}) 
     580            score=0 
     581            scores={'Piece':1, 'PILOTMaterial':10, 'PresentationMaterial':10, 'MultimediaMaterial':10, 'Activity':10, 'Tool':10,'Story':10, 'BlogPost':1} 
     582            for c in created: 
     583                typ=c.portal_type 
     584                if typ in scores.keys(): 
     585                    score+=scores[typ] 
     586            contacts=rc({'relationship':'is contact of', 'sourceUID':x.UID}) 
     587            score+=len(contacts) 
     588            return score 
     589 
     590        def calc_group(x): 
     591            # slow! 
     592            score=0 
     593            materials=pc({'getGroupsShared':x.id}) 
     594            blog_posts=x.getObject().objectValues('BlogPost') 
     595            group=grouptool.getGroupById(x.id) 
     596            members=group.getGroupMemberIds() 
     597            score=len(materials)+len(blog_posts)+len(members)    
     598            return score          
     599         
     600        func = eval('calc_%s' % browse_type.split('_')[0]) 
     601        popularity =[(func(x)+1, x.sortable_title, x) for x in search_results] 
     602        popularity.sort(cmp=lambda t2,t1: cmp(t1[0],t2[0])) 
     603        popularity=popularity[:100] 
     604        titlecloud=[(s_title,pop,x.getURL(),s_title, x.Title) for (pop, s_title, x) in popularity if x.Title!=''] 
     605        titlecloud.sort() 
     606        maxscore=max([x[1] for x in titlecloud]) 
     607        titlecloud=map(adjust, titlecloud) 
     608        return titlecloud 
    545609 
    546610    def getUniques(self, search_results, index_type='Date', browse_type='hits'): 
    547611        """ Should return unique values of search results in given index, results are list of index-metadata-like tuples in alphabetical order """ 
    548612 
    549         if browse_type in ['reference_titles', 'piece_titles', 'material_titles', 'activity_titles', 'tool_titles', 'content_titles']: # only activity_titles and tool_titles are actually used  
    550             return self.getSimpleUniques(search_results) 
     613        if browse_type.endswith('_titles'):  
     614            return self.getTitleCloud(search_results, browse_type) 
    551615 
    552616        lemill_tool = getToolByName(self, 'lemill_tool') 
     
    573637        if browse_type=='hits': 
    574638            uniques = pc.uniqueValuesFor(index_type)             
    575         elif browse_type=='active_people': 
    576             people = search_results 
    577             uniques = [x.id for x in people] 
    578639        elif browse_type=='active_groups': 
    579640            groups = search_results 
     
    594655                hits[group.id]=(max(1, group.getActivity_score), group.getURL(), group.sortable_title, group.Title) 
    595656                 
    596         elif browse_type=="active_people": 
    597             # Just get activity score from member metadata 
    598             for member in people: 
    599                 hits[member.id]=(max(1, member.getActivity_score), member.getURL(), member.getSortable_nicename, member.getNicename) 
    600  
    601657        elif browse_type=="unique_hits": 
    602658            for counter in search_results: 
     
    633689        if uniquetuplelist==[]: 
    634690            return uniquetuplelist 
    635         if browse_type in ('hits','active_people','active_groups') and len(uniquetuplelist)>100: 
     691        if browse_type in ('hits','active_groups') and len(uniquetuplelist)>100: 
    636692            # order by activity/usage 
    637693            tmplist = [(x[1], x) for x in uniquetuplelist] 
     
    895951    def tagcloud_type(self,topic_name): 
    896952        """ Community tag clouds can use people's activities or group activities as base """ 
    897         if topic_name=='members': return 'active_people' 
    898         elif topic_name=='groups': return 'active_groups' 
     953        if topic_name=='members': return 'member_titles' 
     954        elif topic_name=='groups': return 'group_titles' 
    899955        else: return 'hits' 
    900956         
Note: See TracChangeset for help on using the changeset viewer.