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 )
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 )
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)
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'
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)
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'
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' )
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'
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'
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)
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)
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]) )
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' )
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
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 )
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
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
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
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 []
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]))
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]))
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
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]))
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 })
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
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]))
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]) )
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
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
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 )
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()
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 []
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()
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)
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}, }
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
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]) )
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]) )
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
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
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
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]))
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 []
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)
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)
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 })
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'
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", }
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", }