Projet

Général

Profil

0001-forms-always-enable-drafts-27476.patch

Frédéric Péters, 19 octobre 2018 16:15

Télécharger (14,7 ko)

Voir les différences:

Subject: [PATCH 1/2] forms: always enable drafts (#27476)

 tests/test_form_pages.py | 18 ++++-----
 wcs/api.py               |  2 +-
 wcs/forms/root.py        | 79 +++++++++++++++++++++++-----------------
 wcs/qommon/sessions.py   |  6 +++
 4 files changed, 59 insertions(+), 46 deletions(-)
tests/test_form_pages.py
1694 1694
    formdata.store()
1695 1695
    resp = login(get_app(pub), 'foo', 'foo').get('/test/%s' % formdata.id, status=403)
1696 1696

  
1697
    formdata.user_id = user.id
1698
    formdata.store()
1699
    formdef.enable_tracking_codes = False
1700
    formdef.store()
1701
    resp = login(get_app(pub), 'foo', 'foo').get('/test/%s' % formdata.id, status=403)
1702

  
1703 1697
def form_password_field_submit(pub, password):
1704 1698
    password = unicode(password).encode(pub.site_charset)
1705 1699
    formdef = create_formdef()
......
1938 1932
    next_page = next_page.forms[0].submit('submit')
1939 1933
    assert next_page.status_int == 302
1940 1934
    assert next_page.location == 'http://example.net/preview/test/'
1941
    assert formdef.data_class().count() == 0
1935
    assert len([x for x in formdef.data_class().select() if not x.is_draft()]) == 0
1942 1936

  
1943 1937
def test_form_item_data_source_field_submit(pub):
1944 1938
    def submit_item_data_source_field(ds):
......
4395 4389
    resp.form['f0'].value = 'Hello' # try again changing the value
4396 4390
    resp = resp.form.submit('submit')
4397 4391

  
4398
    assert formdef.data_class().count() == 1
4399
    assert formdef.data_class().select()[0].data['0'] == 'foo@localhost'
4392
    formdatas = [x for x in formdef.data_class().select() if not x.is_draft()]
4393
    assert len(formdatas) == 1
4394
    assert formdatas[0].data['0'] == 'foo@localhost'
4400 4395

  
4401 4396
    resp = login(get_app(pub), username='foo', password='foo').get('/test/')
4402 4397
    assert resp.form['f0'].value == 'foo@localhost'
......
4451 4446
    resp.form['f0'].value = '2018-09-24' # try again changing the value
4452 4447
    resp = resp.form.submit('submit')
4453 4448

  
4454
    assert formdef.data_class().count() == 1
4455
    assert time.strftime('%Y-%m-%d', formdef.data_class().select()[0].data['0']) == '2018-09-27'
4449
    formdatas = [x for x in formdef.data_class().select() if not x.is_draft()]
4450
    assert len(formdatas) == 1
4451
    assert time.strftime('%Y-%m-%d', formdatas[0].data['0']) == '2018-09-27'
4456 4452

  
4457 4453
def test_form_page_profile_verified_radio_item_prefill(pub):
4458 4454
    user = create_user(pub)
wcs/api.py
585 585
            if form.is_draft():
586 586
                if not include_drafts:
587 587
                    continue
588
                if form.formdef.is_disabled() or not form.formdef.enable_tracking_codes:
588
                if form.formdef.is_disabled():
589 589
                    # the form or its draft support has been disabled
590 590
                    continue
591 591
            elif not include_non_drafts:
wcs/forms/root.py
232 232
                return True
233 233
        return False
234 234

  
235
    def has_draft_support(self):
236
        if self.edit_mode:
237
            return False
238
        if self.formdef.enable_tracking_codes:
239
            return True
240
        session = get_session()
241
        return session.has_user()
242

  
235 243
    def step(self, step_no, current_page):
236 244
        get_logger().info('form %s - step %s' % (self.formdef.name, step_no))
237 245

  
......
284 292
        magictoken = get_request().form.get('magictoken')
285 293
        if magictoken:
286 294
            form_data = session.get_by_magictoken(magictoken, {})
287
            if self.formdef.enable_tracking_codes and not self.edit_mode:
295
            if self.has_draft_support():
288 296
                form.attrs['data-has-draft'] = 'yes'
289 297
        else:
290 298
            form_data = {}
......
398 406
            form.add_hidden('page_id', page.id)
399 407

  
400 408
        form.add_submit('cancel', _('Cancel'), css_class = 'cancel')
401
        if self.formdef.enable_tracking_codes and not self.edit_mode:
409
        if self.has_draft_support():
402 410
            form.add_submit('savedraft', _('Save Draft'), css_class = 'save-draft',
403 411
                    attrs={'style': 'display: none'})
404 412

  
......
408 416
            'form_side': lambda: self.form_side(0, page, data=data, magictoken=magictoken),
409 417
            'steps': lambda: self.step(0, page),
410 418
        }
