Example #1
0
    def handleSave(self, action):
        data, errors = self.extractData()

        if errors:
            self.status = self.formErrorsMessage
            return

        with ZipFile(data['message'].open(), 'r') as zipfile:
            try:
                zipinfo = zipfile.getinfo('message.xml')
            except KeyError:
                self.set_form_error(
                    _(u'Invalid message. Missing message.xml'),
                    self.widgets['message'])
                return

            xml = zipfile.read(zipinfo)

            try:
                message = ech0147t1.CreateFromDocument(xml)
            except UnrecognizedContentError as e:
                self.set_form_error(
                    _(u'msg_ech0147_invalid_content',
                        default=u'Invalid content. ${details}',
                        mapping={'details': e.details()}),
                    self.widgets['message'])
                return

            if (IRepositoryFolder.providedBy(self.context) and
                    message.content_.documents):
                self.set_form_error(
                    _(u'This message contains toplevel documents. '
                      'It can only be imported within a dossier.'),
                    self.widgets['message'])
                return

            if message.content_.documents:
                for document in message.content_.documents.document:
                    try:
                        create_document(self.context, document, zipfile)
                    except BadRequest as exc:
                        return self._import_error(exc)

            if message.content_.dossiers:
                for dossier in message.content_.dossiers.dossier:
                    try:
                        create_dossier(
                            self.context, dossier, zipfile,
                            data['responsible'])
                    except BadRequest as exc:
                        return self._import_error(exc)

        self.import_successful = True
Example #2
0
    def handleSave(self, action):
        data, errors = self.extractData()

        if errors:
            self.status = self.formErrorsMessage
            return

        with ZipFile(data['message'].open(), 'r') as zipfile:
            try:
                zipinfo = zipfile.getinfo('message.xml')
            except KeyError:
                self.set_form_error(_(u'Invalid message. Missing message.xml'),
                                    self.widgets['message'])
                return

            xml = zipfile.read(zipinfo)

            try:
                message = ech0147t1.CreateFromDocument(xml)
            except UnrecognizedContentError as e:
                self.set_form_error(
                    _(u'msg_ech0147_invalid_content',
                      default=u'Invalid content. ${details}',
                      mapping={'details': e.details()}),
                    self.widgets['message'])
                return

            if (IRepositoryFolder.providedBy(self.context)
                    and message.content_.documents):
                self.set_form_error(
                    _(u'This message contains toplevel documents. '
                      'It can only be imported within a dossier.'),
                    self.widgets['message'])
                return

            if message.content_.documents:
                for document in message.content_.documents.document:
                    try:
                        create_document(self.context, document, zipfile)
                    except BadRequest as exc:
                        return self._import_error(exc)

            if message.content_.dossiers:
                for dossier in message.content_.dossiers.dossier:
                    try:
                        create_dossier(self.context, dossier, zipfile,
                                       data['responsible'])
                    except BadRequest as exc:
                        return self._import_error(exc)

        self.import_successful = True
Example #3
0
 def render(self):
     if not self.enabled():
         raise NotFound()
     if self.import_successful:
         IStatusMessage(self.request).addStatusMessage(
             _(u"Message has been imported"), type='info')
         self.request.response.redirect(self.context.absolute_url())
     return super(ECH0147ImportForm, self).render()
Example #4
0
 def render(self):
     if not self.enabled():
         raise NotFound()
     if self.import_successful:
         IStatusMessage(self.request).addStatusMessage(
             _(u"Message has been imported"), type='info')
         self.request.response.redirect(self.context.absolute_url())
     return super(ECH0147ImportForm, self).render()
Example #5
0
 def _import_error(self, exc):
     transaction.abort()
     error_msg = ''
     for error in exc.message:
         error_msg += '%s: %s' % (error['field'], error['message'])
     self.status = _(u'Message import failed. ${details}',
                     mapping={'details': error_msg})
     return
