Exemplo n.º 1
0
    def test_programs(self):
        self.domain = bootstrap_domain(TEST_DOMAIN)
        self.addCleanup(self.domain.delete)
        bootstrap_products(self.domain.name)
        self.products = sorted(Product.by_domain(self.domain.name), key=lambda p: p._id)
        self.default_program = Program.by_domain(self.domain.name, wrap=True).one()
        self.new_program = make_program(
            self.domain.name,
            'new program',
            'newprogram'
        )
        self.assertTrue(self.default_program.default)
        self.assertFalse(self.new_program.default)

        with self.assertRaises(Exception) as context:
            self.default_program.delete()

        self.assertEqual(six.text_type(context.exception), 'You cannot delete the default program')

        # assign some product to the new program
        self.products[0].program_id = self.new_program._id
        self.products[0].save()

        # make sure start state is okay
        self.assertEqual(
            2,
            len(Program.by_domain(self.domain.name))
        )
        self.assertEqual(2, self.default_program.get_products_count())
        self.assertEqual(1, self.new_program.get_products_count())
        self.assertEqual(
            self.new_program._id,
            self.products[0].program_id
        )
        self.assertEqual(
            self.new_program._id,
            SQLProduct.objects.get(product_id=self.products[0]._id).program_id
        )

        # stash the id before we delete
        new_program_id = self.new_program._id
        self.new_program.delete()

        with self.assertRaises(ResourceNotFound):
            Program.get(new_program_id)

        self.assertEqual(1, len(Program.by_domain(self.domain.name)))
        self.assertEqual(3, self.default_program.get_products_count())
        self.assertEqual(
            self.default_program._id,
            Product.get(self.products[0]._id).program_id
        )
        self.assertEqual(
            self.default_program._id,
            SQLProduct.objects.get(product_id=self.products[0]._id).program_id
        )
Exemplo n.º 2
0
    def test_delete(self):
        # assign some product to the new program
        self.products[0].program_id = self.new_program._id
        self.products[0].save()

        # make sure start state is okay
        self.assertEqual(
            2,
            len(Program.by_domain(self.domain.name))
        )
        self.assertEqual(
            2,
            Product.by_program_id(self.domain.name, self.default_program._id).count()
        )
        self.assertEqual(
            1,
            Product.by_program_id(self.domain.name, self.new_program._id).count()
        )
        self.assertEqual(
            self.new_program._id,
            self.products[0].program_id
        )
        self.assertEqual(
            self.new_program._id,
            SQLProduct.objects.get(product_id=self.products[0]._id).program_id
        )

        # stash the id before we delete
        new_program_id = self.new_program._id
        self.new_program.delete()

        with self.assertRaises(ResourceNotFound):
            Program.get(new_program_id)

        self.assertEqual(
            1,
            len(Program.by_domain(self.domain.name))
        )
        self.assertEqual(
            3,
            Product.by_program_id(self.domain.name, self.default_program._id).count()
        )
        self.assertEqual(
            self.default_program._id,
            Product.get(self.products[0]._id).program_id
        )
        self.assertEqual(
            self.default_program._id,
            SQLProduct.objects.get(product_id=self.products[0]._id).program_id
        )
Exemplo n.º 3
0
    def __call__(self, restore_state):
        restore_user = restore_state.restore_user

        data_fn = lambda: Program.by_domain(restore_user.domain)
        return simple_fixture_generator(restore_user, self.id, "program",
                                        PROGRAM_FIELDS, data_fn,
                                        restore_state.last_sync_log)
Exemplo n.º 4
0
    def __init__(self, data=None, excluded_emails=None, *args, **kwargs):
        domain_obj = None
        location = None
        if 'domain' in kwargs:
            domain_obj = Domain.get_by_name(kwargs['domain'])
            del kwargs['domain']
        if 'location' in kwargs:
            location = kwargs['location']
            del kwargs['location']
        super(AdminInvitesUserForm, self).__init__(data=data, *args, **kwargs)
        if domain_obj and domain_obj.commtrack_enabled:
            self.fields['supply_point'] = forms.CharField(
                label='Primary Location',
                required=False,
                widget=LocationSelectWidget(domain_obj.name),
                initial=location.location_id if location else '')
            self.fields['program'] = forms.ChoiceField(label="Program",
                                                       choices=(),
                                                       required=False)
            programs = Program.by_domain(domain_obj.name, wrap=False)
            choices = list((prog['_id'], prog['name']) for prog in programs)
            choices.insert(0, ('', ''))
            self.fields['program'].choices = choices
        self.excluded_emails = excluded_emails or []

        self.helper = FormHelper()
        self.helper.form_tag = False
        self.helper.form_method = 'POST'
        self.helper.form_class = 'form-horizontal'

        self.helper.label_class = 'col-sm-3 col-md-2'
        self.helper.field_class = 'col-sm-9 col-md-8 col-lg-6'
Exemplo n.º 5
0
    def test_program_fixture_cache(self):
        user = self.user
        Program(domain=user.domain, name="test1", code="t1").save()

        program_list = list(Program.by_domain(user.domain))
        program_xml = self.generate_program_xml(program_list, user)

        fixture = call_fixture_generator(program_fixture_generator, user)

        self.assertXmlEqual(program_xml, fixture[0])

        program = program_list[0]
        program.name = 'new_name'
        super(Program, program).save()  # save but skip clearing the cache

        fixture_cached = call_fixture_generator(program_fixture_generator,
                                                user)
        self.assertXmlEqual(program_xml, fixture_cached[0])

        program.save()
        program_xml_new = self.generate_program_xml(program_list, user)

        fixture_regen = call_fixture_generator(program_fixture_generator, user)
        self.assertXmlEqual(program_xml_new, fixture_regen[0])
        self.assertXMLNotEqual(program_xml_new, program_xml)
