Example #1
0
    def setup_form(self):
        self.buttons = button.Buttons()
        self.handlers = button.Handlers()

        if self.form_type() == 'addform':
            preview = button.Button(title=_(u'Continue'), name='save')
            self.buttons += button.Buttons(preview)

            preview_handler = button.Handler(preview,
                                             self.__class__.handle_preview)
            self.handlers.addHandler(preview, preview_handler)

            self.ignoreContext = True
            self.ignoreReadonly = True
        else:
            update = button.Button(title=_(u'Continue'), name='save')
            self.buttons += button.Buttons(update)

            update_handler = button.Handler(update,
                                            self.__class__.handle_update)
            self.handlers.addHandler(update, update_handler)

            self.context = self.event

        cancel = button.Button(title=_(u'Cancel'), name='cancel')
        self.buttons += button.Buttons(cancel)

        cancel_handler = button.Handler(cancel, self.__class__.handle_cancel)
        self.handlers.addHandler(cancel, cancel_handler)
Example #2
0
    def updateActions(self):
        btn = button.Button(name='save', title=_(u'Save'))
        self.buttons += button.Buttons(btn)
        self.handlers.addHandler(btn, self.handleApply)

        if ISaveAndActionButtons.providedBy(self.context):
            append_action_buttons(self)

        if ICancelButton.providedBy(self.context):
            btn = button.Button(name='cancel', title=_(u'Cancel'))
            self.buttons += button.Buttons(btn)
            self.handlers.addHandler(btn, self.handleCancel)

        super(SubmissionEditForm, self).updateActions()
Example #3
0
def extends(*args, **kwargs):
    frame = sys._getframe(1)
    f_locals = frame.f_locals
    if not kwargs.get('ignoreFields', False):
        f_locals['fields'] = field.Fields()
        for arg in args:
            f_locals['fields'] += getattr(arg, 'fields', field.Fields())
    if not kwargs.get('ignoreHandlers', False):
        f_locals['buttons'] = button.Buttons()
        for arg in args:
            f_locals['buttons'] += getattr(arg, 'buttons', button.Buttons())
    if not kwargs.get('ignoreHandlers', False):
        f_locals['handlers'] = button.Handlers()
        for arg in args:
            f_locals['handlers'] += getattr(arg, 'handlers', button.Handlers())
Example #4
0
class SchemaView(DefaultEditForm):
    buttons = button.Buttons()

    def label(self):
        return self.context.title

    def description(self):
        return self.context.description

    @property
    @view.memoize
    def schema(self):
        language = negotiate(context=self.request) or u''
        try:
            return load_schema(
                aq_base(self.context).schema,
                language=language,
                cache_key=aq_base(self.context).schema_digest,
            )
        except AttributeError:
            self.request.response.redirect(
                '{0:s}/@@design'.format(self.context.absolute_url()), )
            return load_schema(DEFAULT_SCHEMA, cache_key=None)

    additionalSchemata = ()
Example #5
0
class ButtonForm(layout.FormLayoutSupport, form.Form):

    buttons = button.Buttons(IButtons)
    fields = field.Fields(IFields)

    @jsevent.handler(buttons['show'])
    def apply(self, id):
        return '$("#javascript").slideDown()'

    @jsevent.handler(buttons['hide'])
    def apply(self, id):
        return '$("#javascript").slideUp()'

    @jsevent.handler(fields['file'], event=jsevent.CHANGE)
    def handleFileChange(self, id):
        return '''
            $(".code").hide();
            $("#"+$("#%s").val().replace(".","-")).show();''' % id

    def updateWidgets(self):
        '''See interfaces.IForm'''
        self.widgets = zope.component.getMultiAdapter(
            (self, self.request, self.getContent()), IWidgets)
        self.widgets.ignoreContext = True
        self.widgets.update()

    def getFile(self, filename):
        here = os.path.dirname(os.path.abspath(__file__))
        f = open(os.path.join(here, filename), 'r')
        data = f.read()
        f.close()
        return data
Example #6
0
class PopulateForm(ExtensibleForm, form.Form):
    ignoreContext = True
    fields = field.Fields(IPopulateFormSchema)
    buttons = button.Buttons(IPopulateFormButtons)

    def updateFields(self):
        super(PopulateForm, self).updateFields()
        self.fields['formatting'].widgetFactory = CheckBoxFieldWidget
        context = aq_inner(self.context)
        if shasattr(context, 'getLocallyAllowedTypes'):
            self.fields['portal_type'].field.default = \
                list(context.getLocallyAllowedTypes())
        elif shasattr(context, 'allowedContentTypes'):
            self.fields['portal_type'].field.default = \
                [t.id for t in context.allowedContentTypes()]

    @button.handler(IPopulateFormButtons['create'])
    def create(self, action):
        data, errors = self.extractData()
        if errors:
            self.status = '\n'.join([
                error.error.__str__() for error in errors])
            return

        context = aq_inner(self.context)
        total = create_subobjects(context, context, data, 0)
        addStatusMessage(
            self.request,
            _(u'Successfully created %d dummy objects.') % total,
            type='info')
        self.request.response.redirect(self.context.REQUEST.get('URL'))
