Пример #1
0
 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)
Пример #2
0
    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)
Пример #3
0
 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)