def test_trr_count(self): officer_1 = OfficerFactory() officer_2 = OfficerFactory() TRRFactory.create_batch(2, officer=officer_1) officer_cache_manager.build_cached_columns() officer_1.refresh_from_db() officer_2.refresh_from_db() expect(officer_1.trr_count).to.eq(2) expect(officer_2.trr_count).to.eq(0)
def test_latest_year_percentile(self): officer1 = OfficerFactory(id=1, appointed_date=date(1990, 3, 14)) officer2 = OfficerFactory(id=2, appointed_date=date(1990, 3, 14), resignation_date=date(2014, 7, 1)) officer3 = OfficerFactory(id=3, appointed_date=date(1990, 3, 14)) officer4 = OfficerFactory(id=4, appointed_date=date(1990, 3, 14), resignation_date=date(2010, 7, 1)) # officer1 have all data OfficerAllegationFactory.create_batch( 2, officer=officer1, allegation__incident_date=datetime(2013, 12, 31, tzinfo=pytz.utc), ) OfficerAllegationFactory.create_batch( 3, officer=officer1, allegation__incident_date=datetime(2015, 7, 2, tzinfo=pytz.utc), allegation__is_officer_complaint=True) OfficerAllegationFactory.create_batch( 4, officer=officer1, allegation__incident_date=datetime(2015, 7, 2, tzinfo=pytz.utc), allegation__is_officer_complaint=False) TRRFactory.create_batch(2, officer=officer1, trr_datetime=datetime(2015, 2, 1, tzinfo=pytz.utc)) AwardFactory(officer=officer1, award_type='Complimentary Letter', start_date=datetime(2013, 1, 1)) AwardFactory.create_batch(3, officer=officer1, award_type='Honorable Mention', start_date=datetime(2015, 1, 1)) # officer2 don't have trr OfficerAllegationFactory( officer=officer2, allegation__incident_date=datetime(2013, 12, 31, tzinfo=pytz.utc), ) OfficerAllegationFactory(officer=officer2, allegation__incident_date=datetime( 2014, 7, 2, tzinfo=pytz.utc), allegation__is_officer_complaint=True) OfficerAllegationFactory(officer=officer2, allegation__incident_date=datetime( 2014, 7, 2, tzinfo=pytz.utc), allegation__is_officer_complaint=False) AwardFactory(officer=officer2, award_type='Complimentary Letter', start_date=datetime(2013, 1, 1)) AwardFactory.create_batch(3, officer=officer2, award_type='Honorable Mention', start_date=datetime(2014, 1, 1)) # officer3 don't have allegation in ALLEGATION_MIN - ALLEGATION_MAX OfficerAllegationFactory.create_batch( 2, officer=officer3, allegation__incident_date=datetime(2015, 7, 2, tzinfo=pytz.utc), allegation__is_officer_complaint=True) OfficerAllegationFactory.create_batch( 3, officer=officer3, allegation__incident_date=datetime(2015, 7, 2, tzinfo=pytz.utc), allegation__is_officer_complaint=False) TRRFactory.create_batch(3, officer=officer3, trr_datetime=datetime(2015, 2, 1, tzinfo=pytz.utc)) # officer4 have all data but is out of data range OfficerAllegationFactory.create_batch( 2, officer=officer4, allegation__incident_date=datetime(2009, 12, 31, tzinfo=pytz.utc), ) OfficerAllegationFactory.create_batch( 3, officer=officer4, allegation__incident_date=datetime(2009, 7, 2, tzinfo=pytz.utc), allegation__is_officer_complaint=True) OfficerAllegationFactory.create_batch( 4, officer=officer4, allegation__incident_date=datetime(2009, 7, 2, tzinfo=pytz.utc), allegation__is_officer_complaint=False) TRRFactory.create_batch(2, officer=officer4, trr_datetime=datetime(2009, 2, 1, tzinfo=pytz.utc)) expected_dict = { 1: { 'officer_id': 1, 'year': 2017, 'metric_allegation': 3.0, 'metric_allegation_civilian': 2.0, 'metric_allegation_internal': 1.0, 'metric_trr': 0.6667, 'metric_honorable_mention': 1.0, 'percentile_allegation': 66.6667, 'percentile_allegation_civilian': 66.6667, 'percentile_allegation_internal': 66.6667, 'percentile_trr': 33.3333, 'percentile_honorable_mention': 33.3333, }, 2: { 'officer_id': 2, 'year': 2014, 'metric_allegation': 2.0055, 'metric_allegation_civilian': 1.337, 'metric_allegation_internal': 0.6685, 'metric_trr': 0.0, 'metric_honorable_mention': 2.0055, 'percentile_allegation': 66.6667, 'percentile_allegation_civilian': 66.6667, 'percentile_allegation_internal': 66.6667, 'percentile_trr': 0.0, 'percentile_honorable_mention': 66.6667 }, 3: { 'officer_id': 3, 'year': 2017, 'metric_allegation': 1.6667, 'metric_allegation_civilian': 1.0, 'metric_allegation_internal': 0.6667, 'metric_trr': 1.0, 'metric_honorable_mention': 0.0, 'percentile_allegation': 0.0, 'percentile_allegation_civilian': 0.0, 'percentile_allegation_internal': 0.0, 'percentile_trr': 66.6667, 'percentile_honorable_mention': 0.0 } } officers = officer_percentile.latest_year_percentile() expect(officers).to.have.length(3) for officer in officers: validate_object(officer, expected_dict[officer.id])
def test_top_percentile_not_enough_service_year(self): officer1 = OfficerFactory(id=1, appointed_date=date(1990, 3, 14)) officer2 = OfficerFactory(id=2, appointed_date=date(1990, 3, 14), resignation_date=date(2014, 5, 1)) officer3 = OfficerFactory(id=3, appointed_date=date(2013, 3, 14)) officer4 = OfficerFactory(id=4, appointed_date=date(1990, 3, 14), resignation_date=date(2015, 5, 1)) # officer1 have all data OfficerAllegationFactory.create_batch( 2, officer=officer1, allegation__incident_date=datetime(2013, 12, 31, tzinfo=pytz.utc), ) OfficerAllegationFactory.create_batch( 3, officer=officer1, allegation__incident_date=datetime(2014, 7, 2, tzinfo=pytz.utc), allegation__is_officer_complaint=True) OfficerAllegationFactory.create_batch( 4, officer=officer1, allegation__incident_date=datetime(2014, 7, 2, tzinfo=pytz.utc), allegation__is_officer_complaint=False) TRRFactory.create_batch(2, officer=officer1, trr_datetime=datetime(2015, 2, 1, tzinfo=pytz.utc)) # officer2 don't have trr OfficerAllegationFactory( officer=officer2, allegation__incident_date=datetime(2013, 12, 31, tzinfo=pytz.utc), ) OfficerAllegationFactory(officer=officer2, allegation__incident_date=datetime( 2014, 2, 2, tzinfo=pytz.utc), allegation__is_officer_complaint=True) OfficerAllegationFactory(officer=officer2, allegation__incident_date=datetime( 2014, 3, 2, tzinfo=pytz.utc), allegation__is_officer_complaint=False) # officer3 don't have allegation in ALLEGATION_MIN - ALLEGATION_MAX OfficerAllegationFactory.create_batch( 2, officer=officer3, allegation__incident_date=datetime(2014, 7, 2, tzinfo=pytz.utc), allegation__is_officer_complaint=True) OfficerAllegationFactory.create_batch( 3, officer=officer3, allegation__incident_date=datetime(2014, 7, 2, tzinfo=pytz.utc), allegation__is_officer_complaint=False) TRRFactory.create_batch(3, officer=officer3, trr_datetime=datetime(2015, 2, 1, tzinfo=pytz.utc)) # officer4 don't have allegation in INTERNAL_CIVILIAN_ALLEGATION year range OfficerAllegationFactory.create_batch( 5, officer=officer4, allegation__incident_date=datetime(2013, 12, 31, tzinfo=pytz.utc), ) TRRFactory.create_batch(6, officer=officer4, trr_datetime=datetime(2015, 2, 1, tzinfo=pytz.utc)) expected_dict = { 1: { 'officer_id': 1, 'year': 2016, 'metric_allegation': 2, 'metric_allegation_civilian': 4, 'metric_allegation_internal': 3, 'metric_trr': 2, 'percentile_allegation': 33.3333, 'percentile_allegation_civilian': 66.6667, 'percentile_allegation_internal': 66.6667, 'percentile_trr': 0.0 }, 2: { 'officer_id': 2, 'year': 2016, 'metric_allegation': 1, 'metric_allegation_civilian': None, 'metric_allegation_internal': None, 'metric_trr': None, 'percentile_allegation': 0.0, 'percentile_allegation_civilian': None, 'percentile_allegation_internal': None, 'percentile_trr': None }, 3: { 'officer_id': 3, 'year': 2016, 'metric_allegation': None, 'metric_allegation_civilian': 3, 'metric_allegation_internal': 2, 'metric_trr': 3, 'percentile_allegation': None, 'percentile_allegation_civilian': 33.3333, 'percentile_allegation_internal': 33.3333, 'percentile_trr': 50.0 }, 4: { 'officer_id': 4, 'year': 2016, 'metric_allegation': 5, 'metric_allegation_civilian': 0.0, 'metric_allegation_internal': 0.0, 'metric_trr': None, 'percentile_allegation': 66.6667, 'percentile_allegation_civilian': 0.0, 'percentile_allegation_internal': 0.0, 'percentile_trr': None } } officers = officer_percentile.top_percentile(2016) for officer in officers: validate_object(officer, expected_dict[officer.id])
def test_top_percentile_with_types(self): officer1 = OfficerFactory(id=1, appointed_date=date(1990, 3, 14)) officer2 = OfficerFactory(id=2, appointed_date=date(1990, 3, 14)) officer3 = OfficerFactory(id=3, appointed_date=date(1990, 3, 14)) officer4 = OfficerFactory(id=4, appointed_date=date(1990, 3, 14)) # officer1 have all data OfficerAllegationFactory.create_batch( 2, officer=officer1, allegation__incident_date=datetime(2013, 12, 31, tzinfo=pytz.utc), ) OfficerAllegationFactory.create_batch( 3, officer=officer1, allegation__incident_date=datetime(2015, 7, 2, tzinfo=pytz.utc), allegation__is_officer_complaint=True) OfficerAllegationFactory.create_batch( 4, officer=officer1, allegation__incident_date=datetime(2015, 7, 2, tzinfo=pytz.utc), allegation__is_officer_complaint=False) TRRFactory.create_batch(2, officer=officer1, trr_datetime=datetime(2015, 2, 1, tzinfo=pytz.utc)) # officer2 don't have trr OfficerAllegationFactory( officer=officer2, allegation__incident_date=datetime(2013, 12, 31, tzinfo=pytz.utc), ) OfficerAllegationFactory(officer=officer2, allegation__incident_date=datetime( 2015, 7, 2, tzinfo=pytz.utc), allegation__is_officer_complaint=True) OfficerAllegationFactory(officer=officer2, allegation__incident_date=datetime( 2015, 7, 2, tzinfo=pytz.utc), allegation__is_officer_complaint=False) # officer3 don't have allegation in ALLEGATION_MIN - ALLEGATION_MAX OfficerAllegationFactory.create_batch( 2, officer=officer3, allegation__incident_date=datetime(2015, 7, 2, tzinfo=pytz.utc), allegation__is_officer_complaint=True) OfficerAllegationFactory.create_batch( 3, officer=officer3, allegation__incident_date=datetime(2015, 7, 2, tzinfo=pytz.utc), allegation__is_officer_complaint=False) TRRFactory.create_batch(3, officer=officer3, trr_datetime=datetime(2015, 2, 1, tzinfo=pytz.utc)) # officer4 don't have allegation in INTERNAL_CIVILIAN_ALLEGATION year range OfficerAllegationFactory.create_batch( 5, officer=officer4, allegation__incident_date=datetime(2013, 12, 31, tzinfo=pytz.utc), ) TRRFactory.create_batch(6, officer=officer4, trr_datetime=datetime(2015, 2, 1, tzinfo=pytz.utc)) expected_dict = { 1: { 'officer_id': 1, 'year': 2016, 'metric_allegation_civilian': 4, 'metric_allegation_internal': 3, 'metric_trr': 2, 'percentile_allegation': None, 'percentile_allegation_civilian': 75.0, 'percentile_allegation_internal': 75.0, 'percentile_trr': 25.0 }, 2: { 'officer_id': 2, 'year': 2016, 'metric_allegation_civilian': 1, 'metric_allegation_internal': 1, 'metric_trr': 0.0, 'percentile_allegation': None, 'percentile_allegation_civilian': 25.0, 'percentile_allegation_internal': 25.0, 'percentile_trr': 0.0 }, 3: { 'officer_id': 3, 'year': 2016, 'metric_allegation_civilian': 3, 'metric_allegation_internal': 2, 'metric_trr': 3, 'percentile_allegation': None, 'percentile_allegation_civilian': 50.0, 'percentile_allegation_internal': 50.0, 'percentile_trr': 50.0 }, 4: { 'officer_id': 4, 'year': 2016, 'metric_allegation_civilian': 0.0, 'metric_allegation_internal': 0.0, 'metric_trr': 6, 'percentile_allegation': None, 'percentile_allegation_civilian': 0.0, 'percentile_allegation_internal': 0.0, 'percentile_trr': 75.0 } } visual_token_percentile_groups = [ PERCENTILE_ALLEGATION_INTERNAL_CIVILIAN_GROUP, PERCENTILE_TRR_GROUP ] officers = officer_percentile.top_percentile( 2016, percentile_groups=visual_token_percentile_groups) for officer in officers: validate_object(officer, expected_dict[officer.id])
def test_top_percentile(self): officer1 = OfficerFactory(id=1, appointed_date=date(1990, 3, 14)) officer2 = OfficerFactory(id=2, appointed_date=date(1990, 3, 14)) officer3 = OfficerFactory(id=3, appointed_date=date(1990, 3, 14)) # officer1 have all data OfficerAllegationFactory.create_batch( 2, officer=officer1, allegation__incident_date=datetime(2013, 12, 31, tzinfo=pytz.utc), ) OfficerAllegationFactory.create_batch( 3, officer=officer1, allegation__incident_date=datetime(2015, 7, 2, tzinfo=pytz.utc), allegation__is_officer_complaint=True) OfficerAllegationFactory.create_batch( 4, officer=officer1, allegation__incident_date=datetime(2015, 7, 2, tzinfo=pytz.utc), allegation__is_officer_complaint=False) TRRFactory.create_batch(2, officer=officer1, trr_datetime=datetime(2015, 2, 1, tzinfo=pytz.utc)) # officer2 don't have trr OfficerAllegationFactory( officer=officer2, allegation__incident_date=datetime(2013, 12, 31, tzinfo=pytz.utc), ) OfficerAllegationFactory(officer=officer2, allegation__incident_date=datetime( 2015, 7, 2, tzinfo=pytz.utc), allegation__is_officer_complaint=True) OfficerAllegationFactory(officer=officer2, allegation__incident_date=datetime( 2015, 7, 2, tzinfo=pytz.utc), allegation__is_officer_complaint=False) # officer3 don't have allegation in ALLEGATION_MIN - ALLEGATION_MAX OfficerAllegationFactory.create_batch( 2, officer=officer3, allegation__incident_date=datetime(2015, 7, 2, tzinfo=pytz.utc), allegation__is_officer_complaint=True) OfficerAllegationFactory.create_batch( 3, officer=officer3, allegation__incident_date=datetime(2015, 7, 2, tzinfo=pytz.utc), allegation__is_officer_complaint=False) TRRFactory.create_batch(3, officer=officer3, trr_datetime=datetime(2015, 2, 1, tzinfo=pytz.utc)) expected_dict = { 1: { 'officer_id': 1, 'year': 2016, 'metric_allegation': 2, 'metric_allegation_civilian': 4, 'metric_allegation_internal': 3, 'metric_trr': 2, 'percentile_allegation': 66.6667, 'percentile_allegation_civilian': 66.6667, 'percentile_allegation_internal': 66.6667, 'percentile_trr': 33.3333 }, 2: { 'officer_id': 2, 'year': 2016, 'metric_allegation': 1, 'metric_allegation_civilian': 1, 'metric_allegation_internal': 1, 'metric_trr': 0.0, 'percentile_allegation': 33.3333, 'percentile_allegation_civilian': 0.0000, 'percentile_allegation_internal': 0.0000, 'percentile_trr': 0.0 }, 3: { 'officer_id': 3, 'year': 2016, 'metric_allegation': 0.0, 'metric_allegation_civilian': 3, 'metric_allegation_internal': 2, 'metric_trr': 3, 'percentile_allegation': 0.0, 'percentile_allegation_civilian': 33.3333, 'percentile_allegation_internal': 33.3333, 'percentile_trr': 66.6667, } } officers = officer_percentile.top_percentile(2016) for officer in officers: validate_object(officer, expected_dict[officer.id])