コード例 #1
0
 def update(self):
     fields = field.Fields(IEnhancedUserDataSchema)
     fields['skills'].widgetFactory = CheckBoxFieldWidget
     self.add(fields)
コード例 #2
0
ファイル: host.py プロジェクト: mleist/ict-ok.org
class DetailsHostForm(DisplayForm):
    """ Display form for the object """
    label = _(u'settings of net')
    fields = field.Fields(IHostVMwareVm).omit(*HostDetails.omit_viewfields)
コード例 #3
0
ファイル: host.py プロジェクト: mleist/ict-ok.org
class EditHostForm(EditForm):
    """ Edit form for host """
    form.extends(form.EditForm)
    label = _(u'VMware Virtual Machine Edit Form')
    fields = field.Fields(IHostVMwareVm).omit(*HostDetails.omit_editfields)
コード例 #4
0
ファイル: simple1.py プロジェクト: mleist/ict-ok.org
class ViewAdmUtilSimple1Form(DisplayForm):
    """ Display form for the object """
    label = _(u'settings of simple scanner')
    fields = field.Fields(IAdmUtilSimple1).omit(\
        *AdmUtilSimple1Details.omit_viewfields)
コード例 #5
0
ファイル: esx_vim.py プロジェクト: mleist/ict-ok.org
class ViewAdmUtilEsxVimForm(DisplayForm):
    """ Display form for the object """
    label = _(u'settings of esx_vim')
    fields = field.Fields(IAdmUtilEsxVim).omit(\
        *AdmUtilEsxVimDetails.omit_viewfields)
コード例 #6
0
class ActionAddForm(FieldAddForm):

    fields = field.Fields(INewAction)
    label = _('Add new action')
コード例 #7
0
class CountableSchemata(CS):
    """ Schemata countable
    """
    fields = field.Fields(ISchema).select(
        u'count'
    )
コード例 #8
0
ファイル: resource.py プロジェクト: l1ph0x/schooltool-2
 def getBaseFields(self):
     return field.Fields(IResource).omit('type', 'notes')
コード例 #9
0
ファイル: resource.py プロジェクト: l1ph0x/schooltool-2
 def getBaseFields(self):
     fields = field.Fields(ILocation).select('title', 'description')
     return fields
コード例 #10
0
ファイル: resource.py プロジェクト: l1ph0x/schooltool-2
 def getBaseFields(self):
     return field.Fields(IEquipment)
コード例 #11
0
ファイル: resource.py プロジェクト: l1ph0x/schooltool-2
 def getBaseFields(self):
     return field.Fields(IResource)
コード例 #12
0
ファイル: resource.py プロジェクト: l1ph0x/schooltool-2
 def getBaseFields(self):
     return field.Fields(ILocation)
コード例 #13
0
ファイル: resource.py プロジェクト: l1ph0x/schooltool-2
 def getBaseFields(self):
     return field.Fields(IResource).select('title', 'description')
コード例 #14
0
ファイル: resource.py プロジェクト: l1ph0x/schooltool-2
 def getDemoFields(self):
     fields = field.Fields()
     dfs = IResourceDemographicsFields(ISchoolToolApplication(None))
     for field_desc in dfs.filter_key(self.resource_type):
         fields += field_desc.makeField()
     return fields
コード例 #15
0
 def update_schema(self):
     fields = field.Fields(self.get_fields)
     showFields = getattr(self.field, 'showFields', [])
     if showFields:
         fields = fields.select(*showFields)
     return fields
コード例 #16
0
ファイル: resource.py プロジェクト: l1ph0x/schooltool-2
 def getBaseFields(self):
     fields = field.Fields(IEquipment).select('title', 'description')
     return fields
コード例 #17
0
 def view_schema(self):
     ExtraData = self.field.ExtraData
     if ExtraData:
         return field.Fields(IExtraData).select(*ExtraData)
コード例 #18
0
class DisplayForm(layout.FormLayoutSupport, form.DisplayForm):
    """Widgets in Display-Mode"""
    form.extends(form.DisplayForm)
    label = _(u'View Superclass')
    fields = field.Fields(ISuperclass).omit(\
        *SuperclassDetails.omit_viewfields)
