src/ztfy/myams/page.py
changeset 0 8a19e25e39e4
child 10 f368f6dfd92d
equal deleted inserted replaced
-1:000000000000 0:8a19e25e39e4
       
     1 #
       
     2 # Copyright (c) 2012 Thierry Florac <tflorac AT onf.fr>
       
     3 # All Rights Reserved.
       
     4 #
       
     5 
       
     6 
       
     7 # import standard packages
       
     8 from datetime import datetime
       
     9 
       
    10 # import Zope3 interfaces
       
    11 from z3c.json.interfaces import IJSONWriter
       
    12 from z3c.template.interfaces import ILayoutTemplate
       
    13 from zope.authentication.interfaces import IAuthentication
       
    14 from zope.pagetemplate.interfaces import IPageTemplate
       
    15 
       
    16 # import local interfaces
       
    17 from zope.traversing.browser.absoluteurl import absoluteURL
       
    18 from ztfy.myams.interfaces import IInnerPage, IModalPage
       
    19 
       
    20 # import Zope3 packages
       
    21 from z3c.template.template import getPageTemplate, getLayoutTemplate
       
    22 from zope.component import getMultiAdapter, getUtility
       
    23 from zope.i18n import translate
       
    24 from zope.interface import implements
       
    25 from zope.publisher.browser import BrowserPage
       
    26 
       
    27 # import local packages
       
    28 from ztfy.utils.date import formatDatetime
       
    29 from ztfy.utils.text import textToHTML
       
    30 from ztfy.utils.timezone import tztime
       
    31 
       
    32 
       
    33 class BaseTemplateBasedPage(BrowserPage):
       
    34     """Base template based page"""
       
    35 
       
    36     template = getPageTemplate()
       
    37 
       
    38     def __call__(self):
       
    39         self.update()
       
    40         return self.render()
       
    41 
       
    42     def update(self):
       
    43         pass
       
    44 
       
    45     def render(self):
       
    46         if self.template is None:
       
    47             template = getMultiAdapter((self, self.request), IPageTemplate)
       
    48             return template(self)
       
    49         return self.template()
       
    50 
       
    51 
       
    52 class TemplateBasedPage(BaseTemplateBasedPage):
       
    53     """Template based page"""
       
    54 
       
    55     layout = getLayoutTemplate()
       
    56 
       
    57     def __call__(self):
       
    58         self.update()
       
    59         if self.layout is None:
       
    60             layout = getMultiAdapter((self, self.request), ILayoutTemplate)
       
    61             return layout(self)
       
    62         return self.layout()
       
    63 
       
    64 
       
    65 class BaseIndexPage(TemplateBasedPage):
       
    66     """Base index page"""
       
    67 
       
    68 
       
    69 class InnerPage(TemplateBasedPage):
       
    70     """Inner page"""
       
    71 
       
    72     implements(IInnerPage)
       
    73 
       
    74 
       
    75 class ModalPage(TemplateBasedPage):
       
    76     """Modal page"""
       
    77 
       
    78     implements(IModalPage)
       
    79 
       
    80 
       
    81 class ExceptionView(BrowserPage):
       
    82     """Base exception view"""
       
    83 
       
    84     @property
       
    85     def error_name(self):
       
    86         return self.context.__class__.__name__
       
    87 
       
    88     @property
       
    89     def error_message(self):
       
    90         return textToHTML(translate(getattr(self.context, 'message', u''), context=self.request) or
       
    91                           '\n'.join((str(arg) for arg in self.context.args)),
       
    92                           request=self.request)
       
    93 
       
    94     @property
       
    95     def error_datetime(self):
       
    96         return formatDatetime(tztime(datetime.utcnow()))
       
    97 
       
    98     @property
       
    99     def error_user(self):
       
   100         principal = self.request.principal
       
   101         return '%s (%s)' % (principal.title, principal.id)
       
   102 
       
   103     def __call__(self):
       
   104         writer = getUtility(IJSONWriter)
       
   105         return writer.write({'status': 'messagebox',
       
   106                              'messagebox': {'status': 'error',
       
   107                                             'content': self.error_message,
       
   108                                             'number': self.error_datetime,
       
   109                                             'icon': 'fa fa-warning animated shake'}})
       
   110 
       
   111 
       
   112 class UnauthorizedExceptionView(ExceptionView):
       
   113     """Unauthorized exception view"""
       
   114 
       
   115     def __call__(self):
       
   116         principal = self.request.principal
       
   117         auth = getUtility(IAuthentication)
       
   118         auth.unauthorized(principal.id, self.request)
       
   119         writer = getUtility(IJSONWriter)
       
   120         return writer.write({'status': 'modal',
       
   121                              'location': 'login-dialog.html' % absoluteURL(self.context, self.request)})