Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
dj-kaos-io / fields.py
Size: Mime:
from functools import reduce

from kaos_io.exceptions import DataImportException


class DataField:
    cleanups = []

    def __init__(self, header, symbol=None, cleanups=None, **kwargs):
        self.header = header
        self.symbol = symbol
        if cleanups:
            self.cleanups = cleanups

    def clean(self, data):
        return reduce(
            lambda acc, curr: [curr(item) for item in acc] if isinstance(acc, list) else curr(acc),
            self.cleanups, data
        )


class IntegerDataField(DataField):
    def clean(self, data):
        cleaned_data = super(IntegerDataField, self).clean(data)
        return int(cleaned_data)


class StripStringField(DataField):
    def __init__(self, *args, **kwargs):
        super(StripStringField, self).__init__(*args, **kwargs)
        self.cleanups = [str, str.strip, *self.cleanups]


class GetObjectField(DataField):
    def get_object(self, cleaned_value):
        accessor_value = self.transform_accessor(cleaned_value)
        try:
            return self.model_class.objects.get(**{self.accessor_field: accessor_value})
        except self.model_class.DoesNotExist:
            raise DataImportException(f"{self.model_class._meta.verbose_name} with ref {cleaned_value} does not exist")

    def __init__(self, *args, **kwargs):
        super(GetObjectField, self).__init__(*args, **kwargs)
        self.model_class = kwargs['model_class']
        self.accessor_field = kwargs['accessor_field']
        self.transform_accessor = kwargs.get('transform_accessor', lambda x: x)

    def clean(self, data):
        cleaned_value = super(GetObjectField, self).clean(data.strip())
        return self.get_object(cleaned_value)


class GetOrCreateObjectField(GetObjectField):
    def __init__(self, *args, **kwargs):
        super(GetOrCreateObjectField, self).__init__(*args, **kwargs)
        self.defaults = kwargs['defaults']

    def get_object(self, cleaned_value):
        accessor_value = self.transform_accessor(cleaned_value)
        defaults = {k: f(cleaned_value) for k, f in self.defaults.items()}
        return self.model_class.objects.get_or_create(**{self.accessor_field: accessor_value}, defaults=defaults)[0]