Example #6
0
 def _import_error(self, exc):
     transaction.abort()
     error_msg = ''
     for error in exc.message:
         error_msg += '%s: %s' % (
             error['field'], error['message'])
     self.status = _(u'Message import failed. ${details}',
                     mapping={'details': error_msg})
     return
Example #7
0
class IECH0147ImportFormSchema(Schema):

    message = namedfile.NamedBlobFile(
        title=_(u'label_message', default=u'File'),
        description=_(u'help_message',
                      default=u'A ZIP file containing an eCH-147 message.'),
        required=True,
    )

    directives.widget('responsible', KeywordFieldWidget, async=True)
    responsible = schema.Choice(
        title=_(u'label_reponsible', default=u'Responsible'),
        description=_(u'help_responsible',
                      default=u'Responsible for dossiers created by eCH-0147 '
                      'import.'),
        source=AllUsersSourceBinder(),
        required=True,
    )
Example #8
0
    def handleExport(self, action):
        data, errors = self.extractData()

        if errors:
            self.status = self.formErrorsMessage
            return

        if data['paths']:
            objs = data['paths']
        else:
            objs = [self.context]

        message = model.MessageT1()
        message.action = data['action']
        message.recipient_id = data['recipients']
        if data['subject'] is not None:
            message.subjects = [data['subject']]
        if data['comment'] is not None:
            message.comments = [data['comment']]

        if data['directive']:
            directive = model.Directive(data['directive'])
            directive.priority = data['priority']
            directive.deadline = data['deadline']
            message.directive = directive

        journal_entry = _(u'label_exported_as_ech0147',
                          default=u'Exported as eCH-0147 message')
        for obj in objs:
            message.add_object(obj)
            journal_entry_factory(obj, 'eCH-0147 Export', journal_entry)

        header_dom = message.header().toDOM(element_name='eCH-0147T0:header')
        message_dom = message.binding().toDOM()

        tmpfile = TemporaryFile()
        with ZipFile(tmpfile, 'w', ZIP_DEFLATED, True) as zipfile:
            zipfile.writestr(
                'header.xml', header_dom.toprettyxml(encoding='UTF-8'))
            zipfile.writestr(
                'message.xml', message_dom.toprettyxml(encoding='UTF-8'))
            message.add_to_zip(zipfile)

        size = tmpfile.tell()

        response = self.request.response
        response.setHeader(
            "Content-Disposition",
            'inline; filename="message.zip"')
        response.setHeader("Content-type", "application/zip")
        response.setHeader("Content-Length", size)

        self.response_body = TempfileStreamIterator(tmpfile, size)
Example #9
0
    def handleExport(self, action):
        data, errors = self.extractData()

        if errors:
            self.status = self.formErrorsMessage
            return

        if data['paths']:
            objs = data['paths']
        else:
            objs = [self.context]

        message = model.MessageT1()
        message.action = data['action']
        message.recipient_id = data['recipients']
        if data['subject'] is not None:
            message.subjects = [data['subject']]
        if data['comment'] is not None:
            message.comments = [data['comment']]

        if data['directive']:
            directive = model.Directive(data['directive'])
            directive.priority = data['priority']
            directive.deadline = data['deadline']
            message.directive = directive

        journal_entry = _(u'label_exported_as_ech0147',
                          default=u'Exported as eCH-0147 message')
        for obj in objs:
            message.add_object(obj)
            journal_entry_factory(obj, 'eCH-0147 Export', journal_entry)

        header_dom = message.header().toDOM(element_name='eCH-0147T0:header')
        message_dom = message.binding().toDOM()

        tmpfile = TemporaryFile()
        with ZipFile(tmpfile, 'w', ZIP_DEFLATED, True) as zipfile:
            zipfile.writestr(
                'header.xml', header_dom.toprettyxml(encoding='UTF-8'))
            zipfile.writestr(
                'message.xml', message_dom.toprettyxml(encoding='UTF-8'))
            message.add_to_zip(zipfile)

        size = tmpfile.tell()

        response = self.request.response
        response.setHeader(
            "Content-Disposition",
            'inline; filename="message.zip"')
        response.setHeader("Content-type", "application/zip")
        response.setHeader("Content-Length", size)

        self.response_body = TempfileStreamIterator(tmpfile, size)
