def test_update_preload_case(self):
     self.form.requires = 'case'
     self.form.actions.update_case = UpdateCaseAction(
         update={'question1': '/data/question1'})
     self.form.actions.update_case.condition.type = 'always'
     self.form.actions.case_preload = PreloadAction(
         preload={'/data/question1': 'question1'})
     self.form.actions.case_preload.condition.type = 'always'
     check_xml_line_by_line(self, self.get_xml('update_preload_case'),
                            self.form.render_xform())
 def test_update_parent_case(self):
     self.form.requires = 'case'
     self.form.actions.update_case = UpdateCaseAction(
         update={
             'question1': '/data/question1',
             'parent/question1': '/data/question1',
         })
     self.form.actions.update_case.condition.type = 'always'
     self.assertXmlEqual(self.get_xml('update_parent_case'),
                         self.form.render_xform())
Exemple #3
0
 def form_uses_usercase(form, update=None, preload=None):
     if form.form_type == 'module_form':
         if update:
             form.actions.usercase_update = UpdateCaseAction(update=update)
             form.actions.usercase_update.condition.type = 'always'
         if preload:
             form.actions.usercase_preload = PreloadAction(preload=preload)
             form.actions.usercase_preload.condition.type = 'always'
     else:
         AppFactory.advanced_form_autoloads(form, AUTO_SELECT_USERCASE, None)
Exemple #4
0
def new_form(request, domain, app_id, module_unique_id):
    """
    Adds a form to an app (under a module)
    """
    app = get_app(domain, app_id)

    try:
        module = app.get_module_by_unique_id(module_unique_id)
    except ModuleNotFoundException:
        raise HttpResponseBadRequest

    lang = request.COOKIES.get('lang', app.langs[0])
    form_type = request.POST.get('form_type', 'form')
    case_action = request.POST.get('case_action', 'none')
    name = _("Register") if case_action == 'open' else (
        _("Followup") if case_action == 'update' else "Survey")

    if form_type == "shadow":
        if module.module_type == "advanced":
            form = module.new_shadow_form(name, lang)
        else:
            raise Exception(
                "Shadow forms may only be created under shadow modules")
    else:
        form = module.new_form(name, lang)

    if form_type != "shadow":
        if case_action == 'update':
            form.requires = 'case'
            form.actions.update_case = UpdateCaseAction(
                condition=FormActionCondition(type='always'))
        elif case_action == 'open':
            form.actions.open_case = OpenCaseAction(
                condition=FormActionCondition(type='always'))
            form.actions.update_case = UpdateCaseAction(
                condition=FormActionCondition(type='always'))

    app.save()
    return back_to_main(request,
                        domain,
                        app_id=app.id,
                        module_unique_id=module.unique_id,
                        form_unique_id=form.unique_id)
Exemple #5
0
 def add_reg_form_to_module(module_):
     reg_form = module_.new_form('Register Subject', None)
     reg_form.get_unique_id()
     reg_form.source = self.get_subject_form_source('Register Subject')
     reg_form.actions.open_case = OpenCaseAction(
         name_path='/data/' + CC_SUBJECT_KEY,
         external_id=None,
         condition=FormActionCondition(type='always'))
     reg_form.actions.update_case = UpdateCaseAction(
         update=self.case_update,
         condition=FormActionCondition(type='always'))
Exemple #6
0
 def add_edit_form_to_module(module_):
     edit_form = module_.new_form('Edit Subject', None)
     edit_form.get_unique_id()
     edit_form.source = self.get_subject_form_source('Edit Subject')
     edit_form.requires = 'case'
     update = dict(self.case_update, name='/data/' + CC_SUBJECT_KEY)
     preload = {v: k for k, v in update.items()}
     edit_form.actions.case_preload = PreloadAction(
         preload=preload, condition=FormActionCondition(type='always'))
     edit_form.actions.update_case = UpdateCaseAction(
         update=update, condition=FormActionCondition(type='always'))
 def test_update_attachment(self):
     self.form.requires = 'case'
     self.form.source = self.get_xml('attachment').decode('utf-8')
     self.form.actions.update_case = UpdateCaseAction(
         update={
             'photo': ConditionalCaseUpdate(
                 question_path='/data/thepicture')
         })
     self.form.actions.update_case.condition.type = 'always'
     self.assertXmlEqual(self.get_xml('update_attachment_case'),
                         self.form.render_xform())
 def test_update_case(self):
     """Case updates are not permitted"""
     self.form.requires = 'case'
     self.form.actions.update_case = UpdateCaseAction(
         update={
             'question1': ConditionalCaseUpdate(
                 question_path='/data/question1')
         })
     self.form.actions.update_case.condition.type = 'always'
     self.assertXmlEqual(self.get_xml('no_actions'),
                         self.form.render_xform())
