-
Notifications
You must be signed in to change notification settings - Fork 0
/
utils.py
63 lines (49 loc) · 2.07 KB
/
utils.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
import requests
import pytz
from decimal import Decimal
from django.db.models.fields import DateTimeField, DateField, TimeField, DecimalField
from django.db.models.fields.related import ForeignKey
from django.utils.dateparse import parse_date, parse_datetime, parse_time
def json_to_datetime(s):
""" Convert JSON to time zone aware datetime """
dt = parse_datetime(s)
if not dt.tzinfo:
tz = pytz.timezone('Africa/Johannesburg')
dt = tz.localize(dt)
return dt
def unserialize_json(data, model_class):
""" Take raw json data and unserialize to be compatible with a Django model """
all_fields = model_class._meta.get_all_field_names()
for field_name in data.keys():
# skip if the model doesn't have that field
if not (field_name in all_fields):
continue
# skip None
if not data[field_name]:
continue
value = data[field_name]
field_class = model_class._meta.get_field_by_name(field_name)[0]
# decimal
if issubclass(DecimalField, field_class.__class__):
value = Decimal(value)
# date
elif issubclass(DateField, field_class.__class__):
value = parse_date(data[field_name])
# time
elif issubclass(DateField, field_class.__class__):
value = parse_time(data[field_name])
# if not timezone aware default to SAST
if not value.tzinfo:
value = pytz.timezone('Africa/Johannesburg').localize(value)
# datetime
elif issubclass(DateTimeField, field_class.__class__):
value = parse_datetime(data[field_name])
# if not timezone aware default to SAST
if not value.tzinfo:
value = pytz.timezone('Africa/Johannesburg').localize(value)
# foreign key - lookup based on uuid
elif issubclass(ForeignKey, field_class.__class__):
value = field_class.related.parent_model.objects.all_with_deleted().get(uuid=data[field_name])
# done
data[field_name] = value
return data