0001-general-use-datetime.date-in-DateField-9876.patch
tests/test_form_pages.py | ||
---|---|---|
2048 | 2048 |
assert formdef.data_class().count() == 1 |
2049 | 2049 |
data_id = formdef.data_class().select()[0].id |
2050 | 2050 |
data = formdef.data_class().get(data_id) |
2051 |
assert time.strftime('%Y-%m-%d', data.data['0']) == '2015-01-01'
|
|
2051 |
assert data.data['0'].strftime('%Y-%m-%d') == '2015-01-01'
|
|
2052 | 2052 | |
2053 | 2053 |
# without filling the field |
2054 | 2054 |
resp = get_app(pub).get('/test/') |
... | ... | |
2504 | 2504 |
assert 'message-to-submitter' in page.body |
2505 | 2505 |
assert 'message-to-nobody' not in page.body |
2506 | 2506 |
assert 'message-to-xxx-and-submitter' in page.body |
2507 | ||
2508 |
def test_formdata_dates_json(pub): |
|
2509 |
create_user(pub) |
|
2510 |
wf = Workflow(name='status') |
|
2511 |
st1 = wf.add_status('Status1', 'st1') |
|
2512 | ||
2513 |
display_form = FormWorkflowStatusItem() |
|
2514 |
display_form.id = '_x' |
|
2515 |
display_form.by = ['_submitter'] |
|
2516 |
display_form.varname = 'xxx' |
|
2517 |
display_form.formdef = WorkflowFormFieldsFormDef(item=display_form) |
|
2518 |
display_form.formdef.fields.append(fields.DateField(id='1', label='Date', |
|
2519 |
type='date', varname='yyy')) |
|
2520 |
st1.items.append(display_form) |
|
2521 |
display_form.parent = st1 |
|
2522 | ||
2523 |
display_message = DisplayMessageWorkflowStatusItem() |
|
2524 |
display_message.message = '''The form has been recorded. |
|
2525 |
[if-any form_var_ttt]the 1st day is [form_var_ttt_raw.tm_mday][end] |
|
2526 |
[if-any xxx_var_yyy]the 2nd day is [xxx_var_yyy_raw.tm_mday][end]''' |
|
2527 |
st1.items.append(display_message) |
|
2528 |
display_message.parent = st1 |
|
2529 | ||
2530 |
wf.store() |
|
2531 | ||
2532 |
formdef = create_formdef() |
|
2533 |
formdef.workflow_id = wf.id |
|
2534 |
formdef.fields = [fields.DateField(id='0', label='string', type='date', |
|
2535 |
required=False, varname='ttt')] |
|
2536 |
formdef.store() |
|
2537 |
formdef.data_class().wipe() |
|
2538 | ||
2539 |
resp = login(get_app(pub), username='foo', password='foo').get('/test/') |
|
2540 |
resp.form['f0'] = '2013-11-17' |
|
2541 |
resp = resp.forms[0].submit('submit') |
|
2542 |
assert 'Check values then click submit.' in resp.body |
|
2543 |
resp = resp.forms[0].submit('submit') |
|
2544 |
assert resp.status_int == 302 |
|
2545 |
resp = resp.follow() |
|
2546 |
assert 'The form has been recorded' in resp.body |
|
2547 |
assert 'the 1st day is 17' in resp.body |
|
2548 | ||
2549 |
resp.forms[0]['f1'] = '2014-10-23' |
|
2550 |
resp = resp.forms[0].submit('submit') |
|
2551 |
resp = resp.follow() |
|
2552 |
assert 'the 1st day is 17' in resp.body |
|
2553 |
assert 'the 2nd day is 23' in resp.body |
|
2554 | ||
2555 |
assert formdef.data_class().count() == 1 |
|
2556 |
formdata = formdef.data_class().select()[0] |
|
2557 |
formdata_json_reload = json.loads(formdata.export_to_json()) |
|
2558 |
assert formdata_json_reload['workflow']['data']['xxx_var_yyy_raw'].startswith('2014-10-23') |
|
2559 | ||
2560 |
# test backward compatibility, when time.struct_time where used for dates |
|
2561 |
formdata.data['0'] = time.strptime('2013-11-17', '%Y-%m-%d') |
|
2562 |
formdata.workflow_data['xxx_var_yyy_rawdata'] = time.strptime('2014-10-23', '%Y-%m-%d') |
|
2563 |
formdata.store() |
|
2564 | ||
2565 |
resp = login(get_app(pub), username='foo', password='foo').get(formdata.get_url()) |
|
2566 |
assert 'the 1st day is 17' in resp.body |
|
2567 |
assert 'the 2nd day is 23' in resp.body |
tests/test_formdata.py | ||
---|---|---|
1 |
import datetime |
|
1 | 2 |
import pytest |
2 | 3 |
import sys |
3 | 4 |
import shutil |
... | ... | |
208 | 209 |
formdata.store() |
209 | 210 | |
210 | 211 |
formdata2 = formdata.get(formdata.id) |
211 |
assert formdata2.data == {'0': value}
|
|
212 |
assert formdata2.data == {'0': datetime.date(2015, 5, 12)}
|
|
212 | 213 | |
213 | 214 |
assert formdata2.get_substitution_variables()['form_field_date'] == '2015-05-12' |
214 | 215 |
pub.cfg['language'] = {'language': 'fr'} |
tests/test_sql.py | ||
---|---|---|
170 | 170 | |
171 | 171 |
@postgresql |
172 | 172 |
def test_sql_field_date(): |
173 |
check_sql_field('5', datetime.date.today().timetuple())
|
|
173 |
check_sql_field('5', datetime.date.today()) |
|
174 | 174 | |
175 | 175 |
@postgresql |
176 | 176 |
def test_sql_field_items(): |
tests/test_workflows.py | ||
---|---|---|
730 | 730 |
assert formdata.get_substitution_variables()['xxx_var_date'] == '12/05/2015' |
731 | 731 | |
732 | 732 |
assert formdata.get_substitution_variables()['xxx_var_date_raw'] == \ |
733 |
time.strptime('2015-05-12', '%Y-%m-%d')
|
|
733 |
datetime.date(2015, 5, 12)
|
|
734 | 734 | |
735 | 735 |
two_pubs.cfg['language'] = {'language': 'en'} |
736 | 736 |
wcs/fields.py | ||
---|---|---|
14 | 14 |
# You should have received a copy of the GNU General Public License |
15 | 15 |
# along with this program; if not, see <http://www.gnu.org/licenses/>. |
16 | 16 | |
17 |
import datetime |
|
17 | 18 |
import time |
18 | 19 |
import random |
19 | 20 |
import re |
... | ... | |
140 | 141 |
anonymise = True |
141 | 142 |
stats = None |
142 | 143 | |
144 |
migrate_data = None |
|
145 | ||
143 | 146 |
def __init__(self, **kwargs): |
144 | 147 |
for k, v in kwargs.items(): |
145 | 148 |
setattr(self, k.replace('-', '_'), v) |
... | ... | |
878 | 881 |
'minimum_date', 'minimum_is_future', 'maximum_date', |
879 | 882 |
'date_in_the_past', 'date_can_be_today'] |
880 | 883 | |
884 |
def migrate_data(self, value): |
|
885 |
if isinstance(value, time.struct_time): |
|
886 |
return datetime.date(value.tm_year, value.tm_mon, value.tm_mday) |
|
887 |
return value |
|
888 | ||
881 | 889 |
def convert_value_from_str(self, value): |
882 |
return time.strptime(value, date_format())
|
|
890 |
return datetime.datetime.strptime(value, date_format()).date()
|
|
883 | 891 | |
884 | 892 |
def convert_value_to_str(self, value): |
885 | 893 |
if value is None: |
wcs/formdata.py | ||
---|---|---|
31 | 31 |
from qommon.substitution import Substitutions |
32 | 32 | |
33 | 33 |
from roles import Role |
34 |
from fields import FileField |
|
34 |
from fields import FileField, DateField
|
|
35 | 35 | |
36 | 36 | |
37 | 37 |
def get_dict_with_varnames(fields, data, formdata=None, varnames_only=False): |
... | ... | |
201 | 201 |
if evo.status and not evo.status.startswith('wf-'): |
202 | 202 |
evo.status = 'wf-%s' % evo.status |
203 | 203 |
changed = True |
204 |
if self._formdef and self._formdef.fields: |
|
205 |
for field in self._formdef.fields: |
|
206 |
if field.migrate_data: |
|
207 |
current_value = self.data.get(field.id) |
|
208 |
new_value = field.migrate_data(current_value) |
|
209 |
if current_value != new_value: |
|
210 |
self.data[field.id] = new_value |
|
211 |
changed = True |
|
204 | 212 |
if changed: |
205 | 213 |
self.store() |
206 | 214 |
wcs/qommon/ezt.py | ||
---|---|---|
223 | 223 |
# http://svn.webdav.org/repos/projects/ezt/trunk/ |
224 | 224 |
# |
225 | 225 | |
226 |
import datetime |
|
226 | 227 |
import string |
227 | 228 |
import re |
228 | 229 |
from types import StringType, IntType, FloatType, LongType |
... | ... | |
629 | 630 | |
630 | 631 |
# walk the rest of the dotted reference |
631 | 632 |
for attr in rest: |
633 |
if isinstance(ob, datetime.date) or isinstance(ob, datetime.datetime): |
|
634 |
# backward compatibility support from datetime to time.struct_time |
|
635 |
attr = {'tm_year': 'year', 'tm_mon': 'month', 'tm_mday': 'day', |
|
636 |
'tm_hour': 'hour', 'tm_min': 'minute', 'tm_sec': 'second', |
|
637 |
}.get(attr, attr) |
|
632 | 638 |
try: |
633 | 639 |
ob = getattr(ob, attr) |
634 | 640 |
except AttributeError: |
wcs/qommon/misc.py | ||
---|---|---|
400 | 400 | |
401 | 401 |
class JSONEncoder(json.JSONEncoder): |
402 | 402 |
def default(self, obj): |
403 |
if isinstance(obj, datetime.date): |
|
404 |
return obj.strftime('%Y-%m-%d') |
|
403 | 405 |
if isinstance(obj, time.struct_time): |
404 | 406 |
return datetime.datetime.utcfromtimestamp(time.mktime(obj)).isoformat() + 'Z' |
405 | 407 |
# Let the base class default method raise the TypeError |
wcs/sql.py | ||
---|---|---|
873 | 873 |
elif sql_type == 'varchar': |
874 | 874 |
assert isinstance(value, basestring) |
875 | 875 |
elif sql_type == 'date': |
876 |
assert type(value) is time.struct_time |
|
877 |
value = datetime.datetime(value.tm_year, value.tm_mon, value.tm_mday) |
|
876 |
if type(value) is time.struct_time: |
|
877 |
value = datetime.datetime(value.tm_year, value.tm_mon, value.tm_mday) |
|
878 |
elif type(value) not in (datetime.datetime, datetime.date): |
|
879 |
assert 'invalid data type for date' |
|
878 | 880 |
elif sql_type == 'bytea': |
879 | 881 |
value = bytearray(cPickle.dumps(value)) |
880 | 882 |
elif sql_type == 'boolean': |
... | ... | |
907 | 909 |
d[fmt] = unicode(val, 'utf-8') |
908 | 910 |
value = d |
909 | 911 |
if sql_type == 'date': |
910 |
value = value.timetuple() |
|
912 |
if isinstance(value, datetime.datetime): |
|
913 |
value = value.date() |
|
911 | 914 |
elif sql_type == 'bytea': |
912 | 915 |
value = cPickle.loads(str(value)) |
913 | 916 |
obdata[field.id] = value |
914 |
- |