Improve logic for non-nullable fields (#6962)

This commit is contained in:
Oliver 2024-04-05 16:16:55 +11:00 committed by GitHub
parent cdeaa81295
commit afa6586e10
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -84,25 +84,48 @@ class InvenTreeResource(ModelResource):
return [f for f in fields if f.column_name not in fields_to_exclude] return [f for f in fields if f.column_name not in fields_to_exclude]
def before_import(self, dataset, using_transactions, dry_run, **kwargs):
"""Run custom code before importing data.
- Determine the list of fields which need to be converted to empty strings
"""
# Construct a map of field names
db_fields = {field.name: field for field in self.Meta.model._meta.fields}
for field_name, field in self.fields.items():
# Skip read-only fields (they cannot be imported)
if field.readonly:
continue
# Determine the name of the associated column in the dataset
column = getattr(field, 'column_name', field_name)
# Determine the attribute name of the associated database field
attribute = getattr(field, 'attribute', field_name)
# Check if the associated database field is a non-nullable string
if db_field := db_fields.get(attribute):
if (
isinstance(db_field, CharField)
and db_field.blank
and not db_field.null
):
if column not in self.CONVERT_NULL_FIELDS:
self.CONVERT_NULL_FIELDS.append(column)
return super().before_import(dataset, using_transactions, dry_run, **kwargs)
def before_import_row(self, row, row_number=None, **kwargs): def before_import_row(self, row, row_number=None, **kwargs):
"""Run custom code before importing each row. """Run custom code before importing each row.
- Convert any null fields to empty strings, for fields which do not support null values - Convert any null fields to empty strings, for fields which do not support null values
""" """
# We can automatically determine which fields might need such a conversion
for field in self.Meta.model._meta.fields:
if (
isinstance(field, CharField)
and field.blank
and not field.null
and field.name not in self.CONVERT_NULL_FIELDS
):
self.CONVERT_NULL_FIELDS.append(field.name)
for field in self.CONVERT_NULL_FIELDS: for field in self.CONVERT_NULL_FIELDS:
if field in row and row[field] is None: if field in row and row[field] is None:
row[field] = '' row[field] = ''
return super().before_import_row(row, row_number, **kwargs)
class CustomRateAdmin(RateAdmin): class CustomRateAdmin(RateAdmin):
"""Admin interface for the Rate class.""" """Admin interface for the Rate class."""