From 474230d4143dcfaf0bea8fd261ae8eaa8f04a69a Mon Sep 17 00:00:00 2001 From: Anusha Ramineni Date: Mon, 15 May 2017 11:42:48 +0530 Subject: [PATCH] Add support to enter rule in policy language This commit is to adds support in congress-ui to enter the rule directly in policy language. And also, renames the existing name 'Create Rule' to 'Construct Rule'. Implements blueprint enhance-congress-dashboard Change-Id: I99a88d9c98b507d53163dcdb4f0e25d6ab088e69 --- congress_dashboard/policies/rules/forms.py | 67 +++++++++++++++++++ congress_dashboard/policies/rules/tables.py | 17 ++++- congress_dashboard/policies/rules/views.py | 22 ++++++ .../templates/policies/rules/_create_raw.html | 26 +++++++ .../templates/policies/rules/create_raw.html | 11 +++ congress_dashboard/policies/urls.py | 2 + .../notes/enter-rule-4a986d74911bfbec.yaml | 5 ++ 7 files changed, 148 insertions(+), 2 deletions(-) create mode 100644 congress_dashboard/policies/rules/forms.py create mode 100644 congress_dashboard/policies/templates/policies/rules/_create_raw.html create mode 100644 congress_dashboard/policies/templates/policies/rules/create_raw.html create mode 100644 releasenotes/notes/enter-rule-4a986d74911bfbec.yaml diff --git a/congress_dashboard/policies/rules/forms.py b/congress_dashboard/policies/rules/forms.py new file mode 100644 index 0000000..1136ada --- /dev/null +++ b/congress_dashboard/policies/rules/forms.py @@ -0,0 +1,67 @@ +# Copyright 2017 NEC, Corp +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +import logging + +from django.core.urlresolvers import reverse +from django.utils.translation import ugettext_lazy as _ +from horizon import exceptions +from horizon import forms +from horizon import messages + +from congress_dashboard.api import congress + +LOG = logging.getLogger(__name__) + + +class CreateRawRule(forms.SelfHandlingForm): + rule = forms.CharField(label=_("Rule"), required=True, + widget=forms.Textarea(attrs={'rows': 5})) + rule_name = forms.CharField(max_length=255, label=_("Rule Name"), + required=False) + comment = forms.CharField(max_length=255, label=_("Description"), + required=False) + failure_url = 'horizon:admin:policies:detail' + + def __init__(self, request, *args, **kwargs): + super(CreateRawRule, self).__init__(request, *args, **kwargs) + initial = kwargs.get('initial', {}) + policy_name = initial.get('policy_name') + self.fields['policy_name'] = forms.CharField(widget=forms.HiddenInput, + initial=policy_name) + + def handle(self, request, data): + rule_name = data['rule_name'] + comment = data['comment'] + rule = data['rule'] + policy_name = data['policy_name'] + try: + params = { + 'name': rule_name, + 'comment': comment, + 'rule': rule, + } + + rule = congress.policy_rule_create(request, policy_name, + body=params) + msg = _("Rule created with id %s") % rule['id'] + LOG.info(msg) + messages.success(request, msg) + return rule + except Exception as e: + msg = _('Error creating rule : %s') % str(e) + LOG.error(msg) + messages.error(self.request, msg) + redirect = reverse(self.failure_url, args=(policy_name,)) + raise exceptions.Http302(redirect) diff --git a/congress_dashboard/policies/rules/tables.py b/congress_dashboard/policies/rules/tables.py index ebae2bd..ae594f8 100644 --- a/congress_dashboard/policies/rules/tables.py +++ b/congress_dashboard/policies/rules/tables.py @@ -31,7 +31,7 @@ LOG = logging.getLogger(__name__) class CreateRule(tables.LinkAction): name = 'create_rule' - verbose_name = _('Create Rule') + verbose_name = _('Construct Rule') url = 'horizon:admin:policies:create_rule' classes = ('ajax-modal',) icon = 'plus' @@ -42,6 +42,19 @@ class CreateRule(tables.LinkAction): return reverse(self.url, args=(policy_name,)) +class CreateRawRule(tables.LinkAction): + name = 'create_raw_rule' + verbose_name = _('Enter Rule') + url = 'horizon:admin:policies:create_raw_rule' + classes = ('ajax-modal',) + icon = 'plus' + policy_rules = (('policy', 'create_raw_rule'),) + + def get_link_url(self, datum=None): + policy_name = self.table.kwargs['policy_name'] + return reverse(self.url, args=(policy_name,)) + + class DeleteRule(policy.PolicyTargetMixin, tables.DeleteAction): @staticmethod def action_present(count): @@ -107,7 +120,7 @@ class PolicyRulesTable(tables.DataTable): class Meta(object): name = "policy_rules" verbose_name = _("Rules") - table_actions = (CreateRule, DeleteRule,) + table_actions = (CreateRule, CreateRawRule, DeleteRule,) row_actions = (DeleteRule,) hidden_title = False diff --git a/congress_dashboard/policies/rules/views.py b/congress_dashboard/policies/rules/views.py index f3be6d2..04ee011 100644 --- a/congress_dashboard/policies/rules/views.py +++ b/congress_dashboard/policies/rules/views.py @@ -13,8 +13,10 @@ # under the License. from django.core.urlresolvers import reverse +from horizon import forms from horizon import workflows +from congress_dashboard.policies.rules import forms as rule_forms from congress_dashboard.policies.rules import workflows as rule_workflows @@ -29,3 +31,23 @@ class CreateView(workflows.WorkflowView): def get_initial(self): return {'policy_name': self.kwargs['policy_name']} + + +class CreateRawView(forms.ModalFormView): + form_class = rule_forms.CreateRawRule + template_name = 'admin/policies/rules/create_raw.html' + success_url = 'horizon:admin:policies:detail' + + def get_context_data(self, **kwargs): + context = super(CreateRawView, self).get_context_data(**kwargs) + context["policy_name"] = self.kwargs['policy_name'] + return context + + def get_initial(self): + initial = super(CreateRawView, self).get_initial() + initial.update({'policy_name': self.kwargs['policy_name']}) + return initial + + def get_success_url(self): + return reverse(self.success_url, + args=(self.kwargs['policy_name'],)) diff --git a/congress_dashboard/policies/templates/policies/rules/_create_raw.html b/congress_dashboard/policies/templates/policies/rules/_create_raw.html new file mode 100644 index 0000000..ae8f306 --- /dev/null +++ b/congress_dashboard/policies/templates/policies/rules/_create_raw.html @@ -0,0 +1,26 @@ +{% extends "horizon/common/_modal_form.html" %} +{% load i18n %} +{% load url from future %} + +{% block form_id %}create_raw_rule_form{% endblock %} +{% block form_action %}{% url 'horizon:admin:policies:create_raw_rule' policy_name %}{% endblock %} + +{% block modal_id %}create_raw_rule_modal{% endblock %} +{% block modal-header %}{% trans "Enter Rule" %}{% endblock %} + +{% block modal-body %} +
+
+ {% include "horizon/common/_form_fields.html" %} +
+
+
+