Exemplo n.º 6
0
    def __init__(self, data=None, excluded_emails=None, *args, **kwargs):
        domain = None
        location = None
        if 'domain' in kwargs:
            domain = Domain.get_by_name(kwargs['domain'])
            del kwargs['domain']
        if 'location' in kwargs:
            location = kwargs['location']
            del kwargs['location']
        super(AdminInvitesUserForm, self).__init__(data=data, *args, **kwargs)
        if domain and domain.commtrack_enabled:
            self.fields['supply_point'] = forms.CharField(label='Supply Point:', required=False,
                                                          widget=SupplyPointSelectWidget(domain.name),
                                                          initial=location.location_id if location else '')
            self.fields['program'] = forms.ChoiceField(label="Program", choices=(), required=False)
            programs = Program.by_domain(domain.name, wrap=False)
            choices = list((prog['_id'], prog['name']) for prog in programs)
            choices.insert(0, ('', ''))
            self.fields['program'].choices = choices
        self.excluded_emails = excluded_emails or []

        self.helper = FormHelper()
        self.helper.form_tag = False
        self.helper.form_method = 'POST'
        self.helper.form_class = 'form-horizontal'

        self.helper.label_class = 'col-sm-3 col-md-2'
        self.helper.field_class = 'col-sm-9 col-md-8 col-lg-6'
Exemplo n.º 7
0
    def __init__(self, product, *args, **kwargs):
        self.product = product

        kwargs['initial'] = self.product._doc
        kwargs['initial']['code'] = self.product.code

        super(ProductForm, self).__init__(*args, **kwargs)
        self.helper = FormHelper()
        self.helper.form_tag = False
        self.helper.label_class = 'col-sm-3 col-md-4 col-lg-2'
        self.helper.field_class = 'col-sm-4 col-md-5 col-lg-3'

        programs = Program.by_domain(self.product.domain, wrap=False)
        self.fields['program_id'].choices = tuple((prog['_id'], prog['name']) for prog in programs)

        # make sure to select default program if
        # this is a new product
        if not product._id:
            self.initial['program_id'] = Program.default_for_domain(self.product.domain)._id

        self.helper.layout = Layout(
            'name',
            'code',
            'description',
            'unit',
            'program_id',
            'cost'
        )
Exemplo n.º 8
0
    def __init__(self, *args, **kwargs):
        from corehq.apps.locations.forms import LocationSelectWidget
        self.domain = kwargs.pop('domain', None)
        super(CommtrackUserForm, self).__init__(*args, **kwargs)
        self.fields['assigned_locations'].widget = LocationSelectWidget(
            self.domain, multiselect=True, id='id_assigned_locations')
        self.fields[
            'assigned_locations'].help_text = ExpandedMobileWorkerFilter.location_search_help
        self.fields['primary_location'].widget = PrimaryLocationWidget(
            css_id='id_primary_location',
            source_css_id='id_assigned_locations',
        )
        if self.commtrack_enabled:
            programs = Program.by_domain(self.domain)
            choices = list((prog.get_id, prog.name) for prog in programs)
            choices.insert(0, ('', ''))
            self.fields['program_id'].choices = choices
        else:
            self.fields['program_id'].widget = forms.HiddenInput()

        self.helper = FormHelper()

        self.helper.form_method = 'POST'
        self.helper.form_class = 'form-horizontal'
        self.helper.form_tag = False

        self.helper.label_class = 'col-sm-3 col-md-2'
        self.helper.field_class = 'col-sm-9 col-md-8 col-lg-6'
Exemplo n.º 9
0
    def __init__(self, *args, **kwargs):
        self.domain = None
        if 'domain' in kwargs:
            self.domain = kwargs['domain']
            del kwargs['domain']
        super(CommtrackUserForm, self).__init__(*args, **kwargs)
        self.fields['assigned_locations'].widget = SupplyPointSelectWidget(
            self.domain, multiselect=True, id='id_assigned_locations'
        )
        self.fields['primary_location'].widget = PrimaryLocationWidget(
            css_id='id_primary_location',
            source_css_id='id_assigned_locations'
        )
        if self.commtrack_enabled:
            programs = Program.by_domain(self.domain, wrap=False)
            choices = list((prog['_id'], prog['name']) for prog in programs)
            choices.insert(0, ('', ''))
            self.fields['program_id'].choices = choices
        else:
            self.fields['program_id'].widget = forms.HiddenInput()

        self.helper = FormHelper()

        self.helper.form_method = 'POST'
        self.helper.form_class = 'form-horizontal'
        self.helper.form_tag = False

        self.helper.label_class = 'col-sm-3 col-md-2'
        self.helper.field_class = 'col-sm-9 col-md-8 col-lg-6'
Exemplo n.º 10
0
    def handle(self, *args, **options):
        self.stdout.write("Fixing default programs...\n")

        for domain in Domain.get_all():
            if not domain.commtrack_enabled:
                continue

            if Program.default_for_domain(domain.name):
                continue

            programs = Program.by_domain(domain.name)

            # filter anything named 'default' or 'Default'
            current_default = [
                p for p in programs
                if p.name == 'Default' or p.name == 'default'
            ]

            # if they never changed their default programs
            # name, we don't want to add a confusing new one
            # so just flip this to the default
            if len(current_default) == 1:
                p.default = True
                p.save()
            else:
                get_or_create_default_program(domain.name)