コード例 #19
0
class ArchiveForm(directives_form.Form):
    grok.context(IDossierMarker)
    grok.name('transition-archive')
    grok.require('zope2.View')

    label = _(u'heading_archive_form', u'Archive Dossier')
    fields = field.Fields(IArchiveFormSchema)
    ignoreContext = True

    # define custom widgets.
    fields['filing_action'].widgetFactory[INPUT_MODE] = radio.RadioFieldWidget
    fields['dossier_enddate'].widgetFactory[INPUT_MODE] = DatePickerFieldWidget

    @button.buttonAndHandler(_(u'button_archive', default=u'Archive'))
    def archive(self, action):
        """Try to archive this dossier.

        For that to happen, first all subdossiers need to have filing_no
        and end_date set, and then be resolved. If resolving any of the
        subdossier fails, we'll throw and error and return.
        """

        data, errors = self.extractData()

        # Abort if there were errors
        if len(errors) > 0:
            return
        self.ptool = getToolByName(self.context, 'plone_utils')
        self.wft = self.context.portal_workflow

        action = data.get('filing_action')
        filing_year = data.get('filing_year')
        filing_no = None
        filing_prefix = data.get('filing_prefix')
        end_date = data.get('dossier_enddate')

        if action == METHOD_FILING:
            # allready resolved only give a filing number
            IDossierArchiver(self.context).archive(filing_prefix, filing_year)
            self.ptool.addPortalMessage(_("The filing number has been given."),
                                        type="info")
            return self.request.RESPONSE.redirect(self.context.absolute_url())

        # archiving must passed to the resolving view
        resolver = get_resolver(self.context)
        if resolver.is_resolve_possible():
            raise TypeError
        if resolver.are_enddates_valid():
            raise TypeError

        if action == METHOD_RESOLVING_AND_FILING:
            IDossierArchiver(self.context).archive(filing_prefix, filing_year)

        if action == METHOD_RESOLVING_EXISTING_FILING:
            # archive all with the existing filing number
            filing_no = IFilingNumber(self.context).filing_no
            filing_prefix = IDossier(self.context).filing_prefix
            IDossierArchiver(self.context).archive(filing_prefix,
                                                   filing_year,
                                                   number=filing_no)

        if action == METHOD_RESOLVING:
            # only update the prefixes
            if filing_prefix:
                IDossierArchiver(self.context).update_prefix(filing_prefix)

        # If everything went well, resolve the main dossier
        resolver.resolve(end_date=end_date)

        self.ptool.addPortalMessage(_("The Dossier has been resolved"),
                                    type="info")
        return self.request.RESPONSE.redirect(self.context.absolute_url())

    @button.buttonAndHandler(_(u'button_cancel', default=u'Cancel'))
    def cancel(self, action):
        return self.request.RESPONSE.redirect(self.context.absolute_url())
コード例 #20
0
class FieldAddForm(AutoExtensibleForm, form.AddForm):

    fields = field.Fields(interfaces.INewField)
    label = _("Add new field")
    id = 'add-field-form'

    # This is a trick: we want autoform to handle the additionalSchemata,
    # but want to provide our own base schema below in updateFields.
    schema = Interface

    @lazy_property
    def _schema(self):
        return interfaces.INewField

    @lazy_property
    def additionalSchemata(self):
        return [
            v for k, v in getAdapters((
                self.context, ), interfaces.IFieldEditorExtender)
        ]

    def create(self, data):
        extra = {}
        factory = data.pop('factory')
        all = data.keys()

        # split regular attributes and extra ones
        for key in all:
            if key not in self._schema:
                extra[key] = data[key]
                data.pop(key)

        # create the field with regular attributes
        field_obj = factory(**data)

        # set the extra attributes using the proper adapter
        for schemata in self.additionalSchemata:
            for key in extra:
                (interface_name, property_name) = key.split('.')
                if interface_name != schemata.__name__:
                    continue
                setattr(schemata(field_obj), property_name, extra[key])

        return field_obj

    def add(self, field):
        context = self.context
        schema = IEditableSchema(context.schema)

        # move it after the last field that is not in a fieldset
        # or at top if there is no field yet in "default" fieldset
        ordered_fields = [name for (name, f) in sortedFields(context.schema)]
        default_fields = non_fieldset_fields(context.schema)
        if len(default_fields) > 0:
            position = ordered_fields.index(default_fields[-1]) + 1
        else:
            position = 0

        try:
            schema.addField(field)
        except ValueError:
            raise WidgetActionExecutionError(
                '__name__',
                Invalid(
                    u'Please select a field name that is not already used.'))

        schema.moveField(field.__name__, position)
        notify(ObjectAddedEvent(field, context.schema))
        notify(FieldAddedEvent(context, field))
        IStatusMessage(self.request).addStatusMessage(
            _(u"Field added successfully."), type='info')

    def nextURL(self):
        return "@@add-field"
