Skip to content

Commit 058e881

Browse files
committed
date(time) conversions
1 parent d3bcbc8 commit 058e881

File tree

1 file changed

+56
-18
lines changed

1 file changed

+56
-18
lines changed

django_iris/operations.py

Lines changed: 56 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@
55
from itertools import chain
66
from datetime import datetime
77

8-
import traceback
8+
from django.utils.dateparse import parse_date, parse_datetime, parse_time
9+
910

1011
class DatabaseOperations(BaseDatabaseOperations):
1112

@@ -45,16 +46,9 @@ def no_limit_value(self):
4546
return None
4647

4748
def limit_offset_sql(self, low_mark, high_mark):
48-
# print("limit_offset_sql")
49-
limit, offset = self._get_limit_offset_params(low_mark, high_mark)
50-
return ' '.join(sql for sql in (
51-
# ('LIMIT %d' % limit) if limit else None,
52-
# ('OFFSET %d' % offset) if offset else None,
53-
) if sql)
49+
return ''
5450

5551
def adapt_datetimefield_value(self, value):
56-
# print('adapt_datetimefield_value', value)
57-
# print(*traceback.format_stack(), sep='\n')
5852
if value is None:
5953
return None
6054
# Expression values are adapted by the database.
@@ -66,7 +60,7 @@ def adapt_datetimefield_value(self, value):
6660
value += 2 ** 60
6761
else:
6862
value += -(2 ** 61 * 3)
69-
63+
7064
return str(value)
7165
# return str(value).split("+")[0]
7266

@@ -75,15 +69,59 @@ def get_db_converters(self, expression):
7569
internal_type = expression.output_field.get_internal_type()
7670
if internal_type == "DateTimeField":
7771
converters.append(self.convert_datetimefield_value)
72+
if internal_type == "TimeField":
73+
converters.append(self.convert_timefield_value)
74+
if internal_type == "DateField":
75+
converters.append(self.convert_datefield_value)
7876
return converters
7977

8078
def convert_datetimefield_value(self, value, expression, connection):
81-
# print('convert_datetimefield_value', value, expression)
82-
if isinstance(value, int):
83-
if value > 0:
84-
value -= 2 ** 60
85-
else:
86-
value -= -(2 ** 61 * 3)
87-
value = value / 1000000
88-
value = datetime.fromtimestamp(value)
79+
if value is not None:
80+
if isinstance(value, int):
81+
if value > 0:
82+
value -= 2 ** 60
83+
else:
84+
value -= -(2 ** 61 * 3)
85+
value = value / 1000000
86+
value = datetime.fromtimestamp(value)
87+
elif isinstance(value, str):
88+
if value != '':
89+
value = parse_datetime(value)
90+
if settings.USE_TZ and not timezone.is_aware(value):
91+
value = timezone.make_aware(
92+
value, self.connection.timezone)
8993
return value
94+
95+
def convert_datefield_value(self, value, expression, connection):
96+
if value is not None:
97+
if not isinstance(value, datetime.date):
98+
value = parse_date(value)
99+
return value
100+
101+
def convert_timefield_value(self, value, expression, connection):
102+
if value is not None:
103+
if not isinstance(value, datetime.time):
104+
value = parse_time(value)
105+
return value
106+
107+
def conditional_expression_supported_in_where_clause(self, expression):
108+
return False
109+
110+
def adapt_datefield_value(self, value):
111+
print('adapt_datefield_value: ' + str(value))
112+
if value == None:
113+
return None
114+
return str(value)
115+
116+
def adapt_datetimefield_value(self, value):
117+
print('adapt_datetimefield_value: ' + str(value))
118+
if value == None:
119+
return None
120+
return str(value)
121+
122+
def adapt_timefield_value(self, value):
123+
if value is None:
124+
return None
125+
if timezone.is_aware(value):
126+
raise ValueError("Django does not support timezone-aware times.")
127+
return str(value)

0 commit comments

Comments
 (0)