Beispiel #1
0
    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'])
Beispiel #2
0
    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'
        })
Beispiel #5
0
    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',
            }
        ])
Beispiel #6
0
    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)
Beispiel #7
0
    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': []
        })
Beispiel #9
0
    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)
Beispiel #10
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',
            }
        ])
Beispiel #11
0
 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()
Beispiel #12
0
    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')
Beispiel #13
0
    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)
Beispiel #14
0
    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')
Beispiel #15
0
    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')
Beispiel #16
0
    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')
Beispiel #17
0
 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,
        })
Beispiel #19
0
    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)
Beispiel #20
0
 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)
Beispiel #21
0
    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',
            },
        ])
Beispiel #22
0
    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)