411
        if self.formdef.enable_tracking_codes and data:
419
        if self.has_draft_support() and data:
412 420
            context['tracking_code_box'] = lambda: self.tracking_code_box(data, magictoken)
413 421

  
414 422
        return template.QommonTemplateResponse(
......
420 428
           (tracking code and steps).'''
421 429
        r = TemplateIO(html=True)
422 430
        r += htmltext('<div id="side">')
423
        if self.formdef.enable_tracking_codes and data:
431
        if self.has_draft_support() and data:
424 432
            # display tracking code box if they are enabled and there's some
425 433
            # data (e.g. the user is not on a insufficient authenticiation
426 434
            # context page)
......
431 439

  
432 440
    def tracking_code_box(self, data, magictoken):
433 441
        '''Create the tracking code box, it displays the current tracking code
434
           and a 'remove draft' button if the current form is a draft that has
435
           been recalled.'''
442
           if enabled, and a 'remove draft' button if the current form is a draft
443
           that has been recalled.'''
436 444
        r = TemplateIO(html=True)
437 445
        r += htmltext('<div id="tracking-code">')
438
        r += htmltext('<h3>%s</h3>') % _('Tracking code')
446
        if self.formdef.enable_tracking_codes:
447
            r += htmltext('<div class="tracking-code-part">')
448
            r += htmltext('<h3>%s</h3>') % _('Tracking code')
439 449

  
440
        tracking_code = None
441
        draft_formdata_id = data.get('draft_formdata_id')
442
        if draft_formdata_id:
443
            formdata = self.formdef.data_class().get(draft_formdata_id)
444
            tracking_code = formdata.tracking_code
445
        else:
446
            tracking_code = data.get('future_tracking_code')
450
            tracking_code = None
451
            draft_formdata_id = data.get('draft_formdata_id')
452
            if draft_formdata_id:
453
                formdata = self.formdef.data_class().get(draft_formdata_id)
454
                tracking_code = formdata.tracking_code
455
            else:
456
                tracking_code = data.get('future_tracking_code')
447 457

  
448
        if tracking_code:
449
            get_response().add_javascript(['jquery.js', 'jquery-ui.js', 'popup.js'])
450
            r += htmltext('<a rel="popup" href="%s">%s</a>') % (
451
                    'code/%s/' % tracking_code, tracking_code)
452
            r += TextsDirectory.get_html_text('tracking-code-short-text')
458
            if tracking_code:
459
                get_response().add_javascript(['jquery.js', 'jquery-ui.js', 'popup.js'])
460
                r += htmltext('<a rel="popup" href="%s">%s</a>') % (
461
                        'code/%s/' % tracking_code, tracking_code)
462
                r += TextsDirectory.get_html_text('tracking-code-short-text')
463
            r += htmltext('</div>')  # <!-- .tracking-code-part -->
453 464

  
454 465
        if data.get('is_recalled_draft'):
455 466
            r += htmltext('<form action="removedraft" method="POST">')
......
557 568
            # [session_var_id] is available on the first page.
558 569
            session.force()
559 570

  
560
        if self.formdef.enable_tracking_codes:
571
        if self.has_draft_support():
561 572
            if get_request().form.get('_ajax_form_token'):
562 573
                # _ajax_form_token is immediately removed, this prevents
563 574
                # late autosave() to overwrite data after the user went to a
......
590 601
            # first hit on first page, if tracking code are enabled and we
591 602
            # are not editing an existing formdata, generate a new tracking
592 603
            # code.
593
            if not self.edit_mode and self.formdef.enable_tracking_codes and not get_request().form.has_key('mt'):
604
            if not self.edit_mode and self.has_draft_support() and not get_request().form.has_key('mt'):
594 605
                tracking_code = get_publisher().tracking_code_class()
595 606
                tracking_code.store()
596 607
                token = randbytes(8)
......
620 631
        form.add_hidden('magictoken', '-1')
621 632
        form.add_submit('cancel')
622 633

  
623
        if self.formdef.enable_tracking_codes:
634
        if self.has_draft_support():
624 635
            form.add_submit('removedraft')
625 636
            form.add_submit('savedraft')
626 637

  
......
721 732
                        displayed_fields=submitted_fields,
722 733
                        transient_formdata=transient_formdata)
723 734
            form.add_submit('previous')
724
            if self.formdef.enable_tracking_codes:
735
            if self.has_draft_support():
725 736
                form.add_submit('removedraft')
726 737
                form.add_submit('savedraft')
