Conjunto de mudanças 6495 no repositório publico


Ignorar:
Timestamp:
14/06/2012 00:15:12 (9 anos atrás)
Autor:
mazza
Mensagem:

boxes: com templates Jinja

Usaria o Chameleon, mas ele nao tolera variaveis faltando

Localização:
PortalInterlegis/produtos/il.portalinterlegis/trunk
Arquivos:
10 adicionados
5 editados
3 movidos

Legenda:

Não Modificado
Adicionado
Removido
  • PortalInterlegis/produtos/il.portalinterlegis/trunk/setup.py

    r6493 r6495  
    3535          'plone.formwidget.contenttree',
    3636          'plone.formwidget.autocomplete',
     37          'Jinja2', # This one is not neurotic about missing values. We need this.
    3738      ],
    3839      extras_require={'test': ['plone.app.testing', 'mock']},
  • PortalInterlegis/produtos/il.portalinterlegis/trunk/src/il/portalinterlegis/browser/boxes/manager.py

    r6494 r6495  
    55from five import grok
    66from five.grok.components import ZopeTwoPageTemplate
     7from jinja2 import Environment, PackageLoader
    78from persistent.dict import PersistentDict
    89from plone.autoform.form import AutoExtensibleForm
     
    1415from zope.schema.interfaces import IField
    1516
    16 from interfaces import template_dict, box_schemas
     17from interfaces import box_schemas
    1718
    1819
     
    2223provideAdapter(PersistentDictionaryField)
    2324
     25templates = Environment(loader=PackageLoader(__name__))
    2426
    2527class BoxManager(object):
     
    6971
    7072    def html(self, context, number):
    71         return self._schema_template() % NiceDictGetter(
    72             self.box_content(context, number))
     73        template = templates.get_template(self.schema.__name__.lower() + '.html')
     74        return template.render(self.box_content(context, number))
    7375
    7476    def _box_key(self, number):
     
    7880        return 'box_%s' % self._box_key(number)
    7981
    80     def _schema_template(self):
    81         return template_dict[self.schema]
    8282
    8383def get_or_create_persistent_dict(dictionary, key):
     
    8686        dictionary[key] = value = PersistentDict()
    8787    return value
    88 
    89 class NiceDictGetter(object):
    90     """Dictionary getter with a default empty string for unknown keys.
    91     """
    92     def __init__(self, wrapped):
    93         self.wrapped = wrapped
    94 
    95     def __getitem__(self, key):
    96         value = self.wrapped.get(key, None)
    97         return (value is None) and '---' or value
    9888
    9989# ROWS
  • PortalInterlegis/produtos/il.portalinterlegis/trunk/src/il/portalinterlegis/browser/homes.py

    r6487 r6495  
    22from five import grok
    33
    4 from boxes import GridView
     4from boxes.manager import GridView
    55from interfaces import \
    6      IComunidadeLegislativa, IInformacao, ICapacitacao, ITecnologia, IComunicacao, \
     6     IComunidadeLegislativa, IInformacao, ICapacitacao, ITecnologia, IComunicacao
     7from boxes.interfaces import \
    78     ISimpleBox, ICarousel, ICalendar, ITabsPilares, IAcompanheOInterlegis, IHighlight
    89
  • PortalInterlegis/produtos/il.portalinterlegis/trunk/src/il/portalinterlegis/browser/interfaces.py

    r6493 r6495  
    11# -*- coding: utf-8 -*-
    2 from plone.app.z3cform.wysiwyg import WysiwygFieldWidget
    3 from plone.autoform.interfaces import WIDGETS_KEY
    4 from plone.directives import form
    5 from plone.formwidget.autocomplete import AutocompleteFieldWidget
    6 from plone.formwidget.contenttree import PathSourceBinder
    7 from zope import schema
    82from zope.interface import Interface
    93
    10 
    11 # TODO: tive de mover isso pra ca (veio de boxes) por causa de um import circular
    12 template_dict = {}
    13 
    14 # decorator
    15 def template(t):
    16     def f(cls):
    17         template_dict[cls] = t
    18         return cls
    19     return f
    20 
    21 # decorator
    22 def rich(*args, **kwargs):
    23     def f(cls):
    24         cls.setTaggedValue(WIDGETS_KEY,
    25                            dict([(k, WysiwygFieldWidget) for k in args],
    26                                 **kwargs))
    27         return cls
    28     return f
    294
    305class IThemeSpecific(Interface):
     
    5126class IComunicacao(Interface):
    5227    "Marker interface para home"
    53 
    54 # BOX INTERFACES
    55 
    56 @template('''
    57       <div class="simple-box">
    58         <a href="/portal/%(target)s">
    59           <h2>%(title)s</h2>
    60           <h3 class="icon-news">%(subtitle)s</h3>
    61           <p>
    62             %(text)s
    63           </p>
    64         </a>
    65       </div>''')
    66 @rich('text', target=AutocompleteFieldWidget)
    67 class ISimpleBox(form.Schema):
    68     title = schema.TextLine(title=u"Título", required=True)
    69     subtitle = schema.TextLine(title=u"Subtítulo", required=True)
    70     text = schema.Text(title=u"Texto", required=False)
    71     target = schema.Choice(title=u"Conteúdo relacionado",
    72                             source=PathSourceBinder(),
    73                             required=False)
    74 
    75 @template('''
    76       <div id= "container">
    77 
    78                 <div class="carousel">
    79                   <ul>
    80                         <li>
    81               <a href="">
    82                 <img src="/portal/++theme++il.portalinterlegis/temp/images/1.jpg" alt="ex1" width="340" height="215" />
    83                 <div class="carousel-text">
    84                   <h3><b>Envie</b> Notícias</h3>
    85                   <p>
    86                     Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean sed est eu mauris lacinia molestie. Integer eu ultricies nisl.
    87                   </p>
    88                 </div>
    89               </a>
    90             </li>
    91                         <li>
    92               <a href="">
    93                 <img src="/portal/++theme++il.portalinterlegis/temp/images/caneca.jpg" alt="ex2" width="340" height="215" />
    94                 <div class="carousel-text">
    95                   <h3><b>Mais</b> Novidades</h3>
    96                   <p>
    97                     Maecenas vehicula magna eget eros dictum fringilla. In hac habitasse platea dictumst. Aenean vestibulum ligula neque. Ut id varius ante.
    98                   </p>
    99                 </div>
    100               </a>
    101             </li>
    102                         <li>
    103               <a href="">
    104                 <img src="/portal/++theme++il.portalinterlegis/temp/images/interlegis.jpg" alt="ex3" width="340" height="215" />
    105                 <div class="carousel-text">
    106                   <h3><b>Ainda</b> muito <b>mais...</b></h3>
    107                   <p>
    108                     Aenean pellentesque consectetur neque. Integer ultrices tincidunt odio ut adipiscing. Aliquam erat volutpat. Morbi auctor faucibus odio id cursus.
    109                   </p>
    110                 </div>
    111               </a>
    112             </li>
    113                   </ul>
    114                 </div>
    115 
    116           </div>
    117 ''')
    118 @rich('text', target=AutocompleteFieldWidget)
    119 class ICarousel(Interface):
    120     title = schema.TextLine(title=u"Título", required=True)
    121     text = schema.Text(title=u"Texto", required=False)
    122     target = schema.Choice(title=u"Conteúdo relacionado",
    123                            source=PathSourceBinder(portal_type='Document'))
    124 
    125 @template('''
    126       <h2 class="box-header">Andamento do Interlegis</h2>
    127       TODO: AGENDA... <br/><br/><br/>
    128 ''')
    129 class ICalendar(Interface):
    130     pass
    131 
    132 @template('''
    133       <h2 class="box-header">Acompanhe o Interlegis</h2>
    134       TODO: Acompanhe o Interlegis... <br/><br/><br/>
    135 ''')
    136 class IAcompanheOInterlegis(Interface):
    137     pass
    138 
    139 @template('''
    140       TODO: tabs dos pilares <br/><br/><br/>
    141 ''')
    142 class ITabsPilares(Interface):
    143     pass
    144 
    145 @template('''
    146       <h2 class="box-header">Destaque</h2>
    147       TODO: <br/><br/><br/>
    148 ''')
    149 class IHighlight(Interface):
    150     pass
    151 
    152 def box_schemas():
    153     return template_dict.keys()
  • PortalInterlegis/produtos/il.portalinterlegis/trunk/src/il/portalinterlegis/tests/testintegration.py

    r6493 r6495  
    66
    77from fixtures import IL_PORTALINTERLEGIS_INTEGRATION_TESTING
    8 from il.portalinterlegis.browser.boxes import BoxManager
     8from il.portalinterlegis.browser.boxes.interfaces import ISimpleBox
     9from il.portalinterlegis.browser.boxes.manager import BoxManager
    910from il.portalinterlegis.browser.interfaces import \
    10      IComunidadeLegislativa, IInformacao, ICapacitacao, ITecnologia, IComunicacao, \
    11      ISimpleBox
     11     IComunidadeLegislativa, IInformacao, ICapacitacao, ITecnologia, IComunicacao
    1212
    1313
  • PortalInterlegis/produtos/il.portalinterlegis/trunk/src/il/portalinterlegis/tests/testunitboxes.py

    r6493 r6495  
    33from mock import patch
    44
    5 from il.portalinterlegis.browser.boxes import BoxManager, row_html
    6 from il.portalinterlegis.browser.interfaces import ISimpleBox
     5from il.portalinterlegis.browser.boxes.manager import BoxManager, row_html
     6from il.portalinterlegis.browser.boxes.interfaces import ISimpleBox
    77from mockutils import *
     8from itertools import count
    89
    910_ = None # anything, doesn't really matter
     
    1415
    1516    def setUp(self):
    16         pass
     17        self.diff_count = count(1)
    1718
    18     def assertEqual(self, first, second, *args):
     19    def assertMultiLineEqual(self, first, second, *args):
    1920        "ignores differences in leading and trailing whitespace in strings"
    20         super(TestUnitBoxes, self).assertMultiLineEqual(
    21             isinstance(first, str) and first.strip() or first,
    22             isinstance(second, str) and second.strip() or second, *args)
     21        self.assert_(isinstance(first, basestring), (
     22                'First argument is not a string'))
     23        self.assert_(isinstance(second, basestring), (
     24                'Second argument is not a string'))
     25
     26        first = first.strip()
     27        second = second.strip()
     28        if first != second:
     29            c = self.diff_count.next()
     30            for i, s in enumerate([first, second]):
     31                with open("out_%s.%s" % (c, i), "w+") as f:
     32                    f.write(s)
     33        super(TestUnitBoxes, self).assertMultiLineEqual(first, second, *args)
    2334
    2435    def test_html(self):
     
    2738
    2839            boxmanager = BoxManager(ISimpleBox)
    29             self.assertEqual('''
     40            self.assertMultiLineEqual('''
    3041      <div class="simple-box">
    3142        <a href="/portal/alvo">
     
    4859                    self.assertIs(context, c)
    4960
    50                 from itertools import count
    5161                numbers = count(1)
    5262                @return_values(mock_box_key, [1, 2, 3, 4])
     
    5464                    self.assertIs(numbers.next(), n)
    5565
    56                 self.assertEqual('''
     66                self.assertMultiLineEqual('''
    5767  <div class="dt-row">
    5868    <div id="1" class=" dt-cell dt-position-0 dt-width-1">
Note: Veja TracChangeset para ajuda no uso do visualizador de conjunto de mudanças.
 

The contents and data of this website are published under license:
Creative Commons 4.0 Brasil - Atribuir Fonte - Compartilhar Igual.