コード例 #21
0
class NewsletterSubscriberForm(extensible.ExtensibleForm, form.Form):
    fields = field.Fields(INewsletterSubscribe)
    ignoreContext = True
    id = "newsletter-subscriber-form"
    label = _(u"Subscribe to newsletter")

    def updateActions(self):
        super(NewsletterSubscriberForm, self).updateActions()
        self.actions['subscribe'].addClass('context')

    def updateFields(self):
        super(NewsletterSubscriberForm, self).updateFields()
        self.fields['interest_groups'].widgetFactory = \
            CheckBoxFieldWidget
        self.fields['email_type'].widgetFactory = \
            RadioFieldWidget

    def updateWidgets(self):
        super(NewsletterSubscriberForm, self).updateWidgets()
        # Show/hide mail format option widget
        registry = getUtility(IRegistry)
        mailchimp_settings = registry.forInterface(IMailchimpSettings)
        if not mailchimp_settings.email_type_is_optional:
            self.widgets['email_type'].mode = HIDDEN_MODE
        # Retrieve the list id either from the request/form or fall back to
        # the default_list setting.
        if 'list_id' in self.context.REQUEST:
            list_id = self.context.REQUEST['list_id']
        elif 'form.widgets.list_id' in self.request.form:
            list_id = self.request.form['form.widgets.list_id']
        else:
            list_id = mailchimp_settings.default_list
        self.widgets['list_id'].mode = HIDDEN_MODE
        self.widgets['list_id'].value = list_id
        # Show/hide interest_groups widget
        mailchimp = getUtility(IMailchimpLocator)
        groups = mailchimp.groups(list_id=list_id)
        if not groups:
            self.widgets['interest_groups'].mode = HIDDEN_MODE
        if 'preselect_group' in self.context.REQUEST:
            for group_index in self.request['preselect_group']:
                group_index = int(group_index)
                self.widgets['interest_groups']\
                    .items[group_index]['checked'] = True

    @button.buttonAndHandler(_(u"subscribe_to_newsletter_button",
                               default=u"Subscribe"),
                             name='subscribe')
    def handleApply(self, action):
        data, errors = self.extractData()
        if 'email' not in data:
            return
        mailchimp = getUtility(IMailchimpLocator)
        # Retrieve list_id either from a hidden field in the form or fetch
        # the first list from mailchimp.
        if 'list_id' in data and data['list_id'] is not None:
            list_id = data['list_id']
        else:
            list_id = mailchimp.default_list_id()

        # Groupings
        interests = {}
        if 'interest_groups' in data and data['interest_groups'] is not None:
            interest_grouping = mailchimp.groups(list_id=list_id)
            if interest_grouping and data['interest_groups']:
                # Create dictionary with as keys the interest groups, and as
                # values always True.
                interests = dict.fromkeys(data['interest_groups'], True)

        # Use email_type if one is provided by the form, if not choose the
        # default email type from the control panel settings.
        if 'email_type' in data:
            email_type = data['email_type']
        else:
            email_type = 'HTML'
        # Subscribe to MailChimp list
        try:
            mailchimp.subscribe(
                list_id=list_id,
                email_address=data['email'],
                email_type=email_type,
                interests=interests
            )
        except MailChimpException as error:
            return self.handle_error(error, data)
        registry = getUtility(IRegistry)
        mailchimp_settings = registry.forInterface(IMailchimpSettings)
        if mailchimp_settings.double_optin:
            message = _(
                u"We have to confirm your email address. In order to " +
                u"finish the newsletter subscription, click on the link " +
                u"inside the email we just send you.")
        else:
            message = _(
                u"You have been subscribed to our newsletter succesfully.")
        IStatusMessage(self.context.REQUEST).addStatusMessage(
            message, type="info")
        portal = getSite()
        self.request.response.redirect(portal.absolute_url())

    def handle_error(self, error, data):
        # Current api v3 documentation only lists errors in the 400 and 500
        # range.  The 400 code can mean a lot of things...
        if error.code == 400:
            error_msg = _(
                u"mailchimp_error_msg_already_subscribed",
                default=u"Could not subscribe to newsletter. "
                        u"Either the email '${email}' is already subscribed "
                        u"or something else is wrong. Try again later.",
                mapping={u"email": data['email']})
            translated_error_msg = self.context.translate(error_msg)
            raise WidgetActionExecutionError(
                'email',
                Invalid(translated_error_msg)
            )
        elif error.code == 220:
            error_msg = _(
                u"mailchimp_error_msg_banned",
                default=u"Could not subscribe to newsletter. "
                        u"The email '${email}' has been banned.",
                mapping={u"email": data['email']})
            translated_error_msg = self.context.translate(error_msg)
            raise WidgetActionExecutionError(
                'email',
                Invalid(translated_error_msg)
            )
        else:
            error_msg = _(
                u"mailchimp_error_msg",
                default=u"Could not subscribe to newsletter. "
                        u"Please contact the site administrator: "
                        u"'${error}'",
                mapping={u"error": error})
            translated_error_msg = self.context.translate(error_msg)
            raise ActionExecutionError(
                Invalid(translated_error_msg)
            )