Exemple #9
0
 def test_ext_case_update_host_case(self):
     """
     A extension case should be able to save host case properties
     """
     self.freshwater_form.requires = 'case'
     self.freshwater_form.actions.update_case = UpdateCaseAction(update={
         'question1': '/data/question1',
         'host/question1': '/data/question1',
     })
     self.freshwater_form.actions.update_case.condition.type = 'always'
     self.assertXmlEqual(self.get_xml('update_host_case'), self.freshwater_form.render_xform())
Exemple #10
0
    def test_child_module_adjusted_datums_basic_module(self):
        """
        Testing that the session variable name for the case_id is correct since
        it will have been adjusted in the suite.xml to match the variable name
        in the root module.
        """
        module = self.app.add_module(Module.new_module('New Module',
                                                       lang='en'))
        module.case_type = 'guppy'
        form = module.new_form(
            "Untitled Form", "en",
            self.get_xml('original_form',
                         override_path=('data', )).decode('utf-8'))

        form.requires = 'case'
        form.actions.update_case = UpdateCaseAction(
            update={'question1': '/data/question1'})
        form.actions.update_case.condition.type = 'always'

        root_module = self.app.add_module(
            Module.new_module('root module', None))
        root_module.unique_id = 'm_root'
        root_module.case_type = 'test_case_type'

        root_module_form = root_module.new_form('root module form', None)
        root_module_form.requires = 'case'
        root_module_form.actions.update_case = UpdateCaseAction(
            update={'question1': '/data/question1'})
        root_module_form.actions.update_case.condition.type = 'always'

        # make module a child module of root_module
        module.root_module_id = root_module.unique_id

        module.parent_select.active = True
        module.parent_select.module_id = root_module.unique_id

        self.assertXmlEqual(
            self.get_xml('child_module_adjusted_case_id_basic'),
            form.render_xform())
Exemple #11
0
    def test_usercase_id_added_update(self):
        app = Application.new_app('domain', "Untitled Application")

        child_module = app.add_module(Module.new_module("Untitled Module", None))
        child_module.case_type = 'child'

        child_form = app.new_form(0, "Untitled Form", None)
        child_form.xmlns = 'http://id_m1-f0'
        child_form.requires = 'case'
        child_form.actions.usercase_update = UpdateCaseAction(update={'name': '/data/question1'})
        child_form.actions.usercase_update.condition.type = 'always'

        self.assertXmlPartialEqual(self.get_xml('usercase_entry'), app.create_suite(), "./entry[1]")
Exemple #12
0
 def get_update_case_action():
     update = {
         'start_date': '/data/start_date',
         'start_time': '/data/start_time',
         'end_date': '/data/end_date',
         'end_time': '/data/end_time',
     }
     for item_group in self.iter_item_groups():
         for item in item_group.iter_items():
             update[item.question_name] = '/data/{}/{}'.format(
                 item_group.question_name, item.question_name)
     return UpdateCaseAction(
         update=update, condition=FormActionCondition(type='always'))
 def test_update_preload_case(self):
     self.form.requires = 'case'
     self.form.actions.update_case = UpdateCaseAction(
         update={
             'question1': ConditionalCaseUpdate(
                 question_path='/data/question1')
         })
     self.form.actions.update_case.condition.type = 'always'
     self.form.actions.case_preload = PreloadAction(
         preload={'/data/question1': 'question1'})
     self.form.actions.case_preload.condition.type = 'always'
     self.assertXmlEqual(self.get_xml('update_preload_case'),
                         self.form.render_xform())
 def test_open_case(self):
     self.form.actions.open_case = OpenCaseAction(
         name_update=ConditionalCaseUpdate(
             question_path="/data/question1"), )
     self.form.actions.open_case.condition.type = 'always'
     self.form.actions.update_case = UpdateCaseAction(
         update={
             'question1': ConditionalCaseUpdate(
                 question_path='/data/question1')
         })
     self.form.actions.update_case.condition.type = 'always'
     self.assertXmlEqual(self.get_xml('multi_open_update_case'),
                         self.form.render_xform())
 def test_open_case(self):
     """Opening cases still works with registry search"""
     self.form.actions.open_case = OpenCaseAction(
         name_update=ConditionalCaseUpdate(question_path="/data/question1"),
         external_id=None)
     self.form.actions.open_case.condition.type = 'always'
     self.form.actions.update_case = UpdateCaseAction(
         update={
             'question1': ConditionalCaseUpdate(
                 question_path='/data/question1')
         })
     self.form.actions.update_case.condition.type = 'always'
     self.assertXmlEqual(self.get_xml('open_update_case'),
                         self.form.render_xform())
