def setUp(self): self.location_name = 'Kampala' text = "NECOC.%s. fire baba fire" % self.location_name self.date_time = datetime.datetime(2014, 9, 17, 16, 0, 49, 807000) phone_number = "+256775019449" self.message = dict(phone_no=phone_number, text=text, received_at=self.date_time, relayer_id=234, run_id=23243) self.kampala = Location(**dict( name=self.location_name, parent=None, type='district')).save() self.bukoto_name = 'Bukoto' self.bukoto = Location(**dict( name=self.bukoto_name, parent=None, type='district')).save() text = "NECOC.%s. flood" % self.bukoto_name self.message_bukoto = dict(phone_no=phone_number, text=text, received_at=self.date_time, relayer_id=234, run_id=23243) self.disaster_type = DisasterType( **dict(name='Flood', description="Some flood")) self.disaster_type.save() self.disaster_attr = dict(name=self.disaster_type, locations=[self.kampala], description="Big Flood", date="2014-12-01", status="Assessment") self.disaster_attr_bukoto = self.disaster_attr.copy() self.disaster_attr_bukoto["locations"] = [self.bukoto]
def setUp(self): self.date_time = datetime.datetime(2014, 9, 17, 16, 0, 49, 807000) self.date_time = self.date_time.replace(tzinfo=pytz.utc) self.district = Location(**dict(name='Kampala', parent=None, type='district')).save() self.village = Location(**dict(name='Bukoto', parent=self.district, type='village')).save() self.mobile_user = UserProfile(**dict(name='timothy', phone="+256775019449", location=self.village, email=None)).save() self.fire_type = DisasterType(**dict(name="Fire", description="Fire")).save() disaster_attributes = dict(name=self.fire_type, locations=[self.district], description="Big Fire", date="2014-12-01 00:00:00", status="Assessment") self.disaster = Disaster(**disaster_attributes).save() self.text_format = "NECOC.%s. There is a fire" text = self.text_format % self.village.name self.expected_message = dict(phone="+256775019449", text=text, time=self.date_time, relayer=234, run=23243) self.message = dict(phone_no="+256775019449", text=text, received_at=self.date_time, relayer_id=234, run_id=23243) self.api_user, created = User.objects.get_or_create(**dict(username='******')) self.auto_message_response = dict(phone_numbers=[u'+256775019449'], text=settings.AUTO_RESPONSE_MESSAGE) self.cao_group, created = Group.objects.get_or_create(name='CAO') self.cao_user = User.objects.create(username='******', group=self.cao_group, email='*****@*****.**') self.cao_user.set_password('password') self.login_url = '/login/' self.login_data = { 'username': '******', 'password': '******' } AdminSetting(**dict(name='enable_automatic_response')).save() AdminSetting(**dict(name='enable_volunteer_profiles')).save()
def handle(self, *args, **options): if not len(args): user = User.objects(username='******').first() or User( username='******').save() user.group = Group.objects(name='Administrator').first() user.set_password('password') location = Location.objects(type='district').first() or Location( name='Kampala', type='district').save() profile = UserProfile.objects(phone='N/A').first() or UserProfile( phone='N/A', name='Admin', location=location, email='*****@*****.**').save() profile.user = user profile.save() else: user = User.objects(username=args[0]).first() or User( username=args[0]).save() user.group = Group.objects(name='Administrator').first() user.set_password(args[1]) location = Location.objects(name=args[4]).first() or Location( name=args[4], type='district').save() profile = UserProfile.objects( phone=args[5]).first() or UserProfile( phone=args[5], name=args[3], location=location, email=args[2]).save().save() profile.user = user profile.save() self.stdout.write('Successfully created superuser')
def setUp(self): date_time = datetime.datetime(2014, 9, 17, 16, 0, 49, 807000) phone_number = "+256775019449" self.district = Location( **dict(name='Kampala', parent=None, type='district')).save() self.village = Location(**dict( name='Bukoto', parent=self.district, type='village')).save() self.mobile_user = UserProfile(**dict(name='timothy', phone=phone_number, location=self.village, email=None)).save() self.mobile_user2 = UserProfile(**dict( name='timothy2', phone='12344', location=self.village, email=None)).save() poll_attr = dict(name="Disaster", question="How many disasters are in your area?", keyword="some_word", target_locations=[str(self.village.id)]) self.poll = Poll(**poll_attr).save() self.poll_response_attr = dict(phone_no=phone_number, text="NECOCPoll %s whatever" % self.poll['keyword'], received_at=date_time, relayer_id=234, run_id=23243, poll=self.poll) self.delimiter_line = 'sep=;' self.headings = "Respondent;Answer;Location;Responded on"
def setUp(self): kampala = Location(**dict(name='Kampala', parent=None, type='district')).save() gulu = Location(**dict(name='Gulu', parent=None, type='district')).save() self.target_locations = [str(kampala.id), str(gulu.id)] self.poll = dict(name="Disaster", question="How many disasters are in your area?", keyword="some word", target_locations=self.target_locations) self.serialized_poll = dict(name=u'Disaster', question=u'How many disasters are in your area?', keyword=u'some word', target_locations=self.target_locations)
def setUp(self): self.disaster_type = DisasterType(**dict(name='Flood', description="Some flood")).save() self.kampala = Location(**dict(name='Kampala', type='district', parent=None)).save() self.bukoto = Location(**dict(name='Bukoto', type='subcounty', parent=self.kampala)).save() self.disaster_attr = dict(name=self.disaster_type, locations=[self.bukoto], description="Big Flood", date="2014-12-01", status="Assessment")
def setUp(self): self.login_user() self.kampala = Location(name='Kampala', parent=None, type='district').save() gulu = Location( **(dict(name='Gulu', parent=None, type='district'))).save() self.amuru = Location( **(dict(name='Amuru', parent=None, type='district'))).save() self.ludara_subcounty = Location( **(dict(name='LUDARA', parent=self.amuru.id, type='subcounty') )).save() self.ddmc_group, created = Group.objects.get_or_create(name='DDMC') user_attr = dict(name='timothy', phone='+256775019449', location=gulu, email=None) UserProfile(**(user_attr)).save() self.bukoto = Location(name='Bukoto', parent=self.kampala, type='subcounty').save() bukoto_user_attr = dict(name='timothy', phone='+250775019449', location=self.bukoto, email=None) UserProfile(**bukoto_user_attr).save() bukoto_user_attr2 = bukoto_user_attr.copy() bukoto_user_attr2['phone'] = '+4343245552' UserProfile(**bukoto_user_attr2).save() self.target_locations = [str(self.kampala.id), str(gulu.id)] self.poll_to_post = dict( name="Disaster", question="How many disasters are in your area?", keyword="some_word", target_locations=self.target_locations) self.poll_to_post2 = dict( name="Disaster2", question="How many disasters are in your area?", keyword="some_word2", target_locations=[str(self.amuru.id)]) self.poll_to_post3 = dict( name="Disaster3", question="How many disasters are in your area?", keyword="some_word3", target_locations=[str(self.ludara_subcounty.id)]) self.headers = { 'Authorization': 'Token ' + API_TOKEN, 'content-type': 'application/json' } self.poll_to_send = dict( text= 'How many disasters are in your area? Reply with: POLL some_word', phone_numbers=['+256775019449'])
def setUp(self): self.phone_number = "256775019449" kampala = Location(**dict(name='Kampala', parent=None, type='district')).save() gulu = Location(**dict(name='Gulu', parent=None, type='district')).save() self.village = Location(**dict(name='Bukoto', parent=kampala, type='subcounty')).save() self.mobile_user = UserProfile(**dict(name='timothy', phone=self.phone_number, location=self.village, email=None)).save() self.mobile_user2 = UserProfile(**dict(name='mobile_user2', phone='256775019441', location=self.village, email=None)).save() self.mobile_user3 = UserProfile(**dict(name='mobile_user3', phone='256775019442', location=gulu, email=None)).save() self.mobile_user4 = UserProfile(**dict(name='mobile_user4', phone='256775019443', location=kampala, email=None)).save() self.target_locations = [str(kampala.id), str(gulu.id)] self.poll = dict(name="Disaster", question="How many disasters are in your area?", keyword="some word", target_locations=self.target_locations)
def setUp(self): self.disaster_type = DisasterType( **dict(name='Flood', description="Some flood")) self.disaster_type.save() self.district = Location( **dict(name='Kampala', type='district', parent=None)).save()
def test_should_retrieve_message_stats_in_subcounties_when_district_name_supplied( self): RapidProMessage(**self.message).save() bugolobi_name = 'Bugolobi' bugolobi = Location(**dict( name=bugolobi_name, parent=self.kampala, type='subcounty')).save() text = "NECOC.%s. flood" % bugolobi_name message_bugolobi = dict(phone_no='123444', text=text, received_at=self.date_time, relayer_id=234, run_id=23243) RapidProMessage(**message_bugolobi).save() Disaster(**self.disaster_attr).save() disaster_attr_bugolobi = self.disaster_attr.copy() disaster_attr_bugolobi["locations"] = [bugolobi] Disaster(**disaster_attr_bugolobi).save() multi_location_stats_service = MultiLocationStatsService( self.kampala.name) stats = multi_location_stats_service.stats() self.assertEqual(1, len(stats)) self.assertEqual(1, stats['Bugolobi'].messages.count) self.assertEqual(50, stats['Bugolobi'].messages.percentage) self.assertEqual(1, stats['Bugolobi'].disasters.count) self.assertEqual(50, stats['Bugolobi'].disasters.percentage)
def test_location_filter_should_return_messages_in_all_children_location_and_in_order(self): Disaster.objects.delete() #Remove all disasters to avoid interference with this test bukoto_message = RapidProMessage(**self.message).save() wakiso = Location(**(dict(name='Wakiso', type='village', parent=self.district))).save() other_phone_number = '1234' one_hour_later_date = self.date_time + datetime.timedelta(hours=1) one_hour_later_date = one_hour_later_date.replace(tzinfo=pytz.utc) other_message_options = dict(phone_no=other_phone_number, text=self.text_format % wakiso.name, received_at=one_hour_later_date, relayer_id=234, run_id=23243) user_profile = UserProfile(**dict(name='timothy', phone=other_phone_number, location=wakiso)).save() wakiso_message = RapidProMessage(**other_message_options).save() response = self.client.get(self.API_ENDPOINT, {"location": self.district.id, "format": "json"}) wakiso_expected_message = {'phone': other_phone_number, 'time': one_hour_later_date, 'relayer': 234, 'run': 23243, 'text': self.text_format % wakiso.name, 'disaster': None} wakiso_expected_message = dict(wakiso_expected_message.items() + { 'source': user_profile.name, 'id': str(wakiso_message.id), 'location': str(wakiso), 'profile_id': str(user_profile.id), 'auto_associated': False}.items()) bukoto_expected_message = dict(self.expected_message.items() + { 'source': self.mobile_user.name, 'id': str(bukoto_message.id), 'disaster': None, 'location': str(self.village), 'profile_id': str(self.mobile_user.id), 'auto_associated': False}.items()) self.assertEqual(200, response.status_code) self.assertEqual(2, len(response.data)) self.assertEqual(wakiso_expected_message, response.data[0]) self.assertEqual(bukoto_expected_message, response.data[1])
def setUp(self): self.district = Location( **dict(name='Kampala', type='district', parent=None)) self.district.save() self.disaster_type = DisasterType( **dict(name="Fire", description="Fire")) self.disaster_type.save() self.serialized_location = dict(created_at=self.district.created_at, type=self.district.type, name=self.district.name, id=str(self.district.id), latlong=[]) self.serialized_disaster_type = dict( created_at=self.disaster_type.created_at, name=self.disaster_type.name, description=self.disaster_type.description, id=str(self.disaster_type.id)) self.disaster = dict(name=self.disaster_type, locations=[self.district], description="Big Flood", date=datetime.datetime(2014, 12, 1, 11, 3), status="Assessment") self.serialized_disaster = dict(name=self.serialized_disaster_type, locations=[self.serialized_location], description="Big Flood", date="2014-12-01T11:03", status="Assessment")
def test_filter_stats_in_subcounty_by_disaster_type(self): bugolobi_name = 'Bugolobi' bugolobi = Location(**dict( name=bugolobi_name, parent=self.kampala, type='subcounty')).save() Disaster(**self.disaster_attr).save() disaster_attr_bugolobi = self.disaster_attr.copy() disaster_attr_bugolobi["locations"] = [bugolobi] disaster_bugolobi = Disaster(**disaster_attr_bugolobi).save() expected_serialized_data = { 'disasters': { 'count': 1, 'affected': 1, 'types': { 'Flood': 1 } } } url = self.API_ENDPOINT + '?location=%s&format=json&disaster_type=%s' % ( 'Bugolobi', str(self.disaster_type.id)) response = self.client.get(url, format='json') self.assertEqual(200, response.status_code) self.assertEqual(expected_serialized_data, response.data)
def test_should_retrieve_message_stats_in_district(self): bugolobi_name = 'Bugolobi' bugolobi = Location(**dict( name=bugolobi_name, parent=self.kampala, type='subcounty')).save() Disaster(**self.disaster_attr).save() disaster_attr_bugolobi = self.disaster_attr.copy() disaster_attr_bugolobi["locations"] = [bugolobi] Disaster(**disaster_attr_bugolobi).save() expected_serialized_data = { 'disasters': { 'count': 2, 'affected': 2, 'types': { 'Flood': 2 } } } url = '%s?location=%s' % (self.API_ENDPOINT, str(self.kampala.name.lower())) response = self.client.get(url, format='json') self.assertEqual(200, response.status_code) self.assertEqual(expected_serialized_data, response.data)
def setUp(self): self.location_name = 'Kampala' self.date_time = datetime.datetime(2014, 9, 17, 16, 0, 49, 807000) self.kampala = Location(**dict( name=self.location_name, parent=None, type='district')).save() self.bukoto_name = 'Bukoto' self.bukoto = Location(**dict( name=self.bukoto_name, parent=None, type='district')).save() self.disaster_type = DisasterType( **dict(name='Flood', description="Some flood")).save() self.disaster_attr = dict(name=self.disaster_type, locations=[self.kampala], description="Big Flood", date=self.date_time, status="Assessment") self.disaster_attr_bukoto = self.disaster_attr.copy() self.disaster_attr_bukoto["locations"] = [self.bukoto]
def test_reset_password_saves_new_password(self, mock_send_email): district = Location(**dict(name='Kampala', parent=None, type='district')) district.save() profile = UserProfile(name='Andrew', email='*****@*****.**', location=district, phone='2570760540326') user = UserProfileService(profile).setup_new_user('andrew', str((Group.objects().first()).id)) old_password = user.password profile.user = user UserProfileService(profile).reset_password() self.assertNotEqual(old_password, profile.user.password)
def test_mapping_user_id_to_user_profile(self): user = User(username='******').save() location = Location(name='Kampala', type='district').save() profile = UserProfile(phone='N/A', name='Admin', location=location, user=user, email='*****@*****.**').save() self.assertEqual(profile.id, get_profile_id(user))
def test_subcounty_empty_GET_parameter_query(self): bugolobi_name = 'Bugolobi' bugolobi = Location(**dict( name=bugolobi_name, parent=self.kampala, type='subcounty')).save() Disaster(**self.disaster_attr).save() disaster_attr_bugolobi = self.disaster_attr.copy() disaster_attr_bugolobi["locations"] = [bugolobi] Disaster(**disaster_attr_bugolobi).save() expected_serialized_data = { 'disasters': { 'count': 1, 'affected': 1, 'types': { 'Flood': 1 } } } from_ = self.date_time - datetime.timedelta(days=1) from_ = str(from_.date()) to_ = self.date_time + datetime.timedelta(days=1) to_ = str(to_.date()) url = self.API_ENDPOINT + '?location=%s&format=json&from=%s&to=%s&disaster_type=' % ( 'Bugolobi', from_, to_) response = self.client.get(url, format='json') self.assertEqual(200, response.status_code) self.assertEqual(expected_serialized_data, response.data) expected_serialized_data = { 'disasters': { 'count': 0, 'affected': 0, 'types': {} } } url = self.API_ENDPOINT + '?location=%s&format=json&from=%s&disaster_type=&to=' % ( 'Bugolobi', to_) response = self.client.get(url, format='json') self.assertEqual(200, response.status_code) self.assertEqual(expected_serialized_data, response.data) url = self.API_ENDPOINT + '?location=%s&format=json&to=%s' % ( 'Bugolobi', from_) response = self.client.get(url, format='json') self.assertEqual(200, response.status_code) self.assertEqual(expected_serialized_data, response.data)
def setUp(self): self.location_name = 'Kampala' text = "NECOC.%s. fire baba fire" % self.location_name date_time = datetime.datetime(2014, 9, 17, 16, 0, 49, 807000) phone_number = "+256775019449" self.message = dict(phone_no=phone_number, text=text, received_at=date_time, relayer_id=234, run_id=23243) self.district = Location(**dict( name=self.location_name, parent=None, type='district')).save()
def setUp(self): self.login_user() self.district = Location( **dict(name='Kampala', type='district', parent=None)) self.district.save() self.masaka = Location( **dict(name='Masaka', type='district', parent=None)).save() self.subcounty = Location(**dict( name='Nangabo', type='subcounty', parent=self.masaka)).save() self.mobile_user_to_post = dict(name='tim', phone='+256775019500', location=self.district.id, email='*****@*****.**') self.mobile_user = dict(name='timothy', phone='+256775019449', location=self.district, email=None) self.masaka_user = dict(name='Munamasaka', phone='+256775019441', location=self.subcounty, email='*****@*****.**')
def setUp(self): self.date_time = datetime.datetime(2014, 9, 17, 16, 0, 49, 807000) self.date_time = self.date_time.replace(tzinfo=pytz.utc) self.district = Location( **dict(name='Kampala', parent=None, type='district')).save() self.village = Location(**dict( name='Bukoto', parent=self.district, type='village')).save() self.fire_disaster_type = DisasterType( **dict(name='Flood', description="Some flood")).save() self.flood_disaster_type = DisasterType( **dict(name='Fire', description="Some raging fire")).save() self.storm_disaster_type = DisasterType(**dict( name='Storm', description="Heavy rain with thunderstorms")).save() self.fire_disaster = Disaster(**dict(name=self.fire_disaster_type, locations=[self.village], \ status=settings.DISASTER_STATUSES[0], date=self.date_time)).save() self.flood_disaster = Disaster(**dict(name=self.flood_disaster_type, locations=[self.village], \ status=settings.DISASTER_STATUSES[1], date=self.date_time)).save() self.storm_disaster = Disaster(**dict(name=self.storm_disaster_type, locations=[self.village], \ status=settings.DISASTER_STATUSES[0], date=self.date_time)).save() self.text_format = "NECOC.%s. There is a fire" self.text = self.text_format % self.village.name
def test_password_reset_sends_email(self, mock_send_mail, mock_make_password): message = "Andrew blabla http://necoc.org.ug [email protected]" mock_make_password.return_value = 'blabla' district = Location(**dict(name='Kampala', parent=None, type='district')) district.save() profile = UserProfile(name='Andrew', email='*****@*****.**', location=district, phone='2570760540326') user = UserProfileService(profile).setup_new_user('andrew', str((Group.objects().first()).id)) profile.user = user UserProfileService(profile).reset_password() mock_send_mail.assert_any_call('NECOC Password Reset', message, "*****@*****.**", ['*****@*****.**'])
def test_should_return_only_district_messages_for_CAO(self): self.mobile_user.user = self.cao_user self.mobile_user.save() masaka_district = Location(**dict(name='Masaka', parent=None, type='district')).save() masaka_village = Location(**dict(name='Bukasa', parent=masaka_district, type='village')).save() masaka_message = self.message.copy() masaka_message['location'] = masaka_village masaka_message['phone_no'] = "+256775019441" msk_msg = RapidProMessage(**masaka_message).save() kla_msg = RapidProMessage(**self.message).save() login_response = self.client.post(self.login_url, self.login_data) self.assertRedirects(login_response, '/') self.assertTrue('sessionid' in login_response.cookies) response = self.client.get(self.API_ENDPOINT, format='json') self.assertEqual(200, response.status_code) self.assertEqual(1, len(response.data)) self.assertDictContainsSubset(self.expected_message, response.data[0]) self.assertEqual(self.mobile_user.name, response.data[0]['source']) self.assertEqual('Kampala >> Bukoto', response.data[0]['location']) self.assertIsNotNone(response.data[0]['id'])
def test_should_retrieve_disasters_percentage_in_a_location(self): Disaster(**self.disaster_attr).save() attr2 = self.disaster_attr.copy() attr2["locations"] = [ Location(**dict(name='Location that is not Kampala', type='district')).save() ] Disaster(**attr2).save() location_stats_service = LocationStatsService(location=self.district) stats = location_stats_service.aggregate_stats() disasters_stats = stats.disasters self.assertEqual(1, disasters_stats.count) self.assertEqual(50, disasters_stats.percentage)
def setUp(self): self.user = self.login_user() self.district = Location(**dict(name='Kampala', type='district', parent=None)) self.district.save() self.disaster_type = DisasterType(**dict(name="Fire", description="Fire")) self.disaster_type.save() self.disaster_type2 = DisasterType(**dict(name="Flood", description="Flood")) self.disaster_type2.save() self.disaster_to_post = dict(name=str(self.disaster_type.id), locations=[str(self.district.id)], description="Big Flood", date="2014-12-01 00:00:00", status="Assessment") self.disaster = dict(name=self.disaster_type, locations=[self.district], description="Big Flood", date="2014-12-01 00:00:00", status="Assessment") self.mobile_user = UserProfile(**dict(name='timothy', phone="+256775019449", location=self.district, email=None)).save() self.cao_group, created = Group.objects.get_or_create(name='CAO')
def test_should_retrieve_message_count_affected_types_of_a_subcounty(self): Disaster(**self.disaster_attr).save() fire_type = DisasterType(**dict(name='Fire', description="whatever")).save() attr2 = self.disaster_attr.copy() attr2["locations"] = [Location(**dict(name='Location that is not Kampala', type='district')).save()] attr2["name"] = fire_type Disaster(**attr2).save() location_stats_service = StatsSummaryService(location=self.bukoto) stats = location_stats_service.aggregate_stats() disasters_stats = stats.disasters self.assertEqual(1, disasters_stats.count) self.assertEqual(1, disasters_stats.affected) self.assertEqual({'Flood': 1}, disasters_stats.types)
def setUp(self): self.district = Location(**dict( name='Kampala', type='district', parent=None, latlong=[])).save() self.serialized_location = dict(created_at=self.district.created_at, type=self.district.type, name=self.district.name, id=str(self.district.id), latlong=[]) self.mobile_user = dict(name='timothy', phone='+256775019449', location=self.district, email="*****@*****.**") self.serialized_mobile_user = dict(name='timothy', phone='+256775019449', location=self.serialized_location, email="*****@*****.**")
def test_should_retrieve_message_count_affected_types_countrywide(self): wakiso = Location(**dict(name='Wakiso', type='district', parent=None)).save() wakiso_disaster_attr = self.disaster_attr.copy() wakiso_disaster_attr['locations'] = [wakiso] Disaster(**wakiso_disaster_attr).save() Disaster(**self.disaster_attr).save() attr2 = self.disaster_attr.copy() attr2["status"] = "Closed" Disaster(**attr2).save() location_stats_service = StatsSummaryService(location=None) stats = location_stats_service.aggregate_stats() disasters_stats = stats.disasters self.assertEqual(3, disasters_stats.count) self.assertEqual(2, disasters_stats.affected) self.assertEqual({'Flood': 3}, disasters_stats.types)
def test_filter_stats_in_subcounties_in_district_by_disaster_type(self): RapidProMessage(**self.message).save() bugolobi_name = 'Bugolobi' bugolobi = Location(**dict( name=bugolobi_name, parent=self.kampala, type='subcounty')).save() text = "NECOC.%s. flood" % bugolobi_name message_bugolobi = dict(phone_no='123444', text=text, received_at=self.date_time, relayer_id=234, run_id=23243) Disaster(**self.disaster_attr).save() disaster_attr_bugolobi = self.disaster_attr.copy() disaster_attr_bugolobi["locations"] = [bugolobi] disaster_bugolobi = Disaster(**disaster_attr_bugolobi).save() message_bugolobi['disaster'] = disaster_bugolobi RapidProMessage(**message_bugolobi).save() expected_serialized_data = { 'bugolobi': { 'messages': { 'count': 1, 'percentage': 100, 'reporter_ratio': 0 }, 'disasters': { 'count': 1, 'percentage': 50, 'reporter_ratio': 0 } } } url = self.API_ENDPOINT + '%s/?format=json&disaster_type=%s' % (str( self.kampala.name.lower()), str(self.disaster_type.id)) response = self.client.get(url, format='json') self.assertEqual(200, response.status_code) self.assertEqual(expected_serialized_data, response.data)
def test_get_disaster_from_a_location(self): attributes = dict(name=self.disaster_type, locations=[self.district], description="Big Flood", date="2014-12-01", status="Assessment") disaster1 = Disaster(**attributes).save() attr2 = attributes.copy() attr2["locations"] = [ Location(**dict(name='Some other location', type='district', parent=None)).save() ] disaster2 = Disaster(**attr2).save() location_disasters = Disaster.from_(self.district) self.assertEqual(1, location_disasters.count()) self.assertIn(disaster1, location_disasters) self.assertNotIn(disaster2, location_disasters)