Exemplo n.º 11
0
    def __init__(self, *args, **kwargs):
        self.domain = None
        if 'domain' in kwargs:
            self.domain = kwargs['domain']
            del kwargs['domain']
        super(CommtrackUserForm, self).__init__(*args, **kwargs)
        self.fields['assigned_locations'].widget = SupplyPointSelectWidget(
            self.domain, multiselect=True, id='id_assigned_locations'
        )
        self.fields['primary_location'].widget = PrimaryLocationWidget(
            css_id='id_primary_location',
            source_css_id='id_assigned_locations'
        )
        if self.commtrack_enabled:
            programs = Program.by_domain(self.domain, wrap=False)
            choices = list((prog['_id'], prog['name']) for prog in programs)
            choices.insert(0, ('', ''))
            self.fields['program_id'].choices = choices
        else:
            self.fields['program_id'].widget = forms.HiddenInput()

        self.helper = FormHelper()

        self.helper.form_method = 'POST'
        self.helper.form_class = 'form-horizontal'
        self.helper.form_tag = False

        self.helper.label_class = 'col-sm-3 col-md-2'
        self.helper.field_class = 'col-sm-9 col-md-8 col-lg-6'
Exemplo n.º 12
0
def program_fixture_generator(user, version, last_sync=None):
    fields = [
        'name',
        'code'
    ]
    data_fn = lambda: Program.by_domain(user.domain)
    return _simple_fixture_generator(user, "program", fields, data_fn, last_sync)
Exemplo n.º 13
0
    def test_program_fixture(self):
        user = self.user
        Program(
            domain=user.domain,
            name="test1",
            code="t1"
        ).save()

        program_list = Program.by_domain(user.domain)
        program_xml = self.generate_program_xml(program_list, user)

        fixture = call_fixture_generator(program_fixture_generator, user)

        self.assertXmlEqual(
            program_xml,
            ElementTree.tostring(fixture[0])
        )

        # test restore with different user
        user2 = create_restore_user(self.domain, username='******')
        self.addCleanup(user2._couch_user.delete)
        program_xml = self.generate_program_xml(program_list, user2)
        fixture = call_fixture_generator(program_fixture_generator, user2)

        self.assertXmlEqual(
            program_xml,
            ElementTree.tostring(fixture[0])
        )
Exemplo n.º 14
0
 def setUp(self):
     super(ProgramsTest, self).setUp()
     self.default_program = Program.by_domain(self.domain.name, wrap=True).one()
     self.new_program = make_program(
         self.domain.name,
         'new program',
         'newprogram'
     )
Exemplo n.º 15
0
 def drilldown_map(self):
     options = [{"val": ALL_OPTION, "text": "All", "next": []}]
     for program in Program.by_domain(self.domain):
         products = [{"val": ALL_OPTION, "text": "All", "next": []}]
         for product in Product.by_program_id(self.domain, program._id):
             products.append({"val": product.get_id, "text": product.name + ' (%s)' % product.code})
         options.append({"val": program.get_id, "text": program.name, "next": products})
     return options
Exemplo n.º 16
0
    def __call__(self, restore_state):
        restore_user = restore_state.restore_user

        data_fn = lambda: Program.by_domain(restore_user.domain)
        return simple_fixture_generator(
            restore_user, self.id, "program",
            PROGRAM_FIELDS, data_fn, restore_state.last_sync_log
        )
Exemplo n.º 17
0
 def drilldown_map(self):
     options = [{"val": ALL_OPTION, "text": "All", "next": []}]
     for program in Program.by_domain(self.domain):
         products = [{"val": ALL_OPTION, "text": "All", "next": []}]
         for product in SQLProduct.objects.filter(domain=self.domain, program_id=program.get_id):
             products.append({"val": product.id, "text": product.name})
         options.append({"val": program.get_id, "text": program.name, "next": products})
     return options
Exemplo n.º 18
0
 def drilldown_map(self):
     options = [{"val": ALL_OPTION, "text": "All", "next": []}]
     for program in Program.by_domain(self.domain):
         products = [{"val": ALL_OPTION, "text": "All", "next": []}]
         for product in SQLProduct.objects.filter(domain=self.domain, program_id=program.get_id):
             products.append({"val": product.id, "text": product.name})
         options.append({"val": program.get_id, "text": program.name, "next": products})
     return options
Exemplo n.º 19
0
 def drilldown_map(self):
     options = []
     for program in Program.by_domain(self.domain):
         products = []
         for product in Product.by_program_id(self.domain, program._id):
             products.append({"val": product.get_id, "text": product.name})
         options.append({"val": program.get_id, "text": program.name, "next": products})
     return options
Exemplo n.º 20
0
 def setUp(self):
     super(ProgramsTest, self).setUp()
     self.default_program = Program.by_domain(self.domain.name, wrap=True).one()
     self.new_program = make_program(
         self.domain.name,
         'new program',
         'newprogram'
     )
Exemplo n.º 21
0
 def update_params(self):
     self.selected = self.request.GET.get("program")
     user = WebUser.get_by_username(str(self.request.user))
     if not self.selected and self.selected != "" and user.get_domain_membership(self.domain):
         self.selected = user.get_domain_membership(self.domain).program_id
     self.programs = Program.by_domain(self.domain)
     opts = [dict(val=program.get_id, text=program.name) for program in self.programs]
     self.options = opts
Exemplo n.º 22
0
 def commtrack_programs():
     if app.commtrack_enabled:
         programs = Program.by_domain(app.domain)
         return [{
             'value': program.get_id,
             'label': program.name
         } for program in programs]
     else:
         return []