Exemple #16
0
    def form_requires_case(form,
                           case_type=None,
                           parent_case_type=None,
                           update=None,
                           preload=None):
        if update:
            update = {
                name: ConditionalCaseUpdate(question_path=question_path)
                for name, question_path in update.items()
            }
        if form.form_type == 'module_form':
            form.requires = 'case'
            if update:
                form.actions.update_case = UpdateCaseAction(update=update)
                form.actions.update_case.condition.type = 'always'
            if preload:
                form.actions.case_preload = PreloadAction(preload=preload)
                form.actions.case_preload.condition.type = 'always'

            if parent_case_type:
                module = form.get_module()
                module.parent_select.active = True
                parent_select_module = next(
                    module for module in module.get_app().get_modules()
                    if module.case_type == parent_case_type)
                module.parent_select.module_id = parent_select_module.unique_id
        else:
            case_type = case_type or form.get_module().case_type
            index = len([
                load for load in form.actions.load_update_cases
                if load.case_type == case_type
            ])
            kwargs = {
                'case_type': case_type,
                'case_tag': 'load_{}_{}'.format(case_type, index)
            }
            if update:
                kwargs['case_properties'] = update
            if preload:
                kwargs['preload'] = preload
            action = LoadUpdateAction(**kwargs)

            if parent_case_type:
                parent_action = form.actions.load_update_cases[-1]
                assert parent_action.case_type == parent_case_type
                action.case_index = CaseIndex(tag=parent_action.case_tag)

            form.actions.load_update_cases.append(action)
    def test_child_module_adjust_session_datums(self):
        """
        Test that session datum id's in child module match those in parent module
        """
        self.module_1.root_module_id = self.module_0.unique_id
        self.module_0.case_type = 'gold-fish'
        m0f0 = self.module_0.get_form(0)
        m0f0.requires = 'case'
        m0f0.actions.update_case = UpdateCaseAction(
            update={'question1': '/data/question1'})
        m0f0.actions.update_case.condition.type = 'always'

        self.module_1.case_type = 'guppy'
        m1f0 = self.module_1.get_form(0)
        self._load_case(m1f0, 'gold-fish')
        self._load_case(m1f0, 'guppy')
        self.assertXmlPartialEqual(self.get_xml('child-module-entry-datums'),
                                   self.app.create_suite(), "./entry")
    def test_child_module_adjusted_datums_advanced_module(self):
        """
        Testing that the session variable name for the case_id is correct since
        it will have been adjusted in the suite.xml to match the variable name
        in the root module.
        """
        module = self.app.add_module(
            AdvancedModule.new_module('New Module', lang='en'))
        module.case_type = 'test_case_type'
        form = module.new_form(
            "Untitled Form", "en",
            self.get_xml('original_form',
                         override_path=('data', )).decode('utf-8'))

        form.actions.load_update_cases.append(
            LoadUpdateAction(
                case_type=module.case_type,
                case_tag='load_1',
                case_properties={
                    'question1':
                    ConditionalCaseUpdate(question_path='/data/question1')
                }))

        root_module = self.app.add_module(
            Module.new_module('root module', None))
        root_module.unique_id = 'm_root'
        root_module.case_type = module.case_type

        root_module_form = root_module.new_form('root module form', None)
        root_module_form.requires = 'case'
        root_module_form.actions.update_case = UpdateCaseAction(
            update={
                'question1': ConditionalCaseUpdate(
                    question_path='/data/question1')
            })
        root_module_form.actions.update_case.condition.type = 'always'

        # make module a child module of root_module
        module.root_module_id = root_module.unique_id

        self.assertXmlEqual(
            self.get_xml('child_module_adjusted_case_id_advanced'),
            form.render_xform())