Example #10
0
    def _import_error(self, item, exc):
        transaction.abort()

        errors = []
        for error in exc.message:
            msg = u'{} `{}`: {}'.format(
                translate(_(u'label_field', default=u'Field'),
                          context=self.request), error['field'],
                translate(error['message'],
                          domain='plone',
                          context=self.request))
            errors.append(msg)

        self.rendered_error_message = _(
            u"Message import failed. The object ${title} has invalid "
            "field data. <br /> ${details}",
            mapping={
                'title': item.titles.title[0].value(),
                'details': u'<br />'.join(errors)
            })

        return
Example #11
0
    def handleSave(self, action):
        data, errors = self.extractData()

        if errors:
            self.status = self.formErrorsMessage
            return

        with ZipFile(data['message'].open(), 'r') as zipfile:
            try:
                zipinfo = zipfile.getinfo('message.xml')
            except KeyError:
                self.status = _(u'Invalid message. Missing message.xml')
                return

            xml = zipfile.read(zipinfo)

            message = ech0147t1.CreateFromDocument(xml)
            if message.content_.documents and message.content_.dossiers:
                self.status = _(u'Messages containing toplevel dossiers and '
                                'toplevel documents are not supported')
                return

            if message.content_.dossiers:
                for dossier in message.content_.dossiers.dossier:
                    try:
                        create_dossier(self.context, dossier, zipfile,
                                       data['responsible'])
                    except BadRequest as exc:
                        transaction.abort()
                        error_msg = ''
                        for error in exc.message:
                            error_msg += '%s: %s' % (error['field'],
                                                     error['message'])
                        self.status = _(u'Message import failed. ${details}',
                                        mapping={'details': error_msg})
                        return

        self.import_successful = True
Example #12
0
class ECH0147ImportForm(AutoExtensibleForm, form.Form):
    schema = IECH0147ImportFormSchema
    ignoreContext = True  # don't use context to get widget data
    label = _(u'label_ech0147_import_form', u'eCH 0147 Import')
    import_successful = False

    @button.buttonAndHandler(_(u'label_import', default=u'Import'))
    def handleSave(self, action):
        data, errors = self.extractData()

        if errors:
            self.status = self.formErrorsMessage
            return

        with ZipFile(data['message'].open(), 'r') as zipfile:
            try:
                zipinfo = zipfile.getinfo('message.xml')
            except KeyError:
                self.status = _(u'Invalid message. Missing message.xml')
                return

            xml = zipfile.read(zipinfo)

            message = ech0147t1.CreateFromDocument(xml)
            if message.content_.documents and message.content_.dossiers:
                self.status = _(u'Messages containing toplevel dossiers and '
                                'toplevel documents are not supported')
                return

            if message.content_.dossiers:
                for dossier in message.content_.dossiers.dossier:
                    try:
                        create_dossier(self.context, dossier, zipfile,
                                       data['responsible'])
                    except BadRequest as exc:
                        transaction.abort()
                        error_msg = ''
                        for error in exc.message:
                            error_msg += '%s: %s' % (error['field'],
                                                     error['message'])
                        self.status = _(u'Message import failed. ${details}',
                                        mapping={'details': error_msg})
                        return

        self.import_successful = True

    @button.buttonAndHandler(_(u'label_cancel', default=u'Cancel'))
    def handleCancel(self, action):
        self.request.response.redirect(self.context.absolute_url())

    def updateActions(self):
        super(ECH0147ImportForm, self).updateActions()
        self.actions['label_import'].addClass("context")

    def updateWidgets(self):
        super(ECH0147ImportForm, self).updateWidgets()
        self.widgets['message'].value = None

        # Set default responsible to current user
        if not self.request.form.get('form.widgets.responsible'):
            user = ogds_service().fetch_current_user()
            if user is not None:
                self.widgets['responsible'].value = [user.userid]
                self.widgets['responsible'].update()

    def update(self):
        self.request.set('disable_border', 1)
        return super(ECH0147ImportForm, self).update()

    def render(self):
        if not self.enabled():
            raise NotFound()
        if self.import_successful:
            IStatusMessage(self.request).addStatusMessage(
                _(u"Message has been imported"), type='info')
            self.request.response.redirect(self.context.absolute_url())
        return super(ECH0147ImportForm, self).render()

    def available(self):
        if not self.enabled():
            return False
        if not IRepositoryFolder.providedBy(self.context):
            return False
        if self.context.is_leaf_node():
            return True
        return False

    def enabled(self):
        registry = getUtility(IRegistry)
        ech0147_settings = registry.forInterface(IECH0147Settings, check=False)
        return ech0147_settings.ech0147_import_enabled