Exemplo n.º 23
0
    def test_program_fixture(self):
        user = create_restore_user(self.domain.name)
        Program(domain=user.domain, name="test1", code="t1").save()

        program_list = Program.by_domain(user.domain)
        program_xml = self.generate_program_xml(program_list, user)

        fixture = program_fixture_generator(user, V1)

        self.assertXmlEqual(program_xml, ElementTree.tostring(fixture[0]))
Exemplo n.º 24
0
    def test_program_fixture(self):
        user = bootstrap_user(self, phone_number="1234567890")
        Program(domain=user.domain, name="test1", code="t1").save()

        program_list = Program.by_domain(user.domain)
        program_xml = self.generate_program_xml(program_list, user)

        fixture = program_fixture_generator(user, V1)

        self.assertXmlEqual(program_xml, ElementTree.tostring(fixture[0]))
Exemplo n.º 25
0
 def program_data(self):
     data = []
     programs = Program.by_domain(self.domain)
     for p in programs:
         info = p._doc
         info['is_default'] = info.pop('default')
         info['edit_url'] = reverse('commtrack_program_edit', kwargs={'domain': self.domain, 'prog_id': p._id})
         info['delete_url'] = reverse('delete_program', kwargs={'domain': self.domain, 'prog_id': p._id})
         data.append(info)
     return data
Exemplo n.º 26
0
    def test_program_fixture(self):
        user = create_restore_user(self.domain.name)
        Program(domain=user.domain, name="test1", code="t1").save()

        program_list = Program.by_domain(user.domain)
        program_xml = self.generate_program_xml(program_list, user)

        fixture = program_fixture_generator(user, V1)

        self.assertXmlEqual(program_xml, ElementTree.tostring(fixture[0]))
Exemplo n.º 27
0
 def program_data(self):
     data = []
     programs = Program.by_domain(self.domain)
     for p in programs:
         info = p._doc
         info['is_default'] = info.pop('default')
         info['edit_url'] = reverse('commtrack_program_edit', kwargs={'domain': self.domain, 'prog_id': p._id})
         info['delete_url'] = reverse('delete_program', kwargs={'domain': self.domain, 'prog_id': p._id})
         data.append(info)
     return data
Exemplo n.º 28
0
    def test_program_fixture(self):
        user = self.user
        Program(domain=user.domain, name="test1", code="t1").save()

        program_list = Program.by_domain(user.domain)
        program_xml = self.generate_program_xml(program_list, user)

        fixture = call_fixture_generator(program_fixture_generator, user)

        self.assertXmlEqual(program_xml, ElementTree.tostring(fixture[0]))
Exemplo n.º 29
0
    def rendered_content(self):
        location = SQLLocation.objects.get(
            location_id=self.config['location_id'])
        if location.location_type.administrative:
            locations = get_descendants(self.config['location_id'])
            products = self.unique_products(locations, all=True)
        else:
            products = location.products
        programs = {
            program.get_id: program.name
            for program in Program.by_domain(self.domain)
        }
        headers = []
        if 'report_type' in self.config:
            from custom.ewsghana.reports.specific_reports.stock_status_report import MonthOfStockProduct
            headers = [
                h.html for h in MonthOfStockProduct(self.config).headers
            ]

        result = {}
        for idx, product in enumerate(products, start=1):
            program = programs[product.program_id]
            product_dict = {
                'name':
                product.name,
                'code':
                product.code,
                'idx':
                idx if not headers else
                headers.index(product.code) if product.code in headers else -1,
                'checked':
                self.config['program'] is None
                or self.config['program'] == product.program_id
            }
            if program in result:
                result[program]['product_list'].append(product_dict)
                if result[program]['all'] and not product_dict['checked']:
                    result[program]['all'] = False
            else:
                result[program] = {
                    'product_list': [product_dict],
                    'all': product_dict['checked']
                }

        for _, product_dict in result.iteritems():
            product_dict['product_list'].sort(key=lambda prd: prd['name'])
        return render_to_string(
            'ewsghana/partials/product_selection_pane.html', {
                'products_by_program':
                result,
                'is_rendered_as_email':
                self.config.get('is_rendered_as_email', False),
                'hide_columns':
                self.hide_columns
            })
Exemplo n.º 30
0
    def clean_name(self):
        name = self.cleaned_data['name']

        other_program_names = [
            p['name'] for p in Program.by_domain(self.program.domain, wrap=False)
            if p['_id'] != self.program._id
        ]
        if name in other_program_names:
            raise forms.ValidationError(_('Name already in use'))

        return name
Exemplo n.º 31
0
    def test_selective_program_sync(self):
        user = self.user
        Program(domain=user.domain, name="test1", code="t1").save()

        program_list = Program.by_domain(user.domain)
        program_xml = self.generate_program_xml(program_list, user)

        fixture_original = call_fixture_generator(program_fixture_generator,
                                                  user)

        deprecated_generate_restore_payload(self.domain_obj, user)
        self.assertXmlEqual(program_xml,
                            ElementTree.tostring(fixture_original[0]))

        first_sync = sorted(SyncLog.view("phone/sync_logs_by_user",
                                         include_docs=True,
                                         reduce=False).all(),
                            key=lambda x: x.date)[-1]

        # make sure the time stamp on this first sync is
        # not on the same second that the programs were created
        first_sync.date += datetime.timedelta(seconds=1)

        # second sync is before any changes are made, so there should
        # be no programs synced
        fixture_pre_change = call_fixture_generator(program_fixture_generator,
                                                    user,
                                                    last_sync=first_sync)
        deprecated_generate_restore_payload(self.domain_obj, user)
        self.assertEqual([], fixture_pre_change,
                         "Fixture was not empty on second sync")

        second_sync = sorted(SyncLog.view("phone/sync_logs_by_user",
                                          include_docs=True,
                                          reduce=False).all(),
                             key=lambda x: x.date)[-1]

        self.assertTrue(first_sync._id != second_sync._id)

        # save should make the program more recently updated than the
        # last sync
        for program in program_list:
            program.save()

        # now that we've updated a program, we should get
        # program data in sync again
        fixture_post_change = call_fixture_generator(program_fixture_generator,
                                                     user,
                                                     last_sync=second_sync)

        # regenerate the fixture xml to make sure it is still legit
        self.assertXmlEqual(program_xml,
                            ElementTree.tostring(fixture_post_change[0]))
