Repository URL to install this package:
|
Version:
0.0.1 ▾
|
dj-kaos-io
/
fields.py
|
|---|
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]