def test_case_group_recipient_with_user_data_filter(self): # The user data filter should have no effect here because all # the recipients are cases. schedule = TimedSchedule.create_simple_daily_schedule( self.domain, TimedEvent(time=time(9, 0)), SMSContent(message={'en': 'Hello'}) ) schedule.user_data_filter = {'role': ['nurse']} schedule.save() with create_case(self.domain, 'person') as case: case_group = CommCareCaseGroup(domain=self.domain, cases=[case.case_id]) case_group.save() self.addCleanup(case_group.delete) instance = CaseTimedScheduleInstance( domain=self.domain, timed_schedule_id=schedule.schedule_id, recipient_type=ScheduleInstance.RECIPIENT_TYPE_CASE_GROUP, recipient_id=case_group.get_id, ) recipients = list(instance.expand_recipients()) self.assertEqual(len(recipients), 1) self.assertEqual(recipients[0].case_id, case.case_id)
def test_case_group(self): group = CommCareCaseGroup(name='A', domain=self.domain, cases=['A', 'B']) group.save() self.addCleanup(group.delete) self._test_doc(group.get_id, "CommCareCaseGroup")
def create_group(self, domain): group = CommCareCaseGroup( name=self.cleaned_data['name'], domain=domain ) group.save() return group
def handle(self, *labels, **options): existing_samples = CommCareCaseGroup.get_db().view( 'reminders/sample_by_domain', startkey=[], endkey=[{}], include_docs=True ).all() print "Found %d SurveySamples to migrate..." % len(existing_samples) print "Migrating" for sample in existing_samples: try: sample_doc = sample["doc"] sample_doc["timezone"] = sample_doc.get("time_zone") del sample_doc["time_zone"] sample_doc["cases"] = sample_doc.get("contacts", []) del sample_doc["contacts"] sample_doc["doc_type"] = CommCareCaseGroup.__name__ case_group = CommCareCaseGroup.wrap(sample_doc) case_group.save() sys.stdout.write('.') except Exception: sys.stdout.write('!') sys.stdout.flush() print "\nMigration complete."
def test_get_docs_in_domain_by_class(self): group = Group(domain=self.domain) case_group = CommCareCaseGroup(name='a group', domain=self.domain) group.save() case_group.save() self.addCleanup(group.delete) self.addCleanup(case_group.delete) [group2] = get_docs_in_domain_by_class(self.domain, Group) self.assertEqual(group2.to_json(), group.to_json()) [case_group2] = get_docs_in_domain_by_class(self.domain, CommCareCaseGroup) self.assertEqual(case_group.to_json(), case_group2.to_json())
def setUpClass(cls): super(DBAccessorsTest, cls).setUpClass() cls.domain = 'case-group-test' cls.case_groups = [ CommCareCaseGroup(name='A', domain=cls.domain, cases=['A', 'B']), CommCareCaseGroup(name='b', domain=cls.domain, cases=['B', 'C']), CommCareCaseGroup(name='C', domain=cls.domain, cases=['A', 'D']), CommCareCaseGroup(name='D', domain=cls.domain, cases=['B', 'C']), CommCareCaseGroup(name='E', domain=cls.domain + 'x', cases=['B', 'C']), ] for group in cls.case_groups: # Clear cache and save group.save()
def add_cases_to_case_group(domain, case_group_id, uploaded_data): response = {"errors": [], "success": []} try: case_group = CommCareCaseGroup.get(case_group_id) except ResourceNotFound: response["errors"].append(_("The case group was not found.")) return response for row in uploaded_data: identifier = row.get("case_identifier") case = None if identifier is not None: case = get_case_by_identifier(domain, str(identifier)) if not case: response["errors"].append(_("Could not find case with identifier '%s'." % identifier)) elif case.doc_type != "CommCareCase": response["errors"].append(_("It looks like the case with identifier '%s' is deleted" % identifier)) elif case._id in case_group.cases: response["errors"].append(_("A case with identifier %s already exists in this group." % identifier)) else: case_group.cases.append(case._id) response["success"].append(_("Case with identifier '%s' has been added to this group." % identifier)) if response["success"]: case_group.save() return response
def setUpClass(cls): super(SchedulingRecipientTest, cls).setUpClass() cls.domain_obj = create_domain(cls.domain) cls.location_types = setup_location_types(cls.domain, ['country', 'state', 'city']) cls.country_location = make_loc('usa', domain=cls.domain, type='country') cls.state_location = make_loc('ma', domain=cls.domain, type='state', parent=cls.country_location) cls.city_location = make_loc('boston', domain=cls.domain, type='city', parent=cls.state_location) cls.mobile_user = CommCareUser.create(cls.domain, 'mobile', 'abc') cls.mobile_user.set_location(cls.city_location) cls.mobile_user2 = CommCareUser.create(cls.domain, 'mobile2', 'abc') cls.mobile_user2.set_location(cls.state_location) cls.web_user = WebUser.create(cls.domain, 'web', 'abc') cls.group = Group(domain=cls.domain, users=[cls.mobile_user.get_id]) cls.group.save() cls.case_group = CommCareCaseGroup(domain=cls.domain) cls.case_group.save()
def add_cases_to_case_group(domain, case_group_id, uploaded_data, progress_tracker): response = { 'errors': [], 'success': [], } try: case_group = CommCareCaseGroup.get(case_group_id) except ResourceNotFound: response['errors'].append(_("The case group was not found.")) return response num_rows = len(uploaded_data) progress_tracker(0, num_rows) for row_number, row in enumerate(uploaded_data): identifier = row.get('case_identifier') case = None if identifier is not None: case = get_case_by_identifier(domain, str(identifier)) if not case: response['errors'].append( _("Could not find case with identifier '{}'.").format( identifier)) elif case.doc_type != 'CommCareCase': response['errors'].append( _("It looks like the case with identifier '{}' " "is marked as deleted.").format(identifier))
def get_recipient_info(self, recipient_doc_type, recipient_id, contact_cache): if recipient_doc_type in ['SQLLocation']: return self.get_orm_recipient_info(recipient_doc_type, recipient_id, contact_cache) if recipient_id in contact_cache: return contact_cache[recipient_id] doc = None if recipient_id not in [None, ""]: try: if recipient_doc_type.startswith('CommCareCaseGroup'): doc = CommCareCaseGroup.get(recipient_id) elif recipient_doc_type.startswith('CommCareCase'): doc = CommCareCase.get(recipient_id) elif recipient_doc_type in ('CommCareUser', 'WebUser'): doc = CouchUser.get_by_user_id(recipient_id) elif recipient_doc_type.startswith('Group'): doc = Group.get(recipient_id) except Exception: pass doc_info = None if doc: try: doc_info = get_doc_info(doc.to_json(), self.domain) except DomainMismatchException: # This can happen, for example, if a WebUser was sent an SMS # and then they unsubscribed from the domain. If that's the # case, we'll just leave doc_info as None and no contact link # will be displayed. pass contact_cache[recipient_id] = doc_info return doc_info
def get_recipient_info(self, recipient_doc_type, recipient_id, contact_cache): if recipient_doc_type in ['SQLLocation']: return self.get_orm_recipient_info(recipient_doc_type, recipient_id, contact_cache) if recipient_id in contact_cache: return contact_cache[recipient_id] doc = None if recipient_id not in [None, ""]: try: if recipient_doc_type.startswith('CommCareCaseGroup'): doc = CommCareCaseGroup.get(recipient_id) elif recipient_doc_type.startswith('CommCareCase'): doc = CommCareCase.get(recipient_id) elif recipient_doc_type in ('CommCareUser', 'WebUser'): doc = CouchUser.get_by_user_id(recipient_id) elif recipient_doc_type.startswith('Group'): doc = Group.get(recipient_id) except Exception: pass if doc: doc_info = get_doc_info(doc.to_json(), self.domain) else: doc_info = None contact_cache[recipient_id] = doc_info return doc_info
def get_recipient_info(self, recipient_doc_type, recipient_id, contact_cache): if recipient_id in contact_cache: return contact_cache[recipient_id] doc = None if recipient_id not in [None, ""]: try: if recipient_doc_type.startswith('CommCareCaseGroup'): doc = CommCareCaseGroup.get(recipient_id) elif recipient_doc_type.startswith('CommCareCase'): doc = CommCareCase.get(recipient_id) elif recipient_doc_type in ('CommCareUser', 'WebUser'): doc = CouchUser.get_by_user_id(recipient_id) elif recipient_doc_type.startswith('Group'): doc = Group.get(recipient_id) except Exception: pass if doc: doc_info = get_doc_info(doc.to_json(), self.domain) else: doc_info = None contact_cache[recipient_id] = doc_info return doc_info
def get_deleted_item_data(self, item_id): case_group = CommCareCaseGroup.get(item_id) item_data = self._get_item_data(case_group) case_group.soft_delete() return { 'itemData': item_data, 'template': 'deleted-group-template', }
def get_number_of_case_groups_in_domain(domain): data = CommCareCaseGroup.get_db().view( 'casegroups/groups_by_domain', startkey=[domain], endkey=[domain, {}], reduce=True ).first() return data['value'] if data else 0
def clean(self): cleaned_data = super(UpdateCaseGroupForm, self).clean() try: self.current_group = CommCareCaseGroup.get(self.cleaned_data.get('item_id')) except AttributeError: raise forms.ValidationError(_("Please include the case group ID.")) except ResourceNotFound: raise forms.ValidationError(_("A case group was not found with that ID.")) return cleaned_data
def clean(self): cleaned_data = super(UpdateCaseGroupForm, self).clean() try: self.current_group = CommCareCaseGroup.get(self.cleaned_data.get('item_id')) except AttributeError: raise forms.ValidationError("You're not passing in the group's id!") except ResourceNotFound: raise forms.ValidationError("This case group was not found in our database!") return cleaned_data
def recipient(self): if self.recipient_type == self.RECIPIENT_TYPE_CASE: try: case = CaseAccessors(self.domain).get_case(self.recipient_id) except CaseNotFound: return None if case.domain != self.domain: return None return case elif self.recipient_type == self.RECIPIENT_TYPE_MOBILE_WORKER: user = CouchUser.get_by_user_id(self.recipient_id, domain=self.domain) if not isinstance(user, CommCareUser): return None return user elif self.recipient_type == self.RECIPIENT_TYPE_WEB_USER: user = CouchUser.get_by_user_id(self.recipient_id, domain=self.domain) if not isinstance(user, WebUser): return None return user elif self.recipient_type == self.RECIPIENT_TYPE_CASE_GROUP: try: group = CommCareCaseGroup.get(self.recipient_id) except ResourceNotFound: return None if group.domain != self.domain: return None return group elif self.recipient_type == self.RECIPIENT_TYPE_USER_GROUP: try: group = Group.get(self.recipient_id) except ResourceNotFound: return None if group.domain != self.domain: return None return group elif self.recipient_type == self.RECIPIENT_TYPE_LOCATION: location = SQLLocation.by_location_id(self.recipient_id) if location is None: return None if location.domain != self.domain: return None return location else: raise UnknownRecipientType(self.recipient_type)
def setUpClass(cls): super(SchedulingRecipientTest, cls).setUpClass() cls.domain_obj = create_domain(cls.domain) cls.location_types = setup_location_types(cls.domain, ['country', 'state', 'city']) cls.country_location = make_loc('usa', domain=cls.domain, type='country') cls.state_location = make_loc('ma', domain=cls.domain, type='state', parent=cls.country_location) cls.city_location = make_loc('boston', domain=cls.domain, type='city', parent=cls.state_location) cls.mobile_user = CommCareUser.create(cls.domain, 'mobile', 'abc') cls.mobile_user.set_location(cls.city_location) cls.mobile_user2 = CommCareUser.create(cls.domain, 'mobile2', 'abc') cls.mobile_user2.set_location(cls.state_location) cls.mobile_user3 = CommCareUser.create(cls.domain, 'mobile3', 'abc') cls.mobile_user3.user_data['role'] = 'pharmacist' cls.mobile_user3.save() cls.mobile_user4 = CommCareUser.create(cls.domain, 'mobile4', 'abc') cls.mobile_user4.user_data['role'] = 'nurse' cls.mobile_user4.save() cls.mobile_user5 = CommCareUser.create(cls.domain, 'mobile5', 'abc') cls.mobile_user5.user_data['role'] = ['nurse', 'pharmacist'] cls.mobile_user5.save() cls.web_user = WebUser.create(cls.domain, 'web', 'abc') cls.web_user2 = WebUser.create(cls.domain, 'web2', 'abc') cls.web_user2.user_data['role'] = 'nurse' cls.web_user2.save() cls.group = Group(domain=cls.domain, users=[cls.mobile_user.get_id]) cls.group.save() cls.group2 = Group( domain=cls.domain, users=[ cls.mobile_user.get_id, cls.mobile_user3.get_id, cls.mobile_user4.get_id, cls.mobile_user5.get_id, ] ) cls.group2.save() cls.case_group = CommCareCaseGroup(domain=cls.domain) cls.case_group.save() cls.process_pillow_changes = process_pillow_changes('DefaultChangeFeedPillow') cls.process_pillow_changes.add_pillow(get_case_messaging_sync_pillow())
def get_case_groups_in_domain(domain, limit=None, skip=None): extra_kwargs = {} if limit is not None: extra_kwargs['limit'] = limit if skip is not None: extra_kwargs['skip'] = skip return CommCareCaseGroup.view('casegroups/groups_by_domain', startkey=[domain], endkey=[domain, {}], include_docs=True, reduce=False, **extra_kwargs).all()
def setUpClass(cls): cls.domain = 'skbanskdjoasdkng' cls.cases = [ CommCareCase(name='A', domain=cls.domain), CommCareCase(name='B', domain=cls.domain), CommCareCase(name='C', domain=cls.domain), CommCareCase(name='D', domain=cls.domain), CommCareCase(name='X', domain='bunny'), ] CommCareCase.get_db().bulk_save(cls.cases) cls.case_groups = [ CommCareCaseGroup(name='alpha', domain=cls.domain, cases=[cls.cases[0]._id, cls.cases[1]._id]), CommCareCaseGroup(name='beta', domain=cls.domain, cases=[cls.cases[2]._id, cls.cases[3]._id]), CommCareCaseGroup(name='gamma', domain=cls.domain, cases=[cls.cases[0]._id, cls.cases[3]._id]), CommCareCaseGroup(name='delta', domain=cls.domain, cases=[cls.cases[1]._id, cls.cases[2]._id]), ] CommCareCaseGroup.get_db().bulk_save(cls.case_groups)
def get_case_group_meta_in_domain(domain): """ returns a list (id, name) tuples sorted by name ideal for creating a user-facing dropdown menu, etc. """ return [(r['id'], r['key'][1]) for r in CommCareCaseGroup.view( 'casegroups/groups_by_domain', startkey=[domain], endkey=[domain, {}], include_docs=False, reduce=False, ).all()]
def get_case_groups_in_domain(domain, limit=None, skip=None): extra_kwargs = {} if limit is not None: extra_kwargs['limit'] = limit if skip is not None: extra_kwargs['skip'] = skip return CommCareCaseGroup.view( 'casegroups/groups_by_domain', startkey=[domain], endkey=[domain, {}], include_docs=True, reduce=False, **extra_kwargs ).all()
def recipient(self): if self.recipient_type == 'CommCareCase': return CaseAccessors(self.domain).get_case(self.recipient_id) elif self.recipient_type == 'CommCareUser': return CommCareUser.get(self.recipient_id) elif self.recipient_type == 'WebUser': return WebUser.get(self.recipient_id) elif self.recipient_type == 'CommCareCaseGroup': return CommCareCaseGroup.get(self.recipient_id) elif self.recipient_type == 'Group': return Group.get(self.recipient_id) elif self.recipient_type == 'Location': return SQLLocation.by_location_id(self.recipient_id) else: raise UnknownRecipientType(self.recipient_type)
def recipient(self): if self.recipient_type == self.RECIPIENT_TYPE_CASE: return CaseAccessors(self.domain).get_case(self.recipient_id) elif self.recipient_type == self.RECIPIENT_TYPE_MOBILE_WORKER: return CommCareUser.get(self.recipient_id) elif self.recipient_type == self.RECIPIENT_TYPE_WEB_USER: return WebUser.get(self.recipient_id) elif self.recipient_type == self.RECIPIENT_TYPE_CASE_GROUP: return CommCareCaseGroup.get(self.recipient_id) elif self.recipient_type == self.RECIPIENT_TYPE_USER_GROUP: return Group.get(self.recipient_id) elif self.recipient_type == self.RECIPIENT_TYPE_LOCATION: return SQLLocation.by_location_id(self.recipient_id) else: raise UnknownRecipientType(self.recipient_type)
def get_recipient_info(self, domain, recipient_doc_type, recipient_id, contact_cache): """ We need to accept domain as an arg here for admin reports that extend this base. """ if recipient_id in contact_cache: return contact_cache[recipient_id] couch_object = None sql_object = None if recipient_id: try: if recipient_doc_type.startswith('CommCareCaseGroup'): couch_object = CommCareCaseGroup.get(recipient_id) elif recipient_doc_type.startswith('CommCareCase'): obj = CaseAccessors(domain).get_case(recipient_id) if isinstance(obj, CommCareCase): couch_object = obj elif isinstance(obj, CommCareCaseSQL): sql_object = obj elif recipient_doc_type in ('CommCareUser', 'WebUser'): couch_object = CouchUser.get_by_user_id(recipient_id) elif recipient_doc_type.startswith('Group'): couch_object = Group.get(recipient_id) elif recipient_doc_type == 'SQLLocation': sql_object = SQLLocation.objects.get(location_id=recipient_id) except (ResourceNotFound, CaseNotFound, ObjectDoesNotExist): pass doc_info = None if couch_object: try: doc_info = get_doc_info(couch_object.to_json(), domain) except DomainMismatchException: # This can happen, for example, if a WebUser was sent an SMS # and then they unsubscribed from the domain. If that's the # case, we'll just leave doc_info as None and no contact link # will be displayed. pass if sql_object: doc_info = get_object_info(sql_object) contact_cache[recipient_id] = doc_info return doc_info
def add_cases_to_case_group(domain, case_group_id, uploaded_data): response = { 'errors': [], 'success': [], } try: case_group = CommCareCaseGroup.get(case_group_id) except ResourceNotFound: response['errors'].append(_("The case group was not found.")) return response for row in uploaded_data: identifier = row.get('case_identifier') case = None if identifier is not None: case = get_case_by_identifier(domain, str(identifier)) if not case: response['errors'].append(_("Could not find case with identifier '%s'." % identifier)) elif case.doc_type != 'CommCareCase': response['errors'].append(_("It looks like the case with identifier '%s' is deleted" % identifier))
def tearDownClass(cls): CommCareCase.get_db().bulk_delete(cls.cases) CommCareCaseGroup.get_db().bulk_delete(cls.case_groups) super(DBAccessorsTest, cls).tearDownClass()
def tearDownClass(cls): CommCareCase.get_db().bulk_delete(cls.cases) CommCareCaseGroup.get_db().bulk_delete(cls.case_groups)
def setUpClass(cls): super(SchedulingRecipientTest, cls).setUpClass() cls.domain_obj = create_domain(cls.domain) cls.location_types = setup_location_types(cls.domain, ['country', 'state', 'city']) cls.country_location = make_loc('usa', domain=cls.domain, type='country') cls.state_location = make_loc('ma', domain=cls.domain, type='state', parent=cls.country_location) cls.city_location = make_loc('boston', domain=cls.domain, type='city', parent=cls.state_location) cls.mobile_user = CommCareUser.create(cls.domain, 'mobile', 'abc', None, None) cls.mobile_user.set_location(cls.city_location) cls.mobile_user2 = CommCareUser.create(cls.domain, 'mobile2', 'abc', None, None) cls.mobile_user2.set_location(cls.state_location) cls.mobile_user3 = CommCareUser.create(cls.domain, 'mobile3', 'abc', None, None, metadata={ 'role': 'pharmacist', }) cls.mobile_user3.save() cls.mobile_user4 = CommCareUser.create(cls.domain, 'mobile4', 'abc', None, None, metadata={ 'role': 'nurse', }) cls.mobile_user4.save() cls.mobile_user5 = CommCareUser.create(cls.domain, 'mobile5', 'abc', None, None, metadata={ 'role': ['nurse', 'pharmacist'], }) cls.mobile_user5.save() full_username = normalize_username('mobile', cls.domain) cls.full_mobile_user = CommCareUser.create(cls.domain, full_username, 'abc', None, None) cls.definition = CustomDataFieldsDefinition( domain=cls.domain, field_type=UserFieldsView.field_type) cls.definition.save() cls.definition.set_fields([ Field( slug='role', label='Role', ), ]) cls.definition.save() cls.profile = CustomDataFieldsProfile( name='nurse_profile', fields={'role': ['nurse']}, definition=cls.definition, ) cls.profile.save() cls.mobile_user6 = CommCareUser.create(cls.domain, 'mobile6', 'abc', None, None, metadata={ PROFILE_SLUG: cls.profile.id, }) cls.mobile_user5.save() cls.web_user = WebUser.create(cls.domain, 'web', 'abc', None, None) cls.web_user2 = WebUser.create(cls.domain, 'web2', 'abc', None, None, metadata={ 'role': 'nurse', }) cls.web_user2.save() cls.group = Group(domain=cls.domain, users=[cls.mobile_user.get_id]) cls.group.save() cls.group2 = Group(domain=cls.domain, users=[ cls.mobile_user.get_id, cls.mobile_user3.get_id, cls.mobile_user4.get_id, cls.mobile_user5.get_id, cls.mobile_user6.get_id, ]) cls.group2.save() cls.case_group = CommCareCaseGroup(domain=cls.domain) cls.case_group.save() cls.process_pillow_changes = process_pillow_changes( 'DefaultChangeFeedPillow') cls.process_pillow_changes.add_pillow(get_case_messaging_sync_pillow())
def get_number_of_case_groups_in_domain(domain): data = CommCareCaseGroup.get_db().view('casegroups/groups_by_domain', startkey=[domain], endkey=[domain, {}], reduce=True).first() return data['value'] if data else 0
return case elif self.recipient_type == self.RECIPIENT_TYPE_MOBILE_WORKER: user = CouchUser.get_by_user_id(self.recipient_id, domain=self.domain) if not isinstance(user, CommCareUser): return None return user elif self.recipient_type == self.RECIPIENT_TYPE_WEB_USER: user = CouchUser.get_by_user_id(self.recipient_id, domain=self.domain) if not isinstance(user, WebUser): return None return user elif self.recipient_type == self.RECIPIENT_TYPE_CASE_GROUP: try: group = CommCareCaseGroup.get(self.recipient_id) except ResourceNotFound: return None if group.domain != self.domain: return None return group elif self.recipient_type == self.RECIPIENT_TYPE_USER_GROUP: try: group = Group.get(self.recipient_id) except ResourceNotFound: return None if group.domain != self.domain: return None
def case_groups(self): return [CommCareCaseGroup.get(g) for g in self.case_group_ids]
def case_group(self): try: return CommCareCaseGroup.get(self.group_id) except ResourceNotFound: raise Http404()