source: main/waeup.ikoba/trunk/src/waeup/ikoba/documents/browser.py @ 12231

Last change on this file since 12231 was 12229, checked in by Henrik Bettermann, 10 years ago

We do not need the HTMLDisplayWidget. Use simple helper function instead. Tests will follow.

  • Property svn:keywords set to Id
File size: 9.2 KB
Line 
1## $Id: browser.py 12229 2014-12-14 15:45:55Z henrik $
2##
3## Copyright (C) 2014 Uli Fouquet & Henrik Bettermann
4## This program is free software; you can redistribute it and/or modify
5## it under the terms of the GNU General Public License as published by
6## the Free Software Foundation; either version 2 of the License, or
7## (at your option) any later version.
8##
9## This program is distributed in the hope that it will be useful,
10## but WITHOUT ANY WARRANTY; without even the implied warranty of
11## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12## GNU General Public License for more details.
13##
14## You should have received a copy of the GNU General Public License
15## along with this program; if not, write to the Free Software
16## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17##
18"""UI components for documents offered for download by the company.
19"""
20
21import sys
22import grok
23import pytz
24from urllib import urlencode
25from datetime import datetime
26from hurry.workflow.interfaces import (
27    IWorkflowInfo, IWorkflowState, InvalidTransitionError)
28from zope.event import notify
29from zope.i18n import translate
30from zope.catalog.interfaces import ICatalog
31from zope.component import queryUtility, getUtility, createObject
32from zope.schema.interfaces import ConstraintNotSatisfied, RequiredMissing
33from zope.formlib.textwidgets import BytesDisplayWidget
34from zope.security import checkPermission
35from waeup.ikoba.utils.helpers import html2dict
36from waeup.ikoba.interfaces import MessageFactory as _
37from waeup.ikoba.interfaces import (
38    IContactForm, IObjectHistory, IIkobaObject, IIkobaUtils)
39from waeup.ikoba.browser.layout import (
40    IkobaPage, IkobaEditFormPage, IkobaAddFormPage, IkobaDisplayFormPage,
41    IkobaForm, NullValidator, jsaction, action, UtilityView)
42from waeup.ikoba.widgets.datewidget import (
43    FriendlyDateWidget, FriendlyDateDisplayWidget,
44    FriendlyDatetimeDisplayWidget)
45from waeup.ikoba.browser.breadcrumbs import Breadcrumb
46from waeup.ikoba.browser.pages import (
47    delSubobjects, add_local_role, del_local_roles, msave,
48    LocalRoleAssignmentUtilityView)
49
50from waeup.ikoba.documents.interfaces import (
51    IDocumentsContainer, IPublicDocument, IHTMLDocument, IDocumentsUtils)
52
53grok.context(IIkobaObject) # Make IKofaObject the default context
54grok.templatedir('browser_templates')
55
56
57class DocumentsBreadcrumb(Breadcrumb):
58    """A breadcrumb for the customers container.
59    """
60    grok.context(IDocumentsContainer)
61    title = _('Documents')
62
63
64class DocumentBreadcrumb(Breadcrumb):
65    """A breadcrumb for the customer container.
66    """
67    grok.context(IPublicDocument)
68
69    def title(self):
70        return self.context.title
71
72
73class DocumentsContainerPage(IkobaDisplayFormPage):
74    """The standard view for document containers.
75    """
76    grok.context(IDocumentsContainer)
77    grok.name('index')
78    grok.require('waeup.viewDocuments')
79    grok.template('containerpage')
80    pnav = 2
81    label = _('Documents')
82
83
84class DocumentsContainerManageFormPage(IkobaEditFormPage,
85                                      LocalRoleAssignmentUtilityView):
86    """The manage page for customer containers.
87    """
88    grok.context(IDocumentsContainer)
89    grok.name('manage')
90    grok.require('waeup.manageDocuments')
91    grok.template('containermanagepage')
92    pnav = 2
93    label = _('Manage document section')
94
95    @action(_('Add document'), validator=NullValidator, style='primary')
96    def addSubunit(self, **data):
97        self.redirect(self.url(self.context, 'adddoc'))
98        return
99
100    @jsaction(_('Remove selected documents'))
101    def delDocuments(self, **data):
102        delSubobjects(self, redirect='manage', tab='2')
103        return
104
105    @action(_('Cancel'), validator=NullValidator)
106    def cancel(self, **data):
107        self.redirect(self.url(self.context))
108        return
109
110
111class DocumentAddFormPage(IkobaAddFormPage):
112    """Add-form to add a customer.
113    """
114    grok.context(IDocumentsContainer)
115    grok.require('waeup.manageDocuments')
116    grok.name('adddoc')
117    grok.template('documentaddform')
118    label = _('Add document')
119    pnav = 2
120
121    form_fields = grok.AutoFields(IPublicDocument)
122
123    @property
124    def selectable_doctypes(self):
125        doctypes = getUtility(IDocumentsUtils).SELECTABLE_DOCTYPES_DICT
126        return sorted(doctypes.items())
127
128    @action(_('Add document'), style='primary')
129    def createDocument(self, **data):
130        form = self.request.form
131        doctype = form.get('doctype', None)
132        # Here we can create various instances of PublicDocument derived
133        # classes depending on the doctype parameter given in form.
134        document = createObject('waeup.%s' % doctype)
135        self.applyData(document, **data)
136        self.context.addDocument(document)
137        doctype = getUtility(IDocumentsUtils).SELECTABLE_DOCTYPES_DICT[doctype]
138        self.flash(_('${a} added.', mapping = {'a': doctype}))
139        ob_class = self.__implemented__.__name__.replace('waeup.ikoba.','')
140        self.context.__parent__.logger.info(
141            '%s - added: %s %s' % (ob_class, doctype, document.document_id))
142        self.redirect(self.url(self.context, u'manage'))
143        return
144
145    @action(_('Cancel'), validator=NullValidator)
146    def cancel(self, **data):
147        self.redirect(self.url(self.context))
148
149
150class DocumentDisplayFormPage(IkobaDisplayFormPage):
151    """ Page to display document data
152    """
153    grok.context(IPublicDocument)
154    grok.name('index')
155    grok.require('waeup.viewDocuments')
156    grok.template('documentpage')
157    pnav = 2
158
159    @property
160    def form_fields(self):
161        return grok.AutoFields(self.context.form_fields_interface)
162
163    @property
164    def label(self):
165        return self.context.title
166
167
168class HTMLDocumentDisplayFormPage(DocumentDisplayFormPage):
169    """ Page to display html document data
170    """
171    grok.context(IHTMLDocument)
172    grok.template('htmldocumentpage')
173
174    @property
175    def form_fields(self):
176        return grok.AutoFields(self.context.form_fields_interface).omit(
177            'html_dict', 'html_multilang')
178
179    @property
180    def html(self):
181        lang = self.request.cookies.get('ikoba.language')
182        html = self.context.html_dict.get(lang,'')
183        if html =='':
184            portal_language = getUtility(IIkobaUtils).PORTAL_LANGUAGE
185            html = self.context.html_dict.get(portal_language,'')
186        return html
187
188
189class DocumentManageFormPage(IkobaEditFormPage,
190                            LocalRoleAssignmentUtilityView):
191    """ View to manage document data
192    """
193    grok.context(IPublicDocument)
194    grok.name('manage')
195    grok.require('waeup.manageDocuments')
196    grok.template('documentmanagepage')
197    pnav = 2
198
199    taboneactions = [_('Save'),_('Cancel')]
200    tabthreeactions1 = [_('Remove selected local roles')]
201    tabthreeactions2 = [_('Add local role')]
202
203    deletion_warning = _('Are you sure?')
204
205    @property
206    def form_fields(self):
207        return grok.AutoFields(self.context.form_fields_interface)
208
209    def label(self):
210        return _('Manage document ') + self.context.document_id
211
212    @action(_('Save'), style='primary')
213    def save(self, **data):
214        return msave(self, **data)
215
216    @action(_('Cancel'), validator=NullValidator)
217    def cancel(self, **data):
218        self.redirect(self.url(self.context))
219        return
220
221    @action(_('Add local role'), validator=NullValidator)
222    def addLocalRole(self, **data):
223        return add_local_role(self,2,**data)
224
225    @action(_('Remove selected local roles'))
226    def delLocalRoles(self, **data):
227        return del_local_roles(self,2,**data)
228
229
230class HTMLDocumentManageFormPage(DocumentManageFormPage):
231    """ View to manage htmldocument data
232    """
233    grok.context(IHTMLDocument)
234
235    @action(_('Save'), style='primary')
236    def save(self, **data):
237        msave(self, **data)
238        html_multilang = getattr(self.context, 'html_multilang', None)
239        portal_language = getUtility(IIkobaUtils).PORTAL_LANGUAGE
240        self.context.html_dict = html2dict(html_multilang, portal_language)
241        return
242
243
244class DocumentTriggerTransitionFormPage(IkobaEditFormPage):
245    """ View to trigger public document transitions
246    """
247    grok.context(IPublicDocument)
248    grok.name('trigtrans')
249    grok.require('waeup.triggerTransition')
250    grok.template('trigtrans')
251    label = _('Trigger document transition')
252    pnav = 2
253
254    def update(self):
255        return super(IkobaEditFormPage, self).update()
256
257    def getTransitions(self):
258        """Return a list of dicts of allowed transition ids and titles.
259
260        Each list entry provides keys ``name`` and ``title`` for
261        internal name and (human readable) title of a single
262        transition.
263        """
264        wf_info = IWorkflowInfo(self.context)
265        allowed_transitions = [t for t in wf_info.getManualTransitions()]
266        return [dict(name='', title=_('No transition'))] +[
267            dict(name=x, title=y) for x, y in allowed_transitions]
268
269    @action(_('Save'), style='primary')
270    def save(self, **data):
271        form = self.request.form
272        if 'transition' in form and form['transition']:
273            transition_id = form['transition']
274            wf_info = IWorkflowInfo(self.context)
275            try:
276                wf_info.fireTransition(transition_id)
277            except InvalidTransitionError, error:
278                self.flash(error, type="warning")
279        return
Note: See TracBrowser for help on using the repository browser.