Changeset 3057 for trunk


Ignore:
Timestamp:
10/22/10 01:01:08 (9 years ago)
Author:
jukka
Message:

Worked with community section and portfolios.

Location:
trunk
Files:
6 deleted
13 edited

Legend:

Unmodified
Added
Removed
  • trunk/CommonMixIn.py

    r3045 r3057  
    370370        """ Wrapper to make schema updates easier. Also checks if there are bad values and fixes them. Also reindexes. """ 
    371371        o=self 
     372        print 'checking if schema for %s is up to date...' % o.id 
    372373        retry=False 
    373374        # Fix too long id:s 
    374375        if len(str(o.getId()))>220: 
     376            print 'id is too long. fixing it before proceeding further.'  
    375377            id_base=str(o.getId())[:220] 
    376378            id_candidate=id_base 
     
    386388                retry=True 
    387389        if not o._isSchemaCurrent(): 
     390            print 'schema needs updating' 
    388391            o._updateSchema() 
    389392            # Fix instancemethods from field values 
     
    405408#                        f.set(o, None)                                  
    406409            o.reindexObject() 
     410            print 'updated & reindexed.' 
    407411        if retry: 
    408412            try: 
  • trunk/ConfigurationMethods.py

    r3056 r3057  
    4242from Products.PythonScripts.PythonScript import PythonScript 
    4343from Products.LeMill.LatexTool import workingDir 
     44from Acquisition import aq_inner, aq_parent 
     45 
    4446 
    4547from DateTime import DateTime 
     
    331333        'methods': ['language','tags','published','browse_methods'], 
    332334        'tools': ['language','tags','published','browse_tools'], 
    333         'community':['portfolio'] 
     335        'community':['portfolio','browse_people','language','country','skills','interests','subject_area','browse_groups','tags','g_language','group_subject_area'] 
    334336    }  
    335     #        'Community': 
    336     #        # *********************** 
    337     #        [(CONTENT_TYPES + ACTIVITY_TYPES + TOOLS_TYPES+('GroupBlog',),( 
    338     #        {'id':'portfolio', 'title':'Portfolio', 'getmethod':'getTags', 'sortby':'getLatestEdit', 'reversed':True, 'view':'lemill_portfolio_view'},)), 
    339     #        # +++++++++++++++++++++++ 
    340     #        (('MemberFolder',),( 
    341     #        {'id':'browse_people', 'title':'Members', 'getmethod':'sortable_title', 'view':'lemill_titlecloud'}, 
    342     #        {'id':'language', 'title':'Language', 'getmethod':'getLanguage_skills', 'view':'lemill_browse_members'}, 
    343     #        {'id':'country', 'title':'Location', 'getmethod':'getLocation_country', 'view':'lemill_browse_members'}, 
    344     #        {'id':'skills', 'title':'Skills', 'getmethod':'getSkills', 'view':'lemill_browse_members'}, 
    345     #        {'id':'interests', 'title':'Interests',  'getmethod':'getInterests', 'view':'lemill_browse_members'}, 
    346     #        {'id':'subject_area', 'title':'Subject area', 'getmethod':'getSubject_area', 'view':'lemill_browse_members'})), 
    347     #        # +++++++++++++++++++++++ 
    348     #        (('GroupBlog',),( 
    349     #        {'id':'browse_groups', 'title':'Groups', 'view':'lemill_titlecloud'}, 
    350     #        {'id':'tags', 'title':'Tags', 'getmethod':'getTags','view':'lemill_browse_groups'}, 
    351     #        {'id':'g_language', 'title':'Language', 'getmethod':'getLanguage_skills', 'view':'lemill_browse_groups'}, 
    352     #        {'id':'group_subject_area', 'title':'Subject area', 'getmethod':'getSubject_area', 'view':'lemill_browse_groups'})) 
    353     #        # +++++++++++++++++++++++ 
    354     #        ]}         
    355337    for section,topic_ids in removed_topics.items(): 
    356338        section=getattr(portal, section) 
     
    363345            print 'deleting obsolete topics:', del_ids 
    364346            section.manage_delObjects(del_ids) 
    365      
     347    # Also remove every Topic from catalog, there are some legacy stuff that has survived. 
     348    pc=portal.portal_catalog 
     349    for topic_md in list(pc(portal_type='Topic')): # needs to be list because lazy catalog results behave oddly if catalog objects are changed during iteration 
     350        topic=topic_md.getObject() 
     351        if topic: 
     352            topic_parent=topic.aq_inner.aq_parent 
     353            print 'deleting: ', topic.id 
     354            topic_parent.manage_delObjects([topic.id]) 
     355        try: 
     356            pc.uncatalog_object(topic_md.data_record_id_)                
     357        except KeyError: 
     358            print 'tried to uncatalog object but failed' 
     359 
    366360 
    367361def setupRemoteLeMills(self, portal): 
  • trunk/GroupBlog.py

    r3052 r3057  
    235235        pc=getToolByName(self, 'portal_catalog')         
    236236        results=pc({'getRawGroupEditing':self.UID(), 'getState':'public', 'portal_type':tuple(self.getFeaturedTypes()), 'getHasCoverImage':True}) 
    237         n = min(3, len(results)) 
     237        n = min(4, len(results)) 
    238238        return random.sample(results,n) 
    239239 
  • trunk/LargeSectionFolder.py

    r3052 r3057  
    719719 
    720720    def getRSSResults(self): 
    721         """ Returns list of tuples (discussion_obj, display_macro_path, url) """ 
    722         topic_id=self.REQUEST.get('URL1').split('/')[-1] 
    723         topic=getattr(self, topic_id, None) 
    724         results=[] 
    725         if topic: 
    726             results = topic.queryCatalogForTopics()[:30]                                     
    727             return [(x, 'here/rss_macros/macros/brain_object', x.getURL()) for x in results] 
     721        """ Placeholder """ 
    728722        return [] 
    729723 
  • trunk/MemberFolder.py

    r3056 r3057  
    109109            description = 'Check the box if you approve community members sending text messages.', 
    110110            description_msgid = 'help_mobile', 
    111             i18n_domain ='lemill', 
     111            visible = {'view':'invisible', 'edit':'invisible'}, 
    112112            ) 
    113113    ),          
     
    139139            description = 'If you want to upload presentations from Slideshare, LeMill needs to know where to look for them. Username is not visible for other users in LeMill. We will never ask your password.', 
    140140            description_msgid = 'help_slideshare_user', 
    141             i18n_domain = 'lemill' 
     141            visible = {'view':'invisible', 'edit':'invisible'}, 
    142142            ) 
    143143        ), 
     
    175175             label = 'Languages', 
    176176             label_msgid = 'label_language_skills', 
    177              description = "Choose languages you can use to create learning resources or communicate.", 
    178              description_msgid = 'help_language_skills', 
     177             description = "", 
    179178             i18n_domain = "lemill" 
    180179             ) 
     
    187186             description = "Enter a list of your skills separated by commas.", 
    188187             description_msgid = 'help_skills', 
    189              i18n_domain = "lemill" 
     188             visible = {'view':'invisible', 'edit':'invisible'}, 
    190189             ) 
    191190        ), 
     
    197196             description = "Enter a list of your interests separated by commas.", 
    198197             description_msgid = 'help_interests', 
    199              i18n_domain = "lemill" 
     198             visible = {'view':'invisible', 'edit':'invisible'}, 
    200199             ) 
    201200        ), 
     
    222221        searchable = True, 
    223222        widget = LeTextAreaWidget( 
    224             label = 'Biography', 
    225             label_msgid = 'label_your_biography', 
     223            label = 'About me', 
     224            label_msgid = 'label_about_me', 
    226225            description = "Any background information about yourself that you wish to share with others.", 
    227226            description_msgid = 'help_your_biography', 
     
    644643        return self.portal_catalog(UID=self.getRawListOfContacts(), sort_on='sortable_title') 
    645644 
    646     def getRelatedContacts(self): 
     645    def getRelatedContacts(self, size_only=False): 
    647646        """ Returns all related contacts """ 
    648647        obj_uid = self.UID() 
     
    650649        q = { 'targetUID': obj_uid } 
    651650        qres = self.reference_catalog(q) 
     651        if size_only: 
     652            return len(qres) 
    652653        for q in qres: 
    653654            sourceUID= self.reference_catalog.lookupObject(q.UID).sourceUID 
     
    669670    def recalculateScore(self): 
    670671        """ Recalculates score for MemberFolder according to specifications """ 
     672        t=time.time() 
    671673        score = 0 
    672674        member = self.getMemberId() 
    673  
    674         all_resources = self.getResources(member, as_dict=True) 
     675        pc=getToolByName(self, 'portal_catalog') 
    675676        # Get pieces and filter out References 
    676         pieces = all_resources['Pieces'] 
    677         pieces = [x for x in pieces if x.meta_type=='Piece'] 
     677        pieces=pc(Creator=member, portal_type='Piece', getState='public') 
    678678        # Get Material types, Methods and Tools 
    679         main_resources = all_resources['Content'] + all_resources['Activities'] + all_resources['Tools'] 
     679        main_resources = pc(Creator=member, portal_type=['Activity','Tool','PresentationMaterial', 'MultimediaMaterial', 'PILOTMaterial', 'ExerciseMaterial','LessonPlan', 'SchoolProjectMaterial'], getState='public') 
    680680        # Get collections and see which ones are complete 
    681         collections = self.getCollections() 
    682         stories = [c for c in collections if c.getGoodStory()] 
     681        collections = pc(Creator=member, portal_type='Collection', getState='public') 
     682        stories = pc(Creator=member, portal_type='Collection', getGoodStory=True, getState='public') 
    683683        # Get all posts by member 
    684         pcatalog=getToolByName(self, 'portal_catalog') 
    685         posts = pcatalog({'getState':'public', 'meta_type':'BlogPost', 'Creator':member}) 
     684        posts = pc(Creator=member, portal_type='BlogPost', getState='public') 
    686685 
    687686        # Get people that have this member as contact 
    688         contacts = self.getRelatedContacts() 
    689  
    690         score = score + len(pieces) # 1 point for each piece 
    691         score = score + len(main_resources) * 10 # 10 points for each learning resource, method and tool 
    692         score = score + len(stories) * 10 # 10 points for each storie 
    693         score = score + len(posts) # 1 point for each post 
    694         score = score + len(contacts) # 1 point for each contact 
     687        contacts = self.getRelatedContacts(size_only=True) 
     688 
     689        score += len(pieces) # 1 point for each piece 
     690        score += len(main_resources) * 10 # 10 points for each learning resource, method and tool 
     691        score += len(stories) * 10 # 10 points for each storie 
     692        score += len(posts) # 1 point for each post 
     693        score += contacts # 1 point for each contact 
    695694 
    696695        # Make sure that score is at least 1 
     
    698697            score = 1 
    699698        self.setScore(score) 
     699        print 'recalculating score took ', time.time()-t  
    700700 
    701701    def portfolioFilter(self): 
  • trunk/skins/lemill/browse_macros.pt

    r3052 r3057  
    3131        <select tal:attributes="tabindex tabindex/next; disabled d/lang_disabled" name="language" onchange="this.form.submit()"> 
    3232            <optgroup><tal:loop repeat="item d/common_languages"><option tal:attributes="value python:item[0]; selected python:item[2]"><span tal:replace="python:str(item[1])" /><tal:counter condition="python:item[3]"> (<span tal:replace="python:item[3]"/>)</tal:counter></option></tal:loop></optgroup> 
    33             <optgroup label="-------------"><tal:loop repeat="item d/rare_languages"><option tal:attributes="value python:item[0]; selected python:item[2]"><span tal:content="python:str(item[1])" /><tal:counter condition="python:item[3]"> (<span tal:replace="python:item[3]"/>)</tal:counter></option></tal:loop></optgroup> 
     33            <optgroup label="-------------"><tal:loop repeat="item d/rare_languages"><option tal:attributes="value python:item[0]; selected python:item[2]"><span tal:replace="python:str(item[1])" /><tal:counter condition="python:item[3]"> (<span tal:replace="python:item[3]"/>)</tal:counter></option></tal:loop></optgroup> 
    3434        </select> 
    3535     </p>          
  • trunk/skins/lemill/groupblog_view.pt

    r3027 r3057  
    1212<body> 
    1313 
    14 <!-- Modified from folder_listing.pt in CMFPlone/skins/plone_content --> 
     14    <div metal:fill-slot="main"> 
     15    <tal:messages repeat="message here/getMessages"> 
     16        <div metal:use-macro="python:path('here/macros_messages/macros/%s|nothing' % message)" /> 
     17    </tal:messages> 
    1518 
     19    <div class="title grid"> 
     20        <h1 i18n:translate="group_page_main_title">Group: <tal:block i18n:name="group_title" tal:content="here/getNicename">GROUP NAME</tal:block></h1> 
     21    </div> 
     22    <div class="clear"></div> 
    1623 
    17     <div metal:fill-slot="main"> 
    18     <metal:main-macro define-macro="main"> 
     24    <span tal:replace="structure python:here.lemill_tool.parse_text(here.Description())" />             
    1925 
    20         <h1 class="documentFirstHeading"> 
    21             <span tal:omit-tag="" i18n:translate="">Group</span>: <span tal:omit-tag="" tal:content="object_title">PLACEHOLDER</span> 
    22         </h1> 
     26    <p tal:condition="python:here.getTags()" tal:define="link_pref string:${portal_url}/community/tags?tag=;"> 
     27        <label><tal:block i18n:translate="label_tags">Tags</tal:block>:</label> 
     28        <metal:fieldMacro use-macro="python:here.widget('tags',mode='view')"/> 
     29    </p> 
     30     
     31    <div class="clear"></div> 
    2332 
    24     <div class="visualClear" style="height:20px"><!-- --></div> 
     33     
    2534 
    26         <div class="documentDescription" style="font-weight: normal">  
    27             <span tal:replace="structure python:here.lemill_tool.parse_text(here.Description())" />             
    28         </div> 
     35            <tal:portfolio_samples define="samples context/getSamples"> 
     36                <h2 i18n:translate="heading_learning_resources_by_group" tal:condition="samples">Learning resources edited by this group</h2> 
     37           <tal:coverimages repeat="obj samples">    
     38             <div class="community_border featured_item grid" tal:define="first repeat/obj/start; last repeat/obj/end;" tal:attributes="style python:test(first, 'margin-left:0', test(last, 'margin-right:0', ''));"> 
     39                &nbsp;<a href="#" title="Cover image" tal:attributes="href string:${obj/getURL}/view; title obj/Title | nothing;">              
     40                  <img alt="Cover image" valign="middle" tal:attributes="src string:${obj/getURL}/coverImage; alt obj/Title | nothing;" src="images/default_learningresource.png" /> 
     41                </a>&nbsp; 
     42             </div> 
     43          </tal:coverimages> 
     44          <div class="clear"></div> 
     45     
     46          <tal:titles repeat="obj samples"> 
     47            <div class="resource_title grid" tal:define="first repeat/obj/start; last repeat/obj/end;" tal:attributes="style python:test(first, 'margin-left:0', test(last, 'margin-right:0', ''));"> 
     48                <a href="#"  tal:attributes="href string:${obj/getURL}/view" tal:content="python:context.lemill_tool.shortenTitle(obj.Title, 48)">PLACEHOLDER</a> 
     49            </div> 
     50          </tal:titles> 
     51     
     52            </tal:portfolio_samples> 
    2953 
    30         <p tal:condition="python:here.getTags()" tal:define="link_pref string:${portal_url}/community/tags?tag=;"> 
    31             <label><tal:block i18n:translate="label_tags">Tags</tal:block>:</label> 
    32             <metal:fieldMacro use-macro="python:here.widget('tags',mode='view')"/> 
    33         </p> 
    34      
    35     <div class="visualClear" style="height:10px"><!-- --></div> 
    36  
    37  
    38         <tal:portfolio_samples define="samples context/getSamples"> 
    39             <h1 i18n:translate="heading_learning_resources_by_group" tal:condition="samples"> 
    40                 Learning resources edited by this group 
    41             </h1> 
    42  
    43             <table border="0" cellpadding="0" cellspacing="4" width="550" > 
    44                 <tr> 
    45                     <td class="coverimagecell" tal:repeat="sample samples"> 
    46                         <a href="" tal:attributes="href string:${my_sample_link}/view" tal:define="my_sample_link sample/getURL"> 
    47                             <img src="" tal:attributes="src string:${sample/getURL}/coverImage; onclick string:document.location='${sample_link}/view'" style="cursor: pointer;" tal:define="obj sample/getObject; piccy obj/getCoverImage; sample_link sample/getURL;" /></a> 
    48                     </td> 
    49                 </tr> 
    50                 <tr> 
    51                     <td class="captioncell" tal:repeat="sample samples"> 
    52                         <a href="#" tal:attributes="href string:${sample_link}/view" tal:define="obj sample/getObject; sample_link sample/getURL;" tal:content="python:obj.shortenedTitle(48)">PLACEHOLDER</a> 
    53                     </td> 
    54                 </tr> 
    55             </table> 
    56         </tal:portfolio_samples> 
    57  
    58     <div class="discreet" tal:condition="python:context.isMember(memberid)" i18n:translate="add_resources_to_group_helptext">You can add resources to this group by editing the resource you want to add, there is an option for assigning it to a group.</div> 
    59     <div class="visualClear" style="height:20px" tal:condition="context/getSamples"><!-- --></div> 
     54    <div class="clear"></div> 
    6055  
    6156 
    62     <h1 i18n:translate="title_forum">Forum</h1> 
     57    <h2 i18n:translate="title_forum">Forum</h2> 
    6358 
    64     <div class="visualClear" style="height:20px"><!-- --></div> 
     59    <div class="clear"></div> 
    6560 
    6661    <p><strong> 
     
    7368    </strong></p> 
    7469 
    75     <div class="visualClear" style="height:10px"><!-- --></div> 
     70    <div class="clear"></div> 
    7671  
    7772    <tal:discussions define="b_size python:20;b_start python:0;b_start request/b_start | b_start; 
    7873                            batch python:here.getPosts(batch=True, b_size=b_size, b_start=b_start, objects=False, remove_zeros=True); 
    7974                            ">     
    80     <table border="0" cellpadding="2" cellspacing="2" width="100%"> 
     75    <table border="0" cellpadding="2" cellspacing="2" width="100%" style="border-top: 1px solid #77aabb;;"> 
    8176        <tr tal:condition="batch"> 
    8277            <th i18n:translate="label_discussion_topic">Topic</th><th i18n:translate="label_discussion_started_by">Started by</th><th i18n:translate="label_discussion_last_post">Last post</th><th i18n:translate="label_discussion_posts">Posts</th> 
     
    105100    </table> 
    106101 
    107         <div class="visualClear" style="height:7px"><!-- --></div> 
     102    <div class="clear"></div> 
    108103 
    109104        <!-- Navigation --> 
    110105        <div metal:use-macro="here/batch_macros/macros/navigation" /> 
    111106 
    112         <div class="visualClear" style="height:20px"><!-- --></div> 
     107    <div class="clear"></div> 
    113108  
    114109 
     
    124119    </tal:discussions> 
    125120 
    126  
    127     </metal:main-macro> 
    128121    </div> 
    129122 
  • trunk/skins/lemill/header.pt

    r3052 r3057  
    77  <metal:head metal:define-macro="html_header"> 
    88    <meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> 
     9    <metal:block metal:define-slot="pagetitle"> 
    910    <title> LeMill &mdash; <span tal:replace="object_title"/></title> 
     11    </metal:block> 
    1012    <meta name="description" tal:attributes="content context/getMetaDescription | python:'LeMill is a web community for finding, authoring and sharing learning resources.'" /> 
    1113    <base href="" tal:attributes="href here/renderBase" /> 
  • trunk/skins/lemill/lemill_community_view.pt

    r3056 r3057  
    2727 
    2828  <div class="browse_links grid" tal:define="lang_filter context/getLanguageFilter"> 
     29    <div class="column-left"> 
     30    <h1>People</h1> 
     31    <dl> 
     32        <dt><a i18n:translate="label_languages" href="cloud?base=language&type=MemberFolder">Languages</a></dt> 
     33        <dd><span tal:repeat="result context/top3people_languages | nothing"> 
     34            <a href="" tal:attributes="href python:'language?language=%s' % here.url_quote(result)" tal:content="python:here.script_getPrettyLanguage(result)">PLACEHOLDER</a>, </span><a href="rebuildTop3s" tal:condition="context/amIManager">( rebuild top results )</a><a href="cloud?base=language">...</a> 
     35        </dd> 
     36        <dt><a i18n:translate="label_country" href="" tal:attributes="href string:cloud?type=MemberFolder&base=country">Country</a></dt> 
     37        <dd><span tal:repeat="result python:context.portal_catalog.getTopFive(results,'getLocation_country', 'browse?type=MemberFolder&country=')"> 
     38                <a href="" tal:attributes="href python:result[1]" tal:content="python:result[0]" i18n:translate="">PLACEHOLDER</a>, 
     39            </span><a href="" tal:attributes="href string:cloud?type=MemberFolder&base=country">...</a> 
     40        </dd> 
     41        <dt><a i18n:translate="label_subject_areas" href="" tal:attributes="href string:cloud?type=MemberFolder&base=subject_area">Subject areas</a></dt> 
     42        <dd><span tal:repeat="result python:context.portal_catalog.getTopFive(results,'getSubject_area', 'browse?type=MemberFolder&subject_area=')"> 
     43                <a href="" tal:attributes="href python:result[1]" tal:content="python:result[0]" i18n:translate="">PLACEHOLDER</a>, 
     44            </span><a href="" tal:attributes="href string:cloud?type=MemberFolder&base=subject_area">...</a> 
     45        </dd> 
    2946 
    30     <h2>People</h2> 
     47    </dl> 
     48    </div> 
     49    <div class="column-right"> 
     50    <h1>Groups</h1> 
    3151    <dl> 
    32         <dt><a i18n:translate="label_people" href="cloud?base=location&type=MemberFolder">People</a></dt> 
    33         <dd><a href="">Languages</a>, <a href="">Subject areas</a>, <a href="">Countries</a></dd>     
     52        <dt><a i18n:translate="label_languages" href="cloud?base=language&type=GroupBlog">Languages</a></dt> 
     53        <dd><span tal:repeat="result context/top3group_languages | nothing"> 
     54            <a href="" tal:attributes="href python:'language?language=%s' % here.url_quote(result)" tal:content="python:here.script_getPrettyLanguage(result)">PLACEHOLDER</a>, </span><a href="rebuildTop3s" tal:condition="context/amIManager">( rebuild top results )</a><a href="cloud?base=language">...</a> 
     55        </dd> 
     56        <dt><a i18n:translate="label_subject_areas" href="" tal:attributes="href string:cloud?type=GroupBlog&base=subject_area">Subject areas</a></dt> 
     57        <dd><span tal:repeat="result python:context.portal_catalog.getTopFive(results,'getSubject_area', 'browse?type=GroupBlog&subject_area=')"> 
     58                <a href="" tal:attributes="href python:result[1]" tal:content="python:result[0]" i18n:translate="">PLACEHOLDER</a>, 
     59            </span><a href="" tal:attributes="href string:cloud?type=GroupBlog&base=subject_area">...</a> 
     60        </dd> 
    3461    </dl> 
    35     <h2>Groups</h2> 
    36     <dl> 
    37         <dt><a i18n:translate="label_groups" href="cloud?base=title&type=GroupBlog">Groups</a></dt> 
    38         <dd><a href="">Languages</a>, <a href="">Subject areas</a>, <a href="">Countries</a></dd>     
    39         <tal:group_recent_threads define="recents here/mergeLatestThreadsInMyGroups;"> 
    40            <dt tal:condition="recents"><a i18n:translate="heading_recent_discussions" href="">Recent discussions in my groups</a></dt> 
    41            <dd><tal:repeater repeat="post recents"><a href="" tal:define="group python:here.getGroupById(post.getParentBlog)" tal:attributes="href group/absolute_url" tal:content="group/title">PLACEHOLDER</a>: <a href="" tal:attributes="href post/getURL" tal:content="post/Title">PLACEHOLDER</a><br/></tal:repeater> 
    42            </dd> 
    43         </tal:group_recent_threads>     
    44     </dl> 
     62    </div> 
    4563  </div> 
    4664</metal:main> 
  • trunk/skins/lemill/lemill_grid.css

    r3052 r3057  
    285285    margin-left: 0; 
    286286} 
    287  
     287.browse_links div.column-left { 
     288    width:360px; 
     289    float:left; 
     290}     
     291.browse_links div.column-right { 
     292    width:340px; 
     293    float:left; 
     294}     
    288295 
    289296/* Folded things */ 
  • trunk/skins/lemill/member_view.cpt

    r3056 r3057  
    6666 
    6767            <tal:portfolio_samples define="samples context/getSamples"> 
    68                 <h2 i18n:translate="heading_portfolio" tal:condition="samples"> 
    69                     Portfolio 
    70                 </h2> 
     68                <h2 i18n:translate="heading_portfolio" tal:condition="samples">Portfolio</h2> 
    7169           <tal:coverimages repeat="obj samples">    
    7270             <div class="community_border featured_item grid" tal:define="first repeat/obj/start; last repeat/obj/end;" tal:attributes="style python:test(first, 'margin-left:0', test(last, 'margin-right:0', ''));"> 
  • trunk/skins/lemill/personalize_form.cpt

    r2474 r3057  
    44    i18n:domain="plone"> 
    55 
    6     <metal:block fill-slot="top_slot" 
    7     tal:define="dummy python:request.set('disable_border',1)" /> 
     6    <metal:block metal:fill-slot="pagetitle"> 
     7    <title i18n:translate="title_edit_profile">Edit your profile</title>  
     8    </metal:block> 
    89 
    910    <metal:javascript_head fill-slot="javascript_head_slot" 
  • trunk/skins/lemill/portfolio.cpt

    r3056 r3057  
    1919 
    2020<div metal:define-macro="portfolio_options" class="browse_options portlet grid" tal:define="pf_owner context/getMemberId | nothing;" tal:condition="pf_owner"> 
     21  <div class="portlet-title" i18n:translate="heading_portfolio">Portfolio</div> 
     22 
    2123  <form name="search" 
    2224           method="POST" 
Note: See TracChangeset for help on using the changeset viewer.