def test_updates_to_active_location_when_inactive_duplicate_exists(self):
        self.assertNotEqual(self.credit.prison, None)

        existing_prison = self.credit.prison
        new_prison = Prison.objects.exclude(pk=existing_prison.pk).first()
        prisoner_name = random_prisoner_name()

        PrisonerLocation.objects.create(
            created_by=User.objects.first(),
            prisoner_name=prisoner_name,
            prisoner_number=self.credit.prisoner_number,
            prisoner_dob=self.credit.prisoner_dob,
            prison=new_prison,
            active=False
        )
        PrisonerLocation.objects.create(
            created_by=User.objects.first(),
            prisoner_name=prisoner_name,
            prisoner_number=self.credit.prisoner_number,
            prisoner_dob=self.credit.prisoner_dob,
            prison=existing_prison,
            active=True
        )

        credit_prisons_need_updating.send(sender=None)

        self.credit.refresh_from_db()
        self.assertEqual(self.credit.prison.pk, existing_prison.pk)
        self.assertEqual(self.credit.prisoner_name, prisoner_name)
Exemple #2
0
 def post(self, request, *args, **kwargs):
     self.get_queryset().filter(active=True).delete()
     self.get_queryset().filter(active=False).update(active=True)
     credit_prisons_need_updating.send(sender=PrisonerLocation)
     prisoner_profile_current_prisons_need_updating.send(
         sender=PrisonerLocation)
     return Response(status=status.HTTP_204_NO_CONTENT)
    def test_without_prisoner_locations_doesnt_set_prison(self):
        self.assertEqual(self.credit.prison, None)

        credit_prisons_need_updating.send(sender=None)

        self.credit.refresh_from_db()
        self.assertEqual(self.credit.prison, None)
    def test_updates_to_active_location_when_inactive_duplicate_exists(self):
        self.assertNotEqual(self.credit.prison, None)

        existing_prison = self.credit.prison
        new_prison = Prison.objects.exclude(pk=existing_prison.pk).first()
        prisoner_name = random_prisoner_name()

        PrisonerLocation.objects.create(
            created_by=User.objects.first(),
            prisoner_name=prisoner_name,
            prisoner_number=self.credit.prisoner_number,
            prisoner_dob=self.credit.prisoner_dob,
            prison=new_prison,
            active=False
        )
        PrisonerLocation.objects.create(
            created_by=User.objects.first(),
            prisoner_name=prisoner_name,
            prisoner_number=self.credit.prisoner_number,
            prisoner_dob=self.credit.prisoner_dob,
            prison=existing_prison,
            active=True
        )

        credit_prisons_need_updating.send(sender=None)

        self.credit.refresh_from_db()
        self.assertEqual(self.credit.prison.pk, existing_prison.pk)
        self.assertEqual(self.credit.prisoner_name, prisoner_name)
    def test_without_prisoner_locations_doesnt_set_prison(self):
        self.assertEqual(self.credit.prison, None)

        credit_prisons_need_updating.send(sender=None)

        self.credit.refresh_from_db()
        self.assertEqual(self.credit.prison, None)
Exemple #6
0
    def test_prisoner_location_doesnt_update_credit(self):
        existing_prison = self.credit.prison
        other_prison = Prison.objects.exclude(pk=existing_prison.pk).first()
        new_prisoner_name = random_prisoner_name()

        PrisonerLocation.objects.create(
            created_by=User.objects.first(),
            prisoner_name=new_prisoner_name,
            prisoner_number=self.credit.prisoner_number,
            prisoner_dob=self.credit.prisoner_dob,
            prison=other_prison,
            active=True)

        credit_prisons_need_updating.send(sender=None)

        self.credit.refresh_from_db()
        self.assertNotEqual(self.credit.prisoner_name, new_prisoner_name)
        self.assertEqual(self.credit.prison.pk, existing_prison.pk)
    def test_prisoner_location_doesnt_update_credit(self):
        existing_prison = self.credit.prison
        other_prison = Prison.objects.exclude(pk=existing_prison.pk).first()
        new_prisoner_name = random_prisoner_name()

        PrisonerLocation.objects.create(
            created_by=User.objects.first(),
            prisoner_name=new_prisoner_name,
            prisoner_number=self.credit.prisoner_number,
            prisoner_dob=self.credit.prisoner_dob,
            prison=other_prison,
            active=True
        )

        credit_prisons_need_updating.send(sender=None)

        self.credit.refresh_from_db()
        self.assertNotEqual(self.credit.prisoner_name, new_prisoner_name)
        self.assertEqual(self.credit.prison.pk, existing_prison.pk)
