Skip to content

Commit 903489f

Browse files
committed
Use new major tri.declarative and tri.form
1 parent 0ca664b commit 903489f

File tree

5 files changed

+96
-54
lines changed

5 files changed

+96
-54
lines changed

HISTORY.rst

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,16 @@
11
Changelog
22
---------
33

4+
5.0.0 (2019-04-12)
5+
~~~~~~~~~~~~~~~~~~
6+
7+
* Make `Variable` shortcuts compatible with subclassing
8+
9+
* Use the new major tri.declarative, and update to follow the new style of class member shortcuts
10+
11+
* Added missing `Variable.multi_choice` shortcut
12+
13+
414
4.2.0 (2019-04-01)
515
~~~~~~~~~~~~~~~~~~
616

lib/tri/query/__init__.py

Lines changed: 67 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ class Variable(RefinableObject):
186186
show=True,
187187
attr=MISSING,
188188
gui=Namespace(
189-
call_target=Field,
189+
call_target__cls=Field,
190190
show=False,
191191
required=False,
192192
),
@@ -248,19 +248,21 @@ def value_to_q(variable, op, value_string_or_f):
248248
else:
249249
return r
250250

251-
@staticmethod
252-
def from_model(model, field_name=None, model_field=None, **kwargs):
251+
@classmethod
252+
def from_model(cls, model, field_name=None, model_field=None, **kwargs):
253253
return member_from_model(
254+
cls=cls,
254255
model=model,
255256
factory_lookup=_variable_factory_by_django_field_type,
256257
field_name=field_name,
257258
model_field=model_field,
258259
defaults_factory=lambda model_field: {},
259260
**kwargs)
260261

