Skip to content

factory

django_spire.file.factory

logger = logging.getLogger(__name__) module-attribute

BATCH_SIZE_MAX = 20 module-attribute

EXTENSION_LENGTH_MAX = 20 module-attribute

FILENAME_LENGTH_MAX = 100 module-attribute

RELATED_FIELD_LENGTH_MAX = 50 module-attribute

FileFactory dataclass

related_field = '' class-attribute instance-attribute

app_name = 'Uncategorized' class-attribute instance-attribute

validator = field(default_factory=FileValidator) class-attribute instance-attribute

path_builder = field(init=False) class-attribute instance-attribute

__post_init__

Source code in django_spire/file/factory.py
def __post_init__(self) -> None:
    if len(self.related_field) > RELATED_FIELD_LENGTH_MAX:
        message = f'related_field must not exceed {RELATED_FIELD_LENGTH_MAX} characters.'
        raise ValueError(message)

    self.path_builder = FilePathBuilder(
        base_folder=settings.BASE_FOLDER_NAME,
        app_name=self.app_name,
    )

create

Source code in django_spire/file/factory.py
def create(self, file: InMemoryUploadedFile) -> File:
    self.validator.validate(file)

    file_obj = self._build_file_record(file)
    file_obj.save()
    return file_obj

create_many

Source code in django_spire/file/factory.py
def create_many(self, files: list[InMemoryUploadedFile]) -> list[File]:
    if not files:
        return []

    if len(files) > BATCH_SIZE_MAX:
        message = f'Cannot upload more than {BATCH_SIZE_MAX} files at once.'
        raise FileBatchLimitError(message)

    for file in files:
        self.validator.validate(file)

    built = [self._build_file_record(file) for file in files]

    try:
        return File.objects.bulk_create(built)
    except Exception:
        for file_obj in built:
            try:
                file_obj.file.delete(save=False)
            except Exception:
                logger.exception('Failed to clean up storage orphan: %s', file_obj.file.name)

        raise