Example #7
0
class ReadOnlySchemaListing(SchemaListing):
    buttons = button.Buttons()

    def edit_url(self, field):
        return

    delete_url = edit_url
Example #8
0
 def create_buttons(self, schema):
     return button.Buttons(
         *[
             GeneratedButton(str(e["id"]), title=e["title"])
             for e in schema.get("actions", [])
         ]
     )
Example #9
0
class Form(BaseForm):
    """The Form."""

    buttons = button.Buttons()

    method = FieldProperty(interfaces.IInputForm['method'])
    enctype = FieldProperty(interfaces.IInputForm['enctype'])
    acceptCharset = FieldProperty(interfaces.IInputForm['acceptCharset'])
    accept = FieldProperty(interfaces.IInputForm['accept'])

    actions = FieldProperty(interfaces.IActionForm['actions'])
    refreshActions = FieldProperty(interfaces.IActionForm['refreshActions'])

    # common string for use in validation status messages
    formErrorsMessage = _('There were some errors.')

    @property
    def action(self):
        """See interfaces.IInputForm"""
        return self.request.getURL()

    @property
    def name(self):
        """See interfaces.IInputForm"""
        return self.prefix.strip('.')

    @property
    def id(self):
        return self.name.replace('.', '-')

    def updateActions(self):
        self.actions = zope.component.getMultiAdapter(
            (self, self.request, self.getContent()), interfaces.IActions)
        self.actions.update()

    def update(self):
        super(Form, self).update()
        self.updateActions()
        self.actions.execute()
        if self.refreshActions:
            self.updateActions()

    def __call__(self):
        self.update()

        # Don't render anything if we are doing a redirect
        if self.request.response.getStatus() in (
                300,
                301,
                302,
                303,
                304,
                305,
                307,
        ):
            return u''

        return self.render()
Example #10
0
class Add(add.DefaultAddForm):
    """
    Add Experiment
    """

    template = ViewPageTemplateFile("experiment_add.pt")

    extends(view.DefaultView,
            ignoreButtons=True)

    buttons = button.Buttons(add.DefaultAddForm.buttons['cancel'])

    @button.buttonAndHandler(_('Create and start'), name='save')
    def handleAdd(self, action):
        data, errors = self.extractData()
        self.validateAction(data)
        if errors:
            self.status = self.formErrorsMessage
            return
        # TODO: this is prob. a bug in base form, because createAndAdd
        #       does not return the wrapped object.
        obj = self.createAndAdd(data)
        if obj is None:
            # TODO: this is probably an error here?
            #       object creation/add failed for some reason
            return
        # get wrapped instance fo new object (see above)
        obj = self.context[obj.id]
        # mark only as finished if we get the new object
        self._finishedAdd = True
        IStatusMessage(self.request).addStatusMessage(_(u"Item created"),
                                                      "info")
        # auto start job here
        jt = IJobTracker(obj)
        msgtype, msg = jt.start_job(self.request)
        if msgtype is not None:
            IStatusMessage(self.request).add(msg, type=msgtype)

    @button.buttonAndHandler(_('Create'), name='create')
    def handleCreate(self, action):
        data, errors = self.extractData()
        self.validateAction(data)
        if errors:
            self.status = self.formErrorsMessage
            return
        # TODO: this is prob. a bug in base form, because createAndAdd
        #       does not return the wrapped object.
        obj = self.createAndAdd(data)
        if obj is None:
            # TODO: this is probably an error here?
            #       object creation/add failed for some reason
            return
        # get wrapped instance fo new object (see above)
        obj = self.context[obj.id]
        # mark only as finished if we get the new object
        self._finishedAdd = True
        IStatusMessage(self.request).addStatusMessage(_(u"Item created"),
                                                      "info")
Example #11
0
    def setup_form(self):
        self.buttons = button.Buttons()
        self.handlers = button.Handlers()

        save = button.Button(title=_(u'Save Event'), name='save')
        self.buttons += button.Buttons(save)

        save_handler = button.Handler(save, self.__class__.handle_save)
        self.handlers.addHandler(save, save_handler)

        self.event = self.context

        cancel = button.Button(title=_(u'Cancel Event Submission'),
                               name='cancel')
        self.buttons += button.Buttons(cancel)

        cancel_handler = button.Handler(cancel, self.__class__.handle_cancel)
        self.handlers.addHandler(cancel, cancel_handler)