727 738
            form.add_submit('submit')
728 739
            if page_no > 0 and form.get_submit() == 'previous':
729 740
                return self.previous_page(page_no, magictoken)
730 741

  
731
            if self.formdef.enable_tracking_codes and form.get_submit() == 'removedraft':
742
            if self.has_draft_support() and form.get_submit() == 'removedraft':
732 743
                return self.removedraft()
733 744

  
734 745
            form_data = session.get_by_magictoken(magictoken, {})
735 746
            data = self.formdef.get_data(form)
736 747
            form_data.update(data)
737 748

  
738
            if self.formdef.enable_tracking_codes and form.get_submit() == 'savedraft':
749
            if self.has_draft_support() and form.get_submit() == 'savedraft':
739 750
                filled = self.save_draft(form_data, page_no)
740 751
                return redirect(filled.get_url().rstrip('/'))
741 752

  
......
794 805
                        get_session().message = ('error', _('This form has already been submitted.'))
795 806
                        return redirect(get_publisher().get_backoffice_url() + '/submission/')
796 807
                    return template.error_page(_('This form has already been submitted.'))
797
            elif self.formdef.enable_tracking_codes and not self.edit_mode:
798
                # if there's no draft yet and tracking codes are enabled, create one
808
            elif self.has_draft_support():
809
                # if there's no draft yet and drafts are supported, create one
799 810
                filled = self.save_draft(form_data, page_no)
800 811

  
801 812
            # the page has been successfully submitted, maybe new pages
......
826 837
                    form.add_hidden('page', '-1')
827 838
                    form.add_hidden('magictoken', '-1')
828 839
                    form.add_submit('cancel')
829
                    if self.formdef.enable_tracking_codes:
840
                    if self.has_draft_support():
830 841
                        form.add_submit('removedraft')
831 842
                        form.add_submit('savedraft')
832 843

  
......
861 872
            if form.get_submit() == 'previous':
862 873
                return self.previous_page(len(self.pages), magictoken)
863 874

  
864
            if self.formdef.enable_tracking_codes and form.get_submit() == 'removedraft':
875
            if self.has_draft_support() and form.get_submit() == 'removedraft':
865 876
                return self.removedraft()
866 877

  
867
            if self.formdef.enable_tracking_codes and form.get_submit() == 'savedraft':
878
            if self.has_draft_support() and form.get_submit() == 'savedraft':
868 879
                filled = self.save_draft(form_data, page_no = -1)
869 880
                return redirect(filled.get_url().rstrip('/'))
870 881

  
......
1110 1121
        return redirect(url)
1111 1122

  
1112 1123
    def set_tracking_code(self, formdata, magictoken_data=None):
1113
        if not self.formdef.enable_tracking_codes:
1124
        if not self.has_draft_support():
1114 1125
            return
1115 1126
        if formdata.tracking_code:
1116 1127
            return
......
1181 1192
        form.add_submit('previous', _('Previous'))
1182 1193
        form.add_submit('cancel', _('Cancel'), css_class = 'cancel')
1183 1194
        session = get_session()
1184
        if self.formdef.enable_tracking_codes:
1195
        if self.has_draft_support():
1185 1196
            form.add_submit('savedraft', _('Save Draft'), css_class = 'save-draft',
1186 1197
                    attrs={'style': 'display: none'})
1187 1198
        form.add_hidden('step', '2')
......
1195 1206
                magictoken=magictoken),
1196 1207
            'steps': lambda: self.step(1, None),
1197 1208
        }
1198
        if self.formdef.enable_tracking_codes and data:
1209
        if self.has_draft_support() and data:
1199 1210
            context['tracking_code_box'] = lambda: self.tracking_code_box(data, magictoken)
1200 1211

  
1201 1212
        return template.QommonTemplateResponse(
......
1230 1241
                return redirect(get_publisher().get_backoffice_url() + '/submission/')
1231 1242
            return PublicFormStatusPage(self.formdef, filled)
1232 1243

  
1233
        if not (get_request().is_in_backoffice() or filled.formdef.enable_tracking_codes):
1244
        if not (get_request().is_in_backoffice() or self.has_draft_support()):
1234 1245
            # don't allow restoring drafts if drafts are no longer enabled for
1235 1246
            # this form.
1236 1247
            raise errors.AccessForbiddenError()
wcs/qommon/sessions.py
195 195
            except OSError:
196 196
                pass
197 197

  
198
    def has_user(self):
199
        user_id = QuixoteSession.get_user(self)
200
        if user_id and not str(user_id).startswith('anonymous-'):
201
            return True
202
        return False
203

  
198 204
    def get_user(self):
199 205
        user_id = QuixoteSession.get_user(self)
200 206
        if user_id:
201
-