コード例 #22
0
class FlourishCategoryEditView(flourish.form.Form, form.EditForm):
    legend = _('Category')
    fields = field.Fields(ICategoryEditForm)
    data = None

    def nextURL(self):
        return absoluteURL(self.context, self.request)

    @button.buttonAndHandler(_('Submit'), name='submit')
    def handleSubmit(self, action):
        data, errors = self.extractData()
        if errors:
            self.status = self.formErrorsMessage
            return
        changes = self.applyChanges(data)
        category = self.data['category']
        if (changes and category and category in self.context):

            # XXX: stupid Zope.
            del self.context[category]

            self.context[category] = self.data['title']
            self.status = self.successMessage
        else:
            self.status = self.noChangesMessage
        self.request.response.redirect(self.nextURL())

    @button.buttonAndHandler(_('Make Default'), name='make_default')
    def handleMakeDefault(self, action):
        data, errors = self.extractData()
        category = data['category']
        if (category and category in self.context):
            self.context.default_key = category
        self.request.response.redirect(self.nextURL())

    @button.buttonAndHandler(_('Cancel'))
    def handle_cancel_action(self, action):
        self.request.response.redirect(self.nextURL())

    def getContent(self):
        return self.data

    def update(self):
        self.data = {}
        self.data['category'] = self.request.get('category', '')
        if self.data['category']:
            self.data['title'] = removeSecurityProxy(
                self.context.get(self.data['category']))
            # XXX: ContainedProxy fails on unicode(title)
            #      when there are non-ascii characters
            #      so we get a real unicode object here
            if self.data['title'] is not None:
                title = self.data['title']
                self.data['title'] = title.encode('utf-8').decode('utf-8')
            if self.context.default_key == self.data['category']:
                self.data['default'] = True
        else:
            self.data['title'] = None
        super(FlourishCategoryEditView, self).update()
        self.widgets['category'].mode = HIDDEN_MODE

    def updateActions(self):
        super(FlourishCategoryEditView, self).updateActions()
        self.actions['submit'].addClass('button-ok')
        self.actions['make_default'].addClass('button-ok')
        self.actions['cancel'].addClass('button-cancel')
コード例 #23
0
ファイル: simple1.py プロジェクト: mleist/ict-ok.org
class EditAdmUtilSimple1Form(EditForm):
    """ Edit for for net """
    label = _(u'edit simple scanner')
    fields = field.Fields(IAdmUtilSimple1).omit(\
        *AdmUtilSimple1Details.omit_editfields)
コード例 #24
0
class DefaultSchemata(DS):
    """ Schemata default
    """
    fields = field.Fields(IAlphabeticSchema).select(u'title', u'default',
                                                    u'index')
コード例 #25
0
ファイル: esx_vim.py プロジェクト: mleist/ict-ok.org
class EditAdmUtilEsxVimForm(EditForm):
    """ Edit for for net """
    label = _(u'edit esx_vim')
    fields = field.Fields(IAdmUtilEsxVim).omit(\
        *AdmUtilEsxVimDetails.omit_editfields)
