Projet

Général

Profil

0001-general-use-datetime.date-in-DateField-9876.patch

Frédéric Péters, 09 février 2016 14:47

Télécharger (10,2 ko)

Voir les différences:

Subject: [PATCH] general: use datetime.date() in DateField (#9876)

 tests/test_form_pages.py | 63 +++++++++++++++++++++++++++++++++++++++++++++++-
 tests/test_formdata.py   |  3 ++-
 tests/test_sql.py        |  2 +-
 tests/test_workflows.py  |  2 +-
 wcs/fields.py            | 10 +++++++-
 wcs/formdata.py          | 10 +++++++-
 wcs/qommon/ezt.py        |  6 +++++
 wcs/qommon/misc.py       |  2 ++
 wcs/sql.py               |  9 ++++---
 9 files changed, 98 insertions(+), 9 deletions(-)
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
-