Exemple #8
0
    def test_with_prisoner_locations_sets_prison(self):
        self.assertEqual(self.credit.prison, None)

        prison = Prison.objects.first()
        prisoner_name = random_prisoner_name()

        PrisonerLocation.objects.create(
            created_by=User.objects.first(),
            prisoner_name=prisoner_name,
            prisoner_number=self.credit.prisoner_number,
            prisoner_dob=self.credit.prisoner_dob,
            prison=prison,
            active=True)

        credit_prisons_need_updating.send(sender=None)

        self.credit.refresh_from_db()
        self.assertEqual(self.credit.prison.pk, prison.pk)
        self.assertEqual(self.credit.prisoner_name, prisoner_name)
    def test_with_prisoner_locations_sets_prison(self):
        self.assertEqual(self.credit.prison, None)

        prison = Prison.objects.first()
        prisoner_name = random_prisoner_name()

        PrisonerLocation.objects.create(
            created_by=User.objects.first(),
            prisoner_name=prisoner_name,
            prisoner_number=self.credit.prisoner_number,
            prisoner_dob=self.credit.prisoner_dob,
            prison=prison,
            active=True
        )

        credit_prisons_need_updating.send(sender=None)

        self.credit.refresh_from_db()
        self.assertEqual(self.credit.prison.pk, prison.pk)
        self.assertEqual(self.credit.prisoner_name, prisoner_name)
Exemple #10
0
    def handle(self, **options):
        if not all(
            options.get(field)
            for field in ('offender_endpoint', 'oauth_endpoint', 'oauth_client', 'oauth_secret')
        ):
            raise CommandError('Missing Single Offender ID details')

        self.verbosity = options.get('verbosity', 1)
        self.modified_only = options['modified_only']

        self.known_prisons = set(Prison.objects.values_list('nomis_id', flat=True)) - self.excluded_nomis_ids
        if self.verbosity:
            self.stdout.write('%d known prisons' % len(self.known_prisons))
            self.stdout.write('Starting Single Offender ID session')
        session = OAuth2Session(
            client=BackendApplicationClient(client_id=options['oauth_client'])
        )
        session.fetch_token(
            token_url=options['oauth_endpoint'],
            client_id=options['oauth_client'],
            client_secret=options['oauth_secret'],
        )

        PrisonerLocation.objects.filter(active=False).delete()
        query = {
            'per_page': options['page_size'],
        }
        if self.modified_only and PrisonerLocation.objects.exists():
            updated_after = PrisonerLocation.objects.latest().created - datetime.timedelta(hours=1)
            if self.verbosity > 1:
                self.stdout.write('Only loading offenders modified since %s' % updated_after)
            query['updated_after'] = updated_after.strftime('%Y-%m-%dT%H:%M:%S')
        page = 1
        locations_updated = 0
        while True:
            response = session.get(
                options['offender_endpoint'],
                params=dict(page=page, **query)
            )
            prisoners = response.json()
            if not prisoners:
                break
            prisoner_locations, locations_to_delete = self.process_batch(prisoners)
            with atomic():
                if self.modified_only:
                    for prisoner_location in prisoner_locations:
                        prisoner_location.active = True
                        locations_to_delete.append(prisoner_location.prisoner_number)
                    PrisonerLocation.objects.filter(prisoner_number__in=locations_to_delete).delete()
                PrisonerLocation.objects.bulk_create(prisoner_locations)
            page += 1
            locations_updated += len(prisoner_locations)

        if not self.modified_only:
            with atomic():
                PrisonerLocation.objects.filter(active=True).delete()
                PrisonerLocation.objects.filter(active=False).update(active=True)

        credit_prisons_need_updating.send(sender=PrisonerLocation)

        if self.verbosity:
            self.stdout.write('%d prisoner locations loaded' % locations_updated)
 def post(self, request, *args, **kwargs):
     self.get_queryset().filter(active=True).delete()
     self.get_queryset().filter(active=False).update(active=True)
     credit_prisons_need_updating.send(sender=PrisonerLocation)
     prisoner_profile_current_prisons_need_updating.send(sender=PrisonerLocation)
     return Response(status=status.HTTP_204_NO_CONTENT)