Exemplo n.º 32
0
    def test_selective_program_sync(self):
        user = self.user
        Program(
            domain=user.domain,
            name="test1",
            code="t1"
        ).save()

        program_list = Program.by_domain(user.domain)
        program_xml = self.generate_program_xml(program_list, user)

        fixture_original = call_fixture_generator(program_fixture_generator, user)

        deprecated_generate_restore_payload(self.domain_obj, user)
        self.assertXmlEqual(
            program_xml,
            ElementTree.tostring(fixture_original[0])
        )

        first_sync = self._get_latest_synclog()
        # make sure the time stamp on this first sync is
        # not on the same second that the programs were created
        first_sync.date += datetime.timedelta(seconds=1)

        # second sync is before any changes are made, so there should
        # be no programs synced
        fixture_pre_change = call_fixture_generator(program_fixture_generator, user, last_sync=first_sync)
        deprecated_generate_restore_payload(self.domain_obj, user)
        self.assertEqual(
            [],
            fixture_pre_change,
            "Fixture was not empty on second sync"
        )

        second_sync = self._get_latest_synclog()

        self.assertTrue(first_sync._id != second_sync._id)

        # save should make the program more recently updated than the
        # last sync
        for program in program_list:
            program.save()

        # now that we've updated a program, we should get
        # program data in sync again
        fixture_post_change = call_fixture_generator(program_fixture_generator, user, last_sync=second_sync)

        # regenerate the fixture xml to make sure it is still legit
        self.assertXmlEqual(
            program_xml,
            ElementTree.tostring(fixture_post_change[0])
        )
Exemplo n.º 33
0
    def clean_name(self):
        name = self.cleaned_data['name'].strip()
        if not name:
            raise forms.ValidationError(_('This field is required.'))

        other_program_names = [
            p['name'] for p in Program.by_domain(self.program.domain, wrap=False)
            if p['_id'] != self.program._id
        ]
        if name in other_program_names:
            raise forms.ValidationError(_('Name already in use'))

        return name
Exemplo n.º 34
0
 def update_params(self):
     self.selected = self.request.GET.get('program')
     user = WebUser.get_by_username(str(self.request.user))
     if not self.selected and \
        self.selected != '' and \
        user.get_domain_membership(self.domain):
         self.selected = user.get_domain_membership(self.domain).program_id
     self.programs = Program.by_domain(self.domain)
     opts = [
         dict(val=program.get_id, text=program.name)
         for program in self.programs
     ]
     self.options = opts
Exemplo n.º 35
0
    def test_delete(self):
        # assign some product to the new program
        self.products[0].program_id = self.new_program._id
        self.products[0].save()

        # make sure start state is okay
        self.assertEqual(
            2,
            len(Program.by_domain(self.domain.name))
        )
        self.assertEqual(2, self.default_program.get_products_count())
        self.assertEqual(1, self.new_program.get_products_count())
        self.assertEqual(
            self.new_program._id,
            self.products[0].program_id
        )
        self.assertEqual(
            self.new_program._id,
            SQLProduct.objects.get(product_id=self.products[0]._id).program_id
        )

        # stash the id before we delete
        new_program_id = self.new_program._id
        self.new_program.delete()

        with self.assertRaises(ResourceNotFound):
            Program.get(new_program_id)

        self.assertEqual(1, len(Program.by_domain(self.domain.name)))
        self.assertEqual(3, self.default_program.get_products_count())
        self.assertEqual(
            self.default_program._id,
            Product.get(self.products[0]._id).program_id
        )
        self.assertEqual(
            self.default_program._id,
            SQLProduct.objects.get(product_id=self.products[0]._id).program_id
        )
Exemplo n.º 36
0
 def __init__(self, *args, **kwargs):
     domain = None
     if "domain" in kwargs:
         domain = kwargs["domain"]
         del kwargs["domain"]
     super(CommtrackUserForm, self).__init__(*args, **kwargs)
     self.fields["location"].widget = SupplyPointSelectWidget(domain=domain)
     if Domain.get_by_name(domain).commtrack_enabled:
         programs = Program.by_domain(domain, wrap=False)
         choices = list((prog["_id"], prog["name"]) for prog in programs)
         choices.insert(0, ("", ""))
         self.fields["program_id"].choices = choices
     else:
         self.fields["program_id"].widget = forms.HiddenInput()
