def __init__(self, dataset, data_generator, commit=True, create_site=False, validator=None, species_facade_class=HerbieFacade): self.dataset = dataset self.generator = data_generator self.create_site = create_site self.dataset = dataset self.schema = dataset.schema self.record_model = dataset.record_model self.validator = validator if validator else get_record_validator_for_dataset( dataset) # if species. First load species list from herbie. Should raise an exception if problem. self.species_id_by_name = {} if dataset.type == Dataset.TYPE_SPECIES_OBSERVATION: self.species_id_by_name = species_facade_class( ).name_id_by_species_name() # Schema foreign key for site. self.site_fk = self.schema.get_fk_for_model('Site') self.commit = commit self.file_name = self.generator.file_name if hasattr( self.generator, 'file_name') else None # Trick: use GeometryParser to get the site code self.geo_parser = GeometryParser(self.schema)
def post(self, request, *args, **kwargs): file_obj = request.data['file'] create_site = 'create_site' in request.data and to_bool(request.data['create_site']) delete_previous = 'delete_previous' in request.data and to_bool(request.data['delete_previous']) strict = 'strict' in request.data and to_bool(request.data['strict']) if file_obj.content_type not in FileReader.SUPPORTED_TYPES: msg = "Wrong file type {}. Should be one of: {}".format(file_obj.content_type, SiteUploader.SUPPORTED_TYPES) return Response(msg, status=status.HTTP_501_NOT_IMPLEMENTED) if delete_previous: self.dataset.record_queryset.delete() generator = FileReader(file_obj) validator = get_record_validator_for_dataset(self.dataset) validator.schema_error_as_warning = not strict creator = RecordCreator(self.dataset, generator, validator=validator, create_site=create_site, commit=True, species_facade_class=self.species_facade_class) data = [] has_error = False row = 1 # starts at 1 to match excel row id for record, validator_result in creator: row += 1 result = { 'row': row } if validator_result.has_errors: has_error = True else: result['recordId'] = record.id result.update(validator_result.to_dict()) data.append(result) status_code = status.HTTP_200_OK if not has_error else status.HTTP_400_BAD_REQUEST return Response(data, status=status_code)
def __call__(self, data): if not data: msg = "cannot be null or empty" raise ValidationError(('data', msg)) if self.dataset is not None: validator = get_record_validator_for_dataset(self.dataset, **self.kwargs) validator.schema_error_as_warning = not self.strict result = validator.validate(data) if result.has_errors: error_messages = ['{col_name}::{message}'.format(col_name=k, message=v) for k, v in result.errors.items()] raise ValidationError(error_messages)