Changeset 3123 for trunk


Ignore:
Timestamp:
12/20/10 16:49:03 (9 years ago)
Author:
jukka
Message:

Removed branching and added links to collections in member page.

Location:
trunk
Files:
1 deleted
13 edited

Legend:

Unmodified
Added
Removed
  • trunk/Branchable.py

    r3014 r3123  
    3030import re, copy 
    3131 
     32### With version 3.1 forward branching should be disabled. 
     33### All this should be removed in few versions past 3.1.  
     34 
    3235class Branchable: 
    3336    """Mix-in class for enabling branching""" 
     
    4043 
    4144    def isBranchable(self): 
    42         return True 
     45        return False 
    4346 
    4447    ############ Workflow methods ################################# 
     
    133136        return getattr(self, 'editingMode','')=='other_users_can_edit_a_copy'             
    134137 
    135     def allowSettingOfEditingPermissions(self): 
    136         """ Only authors and moderators can hide drafts or prevent editing """ 
    137         # if translation, don't show editing_settings fields 
    138         return (self.amIOwner() or self.canIModerate()) and not self.getRawTranslation_of()  
    139138 
    140139 
  • trunk/CommonMixIn.py

    r3114 r3123  
    109109    def isDiscussable(self): 
    110110        """ We are not, but can be overrided by more complex resources """ 
    111         return False 
    112  
    113     def isBranchable(self): 
    114111        return False 
    115112     
     
    627624        elif canEdit: 
    628625            v['editLink'] = '%s/edit' % url 
    629         elif self.allowOnlyBranch(): 
    630             v['editLink'] = '%s/createBranch' % url 
    631626        else: 
    632627            v['editLink'] = '%s/join_a_group' % url 
     
    646641        v['lenCollections'] = lenCollections = self.getCollectionsLen() 
    647642        v['showCollections'] = lenCollections or not isAnon 
    648  
    649         # Only Material types can have branches 
    650         if self.hasComplexWorkflow(): # This is getting ugly 
    651             original=self.getBranch_of() 
    652             if original: 
    653                 original=original.absolute_url() 
    654             v['original'] = original or False 
    655  
    656             v['branches'] = [br.absolute_url() for br in self.getBranches() if br and (br.state=='public' or br.state=='draft')] 
    657             v['showBranches'] = showBranches = original or v['branches'] 
    658         else: 
    659             v['showBranches'] = showBranches = False 
     643         
     644        # branches removed from here  
    660645             
    661  
    662646        v['hasViews'] = isMaterial 
    663647        if isMaterial: 
  • trunk/LearningResource.py

    r3115 r3123  
    9595                else: 
    9696                    self.setState('public') 
    97         # check if this is a branch of some object 
    98         if self.Schema().has_key('branch_of'): 
    99             branch_of = self.getBranch_of() 
    100             if branch_of: 
    101                 branch_of.addToBranches(self.UID()) 
    10297        self.at_post_edit_script() 
    10398        if self.getState()=='public': 
     
    156151        else: 
    157152            member_id = lutool.getAuthenticatedId() 
    158         if self.isBranchable(): 
    159             if not self.branchableEditingCheck(): 
    160                 return False 
    161153        if not getattr(self, 'getGroupEditing', False): 
    162154            return True 
     
    198190            group.join_group() 
    199191        return self.REQUEST.RESPONSE.redirect('%s/edit' % self.absolute_url()) 
     192 
     193    def allowSettingOfEditingPermissions(self): 
     194        """ Only authors and moderators can hide drafts or prevent editing """ 
     195        # if translation, don't show editing_settings fields 
     196        return (self.amIOwner() or self.canIModerate()) and not self.getRawTranslation_of()  
    200197 
    201198 
  • trunk/LessonPlan.py

    r2998 r3123  
    2626from Material import Material 
    2727from permissions import MODIFY_CONTENT 
    28 from Branchable import Branchable 
    2928 
    3029lessonplan_schema = Schema(( 
     
    114113 
    115114 
    116 class LessonPlan(Branchable, Material): 
     115class LessonPlan(Material): 
    117116    """Lesson plan""" 
    118117    schema = schema 
  • trunk/MaintenanceTool.py

    r3106 r3123  
    66from Products.ZCatalog.CatalogBrains import AbstractCatalogBrain 
    77from permissions import ModerateContent, MODIFY_CONTENT, DELETE_CONTENT, MANAGE_PORTAL, ACCESS_CONTENT, VIEW, ADD_CONTENT_PERMISSION 
     8from CommonMixIn import Redirector 
    89from Globals import InitializeClass 
    910from config import SEARCHABLE_TYPES, MATERIAL_TYPES 
     
    2526 
    2627    ######### HOSTING SCRIPTS ################ 
     28 
     29    security.declareProtected(MANAGE_PORTAL, 'countBranchables') 
     30    def countBranchables(self): 
     31        """ Count objects that allow only editing of branches """ 
     32        context=self 
     33        #from Products.CMFCore.utils import getToolByName 
     34        pc=getToolByName(context, 'portal_catalog') 
     35        s=[] 
     36        res=pc(portal_type=['MultimediaMaterial','ExerciseMaterial'], getState=['public','draft']) 
     37        #other_users_can_edit_a_copy 
     38         
     39 
     40 
     41    security.declareProtected(MANAGE_PORTAL, 'countRedirectors') 
     42    def countRedirectors(self,path, subpath=None): 
     43        """ count collections that have stories """ 
     44        t=time.time() 
     45        path=getattr(self, path, None) 
     46        if subpath and path: 
     47            path=getattr(path, subpath, None) 
     48        if not path: 
     49            return 'No proper path' 
     50        redirectors=0 
     51        nulls=0 
     52        objs=0 
     53        ids=path.objectIds() 
     54        for item_id in ids: 
     55            obj=getattr(path, item_id, None) 
     56            if not obj: 
     57                nulls+=1 
     58            elif isinstance(obj, Redirector): 
     59                redirectors+=1 
     60            else: 
     61                objs+=1 
     62        s='Found %s items in folder, %s redirectors, %s proper objs, %s nulls in %s seconds' % (len(ids), redirectors, objs, nulls, time.time()-t)          
     63        return s 
     64 
     65 
     66    security.declareProtected(MANAGE_PORTAL, 'listEmbeds') 
     67    def listEmbeds(self): 
     68        """ count collections that have stories """ 
     69        context=self 
     70        #from Products.CMFCore.utils import getToolByName 
     71        pc=getToolByName(context, 'portal_catalog') 
     72        s=[] 
     73        res=pc(portal_type=['MultimediaMaterial','ExerciseMaterial'], getState=['public','draft']) 
     74        broken=0 
     75        embeds=[] 
     76        embeddy=0 
     77        total=0 
     78        for lrmd in res: 
     79            try: 
     80                lr=lrmd.getObject() 
     81            except AttributeError: 
     82                broken+=1 
     83                continue 
     84            if not lr: 
     85                broken+=1 
     86                continue 
     87            bt=lr.getBodyText() 
     88            found=False 
     89            for chapter in bt: 
     90                if not isinstance(chapter,dict): 
     91                    broken+=1 
     92                    s.append("chapters not properly converted for %s" % lr.getId()) 
     93                if chapter['type']=='embed_block': 
     94                    em=chapter.get('embed','') 
     95                    if em: 
     96                        embeds.append(em) 
     97                        found=True 
     98            if found: 
     99                embeddy+=1 
     100            total+=1 
     101        s.append("Found %s non-empty embeds from %s resources in total of %s web pages and exercises." % (len(embeds),embeddy, total)) 
     102        s.append("There was %s broken objects." % broken) 
     103        s+=embeds 
     104        text='\n'.join(s)       
     105        response = context.REQUEST.RESPONSE 
     106        response.setHeader('Content-Type', 'text/plain; charset=UTF-8') 
     107        response.setHeader('Content-Disposition', 'attachment; filename=embeds.txt') 
     108        return text              
     109 
     110 
     111    security.declareProtected(MANAGE_PORTAL, 'countStories') 
     112    def countStories(self): 
     113        """ count collections that have stories """ 
     114        context=self 
     115        #from Products.CMFCore.utils import getToolByName 
     116        pc=getToolByName(context, 'portal_catalog') 
     117        res=pc(portal_type='Collection', getState='public') 
     118        s=[] 
     119        s.append("%s collections in catalog" % len(res)) 
     120        stories=0 
     121        non_stories=0 
     122        creators=[] 
     123        storytellers=[] 
     124        for colmd in res: 
     125            col=colmd.getObject() 
     126            if not col: 
     127                s.append("Broken metadata obj") 
     128                continue 
     129            desc=col.Description() 
     130            auth=col.Creator() 
     131            if len(desc)>5: 
     132                stories+=1 
     133                if auth not in storytellers: 
     134                    storytellers.append(auth) 
     135            else: 
     136                non_stories+=1 
     137            if auth not in creators: 
     138                creators.append(auth) 
     139        s.append("Found %s collections with stories." % stories) 
     140        s.append("Found %s collections without stories." % non_stories) 
     141        s.append("Found %s authors who have made collections." % len(creators)) 
     142        s.append("Found %s authors who have wrote stories." % len(storytellers)) 
     143        return '\n'.join(s) 
     144             
     145 
     146    security.declareProtected(MANAGE_PORTAL, 'countCreators') 
     147    def countCreators(self,portal_type=''): 
     148        """ count users that have published something """ 
     149        context=self 
     150        #from Products.CMFCore.utils import getToolByName 
     151        pc=getToolByName(context, 'portal_catalog') 
     152        types=['PresentationMaterial', 'MultimediaMaterial', 'PILOTMaterial', 'ExerciseMaterial','LessonPlan', 'SchoolProjectMaterial', 'LeMillReference','Piece','LeMillPrintResource','Activity','Tool'] 
     153        res=pc(portal_type=types, getState=['draft','public', 'private']) 
     154        s=[] 
     155        s.append("%s catalog entries." % len(res)) 
     156        se=[] 
     157        #for lc in pc.fastMetadata(self, res, 'listCreators'): 
     158        for r in res:             
     159            for name in r.listCreators: 
     160                if str(name) in se: 
     161                    pass 
     162                else: 
     163                    se.add(str(name))                  
     164        s.append("%s different names in creators" % len(se)) 
     165        return '\n'.join(s) 
     166 
     167    security.declareProtected(MANAGE_PORTAL, 'countTranslations') 
     168    def countTranslations(self,portal_type=''): 
     169        """ count items that have translation-relations """ 
     170        context=self 
     171        pc=getToolByName(context, 'portal_catalog') 
     172        rc=getToolByName(context, 'reference_catalog') 
     173        has_translation=rc(relationship="has translations") 
     174        translates=rc(relationship="translates") 
     175        s=[] 
     176        s.append("%s catalog entries for 'has translations'" % len(has_translation)) 
     177        s.append( "%s catalog entries for 'translates'" % len(translates)) 
     178        has_ts={'deleted':0, 'private':0, 'missing':0} 
     179        ts={'deleted':0, 'private':0, 'missing':0} 
     180        for item in has_translation: 
     181            source_mds=pc(UID=item.sourceUID, getState=['public','draft']) 
     182            if source_mds:             
     183                for md in source_mds: 
     184                    if md.portal_type in has_ts: 
     185                        c=has_ts[md.portal_type] 
     186                        has_ts[md.portal_type]=c+1 
     187                    else: 
     188                        has_ts[md.portal_type]=1 
     189            elif pc(UID=item.sourceUID, getState='private'): 
     190                c=has_ts['private'] 
     191                has_ts['private']=c+1 
     192            elif pc(UID=item.sourceUID, getState='deleted'): 
     193                c=has_ts['deleted'] 
     194                has_ts['deleted']=c+1 
     195            else: 
     196                c=has_ts['missing'] 
     197                has_ts['missing']=c+1 
     198        for item in translates: 
     199            source_mds=pc(UID=item.sourceUID, getState=['public','draft'])             
     200            if source_mds: 
     201                for md in source_mds: 
     202                    if md.portal_type in ts: 
     203                        c=ts[md.portal_type] 
     204                        ts[md.portal_type]=c+1 
     205                    else: 
     206                        ts[md.portal_type]=1 
     207            elif pc(UID=item.sourceUID, getState='private'): 
     208                c=ts['private'] 
     209                ts['private']=c+1 
     210            elif pc(UID=item.sourceUID, getState='deleted'): 
     211                c=ts['deleted'] 
     212                ts['deleted']=c+1 
     213            else: 
     214                c=ts['missing'] 
     215                ts['missing']=c+1 
     216        s.append('has translations:') 
     217        s.append(str(has_ts)) 
     218        s.append('translates:') 
     219        s.append(str(ts)) 
     220        return '\n'.join(s) 
    27221 
    28222 
  • trunk/MultimediaMaterial.py

    r3045 r3123  
    2424from Schemata import no_description, material_schema, community_editing_schema, draft_schema 
    2525from Material import Material 
    26 from Branchable import Branchable 
    2726from permissions import MODIFY_CONTENT 
    2827import re 
     
    5756schema.moveField('editingMode', before='hideDrafts') 
    5857 
    59 class MultimediaMaterial(Branchable, Material): 
     58class MultimediaMaterial(Material): 
    6059    """Web page""" 
    6160    schema = schema 
  • trunk/PILOTMaterial.py

    r3068 r3123  
    2525from Products.CMFPlone import PloneMessageFactory as PMF 
    2626from Material import Material 
    27 from Branchable import Branchable 
    2827from xml.dom.minidom import getDOMImplementation 
    2928from config import to_unicode 
     
    9594 
    9695 
    97 class PILOTMaterial(Branchable, Material): 
     96class PILOTMaterial(Material): 
    9897    """ PILOT Material """ 
    9998 
  • trunk/Schemata.py

    r3069 r3123  
    5454                  condition='object/allowSettingOfEditingPermissions',# Condition to show widget or not 
    5555                  format = 'radio', 
    56                   visible = {'view':'invisible', 'edit':'visible'}, 
     56                  visible = {'view':'invisible', 'edit':'invisible'}, 
    5757                  ), 
    5858              ), 
  • trunk/SchoolProjectMaterial.py

    r2998 r3123  
    2525from config import PROJECTNAME, MODIFY_CONTENT, VIEW 
    2626from Material import Material 
    27 from Branchable import Branchable 
    2827 
    2928schoolprojectmaterial_schema = Schema(( 
     
    102101#schema['bodyText'].widget.visible = {'edit':'invivible', 'view':'invisible'} 
    103102 
    104 class SchoolProjectMaterial(Branchable, Material): 
     103class SchoolProjectMaterial(Material): 
    105104    """ School Project Material """ 
    106105 
  • trunk/skins/lemill/collection_page.pt

    r3120 r3123  
    2323     <h4 i18n:translate="">Content</h4><ol> 
    2424       <tal:show_resource repeat="resource content"> 
     25         <div class="clear" style="height:2em"></div>             
    2526         <li><a tal:attributes="href string:#content${repeat/resource/index}" tal:content="resource/Title" /></li> 
    2627       </tal:show_resource></ol> 
     
    2930     <h4 i18n:translate="">Methods</h4><ol> 
    3031       <tal:show_resource repeat="resource methods"> 
     32         <div class="clear" style="height:2em"></div>             
    3133         <li><a tal:attributes="href string:#method${repeat/resource/index}" tal:content="resource/Title" /></li> 
    3234       </tal:show_resource></ol> 
     
    3537     <h4 i18n:translate="">Tools</h4><ol> 
    3638       <tal:show_resource repeat="resource tools"> 
     39         <div class="clear" style="height:2em"></div>             
    3740         <li><a tal:attributes="href string:#tool${repeat/resource/index}" tal:content="resource/Title" /></li> 
    3841       </tal:show_resource></ol> 
  • trunk/skins/lemill/member_view.cpt

    r3069 r3123  
    8383     
    8484            </tal:portfolio_samples> 
     85 
     86          <div class="clear"></div> 
     87          <div class="browse_links">            
     88            <dl> 
     89                <dt><a i18n:translate="label_collections" href="portfolio?type=Collection">Collections</a></dt> 
     90                <dd><span tal:repeat="result python:context.portal_catalog.fastLinks(context.portal_catalog.browsingSearch(REQUEST=request, author=member_folder.Creator(), portfolio=True, type='Collection'),5)"> 
     91                    <a href="" tal:attributes="href python:result[1]" tal:content="python: result[0]">PLACEHOLDER</a>, </span><a href="portfolio?type=Collection">...</a> 
     92                </dd> 
     93            </dl> 
     94          </div> 
    8595          <div class="clear"></div> 
    8696 
  • trunk/skins/lemill/portlet_macros.pt

    r3115 r3123  
    133133</tal:collections_div> 
    134134 
    135 Used by: 
    136 Materials 
    137 Uses: 
    138 showBranches, branches, original 
    139  
    140 <tal:branch_div metal:define-macro="branchesDiv"> 
    141 <div class="portlet grid" tal:condition="d/showBranches"> 
    142     <ul> 
    143         <tal:branch repeat="resource d/branches"> 
    144         <li> 
    145           <a href="" tal:attributes="href resource"><tal:version i18n:translate="label_copy_version">Version <tal:number i18n:name="number" tal:content="repeat/resource/number">1</tal:number></tal:version></a> 
    146         </li> 
    147         </tal:branch> 
    148         <li tal:condition="d/original"> 
    149           <a href="" tal:attributes="href d/original" i18n:translate="link_copy_original">Original</a> 
    150         </li> 
    151     </ul> 
    152 </div> 
    153 </tal:branch_div> 
    154135 
    155136Used by: 
  • trunk/skins/lemill/portlet_material_actions.pt

    r3052 r3123  
    88    <tal:block metal:use-macro="here/portlet_macros/macros/tagsDiv" /> 
    99    <tal:block metal:use-macro="here/portlet_macros/macros/collectionsDiv"/> 
    10     <tal:block metal:use-macro="here/portlet_macros/macros/branchesDiv"/> 
    1110    <tal:block metal:use-macro="here/portlet_macros/macros/translationsDiv"/> 
    1211    <tal:block metal:use-macro="here/portlet_macros/macros/viewsDiv"/> 
Note: See TracChangeset for help on using the changeset viewer.