0002-lazy-add-queryset-like-features-to-lazy-formdef-3224.patch
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 |
# check __len__ |
|
768 |
assert len(lazy_formdata.objects.drafts()) == 1 |
|
769 | ||
770 |
assert lazy_formdata.objects.current_user().count() == 0 |
|
771 |
pub.get_request()._user = () # reset cache |
|
772 |
pub.get_request().session = sessions.BasicSession(id=1) |
|
773 |
pub.get_request().session.set_user(pub.user_class.select()[0].id) |
|
774 |
assert lazy_formdata.objects.current_user().count() == 1 |
|
775 | ||
776 |
qs = lazy_formdata.objects.drafts() |
|
777 |
# check __iter__ |
|
778 |
for draft in qs: |
|
779 |
assert draft.internal_id == formdata.id |
|
780 |
# check __getitem__ |
|
781 |
assert qs[0].internal_id == formdata.id |
|
782 |
# check against for cached resultset |
|
783 |
assert qs[0].internal_id == formdata.id |
|
784 |
# check __iter__ with cached resultset |
|
785 |
for draft in qs: |
|
786 |
assert draft.internal_id == formdata.id |
|
787 | ||
743 | 788 | |
744 | 789 |
def test_lazy_variables(pub, variable_test_data): |
745 | 790 |
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 |
- |