Exemple #19
0
    def test_update_and_subcase(self):
        app = Application.new_app('domain', "Untitled Application")

        module = app.add_module(Module.new_module('parent', None))
        module.case_type = 'phone'
        module.unique_id = 'm0'

        form = app.new_form(0, "Untitled Form", None)
        form.xmlns = 'http://m0-f0'
        form.requires = 'case'
        form.actions.update_case = UpdateCaseAction(update={'question1': '/data/question1'})
        form.actions.update_case.condition.type = 'always'
        form.actions.subcases.append(OpenSubCaseAction(
            case_type=module.case_type,
            case_name="/data/question1",
            condition=FormActionCondition(type='always')
        ))

        self.assertXmlPartialEqual(self.get_xml('update_case_and_subcase'), app.create_suite(), "./entry[1]")
    def test_update_usercase_edit_update_mode(self):
        self.form.actions.usercase_update = UpdateCaseAction(
            update={
                'name':
                ConditionalCaseUpdate(question_path='/data/question1',
                                      update_mode='edit')
            })
        self.form.actions.usercase_update.condition.type = 'always'

        expected = """
            <partial>
              <ns0:bind xmlns:ns0="http://www.w3.org/2002/xforms" nodeset="/data/commcare_usercase/case/update/case_name"
                relevant="count(/data/question1) &gt; 0 and instance('casedb')/casedb/case[@case_id=/data/commcare_usercase/case/@case_id]/case_name != /data/question1"
                calculate="/data/question1"/>
            </partial>
        """
        xpath = './{h}head/{w3x}model/{w3x}bind[@nodeset="/data/commcare_usercase/case/update/case_name"]'.format(
            h='{http://www.w3.org/1999/xhtml}',
            w3x='{http://www.w3.org/2002/xforms}')
        self.assertXmlPartialEqual(expected, self.form.render_xform(), xpath)
    def test_child_module_session_datums_added(self):
        self.module_1.root_module_id = self.module_0.unique_id
        self.module_0.case_type = 'gold-fish'
        m0f0 = self.module_0.get_form(0)
        m0f0.requires = 'case'
        m0f0.actions.update_case = UpdateCaseAction(
            update={'question1': '/data/question1'})
        m0f0.actions.update_case.condition.type = 'always'
        m0f0.actions.subcases.append(
            OpenSubCaseAction(case_type='guppy',
                              case_name="/data/question1",
                              condition=FormActionCondition(type='always')))

        self.module_1.case_type = 'guppy'
        m1f0 = self.module_1.get_form(0)
        self._load_case(m1f0, 'gold-fish')
        self._load_case(m1f0, 'guppy', parent_module=self.module_0)

        self.assertXmlPartialEqual(
            self.get_xml('child-module-entry-datums-added'),
            self.app.create_suite(), "./entry")
Exemple #22
0
    def assert_form_datums(self, form, datum_id):
        """Check the datum IDs used in the form XML case preload"""
        form.source = self.get_xml('original_form',
                                   override_path=('data', )).decode('utf-8')
        form.actions.update_case = UpdateCaseAction(
            update={
                'question1': ConditionalCaseUpdate(
                    question_path='/data/question1')
            })
        form.actions.update_case.condition.type = 'always'

        xml = lxml.etree.XML(form.render_xform())
        model_children = xml.getchildren()[0].getchildren()[1].getchildren()
        calculate_expr = [
            child.attrib['calculate'] for child in model_children
            if child.attrib.get('nodeset') == '/data/case/@case_id'
        ][0]
        self.assertTrue(
            calculate_expr.startswith(
                "instance('commcaresession')/session/data/"))
        actual_id = calculate_expr.split("/")[-1]
        self.assertEqual(datum_id, actual_id)