Example #12
0
 def __init__(self, context, request):
     super(SubmissionEditForm, self).__init__(context, request)
     language = negotiate(context=request) or u''
     context_language = get_navigation_root_language(self.context)
     if context_language.startswith(language or context_language):
         self._locale_postfix = ''
     else:
         self._locale_postfix = '_' + language
     self.buttons = button.Buttons()
     self.handlers = button.Handlers()
Example #13
0
class SelectedPeriodsAddView(form.AddForm):

    template = ViewPageTemplateFile('templates/selected_periods_add.pt')
    fields = field.Fields(ISelectedPeriodsAddForm)

    _object_added = None

    buttons = button.Buttons(
        button.Button('add', title=_('Add')),
        button.Button('cancel', title=_('Cancel')))

    @property
    def owner(self):
        return IHaveSchedule(self.context)

    @property
    def term(self):
        return ITerm(self.owner, None)

    @button.handler(buttons["add"])
    def handleAdd(self, action):
        return form.AddForm.handleAdd.func(self, action)

    @button.handler(buttons["cancel"])
    def handleCancel(self, action):
        url = absoluteURL(self.context, self.request)
        self.request.response.redirect(url)

    def updateActions(self):
        super(SelectedPeriodsAddView, self).updateActions()
        self.actions['add'].addClass('button-ok')
        self.actions['cancel'].addClass('button-cancel')

    def create(self, data):
        timetable = data['timetable']
        schedule = SelectedPeriodsSchedule(
            timetable, data['first'], data['last'],
            title=timetable.title,
            timezone=timetable.timezone)
        return schedule

    def add(self, schedule):
        chooser = INameChooser(self.context)
        name = chooser.chooseName('', schedule)
        self.context[name] = schedule
        self._object_added = schedule

    def nextURL(self):
        if self._object_added is not None:
            return '%s/edit.html' % (
                absoluteURL(self._object_added, self.request))
        return absoluteURL(self.context, self.request)
Example #14
0
 def __init__(self, context, request):
     super(FlowSubmitForm, self).__init__(context, request)
     language = negotiate(context=self.request) or u''
     context_language = get_navigation_root_language(self.context)
     if context_language.startswith(language or context_language):
         self.localized_context = context
     else:
         proxy = LanguageFieldsProxy(self.context)
         proxy._language = language
         self.localized_context = proxy
     self.buttons = button.Buttons()
     self.handlers = button.Handlers()
     if 'disable_border' in self.request.form:
         del self.request.form['disable_border']
