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)
Example #2
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])
Example #3
0
    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])
Example #4
0
    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])
Example #5
0
    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])