コード例 #26
0
class AuthorFeedbackForm(form.Form):

    fields = field.Fields(IAuthorFeedbackForm)
    ignoreContext = True

    @button.buttonAndHandler(_(u'label_send', default='Send'),
                             name='send')
    def handle_send(self, action):
        self.portal_state = getMultiAdapter(
            (self.context, self.request),
            name=u'plone_portal_state'
        )

        self.portal = self.portal_state.portal()
        self.membership_tool = getToolByName(
            self.context, 'portal_membership'
        )

        self.feedback_template = self.context.restrictedTraverse(
            '@@author-feedback-template'
        )

        data, errors = self.extractData()
        if errors:
            IStatusMessage(self.request).addStatusMessage(
                self.formErrorsMessage,
                type=u'error'
            )

            return

        referer = data.get('referer', 'unknown referer')
        subject = data.get('subject', '')
        message = data.get('message', '')
        # Author is None means portal administrator
        author = data.get('author', None)

        sender = self.portal_state.member()
        registry = getUtility(IRegistry)
        mail_settings = registry.forInterface(IMailSchema, prefix='plone')
        envelope_from = mail_settings.email_from_address

        if author is None:
            send_to_address = mail_settings.email_from_address
        else:
            author_member = self.membership_tool.getMemberById(author)
            send_to_address = author_member.getProperty('email')

        send_from_address = sender.getProperty('email')

        if send_from_address == '':
            IStatusMessage(self.request).addStatusMessage(
                _(u'Could not find a valid email address'),
                type=u'error'
            )
            return

        sender_id = "%s (%s), %s" % (
            sender.getProperty('fullname'),
            sender.getId(),
            send_from_address
        )

        mail_host = getUtility(IMailHost)
        registry = getUtility(IRegistry)
        email_charset = registry.get('plone.email_charset', 'utf-8')

        try:
            message = self.feedback_template(
                self, send_from_address=send_from_address,
                sender_id=sender_id, url=referer, subject=subject,
                message=message, encoding=email_charset,
                email_from_name=mail_settings.email_from_name
            )

            message = message.encode(email_charset)

            mail_host.send(
                message, send_to_address, envelope_from,
                subject=subject, charset=email_charset
            )
        except ConflictError:
            raise
        except Exception as e:
            logger.info("Unable to send mail: " + str(e))

            IStatusMessage(self.request).addStatusMessage(
                _(u'Unable to send mail.'),
                type=u'error'
            )

            return

        IStatusMessage(self.request).addStatusMessage(
            _(u'Mail sent.'),
            type=u'info'
        )
        self.request.response.redirect('%s/author/%s' % (
            self.portal.absolute_url(),
            author or ''))
        return
コード例 #27
0
ファイル: host.py プロジェクト: mleist/ict-ok.org
class AddHostForm(AddForm):
    """Add form."""
    label = _(u'Add VMware Virtual Machine')
    fields = field.Fields(IHostVMwareVm).omit(*HostDetails.omit_addfields)
    factory = Host
コード例 #28
0
class RedirectsControlPanelForm(form.EditForm):
    fields = field.Fields(IAliasesSchema)
