storage: handle datetime in criterias (#5931)

This commit is contained in:
Frédéric Péters 2014-11-22 11:20:49 +01:00
parent 251be76550
commit 2257f08193
3 changed files with 51 additions and 1 deletions

View File

@ -499,3 +499,29 @@ def test_sql_table_select():
assert len(data_class.select([st.Less('id', 26)])) == 25
assert len(data_class.select([st.Less('id', 25), st.GreaterOrEqual('id', 10)])) == 15
assert len(data_class.select([st.Less('id', 25), st.GreaterOrEqual('id', 10), lambda x: x.id >= 15])) == 10
@postgresql
def test_sql_table_select_datetime():
test_formdef = FormDef()
test_formdef.name = 'table select datetime'
test_formdef.fields = []
test_formdef.store()
data_class = test_formdef.data_class(mode='sql')
assert data_class.count() == 0
d = datetime.datetime(2014, 1, 1)
for i in range(50):
t = data_class()
t.receipt_time = (d + datetime.timedelta(days=i)).timetuple()
t.store()
assert data_class.count() == 50
assert len(data_class.select()) == 50
assert len(data_class.select(lambda x: x.receipt_time == d.timetuple())) == 1
assert len(data_class.select([st.Equal('receipt_time', d.timetuple())])) == 1
assert len(data_class.select([
st.Less('receipt_time', (d + datetime.timedelta(days=20)).timetuple())])) == 20
assert len(data_class.select([
st.Greater('receipt_time', (d + datetime.timedelta(days=20)).timetuple())])) == 29

View File

@ -1,3 +1,4 @@
import datetime
import sys
import shutil
import tempfile
@ -203,3 +204,22 @@ def test_select():
assert len(Foobar.select(lambda x: x.unique_value < 26)) == 25
assert len(Foobar.select([st.Less('unique_value', 26)])) == 25
assert len(Foobar.select([st.Less('unique_value', 25), st.GreaterOrEqual('unique_value', 10)])) == 15
def test_select_datetime():
Foobar.wipe()
d = datetime.datetime(2014, 1, 1)
for i in range(50):
test = Foobar()
test.receipt_time = (d + datetime.timedelta(days=i)).timetuple()
test.store()
assert len(Foobar.select()) == 50
assert len(Foobar.select(lambda x: x.receipt_time == d.timetuple())) == 1
assert len(Foobar.select([st.Equal('receipt_time', d.timetuple())])) == 1
assert len(Foobar.select([
st.Less('receipt_time', (d + datetime.timedelta(days=20)).timetuple())])) == 20
assert len(Foobar.select([
st.Greater('receipt_time', (d + datetime.timedelta(days=20)).timetuple())])) == 29

View File

@ -55,7 +55,11 @@ class Criteria(qommon.storage.Criteria):
return '%s %s %%(c%s)s' % (self.attribute, self.sql_op, id(self.value))
def as_sql_param(self):
return {'c%s' % id(self.value): self.value}
if isinstance(self.value, time.struct_time):
value = datetime.datetime.fromtimestamp(time.mktime(self.value))
else:
value = self.value
return {'c%s' % id(self.value): value}
class Less(Criteria):
sql_op = '<'