|
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)}) |