Beispiel #1
0
 def update_site(self):
     # update front-page
     frontpage = self.portal['front-page']
     if frontpage.Title() == 'Gestion du courrier 2.2':
         frontpage.setTitle(_("front_page_title"))
         frontpage.setDescription(_("front_page_descr"))
         frontpage.setText(_("front_page_text"), mimetype='text/html')
     # update portal title
     self.portal.title = 'Gestion du courrier 2.3'
     # set om folder as default page
     self.portal.templates.setDefaultPage('om')
     # change permission to remove dashboard from user menu
     self.portal.manage_permission('Portlets: Manage own portlets',
                                   ('Manager', 'Site Administrator'),
                                   acquire=0)
     # clean old messages
     if 'doc' in self.portal['messages-config']:
         api.content.delete(self.portal['messages-config']['doc'])
     add_message(
         'doc',
         'Documentation',
         u'<p>Vous pouvez consulter la <a href="https://docs.imio.be/'
         u'imio-doc/ia.docs/" target="_blank">documentation en ligne de la '
         u'version 2.3</a>, dont <a href="https://docs.imio.be/imio-doc/ia.docs/changelog" '
         u'target="_blank">les nouvelles fonctionnalités</a> ainsi que d\'autres documentations liées.</p>',
         msg_type='significant',
         can_hide=True,
         req_roles=['Authenticated'],
         activate=True)
     if 'new-version' in self.portal['messages-config']:
         api.content.delete(self.portal['messages-config']['new-version'])
     # update plonegroup
     if not get_registry_groups_mgt():
         set_registry_groups_mgt(['dir_general', 'encodeurs', 'expedition'])
         functions = get_registry_functions()
         for dic in functions:
             if dic['fct_id'] == u'encodeur':
                 dic['fct_title'] = u'Créateur CS'
         set_registry_functions(functions)
     # add group
     if api.group.get('lecteurs_globaux_ce') is None:
         api.group.create('lecteurs_globaux_ce', '2 Lecteurs Globaux CE')
     # change local roles
     fti = getUtility(IDexterityFTI, name='dmsincomingmail')  # i_e ok
     lr = getattr(fti, 'localroles')
     lrsc = lr['static_config']
     for state in [
             'proposed_to_manager', 'proposed_to_n_plus_1',
             'proposed_to_agent', 'in_treatment', 'closed'
     ]:
         if state in lrsc:
             if 'lecteurs_globaux_ce' not in lrsc[state]:
                 lrsc[state]['lecteurs_globaux_ce'] = {'roles': ['Reader']}
     lr._p_changed = True  # We need to indicate that the object has been modified and must be "saved"
     # mark tabs to add count on
     for folder_id in ('incoming-mail', 'outgoing-mail', 'tasks'):
         folder = self.portal[folder_id]
         if not ICountableTab.providedBy(folder):
             alsoProvides(folder, ICountableTab)
             folder.reindexObject(idxs='object_provides')
Beispiel #2
0
    def create_tasks_folder(self):
        if base_hasattr(self.portal['incoming-mail'], 'task-searches'):
            api.content.delete(obj=self.portal['incoming-mail']['task-searches'])
        if not base_hasattr(self.portal, 'tasks'):
            self.portal.invokeFactory("Folder", id='tasks', title=_(u"Tasks"))
            tsk_folder = getattr(self.portal, 'tasks')
            self.portal.moveObjectToPosition('tasks', self.portal.getObjectPosition('contacts'))
            # add task-searches
            col_folder = add_db_col_folder(tsk_folder, 'task-searches', _("Tasks searches"),
                                           _("Tasks"))
            alsoProvides(col_folder, INextPrevNotNavigable)
            alsoProvides(col_folder, ITaskDashboard)
            createTaskCollections(col_folder)
            createStateCollections(col_folder, 'task')
            configure_faceted_folder(col_folder, xml='im-task-searches.xml',
                                     default_UID=col_folder['all_tasks'].UID())
            # configure tasks faceted
            configure_faceted_folder(tsk_folder, xml='default_dashboard_widgets.xml',
                                     default_UID=col_folder['all_tasks'].UID())

            tsk_folder.setConstrainTypesMode(1)
            tsk_folder.setLocallyAllowedTypes(['task'])
            tsk_folder.setImmediatelyAddableTypes(['task'])
            self.portal.portal_workflow.doActionFor(tsk_folder, "show_internally")
            logger.info('tasks folder created')