Exemplo n.º 37
0
 def __init__(self, data=None, excluded_emails=None, *args, **kwargs):
     domain = None
     if 'domain' in kwargs:
         domain = Domain.get_by_name(kwargs['domain'])
         del kwargs['domain']
     super(AdminInvitesUserForm, self).__init__(data=data, *args, **kwargs)
     if domain and domain.commtrack_enabled:
         self.fields['supply_point'] = forms.CharField(label='Supply Point:', required=False, widget=SupplyPointSelectWidget(domain=domain.name))
         self.fields['program'] = forms.ChoiceField(label="Program", choices=(), required=False)
         programs = Program.by_domain(domain.name, wrap=False)
         choices = list((prog['_id'], prog['name']) for prog in programs)
         choices.insert(0, ('', ''))
         self.fields['program'].choices = choices
     self.excluded_emails = excluded_emails or []
Exemplo n.º 38
0
 def __init__(self, *args, **kwargs):
     domain = None
     if 'domain' in kwargs:
         domain = kwargs['domain']
         del kwargs['domain']
     super(CommtrackUserForm, self).__init__(*args, **kwargs)
     self.fields['location'].widget = SupplyPointSelectWidget(domain=domain)
     if Domain.get_by_name(domain).commtrack_enabled:
         programs = Program.by_domain(domain, wrap=False)
         choices = list((prog['_id'], prog['name']) for prog in programs)
         choices.insert(0, ('', ''))
         self.fields['program_id'].choices = choices
     else:
         self.fields['program_id'].widget = forms.HiddenInput()
Exemplo n.º 39
0
    def _get_fixture_items(self, restore_state):
        restore_user = restore_state.restore_user

        project = restore_user.project
        if not project or not project.commtrack_enabled:
            return []

        data = Program.by_domain(restore_user.domain)

        if not self._should_sync(data, restore_state.last_sync_log):
            return []

        return simple_fixture_generator(restore_user, self.id, "program",
                                        PROGRAM_FIELDS, data)
Exemplo n.º 40
0
 def __init__(self, *args, **kwargs):
     domain = None
     if 'domain' in kwargs:
         domain = kwargs['domain']
         del kwargs['domain']
     super(CommtrackUserForm, self).__init__(*args, **kwargs)
     self.fields['location'].widget = SupplyPointSelectWidget(domain=domain)
     if Domain.get_by_name(domain).commtrack_enabled:
         programs = Program.by_domain(domain, wrap=False)
         choices = list((prog['_id'], prog['name']) for prog in programs)
         choices.insert(0, ('', ''))
         self.fields['program_id'].choices = choices
     else:
         self.fields['program_id'].widget = forms.HiddenInput()
Exemplo n.º 41
0
def program_fixture_generator_json(domain):
    if Program.by_domain(domain).count() == 0:
        return None

    fields = list(PROGRAM_FIELDS)
    fields.append('@id')

    uri = 'jr://fixture/{}'.format(ProgramFixturesProvider.id)
    return {
        'id': 'programs',
        'uri': uri,
        'path': '/programs/program',
        'name': 'Programs',
        'structure': {f: {'name': f, 'no_option': True} for f in fields},
    }
Exemplo n.º 42
0
def program_fixture_generator_json(domain):
    if Program.by_domain(domain).count() == 0:
        return None

    fields = list(PROGRAM_FIELDS)
    fields.append('@id')

    uri = 'jr://fixture/{}'.format(ProgramFixturesProvider.id)
    return {
        'id': 'programs',
        'uri': uri,
        'path': '/programs/program',
        'name': 'Programs',
        'structure': {f: {'name': f, 'no_option': True} for f in fields},
    }
Exemplo n.º 43
0
 def __init__(self, *args, **kwargs):
     domain = None
     if 'domain' in kwargs:
         domain = kwargs['domain']
         del kwargs['domain']
     if 'is_admin' in kwargs:
         attrs = {'is_admin': kwargs['is_admin']}
         del kwargs['is_admin']
     else:
         attrs = {'is_admin': False}
     super(CommtrackUserForm, self).__init__(*args, **kwargs)
     self.fields['supply_point'].widget = SupplyPointSelectWidget(domain=domain, attrs=attrs)
     programs = Program.by_domain(domain, wrap=False)
     choices = list((prog['_id'], prog['name']) for prog in programs)
     choices.insert(0, ('', ''))
     self.fields['program_id'].choices = choices
Exemplo n.º 44
0
    def test_program_fixture(self):
        user = bootstrap_user(self, phone_number="1234567890")
        Program(
            domain=user.domain,
            name="test1",
            code="t1"
        ).save()

        program_list = Program.by_domain(user.domain)
        program_xml = self.generate_program_xml(program_list, user)

        fixture = program_fixture_generator(user, V1)

        self.assertXmlEqual(
            program_xml,
            ElementTree.tostring(fixture[0])
        )
Exemplo n.º 45
0
    def test_program_fixture(self):
        user = self.user
        Program(
            domain=user.domain,
            name="test1",
            code="t1"
        ).save()

        program_list = Program.by_domain(user.domain)
        program_xml = self.generate_program_xml(program_list, user)

        fixture = call_fixture_generator(program_fixture_generator, user)

        self.assertXmlEqual(
            program_xml,
            ElementTree.tostring(fixture[0])
        )
Exemplo n.º 46
0
    def __init__(self, product, *args, **kwargs):
        self.product = product

        kwargs['initial'] = self.product._doc
        kwargs['initial']['code'] = self.product.code

        super(ProductForm, self).__init__(*args, **kwargs)

        programs = Program.by_domain(self.product.domain, wrap=False)
        self.fields['program_id'].choices = tuple((prog['_id'], prog['name']) for prog in programs)

        # make sure to select default program if
        # this is a new product
        if not product._id:
            self.initial['program_id'] = Program.default_for_domain(
                self.product.domain
            )._id
