class ISubjectInfo(model.Schema): """Behavior schema """ studysubject = schema.TextLine(title=_(u'Studysubject'), required=False) fieldset('Contact information', label=_(u'Contact information'), fields=['studysubject'])
class IGroupsProvider(Interface): """Behavior schema """ order_before(groups='columns_display') groups = schema.List(title=_(u'Groups'), description=_('roster_groups_help', default=u'group_id|Group title'), value_type=schema.TextLine(title=_(u'Group'), required=True), required=False)
class IGroups(model.Schema): """Behavior schema """ widget(groups=CheckBoxFieldWidget) groups = schema.List(title=_(u'Groups'), value_type=schema.Choice( title=_(u'Group'), vocabulary='collective.roster.localgroups'), missing_value=[], required=False)
class IRoster(model.Schema): """Content schema """ columns_display = schema.List( title=_(u'Display columns'), description=_(u'Display only the selected person information columns ' u'on supporting views.'), value_type=schema.Choice( title=_(u'Column'), vocabulary='collective.roster.displaycolumns', ))
class IContactInfo(model.Schema): """Behavior schema """ email = schema.TextLine(title=_(u'Email'), constraint=is_email_address, required=False) phone_number = schema.TextLine( title=_(u'Phone'), required=False, ) fieldset('Contact information', label=_(u'Contact information'), fields=['email', 'phone_number'])
class IOfficeInfo(model.Schema): """Behavior schema """ order_after(room='IContactInfo.phone_number') room = schema.TextLine( title=_(u'Room'), # description=_(u'Room Info'), required=False) order_after(short_number='IContactInfo.phone_number') widget(short_number=ShortNumberFieldWidget) short_number = schema.Int(title=_(u'Short number'), required=False, constraint=is_short_number)
def title(self): title = _('person_name', default=u'${last_name} ${first_name}', mapping={ 'first_name': IPerson(self.context).first_name, 'last_name': IPerson(self.context).last_name }) return translate(title, context=api.portal.getRequest())
class IPerson(model.Schema): """Content schema """ title = schema.TextLine(title=_(u'Display name'), readonly=True, required=False) first_name = schema.TextLine(title=_(u'First name')) last_name = schema.TextLine(title=_(u'Last name')) position = schema.TextLine(title=_(u'Title'), missing_value=u'', required=False) description = schema.Text(title=_(u'Description'), missing_value=u'', required=False) biography = RichText(title=_(u'Biography'), required=False) primary('image') image = NamedBlobImage( title=_(u'Image'), required=False, )
class SubjectColumn(column.LinkColumn): weight = 105 header = _(u'Subject') def renderCell(self, obj): adapted = ISubjectInfo(obj, None) if adapted: return getattr(adapted, 'studysubject', None) or u'' return u''
class RoomColumn(column.Column): weight = 101 header = _(u'Room') def renderCell(self, ob): adapted = IOfficeInfo(ob, None) if adapted: return getattr(adapted, 'room', None) or u'' return u''
def validate(self, value, force=False): value = value or [] super(SimpleFieldValidator, self).validate(value, force) normalizer = getUtility(IIDNormalizer) normalized = map(normalizer.normalize, value) if len(set(normalized)) != len(value): raise Invalid(_(u'Roster display groups must be unique.'))
class IGroups(model.Schema): """Behavior schema """ widget(groups=CheckBoxFieldWidget) groups = schema.List( title=_(u'Groups'), value_type=schema.Choice( title=_(u'Group'), vocabulary='collective.roster.localgroups' ), missing_value=[], required=False ) groups_leader = schema.Bool( title=_('Groups leader'), description=_('Leaders will be shown before the others ' 'in grouped views.'), required=False )
class NameColumn(column.LinkColumn): weight = 99 header = _(u'Name') def getLinkURL(self, ob): return ob.absolute_url() def getLinkContent(self, ob): title = u'{0:s} {1:s}'.format(ob.last_name, ob.first_name) if type(title) != unicode: title = unicode(title, u'utf-8') return title
def validate(seflf, value, force=False): allowed = ['jpeg', 'jpg', 'png', 'gif'] ext = path.splitext(value.filename)[1] mime = magic.Magic(mime=True) mime_type = mime.from_buffer(value.data) if (not ext or ext[1:].lower() not in allowed or not mime_type.startswith('image/')): # noqa raise Invalid( _( u'Image must be one of the permitted file types ' u'(${extlist}).', mapping={'extlist': u', '.join(allowed)}))
def person_title(person): title = INameFromTitle(person).title adapted = IPerson(person, None) if adapted: bound = IPerson['position'].bind(adapted) position = bound.get(adapted) title_position = _('person_title', default=u'${title}, ${position}', mapping={'title': title, 'position': position}) if position: title = translate(title_position, context=api.portal.getRequest()) return title
class AlphaColumn(column.Column): weight = -1 header = _(u'#') def renderCell(self, ob): if not ob.last_name: return u'' alpha = ob.last_name[0].upper() if not self.table.alpha or alpha != self.table.alpha[-1]: self.table.alpha.append(alpha) return u'<a name="{0:s}">{1:s}</a>'.format(alpha, alpha) else: return u''
class ShortNumberColumn(column.LinkColumn): weight = 103 header = _(u'Short number') def getLinkURL(self, ob): adapted = IOfficeInfo(ob, None) short_number = getattr(adapted, 'short_number', None) if short_number: return u'tel: {0:d}'.format(short_number) return u'' def getLinkContent(self, ob): adapted = IOfficeInfo(ob, None) if adapted: return getattr(adapted, 'short_number', None) or u'' return u''
class EmailColumn(column.LinkColumn): weight = 104 header = _(u'Email') def getLinkURL(self, ob): adapted = IContactInfo(ob, None) email = getattr(adapted, 'email', None) if email: return u'mailto:{0:s}'.format(email) return u'' def getLinkContent(self, ob): adapted = IContactInfo(ob, None) if adapted: return getattr(adapted, 'email', u'') or u'' return u''
class PhoneNumberColumn(column.LinkColumn): weight = 102 header = _(u'Phone number') def getLinkURL(self, ob): adapted = IContactInfo(ob, None) phone = getattr(adapted, 'phone_number', None) if phone: return u'tel:{0:s}'.format(phone) return u'' def getLinkContent(self, ob): adapted = IContactInfo(ob, None) if adapted: return getattr(adapted, 'phone_number', u'') or u'' return u''
def validate(self, value, force=False): normalizer = getUtility(IIDNormalizer) if not len(normalizer.normalize(value)): raise Invalid(_(u"Person name contains invalid characters."))
def title(self): title = _('person_name', default=u'${last_name} ${first_name}', mapping={'first_name': IPerson(self.context).first_name, 'last_name': IPerson(self.context).last_name}) return translate(title, context=api.portal.getRequest())
class PositionColumn(column.Column): weight = 100 header = _(u'Title') def renderCell(self, ob): return ob.position
class DescriptionColumn(column.Column): weight = 98 header = _(u'Description') def renderCell(self, ob): return ob.description