Example #13
0
class ECH0147ImportForm(AutoExtensibleForm, form.Form):
    schema = IECH0147ImportFormSchema
    ignoreContext = True  # don't use context to get widget data
    label = _(u'label_ech0147_import_form', u'eCH 0147 Import')
    import_successful = False

    @button.buttonAndHandler(_(u'label_import', default=u'Import'))
    def handleSave(self, action):
        data, errors = self.extractData()

        if errors:
            self.status = self.formErrorsMessage
            return

        with ZipFile(data['message'].open(), 'r') as zipfile:
            try:
                zipinfo = zipfile.getinfo('message.xml')
            except KeyError:
                self.set_form_error(_(u'Invalid message. Missing message.xml'),
                                    self.widgets['message'])
                return

            xml = zipfile.read(zipinfo)

            try:
                message = ech0147t1.CreateFromDocument(xml)
            except UnrecognizedContentError as e:
                self.set_form_error(
                    _(u'msg_ech0147_invalid_content',
                      default=u'Invalid content. ${details}',
                      mapping={'details': e.details()}),
                    self.widgets['message'])
                return

            if IRepositoryFolder.providedBy(self.context) \
               and message.content_.documents:
                self.set_form_error(
                    _(u'This message contains toplevel documents. '
                      'It can only be imported within a dossier.'),
                    self.widgets['message'])
                return

            if message.content_.documents:
                for document in message.content_.documents.document:
                    try:
                        create_document(self.context, document, zipfile)
                    except BadRequest as exc:
                        return self._import_error(document, exc)

            if message.content_.dossiers:
                for dossier in message.content_.dossiers.dossier:
                    try:
                        create_dossier(self.context, dossier, zipfile,
                                       data['responsible'])
                    except BadRequest as exc:
                        return self._import_error(dossier, exc)

        self.import_successful = True

    @button.buttonAndHandler(_(u'label_cancel', default=u'Cancel'))
    def handleCancel(self, action):
        self.request.response.redirect(self.context.absolute_url())

    def updateActions(self):
        super(ECH0147ImportForm, self).updateActions()
        self.actions['label_import'].addClass("context")

    def updateWidgets(self):
        super(ECH0147ImportForm, self).updateWidgets()
        self.widgets['message'].value = None

        # Set default responsible to current user
        if not self.request.form.get('form.widgets.responsible'):
            user = ogds_service().fetch_current_user()
            if user is not None:
                self.widgets['responsible'].value = [user.userid]
                self.widgets['responsible'].update()

    def update(self):
        self.request.set('disable_border', 1)
        return super(ECH0147ImportForm, self).update()

    def render(self):
        if not self.enabled():
            raise NotFound()
        if self.import_successful:
            IStatusMessage(self.request).addStatusMessage(
                _(u"Message has been imported"), type='info')
            self.request.response.redirect(self.context.absolute_url())
        return super(ECH0147ImportForm, self).render()

    def available(self):
        if not self.enabled():
            return False
        if IDossierMarker.providedBy(self.context):
            return True
        if not IRepositoryFolder.providedBy(self.context):
            return False
        if self.context.is_leaf_node():
            return True
        return False

    def enabled(self):
        registry = getUtility(IRegistry)
        ech0147_settings = registry.forInterface(IECH0147Settings, check=False)
        return ech0147_settings.ech0147_import_enabled

    def set_form_error(self, error, widget):
        self.status = self.formErrorsMessage
        view = ErrorViewSnippet(error, self.request, widget)
        widget.error = view
        self.widgets.errors = (view, )

    def _import_error(self, item, exc):
        transaction.abort()

        errors = []
        for error in exc.message:
            msg = u'{} `{}`: {}'.format(
                translate(_(u'label_field', default=u'Field'),
                          context=self.request), error['field'],
                translate(error['message'],
                          domain='plone',
                          context=self.request))
            errors.append(msg)

        self.rendered_error_message = _(
            u"Message import failed. The object ${title} has invalid "
            "field data. <br /> ${details}",
            mapping={
                'title': item.titles.title[0].value(),
                'details': u'<br />'.join(errors)
            })

        return