Beispiel #3
0
    def replaceCollections(self, im_folder):
        """ Replace Collection by DashboardCollection """
        if 'collections' in im_folder:
            api.content.delete(im_folder['collections'])

        im_folder.setConstrainTypesMode(0)
        col_folder = add_db_col_folder(im_folder, 'mail-searches',
                                       _("Incoming mail searches"),
                                       _('Incoming mails'))
        alsoProvides(col_folder, INextPrevNotNavigable)
        alsoProvides(col_folder, IIMDashboard)
        im_folder.moveObjectToPosition('mail-searches', 0)

        # re-create dashboard collections
        createIMailCollections(col_folder)
        createStateCollections(col_folder, 'dmsincomingmail')  # i_e ok
        configure_faceted_folder(col_folder,
                                 xml='im-mail-searches.xml',
                                 default_UID=col_folder['all_mails'].UID())

        col_folder = add_db_col_folder(im_folder, 'task-searches',
                                       _("Tasks searches"), _("Tasks"))
        im_folder.moveObjectToPosition('task-searches', 1)
        createTaskCollections(col_folder)
        createStateCollections(col_folder, 'task')
        configure_faceted_folder(col_folder,
                                 xml='im-task-searches.xml',
                                 default_UID=col_folder['all_tasks'].UID())

        im_folder.setConstrainTypesMode(1)
Beispiel #4
0
 def _update(self):
     self.voc = self.available_folders_voc()
     self.do_apply = len(self.voc) > 0
     self.fields += Fields(schema.List(
         __name__='folders',
         title=_(u'Folders'),
         value_type=schema.Choice(vocabulary=self.voc),
         description=(self.do_apply and
                      _(u'Select multiple values (CTRL+click)') or
                      _(u'No folder available where you can add templates.')),
         required=self.do_apply))
     self.fields["folders"].widgetFactory = SelectFieldWidget
Beispiel #5
0
class IIMFieldsSchema(Interface):
    field_name = schema.Choice(
        title=_(u'Field name'),
        vocabulary=u'imio.dms.mail.IMFieldsVocabulary',
    )

    read_tal_condition = schema.TextLine(
        title=_("Read TAL condition"),
        required=False,
    )

    write_tal_condition = schema.TextLine(
        title=_("Write TAL condition"),
        required=False,
    )
Beispiel #6
0
    def __call__(self):
        result = []
        query = self.request.get('term')
        if not query:
            return json.dumps(result)

        self.request.response.setHeader("Content-type", "application/json")
        query = parse_query(query)
        hp, org_bis = [], []
        all_str = _('All under')
        # search held_positions
        crit = {'portal_type': 'held_position', 'sort_on': 'sortable_title'}
        crit.update(query)
        brains = self.context.portal_catalog(**crit)
        for brain in brains:
            hp.append({'id': brain.UID, 'text': brain.get_full_title})
        # search organizations
        crit = {'portal_type': ('organization'), 'sort_on': 'sortable_title'}
        crit.update(query)
        brains = self.context.portal_catalog(**crit)
        make_bis = (len(hp) + len(brains)) > 1 and True or False
        for brain in brains:
            result.append({'id': brain.UID, 'text': brain.get_full_title})
            if make_bis:
                org_bis.append({'id': 'l:%s' % brain.UID, 'text': '%s [%s]' % (brain.get_full_title, all_str)})
        result += hp
        # search persons
        crit = {'portal_type': ('person'), 'sort_on': 'sortable_title'}
        crit.update(query)
        brains = self.context.portal_catalog(**crit)
        for brain in brains:
            result.append({'id': brain.UID, 'text': brain.get_full_title})
        # add organizations bis
        result += org_bis
        return json.dumps(result)
