def _validate(self, label, mailaddress): """Validates the given attributes. Returns None if the validation passed. Returns the errormessage if the validation failed. """ plone_utils = api.portal.get_tool('plone_utils') if not label and not mailaddress: return _( u'error_no_label_and_email', u'Please specify a label and an email address.' ) elif not label: return _( u'error_no_label', u'Please specify a label for your email address') elif not mailaddress: return _( u'error_no_email', u'Please specify an email address') elif not plone_utils.validateSingleEmailAddress(mailaddress): return _( u'error_invalid_email', u'Please specify a valid email address')
class IPersonModel(model.Schema): """Person model schema interface.""" salutation = schema.TextLine( title=_(u"label_salutation", default=u"Salutation"), max_length=CONTENT_TITLE_LENGTH, required=False) academic_title = schema.TextLine( title=_(u"label_academic_title", default=u"Academic title"), max_length=CONTENT_TITLE_LENGTH, required=False) firstname = schema.TextLine( title=_(u"label_firstname", default=u"Firstname"), max_length=FIRSTNAME_LENGTH, required=True) lastname = schema.TextLine( title=_(u"label_lastname", default=u"Lastname"), max_length=LASTNAME_LENGTH, required=True) description = schema.Text( title=_(u'label_description', default=u'Description'), required=False, missing_value=u'', default=u'', )
class ParticipationRemoveForm(z3c.form.form.Form): def __init__(self, context, request): super(ParticipationRemoveForm, self).__init__(context, request) self.model = context.model @property def label(self): return _(u'label_remove_participation', default=u'Remove ${title}', mapping={'title': self.model.get_title()}) @button.buttonAndHandler(_(u'Remove'), name='remove') def handleRemove(self, action): data, errors = self.extractData() if errors: return self.model.delete() api.portal.show_message( _(u'info_participation_removed', u'Participation removed'), api.portal.get().REQUEST) return self.request.RESPONSE.redirect(self.nextURL()) @button.buttonAndHandler(_(u'label_cancel', default=u'Cancel'), name='cancel') def cancel(self, action): return self.request.RESPONSE.redirect(self.nextURL()) def nextURL(self): """Returns the url to the dossiers participation tab.""" return '{}#participations'.format( aq_parent(self.context).absolute_url())
def get_tabs(self): if is_contact_feature_enabled(): tabs = [ {'id': 'persons', 'title': _(u'label_persons', default=u'Persons'), 'icon': None, 'url': '#', 'class': None}, {'id': 'organizations', 'title': _(u'label_organizations', default=u'Organizations'), 'icon': None, 'url': '#', 'class': None}] else: tabs = [ {'id': 'local', 'title': _(u'label_local', default=u'Local'), 'icon': None, 'url': '#', 'class': None}, ] tabs += [ {'id': 'users', 'title': _(u'label_users', default=u'Users'), 'icon': None, 'url': '#', 'class': None}] return tabs
def phonenumbers(self): result = [] for index, data in enumerate([ (_('label_office', default='Office'), self.ogds_user.phone_office), (_('label_fax', default="Fax"), self.ogds_user.phone_fax), (_('label_mobile', default="Mobile"), self.ogds_user.phone_mobile)], 1): label, phone_number = data adapter = PhoneNumberAdapter(self.id, index, phone_number, label) if adapter.has_data: result.append(adapter) return result
class Contacts(OpengeverCatalogListingTab): """ Listing of all Task of the authenticated Member """ grok.name('tabbedview_view-local') grok.context(IDexterityContainer) types = [ 'opengever.contact.contact', ] columns = ( { 'column': 'lastname', 'column_title': _(u'label_lastname', default=u'Lastname'), 'transform': linked }, { 'column': 'firstname', 'column_title': _(u'label_firstname', default=u'Firstname'), 'transform': linked_no_icon }, { 'column': 'email', 'column_title': _(u'label_email', default=u'email'), 'transform': email_helper }, { 'column': 'phone_office', 'column_title': _(u'label_phone_office', default=u'Phone office') }, ) sort_on = 'lastname' sort_order = '' show_selects = False enabled_actions = [] major_actions = [] selection = ViewPageTemplateFile("no_selection_amount.pt") def update_config(self): OpengeverCatalogListingTab.update_config(self) # configuration for the extjs grid extjs_conf = {'auto_expand_column': 'lastname'} if isinstance(self.table_options, dict): self.table_options.update(extjs_conf) elif self.table_options is None: self.table_options = extjs_conf.copy()
def phonenumbers(self): result = [] for index, data in enumerate( [ (_("label_office", default="Office"), self.ogds_user.phone_office), (_("label_fax", default="Fax"), self.ogds_user.phone_fax), (_("label_mobile", default="Mobile"), self.ogds_user.phone_mobile), ], 1, ): label, phone_number = data adapter = PhoneNumberAdapter(self.id, index, phone_number, label) if adapter.has_data: result.append(adapter) return result
def columns(self): return ( {'column': 'name', 'column_title': _(u'column_name', default=u'Name'), 'transform': linked_sql_object}, {'column': 'is_active', 'column_title': _(u'column_active', default=u'Active'), 'transform': boolean_helper}, {'column': 'former_contact_id', 'column_title': _(u'column_former_contact_id', default=u'Former contact id')}, )
class ParticipationAddForm(ModelAddForm): label = _(u'label_add_participation', default=u'Add Participation') fields = z3c.form.field.Fields(IParticipation) fields['contact'].widgetFactory = ParameterizedWidget(KeywordWidget, async=True) fields['roles'].widgetFactory = CheckBoxFieldWidget @property def model_class(self): return self._participant.participation_class def validate(self, data): self._participant = data.get('contact') query = self.model_class.query.by_participant( self._participant).by_dossier(self.context) if query.count(): raise ActionExecutionError( Invalid( _( u'msg_participation_already_exists', u"There already exists a participation for this contact." ))) def create(self, data): self.validate(data) return self.model_class.create(participant=self._participant, dossier=self.context, roles=data.pop('roles')) def nextURL(self): return '{}#participations'.format(self.context.absolute_url())
class AddPerson(ModelAddForm): schema = IPersonModel model_class = Person label = _('Add Person', default=u'Add Person') def nextURL(self): return self._created_object.get_url()
def title(self): title = '%s %s' % ( self.lastname, self.firstname, ) if len(title.strip()) == 0: title = _(u'Contact') return title
class Contacts(BaseCatalogListingTab): types = [ 'opengever.contact.contact', ] columns = ( { 'column': 'lastname', 'column_title': _(u'label_lastname', default=u'Lastname'), 'transform': linked }, { 'column': 'firstname', 'column_title': _(u'label_firstname', default=u'Firstname'), 'transform': linked_no_icon }, { 'column': 'email', 'column_title': _(u'label_email', default=u'email'), 'transform': email_helper }, { 'column': 'phone_office', 'column_title': _(u'label_phone_office', default=u'Phone office') }, ) sort_on = 'lastname' sort_order = '' show_selects = False enabled_actions = [] major_actions = [] selection = ViewPageTemplateFile("templates/no_selection_amount.pt") def update_config(self): super(BaseCatalogListingTab, self).update_config() # configuration for the extjs grid extjs_conf = {'auto_expand_column': 'lastname'} if isinstance(self.table_options, dict): self.table_options.update(extjs_conf) elif self.table_options is None: self.table_options = extjs_conf.copy()
def columns(self): return ( {'column': 'salutation', 'column_title': _(u'column_salutation', default=u'Salutation')}, {'column': 'academic_title', 'column_title': _(u'column_academic_title', default=u'Academic title')}, {'column': 'firstname', 'column_title': _(u'column_firstname', default=u'Firstname'), 'transform': linked_sql_object}, {'column': 'lastname', 'column_title': _(u'column_lastname', default=u'Lastname'), 'transform': linked_sql_object}, {'column': 'is_active', 'column_title': _(u'column_active', default=u'Active'), 'transform': boolean_helper}, {'column': 'organizations', 'column_title': _(u'column_organizations', default=u'Organizations'), 'transform': self.organizations_links}, {'column': 'former_contact_id', 'column_title': _(u'column_former_contact_id', default=u'Former contact id')}, )
def get_items(self): return [ {'class': 'sequenceNumber', 'label': _('label_sequence_number', default='Sequence Number'), 'content': self.context.model.contact_id, 'replace': False}, {'class': 'active', 'label': _('label_active', default='Active'), 'content': self.active_label(), 'replace': False}, {'class': 'former_contact_id', 'label': _('label_former_contact_id', default='Former contact ID'), 'content': self.context.model.former_contact_id, 'replace': False} ]
def validate(self, data): self._participant = data.get('contact') query = self.model_class.query.by_participant( self._participant).by_dossier(self.context) if query.count(): raise ActionExecutionError(Invalid( _(u'msg_participation_already_exists', u"There already exists a participation for this contact.")))
def columns(self): return ( { 'column': 'name', 'column_title': _(u'column_name', default=u'Name'), 'transform': linked_sql_object }, { 'column': 'is_active', 'column_title': _(u'column_active', default=u'Active'), 'transform': boolean_helper }, { 'column': 'former_contact_id', 'column_title': _(u'column_former_contact_id', default=u'Former contact id') }, )
class IParticipation(model.Schema): """ Participation Form schema """ contact = schema.Choice( title=_(u'label_contact', default=u'Contact'), source=ContactsSourceBinder(), required=True, ) roles = schema.List( title=_(u'label_roles', default=u'Roles'), value_type=schema.Choice(source=wrap_vocabulary( 'opengever.dossier.participation_roles', visible_terms_from_registry='opengever.dossier' '.interfaces.IDossierParticipants.roles'), ), required=True, missing_value=[], )
def handleRemove(self, action): data, errors = self.extractData() if errors: return self.model.delete() api.portal.show_message( _(u'info_participation_removed', u'Participation removed'), api.portal.get().REQUEST) return self.request.RESPONSE.redirect(self.nextURL())
def get_items(self): return [{ 'class': 'sequenceNumber', 'label': _('label_sequence_number', default='Sequence Number'), 'content': self.context.model.contact_id, 'replace': False }, { 'class': 'active', 'label': _('label_active', default='Active'), 'content': self.active_label(), 'replace': False }, { 'class': 'former_contact_id', 'label': _('label_former_contact_id', default='Former contact ID'), 'content': self.context.model.former_contact_id, 'replace': False }]
def update(self): label = to_safe_html(self.request.get('label', self.mailaddress.label)) mailaddress = to_safe_html(self.request.get('mailaddress', self.mailaddress.address)) error_msg = self._validate(label, mailaddress) if error_msg: return JSONResponse(self.request).error(error_msg).dump() self.mailaddress.update(label=label, address=mailaddress) return JSONResponse(self.request).info( _('email_address_updated', default=u"Email address updated.")).proceed().dump()
def add(self): label = to_safe_html(self.request.get('label')) mailaddress = to_safe_html(self.request.get('mailaddress')) error_msg = self._validate(label, mailaddress) if error_msg: return JSONResponse(self.request).error(error_msg).dump() mail_object = MailAddress(label=label, address=mailaddress, contact_id=self.context.model.person_id) self.session.add(mail_object) msg = _(u'info_mailaddress_created', u'The email address was created successfully') return JSONResponse(self.request).info(msg).proceed().dump()
def add(self): label = to_safe_html(self.request.get('label')) mailaddress = to_safe_html(self.request.get('mailaddress')) error_msg = self._validate(label, mailaddress) if error_msg: return JSONResponse(self.request).error(error_msg).dump() mail_object = MailAddress( label=label, address=mailaddress, contact_id=self.context.model.person_id) self.session.add(mail_object) msg = _( u'info_mailaddress_created', u'The email address was created successfully') return JSONResponse(self.request).info(msg).proceed().dump()
class TeamsListing(BaseListingTab): """Tab registered on contacts folder listing all teams. """ implements(ITeamListingTableSourceConfig) sort_on = 'title' sort_order = '' # the model attributes is used for a dynamic textfiltering functionality model = Team show_selects = False filterlist_name = 'team_state_filter' filterlist_available = True filterlist = FilterList( Filter('filter_all', _('label_tabbedview_filter_all')), ActiveOnlyFilter('filter_active', _('Active'), default=True)) columns = ({ 'column': 'title', 'column_title': _(u'label_title', default=u'Title'), 'transform': linked_title_helper }, { 'column': 'groupid', 'column_title': _(u'label_group', default=u'Group'), 'transform': lambda item, value: item.group.label() }, { 'column': 'org_unit_id', 'column_title': _(u'label_org_unit', default=u'Org Unit'), 'transform': lambda item, value: item.org_unit.title }, { 'column': 'active', 'column_title': _(u'label_active', default=u'Active'), 'transform': boolean_helper }) def get_base_query(self): """Returns the base search query (sqlalchemy) """ session = create_session() return session.query(Team)
def delete(self): self.mailaddress.delete() return JSONResponse(self.request).info( _(u'mail_address_deleted', default=u'Mailaddress successfully deleted')).dump()
def get_title(self): return _(u'label_participation_of', default=u'Participation of ${contact_title}', mapping={'contact_title': self.participant.get_title()})
def label(self): return _(u'label_edit_participation', default=u'Edit ${title}', mapping={'title': self.model.get_title()})
def label(self): return _(u'label_remove_participation', default=u'Remove ${title}', mapping={'title': self.model.get_title()})
class IContact(model.Schema): """ A contact """ model.fieldset(u'personal', label=_(u'personal', default=u'Personal Stuff'), fields=[ u'salutation', u'academic_title', u'firstname', u'lastname', u'description', u'picture', u'company', u'department', u'function', ]) model.fieldset(u'internet', label=_(u'internet', default=u'Internet'), fields=[ u'email', u'email2', u'url', ]) model.fieldset(u'telefon', label=_(u'telefon', default=u"Telefon"), fields=[ u'phone_office', u'phone_fax', u'phone_mobile', u'phone_home', ]) model.fieldset(u'address', label=_(u'address', default=u'Address'), fields=[ u'address1', u'address2', u'zip_code', u'city', u'country', ]) salutation = schema.TextLine( title=_(u'label_salutation', default=u'Salutation'), required=False, ) academic_title = schema.TextLine( title=_(u'label_academic_title', default=u'Academic title'), required=False, ) dexteritytextindexer.searchable('lastname') lastname = schema.TextLine( title=_(u'label_lastname', default=u'Lastname'), required=True, max_length=LASTNAME_LENGTH, ) dexteritytextindexer.searchable('firstname') firstname = schema.TextLine( title=_(u'label_firstname', default=u'Firstname'), required=True, max_length=FIRSTNAME_LENGTH, ) company = schema.TextLine( title=_(u'label_company', default=u"Company"), required=False, ) department = schema.TextLine( title=_(u'label_department', default=u'Department'), required=False, ) function = schema.TextLine( title=_(u'lable_function', default=u'Function'), required=False, ) email = schema.TextLine( title=_(u'label_email', default=u'email'), required=False, max_length=EMAIL_LENGTH, ) email2 = schema.TextLine( title=_(u'label_email2', default=u'Email 2'), required=False, max_length=EMAIL_LENGTH, ) url = schema.URI( title=_(u'label_url', default=u'Url'), required=False, ) phone_office = schema.TextLine( title=_(u'label_phone_office', default=u'Phone office'), required=False, ) phone_fax = schema.TextLine( title=_(u'label_phone_fax', default=u'Fax'), required=False, ) phone_mobile = schema.TextLine( title=_(u'label_phone_mobile', default=u'Mobile'), required=False, ) phone_home = schema.TextLine( title=_(u'label_phone_home', default=u'Phone home'), required=False, ) picture = NamedImage( title=_(u'label_picture', default='Picture'), required=False, ) description = schema.Text( title=_(u'label_description', default=u'Description'), required=False, missing_value=u'', ) address1 = schema.TextLine( title=_(u'label_address1', default=u'Address 1'), required=False, ) address2 = schema.TextLine( title=_(u'label_address2', default=u'Address 2'), required=False, ) zip_code = schema.TextLine( title=_(u'label_zip', default=u'ZIP'), required=False, ) city = schema.TextLine( title=_(u'label_city', default=u'City'), required=False, ) country = schema.TextLine( title=_(u'label_country', default=u'Country'), required=False, )
def get_show_all_label(self, total): msg = _(u'label_show_all', default=u'Show all ${total} participations', mapping={'total': total}) return translate(msg, context=self.request)
def title(self): title = "%s %s" % (self.lastname, self.firstname) if len(title.strip()) == 0: title = _(u"Contact") return title