261-
@staticmethod
262-
def expand_member(model, field_name=None, model_field=None, **kwargs):
262+
@classmethod
263+
def expand_member(cls, model, field_name=None, model_field=None, **kwargs):
263264
return expand_member(
265+
cls=cls,
264266
model=model,
265267
factory_lookup=_variable_factory_by_django_field_type,
266268
field_name=field_name,
@@ -281,7 +283,7 @@ def case_sensitive(cls, call_target=None, **kwargs):
281283

282284
@classmethod
283285
@class_shortcut(
284-
gui__call_target=Field.choice,
286+
gui__call_target__attribute='choice',
285287
)
286288
def choice(cls, call_target=None, **kwargs): # pragma: no cover
287289
"""
@@ -295,7 +297,21 @@ def choice(cls, call_target=None, **kwargs): # pragma: no cover
295297

296298
@classmethod
297299
@class_shortcut(
298-
gui__call_target=Field.choice_queryset,
300+
gui__call_target__attribute='multi_choice',
301+
)
302+
def multi_choice(cls, call_target=None, **kwargs): # pragma: no cover
303+
"""
304+
Field that has one value out of a set.
305+
:type choices: list
306+
"""
307+
setdefaults_path(kwargs, dict(
308+
gui__choices=kwargs.get('choices'),
309+
))
310+
return call_target(**kwargs)
311+
312+
@classmethod
313+
@class_shortcut(
314+
gui__call_target__attribute='choice_queryset',
299315
op_to_q_op=lambda op: 'exact',
300316
value_to_q_lookup='name',
301317
value_to_q=choice_queryset_value_to_q,
@@ -319,84 +335,109 @@ def choice_queryset(cls, choices, call_target=None, **kwargs):
319335

320336
@classmethod
321337
@class_shortcut(
322-
class_call_target="choice_queryset",
323-
gui__call_target=Field.multi_choice_queryset,
338+
call_target__attribute="choice_queryset",
339+
gui__call_target__attribute='multi_choice_queryset',
324340
)
325341
def multi_choice_queryset(cls, call_target=None, **kwargs):
326342
return call_target(**kwargs)
327343

328344
@classmethod
329345
@class_shortcut(
330-
gui__call_target=Field.boolean,
346+
gui__call_target__attribute='boolean',
331347
value_to_q=boolean_value_to_q,
332348
)
333349
def boolean(cls, call_target=None, **kwargs):
334350
return call_target(**kwargs)
335351

336352
@classmethod
337353
@class_shortcut(
338-
gui__call_target=Field.boolean_tristate,
354+
gui__call_target__attribute='boolean_tristate',
339355
value_to_q=boolean_value_to_q,
340356
)
341357
def boolean_tristate(cls, call_target=None, **kwargs):
342358
return call_target(**kwargs)
343359

344360
@classmethod
345361
@class_shortcut(
346-
gui__call_target=Field.integer,
362+
gui__call_target__attribute='integer',
347363
)
348364
def integer(cls, call_target=None, **kwargs):
349365
return call_target(**kwargs)
350366

351367
@classmethod
352368
@class_shortcut(
353-
gui__call_target=Field.float,
369+
gui__call_target__attribute='float',
354370
)
355371
def float(cls, call_target=None, **kwargs):
356372
return call_target(**kwargs)
357373

358374
@classmethod
359375
@class_shortcut(
360-
gui__call_target=Field.url,
376+
gui__call_target__attribute='url',
361377
)
362378
def url(cls, call_target=None, **kwargs):
363379
return call_target(**kwargs)
364380

365381
@classmethod
366382
@class_shortcut(
367-
gui__call_target=Field.time,
383+
gui__call_target__attribute='time',
368384
)
369385
def time(cls, call_target=None, **kwargs):
370386
return call_target(**kwargs)
371387

372388
@classmethod
373389
@class_shortcut(
374-
gui__call_target=Field.datetime,
390+
gui__call_target__attribute='datetime',
375391
)
376392
def datetime(cls, call_target=None, **kwargs):
377393
return call_target(**kwargs)
378394

379395
@classmethod
380396
@class_shortcut(
381-
gui__call_target=Field.date,
397+
gui__call_target__attribute='date',
382398
)
383399
def date(cls, call_target=None, **kwargs):
384400
return call_target(**kwargs)
385401

386402
@classmethod
387403
@class_shortcut(
388-
gui__call_target=Field.email,
404+
gui__call_target__attribute='email',
389405
)
390406
def email(cls, call_target=None, **kwargs):
391407
return call_target(**kwargs)
392408

393409
@classmethod
394410
@class_shortcut(
395-
gui__call_target=Field.decimal,
411+
gui__call_target__attribute='decimal',
396412
)
397413
def decimal(cls, call_target=None, **kwargs):
398414
return call_target(**kwargs)
399415

416+
@classmethod
417+
@class_shortcut(
418+
call_target__attribute='choice_queryset',
419+
)
420+
def foreign_key(cls, model_field, model, call_target, **kwargs):
421+
del model
422+
setdefaults_path(
423+
kwargs,
424+
choices=model_field.foreign_related_fields[0].model.objects.all(),
425+
)
426+
return call_target(model_field=model_field, **kwargs)
427+
428+
@classmethod
429+
@class_shortcut(
430+
call_target__attribute='multi_choice_queryset',
431+
)
432+
def many_to_many(cls, call_target, model_field, **kwargs):
433+
setdefaults_path(
434+
kwargs,
435+
choices=model_field.remote_field.model.objects.all(),
436+
extra__django_related_field=True,
437+
)
438+
kwargs['model'] = model_field.remote_field.model
439+
return call_target(model_field=model_field, **kwargs)
440+
400441

401442
class StringValue(text_type):
402443
def __new__(cls, s):
@@ -446,6 +487,13 @@ class CarQuery(Query):
446487
endpoint = Refinable()
447488
""" :type: tri.declarative.Namespace """
448489

490+
member_class = Refinable()
491+
form_class = Refinable()
492+
493+
class Meta:
494+
member_class = Variable
495+
form_class = Form
496+
449497
@dispatch(
450498
gui__call_target=Form,
451499
endpoint_dispatch_prefix='query',

lib/tri/query/db_compat.py

Lines changed: 17 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from tri.declarative import setdefaults_path
1+
from tri.declarative import Shortcut
22

33
from tri.query import register_variable_factory
44

@@ -8,33 +8,24 @@ def setup_db_compat():
88

99

1010
def setup_db_compat_django():
11-
from tri.query import Variable
12-
from django.db.models import IntegerField, FloatField, TextField, BooleanField, AutoField, CharField, CommaSeparatedIntegerField, DateField, DateTimeField, DecimalField, EmailField, URLField, TimeField, ForeignKey, ManyToOneRel, ManyToManyField, ManyToManyRel
13-
14-
def foreign_key_factory(model_field, **kwargs):
15-
setdefaults_path(kwargs, dict(
16-
choices=model_field.foreign_related_fields[0].model.objects.all()
17-
))
18-
return Variable.choice_queryset(**kwargs)
11+
from django.db.models import IntegerField, FloatField, TextField, BooleanField, AutoField, CharField, DateField, DateTimeField, DecimalField, EmailField, URLField, TimeField, ForeignKey, ManyToOneRel, ManyToManyField, ManyToManyRel
1912

2013
# The order here is significant because of inheritance structure. More specific must be below less specific.
21-
register_variable_factory(CharField, Variable),
22-
register_variable_factory(URLField, Variable.url),
23-
register_variable_factory(TimeField, Variable.time),
24-
register_variable_factory(EmailField, Variable.email),
25-
register_variable_factory(DecimalField, Variable.decimal),
26-
register_variable_factory(DateField, Variable.date),
27-
register_variable_factory(DateTimeField, Variable.datetime),
28-
register_variable_factory(BooleanField, Variable.boolean),
29-
register_variable_factory(TextField, Variable.text),
30-
register_variable_factory(FloatField, Variable.float),
31-
register_variable_factory(IntegerField, Variable.integer),
32-
33-
register_variable_factory(CommaSeparatedIntegerField, lambda **kwargs: Variable.comma_separated(parent_field=Variable.integer(**kwargs))),
34-
register_variable_factory(AutoField, lambda **kwargs: Variable.integer(**setdefaults_path(kwargs, dict(show=False)))),
35-
register_variable_factory(ManyToManyField, lambda model_field, **kwargs: Variable.multi_choice_queryset(model_field=model_field, **setdefaults_path(kwargs, dict(choices=model_field.rel.to._default_manager.all())))),
14+
register_variable_factory(CharField, Shortcut()),
15+
register_variable_factory(URLField, Shortcut(call_target__attribute='url')),
16+
register_variable_factory(TimeField, Shortcut(call_target__attribute='time')),
17+
register_variable_factory(EmailField, Shortcut(call_target__attribute='email')),
18+
register_variable_factory(DecimalField, Shortcut(call_target__attribute='decimal')),
19+
register_variable_factory(DateField, Shortcut(call_target__attribute='date')),
20+
register_variable_factory(DateTimeField, Shortcut(call_target__attribute='datetime')),
21+
register_variable_factory(BooleanField, Shortcut(call_target__attribute='boolean')),
22+
register_variable_factory(TextField, Shortcut(call_target__attribute='text')),
23+
register_variable_factory(FloatField, Shortcut(call_target__attribute='float')),
24+
register_variable_factory(IntegerField, Shortcut(call_target__attribute='integer')),
25+
26+
register_variable_factory(AutoField, Shortcut(call_target__attribute='integer', show=False))
27+
register_variable_factory(ManyToManyField, Shortcut(call_target__attribute='many_to_many'))
3628

3729
register_variable_factory(ManyToOneRel, None),
3830
register_variable_factory(ManyToManyRel, None),
39-
# (ManyToManyRel_Related, None),
40-
register_variable_factory(ForeignKey, foreign_key_factory),
31+
register_variable_factory(ForeignKey, Shortcut(call_target__attribute='foreign_key'))

requirements.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
tri.declarative >= 1.2.0
1+
tri.declarative >= 2.0.0, < 3.0.0
22
tri.named_struct
33
tri.struct
4-
tri.form >= 5.2.2, < 6.0.0
4+
tri.form >= 6.0.0, < 7.0.0
55
pyparsing
66
six

tests/test_query.py

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -46,13 +46,6 @@ class ShowQuery(Query):
4646
assert [x.name for x in ShowQuery(request=Struct(GET=Data(foo='show'))).bound_variables] == ['foo', 'bar']
4747

4848

49-
def test_namespace_merge():
50-
v = Variable(gui__show=True)
51-
assert v.gui.call_target == Field
52-
v = Variable(gui=Struct(show=True))
53-
assert v.gui.call_target == Field
54-
55-
5649
def test_request_data():
5750
r = Struct(method='POST', POST='POST', GET='GET')
5851
assert request_data(r) == 'POST'

0 commit comments

Comments
 (0)