Beispiel #7
0
 def AssignedUsersWithDeactivatedVocabulary__call__(self, context):
     factory = getUtility(IVocabularyFactory, 'plone.principalsource.Users')
     vocab = factory(context)  # terms as username, userid, fullname
     a_terms = []
     d_terms = []
     active_orgs = get_registry_organizations()
     functions = [dic['fct_id'] for dic in get_registry_functions()]
     for term in vocab:
         for group in api.group.get_groups(username=term.value):
             if group.id == 'AuthenticatedUsers':
                 continue
             parts = group.id.split('_')
             if len(parts) != 1:
                 group_suffix = '_'.join(parts[1:])
                 if group_suffix in functions and parts[
                         0] not in active_orgs:  # not an active org
                     continue
             term.title = term.title.decode('utf8')
             a_terms.append(term)
             break
         else:
             term.title = _tr(
                 '${element_title} (Inactive)',
                 mapping={'element_title': safe_unicode(term.title)})
             d_terms.append(term)
     return SimpleVocabulary(
         [SimpleTerm(EMPTY_STRING, EMPTY_STRING, _('Empty value'))] +
         humansorted(a_terms, key=attrgetter('title')) +
         humansorted(d_terms, key=attrgetter('title')))
Beispiel #8
0
class DVConvertColumn(IconColumn):

    header = u""
    weight = 20
    linkName = "@@convert-to-documentviewer"
    # linkTarget = '_blank'
    linkContent = _('Update preview')
    iconName = "++resource++imio.dms.mail/dv_convert.svg"
    cssClasses = {'td': 'td_cell_convert'}

    def actionAvailable(self, item):
        various = getMultiAdapter((self.context, self.request),
                                  name='various-utils')
        if various.is_in_user_groups(groups=['encodeurs', 'expedition'],
                                     admin=True):
            return True
        else:
            obj = item.getObject()
            if api.user.has_permission('Modify portal content', obj=obj):
                settings = Settings(obj)
                return not settings.successfully_converted
            return False

    def renderCell(self, item):
        if not self.actionAvailable(item):
            return u""
        return super(DVConvertColumn, self).renderCell(item)
Beispiel #9
0
def creating_group_filter(context):
    """Catalog criteria vocabulary used in contact search on some Contact fields.

    :param context: the add, edit or view context
    :return: vocabulary containing a criteria dict
    :rtype: SimpleVocabulary or None
    """
    if not api.portal.get_registry_record(
            'imio.dms.mail.browser.settings.IImioDmsMailConfig.contact_group_encoder'
    ):
        return None
    factory = getUtility(IVocabularyFactory,
                         'imio.dms.mail.ActiveCreatingGroupVocabulary')
    voc = factory(context)
    new_term = SimpleTerm(None, token='all', title=_('All'))
    setattr(new_term, '__org__', None)
    terms = [new_term]
    for term in voc:
        # beware to enclose dic content with " to be loaded correctly with json.loads
        new_term = SimpleTerm(u'{{"assigned_group": "{}"}}'.format(term.value),
                              token=term.token,
                              title=term.title)
        setattr(new_term, '__org__', term.value)
        terms.append(new_term)
    return SimpleVocabulary(terms)