Exemple #23
0
def _init_biometrics_identify_module(app, lang, enroll_form_id):
    """
    Creates Identification Module for Biometrics
    """
    module = app.add_module(
        Module.new_module(_("Identify Registered Person"), lang))

    # make sure app has Register From Case List Add-On enabled
    app.add_ons["register_from_case_list"] = True

    # turn on Register from Case List with Simprints Enrolment form
    module.case_list_form = CaseListForm(
        form_id=enroll_form_id,
        label=dict([(lang, _("Enroll New Person"))]),
    )
    case_list = module.case_details.short
    case_list.lookup_enabled = True
    case_list.lookup_action = "com.simprints.id.IDENTIFY"
    case_list.lookup_name = _("Scan Fingerprint")
    case_list.lookup_extras = list([
        dict(key=key, value="'{}'".format(value))
        for key, value in app.biometric_context.items()
    ])
    case_list.lookup_responses = [
        {
            'key': 'fake'
        },
    ]
    case_list.lookup_display_results = True
    case_list.lookup_field_header[lang] = _("Confidence")
    case_list.lookup_field_template = 'simprintsId'

    identify = app.new_form(module.id, _("Followup with Person"), lang)
    identify.requires = 'case'
    identify.actions.update_case = UpdateCaseAction(
        condition=FormActionCondition(type='always'))

    module.case_type = 'person'
Exemple #24
0
def _init_biometrics_enroll_module(app, lang):
    """
    Creates Enrolment Module for Biometrics
    """
    module = app.add_module(Module.new_module(_("Registration"), lang))

    form_name = _("Enroll New Person")

    context = {
        'xmlns_uuid': str(uuid.uuid4()).upper(),
        'form_name': form_name,
        'name_label': _("What is your name?"),
        'simprints_enrol_label': _("Scan Fingerprints"),
        'lang': lang,
    }
    context.update(app.biometric_context)
    attachment = render_to_string("app_manager/simprints_enrolment_form.xml",
                                  context=context)

    enroll = app.new_form(module.id, form_name, lang, attachment=attachment)
    enroll.actions.open_case = OpenCaseAction(
        name_path="/data/name",
        condition=FormActionCondition(type='always'),
    )
    enroll.actions.update_case = UpdateCaseAction(
        update={
            'simprintsId': '/data/simprintsId',
            'rightIndex': '/data/rightIndex',
            'rightThumb': '/data/rightThumb',
            'leftIndex': '/data/leftIndex',
            'leftThumb': '/data/leftThumb',
        },
        condition=FormActionCondition(type='always'),
    )

    module.case_type = 'person'

    return module, enroll.get_unique_id()
Exemple #25
0
def new_form(request, domain, app_id, module_id):
    "Adds a form to an app (under a module)"
    app = get_app(domain, app_id)
    lang = request.COOKIES.get('lang', app.langs[0])
    name = request.POST.get('name')
    form = app.new_form(module_id, name, lang)

    if toggles.APP_MANAGER_V2.enabled(domain):
        case_action = request.POST.get('case_action', 'none')
        if case_action == 'update':
            form.requires = 'case'
            form.actions.update_case = UpdateCaseAction(
                condition=FormActionCondition(type='always'))

    app.save()
    # add form_id to locals()
    form_id = form.id
    response = back_to_main(request,
                            domain,
                            app_id=app_id,
                            module_id=module_id,
                            form_id=form_id)
    return response
 def test_open_update_case(self):
     self.form.actions.open_case = OpenCaseAction(name_path="/data/question1", external_id=None)
     self.form.actions.open_case.condition.type = 'always'
     self.form.actions.update_case = UpdateCaseAction(update={'question1': '/data/question1'})
     self.form.actions.update_case.condition.type = 'always'
     self.assertXmlEqual(self.get_xml('open_update_case'), self.form.render_xform())
