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')
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')
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)
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
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, )
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)
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')))
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)
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)
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'))
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'))
def label(self): return _(u"Reply to ${ref}", mapping={ 'ref': u'%d %s' % (len(self.brains), api.portal.translate('incoming mails', 'imio.dms.mail')) })
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(), ))
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([])), ))
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'))
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') }))
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'))
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)
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',))
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')
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')
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)
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
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)'))
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')
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 '-'
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'))
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 !')
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)
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
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)
def label(self): return translate( _(u"${title}: create from template", mapping={'title': self.context.Title()}), context=self.request)
def label(self): return _(u"Reply to ${ref}", mapping={'ref': self.context.Title()})
def get_action_name(self): return translate(_("Choose this template"), context=self.request)