Beispiel #10
0
class TreatingGroupBatchActionForm(BaseBatchActionForm):

    label = _(u"Batch treating group change")
    weight = 20

    def _update(self):
        self.do_apply = is_permitted(self.brains, perm='imio.dms.mail: Write treating group field')
        self.fields += Fields(schema.Choice(
            __name__='treating_group',
            title=_(u"Treating groups"),
            description=(not self.do_apply and cannot_modify_field_msg or u''),
            required=self.do_apply,
            vocabulary=(self.do_apply and u'collective.dms.basecontent.treating_groups' or SimpleVocabulary([])),
        ))

    def _apply(self, **data):
        if data['treating_group']:
            for brain in self.brains:
                # check if treating_groups is changed and assigned_user is no more in
                if (brain.treating_groups is not None and brain.assigned_user != EMPTY_STRING and
                    data['treating_group'] != brain.treating_groups and
                    brain.assigned_user not in [mb.getUserName() for mb in get_selected_org_suffix_users(
                        data['treating_group'], IM_EDITOR_SERVICE_FUNCTIONS)]):
                    # self.status not good here because it needs to stay on the same form
                    api.portal.show_message(_(u'An assigned user is not in this new treating group. '
                                              u'Mail "${mail}" !', mapping={'mail': brain.Title.decode('utf8')}),
                                            self.request, 'error')
                    break
            else:  # here if no break !
                for brain in self.brains:
                    obj = brain.getObject()
                    obj.treating_groups = data['treating_group']
                    modified(obj, Attributes(IDmsDocument, 'treating_groups'))
Beispiel #11
0
def user_deleted(event):
    """
        Raises exception if user cannot be deleted
    """
    princ = event.principal
    portal = api.portal.get()
    request = portal.REQUEST

    # is protected user
    if princ in ('scanner',):
        api.portal.show_message(message=_("You cannot delete the user name '${user}'.", mapping={'user': princ}),
                                request=request, type='error')
        raise Redirect(request.get('ACTUAL_URL'))

    # check groups
    pg = portal.acl_users.source_groups._principal_groups
    groups = pg.get(princ, [])
    if groups:
        api.portal.show_message(message=_("You cannot delete the user name '${user}', used in following groups.",
                                          mapping={'user': princ}), request=request, type='error')
        titles = []
        for groupid in groups:
            grp = api.group.get(groupname=groupid)
            titles.append('"%s"' % (grp and safe_unicode(grp.getProperty('title')) or groupid))
        api.portal.show_message(message=_('<a href="${url}" target="_blank">Linked groups</a> : ${list}',
                                          mapping={'list': ', '.join(titles), 'url': '%s/@@usergroup-usermembership?'
                                                   'userid=%s' % (portal.absolute_url(), princ)}),
                                request=request, type='error')
        raise Redirect(request.get('ACTUAL_URL'))

    # search in assigned_user index
    for (idx, domain, criterias) in (('assigned_user', 'collective.eeafaceted.z3ctable', {}),
                                     ('Creator', 'plone', {}),
                                     ('mail_type', 'collective.eeafaceted.z3ctable',
                                      {'object_provides': IPersonnelContact.__identifier__})):
        criterias.update({idx: princ})
        brains = portal.portal_catalog.unrestrictedSearchResults(**criterias)
        if brains:
            msg = _("You cannot delete the user name '${user}', used in '${idx}' index.",
                    mapping={'user': princ, 'idx': translate(idx, domain=domain, context=request)})
            api.portal.show_message(message=msg, request=request, type='error')
            logger.error(translate(msg))
            msg = _("Linked objects: ${list}", mapping={'list': ', '.join(['<a href="%s" '
                    'target="_blank">%s</a>' % (b.getURL(), safe_unicode(b.Title)) for b in brains])})
            api.portal.show_message(message=msg, request=request, type='error')
            logger.error(translate(msg))
            raise Redirect(request.get('ACTUAL_URL'))
Beispiel #12
0
 def label(self):
     return _(u"Reply to ${ref}",
              mapping={
                  'ref':
                  u'%d %s' %
                  (len(self.brains),
                   api.portal.translate('incoming mails', 'imio.dms.mail'))
              })
Beispiel #13
0
 def _update(self):
     self.do_apply = is_permitted(self.brains)
     self.fields += Fields(schema.Datetime(
         __name__='outgoing_date',
         title=_(u"Outgoing Date"),
         description=(not self.do_apply and cannot_modify_field_msg or u''),
         required=(self.do_apply),
         default=datetime.datetime.now(),
     ))
