Skip to content

Commit

Permalink
Merge ed0dd02 into b3dba13
Browse files Browse the repository at this point in the history
  • Loading branch information
Shriyanshagro committed Jul 1, 2018
2 parents b3dba13 + ed0dd02 commit 8b8ffdf
Show file tree
Hide file tree
Showing 4 changed files with 172 additions and 9 deletions.
175 changes: 169 additions & 6 deletions src/collective/ifttt/browser/ifttt_trigger.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,28 @@
# -*- coding: utf-8 -*-

from Acquisition import aq_parent
from collective.ifttt import _
from collective.ifttt.actions.ifttt import PAYLOAD_DESCRIPTION
from plone import api
from plone.app.contentrules import api as rules_api
from plone.autoform.form import AutoExtensibleForm
from plone.contentrules.engine.interfaces import IRuleStorage
from plone.contentrules.rule.interfaces import IRuleAction
from plone.contentrules.rule.interfaces import IRuleCondition
from Products.CMFCore.interfaces._events import IActionSucceededEvent
from z3c.form import button
from z3c.form import form
from zope import schema
from zope.component import getMultiAdapter
from zope.component import getUtility
from zope.globalrequest import getRequest
from zope.interface import Interface

import logging


logger = logging.getLogger('collective.ifttt')


class AddRuleSchema(Interface):
'''
Expand All @@ -24,9 +38,10 @@ class AddRuleSchema(Interface):
)

content_types = schema.Tuple(
title=_(u'Restrict Content Types'),
title=_(u'Content Types'),
description=_(
u'Select certain content types which should be restricted'
u'Select certain content types which should be restricted '
u'to this event'
),
required=False,
missing_value=None,
Expand All @@ -37,9 +52,10 @@ class AddRuleSchema(Interface):
)

workflow_transitions = schema.Tuple(
title=_(u'Restrict Workflow Transitions'),
title=_(u'Workflow Transitions'),
description=_(
u'Select certain workflow transitions which should be restricted'
u' to this event'
),
required=False,
missing_value=None,
Expand Down Expand Up @@ -79,6 +95,12 @@ def handleApply(self, action):
try:
# all the backend magic goes here

self.add_rule(data)

self.configure_rule(data)

self.apply_rule()

# Redirect back to the front page with a status message

api.portal.show_message(
Expand All @@ -94,7 +116,11 @@ def handleApply(self, action):
type='info'
)

except TypeError:
except Exception as er:

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

# Redirect back to the front page with a status message

Expand All @@ -104,12 +130,149 @@ def handleApply(self, action):
type='info'
)

contextURL = self.context.absolute_url()
self.request.response.redirect(contextURL)
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)

def add_rule(self, data):
'''
Create new rule
require data related to field values to create new rule
'''

# REDFINE ME
rule_name = _(
u'${title}_Trigger_${ifttt_event_name}',
mapping=dict(
ifttt_event_name=data['ifttt_event_name'],
title=self.context.Title().decode('utf-8', 'ignore'),
)
)

rule_description = _(
u'This rule is created to trigger ${ifttt_event_name} '
u'on ${title} folder',
mapping=dict(
ifttt_event_name=data['ifttt_event_name'],
title=self.context.Title().decode('utf-8', 'ignore'),
)
)

# HACK
adding = self.context.restrictedTraverse('/Plone/+rule')

addview = getMultiAdapter((adding, self.request),
name='plone.ContentRule')
addview.form_instance.update()
content = addview.form_instance.create({
'title': rule_name,
'description': rule_description,
'enabled': True,
'stop': False,
'cascading': False,
'event': IActionSucceededEvent
}) # noqa
addview.form_instance.add(content)

def delete_rule(self):
'''
Delete rule
'''

# rule_id = self.request['rule-id']
# storage = getUtility(IRuleStorage)
# del storage[rule_id]
# return 'ok'

def configure_rule(self, data):
'''
Add trigger and action conditions to newly created content rule
'''

storage = getUtility(IRuleStorage)

# find the rule_id of newly created rule
# HACK, last created rule is the required rule
self.rule_id = storage.values()[-1].id

# traverse to configuration page of content rule
rule_url = '/Plone/' + self.rule_id
rule = self.context.restrictedTraverse(rule_url)

# add conditions to rule
self.add_condition(data, rule)

# add actions to rule
self.add_action(data, rule)

def add_condition(self, data, rule):
'''
Add condition to rule
'''

# add content_types conditions
element = getUtility(
IRuleCondition, name='plone.conditions.PortalType'
)
adding = getMultiAdapter((rule, self.request), name='+condition')
addview = getMultiAdapter((adding, self.request), name=element.addview)

for i in data['content_types']:
addview.form_instance.update()
content = addview.form_instance.create(data={'check_types': [i]})
addview.form_instance.add(content)

# add workflow_transitions conditions
element = getUtility(
IRuleCondition, name='plone.conditions.WorkflowTransition'
)
adding = getMultiAdapter((rule, self.request), name='+condition')
addview = getMultiAdapter((adding, self.request), name=element.addview)

for i in data['workflow_transitions']:
addview.form_instance.update()
content = addview.form_instance.create(
data={'wf_transitions': [i]}
)
addview.form_instance.add(content)

def add_action(self, data, rule):
'''
Add actions to rule
'''

element = getUtility(IRuleAction, name='plone.actions.Ifttt')
adding = getMultiAdapter((rule, self.request), name='+action')
addview = getMultiAdapter((adding, self.request), name=element.addview)

addview.form_instance.update()
content = addview.form_instance.create(
data={
'ifttt_event_name': data['ifttt_event_name'],
'payload_option': PAYLOAD_DESCRIPTION
}
)
addview.form_instance.add(content)

def apply_rule(self):
'Apply content rule to requested folder'

self.true_rule_id = self.rule_id.split('+')[-1]

# sometimes self.context is a collection so,
# we need to traverse to it's parent folder
context = self.context
allowed_portal_type = ['Folder', 'Plone Site']
while context.portal_type not in allowed_portal_type:
context = aq_parent(self.context)

# 'form.button.AddAssignment'
rules_api.assign_rule(context, self.true_rule_id)
2 changes: 1 addition & 1 deletion src/collective/ifttt/profiles/default/actions.xml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<?xml version="1.0"?>
<object name="portal_actions" meta_type="Plone Actions Tool"
xmlns:i18n="http://xml.zope.org/namespaces/i18n">
<object name="object" meta_type="CMF Action Category">
<object name="object_buttons" meta_type="CMF Action Category">
<object name="Add IFTTT Content Trigger" meta_type="CMF Action" i18n:domain="collective.ifttt">
<property name="title" i18n:translate="">Add IFTTT Content Trigger</property>
<property name="description" i18n:translate="">Add new IFTTT Content Trigger</property>
Expand Down
2 changes: 1 addition & 1 deletion src/collective/ifttt/profiles/default/metadata.xml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<metadata>
<version>1004</version>
<version>1005</version>
<dependencies>
<!--<dependency>profile-plone.app.dexterity:default</dependency></dependencies>-->
</dependencies>
Expand Down
2 changes: 1 addition & 1 deletion src/collective/ifttt/upgrades.zcml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

<genericsetup:upgradeStep
source="*"
destination="1004"
destination="1005"
title="Reload GS profiles"
description=""
profile="collective.ifttt:default"
Expand Down

0 comments on commit 8b8ffdf

Please sign in to comment.