def lookup_and_save(new, debug=False): """Merge new docket info into the database. Start by attempting to lookup an existing Docket. If that's not found, create a new one. Either way, merge all the attributes of `new` into the Docket found, and then save the Docket. Returns None if an error occurs, else, return the new or updated Docket. """ try: d = Docket.objects.get(pacer_case_id=new.pacer_case_id, court=new.court) except (Docket.DoesNotExist, Docket.MultipleObjectsReturned): d = None if d is None: ds = Docket.objects.filter(docket_number=new.docket_number, court=new.court).order_by('-date_filed') count = ds.count() if count < 1: # Can't find it by pacer_case_id or docket_number. Make a new item. d = Docket(source=Docket.RECAP) elif count == 1: # Nailed it! d = ds[0] elif count > 1: # Too many dockets returned. Disambiguate. logger.error("Got multiple results while attempting save.") def is_different(x): return x.pacer_case_id and x.pacer_case_id != new.pacer_case_id if all([is_different(d) for d in ds]): # All the dockets found match on docket number, but have # different pacer_case_ids. This means that the docket has # multiple pacer_case_ids in PACER, and we should mirror that # in CL by creating a new docket for the new item. d = Docket(source=Docket.RECAP) else: # Just use the most recent docket. Looking at the data, this is # OK. Nearly all of these are dockets associated with clusters # that can be merged (however, that's a project for clusters). d = ds[0] # Add RECAP as a source if it's not already. if d.source in [Docket.DEFAULT, Docket.SCRAPER]: d.source = Docket.RECAP_AND_SCRAPER elif d.source == Docket.COLUMBIA: d.source = Docket.COLUMBIA_AND_RECAP elif d.source == Docket.COLUMBIA_AND_SCRAPER: d.source = Docket.COLUMBIA_AND_RECAP_AND_SCRAPER for attr, v in new.__dict__.items(): setattr(d, attr, v) if not debug: d.save() logger.info("Saved as Docket %s: https://www.courtlistener.com%s" % (d.pk, d.get_absolute_url())) return d
def save(self, debug): """Save the item to the database, updating any existing items. Returns None if an error occurs. """ required_fields = ['case_name', 'date_filed'] for field in required_fields: if not getattr(self, field): print " Missing required field: %s" % field return None try: d = Docket.objects.get( Q(pacer_case_id=self.pacer_case_id) | Q(docket_number=self.docket_number), court=self.court, ) if d.source == Docket.SCRAPER: d.source = Docket.RECAP_AND_SCRAPER except Docket.DoesNotExist: d = Docket(source=Docket.RECAP, ) except Docket.MultipleObjectsReturned: print " Got multiple results while attempting save." return None for attr, v in self.__dict__.items(): setattr(d, attr, v) if not debug: d.save() print " Saved as Docket %s: https://www.courtlistener.com%s" % ( d.pk, d.get_absolute_url()) return d
def save(self, debug): """Save the item to the database, updating any existing items. Returns None if an error occurs. """ required_fields = ['case_name', 'date_filed'] for field in required_fields: if not getattr(self, field): print " Missing required field: %s" % field return None try: d = Docket.objects.get( Q(pacer_case_id=self.pacer_case_id) | Q(docket_number=self.docket_number), court=self.court, ) if d.source == Docket.SCRAPER: d.source = Docket.RECAP_AND_SCRAPER except Docket.DoesNotExist: d = Docket( source=Docket.RECAP, ) except Docket.MultipleObjectsReturned: print " Got multiple results while attempting save." return None for attr, v in self.__dict__.items(): setattr(d, attr, v) if not debug: d.save() print " Saved as Docket %s: https://www.courtlistener.com%s" % ( d.pk, d.get_absolute_url() ) return d