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

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

Setup html documents. This technique replaces the usage of the HTMLDisplayWidget.

  • Property svn:keywords set to Id
File size: 9.6 KB
RevLine 
[12206]1## $Id: browser.py 12227 2014-12-14 14:59:41Z 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
[12215]26from hurry.workflow.interfaces import (
27    IWorkflowInfo, IWorkflowState, InvalidTransitionError)
[12206]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
[12227]34from zope.formlib.widget import renderElement
[12206]35from zope.security import checkPermission
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 (
[12227]51    IDocumentsContainer, IPublicDocument, IHTMLDocument, IDocumentsUtils)
[12206]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    """
[12214]67    grok.context(IPublicDocument)
[12206]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
[12214]95    @action(_('Add document'), validator=NullValidator, style='primary')
96    def addSubunit(self, **data):
97        self.redirect(self.url(self.context, 'adddoc'))
98        return
[12206]99
[12214]100    @jsaction(_('Remove selected documents'))
[12206]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')
[12214]116    grok.name('adddoc')
117    grok.template('documentaddform')
[12206]118    label = _('Add document')
119    pnav = 2
120
[12215]121    form_fields = grok.AutoFields(IPublicDocument)
122
[12214]123    @property
124    def selectable_doctypes(self):
125        doctypes = getUtility(IDocumentsUtils).SELECTABLE_DOCTYPES_DICT
126        return sorted(doctypes.items())
127
[12222]128    @action(_('Add document'), style='primary')
[12214]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)
[12206]135        self.applyData(document, **data)
[12214]136        self.context.addDocument(document)
137        doctype = getUtility(IDocumentsUtils).SELECTABLE_DOCTYPES_DICT[doctype]
138        self.flash(_('${a} added.', mapping = {'a': doctype}))
[12206]139        ob_class = self.__implemented__.__name__.replace('waeup.ikoba.','')
140        self.context.__parent__.logger.info(
[12214]141            '%s - added: %s %s' % (ob_class, doctype, document.document_id))
[12220]142        self.redirect(self.url(self.context, u'manage'))
[12206]143        return
144
[12214]145    @action(_('Cancel'), validator=NullValidator)
146    def cancel(self, **data):
147        self.redirect(self.url(self.context))
[12206]148
[12214]149
[12206]150class DocumentDisplayFormPage(IkobaDisplayFormPage):
151    """ Page to display document data
152    """
[12214]153    grok.context(IPublicDocument)
[12206]154    grok.name('index')
155    grok.require('waeup.viewDocuments')
[12215]156    grok.template('documentpage')
[12206]157    pnav = 2
158
159    @property
[12214]160    def form_fields(self):
161        return grok.AutoFields(self.context.form_fields_interface)
162
163    @property
[12206]164    def label(self):
165        return self.context.title
166
167
[12227]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
[12206]189class DocumentManageFormPage(IkobaEditFormPage,
190                            LocalRoleAssignmentUtilityView):
191    """ View to manage document data
192    """
[12214]193    grok.context(IPublicDocument)
[12206]194    grok.name('manage')
195    grok.require('waeup.manageDocuments')
196    grok.template('documentmanagepage')
197    pnav = 2
198
199    taboneactions = [_('Save'),_('Cancel')]
[12227]200    tabthreeactions1 = [_('Remove selected local roles')]
201    tabthreeactions2 = [_('Add local role')]
[12206]202
[12225]203    deletion_warning = _('Are you sure?')
204
[12214]205    @property
206    def form_fields(self):
207        return grok.AutoFields(self.context.form_fields_interface)
208
[12206]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):
[12215]227        return del_local_roles(self,2,**data)
228
229
[12227]230class HTMLDocumentManageFormPage(DocumentManageFormPage):
231    """ View to manage htmldocument data
232    """
233    grok.context(IHTMLDocument)
234
235    def _html_dict(self):
236        value = getattr(self.context, 'html_multilang', '')
237        parts = value.split('>>')
238        elements = {}
239        lang = getUtility(IIkobaUtils).PORTAL_LANGUAGE
240        for part in parts:
241            if part[2:4] == u'<<':
242                lang = part[0:2].lower()
243                text = part[4:]
244                elements[lang] = renderElement(u'div id="html"',
245                    contents=text)
246            else:
247                text = part
248                elements[lang] = renderElement(u'div id="html"',
249                    contents=text)
250        return elements
251
252    @action(_('Save'), style='primary')
253    def save(self, **data):
254        msave(self, **data)
255        self.context.html_dict = self._html_dict()
256        return
257
258
[12215]259class DocumentTriggerTransitionFormPage(IkobaEditFormPage):
260    """ View to trigger public document transitions
261    """
262    grok.context(IPublicDocument)
263    grok.name('trigtrans')
264    grok.require('waeup.triggerTransition')
265    grok.template('trigtrans')
266    label = _('Trigger document transition')
267    pnav = 2
268
269    def update(self):
270        return super(IkobaEditFormPage, self).update()
271
272    def getTransitions(self):
273        """Return a list of dicts of allowed transition ids and titles.
274
275        Each list entry provides keys ``name`` and ``title`` for
276        internal name and (human readable) title of a single
277        transition.
278        """
279        wf_info = IWorkflowInfo(self.context)
280        allowed_transitions = [t for t in wf_info.getManualTransitions()]
281        return [dict(name='', title=_('No transition'))] +[
282            dict(name=x, title=y) for x, y in allowed_transitions]
283
284    @action(_('Save'), style='primary')
285    def save(self, **data):
286        form = self.request.form
287        if 'transition' in form and form['transition']:
288            transition_id = form['transition']
289            wf_info = IWorkflowInfo(self.context)
290            try:
291                wf_info.fireTransition(transition_id)
292            except InvalidTransitionError, error:
293                self.flash(error, type="warning")
294        return
Note: See TracBrowser for help on using the repository browser.