Beispiel #14
0
 def _update(self):
     self.do_apply = is_permitted(self.brains, perm='imio.dms.mail: Write treating group field')
     self.fields += Fields(schema.Choice(
         __name__='treating_group',
         title=_(u"Treating groups"),
         description=(not self.do_apply and cannot_modify_field_msg or u''),
         required=self.do_apply,
         vocabulary=(self.do_apply and u'collective.dms.basecontent.treating_groups' or SimpleVocabulary([])),
     ))
Beispiel #15
0
class RecipientsBatchActionForm(ContactBaseBatchActionForm):

    label = _(u"Batch recipients contact field change")
    weight = 60
    available_permission = 'Modify portal content'
    attribute = 'recipients'
    field_value_type = ContactChoice(
        source=DmsContactSourceBinder(portal_type=("organization", 'held_position', 'person', 'contact_list'),
                                      review_state=['active'],
                                      sort_on='sortable_title'))
Beispiel #16
0
 def validate_settings(data):
     for dic in data.omail_send_modes:
         if not dic['value'].startswith('email') and not dic['value'].startswith('post') \
                 and not dic['value'].startswith('other'):
             raise Invalid(
                 _(u"Outgoingmail tab: send_modes field must have values starting with 'post', 'email' "
                   u"or 'other'"))
     for tab, fld in (('Incoming mail', 'imail_group_encoder'),
                      ('Outgoing mail', 'omail_group_encoder'),
                      ('Contacts', 'contact_group_encoder')):
         rec = 'imio.dms.mail.browser.settings.IImioDmsMailConfig.{}'.format(
             fld)
         if api.portal.get_registry_record(rec) and not getattr(data, fld):
             raise Invalid(
                 _(u"${tab} tab: unchecking '${field}' setting is not expected !!",
                   mapping={
                       'tab': _(tab),
                       'field': _('Activate group encoder')
                   }))
Beispiel #17
0
def item_moved(obj, event):
    """OFS.item removed, cut or renamed (event also called for added and pasted)"""
    if (IObjectWillBeRemovedEvent.providedBy(event)  # deletion
            or event.oldParent):  # cut or rename
        if IProtectedItem.providedBy(obj) and not check_zope_admin():
            api.portal.show_message(
                message=_(u"You cannot delete, cut or rename this item '${title}' !",
                          mapping={'title': obj.Title().decode('utf8')}),
                request=obj.REQUEST, type='error')
            raise Redirect(obj.REQUEST.get('HTTP_REFERER'))
Beispiel #18
0
def item_copied(obj, event):
    """OFS.item copying"""
    if get_site_root_relative_path(event.original) in ('/templates/om', '/templates/oem'):
        api.portal.show_message(message=_(u"You cannot copy this item '${title}' ! If you are in a table, you have to "
                                          u"use the buttons below the table.",
                                          mapping={'title': event.original.Title().decode('utf8')}),
                                request=event.original.REQUEST, type='error')
        raise Redirect(event.original.REQUEST.get('HTTP_REFERER'))
    # we can't modify obj because it's sometimes the original object, not yet in the target directory
    event.original.REQUEST.set('_copying_', True)
Beispiel #19
0
    def configure_dashboard(self):
        """ add DashboardCollection """
        alsoProvides(self.omf, INextPrevNotNavigable)
        alsoProvides(self.omf, IOMDashboard)
        self.omf.setConstrainTypesMode(0)
        col_folder = add_db_col_folder(self.omf, 'mail-searches', _("Outgoing mail searches"),
                                       _('Outgoing mails'))
        alsoProvides(col_folder, INextPrevNotNavigable)
        alsoProvides(col_folder, IOMDashboard)
        self.omf.moveObjectToPosition('mail-searches', 0)

        createOMailCollections(col_folder)
        createStateCollections(col_folder, 'dmsoutgoingmail')
        configure_faceted_folder(col_folder, xml='om-mail-searches.xml',
                                 default_UID=col_folder['all_mails'].UID())
        self.omf.setConstrainTypesMode(1)
        configure_faceted_folder(self.omf, xml='default_dashboard_widgets.xml',
                                 default_UID=col_folder['all_mails'].UID())
        # add metadata in portal_catalog
        addOrUpdateColumns(self.portal, columns=('in_out_date',))