Exemplo n.º 47
0
 def product_sync(self, ilsgateway_product):
     from custom.ilsgateway import PRODUCTS_CODES_PROGRAMS_MAPPING
     product = super(ILSGatewayAPI, self).product_sync(ilsgateway_product)
     programs = list(Program.by_domain(self.domain))
     for program, products in PRODUCTS_CODES_PROGRAMS_MAPPING.iteritems():
         if product.code in products:
             existing_program = filter(lambda p: p.name == program, programs)
             if not existing_program:
                 new_program = Program(domain=self.domain)
                 new_program.name = program
                 new_program.save()
                 product.program_id = new_program.get_id
                 product.save()
             else:
                 product.program_id = existing_program[0].get_id
                 product.save()
     return product
Exemplo n.º 48
0
    def __init__(self, product, *args, **kwargs):
        self.product = product

        kwargs['initial'] = self.product._doc
        kwargs['initial']['code'] = self.product.code

        super(ProductForm, self).__init__(*args, **kwargs)

        programs = Program.by_domain(self.product.domain, wrap=False)
        self.fields['program_id'].choices = tuple(
            (prog['_id'], prog['name']) for prog in programs)

        # make sure to select default program if
        # this is a new product
        if not product._id:
            self.initial['program_id'] = Program.default_for_domain(
                self.product.domain)._id
Exemplo n.º 49
0
 def product_sync(self, ilsgateway_product):
     from custom.ilsgateway import PRODUCTS_CODES_PROGRAMS_MAPPING
     product = super(ILSGatewayAPI, self).product_sync(ilsgateway_product)
     programs = list(Program.by_domain(self.domain))
     for program, products in PRODUCTS_CODES_PROGRAMS_MAPPING.iteritems():
         if product.code in products:
             existing_program = filter(lambda p: p.name == program,
                                       programs)
             if not existing_program:
                 new_program = Program(domain=self.domain)
                 new_program.name = program
                 new_program.save()
                 product.program_id = new_program.get_id
                 product.save()
             else:
                 product.program_id = existing_program[0].get_id
                 product.save()
     return product
Exemplo n.º 50
0
    def test_selective_program_sync(self):
        user = create_restore_user(self.domain.name)
        Program(domain=user.domain, name="test1", code="t1").save()

        program_list = Program.by_domain(user.domain)
        program_xml = self.generate_program_xml(program_list, user)

        fixture_original = program_fixture_generator(user, V1)

        generate_restore_payload(self.domain, user)
        self.assertXmlEqual(program_xml, ElementTree.tostring(fixture_original[0]))

        first_sync = sorted(
            SyncLog.view("phone/sync_logs_by_user", include_docs=True, reduce=False).all(), key=lambda x: x.date
        )[-1]

        # make sure the time stamp on this first sync is
        # not on the same second that the programs were created
        first_sync.date += datetime.timedelta(seconds=1)

        # second sync is before any changes are made, so there should
        # be no programs synced
        fixture_pre_change = program_fixture_generator(user, V1, last_sync=first_sync)
        generate_restore_payload(self.domain, user)
        self.assertEqual([], fixture_pre_change, "Fixture was not empty on second sync")

        second_sync = sorted(
            SyncLog.view("phone/sync_logs_by_user", include_docs=True, reduce=False).all(), key=lambda x: x.date
        )[-1]

        self.assertTrue(first_sync._id != second_sync._id)

        # save should make the program more recently updated than the
        # last sync
        for program in program_list:
            program.save()

        # now that we've updated a program, we should get
        # program data in sync again
        fixture_post_change = program_fixture_generator(user, V1, last_sync=second_sync)

        # regenerate the fixture xml to make sure it is still legit
        self.assertXmlEqual(program_xml, ElementTree.tostring(fixture_post_change[0]))
Exemplo n.º 51
0
 def __init__(self, data=None, excluded_emails=None, *args, **kwargs):
     domain = None
     location = None
     if 'domain' in kwargs:
         domain = Domain.get_by_name(kwargs['domain'])
         del kwargs['domain']
     if 'location' in kwargs:
         location = kwargs['location']
         del kwargs['location']
     super(AdminInvitesUserForm, self).__init__(data=data, *args, **kwargs)
     if domain and domain.commtrack_enabled:
         self.fields['supply_point'] = forms.CharField(label='Supply Point:', required=False,
                                                       widget=SupplyPointSelectWidget(domain=domain.name),
                                                       initial=location.location_id if location else '')
         self.fields['program'] = forms.ChoiceField(label="Program", choices=(), required=False)
         programs = Program.by_domain(domain.name, wrap=False)
         choices = list((prog['_id'], prog['name']) for prog in programs)
         choices.insert(0, ('', ''))
         self.fields['program'].choices = choices
     self.excluded_emails = excluded_emails or []
Exemplo n.º 52
0
    def copy_products(self):
        from corehq.apps.products.models import Product
        from corehq.apps.programs.models import Program
        from corehq.apps.products.views import ProductFieldsView

        self._copy_custom_data(ProductFieldsView.field_type)

        program_map = {}
        programs = Program.by_domain(self.existing_domain)
        for program in programs:
            old_id, new_id = self.save_couch_copy(program, self.new_domain)
            program_map[old_id] = new_id

        products = Product.by_domain(self.existing_domain)
        for product in products:
            if product.program_id:
                try:
                    product.program_id = program_map[product.program_id]
                except:
                    self.stderr("Missing program {} for product {}".format(product.program_id, product._id))
            self.save_couch_copy(product, self.new_domain)
