def test_ranks(self): SalaryFactory(rank='Detective', officer__rank='Officer') SalaryFactory(rank='Officer', officer__rank='Officer') OfficerFactory(rank='Senior Police Officer') ranks = Salary.objects.ranks expect(ranks).to.eq(['Detective', 'Officer', 'Senior Police Officer'])
def test_trr_timeline(self, trr_new_timeline_serializer_mock): officer = OfficerFactory(id=123, appointed_date=date(2001, 2, 3)) trr_1 = TRRFactory(officer=officer, trr_datetime=datetime(2002, 1, 4, tzinfo=pytz.utc)) trr_2 = TRRFactory(officer=officer, trr_datetime=datetime(2003, 1, 5, tzinfo=pytz.utc)) unit_1 = PoliceUnitFactory(unit_name='001', description='District 001') unit_2 = PoliceUnitFactory(unit_name='002', description='District 002') OfficerHistoryFactory( officer=officer, unit=unit_1, effective_date=date(2002, 1, 3), end_date=date(2003, 1, 2) ) OfficerHistoryFactory( officer=officer, unit=unit_2, effective_date=date(2003, 1, 3), end_date=date(2018, 1, 3) ) SalaryFactory( year=2001, rank='Police Officer', officer=officer, rank_changed=True, spp_date=date(2001, 5, 3) ) SalaryFactory( year=2002, rank='Senior Police Officer', officer=officer, rank_changed=True, spp_date=date(2002, 5, 3) ) expect(OfficerTimelineQuery(officer)._trr_timeline).to.eq([{'id': 1}, {'id': 2}]) trr_timeline_queryset_arg = trr_new_timeline_serializer_mock.call_args[0][0] trr_1_arg, trr_2_arg = sorted(trr_timeline_queryset_arg, key=attrgetter('id')) expect(trr_1_arg.id).to.eq(trr_1.id) expect(trr_1_arg.unit_name).to.eq('001') expect(trr_1_arg.unit_description).to.eq('District 001') expect(trr_1_arg.rank_name).to.eq('Police Officer') expect(trr_2_arg.id).to.eq(trr_2.id) expect(trr_2_arg.unit_name).to.eq('002') expect(trr_2_arg.unit_description).to.eq('District 002') expect(trr_2_arg.rank_name).to.eq('Senior Police Officer')
def test_current_salary(self): officer_1 = OfficerFactory() officer_2 = OfficerFactory() expect(officer_1.current_salary).to.be.none() SalaryFactory(officer=officer_1, year=2010, salary=5000) SalaryFactory(officer=officer_1, year=2012, salary=10000) SalaryFactory(officer=officer_1, year=2015, salary=15000) SalaryFactory(officer=officer_1, year=2017, salary=20000) officer_cache_manager.build_cached_columns() officer_1.refresh_from_db() officer_2.refresh_from_db() expect(officer_1.current_salary).to.eq(20000) expect(officer_2.current_salary).to.be.none()
def test_serialization(self): officer = OfficerFactory(id=123) salary = SalaryFactory( officer=officer, spp_date=date(2002, 2, 3), rank='Police Officer', ) setattr(salary, 'unit_name', 'Unit 001') setattr(salary, 'unit_description', 'District 001') expect(RankChangeNewTimelineSerializer(salary).data).to.eq({ 'unit_name': 'Unit 001', 'unit_description': 'District 001', 'rank': 'Police Officer', 'priority_sort': 25, 'kind': 'RANK_CHANGE', 'date_sort': date(2002, 2, 3), 'date': '2002-02-03' })
def test_new_timeline_item_merge_rank_and_unit_change_join(self): officer = OfficerFactory(id=123, appointed_date=date(2000, 1, 1), rank='Police Officer') first_unit = PoliceUnitFactory(unit_name='001', description='unit_001') unit = PoliceUnitFactory(unit_name='002', description='unit_002') OfficerHistoryFactory( officer=officer, unit=first_unit, effective_date=date(2000, 1, 1), end_date=date(2009, 12, 31)) OfficerHistoryFactory( officer=officer, unit=unit, effective_date=date(2010, 1, 1), end_date=date(2011, 12, 31)) SalaryFactory(officer=officer, year=2001, rank='Police Officer', spp_date=date(2001, 9, 23)) SalaryFactory(officer=officer, year=2000, rank='Junior Police Officer', spp_date=date(2000, 1, 1)) cache_managers.cache_all() response = self.client.get(reverse('api-v2:officers-new-timeline-items', kwargs={'pk': 123})) expect(response.status_code).to.eq(status.HTTP_200_OK) expect(response.data).to.eq([ { 'date': '2010-01-01', 'kind': 'UNIT_CHANGE', 'unit_name': '002', 'unit_description': 'unit_002', 'rank': 'Police Officer', }, { 'date': '2001-09-23', 'kind': 'RANK_CHANGE', 'unit_name': '001', 'unit_description': 'unit_001', 'rank': 'Police Officer', }, { 'date': '2000-01-01', 'kind': 'JOINED', 'unit_name': '001', 'unit_description': 'unit_001', 'rank': 'Junior Police Officer', } ])
def test_cache_data(self): officer_1 = OfficerFactory(appointed_date=date(2005, 1, 1)) officer_2 = OfficerFactory(appointed_date=date(2005, 1, 1)) officer_1_salary_1 = SalaryFactory( officer=officer_1, salary=5000, year=2005, rank='Police Officer', spp_date=date(2005, 1, 1), ) SalaryFactory( officer=officer_1, salary=10000, year=2006, rank='Police Officer', spp_date=date(2005, 1, 1), ) SalaryFactory( officer=officer_1, salary=10000, year=2006, rank='Police Officer', spp_date=None, ) officer_1_salary_2 = SalaryFactory( officer=officer_1, salary=15000, year=2007, rank='Sergeant', spp_date=date(2007, 1, 1), ) officer_2_salary_1 = SalaryFactory( officer=officer_2, salary=5000, year=2005, rank='Police Officer', spp_date=date(2005, 1, 1), ) officer_2_salary_2 = SalaryFactory( officer=officer_2, salary=15000, year=2006, rank='Detective', spp_date=date(2006, 1, 1), ) SalaryFactory( officer=officer_2, salary=20000, year=2007, rank='Detective', spp_date=date(2006, 1, 1), ) salary_cache_manager.cache_data() rank_changed_salary_ids = set(s.id for s in Salary.objects.filter(rank_changed=True)) expected_rank_changed_salary_ids = { officer_1_salary_1.id, officer_1_salary_2.id, officer_2_salary_1.id, officer_2_salary_2.id } expect(rank_changed_salary_ids).to.eq(expected_rank_changed_salary_ids)
def test_rank_change_timeline(self, rank_change_new_timeline_serializer_mock): officer = OfficerFactory(id=123, appointed_date=date(2001, 2, 3)) salary_1 = SalaryFactory( year=2001, rank='Police Officer', officer=officer, rank_changed=True, spp_date=date(2001, 5, 3) ) salary_2 = SalaryFactory( year=2002, rank='Senior Police Officer', officer=officer, rank_changed=True, spp_date=date(2002, 5, 3) ) SalaryFactory( year=2001, rank='Junior Police Officer', officer=officer, rank_changed=True, spp_date=date(2001, 2, 3) ) SalaryFactory( year=2003, rank='Senior Police Officer', officer=officer, rank_changed=False, spp_date=date(2003, 5, 3) ) unit_1 = PoliceUnitFactory(unit_name='001', description='District 001') unit_2 = PoliceUnitFactory(unit_name='002', description='District 002') OfficerHistoryFactory( officer=officer, unit=unit_1, effective_date=date(2001, 1, 3), end_date=date(2002, 1, 2) ) OfficerHistoryFactory( officer=officer, unit=unit_2, effective_date=date(2002, 1, 3), end_date=date(2018, 1, 3) ) other_officer = OfficerFactory(id=456) SalaryFactory( year=2001, rank='Police Officer', officer=other_officer, rank_changed=True, spp_date=date(2001, 5, 3) ) expect(OfficerTimelineQuery(officer)._rank_change_timeline).to.eq([{'id': 1}, {'id': 2}]) rank_change_timeline_queryset_arg = rank_change_new_timeline_serializer_mock.call_args[0][0] salary_1_arg, salary_2_arg = rank_change_timeline_queryset_arg expect(salary_1_arg.id).to.eq(salary_1.id) expect(salary_1_arg.unit_name).to.eq('001') expect(salary_1_arg.unit_description).to.eq('District 001') expect(salary_2_arg.id).to.eq(salary_2.id) expect(salary_2_arg.unit_name).to.eq('002') expect(salary_2_arg.unit_description).to.eq('District 002')
def test_extract_datum(self): officer = OfficerFactory(rank='Police Officer', active=ACTIVE_YES_CHOICE) SalaryFactory(rank='Police Officer', officer=officer) expect(RankIndexer().extract_datum('Police Officer')).to.eq({ 'rank': 'Police Officer', 'tags': ['rank'], 'active_officers_count': 1, 'officers_most_complaints': [] })
def test_get_active_officers(self): officer = OfficerFactory(rank='Officer', active=ACTIVE_YES_CHOICE) OfficerFactory(rank='Officer', active=ACTIVE_YES_CHOICE) OfficerFactory(rank='Officer', active=ACTIVE_NO_CHOICE) OfficerFactory(rank='Senior Police Officer') OfficerFactory(rank='') SalaryFactory(rank='Police Officer', officer=officer) expect(Officer.get_active_officers(rank='Officer')).to.have.length(2) expect(Officer.get_active_officers( rank='Police Officer')).to.have.length(0)
def test_new_timeline_item_no_join(self): officer = OfficerFactory(id=123, appointed_date=None, rank='Police Officer') unit = PoliceUnitFactory(unit_name='001', description='unit_001') OfficerHistoryFactory(officer=officer, unit=unit, effective_date=date(2010, 1, 1), end_date=date(2011, 12, 31)) allegation = AllegationFactory( crid='123456', coaccused_count=4, incident_date=datetime(2011, 8, 23, tzinfo=pytz.utc) ) OfficerAllegationFactory( final_finding='UN', final_outcome='Unknown', officer=officer, allegation=allegation, allegation_category=AllegationCategoryFactory(category='category', allegation_name='sub category') ) OfficerAllegationFactory.create_batch(3, allegation=allegation) SalaryFactory(officer=officer, year=2001, rank='Police Officer', spp_date=date(2001, 9, 23)) cache_managers.cache_all() response = self.client.get(reverse('api-v2:officers-new-timeline-items', kwargs={'pk': 123})) expect(response.status_code).to.eq(status.HTTP_200_OK) expect(response.data).to.eq([ { 'date': '2011-08-23', 'kind': 'CR', 'crid': '123456', 'category': 'category', 'subcategory': 'sub category', 'finding': 'Unfounded', 'outcome': 'Unknown', 'coaccused': 4, 'unit_name': '001', 'unit_description': 'unit_001', 'rank': 'Police Officer', 'victims': [], 'attachments': [], }, { 'date': '2010-01-01', 'kind': 'UNIT_CHANGE', 'unit_name': '001', 'unit_description': 'unit_001', 'rank': 'Police Officer', }, { 'date': '2001-09-23', 'kind': 'RANK_CHANGE', 'unit_name': '', 'unit_description': '', 'rank': 'Police Officer', } ])
def test_get_rank_by_date(self): officer = OfficerFactory() SalaryFactory(officer=officer, salary=5000, year=2005, rank='Police Officer', spp_date=date(2005, 1, 1), start_date=date(2005, 1, 1)) SalaryFactory(officer=officer, salary=10000, year=2006, rank='Police Officer', spp_date=date(2005, 1, 1), start_date=date(2005, 1, 1)) SalaryFactory(officer=officer, salary=15000, year=2007, rank='Police Officer', spp_date=date(2005, 1, 1), start_date=date(2005, 1, 1)) SalaryFactory(officer=officer, salary=20000, year=2008, rank='Sergeant', spp_date=date(2008, 1, 1), start_date=date(2005, 1, 1)) SalaryFactory(officer=officer, salary=25000, year=2009, rank='Sergeant', spp_date=date(2008, 1, 1), start_date=date(2005, 1, 1)) expect(officer.get_rank_by_date(None)).to.eq(None) expect(officer.get_rank_by_date(date(2007, 1, 1))).to.eq('Police Officer') expect(officer.get_rank_by_date(datetime( 2007, 1, 1, tzinfo=pytz.utc))).to.eq('Police Officer') expect(officer.get_rank_by_date(date(2005, 1, 1))).to.eq('Police Officer') expect(officer.get_rank_by_date(date(2009, 1, 1))).to.eq('Sergeant') expect(officer.get_rank_by_date(date(2004, 1, 1))).to.be.none()
def test_award_timeline(self, award_new_timeline_serializer_mock): officer = OfficerFactory(id=123, appointed_date=date(2001, 2, 3)) award_1 = AwardFactory(officer=officer, start_date=date(2002, 1, 3), award_type='Honored Police Star') award_2 = AwardFactory(officer=officer, start_date=date(2003, 1, 5), award_type='Life Saving Award') AwardFactory(officer=officer, start_date=date(2007, 2, 3), award_type='Complimentary Letter') AwardFactory(officer=officer, start_date=date(2008, 2, 3), award_type='Department Commendation') AwardFactory(officer=officer, start_date=date(2011, 2, 3), award_type='Citizen Honorable Mention') AwardFactory(officer=officer, start_date=None, award_type='Life Saving') unit_1 = PoliceUnitFactory(unit_name='001', description='District 001') unit_2 = PoliceUnitFactory(unit_name='002', description='District 002') OfficerHistoryFactory( officer=officer, unit=unit_1, effective_date=date(2002, 1, 3), end_date=date(2003, 1, 2) ) OfficerHistoryFactory( officer=officer, unit=unit_2, effective_date=date(2003, 1, 3), end_date=date(2018, 1, 3) ) SalaryFactory( year=2001, rank='Police Officer', officer=officer, rank_changed=True, spp_date=date(2001, 5, 3) ) SalaryFactory( year=2002, rank='Senior Police Officer', officer=officer, rank_changed=True, spp_date=date(2002, 5, 3) ) expect(OfficerTimelineQuery(officer)._award_timeline).to.eq([{'id': 1}, {'id': 2}]) award_timeline_queryset_arg = award_new_timeline_serializer_mock.call_args[0][0] award_1_arg, award_2_arg = sorted(award_timeline_queryset_arg, key=attrgetter('id')) expect(award_1_arg.id).to.eq(award_1.id) expect(award_1_arg.unit_name).to.eq('001') expect(award_1_arg.unit_description).to.eq('District 001') expect(award_1_arg.rank_name).to.eq('Police Officer') expect(award_2_arg.id).to.eq(award_2.id) expect(award_2_arg.unit_name).to.eq('002') expect(award_2_arg.unit_description).to.eq('District 002') expect(award_2_arg.rank_name).to.eq('Senior Police Officer')
def test_rank_change_timeline_no_officer_appointed_date(self, rank_change_new_timeline_serializer_mock): officer = OfficerFactory(id=123, appointed_date=None) salary = SalaryFactory( year=2001, rank='Police Officer', officer=officer, rank_changed=True, spp_date=date(2001, 5, 3) ) expect(OfficerTimelineQuery(officer)._rank_change_timeline).to.eq([{'id': 1}]) rank_change_timeline_queryset_arg = rank_change_new_timeline_serializer_mock.call_args[0][0] salary_arg, = rank_change_timeline_queryset_arg expect(salary_arg.id).to.eq(salary.id)
def test_cr_timeline(self, cr_new_timeline_serializer_mock): officer = OfficerFactory(id=123) OfficerAllegationFactory(id=1, officer=officer, allegation__incident_date=datetime(2002, 2, 3, tzinfo=pytz.utc)) OfficerAllegationFactory(id=2, officer=officer, allegation__incident_date=datetime(2003, 1, 5, tzinfo=pytz.utc)) OfficerAllegationFactory(id=3, officer=officer, allegation__incident_date=None) unit_1 = PoliceUnitFactory(unit_name='001', description='District 001') unit_2 = PoliceUnitFactory(unit_name='002', description='District 002') OfficerHistoryFactory( officer=officer, unit=unit_1, effective_date=date(2002, 1, 3), end_date=date(2003, 1, 2) ) OfficerHistoryFactory( officer=officer, unit=unit_2, effective_date=date(2003, 1, 3), end_date=date(2018, 1, 3) ) SalaryFactory( year=2001, rank='Police Officer', officer=officer, rank_changed=True, spp_date=date(2001, 5, 3) ) SalaryFactory( year=2002, rank='Senior Police Officer', officer=officer, rank_changed=True, spp_date=date(2002, 5, 3) ) other_officer = OfficerFactory(id=456) OfficerAllegationFactory(id=4, officer=other_officer, start_date=date(2003, 1, 5)) expect(OfficerTimelineQuery(officer)._cr_timeline).to.eq([{'id': 1}, {'id': 2}]) cr_timeline_queryset_arg = cr_new_timeline_serializer_mock.call_args[0][0] officer_allegation_1_arg, officer_allegation_2_arg = sorted(cr_timeline_queryset_arg, key=attrgetter('id')) expect(officer_allegation_1_arg.id).to.eq(1) expect(officer_allegation_1_arg.unit_name).to.eq('001') expect(officer_allegation_1_arg.unit_description).to.eq('District 001') expect(officer_allegation_1_arg.rank_name).to.eq('Police Officer') expect(officer_allegation_2_arg.id).to.eq(2) expect(officer_allegation_2_arg.unit_name).to.eq('002') expect(officer_allegation_2_arg.unit_description).to.eq('District 002') expect(officer_allegation_2_arg.rank_name).to.eq('Senior Police Officer')
def test_unit_change_timeline(self, unit_change_new_timeline_serializer_mock): officer = OfficerFactory(id=123, appointed_date=date(2001, 2, 3)) officer_history_1 = OfficerHistoryFactory( officer=officer, effective_date=date(2002, 1, 3), end_date=date(2002, 1, 3) ) officer_history_2 = OfficerHistoryFactory( officer=officer, effective_date=date(2003, 1, 3), end_date=date(2018, 1, 3) ) OfficerHistoryFactory( officer=officer, effective_date=None, end_date=date(2018, 1, 3) ) OfficerHistoryFactory( officer=officer, effective_date=None, end_date=date(2001, 2, 3) ) SalaryFactory( year=2001, rank='Police Officer', officer=officer, rank_changed=True, spp_date=date(2001, 5, 3) ) SalaryFactory( year=2002, rank='Senior Police Officer', officer=officer, rank_changed=True, spp_date=date(2002, 5, 3) ) other_officer = OfficerFactory(id=456) OfficerHistoryFactory( officer=other_officer, effective_date=date(2002, 1, 3), end_date=date(2002, 1, 3) ) expect(OfficerTimelineQuery(officer)._unit_change_timeline).to.eq([{'id': 1}, {'id': 2}]) unit_change_timeline_queryset_arg = unit_change_new_timeline_serializer_mock.call_args[0][0] officer_allegation_1_arg, officer_allegation_2_arg = unit_change_timeline_queryset_arg expect(officer_allegation_1_arg.id).to.eq(officer_history_1.id) expect(officer_allegation_1_arg.rank_name).to.eq('Police Officer') expect(officer_allegation_2_arg.id).to.eq(officer_history_2.id) expect(officer_allegation_2_arg.rank_name).to.eq('Senior Police Officer')
def test_join_timeline(self, join_new_timeline_serializer_mock): officer = OfficerFactory(id=123, appointed_date=date(2001, 2, 3)) SalaryFactory( year=2001, rank='Police Officer', officer=officer, rank_changed=True, spp_date=date(2001, 2, 3) ) unit = PoliceUnitFactory(unit_name='001', description='District 001') OfficerHistoryFactory( officer=officer, unit=unit, effective_date=date(2001, 1, 3), end_date=date(2001, 2, 3) ) expect(OfficerTimelineQuery(officer)._join_timeline).to.eq([{'id': 1}]) join_timeline_queryset_arg = join_new_timeline_serializer_mock.call_args[0][0] officer_arg, = join_timeline_queryset_arg expect(officer_arg.id).to.eq(officer.id) expect(officer_arg.unit_name).to.eq('001') expect(officer_arg.unit_description).to.eq('District 001') expect(officer_arg.rank_name).to.eq('Police Officer')
def test_rank_histories(self): officer = OfficerFactory() SalaryFactory(officer=officer, salary=5000, year=2005, rank='Police Officer', spp_date=date(2005, 1, 1), start_date=date(2005, 1, 1)) SalaryFactory(officer=officer, salary=10000, year=2006, rank='Police Officer', spp_date=date(2005, 1, 1), start_date=date(2005, 1, 1)) SalaryFactory(officer=officer, salary=10000, year=2006, rank='Police Officer', spp_date=None, start_date=date(2005, 1, 1)) SalaryFactory(officer=officer, salary=15000, year=2007, rank='Police Officer', spp_date=date(2005, 1, 1), start_date=date(2005, 1, 1)) SalaryFactory(officer=officer, salary=20000, year=2008, rank='Sergeant', spp_date=date(2008, 1, 1), start_date=date(2005, 1, 1)) SalaryFactory(officer=officer, salary=25000, year=2009, rank='Sergeant', spp_date=date(2008, 1, 1), start_date=date(2005, 1, 1)) expect(officer.rank_histories).to.eq([{ 'date': date(2005, 1, 1), 'rank': 'Police Officer' }, { 'date': date(2008, 1, 1), 'rank': 'Sergeant' }])
def test_extract_info(self): officer = OfficerFactory(id=123, first_name='Alex', last_name='Mack', rank='5', race='White', gender='M', appointed_date=date(2017, 2, 27), resignation_date=date(2017, 12, 27), active='Yes', birth_year=1910, complaint_percentile=99.8, honorable_mention_percentile=98, tags=['Jason VanDyke']) TRRFactory(officer=officer, trr_datetime=datetime(2002, 9, 29, tzinfo=pytz.utc)) SalaryFactory(officer=officer, salary=9000) AwardFactory(officer=officer, award_type='Honorable Mention') AwardFactory(officer=officer, award_type='Complimentary Letter') AwardFactory(officer=officer, award_type='Honored Police Star') AwardFactory(officer=officer, award_type='Lambert Tree') OfficerHistoryFactory(officer=officer, unit__id=1001, unit__unit_name='001', unit__description='Hyde Park D', effective_date=date(2010, 1, 1), end_date=date(2011, 1, 1)) OfficerHistoryFactory(officer=officer, unit__id=1002, unit__unit_name='002', unit__description='Tactical', effective_date=date(2011, 1, 2)) OfficerBadgeNumberFactory(officer=officer, star='123456', current=True) OfficerBadgeNumberFactory(officer=officer, star='123', current=False) OfficerBadgeNumberFactory(officer=officer, star='456', current=False) allegation = AllegationFactory( incident_date=datetime(2000, 4, 26, tzinfo=pytz.utc)) OfficerAllegationFactory( officer=officer, final_finding='SU', start_date=date(2000, 1, 1), allegation_category__category='Illegal Search', allegation=allegation, disciplined=True) ComplainantFactory(allegation=allegation, race='White', age=18, gender='M') rows = self.extract_data() expect(rows).to.have.length(1) expect(rows[0]).to.eq({ 'id': 123, 'full_name': 'Alex Mack', 'unit': { 'id': 1002, 'unit_name': '002', 'description': 'Tactical', 'long_unit_name': 'Unit 002' }, 'rank': '5', 'race': 'White', 'badge': '123456', 'badge_keyword': '123456', 'historic_badges': ['123', '456'], 'historic_badges_keyword': ['123', '456'], 'historic_units': [{ 'id': 1002, 'unit_name': '002', 'description': 'Tactical', 'long_unit_name': 'Unit 002', }, { 'id': 1001, 'unit_name': '001', 'description': 'Hyde Park D', 'long_unit_name': 'Unit 001', }], 'gender': 'Male', 'date_of_appt': '2017-02-27', 'date_of_resignation': '2017-12-27', 'active': 'Active', 'birth_year': 1910, 'complaint_records': { 'count': 1, 'sustained_count': 1, 'items': [{ 'year': 2000, 'count': 1, 'sustained_count': 1 }], 'facets': [{ 'name': 'category', 'entries': [{ 'name': 'Illegal Search', 'count': 1, 'sustained_count': 1, 'items': [{ 'year': 2000, 'name': 'Illegal Search', 'count': 1, 'sustained_count': 1 }] }] }, { 'name': 'complainant race', 'entries': [{ 'name': 'White', 'count': 1, 'sustained_count': 1, 'items': [{ 'year': 2000, 'name': 'White', 'count': 1, 'sustained_count': 1 }] }] }, { 'name': 'complainant age', 'entries': [{ 'name': '<20', 'count': 1, 'sustained_count': 1, 'items': [{ 'year': 2000, 'name': '<20', 'count': 1, 'sustained_count': 1 }] }] }, { 'name': 'complainant gender', 'entries': [{ 'name': 'Male', 'count': 1, 'sustained_count': 1, 'items': [{ 'year': 2000, 'name': 'Male', 'count': 1, 'sustained_count': 1 }] }] }] }, 'allegation_count': 1, 'complaint_percentile': Decimal('99.8'), 'honorable_mention_count': 1, 'honorable_mention_percentile': 98, 'has_visual_token': False, 'sustained_count': 1, 'discipline_count': 1, 'civilian_compliment_count': 1, 'trr_count': 1, 'major_award_count': 2, 'tags': ['Jason VanDyke'], 'to': '/officer/123/alex-mack/', 'url': 'http://test.com/officer/alex-mack/123', 'current_salary': 9000, 'unsustained_count': 0, 'coaccusals': [], 'current_allegation_percentile': None, 'percentiles': [], 'cr_incident_dates': ['2000-04-26'], 'trr_datetimes': ['2002-09-29'], 'internal_allegation_percentile': None, 'trr_percentile': None, 'civilian_allegation_percentile': None, })
def test_summary(self): officer = OfficerFactory( tags=[], first_name='Kevin', last_name='Kerl', id=123, race='White', gender='M', appointed_date=date(2017, 2, 27), rank='PO', resignation_date=date(2017, 12, 27), active=ACTIVE_YES_CHOICE, birth_year=1910, complaint_percentile=32.5, sustained_count=1, allegation_count=1, discipline_count=1, trr_count=1, civilian_compliment_count=1, honorable_mention_count=1, major_award_count=1, last_unit_id=1, current_badge='123456', current_salary=90000, has_unique_name=True ) allegation = AllegationFactory() allegation_category = AllegationCategoryFactory(category='Use of Force') OfficerHistoryFactory(officer=officer, unit=PoliceUnitFactory(id=1, unit_name='CAND', description='')) ComplainantFactory(allegation=allegation, race='White', age=18, gender='F') OfficerBadgeNumberFactory(officer=officer, star='123456', current=True) OfficerAllegationFactory( officer=officer, allegation=allegation, allegation_category=allegation_category, final_finding='SU', start_date=date(2000, 1, 1), disciplined=True ) AwardFactory(officer=officer, award_type='Complimentary Letter') AwardFactory(officer=officer, award_type='Honored Police Star') AwardFactory(officer=officer, award_type='Honorable Mention') SalaryFactory(officer=officer, salary=50000, year=2015) SalaryFactory(officer=officer, salary=90000, year=2017) TRRFactory(officer=officer) officer_cache_manager.build_cached_columns() allegation_cache_manager.cache_data() response = self.client.get(reverse('api-v2:officers-summary', kwargs={'pk': 123})) expect(response.status_code).to.eq(status.HTTP_200_OK) expected_data = { 'id': 123, 'unit': { 'id': 1, 'unit_name': 'CAND', 'description': '', 'long_unit_name': 'Unit CAND', }, 'date_of_appt': '2017-02-27', 'date_of_resignation': '2017-12-27', 'active': 'Active', 'rank': 'PO', 'full_name': 'Kevin Kerl', 'race': 'White', 'badge': '123456', 'historic_units': [{ 'id': 1, 'unit_name': 'CAND', 'description': '', 'long_unit_name': 'Unit CAND' }], 'gender': 'Male', 'birth_year': 1910, 'sustained_count': 1, 'civilian_compliment_count': 1, 'allegation_count': 1, 'discipline_count': 1, 'honorable_mention_count': 1, 'to': '/officer/123/kevin-kerl/', 'url': 'http://cpdb.lvh.me/officer/kevin-kerl/123', 'current_salary': 90000, 'trr_count': 1, 'major_award_count': 1, 'unsustained_count': 0, 'percentile_allegation': '32.5000', 'coaccusals': [], 'percentiles': [], 'tags': [], 'historic_badges': [], 'has_unique_name': True } expect(response.data).to.eq(expected_data)
def test_get_queryset(self): expect(RankIndexer().get_queryset()).to.have.length(0) SalaryFactory(rank='Officer', officer__rank='Officer') OfficerFactory(rank='Detective') expect(RankIndexer().get_queryset()).to.have.length(2)
def test_new_timeline_item(self): officer = OfficerFactory(id=123, appointed_date=date(2000, 1, 1), rank='Police Officer') unit1 = PoliceUnitFactory(unit_name='001', description='unit_001') unit2 = PoliceUnitFactory(unit_name='002', description='unit_002') OfficerHistoryFactory(officer=officer, unit=unit1, effective_date=date(2010, 1, 1), end_date=date(2011, 12, 31)) OfficerHistoryFactory(officer=officer, unit=unit2, effective_date=date(2012, 1, 1), end_date=None) AwardFactory(officer=officer, start_date=date(2011, 3, 23), award_type='Honorable Mention') AwardFactory(officer=officer, start_date=date(2015, 3, 23), award_type='Complimentary Letter') AwardFactory(officer=officer, start_date=date(2011, 3, 23), award_type='Life Saving Award') allegation = AllegationFactory( crid='123456', coaccused_count=4, incident_date=datetime(2011, 8, 23, tzinfo=pytz.utc) ) VictimFactory(allegation=allegation, gender='M', race='White', age=34) OfficerAllegationFactory( final_finding='UN', final_outcome='Unknown', officer=officer, allegation=allegation, allegation_category=AllegationCategoryFactory(category='category', allegation_name='sub category') ) OfficerAllegationFactory.create_batch(3, allegation=allegation) allegation2 = AllegationFactory( crid='654321', point=Point(35.5, 68.9), coaccused_count=1, incident_date=datetime(2015, 8, 23, tzinfo=pytz.utc) ) OfficerAllegationFactory( final_finding='UN', final_outcome='9 Day Suspension', officer=officer, allegation=allegation2, allegation_category=AllegationCategoryFactory(category='Use of Force', allegation_name='sub category') ) trr2011 = TRRFactory( officer=officer, trr_datetime=datetime(2011, 9, 23, tzinfo=pytz.utc), taser=True, firearm_used=False ) trr2015 = TRRFactory( officer=officer, trr_datetime=datetime(2015, 9, 23, tzinfo=pytz.utc), taser=False, firearm_used=False ) SalaryFactory(officer=officer, year=2001, rank='Police Officer', spp_date=date(2001, 9, 23)) SalaryFactory(officer=officer, year=2000, rank='Junior Police Officer', spp_date=date(2000, 1, 1)) cache_managers.cache_all() response = self.client.get(reverse('api-v2:officers-new-timeline-items', kwargs={'pk': 123})) expect(response.status_code).to.eq(status.HTTP_200_OK) expect(response.data).to.eq([ { 'trr_id': trr2015.id, 'date': '2015-09-23', 'kind': 'FORCE', 'taser': False, 'firearm_used': False, 'unit_name': '002', 'unit_description': 'unit_002', 'rank': 'Police Officer', }, { 'date': '2015-08-23', 'kind': 'CR', 'crid': '654321', 'category': 'Use of Force', 'subcategory': 'sub category', 'finding': 'Unfounded', 'outcome': '9 Day Suspension', 'coaccused': 1, 'unit_name': '002', 'unit_description': 'unit_002', 'rank': 'Police Officer', 'point': { 'lon': 35.5, 'lat': 68.9 }, 'victims': [], 'attachments': [] }, { 'date': '2012-01-01', 'kind': 'UNIT_CHANGE', 'unit_name': '002', 'unit_description': 'unit_002', 'rank': 'Police Officer', }, { 'trr_id': trr2011.id, 'date': '2011-09-23', 'kind': 'FORCE', 'taser': True, 'firearm_used': False, 'unit_name': '001', 'unit_description': 'unit_001', 'rank': 'Police Officer', }, { 'date': '2011-08-23', 'kind': 'CR', 'crid': '123456', 'category': 'category', 'subcategory': 'sub category', 'finding': 'Unfounded', 'outcome': 'Unknown', 'coaccused': 4, 'unit_name': '001', 'unit_description': 'unit_001', 'rank': 'Police Officer', 'victims': [ { 'race': 'White', 'age': 34, 'gender': 'Male', } ], 'attachments': [], }, { 'date': '2011-03-23', 'kind': 'AWARD', 'award_type': 'Life Saving Award', 'unit_name': '001', 'unit_description': 'unit_001', 'rank': 'Police Officer', }, { 'date': '2010-01-01', 'kind': 'UNIT_CHANGE', 'unit_name': '001', 'unit_description': 'unit_001', 'rank': 'Police Officer', }, { 'date': '2001-09-23', 'kind': 'RANK_CHANGE', 'unit_name': '', 'unit_description': '', 'rank': 'Police Officer', }, { 'date': '2000-01-01', 'kind': 'JOINED', 'unit_name': '', 'unit_description': '', 'rank': 'Junior Police Officer', }, ])
def test_retrieve_data_range_too_small_cause_no_percentiles(self): officer = OfficerFactory( tags=[], first_name='Kevin', last_name='Kerl', id=123, race='White', gender='M', appointed_date=date(2002, 2, 27), rank='PO', resignation_date=date(2017, 12, 27), active=ACTIVE_YES_CHOICE, birth_year=1960, complaint_percentile=32.5, sustained_count=1, allegation_count=2, discipline_count=1, trr_count=1, civilian_compliment_count=1, honorable_mention_count=1, major_award_count=1, last_unit_id=1, current_badge='123456' ) allegation = AllegationFactory(incident_date=datetime(2002, 3, 1, tzinfo=pytz.utc)) internal_allegation = AllegationFactory( incident_date=datetime(2002, 4, 1, tzinfo=pytz.utc), is_officer_complaint=True ) allegation_category = AllegationCategoryFactory(category='Use of Force') OfficerHistoryFactory( officer=officer, effective_date=datetime(2002, 2, 27, tzinfo=pytz.utc), unit=PoliceUnitFactory(id=1, unit_name='CAND', description='') ) ComplainantFactory(allegation=allegation, race='White', age=18, gender='F') OfficerBadgeNumberFactory(officer=officer, star='123456', current=True) OfficerBadgeNumberFactory(officer=officer, star='789', current=False) OfficerAllegationFactory( officer=officer, allegation=allegation, allegation_category=allegation_category, final_finding='SU', start_date=date(2002, 3, 2), disciplined=True ) OfficerAllegationFactory( officer=officer, allegation=internal_allegation, final_finding='NS', start_date=date(2002, 3, 2), disciplined=False ) AwardFactory(officer=officer, award_type='Complimentary Letter', start_date=date(2014, 5, 1)) AwardFactory(officer=officer, award_type='Honored Police Star', start_date=date(2014, 6, 1)) AwardFactory(officer=officer, award_type='Honorable Mention', start_date=date(2014, 7, 1)) SalaryFactory(officer=officer, salary=50000, year=2002) SalaryFactory(officer=officer, salary=90000, year=2017) TRRFactory(officer=officer, trr_datetime=datetime(2002, 3, 1, tzinfo=pytz.utc)) second_officer = OfficerFactory( tags=[], first_name='Kevin', last_name='Osborn', id=456, race='Black', gender='M', appointed_date=date(2002, 1, 27), resignation_date=date(2017, 12, 27), rank='PO', active=ACTIVE_YES_CHOICE, birth_year=1970 ) TRRFactory(officer=second_officer, trr_datetime=datetime(2002, 5, 1, tzinfo=pytz.utc)) TRRFactory(officer=second_officer, trr_datetime=datetime(2002, 12, 1, tzinfo=pytz.utc)) OfficerFactory( tags=[], first_name='Kevin', last_name='Edward', id=789, race='Black', gender='M', appointed_date=date(2002, 3, 27), resignation_date=date(2017, 12, 27), rank='PO', active=ACTIVE_YES_CHOICE, birth_year=1970 ) officer_cache_manager.build_cached_columns() allegation_cache_manager.cache_data() response = self.client.get(reverse('api-v2:officers-mobile-detail', kwargs={'pk': 123})) expected_response = { 'officer_id': 123, 'unit': { 'unit_id': 1, 'unit_name': 'CAND', 'description': '', }, 'date_of_appt': '2002-02-27', 'date_of_resignation': '2017-12-27', 'active': 'Active', 'rank': 'PO', 'full_name': 'Kevin Kerl', 'race': 'White', 'badge': '123456', 'historic_badges': ['789'], 'gender': 'Male', 'birth_year': 1960, 'sustained_count': 1, 'unsustained_count': 1, 'civilian_compliment_count': 1, 'allegation_count': 2, 'discipline_count': 1, 'honorable_mention_count': 1, 'trr_count': 1, 'major_award_count': 1, 'percentile_allegation': '32.5000', 'percentiles': [] } expect(response.data).to.eq(expected_response)