Beispiel #20
0
class IDmsPerson(IPerson):

    userid = schema.Choice(
        title=_(u'Plone user'),
        required=False,
        vocabulary=u'plone.app.vocabularies.Users',
    )

    #directives.widget('userid', AjaxChosenFieldWidget, populate_select=True)
    directives.read_permission(userid='imio.dms.mail.write_userid_field')
    directives.write_permission(userid='imio.dms.mail.write_userid_field')
Beispiel #21
0
class IDmsMailCreatingGroup(model.Schema):

    creating_group = LocalRoleField(
        title=_(u"Creating group"),
        required=True,
        vocabulary=u'imio.dms.mail.ActiveCreatingGroupVocabulary',
        defaultFactory=user_creating_group,
    )

    # directives.write_permission(creating_group='imio.dms.mail.write_creating_group_field')
    directives.write_permission(
        creating_group='imio.dms.mail.write_base_fields')
Beispiel #22
0
class AssignedGroupColumn(Column):
    """Column that displays assigned group."""

    header = _("Treating groups")
    weight = 30

    def renderCell(self, item):
        if not item.assigned_group:
            return ''
        factory = getUtility(IVocabularyFactory,
                             'collective.task.AssignedGroups')
        voc = factory(item)
        return safe_unicode(voc.getTerm(item.assigned_group).title)
Beispiel #23
0
 def _update(self):
     self.do_apply = is_permitted(self.brains)
     self.fields += Fields(MasterSelectField(
         __name__='action_choice',
         title=_(u'Batch action choice'),
         description=(not self.do_apply and cannot_modify_field_msg or u''),
         vocabulary=SimpleVocabulary([SimpleTerm(value=u'add', title=_(u'Add items')),
                                      SimpleTerm(value=u'remove', title=_(u'Remove items')),
                                      SimpleTerm(value=u'replace', title=_(u'Replace some items by others')),
                                      SimpleTerm(value=u'overwrite', title=_(u'Overwrite'))]),
         slave_fields=(
             {'name': 'removed_values',
              'slaveID': '#form-widgets-removed_values',
              'action': 'hide',
              'hide_values': (u'add', u'overwrite'),
              'siblings': True,
              },
             {'name': 'added_values',
              'slaveID': '#form-widgets-added_values',
              'action': 'hide',
              'hide_values': (u'remove'),
              'siblings': True,
              },
         ),
         required=self.do_apply,
         default=u'add'
     ))
     if self.do_apply:
         self.fields += Fields(schema.List(
             __name__='removed_values',
             title=_(u"Removed values"),
             description=_(u"Select the values to remove (CTRL+click)"),
             required=False,
             value_type=schema.Choice(vocabulary=u'collective.dms.basecontent.recipient_groups'),
         ))
         self.fields += Fields(schema.List(
             __name__='added_values',
             title=_(u"Added values"),
             description=_(u"Select the values to add (CTRL+click)"),
             required=False,
             value_type=schema.Choice(vocabulary=u'collective.dms.basecontent.recipient_groups'),
         ))
         self.fields["removed_values"].widgetFactory = SelectFieldWidget
         self.fields["added_values"].widgetFactory = SelectFieldWidget