Example #14
0
class IECH0147ExportFormSchema(Schema):

    recipients = schema.List(
        title=_(u'label_recipients', default=u'Recipient(s)'),
        description=_(u'help_recipients',
                      default=u'Recipients of the message. Enter one recipient'
                              ' per line.'),
        value_type=schema.TextLine(),
        required=False,
    )

    action = schema.Choice(
        title=_(u'label_action', default=u'Action'),
        description=_(u'help_action', default=u''),
        vocabulary=SimpleVocabulary([
            SimpleTerm(1, '1', _(u'term_action_1', default=u'new')),
            SimpleTerm(3, '3', _(u'term_action_3', default=u'revocation')),
            SimpleTerm(4, '4', _(u'term_action_4', default=u'correction')),
            SimpleTerm(5, '5', _(u'term_action_5', default=u'inquiry')),
            SimpleTerm(6, '6', _(u'term_action_6', default=u'response')),
            SimpleTerm(7, '7', _(u'term_action_7', default=u'key exchange')),
            SimpleTerm(10, '10', _(u'term_action_10', default=u'forwarding')),
            SimpleTerm(12, '12', _(u'term_action_12', default=u'reminder')),
        ]),
    )

    subject = schema.TextLine(
        title=_(u'label_subject', default=u'Subject'),
        required=False,
    )

    comment = schema.TextLine(
        title=_(u'label_comment', default=u'Comment'),
        required=False,
    )

    directive = schema.Choice(
        title=_(u'label_directive', default=u'Directive'),
        description=_(u'help_directive', default=u''),
        vocabulary=SimpleVocabulary([
            SimpleTerm(u'process', 'process',
                       _(u'term_directive_process', default=u'process')),
            SimpleTerm(u'external_process', 'external_process',
                       _(u'term_directive_external_process',
                         default=u'external process')),
            SimpleTerm(u'information', 'information',
                       _(u'term_directive_information',
                         default=u'informationrocess')),
            SimpleTerm(u'comment', 'comment',
                       _(u'term_directive_comment', default=u'comment')),
            SimpleTerm(u'approve', 'approve',
                       _(u'term_directive_approve', default=u'approve')),
            SimpleTerm(u'sign', 'sign',
                       _(u'term_directive_sign', default=u'sign')),
            SimpleTerm(u'send', 'send',
                       _(u'term_directive_send', default=u'send')),
            SimpleTerm(u'complete', 'complete',
                       _(u'term_directive_complete', default=u'complete')),
        ]),
        required=False,
    )

    priority = schema.Choice(
        title=_(u'label_priority', default=u'Priority'),
        vocabulary=SimpleVocabulary([
            SimpleTerm(u'undefined', 'undefined',
                       _(u'term_priority_undefined', default=u'undefined')),
            SimpleTerm(u'medium', 'medium',
                       _(u'term_priority_medium', default=u'medium')),
            SimpleTerm(u'high', 'high',
                       _(u'term_priority_high', default=u'high')),
        ]),
    )

    directives.widget(deadline=DatePickerFieldWidget)
    deadline = schema.Date(
        title=_(u'label_deadline', default=u'Deadline'),
        required=False,
    )

    directives.mode(paths='hidden')
    paths = RelationList(
        title=_(u'label_paths', default=u'Paths'),
        default=[],
        missing_value=[],
        value_type=RelationChoice(
            title=u"Path",
            source=ObjPathSourceBinder(
                object_provides=(
                    'opengever.dossier.behaviors.dossier.IDossierMarker',
                    'opengever.document.behaviors.IBaseDocument'),
                navigation_tree_query={
                    'object_provides':
                    ['opengever.repository.repositoryroot.IRepositoryRoot',
                     'opengever.repository.interfaces.IRepositoryFolder',
                     'opengever.dossier.behaviors.dossier.IDossierMarker'],
                }),
            ),
        required=False,
    )