Example #15
0
class CalculatorForm(layout.FormLayoutSupport, form.Form):

    buttons = button.Buttons(IButtons)

    def updateActions(self):
        self.actions = GridButtonActions(self, self.request, self.context)
        self.actions.update()

    @jsevent.handler(Operator)
    def handleOperator(self, id):
        return '''var operator = $("#operator .value").html();
                  var newOperator = $("#%s").val();
                  var current = $("#current .value").html();
                  var stack = $("#stack .value").html();
                  if (operator == ""){
                      stack = current;
                      operator = newOperator;
                  } else if(newOperator == "="){
                      current = eval(stack+operator+current);
                      stack = "";
                      operator = "";
                  } else {
                      current = eval(stack+operator+current);
                      stack = current;
                  }
                  
                  $("#operator .value").html(operator);
                  $("#stack .value").html(stack);
                  $("#recentOperator .value").html("True");
                  $("#current .value").html(current);''' % id

    @jsevent.handler(Literal)
    def handleLiteral(self, id):
        return '''var recentOperator = $("#recentOperator .value").html();
                  var current = $("#current .value").html();
                  var number = $("#%s").val();
                  if (recentOperator != ""){
                    current = "";
                  }
                  current = current+number;
                  $("#current .value").html(current);
                  $("#recentOperator .value").html("");
                  ''' % id

    @jsevent.handler(buttons['clear'])
    def handlerClear(self, id):
        return '''$("#stack .value").html("");
Example #16
0
def append_action_buttons(form):
    # Get currently available workflow actions (re-use from menu)
    actions = {}
    menu = getUtility(IBrowserMenu, name='plone_contentmenu_workflow')

    def lower_first(s):
        if s and isinstance(s, unicode) and len(s) > 1:
            return s[0].lower() + s[1:]
        elif s and isinstance(s, unicode):
            return s.lower()
        return s

    for action in menu.getMenuItems(form.context, form.request):
        item_id = action.get('extra', {}).get('id', u'') or u''
        action_id = re.sub('^workflow-transition-(.*)', '\\1', item_id)
        actions[action_id] = action

    for action in ['advanced', 'policy']:  # blacklisted menuitems
        if action in actions:
            del actions[action]

    form.buttons = form.buttons.copy()
    for action_id, action in actions.iteritems():
        new_button = button.Button(
            name=re.sub('^workflow-transition-(.*)', '\\1', action_id),
            title=u' '.join([
                translate(
                    _(u'Save and'),
                    context=form.request,
                ),
                lower_first(
                    translate(
                        action['title'],
                        domain='plone',
                        context=form.request,
                    ),
                ),
            ]),
        )
        form.buttons += button.Buttons(new_button)
        form.handlers.addHandler(
            new_button,
            button.Handler(
                new_button,
                functools.partial(form.redirect, action['action']),
            ),
        )
Example #17
0
class MultiWidget(HTMLFormElement, widget.MultiWidget, FormMixin):
    """Multi widget implementation."""

    buttons = button.Buttons()

    prefix = 'widget'
    klass = u'multi-widget'
    css = u'multi'
    items = ()

    showLabel = True  # show labels for item subwidgets or not

    # Internal attributes
    _adapterValueAttributes = widget.MultiWidget._adapterValueAttributes + \
        ('showLabel',)

    def updateActions(self):
        self.updateAllowAddRemove()
        if self.name is not None:
            self.prefix = self.name
        self.actions = zope.component.getMultiAdapter(
            (self, self.request, self), interfaces.IActions)
        self.actions.update()

    def update(self):
        """See z3c.form.interfaces.IWidget."""
        super(MultiWidget, self).update()
        self.updateActions()
        self.actions.execute()
        self.updateActions()  # Update again, as conditions may change

    @button.buttonAndHandler(_('Add'),
                             name='add',
                             condition=attrgetter('allowAdding'))
    def handleAdd(self, action):
        self.appendAddingWidget()

    @button.buttonAndHandler(_('Remove selected'),
                             name='remove',
                             condition=attrgetter('allowRemoving'))
    def handleRemove(self, action):
        self.removeWidgets([
            widget.name for widget in self.widgets
            if ('%s.remove' % (widget.name)) in self.request
        ])
Example #18
0
class EditForm(edit.DefaultEditForm):
    """ """
    buttons = edit.DefaultEditForm.buttons
    preview = button.Buttons(
        button.Button('preview', title=u'Save and preview'))
    buttons = preview + buttons
    buttons['cancel'].title = _(u'Clear unsaved changes')
    handlers = edit.DefaultEditForm.handlers

    def nextURL(self):
        return 'edit'

    @button.handler(buttons['preview'])
    def handle_preview(self, action):
        data, errors = self.extractData()
        if errors:
            self.status = self.formErrorsMessage
            return
        self.applyChanges(data)
        self.request.response.redirect('nuplone-view')
        notify(EditFinishedEvent(self.context))
Example #19
0
class AllFieldsForm(mars.form.FormView, form.EditForm):
    """A form showing all fields."""
    grok.name('widgets')
    grok.context(zope.interface.Interface)

    form.extends(form.EditForm)
    fields = field.Fields(interfaces.IAllFields).omit('dictField',
                                                      'objectField')
    fields['checkboxBoolField'].widgetFactory = \
        checkbox.SingleCheckBoxFieldWidget

    buttons = form.EditForm.buttons + \
              button.Buttons(
                 button.ImageButton(name='pressme', image=u'pressme.png')
                 )

    label = 'Widgets Demo'

    @button.handler(buttons['pressme'])
    def handlePressMe(self, action):
        self.status = u'Press me was clicked!'

    def getContent(self):
        return interfaces.IAllFields(self.context)

    def updateWidgets(self):
        self.widgets = zope.component.getMultiAdapter(
            (self, self.request, self.getContent()), IWidgets)
        self.widgets.update()
        self.widgets['hiddenField'].mode = HIDDEN_MODE
        self.widgets['promptChoiceField'].prompt = True
        self.widgets['promptChoiceField'].update()

    def __call__(self):
        self.update()
        layout = zope.component.getMultiAdapter((self, self.request),
                                                ILayoutTemplate)
        return layout(self)
Example #20
0
class Form(BaseForm):
    """The Form."""
    zope.interface.implements(interfaces.IInputForm, interfaces.IButtonForm,
                              interfaces.IHandlerForm)

    buttons = button.Buttons()

    method = FieldProperty(interfaces.IInputForm['method'])
    enctype = FieldProperty(interfaces.IInputForm['enctype'])
    acceptCharset = FieldProperty(interfaces.IInputForm['acceptCharset'])
    accept = FieldProperty(interfaces.IInputForm['accept'])

    @property
    def action(self):
        """See interfaces.IInputForm"""
        return self.request.getURL()

    @property
    def name(self):
        """See interfaces.IInputForm"""
        return self.prefix.strip('.')

    id = name

    def updateActions(self):
        self.actions = zope.component.getMultiAdapter(
            (self, self.request, self.getContent()), interfaces.IActions)
        self.actions.update()

    def update(self):
        super(Form, self).update()
        self.updateActions()
        self.actions.execute()

    def __call__(self):
        self.update()
        return self.render()
Example #21
0
class FieldsSchemaListing(SchemaListing):
    template = ViewPageTemplateFile('fields_listing.pt')

    @property
    def default_fieldset_label(self):
        return (self.context.aq_parent.default_fieldset_label
                or super(FieldsSchemaListing, self).default_fieldset_label)

    def handleModelEdit(self, action):
        self.request.response.redirect('@@modeleditor')


if HAVE_RESOURCE_EDITOR:
    but = button.Button("modeleditor", title=_(u'Edit XML Fields Model'))
    FieldsSchemaListing.buttons += button.Buttons(but)
    handler = button.Handler(but, FieldsSchemaListing.handleModelEdit)
    FieldsSchemaListing.handlers.addHandler(but, handler)


class EasyFormFieldsListingPage(SchemaListingPage):
    """ Form wrapper so we can get a form with layout.

        We define an explicit subclass rather than using the wrap_form method
        from plone.z3cform.layout so that we can inject the schema name into
        the form label.
    """
    form = FieldsSchemaListing
    index = ViewPageTemplateFile('model_listing.pt')

Example #22
0
class Wizard(form.Form):
    """Wizard form.

    The wizard is responsible for manage the steps and offers the wizard menu
    navigation and knows the step order. The wizard can check the conditions
    given from the steps. The wizard is also responsible for delegate the
    back, next and complete actions to the steps.

    This IWizard object is modelled as a Controller known from the MVC
    (Model, view, controller) patter version 2.0 and the step is implemented as
    a view.
    """

    buttons = button.Buttons(interfaces.IWizardButtons)

    # customize this part if needed
    stepInterface = interfaces.IStep

    firstStepAsDefault = True
    adjustStep = True
    confirmationPageName = None
    nextURL = None

    cssActive = 'selected'
    cssInActive = None  # None will skip class attribute in DOM element

    # for internal use
    __name__ = None
    steps = None
    step = None

    @property
    def baseURL(self):
        return absoluteURL(self, self.request)

    def setUpSteps(self):
        """Return a list of steps. This implementation uses IStep adapters.

        Take a look at the addStep method defined in step.py. This method
        allows you to setup steps directly in the method and offers an API for
        customized step setup.
        """
        steps = list(
            zope.component.getAdapters((self.context, self.request, self),
                                       self.stepInterface))
        return [nameStep(step, name) for name, step in steps]

    def filterSteps(self, steps):
        """Make sure to only select available steps and we give a name."""
        return [step for step in steps if step.available]

    def orderSteps(self, steps):
        # order steps by it's weight
        return sorted(steps, key=lambda step: step.weight)

    @property
    def steps(self):
        steps = self.setUpSteps()
        steps = self.filterSteps(steps)
        return self.orderSteps(steps)

    @property
    def completed(self):
        for step in self.steps:
            if not step.completed:
                return False
        return True

    @property
    def isFirstStep(self):
        """See interfaces.IWizard"""
        return self.step and self.step.__name__ == self.steps[0].__name__

    @property
    def isLastStep(self):
        """See interfaces.IWizard"""
        return self.step and self.step.__name__ == self.steps[-1].__name__

    @property
    def showBackButton(self):
        """Ask the step."""
        return self.step and self.step.showBackButton

    @property
    def showNextButton(self):
        """Ask the step."""
        return self.step and self.step.showNextButton

    @property
    def showCompleteButton(self):
        """Ask the step."""
        return self.step.showCompleteButton

    @property
    def previousStepName(self):
        if self.step is None:
            return
        stepNames = [step.__name__ for step in self.steps]
        idx = stepNames.index(self.step.__name__)
        if idx == 0:
            return
        return stepNames[idx - 1]

    @property
    def nextStepName(self):
        if self.step is None:
            return
        stepNames = [step.__name__ for step in self.steps]
        idx = stepNames.index(self.step.__name__)
        if idx == len(stepNames) - 1:
            return
        return stepNames[idx + 1]

    @property
    def stepMenu(self):
        items = []
        append = items.append
        lenght = len(self.steps) - 1
        for idx, step in enumerate(self.steps):
            firstStep = False
            lastStep = False
            if step.visible:
                isSelected = self.step and self.step.__name__ == step.__name__
                cssClass = isSelected and self.cssActive or self.cssInActive
                if idx == 0:
                    firstStep = True
                if idx == lenght:
                    lastStep = True
                append({
                    'name': step.__name__,
                    'title': step.label,
                    'number': str(idx + 1),
                    'url': '%s/%s' % (self.baseURL, step.__name__),
                    'selected': self.step.__name__ == step.__name__,
                    'class': cssClass,
                    'first': firstStep,
                    'last': lastStep
                })
        return items

    def getDefaultStep(self):
        """Can return the first or first not completed step as default."""
        # return first step if this option is set
        if self.firstStepAsDefault:
            return self.steps[0]
        # return first not completed step
        for step in self.steps:
            if not step.completed:
                return step
        # fallback to first step if all steps completed
        return self.steps[0]

    def doAdjustStep(self):
        # Make sure all previous steps got completed. If not, redirect to the
        # last incomplete step
        if not self.adjustStep:
            return False
        for step in self.steps:
            if step.__name__ is self.step.__name__:
                break
            if not step.completed:
                # prepare redirect to not completed step and return True
                self.nextURL = '%s/%s' % (self.baseURL, step.__name__)
                return True
        # or return False
        return False

    def updateActions(self):
        self.actions = WizardButtonActions(self, self.request, self.context)
        self.actions.update()

    def update(self):
        if self.doAdjustStep():
            return
        self.updateActions()

    def publishTraverse(self, request, name):
        """Traverse to step by it's name."""
        # Remove HTML ending
        if '.' in name:
            rawName = name.rsplit('.', 1)[0]
        else:
            rawName = name
        # Find the active step
        for step in self.steps:
            if step.__name__ == rawName:
                self.step = step
                return self.step
        raise NotFound(self, name, request)

    def browserDefault(self, request):
        """The default step is our browserDefault traversal setp."""
        if self.step is None:
            step = self.getDefaultStep()
        # always return default step as default view for our wizard
        return self, (step.__name__, )

    def goToStep(self, stepName):
        self.nextURL = '%s/%s' % (self.baseURL, stepName)

    def goToBack(self):
        # redirect to next step if previous get sucessfuly processed
        self.goToStep(self.previousStepName)

    def goToNext(self):
        # redirect to next step if previous get sucessfuly processed
        self.goToStep(self.nextStepName)

    def doBack(self, action):
        if self.step.doBack(action):
            self.goToBack()

    def doNext(self, action):
        if self.step.doNext(action):
            self.goToNext()

    def doComplete(self, action):
        if self.step.doComplete(action):
            # do finsih after step get completed is completed
            self.doFinish()

    def doFinish(self):
        """Force redirect after doComplete if confirmationPageName is given."""
        if self.confirmationPageName is not None:
            self.nextURL = '%s/%s' % (absoluteURL(
                self.context, self.request), self.confirmationPageName)

    @button.handler(interfaces.IWizardButtons['back'])
    def handleBack(self, action):
        self.doBack(action)

    @button.handler(interfaces.IWizardButtons['next'])
    def handleNext(self, action):
        self.doNext(action)

    @button.handler(interfaces.IWizardButtons['complete'])
    def handleComplete(self, action):
        self.doComplete(action)

    def render(self, *args, **kws):
        raise NotImplementedError('render is no supported')

    def __repr__(self):
        return "<%s '%s'>" % (self.__class__.__name__, self.__name__)
Example #23
0
class ActionEditView(layout.FormWrapper):
    form = ActionEditForm

    def __init__(self, context, request):
        super(ActionEditView, self).__init__(context, request)
        self.field = context.field

    @lazy_property
    def label(self):
        return _(u"Edit Action '${fieldname}'",
                 mapping={'fieldname': self.field.__name__})


if HAVE_RESOURCE_EDITOR:
    but = button.Button("modeleditor", title=_(u'Edit XML Actions Model'))
    EasyFormActionsListing.buttons += button.Buttons(but)
    handler = button.Handler(but, EasyFormActionsListing.handleModelEdit)
    EasyFormActionsListing.handlers.addHandler(but, handler)


class ModelEditorView(BrowserView):
    """ editor view """
    title = _(u'Edit XML Actions Model')

    def modelSource(self):
        return self.context.aq_parent.actions_model


class AjaxSaveHandler(AjaxSaveHandler):
    """ handle AJAX save posts """
    def save(self, source):
Example #24
0
class Add(add.DefaultAddForm):
    """
    Add Experiment
    """

    template = ViewPageTemplateFile("experiment_add.pt")

    extends(view.DefaultView, ignoreButtons=True)

    buttons = button.Buttons(add.DefaultAddForm.buttons['cancel'])

    @button.buttonAndHandler(_('Create and start'), name='save')
    def handleAdd(self, action):
        data, errors = self.extractData()
        self.validateAction(data)
        if errors:
            self.status = self.formErrorsMessage
            return
        # TODO: this is prob. a bug in base form, because createAndAdd
        #       does not return the wrapped object.
        obj = self.createAndAdd(data)
        if obj is None:
            # TODO: this is probably an error here?
            #       object creation/add failed for some reason
            return
        # get wrapped instance fo new object (see above)
        obj = self.context[obj.id]
        # mark only as finished if we get the new object
        self._finishedAdd = True
        IStatusMessage(self.request).addStatusMessage(_(u"Item created"),
                                                      "info")
        # auto start job here
        jt = IExperimentJobTracker(obj)
        msgtype, msg = jt.start_job(self.request)
        if msgtype is not None:
            IStatusMessage(self.request).add(msg, type=msgtype)

    @button.buttonAndHandler(_('Create'), name='create')
    def handleCreate(self, action):
        data, errors = self.extractData()
        self.validateAction(data)
        if errors:
            self.status = self.formErrorsMessage
            return
        # TODO: this is prob. a bug in base form, because createAndAdd
        #       does not return the wrapped object.
        obj = self.createAndAdd(data)
        if obj is None:
            # TODO: this is probably an error here?
            #       object creation/add failed for some reason
            return
        # get wrapped instance fo new object (see above)
        obj = self.context[obj.id]
        # mark only as finished if we get the new object
        self._finishedAdd = True
        IStatusMessage(self.request).addStatusMessage(_(u"Item created"),
                                                      "info")

    def updateWidgets(self):
        super(Add, self).updateWidgets()

        # Pre-fill widget fields with field values from the specified SDM.
        uuid = self.request.get('uuid')
        if uuid:
            expobj = uuidToObject(uuid)
            self.widgets["IDublinCore.title"].value = expobj.title
            self.widgets["IDublinCore.description"].value = expobj.description
            for name in self.widgets.keys():
                if name not in [
                        "IDublinCore.title", "IDublinCore.description"
                ]:
                    conv = getMultiAdapter(
                        (self.fields[name].field, self.widgets[name]),
                        IDataConverter)
                    self.widgets[name].value = conv.toWidgetValue(
                        getattr(expobj, name))
Example #25
0
 def update(self):
     self.form.buttons = button.Buttons(
         self.form.buttons, button.Button('cancel', _(u'Cancel')))
     super(CancelActions, self).update()
Example #26
0
class ControlPanelEditForm(controlpanel.RegistryEditForm):
    schema = IFeedSettings
    fields = field.Fields(IControlPanel)

    label = _(u"MailChimp settings")
    description = _(u"Please configure an API-key and define one or more "
                    u"feeds.")

    fields['urls'].mode = "display"
    fields['urls'].widgetFactory = UrlsWidget.factory

    fields['lists'].mode = "display"
    fields['lists'].widgetFactory = UrlsWidget.factory

    if textlines is not None:
        fields['feeds'].widgetFactory = textlines.TextLinesFieldWidget

    buttons = button.Buttons()
    buttons += controlpanel.RegistryEditForm.buttons
    handlers = controlpanel.RegistryEditForm.handlers.copy()

    def updateActions(self):
        # This prevents a redirect to the main control panel page
        self.request.response.setStatus(200, lock=True)

        super(ControlPanelEditForm, self).updateActions()

    def render(self):
        if switch_on is not None:
            switch_on(self)

        urls = self.widgets['urls']
        urls.update()

        if not urls.value:
            del self.widgets['urls']

        return super(ControlPanelEditForm, self).render()

    def getContent(self):
        content = super(ControlPanelEditForm, self).getContent()
        return ImplicitAcquisitionWrapper(content, self.context)

    @button.buttonAndHandler(_(u"Repair"), name='repair')
    def handleRepair(self, action):
        data, errors = self.extractData()
        if errors:
            self.status = self.formErrorsMessage
            return

        query = Indexed('chimpfeeds')
        brains = self.context.portal_catalog.evalAdvancedQuery(query)

        context = self.getContent()
        vocabulary = feeds_factory(context)
        all_feeds = set(term.value for term in vocabulary)

        count = 0
        bad = set()

        changed = []
        for i, brain in enumerate(brains):
            try:
                feeds = set(brain.chimpfeeds)
            except TypeError:
                continue

            missing = feeds - all_feeds
            bad |= missing

            if missing:
                count += 1
                obj = brain.getObject()
                try:
                    field = obj.getField('feeds')
                except AttributeError:
                    feeds = obj.feeds
                    field = None
                else:
                    feeds = set(field.get(obj))

                fixed = feeds - missing

                if field is None:
                    obj.feeds = fixed
                else:
                    field.set(obj, fixed)

                changed.append(obj)

        for obj in changed:
            modified(obj)
            obj.reindexObject()

        logger.info("Repair complete; %d items updated." % count)
        if bad:
            logger.info("Feeds removed: %s." %
                        (", ".join(bad).encode('utf-8')))

        IStatusMessage(self.request).addStatusMessage(
            _(u"Repaired ${count} items.", mapping={'count': count}), "info")
Example #27
0
 def update(self):
     self.buttons = button.Buttons(
         self.buttons, button.Button('catalogupdate', _(u'Catalog Update')),
         button.Button('reindex', _(u'Catalog Reindex')),
         button.Button('unindex', _(u'Catalog Unindex')))
     super(SQLTypeOverviewForm, self).update()
Example #28
0
    HAVE_RESOURCE_EDITOR = True
except ImportError:
    HAVE_RESOURCE_EDITOR = False

# We want to add a Plone-specific feature to the SchemaListing
# form from plone.schemaeditor. We'll do this by subclassing, then
# adding the plone-specific button for the ace model editor.


class EnhancedSchemaListing(SchemaListing):
    def handleModelEdit(self, action):
        self.request.response.redirect('@@modeleditor')


if HAVE_RESOURCE_EDITOR:
    but = button.Button("modeleditor", title=u'Edit XML Field Model')
    EnhancedSchemaListing.buttons += button.Buttons(but)
    handler = button.Handler(but, EnhancedSchemaListing.handleModelEdit)
    EnhancedSchemaListing.handlers.addHandler(but, handler)


class TypeFieldsPage(TypeFormLayout):
    label = _(u'Fields')

    @property
    def form(self):
        if self.context.fti.hasDynamicSchema:
            return EnhancedSchemaListing
        else:
            return ReadOnlySchemaListing
Example #29
0
 def update(self):
     self.buttons = button.Buttons()
     super(SQLViewForm, self).update()
Example #30
0
class FlourishSelectedPeriodsAddTermsView(FlourishSelectedPeriodsAddView):
    fields = field.Fields(ISelectedPeriodsAddTermsForm)

    _objects_added = None
    _objects_created = None

    buttons = button.Buttons(
        button.Button('add', title=_('Add')),
        button.Button('cancel', title=_('Cancel')))

    @property
    def owner(self):
        return IHaveSchedule(self.context)

    @button.handler(buttons["add"])
    def handleAdd(self, action):
        return form.AddForm.handleAdd.func(self, action)

    @button.handler(buttons["cancel"])
    def handleCancel(self, action):
        url = absoluteURL(self.context, self.request)
        self.request.response.redirect(url)

    def updateActions(self):
        super(SelectedPeriodsAddView, self).updateActions()
        self.actions['add'].addClass('button-ok')
        self.actions['cancel'].addClass('button-cancel')

    def create(self, data):
        section = self.owner
        linked = section.linked_sections
        terms = [(ITerm(s), s) for s in linked]
        terms = [(term, section) for term, section in terms
                 if (term.first >= data['first'].first and
                     term.last <= data['last'].last)]
        self._objects_created = []
        timetable = data['timetable']
        for term, section in terms:
            schedule = SelectedPeriodsSchedule(
                timetable, term.first, term.last,
                title=timetable.title,
                timezone=timetable.timezone)
            self._objects_created.append((section, schedule))
        return self._objects_created

    def add(self, schedules):
        self._objects_added = []
        for section, schedule in self._objects_created:
            schedules = IScheduleContainer(section)
            chooser = INameChooser(schedules)
            name = chooser.chooseName('', schedule)
            schedules[name] = schedule
            self._objects_added.append(schedule)

    def nextURL(self):
        if self._objects_added:
            int_ids = getUtility(IIntIds)
            also_apply = ''
            this_section = self.owner
            n = 0
            for schedule in self._objects_added:
                section = IHaveSchedule(schedule)
                if sameProxiedObjects(this_section, section):
                    continue
                also_apply = '&'.join(
                    [also_apply,
                    'section-%d=%s&schedule-%d=%s' % (
                        n, int_ids.getId(removeSecurityProxy(section)),
                        n, urllib.quote(schedule.__name__)),
                     ])
                n += 1
            if also_apply:
                also_apply = '?' + also_apply
            return '%s/edit_multi.html%s' % (
                absoluteURL(self._objects_added[0], self.request),
                also_apply)
        return absoluteURL(self.context, self.request)