class ManageTriggerSchema(Interface):
    '''Define schema for manage IFTTT Trigger form'''

    forms.widget('ifttt_triggers', CheckBoxFieldWidget)
    ifttt_triggers = schema.Tuple(
        title=_(u'IFTTT Triggers'),
        description=_(u'Select certain IFTTT Triggers to delete'),
        required=False,
        missing_value=None,
        default=(),
        value_type=schema.Choice(source=availableTriggers)
    )
    def handleApply(self, action):
        data, errors = self.extractData()
        if errors:
            self.status = self.formErrorsMessage
            return

        try:
            # delete the requested triggers

            rules = data.get('ifttt_triggers')
            storage = getUtility(IRuleStorage)
            for rule in rules:
                del storage[rule.id.split('+')[-1]]

            # Redirect back to the front page with a status message

            api.portal.show_message(
                message=_(
                    u'Successfully applied changes',
                ),
                request=getRequest(),
                type='info'
            )

        except Exception as er:

            logger.exception(
                u'Unexpected exception: {0:s}'.format(er),
            )  # noqa

            # Redirect back to the front page with a status message

            api.portal.show_message(
                message=_(u'Error'), request=getRequest(), type='info'
            )

        finally:

            contextURL = self.context.absolute_url()
            self.request.response.redirect(contextURL)
class ManageTrigger(AutoExtensibleForm, form.Form):
    '''
    Define Form
    '''

    schema = ManageTriggerSchema
    ignoreContext = True
    form_name = 'manage_trigger'

    label = _(u'Manage IFTTT Triggers')
    description = _(u'IFTTT triggers that are set on folder')

    def update(self):
        # disable Plone's editable border
        self.request.set('disable_border', True)

        # call the base class version - this is very important!
        super(ManageTrigger, self).update()

    @button.buttonAndHandler(_(u'Delete'))
    def handleApply(self, action):
        data, errors = self.extractData()
        if errors:
            self.status = self.formErrorsMessage
            return

        try:
            # delete the requested triggers

            rules = data.get('ifttt_triggers')
            storage = getUtility(IRuleStorage)
            for rule in rules:
                del storage[rule.id.split('+')[-1]]

            # Redirect back to the front page with a status message

            api.portal.show_message(
                message=_(
                    u'Successfully applied changes',
                ),
                request=getRequest(),
                type='info'
            )

        except Exception as er:

            logger.exception(
                u'Unexpected exception: {0:s}'.format(er),
            )  # noqa

            # Redirect back to the front page with a status message

            api.portal.show_message(
                message=_(u'Error'), request=getRequest(), type='info'
            )

        finally:

            contextURL = self.context.absolute_url()
            self.request.response.redirect(contextURL)

    @button.buttonAndHandler(_(u'Cancel'))
    def handleCancel(self, action):
        """User cancelled. Redirect back to the front page.
        """
        contextURL = self.context.absolute_url()
        self.request.response.redirect(contextURL)