Beispiel #24
0
 def _validate(self, value):
     super(RestrictedNamedBlobFile, self)._validate(value)
     if value is not None:
         registry = getUtility(IRegistry)
         # TODO add an option to permit pdf file
         if registry['imio.dms.mail.browser.settings.IImioDmsMailConfig.omail_odt_mainfile']:
             if (self.context.portal_type == 'dmsommainfile' and
                     self.context.file.contentType != 'application/vnd.oasis.opendocument.text'):
                 # we are editing the dmsmainfile, there was previously another type, we keep it !
                 # It's necessary to permit edition of a pdf scanned file
                 return
             mimetype = get_contenttype(value)
             if mimetype != 'application/vnd.oasis.opendocument.text':
                 raise Invalid(_('You can only upload ".odt" file (Libre Office format)'))
Beispiel #25
0
 def _configure_product(self):
     logger.info("Configure folders")
     from imio.dms.mail import _tr as _
     from imio.dms.mail.setuphandlers import createTopicView, createStateTopics
     folder = self.portal['incoming-mail']
     folder.setConstrainTypesMode(0)
     createTopicView(folder, 'dmsincomingmail',
                     _(u'all_incoming_mails'))  # i_e ok
     createStateTopics(self.portal, folder, 'dmsincomingmail')  # i_e ok
     folder.setConstrainTypesMode(1)
     folder.setLocallyAllowedTypes(['dmsincomingmail'])  # i_e ok
     folder.setImmediatelyAddableTypes(['dmsincomingmail'])  # i_e ok
     self.portal.portal_workflow.doActionFor(folder, "show_internally")
     folder.manage_delObjects(ids=['topic_page'])
     folder = self.portal['outgoing-mail']
     folder.setConstrainTypesMode(0)
     createTopicView(folder, 'dmsoutgoingmail', _('Outgoing mail'))
     folder.setConstrainTypesMode(1)
     folder.setLocallyAllowedTypes(['dmsoutgoingmail'])
     folder.setImmediatelyAddableTypes(['dmsoutgoingmail'])
     logger.info("Configure document viewer")
     self.portal.portal_setup.runImportStepFromProfile(
         'profile-imio.dms.mail:examples',
         'imiodmsmail-configureDocumentViewer')
Beispiel #26
0
class CKPathColumn(LinkColumn):
    """Column that displays relative path."""

    header = _("Relative path")
    weight = 20
    cssClasses = {'td': 'path-column'}
    linkTarget = '_blank'

    def getLinkURL(self, item):
        """Setup link url."""
        return item.__parent__.absolute_url()

    def getLinkContent(self, item):
        annot = IAnnotations(item)
        return annot.get('dmsmail.cke_tpl_tit', '-') or '-'
Beispiel #27
0
 def _apply(self, **data):
     if data['treating_group']:
         for brain in self.brains:
             # check if treating_groups is changed and assigned_user is no more in
             if (brain.treating_groups is not None and brain.assigned_user != EMPTY_STRING and
                 data['treating_group'] != brain.treating_groups and
                 brain.assigned_user not in [mb.getUserName() for mb in get_selected_org_suffix_users(
                     data['treating_group'], IM_EDITOR_SERVICE_FUNCTIONS)]):
                 # self.status not good here because it needs to stay on the same form
                 api.portal.show_message(_(u'An assigned user is not in this new treating group. '
                                           u'Mail "${mail}" !', mapping={'mail': brain.Title.decode('utf8')}),
                                         self.request, 'error')
                 break
         else:  # here if no break !
             for brain in self.brains:
                 obj = brain.getObject()
                 obj.treating_groups = data['treating_group']
                 modified(obj, Attributes(IDmsDocument, 'treating_groups'))
Beispiel #28
0
def updatewidgets_assigned_user_description(the_form):
    """ Set a description if the field must be completed """
    state = api.content.get_state(the_form.context)
    treating_group = the_form.context.treating_groups
    transitions_levels = get_dms_config(
        ['transitions_levels', 'dmsincomingmail'])  # i_e ok
    if state in transitions_levels and treating_group in transitions_levels[
            state]:
        transition = transitions_levels[state][treating_group][0]
        transitions_auc = get_dms_config(
            ['transitions_auc', 'dmsincomingmail'])  # i_e ok
        if transition in transitions_auc and not transitions_auc[
                transition].get(treating_group, False):
            the_form.widgets['ITask.assigned_user'].field = copy.copy(
                the_form.widgets['ITask.assigned_user'].field)
            the_form.widgets['ITask.assigned_user'].field.description = _(
                u'You must select an assigned user '
                u'before you can propose to an agent !')
