Changeset 17132


Ignore:
Timestamp:
02/20/12 16:42:21 (2 years ago)
Author:
trs22
Message:

Adding newsletter print templates and view.

Location:
agSciencesCollege/agCommon/branches/3.0.1
Files:
1 added
8 edited

Legend:

Unmodified
Added
Removed
  • agSciencesCollege/agCommon/branches/3.0.1/browser/configure.zcml

    r17124 r17132  
    507507    /> 
    508508 
     509    <!-- Newsletter Print View --> 
     510    <browser:page 
     511        for="*" 
     512        name="newsletter_print" 
     513        class=".views.NewsletterPrint" 
     514        template="templates/newsletter_print.pt" 
     515        layer=".interfaces.IThemeSpecific" 
     516        permission="zope2.View" 
     517    /> 
     518 
     519    <!-- Modify Newsletter View --> 
     520    <browser:page 
     521        for="*" 
     522        name="newsletter_modify" 
     523        class=".views.NewsletterModify" 
     524        template="templates/newsletter_view.pt" 
     525        layer=".interfaces.IThemeSpecific" 
     526        permission="zope2.View" 
     527    /> 
     528 
    509529    <!-- Z3 Replacement Folder Views --> 
    510530 
  • agSciencesCollege/agCommon/branches/3.0.1/browser/templates/newsletter_view.pt

    r17099 r17132  
     1<metal:page define-macro="master"> 
    12<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" 
    23      xmlns:tal="http://xml.zope.org/namespaces/tal" 
     
    150151    background-image: url(caution.png); 
    151152    background-repeat: repeat; 
     153} 
     154 
     155body.logged-in #portal-columns { 
     156    border: 20px solid #FFFFFF; 
    152157} 
    153158 
     
    220225} 
    221226 
     227li.nobullet, ul.nobullet li { 
     228    list-style-type: none; 
     229} 
     230 
     231ul.inline { 
     232    margin: 10pt 0; 
     233    padding: 0; 
     234} 
     235 
     236ul.inline li { 
     237    display: inline; 
     238    margin: 0 10pt; 
     239    padding: 0; 
     240} 
     241 
     242.discreet { 
     243    font-size: 0.75em; 
     244    color: #76797c; 
     245} 
     246 
     247.managePortletsLink { 
     248    display: none; 
     249} 
     250 
    222251</style> 
     252 
     253<metal:local_style_slot define-slot="local_style_slot"> 
     254    <style type="text/css"> 
     255        /* No local Styles */ 
     256    </style> 
     257</metal:local_style_slot> 
    223258 
    224259</metal:style> 
     
    269304        </tal:date> 
    270305 
    271         <a class="view-online"  
    272             tal:define="more_url python:context.absolute_url().replace('/' + templateId, ''); 
    273                         more_url context/more_url|more_url" 
    274             tal:attributes="href more_url">View  
    275                 <span tal:replace="context/newsletter_title|context/Title" /> online</a> 
     306        <metal:view-online define-slot="view-online"> 
     307            <a class="view-online"  
     308                tal:define="more_url python:context.absolute_url().replace('/' + templateId, ''); 
     309                            more_url context/more_url|more_url" 
     310                tal:attributes="href more_url">View  
     311                    <span tal:replace="context/newsletter_title|context/Title" /> online</a> 
     312            <tal:print condition="context/show_print_newsletter|nothing"> 
     313                <br /> 
     314                <a class="view-online"  
     315                    tal:define="more_url python:'%s/newsletter_print' % context.absolute_url().replace('/' + templateId, '');" 
     316                    tal:attributes="href more_url">Print  
     317                        this newsletter</a> 
     318            </tal:print>                     
     319        </metal:view-online> 
    276320    </div> 
    277321 
     
    280324<metal:description fill-slot="content-description" 
    281325    tal:define="toLocalizedTime nocall: context/@@plone/toLocalizedTime;"> 
     326 
    282327    <div class="documentDescription" tal:content="context/Description" /> 
    283  
    284  
    285  
    286  
     328     
    287329</metal:description> 
    288330 
    289 <metal:summary fill-slot="content-additional"> 
     331<metal:summary fill-slot="content-additional" define-slot="content-additional"> 
    290332 
    291333    <h2>In This Issue</h2> 
     334    <form id="enable-items-form" tal:omit-tag="context/@@plone_portal_state/anonymous" method="POST" action="@@newsletter_modify"> 
     335    <div class="discreet" tal:condition="not: isAnon"> 
     336        <label for="is_enabled">Checked items will show up in the newsletter.</label> 
     337        <ul class="nobullet inline"> 
     338            <li> 
     339                <input type="button" id="enable-all" value="Enable All" /> 
     340            </li> 
     341            <li> 
     342                <input type="button" id="disable-all" value="Disable All" /> 
     343            </li> 
     344            <li> 
     345                <input type="submit" value="Submit"> 
     346            </li> 
     347        </ul> 
     348        
     349        <script type="text/javascript"> 
     350            function toggleInput(isChecked) 
     351            { 
     352                input_items = document.getElementById("enable-items-form").getElementsByTagName("input"); 
     353                for (var i in input_items) 
     354                {    
     355                    item = input_items[i]; 
     356                    if (item['type'] == 'checkbox') 
     357                    { 
     358                        item.checked=isChecked; 
     359                        item.style.opacity='0.5'; 
     360                    } 
     361                } 
     362 
     363                document.getElementById("enable-items-form").submit(); 
     364            } 
     365             
     366            document.getElementById("enable-all").onclick = function() {toggleInput(true)}; 
     367            document.getElementById("disable-all").onclick = function() {toggleInput(false)}; 
     368        </script> 
     369    </div> 
    292370    <ul class="this-issue" 
    293371        tal:define="contentFilter contentFilter|request/contentFilter|nothing; 
     
    298376                    is_a_topic python:context.portal_type=='Topic'; 
    299377                    folderContents folderContents|nothing;  
    300                     folderContents python:folderContents or is_a_topic and context.queryCatalog(batch=True, **contentFilter) or context.getFolderContents(contentFilter, batch=True, b_size=limit_display or 100); 
    301378                    order_by_id here/order_by_id|nothing; 
    302379                    order_by_title here/order_by_title|nothing; 
    303                     agcommon_utilities python: context.restrictedTraverse('@@agcommon_utilities'); 
    304                     folderContents python: (is_a_topic and (order_by_id or order_by_title)) and agcommon_utilities.reorderTopicContents(folderContents, order_by_id=order_by_id, order_by_title=order_by_title) or folderContents; 
     380                    folderContents python:view.folderContents(folderContents=folderContents, contentFilter=contentFilter, order_by_id=order_by_id, order_by_title=order_by_title); 
    305381                    site_properties context/portal_properties/site_properties; 
    306382                    use_view_action site_properties/typesUseViewActionInListings|python:(); 
     
    315391                    pas_member context/@@pas_member;"> 
    316392        <tal:entry tal:repeat="item batch"> 
    317             <li tal:content="item/pretty_title_or_id" /> 
     393            <li tal:attributes="class python:not isAnon and 'nobullet' or ''" 
     394                tal:condition="python:view.showItem(item)"> 
     395                <input tal:condition="not:isAnon"  
     396                       tal:attributes="value item/UID; 
     397                                       checked python:view.isEnabled(item) and 'checked' or ''" 
     398                       name="enabled_items" 
     399                       type="checkbox" /> 
     400                <span tal:content="item/pretty_title_or_id" /> 
     401            </li> 
    318402        </tal:entry> 
     403        <li class="nobullet" tal:condition="not:isAnon"> 
     404            <input type="submit" value="Submit"> 
     405        </li> 
     406 
    319407    </ul> 
     408    </form> 
    320409</metal:summary> 
    321410 
     
    345434                        more_url more_url|request/more_url|string:folder_contents; 
    346435                        is_a_topic python:context.portal_type=='Topic'; 
    347                         folderContents folderContents|nothing; folderContents python:folderContents or is_a_topic and context.queryCatalog(batch=True, **contentFilter) or context.getFolderContents(contentFilter, batch=True, b_size=limit_display or 100); 
     436                        folderContents folderContents|nothing;  
    348437                        order_by_id here/order_by_id|nothing; 
    349438                        order_by_title here/order_by_title|nothing; 
    350                         agcommon_utilities python: context.restrictedTraverse('@@agcommon_utilities'); 
    351                         folderContents python: (is_a_topic and (order_by_id or order_by_title)) and agcommon_utilities.reorderTopicContents(folderContents, order_by_id=order_by_id, order_by_title=order_by_title) or folderContents; 
     439                        folderContents python:view.folderContents(folderContents=folderContents, contentFilter=contentFilter, order_by_id=order_by_id, order_by_title=order_by_title); 
    352440                        site_properties context/portal_properties/site_properties; 
    353441                        use_view_action site_properties/typesUseViewActionInListings|python:(); 
     
    361449                        show_date context/show_date|nothing; 
    362450                        navigation_root_url context/@@plone_portal_state/navigation_root_url; 
    363                         pas_member context/@@pas_member;"> 
     451                        pas_member context/@@pas_member;" 
     452                        condition="isAnon"> 
    364453    <tal:listing condition="batch"> 
    365  
    366         <h2>Featured Articles</h2> 
     454        <metal:featured-articles define-slot="featured-articles"> 
     455            <h2>Featured Articles</h2> 
     456        </metal:featured-articles> 
    367457        <tal:list metal:define-slot="entries"> 
    368458            <tal:entry tal:repeat="item batch" metal:define-macro="entries"> 
     
    392482                    tal:define="dt_class python:not item_description and 'nodescription' or ''; 
    393483                                dt_class python:item_type == 'Event' and ('%s vevent' % dt_class).strip() or dt_class" 
    394                     tal:attributes="class dt_class"> 
     484                    tal:attributes="class dt_class" 
     485                    tal:condition="python:view.showItem(item)"> 
    395486 
    396487                    <h3> 
     
    468559</metal:content-core> 
    469560 
     561<metal:portlets define-slot="portlets_two_slot" fill-slot="portlets_two_slot"> 
     562    <tal:block replace="structure provider:plone.rightcolumn" /> 
     563</metal:portlets> 
     564 
     565<metal:portlets define-slot="portlets_bottom_slot" fill-slot="portlets_bottom_slot"> 
     566 
     567</metal:portlets> 
     568 
     569<metal:analytics define-slot="analytics_viewlet" fill-slot="analytics_viewlet"> 
     570 
     571</metal:analytics> 
     572 
    470573</body> 
    471574</html> 
     575</metal:page> 
  • agSciencesCollege/agCommon/branches/3.0.1/browser/viewlets.py

    r17124 r17132  
    9696    @property     
    9797    def isFolderFullView(self): 
    98         folder_views = ['folder_full_view_item', 'folder_full_view']  
     98        folder_views = ['folder_full_view_item', 'folder_full_view', 'newsletter_view', 'newsletter_email', 'newsletter_print']  
    9999        parent = self.context.getParentNode() 
    100100        try: 
  • agSciencesCollege/agCommon/branches/3.0.1/browser/views.py

    r17123 r17132  
    1616from Products.CMFPlone.interfaces import IPloneSiteRoot 
    1717 
     18# For registry 
     19 
     20from zope.component import getUtility 
     21from plone.registry.interfaces import IRegistry 
     22 
     23from plone.registry.record import Record 
     24from plone.registry.registry import Registry 
     25from plone.registry import field 
     26 
     27 
    1828""" 
    1929    Interface Definitions 
     
    3747 
    3848class INewsletterView(Interface): 
    39  
    40     def test(): 
    41         """ test method""" 
    42  
    43 class INewsletterEmail(Interface): 
    4449 
    4550    def test(): 
     
    295300        return filtered_results 
    296301 
    297 class NewsletterView(BrowserView): 
     302class NewsletterView(AgCommonUtilities): 
    298303 
    299304    implements(INewsletterView) 
     
    303308        self.request = request 
    304309        self.currentDate = DateTime() 
     310 
     311    @property 
     312    def anonymous(self): 
     313        self.portal_state = getMultiAdapter((self.context, self.request), name=u'plone_portal_state') 
     314        return self.portal_state.anonymous() 
    305315 
    306316    def getBodyText(self): 
     
    348358            return context_title 
    349359 
    350 class NewsletterEmail(NewsletterView, AgCommonUtilities): 
    351  
    352     implements(INewsletterEmail) 
     360    def isEnabled(self, item): 
     361 
     362        enabled_items = self.getItems 
     363         
     364        # Check to make sure at least one of the items in folderContents is enabled%%% 
     365        if self.context.portal_type == 'Topic': 
     366            contents_uid = set([x.UID for x in self.folderContents()]) 
     367        else: 
     368            contents_uid = set([x.UID() for x in self.folderContents()]) 
     369 
     370        if set(contents_uid).intersection(set(enabled_items)): 
     371            return item.UID in enabled_items 
     372        else: 
     373            return self.anonymous 
     374         
     375    def showItem(self, item): 
     376        if self.isEnabled(item): 
     377            return True 
     378        else: 
     379            return not self.anonymous 
     380 
     381 
     382    def folderContents(self, folderContents=[], contentFilter={}, order_by_id=None, order_by_title=None): 
     383        if folderContents: 
     384            # Already has folder contents 
     385            pass 
     386        elif self.context.portal_type == 'Topic': 
     387            folderContents = self.context.queryCatalog(batch=True, **contentFilter) 
     388            if order_by_id or order_by_title: 
     389                folderContents = self.reorderTopicContents(folderContents, order_by_id=order_by_id, order_by_title=order_by_title)  
     390        else: 
     391            self.context.getFolderContents(contentFilter, batch=True) 
     392 
     393        return folderContents    
     394 
     395    @property 
     396    def registry(self): 
     397        return getUtility(IRegistry) 
     398 
     399    @property 
     400    def getItems(self): 
     401        try: 
     402            return self.registry.records[self.getRegistryKey()].value 
     403        except KeyError: 
     404            return [] 
     405         
     406    def setItems(self, enabled_items=[]): 
     407        self.registry.records[self.getRegistryKey()] = Record(field.List(title=u"Item UIDs"), enabled_items) 
     408         
     409    def getRegistryKey(self): 
     410        return 'agsci.newsletter.uid_%s' % self.context.UID() 
     411 
     412class NewsletterModify(NewsletterView): 
     413    def __call__(self): 
     414        enabled_items = self.request.form.get('enabled_items', []) 
     415 
     416        if not isinstance(enabled_items, list): 
     417            enabled_items = [enabled_items] 
     418 
     419        self.setItems(enabled_items) 
     420 
     421        self.request.response.redirect(self.context.absolute_url()) 
     422         
     423class NewsletterEmail(NewsletterView): 
     424 
     425    implements(INewsletterView) 
    353426 
    354427    def render(self): 
     
    383456             
    384457        return html 
    385      
     458 
     459class NewsletterPrint(NewsletterView): 
     460 
     461    implements(INewsletterView) 
     462 
     463    pass 
     464 
    386465class AgendaView(FolderView): 
    387466    """ 
  • agSciencesCollege/agCommon/branches/3.0.1/skins/agcommon_templates/folder_full_view_item.pt

    r17004 r17132  
    2121                     item_type context/portal_type; 
    2222                     item_layout here/getLayout; 
    23                      override python: {'Link': 'link_view'}; 
     23                     override python: {'Link': 'link_view', 'News Item' : 'newsitem_view'}; 
    2424                     item_macro python:path('here/%s/macros/content-core | nothing' % override.get(item_type, item_layout)); 
    2525                     use_view_action site_properties/typesUseViewActionInListings|python:(); 
     
    3030                     isAnon context/@@plone_portal_state/anonymous; 
    3131                     "> 
    32  
    33         <div tal:replace="structure provider:plone.abovecontenttitle" /> 
    3432 
    3533        <h1 class="headline"> 
     
    4341        <div tal:replace="structure provider:plone.belowcontenttitle" /> 
    4442 
    45         <div class="documentDescription" 
     43        <p class="documentDescription" 
    4644             tal:content="context/Description" 
    4745             tal:condition="context/Description"> 
    4846            Description 
    49         </div> 
     47        </p> 
    5048 
    5149        <tal:block tal:condition="item_macro"> 
     
    5957        </tal:block> 
    6058 
    61         <p class="more" tal:condition="not:item_macro"> 
    62             <a href="" 
    63                tal:attributes="href python:test(item_type in use_view_action, item_url+'/view', item_url);" 
    64                i18n:translate="read_more"> 
    65                 Read More&hellip; 
    66             </a> 
    67         </p> 
    68  
    6959        <div class="visualClear"><!-- --></div> 
    7060 
  • agSciencesCollege/agCommon/branches/3.0.1/skins/agcommon_templates/plain_template.pt

    r17093 r17132  
    8888                <tal:warning condition="not: isAnon"> 
    8989                    <tr> 
    90                         <td tal:attributes="colspan python: sr and '2' or None" align="left" valign="top" bgcolor="#00FFB2"> 
     90                        <td tal:attributes="colspan python: sr and '2' or None" align="left" valign="top" bgcolor="#FFB900"> 
    9191                            <strong>Warning:</strong> This is the logged-in view of the newsletter.  Log out (go to the http:// URL) before emailing.  Do not attempt to email this newsletter, or users will be asked to log in before viewing articles. 
    9292                        </td> 
     
    140140                                        </metal:text> 
    141141                                    </div> 
    142                      
     142                        <metal:portlets define-slot="portlets_bottom_slot"> 
     143 
     144                        </metal:portlets>                     
    143145                                    <metal:footer define-slot="footer" tal:content="nothing"> 
    144146                                        Visual Footer 
     
    154156                        id="portal-column-two" valign="top" width="165" bgcolor="#f5f5f5" align="left" cellspacing="0" cellpadding="15" > 
    155157                        <metal:portlets define-slot="portlets_two_slot"> 
    156                             <tal:block replace="structure provider:plone.rightcolumn" /> 
     158                             
    157159                        </metal:portlets> 
    158160                    </td> 
    159161                </tr> 
     162 
    160163                <tr> 
    161164                    <td class="footer" tal:attributes="colspan python: sr and '2' or None" align="center" bgcolor="#ffffff"> 
     
    172175                                 
    173176                        </p> 
    174                      
     177 
    175178                        <p> 
    176179                             
     
    195198            <br style="clear: both" /> 
    196199 
     200            <metal:analytics define-slot="analytics_viewlet"> 
     201             
     202            </metal:analytics> 
     203 
    197204        </tal:main-content> 
    198205 
  • agSciencesCollege/agCommon/branches/3.0.1/skins/agcommon_templates/robots.txt

    r13675 r17132  
    1212Disallow: /nonmobile 
    1313Crawl-delay: 5 
    14  
    1514 
    1615# Add Googlebot-specific syntax extension to exclude forms  
     
    2827Disallow: /m/ 
    2928Disallow: /nonmobile 
     29Disallow: /*newsletter_print 
    3030 
    3131# Apparently Yahoo supports wildcards, too? 
     
    4141Disallow: /m/ 
    4242Disallow: /nonmobile 
     43Disallow: /*newsletter_print 
    4344 
    4445# Penn State's Google Search Appliance 
     
    4950Disallow: /m/ 
    5051Disallow: /nonmobile 
    51  
     52Disallow: /*newsletter_print 
Note: See TracChangeset for help on using the changeset viewer.