Projet

Général

Profil

0002-lazy-add-queryset-like-features-to-lazy-formdef-3224.patch

Frédéric Péters, 14 avril 2019 10:13

Télécharger (7,18 ko)

Voir les différences:

Subject: [PATCH 2/3] lazy: add queryset-like features to lazy formdef (#32244)

{% for formdata in form.formdef.objects.pending %}
  {{formdata.number}}
{% endfor %}
 tests/test_formdata.py | 42 +++++++++++++++++++++++++++
 wcs/qommon/storage.py  |  5 ++++
 wcs/variables.py       | 64 ++++++++++++++++++++++++++++++++++++++----
 3 files changed, 106 insertions(+), 5 deletions(-)
tests/test_formdata.py
16 16
from wcs.formdef import FormDef
17 17
from wcs.formdata import Evolution
18 18
from wcs.roles import Role
19
from wcs import sessions
19 20
from wcs.variables import LazyFormData
20 21
from wcs.workflows import Workflow, WorkflowStatusItem, WorkflowCriticalityLevel, WorkflowBackofficeFieldsFormDef
21 22
from wcs.wf.anonymise import AnonymiseWorkflowStatusItem
......
616 617
    pub.substitutions.feed(pub)
617 618
    pub.substitutions.feed(formdef)
618 619
    pub.substitutions.feed(formdata)
620
    return LazyFormData(formdata)
619 621

  
620 622
def test_lazy_formdata(pub, variable_test_data):
621 623
    formdata = FormDef.select()[0].data_class().select()[0]
......
740 742
    lazy_formdata = LazyFormData(formdata)
741 743
    assert lazy_formdata.tracking_code == tracking_code.id
742 744

  
745
def test_lazy_formdata_queryset(pub, variable_test_data):
746
    lazy_formdata = variable_test_data
747
    data_class = lazy_formdata._formdef.data_class()
748
    for i in range(6):
749
        formdata = data_class()
750
        formdata.just_created()
751
        formdata.store()
752
    for i in range(4):
753
        formdata = data_class()
754
        formdata.just_created()
755
        formdata.jump_status('finished')
756
        formdata.store()
757

  
758
    formdata = data_class()
759
    formdata.status = 'draft'
760
    formdata.store()
761

  
762
    assert lazy_formdata.objects.count() == 11
763
    assert lazy_formdata.objects.drafts().count() == 1
764
    assert lazy_formdata.objects.pending().count() == 7
765
    assert lazy_formdata.objects.done().count() == 4
766
    assert lazy_formdata.objects.drafts().count() == 1
767

  
768
    assert lazy_formdata.objects.current_user().count() == 0
769
    pub.get_request()._user = ()  # reset cache
770
    pub.get_request().session = sessions.BasicSession(id=1)
771
    pub.get_request().session.set_user(pub.user_class.select()[0].id)
772
    assert lazy_formdata.objects.current_user().count() == 1
773

  
774
    # check __iter__
775
    for draft in lazy_formdata.objects.drafts():
776
        assert draft.internal_id == formdata.id
777
    # check __getitem__
778
    assert lazy_formdata.objects.drafts()[0].internal_id == formdata.id
779
    # check against for cached resultset
780
    assert lazy_formdata.objects.drafts()[0].internal_id == formdata.id
781
    # check __iter__ with cached resultset
782
    for draft in lazy_formdata.objects.drafts():
783
        assert draft.internal_id == formdata.id
784

  
743 785

  
744 786
def test_lazy_variables(pub, variable_test_data):
745 787
    formdata = FormDef.select()[0].data_class().select()[0]
wcs/qommon/storage.py
289 289
            objects = _take(objects, limit, offset)
290 290
        return list(objects)
291 291

  
292
    @classmethod
293
    def select_iterator(cls, **kwargs):
294
        for obj in cls.select(**kwargs):
295
            yield obj
296

  
292 297
    @classmethod
293 298
    def has_key(cls, id):
294 299
        filename = os.path.join(cls.get_objects_dir(), fix_key(id))
wcs/variables.py
16 16

  
17 17
from django.utils.functional import SimpleLazyObject
18 18

  
19
from quixote import get_publisher
19
from quixote import get_publisher, get_request
20 20

  
21 21
import qommon.misc
22 22
from qommon.evalutils import make_datetime
23 23
from qommon.templatetags.qommon import parse_datetime
24
from qommon.storage import (Or, Equal, NotEqual)
24 25

  
25 26

  
26 27
class LazyFormDefObjectsManager(object):
27
    def __init__(self, formdef):
28
    def __init__(self, formdef, criterias=None):
28 29
        self._formdef = formdef
30
        if criterias is None:
31
            criterias = [NotEqual('status', 'draft')]
32
            # add custom marker to criteria so it can be found back and removed in
33
            # drafts().
34
            criterias[0].exclude_drafts = True
35
        self._criterias = criterias
36
        self._cached_resultset = None
29 37

  
30
    @property
31 38
    def count(self):
32
        return self._formdef.data_class().count()
39
        return self._formdef.data_class().count(clause=self._criterias)
40

  
41
    def all(self):
42
        # (mimicking django)
43
        return LazyFormDefObjectsManager(self._formdef)
44

  
45
    def pending(self):
46
        status_filters = ['wf-%s' % x.id for x in
47
                          self._formdef.workflow.get_not_endpoint_status()]
48
        criterias = [Or([Equal('status', x) for x in status_filters])]
49
        return LazyFormDefObjectsManager(
50
                self._formdef, self._criterias + criterias)
51

  
52
    def current_user(self):  # filter on current user
53
        user = get_request().user
54
        return LazyFormDefObjectsManager(self._formdef,
55
                self._criterias + [Equal('user_id', str(user.id) if user else '-1')])
56

  
57
    def drafts(self):
58
        criterias = [x for x in self._criterias if not getattr(x, 'exclude_drafts', False)]
59
        return LazyFormDefObjectsManager(self._formdef,
60
                criterias + [Equal('status', 'draft')])
61

  
62
    def done(self):
63
        status_filters = ['wf-%s' % x.id for x in
64
                          self._formdef.workflow.get_endpoint_status()]
65
        criterias = [Or([Equal('status', x) for x in status_filters])]
66
        return LazyFormDefObjectsManager(self._formdef,
67
                self._criterias + criterias)
33 68

  
34 69
    def __getattr__(self, attribute):
70
        # backward compatibility
35 71
        if attribute.startswith('count_status_'):
36 72
            status = attribute[len('count_status_'):]
37 73
            return len(self._formdef.data_class().get_ids_with_indexed_value(
38 74
                'status', 'wf-%s' % status))
39
        return super(FormDefSubstVar, self).__getattr__(attribute)
75
        return super(LazyFormDefObjectsManager, self).__getattr__(attribute)
76

  
77
    def __len__(self):
78
        if self._cached_resultset:
79
            return len(self._cached_resultset)
80
        return self.count
81

  
82
    def __getitem__(self, key):
83
        if self._cached_resultset is None:
84
            self._cached_resultset = self._formdef.data_class().select(clause=self._criterias)
85
        return LazyFormData(self._cached_resultset[key])
86

  
87
    def __iter__(self):
88
        if self._cached_resultset:
89
            for formdata in self._cached_resultset:
90
                yield LazyFormData(formdata)
91
        data_class = self._formdef.data_class()
92
        for formdata in self._formdef.data_class().select_iterator(clause=self._criterias):
93
            yield LazyFormData(formdata)
40 94

  
41 95

  
42 96
class LazyFormDef(object):
43
-