Exemplo n.º 53
0
    def copy_products(self):
        from corehq.apps.products.models import Product
        from corehq.apps.programs.models import Program
        from corehq.apps.products.views import ProductFieldsView

        self._copy_custom_data(ProductFieldsView.field_type)

        program_map = {}
        programs = Program.by_domain(self.existing_domain)
        for program in programs:
            old_id, new_id = self.save_couch_copy(program, self.new_domain)
            program_map[old_id] = new_id

        products = Product.by_domain(self.existing_domain)
        for product in products:
            if product.program_id:
                try:
                    product.program_id = program_map[product.program_id]
                except:
                    self.stderr('Missing program {} for product {}'.format(product.program_id, product._id))
            self.save_couch_copy(product, self.new_domain)
Exemplo n.º 54
0
    def rendered_content(self):
        location = SQLLocation.objects.get(location_id=self.config['location_id'])
        if location.location_type.administrative:
            locations = get_descendants(self.config['location_id'])
            products = self.unique_products(locations, all=True)
        else:
            products = location.products
        programs = {program.get_id: program.name for program in Program.by_domain(self.domain)}
        headers = []
        if 'report_type' in self.config:
            from custom.ewsghana.reports.specific_reports.stock_status_report import MonthOfStockProduct
            headers = [h.html for h in MonthOfStockProduct(self.config).headers]

        result = {}
        for idx, product in enumerate(products, start=1):
            program = programs[product.program_id]
            product_dict = {
                'name': product.name,
                'code': product.code,
                'idx': idx if not headers else headers.index(product.code) if product.code in headers else -1,
                'checked': self.config['program'] is None or self.config['program'] == product.program_id
            }
            if program in result:
                result[program]['product_list'].append(product_dict)
                if result[program]['all'] and not product_dict['checked']:
                    result[program]['all'] = False
            else:
                result[program] = {
                    'product_list': [product_dict],
                    'all': product_dict['checked']
                }

        for _, product_dict in result.iteritems():
            product_dict['product_list'].sort(key=lambda prd: prd['name'])
        return render_to_string('ewsghana/partials/product_selection_pane.html', {
            'products_by_program': result,
            'is_rendered_as_email': self.config.get('is_rendered_as_email', False),
            'hide_columns': self.hide_columns
        })
Exemplo n.º 55
0
    def __init__(self, *args, **kwargs):
        domain = None
        if 'domain' in kwargs:
            domain = kwargs['domain']
            del kwargs['domain']
        super(CommtrackUserForm, self).__init__(*args, **kwargs)
        self.fields['location'].widget = SupplyPointSelectWidget(domain=domain)
        if Domain.get_by_name(domain).commtrack_enabled:
            programs = Program.by_domain(domain, wrap=False)
            choices = list((prog['_id'], prog['name']) for prog in programs)
            choices.insert(0, ('', ''))
            self.fields['program_id'].choices = choices
        else:
            self.fields['program_id'].widget = forms.HiddenInput()

        self.helper = FormHelper()

        self.helper.form_method = 'POST'
        self.helper.form_class = 'form-horizontal'
        self.helper.form_tag = False

        self.helper.label_class = 'col-sm-3 col-md-2'
        self.helper.field_class = 'col-sm-9 col-md-8 col-lg-6'
Exemplo n.º 56
0
    def __init__(self, *args, **kwargs):
        domain = None
        if 'domain' in kwargs:
            domain = kwargs['domain']
            del kwargs['domain']
        super(CommtrackUserForm, self).__init__(*args, **kwargs)
        self.fields['location'].widget = SupplyPointSelectWidget(domain=domain)
        if Domain.get_by_name(domain).commtrack_enabled:
            programs = Program.by_domain(domain, wrap=False)
            choices = list((prog['_id'], prog['name']) for prog in programs)
            choices.insert(0, ('', ''))
            self.fields['program_id'].choices = choices
        else:
            self.fields['program_id'].widget = forms.HiddenInput()

        self.helper = FormHelper()

        self.helper.form_method = 'POST'
        self.helper.form_class = 'form-horizontal'
        self.helper.form_tag = False

        self.helper.label_class = 'col-sm-3 col-md-2'
        self.helper.field_class = 'col-sm-9 col-md-8 col-lg-6'
Exemplo n.º 57
0
def program_fixture_generator_json(domain):
    if Program.by_domain(domain).count() == 0:
        return None

    fields = list(PROGRAM_FIELDS)
    fields.append('@id')

    uri = 'jr://fixture/{}'.format(ProgramFixturesProvider.id)
    return {
        'id': 'programs',
        'uri': uri,
        'path': '/programs/program',
        'name': 'Programs',
        'structure': {f: {
            'name': f,
            'no_option': True
        }
                      for f in fields},

        # DEPRECATED PROPERTIES
        'sourceUri': uri,
        'defaultId': 'programs',
        'initialQuery': "instance('programs')/programs/program",
    }
Exemplo n.º 58
0
def program_fixture_generator_json(domain):
    if Program.by_domain(domain).count() == 0:
        return None

    fields = list(PROGRAM_FIELDS)
    fields.append('@id')

    uri = 'jr://fixture/{}'.format(ProgramFixturesProvider.id)
    return {
        'id': 'programs',
        'uri': uri,
        'path': '/programs/program',
        'name': 'Programs',
        'structure': {
            f: {
                'name': f,
                'no_option': True
            } for f in fields},

        # DEPRECATED PROPERTIES
        'sourceUri': uri,
        'defaultId': 'programs',
        'initialQuery': "instance('programs')/programs/program",
    }