コード例 #29
0
class LoginForm(form.EditForm):
    """ Implementation of the login form """

    fields = field.Fields(ILoginFormSchema)

    id = 'LoginForm'
    label = _('label_log_in', default=u'Log in')

    ignoreContext = True
    prefix = ''

    def render(self):
        registry = queryUtility(IRegistry)
        ext_login_url = registry['plone.external_login_url']
        if ext_login_url:
            return self._handle_external_login(ext_login_url)
        return self.index()

    def _handle_external_login(self, url):
        """Handle login on this portal where login is external."""
        next_ = self.request.get('next', None)
        portal_url = getToolByName(self.context, 'portal_url')
        if next_ is not None and not portal_url.isURLInPortal(next_):
            next_ = None
        if next_ is not None:
            url = '{0}?next={1}'.format(url, next_)
        came_from = self.request.get('came_from')
        if came_from:
            url = '{0}&came_from={1}'.format(url, came_from)
        self.request.response.redirect(url)

    def _get_auth(self):
        try:
            return self.context.acl_users.credentials_cookie_auth
        except AttributeError:
            try:
                return self.context.cookie_authentication
            except AttributeError:
                pass

    def updateWidgets(self):
        auth = self._get_auth()

        if auth:
            fieldname_name = auth.get('name_cookie', '__ac_name')
            fieldname_password = auth.get('pw_cookie', '__ac_password')
        else:
            fieldname_name = '__ac_name'
            fieldname_password = '******'

        self.fields['ac_name'].__name__ = fieldname_name
        self.fields['ac_password'].__name__ = fieldname_password

        super(LoginForm, self).updateWidgets(prefix='')

        if self.use_email_as_login():
            self.widgets[fieldname_name].label = _(u'label_email',
                                                   default=u'Email')
        self.widgets['came_from'].mode = HIDDEN_MODE
        self.widgets['came_from'].value = self.get_came_from()

    def get_came_from(self):
        came_from = self.request.get('came_from', None)
        if not came_from:
            came_from = self.request.get('HTTP_REFERER', None)
            if not came_from:
                return
        url_tool = getToolByName(self.context, 'portal_url')
        if not url_tool.isURLInPortal(came_from):
            return
        came_from_path = parse.urlparse(came_from)[2]
        for login_template_id in LOGIN_TEMPLATE_IDS:
            if login_template_id in came_from_path:
                return
        return came_from

    def updateActions(self):
        super(LoginForm, self).updateActions()
        self.actions['login'].addClass('context')

    def _post_login(self):
        membership_tool = getToolByName(self.context, 'portal_membership')
        member = membership_tool.getAuthenticatedMember()
        must_change_password = member.getProperty('must_change_password', 0)
        login_time = member.getProperty('login_time', '2000/01/01')
        if not isinstance(login_time, DateTime):
            login_time = DateTime(login_time)
        is_initial_login = login_time == DateTime('2000/01/01')

        membership_tool.loginUser(self.request)
        if is_initial_login:
            self.handle_initial_login()

        if must_change_password:
            self.force_password_change()
        return is_initial_login

    @button.buttonAndHandler(_('Log in'), name='login')
    def handleLogin(self, action):
        data, errors = self.extractData()
        if errors:
            self.status = self.formErrorsMessage
            return
        membership_tool = getToolByName(self.context, 'portal_membership')
        status_msg = IStatusMessage(self.request)
        if membership_tool.isAnonymousUser():
            self.request.response.expireCookie('__ac', path='/')
            if self.use_email_as_login():
                status_msg.addStatusMessage(
                    _(
                        u'Login failed. Both email address and password are '
                        u'case sensitive, check that caps lock is not enabled.'
                    ),
                    'error',
                )
            else:
                status_msg.addStatusMessage(
                    _(
                        u'Login failed. Both login name and password are case '
                        u'sensitive, check that caps lock is not enabled.'
                    ),
                    'error',
                )
            return

        is_initial_login = self._post_login()
        status_msg.addStatusMessage(
            _(
                u'you_are_now_logged_in',
                default=u'Welcome! You are now logged in.',
            ),
            'info'
        )

        came_from = data.get('came_from', None)
        self.redirect_after_login(came_from, is_initial_login)

    def handle_initial_login(self):
        handler = queryMultiAdapter(
            (self.context, self.request),
            IInitialLogin,
        )
        if handler:
            handler()

    def force_password_change(self):
        handler = queryMultiAdapter(
            (self.context, self.request),
            IForcePasswordChange,
        )
        if handler:
            handler()

    def redirect_after_login(self, came_from=None, is_initial_login=False):
        adapter = queryMultiAdapter(
            (self.context, self.request),
            IRedirectAfterLogin
        )
        if adapter:
            came_from = adapter(came_from, is_initial_login)
        if not came_from:
            came_from = self.context.absolute_url()

        self.request.response.redirect(came_from)

    def self_registration_enabled(self):
        registry = queryUtility(IRegistry)
        security_settings = registry.forInterface(
            ISecuritySchema,
            prefix='plone'
        )
        return security_settings.enable_self_reg

    def use_email_as_login(self):
        registry = queryUtility(IRegistry)
        security_settings = registry.forInterface(
            ISecuritySchema,
            prefix='plone'
        )
        return security_settings.use_email_as_login
コード例 #30
0
class EasySliderSettingsForm(form.EditForm):
    """
    The page that holds all the slider settings
    """

    fields = field.Fields(ISliderSettings)