Exemple #27
0
def new_module(request, domain, app_id):
    "Adds a module to an app"
    app = get_app(domain, app_id)
    lang = request.COOKIES.get('lang', app.langs[0])
    name = request.POST.get('name')
    module_type = request.POST.get('module_type', 'case')

    if module_type == 'case' or module_type == 'survey':  # survey option added for V2

        if toggles.APP_MANAGER_V2.enabled(domain):
            if module_type == 'case':
                name = name or 'Case List'
            else:
                name = name or 'Surveys'

        module = app.add_module(Module.new_module(name, lang))
        module_id = module.id

        form_id = None
        if toggles.APP_MANAGER_V2.enabled(domain):
            if module_type == 'case':
                # registration form
                register = app.new_form(module_id, "Register", lang)
                with open(
                        os.path.join(os.path.dirname(__file__), '..', 'static',
                                     'app_manager', 'xml',
                                     'registration_form.xml')) as f:
                    register.source = f.read()
                register.actions.open_case = OpenCaseAction(
                    condition=FormActionCondition(type='always'),
                    name_path=u'/data/name')
                register.actions.update_case = UpdateCaseAction(
                    condition=FormActionCondition(type='always'))

                # make case type unique across app
                app_case_types = set([
                    module.case_type for module in app.modules
                    if module.case_type
                ])
                module.case_type = 'case'
                suffix = 0
                while module.case_type in app_case_types:
                    suffix = suffix + 1
                    module.case_type = 'case-{}'.format(suffix)
            else:
                form = app.new_form(module_id, "Survey", lang)
            form_id = 0
        else:
            app.new_form(module_id, "Untitled Form", lang)

        app.save()
        response = back_to_main(request,
                                domain,
                                app_id=app_id,
                                module_id=module_id,
                                form_id=form_id)
        response.set_cookie('suppress_build_errors', 'yes')
        return response
    elif module_type in MODULE_TYPE_MAP:
        fn = MODULE_TYPE_MAP[module_type][FN]
        validations = MODULE_TYPE_MAP[module_type][VALIDATIONS]
        error = next((v[1] for v in validations if v[0](app)), None)
        if error:
            messages.warning(request, error)
            return back_to_main(request, domain, app_id=app.id)
        else:
            return fn(request, domain, app, name, lang)
    else:
        logger.error('Unexpected module type for new module: "%s"' %
                     module_type)
        return back_to_main(request, domain, app_id=app_id)
Exemple #28
0
def new_module(request, domain, app_id):
    "Adds a module to an app"
    app = get_app(domain, app_id)
    from corehq.apps.app_manager.views.utils import get_default_followup_form_xml
    lang = request.COOKIES.get('lang', app.langs[0])
    name = request.POST.get('name')
    module_type = request.POST.get('module_type', 'case')

    if module_type == 'biometrics':
        enroll_module, enroll_form_id = _init_biometrics_enroll_module(
            app, lang)
        _init_biometrics_identify_module(app, lang, enroll_form_id)

        app.save()

        response = back_to_main(request,
                                domain,
                                app_id=app_id,
                                module_id=enroll_module.id,
                                form_id=0)
        response.set_cookie('suppress_build_errors', 'yes')
        return response
    elif module_type == 'case' or module_type == 'survey':  # survey option added for V2
        if module_type == 'case':
            name = name or 'Case List'
        else:
            name = name or 'Surveys'

        module = app.add_module(Module.new_module(name, lang))
        module_id = module.id

        form_id = None
        unstructured = add_ons.show("empty_case_lists", request, app)
        if module_type == 'case':
            if not unstructured:
                form_id = 0

                # registration form
                register = app.new_form(module_id, _("Registration Form"),
                                        lang)
                register.actions.open_case = OpenCaseAction(
                    condition=FormActionCondition(type='always'))
                register.actions.update_case = UpdateCaseAction(
                    condition=FormActionCondition(type='always'))

                # one followup form
                msg = _(
                    "This is your follow up form. "
                    "Delete this label and add questions for any follow up visits."
                )
                attachment = get_default_followup_form_xml(context={
                    'lang': lang,
                    'default_label': msg
                })
                followup = app.new_form(module_id,
                                        _("Followup Form"),
                                        lang,
                                        attachment=attachment)
                followup.requires = "case"
                followup.actions.update_case = UpdateCaseAction(
                    condition=FormActionCondition(type='always'))

            _init_module_case_type(module)
        else:
            form_id = 0
            app.new_form(module_id, _("Survey"), lang)

        app.save()
        response = back_to_main(request,
                                domain,
                                app_id=app_id,
                                module_id=module_id,
                                form_id=form_id)
        response.set_cookie('suppress_build_errors', 'yes')
        return response
    elif module_type in MODULE_TYPE_MAP:
        fn = MODULE_TYPE_MAP[module_type][FN]
        validations = MODULE_TYPE_MAP[module_type][VALIDATIONS]
        error = next((v[1] for v in validations if v[0](app)), None)
        if error:
            messages.warning(request, error)
            return back_to_main(request, domain, app_id=app.id)
        else:
            return fn(request, domain, app, name, lang)
    else:
        logger.error('Unexpected module type for new module: "%s"' %
                     module_type)
        return back_to_main(request, domain, app_id=app_id)
