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 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_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)
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)
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)