Beispiel #29
0
def im_edit_finished(mail, event):
    """
    """
    user = api.user.get_current()
    if not user.has_permission('View', mail):
        portal = api.portal.get()
        redirect_to_url = api.portal.get().absolute_url()
        col_path = '%s/incoming-mail/mail-searches/all_mails' % portal.absolute_url_path()
        brains = portal.portal_catalog.unrestrictedSearchResults(path={'query': col_path, 'depth': 0})
        if brains:
            redirect_to_url = '%s/incoming-mail/mail-searches#c1=%s' % (redirect_to_url, brains[0].UID)
        # add a specific portal_message before redirecting the user
        msg = _('redirected_after_edition',
                default="You have been redirected here because you do not have "
                        "access anymore to the element you just edited.")
        portal['plone_utils'].addPortalMessage(msg, 'warning')
        response = mail.REQUEST.response
        response.redirect(redirect_to_url)
Beispiel #30
0
 def render_field(self, field, item):
     """
         render field differently
     """
     field_name = field[0]
     value = getattr(item, field_name)
     if hasattr(value, '__call__'):
         value = value()
     if not value:
         return ''
     if field_name == 'Title':
         try:
             state = api.content.get_state(obj=item)
         except ValueError:
             state = ''
         klass = ''
         if state:
             klass = 'state-%s' % state
         if self.context.getId() == 'searchfor_created' and item.getObject(
         ).wl_isLocked():
             return (
                 '<img width="16" height="16" title="Locked" src="lock_icon.png">'
                 '<a href="%s" class="%s">%s</a>' %
                 (item.getURL(), klass, value))
         return '<a href="%s" class="%s">%s</a>' % (item.getURL(), klass,
                                                    value)
     elif field_name == 'review_state':
         return _(value, domain='plone')
     elif field_name in ['Creator', 'assigned_user']:
         author = self.pas_member.info(value)
         return '<span>%s</span>' % (author['fullname']
                                     or author['username'])
     elif field_name in [
             'treating_groups', 'recipient_groups', 'assigned_group'
     ]:
         return self.from_vocabulary(item, value, self.vocs[field_name])
     elif field_name in [
             'ModificationDate', 'CreationDate', 'EffectiveDate',
             'ExpirationDate'
     ]:
         return '<span>%s</span>' % self.plone.toLocalizedTime(
             value, long_format=1)
     else:
         return value
Beispiel #31
0
def get_settings_vta_table(field, active=(True, False), choose=False):
    """
        Create a vocabulary from registry table variable (value, title, active)
    """
    settings = getUtility(IRegistry).forInterface(IImioDmsMailConfig, False)
    terms = []
    id_utility = queryUtility(IIDNormalizer)
    for mail_type in (getattr(settings, field) or []):
        # value (stored), token (request), title
        if mail_type['active'] in active:
            val = mail_type['value']
            if val == 'None':
                val = None
                choose = False
            terms.append(
                SimpleTerm(val, id_utility.normalize(mail_type['value']),
                           mail_type['dtitle']))
    if choose:
        terms.insert(0, SimpleTerm(None, '', _("Choose a value !")))
    return SimpleVocabulary(terms)
Beispiel #32
0
 def label(self):
     return translate(
         _(u"${title}: create from template",
           mapping={'title': self.context.Title()}),
         context=self.request)
Beispiel #33
0
 def label(self):
     return _(u"Reply to ${ref}", mapping={'ref': self.context.Title()})
Beispiel #34
0
 def get_action_name(self):
     return translate(_("Choose this template"), context=self.request)