Exemple #29
0
def new_module(request, domain, app_id):
    "Adds a module to an app"
    app = get_app(domain, app_id)
    lang = request.COOKIES.get('lang', app.langs[0])
    name = request.POST.get('name')
    module_type = request.POST.get('module_type', 'case')

    if module_type == 'case' or module_type == 'survey':  # survey option added for V2

        if toggles.APP_MANAGER_V2.enabled(domain):
            if module_type == 'case':
                name = name or 'Case List'
            else:
                name = name or 'Surveys'

        module = app.add_module(Module.new_module(name, lang))
        module_id = module.id

        form_id = None
        if toggles.APP_MANAGER_V2.enabled(domain):
            if module_type == 'case':
                # registration form
                register = app.new_form(module_id, "Register", lang)
                register.actions.open_case = OpenCaseAction(
                    condition=FormActionCondition(type='always'))
                register.actions.update_case = UpdateCaseAction(
                    condition=FormActionCondition(type='always'))

                # set up reg from case list
                module.case_list_form.form_id = register.unique_id
                module.case_list_form.label = register.name
                register.form_filter = "false()"

                # one followup form
                followup = app.new_form(module_id, "Followup", lang)
                followup.requires = "case"
                followup.actions.update_case = UpdateCaseAction(
                    condition=FormActionCondition(type='always'))

                # make case type unique across app
                app_case_types = set([
                    module.case_type for module in app.modules
                    if module.case_type
                ])
                module.case_type = 'case'
                suffix = 0
                while module.case_type in app_case_types:
                    suffix = suffix + 1
                    module.case_type = 'case-{}'.format(suffix)
            else:
                app.new_form(module_id, "Survey", lang)
            form_id = 0
        else:
            app.new_form(module_id, "Untitled Form", lang)

        app.save()
        response = back_to_main(request,
                                domain,
                                app_id=app_id,
                                module_id=module_id,
                                form_id=form_id)
        response.set_cookie('suppress_build_errors', 'yes')
        return response
    elif module_type in MODULE_TYPE_MAP:
        fn = MODULE_TYPE_MAP[module_type][FN]
        validations = MODULE_TYPE_MAP[module_type][VALIDATIONS]
        error = next((v[1] for v in validations if v[0](app)), None)
        if error:
            messages.warning(request, error)
            return back_to_main(request, domain, app_id=app.id)
        else:
            return fn(request, domain, app, name, lang)
    else:
        logger.error('Unexpected module type for new module: "%s"' %
                     module_type)
        return back_to_main(request, domain, app_id=app_id)
Exemple #30
0
def new_module(request, domain, app_id):
    "Adds a module to an app"
    app = get_app(domain, app_id)
    lang = request.COOKIES.get('lang', app.langs[0])
    name = request.POST.get('name')
    module_type = request.POST.get('module_type', 'case')

    if module_type == 'case' or module_type == 'survey':  # survey option added for V2
        if module_type == 'case':
            name = name or 'Case List'
        else:
            name = name or 'Surveys'

        module = app.add_module(Module.new_module(name, lang))
        module_id = module.id

        form_id = None
        unstructured = add_ons.show("empty_case_lists", request, app)
        if module_type == 'case':
            if not unstructured:
                form_id = 0

                # registration form
                register = app.new_form(module_id, _("Registration Form"),
                                        lang)
                register.actions.open_case = OpenCaseAction(
                    condition=FormActionCondition(type='always'))
                register.actions.update_case = UpdateCaseAction(
                    condition=FormActionCondition(type='always'))

                # one followup form
                followup = app.new_form(module_id, _("Followup Form"), lang)
                followup.requires = "case"
                followup.actions.update_case = UpdateCaseAction(
                    condition=FormActionCondition(type='always'))

            _init_module_case_type(module)
        else:
            form_id = 0
            app.new_form(module_id, _("Survey"), lang)

        app.save()
        response = back_to_main(request,
                                domain,
                                app_id=app_id,
                                module_id=module_id,
                                form_id=form_id)
        response.set_cookie('suppress_build_errors', 'yes')
        return response
    elif module_type in MODULE_TYPE_MAP:
        fn = MODULE_TYPE_MAP[module_type][FN]
        validations = MODULE_TYPE_MAP[module_type][VALIDATIONS]
        error = next((v[1] for v in validations if v[0](app)), None)
        if error:
            messages.warning(request, error)
            return back_to_main(request, domain, app_id=app.id)
        else:
            return fn(request, domain, app, name, lang)
    else:
        logger.error('Unexpected module type for new module: "%s"' %
                     module_type)
        return back_to_main(request, domain, app_id=app_id)