{% trans "Enter rule in policy rule language."%}

+

{% trans "For Example: " %}

+

{% trans "flavors_in_use(flavor_id, flavor_name) :- nova:flavors(id=flavor_id, name=flavor_name), nova:servers(flavor_id=flavor_id)."%}

+
+{% endblock %} +{% block modal-footer %} + + {% trans "Cancel" %} +{% endblock %} diff --git a/congress_dashboard/policies/templates/policies/rules/create_raw.html b/congress_dashboard/policies/templates/policies/rules/create_raw.html new file mode 100644 index 0000000..9326d62 --- /dev/null +++ b/congress_dashboard/policies/templates/policies/rules/create_raw.html @@ -0,0 +1,11 @@ +{% extends 'base.html' %} +{% load i18n %} +{% block title %}{% trans "Enter Rule" %}{% endblock %} + +{% block page_header %} + {% include "horizon/common/_page_header.html" with title=_("Enter Rule") %} +{% endblock page_header %} + +{% block main %} + {% include "admin/policies/rules/_create_raw.html" %} +{% endblock %} diff --git a/congress_dashboard/policies/urls.py b/congress_dashboard/policies/urls.py index 0a7403d..65d5ad5 100644 --- a/congress_dashboard/policies/urls.py +++ b/congress_dashboard/policies/urls.py @@ -29,6 +29,8 @@ urlpatterns = [ url(POLICY % 'detail', views.DetailView.as_view(), name='detail'), url(POLICYTABLE % 'detail', data_views.DetailView.as_view(), name='policy_table_detail'), + url(POLICY % 'rules/create_raw', + rule_views.CreateRawView.as_view(), name='create_raw_rule'), url(POLICY % 'rules/create', rule_views.CreateView.as_view(), name='create_rule'), ] diff --git a/releasenotes/notes/enter-rule-4a986d74911bfbec.yaml b/releasenotes/notes/enter-rule-4a986d74911bfbec.yaml new file mode 100644 index 0000000..1b8b7a1 --- /dev/null +++ b/releasenotes/notes/enter-rule-4a986d74911bfbec.yaml @@ -0,0 +1,5 @@ +--- +features: + - Added support to enter rules in policy language directlt using + congress_dashboard if the user doesn't need navigation support to create + rules.