mangroveorg/datawinners

View on GitHub
datawinners/blue/rules/bind_rule.py

Summary

Maintainability
C
1 day
Test Coverage
import abc
import re

from mangrove.form_model.xform import add_attrib, remove_attrib, replace_node_name_with_xpath

from datawinners.blue.rules.rule import Rule


class EditBindRule(Rule):
    __metaclass__ = abc.ABCMeta

    def update_submission(self, submission):
        pass

    def remove(self, parent_node, node, xform, old_field, activity_log_detail):
        pass


class EditConstraintMessageRule(EditBindRule):

    def edit(self, node, old_field, new_field, old_xform, new_xform, activity_log_detail):
        bind_node = old_xform.bind_node(node)

        if bind_node is not None and new_field.constraint_message != old_field.constraint_message:
            if new_field.constraint_message:
                add_attrib(bind_node, 'constraintMsg', new_field.constraint_message)
            else:
                remove_attrib(bind_node, 'constraintMsg')
            activity_log_detail["constraint_message_changed"] = [old_field.label] if activity_log_detail.get("constraint_message_changed") is None \
                else activity_log_detail.get("constraint_message_changed") + [old_field.label]


class EditConstraintRule(EditBindRule):

    def edit(self, node, old_field, new_field, old_xform, new_xform, activity_log_detail):
        bind_node = old_xform.bind_node(node)

        if bind_node is not None and new_field.xform_constraint != old_field.xform_constraint:
            xform_constraint = new_field.xform_constraint
            if xform_constraint:
                if "${" in xform_constraint:
                    xform_constraint = replace_node_name_with_xpath(xform_constraint, old_xform)
                add_attrib(bind_node, 'constraint', xform_constraint)
            else:
                remove_attrib(bind_node, 'constraint')
            activity_log_detail["constraint_changed"] = [old_field.label] if activity_log_detail.get("constraint_changed") is None \
                else activity_log_detail.get("constraint_changed") + [old_field.label]


class EditRequiredRule(EditBindRule):

    def edit(self, node, old_field, new_field, old_xform, new_xform, activity_log_detail):
        bind_node = old_xform.bind_node(node)

        if bind_node is not None:
            if new_field.is_required() and not old_field.is_required():
                add_attrib(bind_node, 'required', 'true()')
                activity_log_detail["required_changed"] = [old_field.label] if activity_log_detail.get("required_changed") is None \
                    else activity_log_detail.get("required_changed") + [old_field.label]
            elif not new_field.is_required() and old_field.is_required():
                remove_attrib(bind_node, 'required')
                activity_log_detail["required_changed"] = [old_field.label] if activity_log_detail.get("required_changed") is None \
                    else activity_log_detail.get("required_changed") + [old_field.label]


class EditRelevantRule(EditBindRule):

    def edit(self, node, old_field, new_field, old_xform, new_xform, activity_log_detail):
        bind_node = old_xform.bind_node(node)

        if bind_node is not None and new_field.relevant != old_field.relevant:
            if new_field.relevant:
                relevant = replace_node_name_with_xpath(new_field.relevant, old_xform)
                add_attrib(bind_node, 'relevant', relevant)
            else:
                remove_attrib(bind_node, 'relevant')
            activity_log_detail["relevant_changed"] = [old_field.label] if activity_log_detail.get("relevant_changed") is None \
                else activity_log_detail.get("relevant_changed") + [old_field.label]