Example #15
0
class ECH0147ExportForm(AutoExtensibleForm, form.Form):
    schema = IECH0147ExportFormSchema
    ignoreContext = True  # don't use context to get widget data
    label = _(u'label_ech0147_export_form', u'eCH 0147 Export')

    response_body = None

    @button.buttonAndHandler(_(u'label_export', default=u'Export'))
    def handleExport(self, action):
        data, errors = self.extractData()

        if errors:
            self.status = self.formErrorsMessage
            return

        if data['paths']:
            objs = data['paths']
        else:
            objs = [self.context]

        message = model.MessageT1()
        message.action = data['action']
        message.recipient_id = data['recipients']
        if data['subject'] is not None:
            message.subjects = [data['subject']]
        if data['comment'] is not None:
            message.comments = [data['comment']]

        if data['directive']:
            directive = model.Directive(data['directive'])
            directive.priority = data['priority']
            directive.deadline = data['deadline']
            message.directive = directive

        journal_entry = _(u'label_exported_as_ech0147',
                          default=u'Exported as eCH-0147 message')
        for obj in objs:
            message.add_object(obj)
            journal_entry_factory(obj, 'eCH-0147 Export', journal_entry)

        header_dom = message.header().toDOM(element_name='eCH-0147T0:header')
        message_dom = message.binding().toDOM()

        tmpfile = TemporaryFile()
        with ZipFile(tmpfile, 'w', ZIP_DEFLATED, True) as zipfile:
            zipfile.writestr(
                'header.xml', header_dom.toprettyxml(encoding='UTF-8'))
            zipfile.writestr(
                'message.xml', message_dom.toprettyxml(encoding='UTF-8'))
            message.add_to_zip(zipfile)

        size = tmpfile.tell()

        response = self.request.response
        response.setHeader(
            "Content-Disposition",
            'inline; filename="message.zip"')
        response.setHeader("Content-type", "application/zip")
        response.setHeader("Content-Length", size)

        self.response_body = TempfileStreamIterator(tmpfile, size)

    @button.buttonAndHandler(_(u'label_cancel', default=u'Cancel'))
    def handleCancel(self, action):
        self.request.response.redirect(self.context.absolute_url())

    def updateActions(self):
        super(ECH0147ExportForm, self).updateActions()
        self.actions['label_export'].addClass("context")

    def update(self):
        self.request.set('disable_border', 1)

        paths = self.request.form.get('paths', [])
        if paths:
            self.request.form.update({'form.widgets.paths': paths})

        return super(ECH0147ExportForm, self).update()

    def render(self):
        if not self.enabled():
            raise NotFound()
        if self.response_body is None:
            return super(ECH0147ExportForm, self).render()
        return self.response_body

    def available(self):
        if not self.enabled():
            return False
        if IDossierMarker.providedBy(self.context):
            return True
        return False

    def enabled(self):
        registry = getUtility(IRegistry)
        ech0147_settings = registry.forInterface(IECH0147Settings, check=False)
        return ech0147_settings.ech0147_export_enabled