clear-skies 2.0.7__py3-none-any.whl → 2.0.9__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of clear-skies might be problematic. Click here for more details.
- {clear_skies-2.0.7.dist-info → clear_skies-2.0.9.dist-info}/METADATA +1 -1
- clear_skies-2.0.9.dist-info/RECORD +256 -0
- clearskies/__init__.py +2 -2
- clearskies/authentication/authentication.py +1 -3
- clearskies/authentication/authorization.py +12 -5
- clearskies/authentication/authorization_pass_through.py +5 -3
- clearskies/authentication/jwks.py +25 -23
- clearskies/authentication/secret_bearer.py +15 -17
- clearskies/autodoc/schema/schema.py +1 -1
- clearskies/backends/api_backend.py +50 -56
- clearskies/backends/backend.py +14 -14
- clearskies/backends/cursor_backend.py +17 -23
- clearskies/backends/memory_backend.py +27 -30
- clearskies/backends/secrets_backend.py +13 -18
- clearskies/column.py +44 -56
- clearskies/columns/audit.py +14 -13
- clearskies/columns/belongs_to_id.py +10 -15
- clearskies/columns/belongs_to_model.py +6 -9
- clearskies/columns/belongs_to_self.py +13 -9
- clearskies/columns/boolean.py +13 -16
- clearskies/columns/category_tree.py +9 -11
- clearskies/columns/category_tree_children.py +2 -3
- clearskies/columns/category_tree_descendants.py +1 -1
- clearskies/columns/created.py +8 -11
- clearskies/columns/created_by_authorization_data.py +7 -9
- clearskies/columns/created_by_header.py +12 -8
- clearskies/columns/created_by_ip.py +6 -8
- clearskies/columns/created_by_routing_data.py +12 -7
- clearskies/columns/created_by_user_agent.py +6 -9
- clearskies/columns/date.py +12 -14
- clearskies/columns/datetime.py +19 -17
- clearskies/columns/email.py +3 -1
- clearskies/columns/float.py +10 -14
- clearskies/columns/has_many.py +8 -10
- clearskies/columns/has_many_self.py +13 -7
- clearskies/columns/has_one.py +2 -0
- clearskies/columns/integer.py +9 -11
- clearskies/columns/json.py +10 -12
- clearskies/columns/many_to_many_ids.py +14 -16
- clearskies/columns/many_to_many_ids_with_data.py +16 -16
- clearskies/columns/many_to_many_models.py +5 -7
- clearskies/columns/many_to_many_pivots.py +3 -5
- clearskies/columns/phone.py +12 -9
- clearskies/columns/select.py +12 -9
- clearskies/columns/string.py +1 -1
- clearskies/columns/timestamp.py +15 -15
- clearskies/columns/updated.py +8 -10
- clearskies/columns/uuid.py +7 -10
- clearskies/configs/__init__.py +8 -0
- clearskies/configs/any.py +2 -0
- clearskies/configs/any_dict.py +2 -0
- clearskies/configs/any_dict_or_callable.py +2 -0
- clearskies/configs/boolean.py +2 -0
- clearskies/configs/boolean_or_callable.py +2 -0
- clearskies/configs/callable_config.py +2 -0
- clearskies/configs/config.py +2 -0
- clearskies/configs/datetime.py +2 -0
- clearskies/configs/datetime_or_callable.py +2 -0
- clearskies/configs/email.py +10 -0
- clearskies/configs/email_list.py +17 -0
- clearskies/configs/email_list_or_callable.py +19 -0
- clearskies/configs/email_or_email_list_or_callable.py +59 -0
- clearskies/configs/float.py +2 -0
- clearskies/configs/float_or_callable.py +2 -0
- clearskies/configs/integer.py +2 -0
- clearskies/configs/integer_or_callable.py +2 -0
- clearskies/configs/list_any_dict.py +2 -0
- clearskies/configs/list_any_dict_or_callable.py +2 -0
- clearskies/configs/model_column.py +2 -0
- clearskies/configs/model_columns.py +2 -0
- clearskies/configs/model_destination_name.py +2 -1
- clearskies/configs/model_to_id_column.py +2 -0
- clearskies/configs/readable_model_column.py +2 -0
- clearskies/configs/readable_model_columns.py +2 -0
- clearskies/configs/searchable_model_columns.py +2 -0
- clearskies/configs/select.py +2 -0
- clearskies/configs/select_list.py +2 -0
- clearskies/configs/string.py +4 -2
- clearskies/configs/string_dict.py +2 -0
- clearskies/configs/string_list.py +17 -2
- clearskies/configs/string_list_or_callable.py +13 -0
- clearskies/configs/timedelta.py +2 -0
- clearskies/configs/timezone.py +2 -0
- clearskies/configs/url.py +2 -0
- clearskies/configs/writeable_model_column.py +2 -0
- clearskies/configs/writeable_model_columns.py +2 -0
- clearskies/configurable.py +2 -0
- clearskies/contexts/cli.py +9 -1
- clearskies/contexts/context.py +13 -14
- clearskies/contexts/wsgi.py +12 -10
- clearskies/contexts/wsgi_ref.py +12 -6
- clearskies/decorators.py +1 -1
- clearskies/decorators.pyi +10 -0
- clearskies/di/di.py +7 -6
- clearskies/di/inject/by_class.py +2 -0
- clearskies/di/inject/by_name.py +2 -0
- clearskies/di/inject/di.py +2 -0
- clearskies/di/inject/environment.py +1 -1
- clearskies/di/inject/now.py +2 -0
- clearskies/di/inject/requests.py +2 -0
- clearskies/di/inject/secrets.py +2 -2
- clearskies/di/inject/utcnow.py +2 -0
- clearskies/di/inject/uuid.py +2 -2
- clearskies/end.py +45 -7
- clearskies/endpoint.py +43 -59
- clearskies/endpoint_group.py +15 -18
- clearskies/endpoints/advanced_search.py +19 -26
- clearskies/endpoints/callable.py +10 -16
- clearskies/endpoints/create.py +6 -10
- clearskies/endpoints/delete.py +5 -11
- clearskies/endpoints/get.py +11 -15
- clearskies/endpoints/health_check.py +9 -11
- clearskies/endpoints/list.py +29 -36
- clearskies/endpoints/restful_api.py +43 -53
- clearskies/endpoints/schema.py +14 -18
- clearskies/endpoints/simple_search.py +5 -12
- clearskies/endpoints/update.py +6 -11
- clearskies/environment.py +2 -0
- clearskies/input_outputs/cli.py +2 -0
- clearskies/input_outputs/headers.py +2 -0
- clearskies/input_outputs/input_output.py +15 -15
- clearskies/input_outputs/programmatic.py +2 -2
- clearskies/input_outputs/wsgi.py +2 -2
- clearskies/model.py +120 -25
- clearskies/query/query.py +1 -4
- clearskies/secrets/__init__.py +2 -1
- clearskies/secrets/akeyless.py +16 -11
- clearskies/secrets/secrets.py +7 -2
- clearskies/security_header.py +4 -2
- clearskies/security_headers/cache_control.py +15 -14
- clearskies/security_headers/cors.py +10 -9
- clearskies/security_headers/csp.py +25 -24
- clearskies/security_headers/hsts.py +6 -5
- clearskies/typing.py +1 -1
- clearskies/validator.py +5 -6
- clearskies/validators/after_column.py +6 -7
- clearskies/validators/before_column.py +2 -0
- clearskies/validators/in_the_future.py +5 -8
- clearskies/validators/in_the_future_at_least.py +2 -0
- clearskies/validators/in_the_future_at_most.py +2 -0
- clearskies/validators/in_the_past.py +5 -8
- clearskies/validators/in_the_past_at_least.py +2 -0
- clearskies/validators/in_the_past_at_most.py +2 -0
- clearskies/validators/maximum_length.py +4 -5
- clearskies/validators/maximum_value.py +4 -4
- clearskies/validators/minimum_length.py +4 -4
- clearskies/validators/minimum_value.py +4 -4
- clearskies/validators/required.py +2 -4
- clearskies/validators/timedelta.py +8 -9
- clearskies/validators/unique.py +2 -3
- clear_skies-2.0.7.dist-info/RECORD +0 -251
- {clear_skies-2.0.7.dist-info → clear_skies-2.0.9.dist-info}/WHEEL +0 -0
- {clear_skies-2.0.7.dist-info → clear_skies-2.0.9.dist-info}/licenses/LICENSE +0 -0
clearskies/model.py
CHANGED
|
@@ -4,7 +4,6 @@ import re
|
|
|
4
4
|
from abc import abstractmethod
|
|
5
5
|
from typing import TYPE_CHECKING, Any, Callable, Iterator, Self
|
|
6
6
|
|
|
7
|
-
from clearskies.autodoc.schema import Schema as AutoDocSchema
|
|
8
7
|
from clearskies.di import InjectableProperties, inject
|
|
9
8
|
from clearskies.functional import string
|
|
10
9
|
from clearskies.query import Condition, Join, Query, Sort
|
|
@@ -12,6 +11,7 @@ from clearskies.schema import Schema
|
|
|
12
11
|
|
|
13
12
|
if TYPE_CHECKING:
|
|
14
13
|
from clearskies import Column
|
|
14
|
+
from clearskies.autodoc.schema import Schema as AutoDocSchema
|
|
15
15
|
from clearskies.backends import Backend
|
|
16
16
|
|
|
17
17
|
|
|
@@ -63,6 +63,7 @@ class Model(Schema, InjectableProperties):
|
|
|
63
63
|
from typing import Self
|
|
64
64
|
import clearskies
|
|
65
65
|
|
|
66
|
+
|
|
66
67
|
class Fish(clearskies.Model):
|
|
67
68
|
@classmethod
|
|
68
69
|
def destination_name(cls: type[Self]) -> str:
|
|
@@ -86,6 +87,7 @@ class Model(Schema, InjectableProperties):
|
|
|
86
87
|
```
|
|
87
88
|
import clearskies
|
|
88
89
|
|
|
90
|
+
|
|
89
91
|
class User(clearskies.Model):
|
|
90
92
|
id_column_name = "id"
|
|
91
93
|
backend = clearskies.backends.MemoryBackend()
|
|
@@ -93,11 +95,15 @@ class Model(Schema, InjectableProperties):
|
|
|
93
95
|
id = clearskies.columns.Uuid()
|
|
94
96
|
name = clearskies.columns.String()
|
|
95
97
|
|
|
98
|
+
|
|
96
99
|
def my_application(user, users, by_type_hint: User):
|
|
97
100
|
return {
|
|
98
|
-
"all_are_user_models": isinstance(user, User)
|
|
101
|
+
"all_are_user_models": isinstance(user, User)
|
|
102
|
+
and isinstance(users, User)
|
|
103
|
+
and isinstance(by_type_hint, User)
|
|
99
104
|
}
|
|
100
105
|
|
|
106
|
+
|
|
101
107
|
cli = clearskies.contexts.Cli(my_application, classes=[User])
|
|
102
108
|
cli()
|
|
103
109
|
```
|
|
@@ -149,11 +155,13 @@ class Model(Schema, InjectableProperties):
|
|
|
149
155
|
import datetime
|
|
150
156
|
import clearskies
|
|
151
157
|
|
|
158
|
+
|
|
152
159
|
class SomeClass:
|
|
153
160
|
# Since this will be built by the DI system directly, we can declare dependencies in the __init__
|
|
154
161
|
def __init__(self, some_date):
|
|
155
162
|
self.some_date = some_date
|
|
156
163
|
|
|
164
|
+
|
|
157
165
|
class User(clearskies.Model):
|
|
158
166
|
id_column_name = "id"
|
|
159
167
|
backend = clearskies.backends.MemoryBackend()
|
|
@@ -167,15 +175,17 @@ class Model(Schema, InjectableProperties):
|
|
|
167
175
|
def some_date_in_the_past(self):
|
|
168
176
|
return self.some_class.some_date < self.utcnow
|
|
169
177
|
|
|
178
|
+
|
|
170
179
|
def my_application(user):
|
|
171
180
|
return user.some_date_in_the_past()
|
|
172
181
|
|
|
182
|
+
|
|
173
183
|
cli = clearskies.contexts.Cli(
|
|
174
184
|
my_application,
|
|
175
185
|
classes=[User],
|
|
176
186
|
bindings={
|
|
177
187
|
"some_date": datetime.datetime.now(datetime.timezone.utc) - datetime.timedelta(days=1),
|
|
178
|
-
}
|
|
188
|
+
},
|
|
179
189
|
)
|
|
180
190
|
cli()
|
|
181
191
|
```
|
|
@@ -321,6 +331,7 @@ class Model(Schema, InjectableProperties):
|
|
|
321
331
|
```python
|
|
322
332
|
import clearskies
|
|
323
333
|
|
|
334
|
+
|
|
324
335
|
class User(clearskies.Model):
|
|
325
336
|
id_column_name = "id"
|
|
326
337
|
backend = clearskies.backends.MemoryBackend()
|
|
@@ -328,12 +339,16 @@ class Model(Schema, InjectableProperties):
|
|
|
328
339
|
id = clearskies.columns.Uuid()
|
|
329
340
|
name = clearskies.columns.String()
|
|
330
341
|
|
|
342
|
+
|
|
331
343
|
def my_application(user):
|
|
332
|
-
user.save(
|
|
333
|
-
|
|
334
|
-
|
|
344
|
+
user.save(
|
|
345
|
+
{
|
|
346
|
+
"name": "Awesome Person",
|
|
347
|
+
}
|
|
348
|
+
)
|
|
335
349
|
return {"id": user.id, "name": user.name}
|
|
336
350
|
|
|
351
|
+
|
|
337
352
|
cli = clearskies.contexts.Cli(
|
|
338
353
|
my_application,
|
|
339
354
|
classes=[User],
|
|
@@ -346,6 +361,7 @@ class Model(Schema, InjectableProperties):
|
|
|
346
361
|
```python
|
|
347
362
|
import clearskies
|
|
348
363
|
|
|
364
|
+
|
|
349
365
|
class User(clearskies.Model):
|
|
350
366
|
id_column_name = "id"
|
|
351
367
|
backend = clearskies.backends.MemoryBackend()
|
|
@@ -353,11 +369,13 @@ class Model(Schema, InjectableProperties):
|
|
|
353
369
|
id = clearskies.columns.Uuid()
|
|
354
370
|
name = clearskies.columns.String()
|
|
355
371
|
|
|
372
|
+
|
|
356
373
|
def my_application(user):
|
|
357
374
|
user.name = "Awesome Person"
|
|
358
375
|
user.save()
|
|
359
376
|
return {"id": user.id, "name": user.name}
|
|
360
377
|
|
|
378
|
+
|
|
361
379
|
cli = clearskies.contexts.Cli(
|
|
362
380
|
my_application,
|
|
363
381
|
classes=[User],
|
|
@@ -379,6 +397,7 @@ class Model(Schema, InjectableProperties):
|
|
|
379
397
|
```
|
|
380
398
|
import clearskies
|
|
381
399
|
|
|
400
|
+
|
|
382
401
|
class User(clearskies.Model):
|
|
383
402
|
id_column_name = "id"
|
|
384
403
|
backend = clearskies.backends.MemoryBackend()
|
|
@@ -386,8 +405,8 @@ class Model(Schema, InjectableProperties):
|
|
|
386
405
|
id = clearskies.columns.Uuid()
|
|
387
406
|
name = clearskies.columns.String()
|
|
388
407
|
|
|
389
|
-
def my_application(user):
|
|
390
408
|
|
|
409
|
+
def my_application(user):
|
|
391
410
|
if not user:
|
|
392
411
|
print("We will execute a create operation")
|
|
393
412
|
|
|
@@ -406,6 +425,7 @@ class Model(Schema, InjectableProperties):
|
|
|
406
425
|
|
|
407
426
|
return {"id": user.id, "name": user.name}
|
|
408
427
|
|
|
428
|
+
|
|
409
429
|
cli = clearskies.contexts.Cli(
|
|
410
430
|
my_application,
|
|
411
431
|
classes=[User],
|
|
@@ -422,6 +442,7 @@ class Model(Schema, InjectableProperties):
|
|
|
422
442
|
```
|
|
423
443
|
import clearskies
|
|
424
444
|
|
|
445
|
+
|
|
425
446
|
class User(clearskies.Model):
|
|
426
447
|
id_column_name = "id"
|
|
427
448
|
backend = clearskies.backends.MemoryBackend()
|
|
@@ -429,6 +450,7 @@ class Model(Schema, InjectableProperties):
|
|
|
429
450
|
id = clearskies.columns.Uuid()
|
|
430
451
|
name = clearskies.columns.String()
|
|
431
452
|
|
|
453
|
+
|
|
432
454
|
def my_application(user):
|
|
433
455
|
# create a record with just an id
|
|
434
456
|
user.save(no_data=True)
|
|
@@ -438,6 +460,7 @@ class Model(Schema, InjectableProperties):
|
|
|
438
460
|
|
|
439
461
|
return {"id": user.id, "name": user.name}
|
|
440
462
|
|
|
463
|
+
|
|
441
464
|
cli = clearskies.contexts.Cli(
|
|
442
465
|
my_application,
|
|
443
466
|
classes=[User],
|
|
@@ -517,6 +540,7 @@ class Model(Schema, InjectableProperties):
|
|
|
517
540
|
from typing import Any, Self
|
|
518
541
|
import clearskies
|
|
519
542
|
|
|
543
|
+
|
|
520
544
|
class User(clearskies.Model):
|
|
521
545
|
id_column_name = "id"
|
|
522
546
|
backend = clearskies.backends.MemoryBackend()
|
|
@@ -536,6 +560,7 @@ class Model(Schema, InjectableProperties):
|
|
|
536
560
|
print("Nothing changed")
|
|
537
561
|
return data
|
|
538
562
|
|
|
563
|
+
|
|
539
564
|
def my_application(users):
|
|
540
565
|
jane = users.create({"name": "Jane"})
|
|
541
566
|
jane.save({"age": 22})
|
|
@@ -544,6 +569,7 @@ class Model(Schema, InjectableProperties):
|
|
|
544
569
|
|
|
545
570
|
return {"id": jane.id, "name": jane.name}
|
|
546
571
|
|
|
572
|
+
|
|
547
573
|
cli = clearskies.contexts.Cli(
|
|
548
574
|
my_application,
|
|
549
575
|
classes=[User],
|
|
@@ -600,6 +626,7 @@ class Model(Schema, InjectableProperties):
|
|
|
600
626
|
from typing import Any, Self
|
|
601
627
|
import clearskies
|
|
602
628
|
|
|
629
|
+
|
|
603
630
|
class User(clearskies.Model):
|
|
604
631
|
id_column_name = "id"
|
|
605
632
|
backend = clearskies.backends.MemoryBackend()
|
|
@@ -618,11 +645,13 @@ class Model(Schema, InjectableProperties):
|
|
|
618
645
|
print("Latest age: " + str(self.latest("age", data)))
|
|
619
646
|
return data
|
|
620
647
|
|
|
648
|
+
|
|
621
649
|
def my_application(users):
|
|
622
650
|
jane = users.create({"name": "Jane"})
|
|
623
651
|
jane.save({"age": 25})
|
|
624
652
|
return {"id": jane.id, "name": jane.name}
|
|
625
653
|
|
|
654
|
+
|
|
626
655
|
cli = clearskies.contexts.Cli(
|
|
627
656
|
my_application,
|
|
628
657
|
classes=[User],
|
|
@@ -659,6 +688,7 @@ class Model(Schema, InjectableProperties):
|
|
|
659
688
|
```
|
|
660
689
|
import clearskies
|
|
661
690
|
|
|
691
|
+
|
|
662
692
|
class User(clearskies.Model):
|
|
663
693
|
id_column_name = "id"
|
|
664
694
|
backend = clearskies.backends.MemoryBackend()
|
|
@@ -667,6 +697,7 @@ class Model(Schema, InjectableProperties):
|
|
|
667
697
|
name = clearskies.columns.String()
|
|
668
698
|
age = clearskies.columns.Integer()
|
|
669
699
|
|
|
700
|
+
|
|
670
701
|
def my_application(users):
|
|
671
702
|
jane = users.create({"name": "Jane"})
|
|
672
703
|
return {
|
|
@@ -674,6 +705,7 @@ class Model(Schema, InjectableProperties):
|
|
|
674
705
|
"age_changed": jane.was_changed("age"),
|
|
675
706
|
}
|
|
676
707
|
|
|
708
|
+
|
|
677
709
|
cli = clearskies.contexts.Cli(
|
|
678
710
|
my_application,
|
|
679
711
|
classes=[User],
|
|
@@ -713,6 +745,7 @@ class Model(Schema, InjectableProperties):
|
|
|
713
745
|
```
|
|
714
746
|
import clearskies
|
|
715
747
|
|
|
748
|
+
|
|
716
749
|
class User(clearskies.Model):
|
|
717
750
|
id_column_name = "id"
|
|
718
751
|
backend = clearskies.backends.MemoryBackend()
|
|
@@ -720,11 +753,13 @@ class Model(Schema, InjectableProperties):
|
|
|
720
753
|
id = clearskies.columns.Uuid()
|
|
721
754
|
name = clearskies.columns.String()
|
|
722
755
|
|
|
756
|
+
|
|
723
757
|
def my_application(users):
|
|
724
758
|
jane = users.create({"name": "Jane"})
|
|
725
759
|
jane.save({"name": "Jane Doe"})
|
|
726
760
|
return {"name": jane.name, "previous_name": jane.previous_value("name")}
|
|
727
761
|
|
|
762
|
+
|
|
728
763
|
cli = clearskies.contexts.Cli(
|
|
729
764
|
my_application,
|
|
730
765
|
classes=[User],
|
|
@@ -758,6 +793,7 @@ class Model(Schema, InjectableProperties):
|
|
|
758
793
|
```
|
|
759
794
|
import clearskies
|
|
760
795
|
|
|
796
|
+
|
|
761
797
|
class User(clearskies.Model):
|
|
762
798
|
id_column_name = "id"
|
|
763
799
|
backend = clearskies.backends.MemoryBackend()
|
|
@@ -765,6 +801,7 @@ class Model(Schema, InjectableProperties):
|
|
|
765
801
|
id = clearskies.columns.Uuid()
|
|
766
802
|
name = clearskies.columns.String()
|
|
767
803
|
|
|
804
|
+
|
|
768
805
|
def my_application(users):
|
|
769
806
|
alice = users.create({"name": "Alice"})
|
|
770
807
|
|
|
@@ -778,12 +815,12 @@ class Model(Schema, InjectableProperties):
|
|
|
778
815
|
|
|
779
816
|
return {"id": alice.id, "name": alice.name}
|
|
780
817
|
|
|
818
|
+
|
|
781
819
|
cli = clearskies.contexts.Cli(
|
|
782
820
|
my_application,
|
|
783
821
|
classes=[User],
|
|
784
822
|
)
|
|
785
823
|
cli()
|
|
786
|
-
|
|
787
824
|
```
|
|
788
825
|
"""
|
|
789
826
|
self.no_queries()
|
|
@@ -855,7 +892,7 @@ class Model(Schema, InjectableProperties):
|
|
|
855
892
|
|
|
856
893
|
def pre_save(self: Self, data: dict[str, Any]) -> dict[str, Any]:
|
|
857
894
|
"""
|
|
858
|
-
|
|
895
|
+
Add a hook to add additional logic in the pre-save step of the save process.
|
|
859
896
|
|
|
860
897
|
The pre/post/finished steps of the model are directly analogous to the pre/post/finished steps for the columns.
|
|
861
898
|
|
|
@@ -873,6 +910,7 @@ class Model(Schema, InjectableProperties):
|
|
|
873
910
|
from typing import Any, Self
|
|
874
911
|
import clearskies
|
|
875
912
|
|
|
913
|
+
|
|
876
914
|
class User(clearskies.Model):
|
|
877
915
|
id_column_name = "id"
|
|
878
916
|
backend = clearskies.backends.MemoryBackend()
|
|
@@ -889,11 +927,12 @@ class Model(Schema, InjectableProperties):
|
|
|
889
927
|
|
|
890
928
|
return additional_data
|
|
891
929
|
|
|
930
|
+
|
|
892
931
|
def my_application(users):
|
|
893
932
|
jane = users.create({"name": "Jane"})
|
|
894
933
|
is_anonymous_after_create = jane.is_anonymous
|
|
895
934
|
|
|
896
|
-
jane.save({"name":""})
|
|
935
|
+
jane.save({"name": ""})
|
|
897
936
|
is_anonymous_after_first_update = jane.is_anonymous
|
|
898
937
|
|
|
899
938
|
jane.save({"name": "Jane Doe"})
|
|
@@ -905,6 +944,7 @@ class Model(Schema, InjectableProperties):
|
|
|
905
944
|
"is_anonymous_after_last_update": is_anonymous_after_last_update,
|
|
906
945
|
}
|
|
907
946
|
|
|
947
|
+
|
|
908
948
|
cli = clearskies.contexts.Cli(
|
|
909
949
|
my_application,
|
|
910
950
|
classes=[User],
|
|
@@ -923,7 +963,7 @@ class Model(Schema, InjectableProperties):
|
|
|
923
963
|
|
|
924
964
|
def post_save(self: Self, data: dict[str, Any], id: str | int) -> None:
|
|
925
965
|
"""
|
|
926
|
-
|
|
966
|
+
Add hook to add additional logic in the post-save step of the save process.
|
|
927
967
|
|
|
928
968
|
It is passed in the data being saved as well as the id of the record. Keep in mind that the post save
|
|
929
969
|
hook happens after the backend has been updated (but before the model is updated) so if you need to make
|
|
@@ -934,6 +974,7 @@ class Model(Schema, InjectableProperties):
|
|
|
934
974
|
from typing import Any, Self
|
|
935
975
|
import clearskies
|
|
936
976
|
|
|
977
|
+
|
|
937
978
|
class History(clearskies.Model):
|
|
938
979
|
id_column_name = "id"
|
|
939
980
|
backend = clearskies.backends.MemoryBackend()
|
|
@@ -942,6 +983,7 @@ class Model(Schema, InjectableProperties):
|
|
|
942
983
|
message = clearskies.columns.String()
|
|
943
984
|
created_at = clearskies.columns.Created(date_format="%Y-%m-%d %H:%M:%S.%f")
|
|
944
985
|
|
|
986
|
+
|
|
945
987
|
class User(clearskies.Model):
|
|
946
988
|
id_column_name = "id"
|
|
947
989
|
backend = clearskies.backends.MemoryBackend()
|
|
@@ -959,6 +1001,7 @@ class Model(Schema, InjectableProperties):
|
|
|
959
1001
|
age = self.latest("age", data)
|
|
960
1002
|
self.histories.create({"message": f"My name is {name} and I am {age} years old"})
|
|
961
1003
|
|
|
1004
|
+
|
|
962
1005
|
def my_application(users, histories):
|
|
963
1006
|
jane = users.create({"name": "Jane"})
|
|
964
1007
|
jane.save({"age": 25})
|
|
@@ -967,6 +1010,7 @@ class Model(Schema, InjectableProperties):
|
|
|
967
1010
|
|
|
968
1011
|
return [history.message for history in histories.sort_by("created_at", "ASC")]
|
|
969
1012
|
|
|
1013
|
+
|
|
970
1014
|
cli = clearskies.contexts.Cli(
|
|
971
1015
|
my_application,
|
|
972
1016
|
classes=[User, History],
|
|
@@ -978,9 +1022,9 @@ class Model(Schema, InjectableProperties):
|
|
|
978
1022
|
|
|
979
1023
|
def save_finished(self: Self) -> None:
|
|
980
1024
|
"""
|
|
981
|
-
|
|
1025
|
+
Add a hook to add additional logic in the save_finished step of the save process.
|
|
982
1026
|
|
|
983
|
-
It has no
|
|
1027
|
+
It has no return value and is passed no data. By the time this fires the model has already been
|
|
984
1028
|
updated with the new data. You can decide on the necessary actions using the `was_changed` and
|
|
985
1029
|
the `previous_value` functions.
|
|
986
1030
|
|
|
@@ -988,6 +1032,7 @@ class Model(Schema, InjectableProperties):
|
|
|
988
1032
|
from typing import Any, Self
|
|
989
1033
|
import clearskies
|
|
990
1034
|
|
|
1035
|
+
|
|
991
1036
|
class History(clearskies.Model):
|
|
992
1037
|
id_column_name = "id"
|
|
993
1038
|
backend = clearskies.backends.MemoryBackend()
|
|
@@ -996,6 +1041,7 @@ class Model(Schema, InjectableProperties):
|
|
|
996
1041
|
message = clearskies.columns.String()
|
|
997
1042
|
created_at = clearskies.columns.Created(date_format="%Y-%m-%d %H:%M:%S.%f")
|
|
998
1043
|
|
|
1044
|
+
|
|
999
1045
|
class User(clearskies.Model):
|
|
1000
1046
|
id_column_name = "id"
|
|
1001
1047
|
backend = clearskies.backends.MemoryBackend()
|
|
@@ -1011,6 +1057,7 @@ class Model(Schema, InjectableProperties):
|
|
|
1011
1057
|
|
|
1012
1058
|
self.histories.create({"message": f"My name is {self.name} and I am {self.age} years old"})
|
|
1013
1059
|
|
|
1060
|
+
|
|
1014
1061
|
def my_application(users, histories):
|
|
1015
1062
|
jane = users.create({"name": "Jane"})
|
|
1016
1063
|
jane.save({"age": 25})
|
|
@@ -1019,6 +1066,7 @@ class Model(Schema, InjectableProperties):
|
|
|
1019
1066
|
|
|
1020
1067
|
return [history.message for history in histories.sort_by("created_at", "ASC")]
|
|
1021
1068
|
|
|
1069
|
+
|
|
1022
1070
|
cli = clearskies.contexts.Cli(
|
|
1023
1071
|
my_application,
|
|
1024
1072
|
classes=[User, History],
|
|
@@ -1054,9 +1102,7 @@ class Model(Schema, InjectableProperties):
|
|
|
1054
1102
|
authorization_data: dict[str, Any],
|
|
1055
1103
|
overrides: dict[str, Column] = {},
|
|
1056
1104
|
) -> Self:
|
|
1057
|
-
"""
|
|
1058
|
-
A hook to automatically apply filtering whenever the model makes an appearance in a get/update/list/search handler.
|
|
1059
|
-
"""
|
|
1105
|
+
"""Add a hook to automatically apply filtering whenever the model makes an appearance in a get/update/list/search handler."""
|
|
1060
1106
|
for column in self.get_columns(overrides=overrides).values():
|
|
1061
1107
|
models = column.where_for_request(model, input_output, routing_data, authorization_data) # type: ignore
|
|
1062
1108
|
return self.where_for_request(
|
|
@@ -1072,7 +1118,7 @@ class Model(Schema, InjectableProperties):
|
|
|
1072
1118
|
overrides: dict[str, Column] = {},
|
|
1073
1119
|
) -> Self:
|
|
1074
1120
|
"""
|
|
1075
|
-
|
|
1121
|
+
Add a hook to automatically apply filtering whenever the model makes an appearance in a get/update/list/search handler.
|
|
1076
1122
|
|
|
1077
1123
|
Note that this automatically affects the behavior of the various list endpoints, but won't be called when you create your
|
|
1078
1124
|
own queries directly. Here's an example where the model restricts the list endpoint so that it only returns users with
|
|
@@ -1082,6 +1128,7 @@ class Model(Schema, InjectableProperties):
|
|
|
1082
1128
|
from typing import Any, Self
|
|
1083
1129
|
import clearskies
|
|
1084
1130
|
|
|
1131
|
+
|
|
1085
1132
|
class User(clearskies.Model):
|
|
1086
1133
|
id_column_name = "id"
|
|
1087
1134
|
backend = clearskies.backends.MemoryBackend()
|
|
@@ -1099,6 +1146,7 @@ class Model(Schema, InjectableProperties):
|
|
|
1099
1146
|
) -> Self:
|
|
1100
1147
|
return model.where("age>=18")
|
|
1101
1148
|
|
|
1149
|
+
|
|
1102
1150
|
list_users = clearskies.endpoints.List(
|
|
1103
1151
|
model_class=User,
|
|
1104
1152
|
readable_column_names=["id", "name", "age"],
|
|
@@ -1144,6 +1192,7 @@ class Model(Schema, InjectableProperties):
|
|
|
1144
1192
|
```
|
|
1145
1193
|
import clearskies
|
|
1146
1194
|
|
|
1195
|
+
|
|
1147
1196
|
class User(clearskies.Model):
|
|
1148
1197
|
id_column_name = "id"
|
|
1149
1198
|
backend = clearskies.backends.MemoryBackend()
|
|
@@ -1151,6 +1200,7 @@ class Model(Schema, InjectableProperties):
|
|
|
1151
1200
|
id = clearskies.columns.Uuid()
|
|
1152
1201
|
name = clearskies.columns.String()
|
|
1153
1202
|
|
|
1203
|
+
|
|
1154
1204
|
def my_application(users):
|
|
1155
1205
|
jane = users.create({"name": "Jane"})
|
|
1156
1206
|
jane_instance_has_query = jane.has_query()
|
|
@@ -1170,6 +1220,7 @@ class Model(Schema, InjectableProperties):
|
|
|
1170
1220
|
"invalid_request_error": invalid_request_error,
|
|
1171
1221
|
}
|
|
1172
1222
|
|
|
1223
|
+
|
|
1173
1224
|
cli = clearskies.contexts.Cli(
|
|
1174
1225
|
my_application,
|
|
1175
1226
|
classes=[User],
|
|
@@ -1183,7 +1234,7 @@ class Model(Schema, InjectableProperties):
|
|
|
1183
1234
|
{
|
|
1184
1235
|
"jane_instance_has_query": false,
|
|
1185
1236
|
"some_search_has_query": true,
|
|
1186
|
-
"invalid_request_error": "You attempted to save/read record data for a model being used to make a query. This is not allowed, as it is typically a sign of a bug in your application code."
|
|
1237
|
+
"invalid_request_error": "You attempted to save/read record data for a model being used to make a query. This is not allowed, as it is typically a sign of a bug in your application code.",
|
|
1187
1238
|
}
|
|
1188
1239
|
```
|
|
1189
1240
|
|
|
@@ -1267,7 +1318,7 @@ class Model(Schema, InjectableProperties):
|
|
|
1267
1318
|
return self.with_query(self.get_query().set_select_all(select_all))
|
|
1268
1319
|
|
|
1269
1320
|
def where(self: Self, where: str | Condition) -> Self:
|
|
1270
|
-
"""
|
|
1321
|
+
r"""
|
|
1271
1322
|
Add a condition to a query.
|
|
1272
1323
|
|
|
1273
1324
|
The `where` method (in combination with the `find` method) is typically the starting point for query records in
|
|
@@ -1314,6 +1365,7 @@ class Model(Schema, InjectableProperties):
|
|
|
1314
1365
|
```python
|
|
1315
1366
|
import clearskies
|
|
1316
1367
|
|
|
1368
|
+
|
|
1317
1369
|
class Order(clearskies.Model):
|
|
1318
1370
|
id_column_name = "id"
|
|
1319
1371
|
backend = clearskies.backends.MemoryBackend()
|
|
@@ -1323,12 +1375,17 @@ class Model(Schema, InjectableProperties):
|
|
|
1323
1375
|
status = clearskies.columns.Select(["Pending", "In Progress"])
|
|
1324
1376
|
total = clearskies.columns.Float()
|
|
1325
1377
|
|
|
1378
|
+
|
|
1326
1379
|
def my_application(orders):
|
|
1327
1380
|
orders.create({"user_id": "Bob", "status": "Pending", "total": 25})
|
|
1328
1381
|
orders.create({"user_id": "Alice", "status": "In Progress", "total": 15})
|
|
1329
1382
|
orders.create({"user_id": "Jane", "status": "Pending", "total": 30})
|
|
1330
1383
|
|
|
1331
|
-
return [
|
|
1384
|
+
return [
|
|
1385
|
+
order.user_id
|
|
1386
|
+
for order in orders.where("status=Pending").where(Order.total.greater_than(25))
|
|
1387
|
+
]
|
|
1388
|
+
|
|
1332
1389
|
|
|
1333
1390
|
cli = clearskies.contexts.Cli(
|
|
1334
1391
|
my_application,
|
|
@@ -1367,6 +1424,7 @@ class Model(Schema, InjectableProperties):
|
|
|
1367
1424
|
```
|
|
1368
1425
|
import clearskies
|
|
1369
1426
|
|
|
1427
|
+
|
|
1370
1428
|
class User(clearskies.Model):
|
|
1371
1429
|
id_column_name = "id"
|
|
1372
1430
|
backend = clearskies.backends.MemoryBackend()
|
|
@@ -1374,6 +1432,7 @@ class Model(Schema, InjectableProperties):
|
|
|
1374
1432
|
id = clearskies.columns.Uuid()
|
|
1375
1433
|
name = clearskies.columns.String()
|
|
1376
1434
|
|
|
1435
|
+
|
|
1377
1436
|
class Order(clearskies.Model):
|
|
1378
1437
|
id_column_name = "id"
|
|
1379
1438
|
backend = clearskies.backends.MemoryBackend()
|
|
@@ -1384,6 +1443,7 @@ class Model(Schema, InjectableProperties):
|
|
|
1384
1443
|
status = clearskies.columns.Select(["Pending", "In Progress"])
|
|
1385
1444
|
total = clearskies.columns.Float()
|
|
1386
1445
|
|
|
1446
|
+
|
|
1387
1447
|
def my_application(users, orders):
|
|
1388
1448
|
jane = users.create({"name": "Jane"})
|
|
1389
1449
|
another_jane = users.create({"name": "Jane"})
|
|
@@ -1402,7 +1462,13 @@ class Model(Schema, InjectableProperties):
|
|
|
1402
1462
|
orders.create({"user_id": bob.id, "status": "In Progress", "total": 35})
|
|
1403
1463
|
|
|
1404
1464
|
# return all orders for anyone named Jane that have a status of Pending
|
|
1405
|
-
return
|
|
1465
|
+
return (
|
|
1466
|
+
orders.join("join users on users.id=orders.user_id")
|
|
1467
|
+
.where("users.name=Jane")
|
|
1468
|
+
.sort_by("total", "asc")
|
|
1469
|
+
.where("status=Pending")
|
|
1470
|
+
)
|
|
1471
|
+
|
|
1406
1472
|
|
|
1407
1473
|
cli = clearskies.contexts.Cli(
|
|
1408
1474
|
clearskies.endpoints.Callable(
|
|
@@ -1413,7 +1479,6 @@ class Model(Schema, InjectableProperties):
|
|
|
1413
1479
|
classes=[Order, User],
|
|
1414
1480
|
)
|
|
1415
1481
|
cli()
|
|
1416
|
-
|
|
1417
1482
|
```
|
|
1418
1483
|
"""
|
|
1419
1484
|
self.no_single_model()
|
|
@@ -1460,6 +1525,7 @@ class Model(Schema, InjectableProperties):
|
|
|
1460
1525
|
```
|
|
1461
1526
|
import clearskies
|
|
1462
1527
|
|
|
1528
|
+
|
|
1463
1529
|
class Order(clearskies.Model):
|
|
1464
1530
|
id_column_name = "id"
|
|
1465
1531
|
backend = clearskies.backends.MemoryBackend()
|
|
@@ -1469,13 +1535,17 @@ class Model(Schema, InjectableProperties):
|
|
|
1469
1535
|
status = clearskies.columns.Select(["Pending", "In Progress"])
|
|
1470
1536
|
total = clearskies.columns.Float()
|
|
1471
1537
|
|
|
1538
|
+
|
|
1472
1539
|
def my_application(orders):
|
|
1473
1540
|
orders.create({"user_id": "Bob", "status": "Pending", "total": 25})
|
|
1474
1541
|
orders.create({"user_id": "Alice", "status": "In Progress", "total": 15})
|
|
1475
1542
|
orders.create({"user_id": "Alice", "status": "Pending", "total": 30})
|
|
1476
1543
|
orders.create({"user_id": "Bob", "status": "Pending", "total": 26})
|
|
1477
1544
|
|
|
1478
|
-
return orders.sort_by(
|
|
1545
|
+
return orders.sort_by(
|
|
1546
|
+
"user_id", "asc", secondary_column_name="total", secondary_direction="desc"
|
|
1547
|
+
)
|
|
1548
|
+
|
|
1479
1549
|
|
|
1480
1550
|
cli = clearskies.contexts.Cli(
|
|
1481
1551
|
clearskies.endpoints.Callable(
|
|
@@ -1502,6 +1572,7 @@ class Model(Schema, InjectableProperties):
|
|
|
1502
1572
|
```
|
|
1503
1573
|
import clearskies
|
|
1504
1574
|
|
|
1575
|
+
|
|
1505
1576
|
class Order(clearskies.Model):
|
|
1506
1577
|
id_column_name = "id"
|
|
1507
1578
|
backend = clearskies.backends.MemoryBackend()
|
|
@@ -1511,6 +1582,7 @@ class Model(Schema, InjectableProperties):
|
|
|
1511
1582
|
status = clearskies.columns.Select(["Pending", "In Progress"])
|
|
1512
1583
|
total = clearskies.columns.Float()
|
|
1513
1584
|
|
|
1585
|
+
|
|
1514
1586
|
def my_application(orders):
|
|
1515
1587
|
orders.create({"user_id": "Bob", "status": "Pending", "total": 25})
|
|
1516
1588
|
orders.create({"user_id": "Alice", "status": "In Progress", "total": 15})
|
|
@@ -1519,6 +1591,7 @@ class Model(Schema, InjectableProperties):
|
|
|
1519
1591
|
|
|
1520
1592
|
return orders.limit(2)
|
|
1521
1593
|
|
|
1594
|
+
|
|
1522
1595
|
cli = clearskies.contexts.Cli(
|
|
1523
1596
|
clearskies.endpoints.Callable(
|
|
1524
1597
|
my_application,
|
|
@@ -1548,6 +1621,7 @@ class Model(Schema, InjectableProperties):
|
|
|
1548
1621
|
```
|
|
1549
1622
|
import clearskies
|
|
1550
1623
|
|
|
1624
|
+
|
|
1551
1625
|
class Order(clearskies.Model):
|
|
1552
1626
|
id_column_name = "id"
|
|
1553
1627
|
backend = clearskies.backends.MemoryBackend()
|
|
@@ -1557,6 +1631,7 @@ class Model(Schema, InjectableProperties):
|
|
|
1557
1631
|
status = clearskies.columns.Select(["Pending", "In Progress"])
|
|
1558
1632
|
total = clearskies.columns.Float()
|
|
1559
1633
|
|
|
1634
|
+
|
|
1560
1635
|
def my_application(orders):
|
|
1561
1636
|
orders.create({"user_id": "Bob", "status": "Pending", "total": 25})
|
|
1562
1637
|
orders.create({"user_id": "Alice", "status": "In Progress", "total": 15})
|
|
@@ -1565,6 +1640,7 @@ class Model(Schema, InjectableProperties):
|
|
|
1565
1640
|
|
|
1566
1641
|
return orders.sort_by("total", "asc").pagination(start=2)
|
|
1567
1642
|
|
|
1643
|
+
|
|
1568
1644
|
cli = clearskies.contexts.Cli(
|
|
1569
1645
|
clearskies.endpoints.Callable(
|
|
1570
1646
|
my_application,
|
|
@@ -1604,6 +1680,7 @@ class Model(Schema, InjectableProperties):
|
|
|
1604
1680
|
```python
|
|
1605
1681
|
import clearskies
|
|
1606
1682
|
|
|
1683
|
+
|
|
1607
1684
|
class Order(clearskies.Model):
|
|
1608
1685
|
id_column_name = "id"
|
|
1609
1686
|
backend = clearskies.backends.MemoryBackend()
|
|
@@ -1613,6 +1690,7 @@ class Model(Schema, InjectableProperties):
|
|
|
1613
1690
|
status = clearskies.columns.Select(["Pending", "In Progress"])
|
|
1614
1691
|
total = clearskies.columns.Float()
|
|
1615
1692
|
|
|
1693
|
+
|
|
1616
1694
|
def my_application(orders):
|
|
1617
1695
|
orders.create({"user_id": "Bob", "status": "Pending", "total": 25})
|
|
1618
1696
|
orders.create({"user_id": "Alice", "status": "In Progress", "total": 15})
|
|
@@ -1627,6 +1705,7 @@ class Model(Schema, InjectableProperties):
|
|
|
1627
1705
|
"total": jane.total,
|
|
1628
1706
|
}
|
|
1629
1707
|
|
|
1708
|
+
|
|
1630
1709
|
cli = clearskies.contexts.Cli(
|
|
1631
1710
|
my_application,
|
|
1632
1711
|
classes=[Order],
|
|
@@ -1668,6 +1747,7 @@ class Model(Schema, InjectableProperties):
|
|
|
1668
1747
|
```
|
|
1669
1748
|
import clearskies
|
|
1670
1749
|
|
|
1750
|
+
|
|
1671
1751
|
class Order(clearskies.Model):
|
|
1672
1752
|
id_column_name = "id"
|
|
1673
1753
|
backend = clearskies.backends.MemoryBackend()
|
|
@@ -1677,6 +1757,7 @@ class Model(Schema, InjectableProperties):
|
|
|
1677
1757
|
status = clearskies.columns.Select(["Pending", "In Progress"])
|
|
1678
1758
|
total = clearskies.columns.Float()
|
|
1679
1759
|
|
|
1760
|
+
|
|
1680
1761
|
def my_application(orders):
|
|
1681
1762
|
orders.create({"user_id": "Bob", "status": "Pending", "total": 25})
|
|
1682
1763
|
orders.create({"user_id": "Alice", "status": "In Progress", "total": 15})
|
|
@@ -1685,6 +1766,7 @@ class Model(Schema, InjectableProperties):
|
|
|
1685
1766
|
|
|
1686
1767
|
return orders.limit(1).paginate_all()
|
|
1687
1768
|
|
|
1769
|
+
|
|
1688
1770
|
cli = clearskies.contexts.Cli(
|
|
1689
1771
|
clearskies.endpoints.Callable(
|
|
1690
1772
|
my_application,
|
|
@@ -1724,6 +1806,7 @@ class Model(Schema, InjectableProperties):
|
|
|
1724
1806
|
```
|
|
1725
1807
|
import clearskies
|
|
1726
1808
|
|
|
1809
|
+
|
|
1727
1810
|
class User(clearskies.Model):
|
|
1728
1811
|
id_column_name = "id"
|
|
1729
1812
|
backend = clearskies.backends.MemoryBackend()
|
|
@@ -1731,6 +1814,7 @@ class Model(Schema, InjectableProperties):
|
|
|
1731
1814
|
id = clearskies.columns.Uuid()
|
|
1732
1815
|
name = clearskies.columns.String()
|
|
1733
1816
|
|
|
1817
|
+
|
|
1734
1818
|
def my_application(users):
|
|
1735
1819
|
jane = users.create({"name": "Jane"})
|
|
1736
1820
|
|
|
@@ -1741,6 +1825,7 @@ class Model(Schema, InjectableProperties):
|
|
|
1741
1825
|
|
|
1742
1826
|
return {"id": another_jane_object.id, "name": another_jane_object.name}
|
|
1743
1827
|
|
|
1828
|
+
|
|
1744
1829
|
cli = clearskies.contexts.Cli(
|
|
1745
1830
|
my_application,
|
|
1746
1831
|
classes=[User],
|
|
@@ -1754,7 +1839,9 @@ class Model(Schema, InjectableProperties):
|
|
|
1754
1839
|
|
|
1755
1840
|
def empty(self: Self) -> Self:
|
|
1756
1841
|
"""
|
|
1757
|
-
|
|
1842
|
+
Create a an empty model instance.
|
|
1843
|
+
|
|
1844
|
+
An alias for self.model({}).
|
|
1758
1845
|
|
|
1759
1846
|
This just provides you a fresh, empty model instance that you can use for populating with data or creating
|
|
1760
1847
|
a new record. Here's a simple exmaple. Both print statements will be printed and it will return the id
|
|
@@ -1763,6 +1850,7 @@ class Model(Schema, InjectableProperties):
|
|
|
1763
1850
|
```
|
|
1764
1851
|
import clearskies
|
|
1765
1852
|
|
|
1853
|
+
|
|
1766
1854
|
class User(clearskies.Model):
|
|
1767
1855
|
id_column_name = "id"
|
|
1768
1856
|
backend = clearskies.backends.MemoryBackend()
|
|
@@ -1770,6 +1858,7 @@ class Model(Schema, InjectableProperties):
|
|
|
1770
1858
|
id = clearskies.columns.Uuid()
|
|
1771
1859
|
name = clearskies.columns.String()
|
|
1772
1860
|
|
|
1861
|
+
|
|
1773
1862
|
def my_application(users):
|
|
1774
1863
|
alice = users.create({"name": "Alice"})
|
|
1775
1864
|
|
|
@@ -1783,6 +1872,7 @@ class Model(Schema, InjectableProperties):
|
|
|
1783
1872
|
|
|
1784
1873
|
return {"alice_id": alice.id, "blank_id": blank.id}
|
|
1785
1874
|
|
|
1875
|
+
|
|
1786
1876
|
cli = clearskies.contexts.Cli(
|
|
1787
1877
|
my_application,
|
|
1788
1878
|
classes=[User],
|
|
@@ -1805,6 +1895,7 @@ class Model(Schema, InjectableProperties):
|
|
|
1805
1895
|
```
|
|
1806
1896
|
import clearskies
|
|
1807
1897
|
|
|
1898
|
+
|
|
1808
1899
|
class User(clearskies.Model):
|
|
1809
1900
|
id_column_name = "id"
|
|
1810
1901
|
backend = clearskies.backends.MemoryBackend()
|
|
@@ -1812,6 +1903,7 @@ class Model(Schema, InjectableProperties):
|
|
|
1812
1903
|
id = clearskies.columns.Uuid()
|
|
1813
1904
|
name = clearskies.columns.String()
|
|
1814
1905
|
|
|
1906
|
+
|
|
1815
1907
|
def my_application(user):
|
|
1816
1908
|
# let's create a new record
|
|
1817
1909
|
user.save({"name": "Alice"})
|
|
@@ -1824,6 +1916,7 @@ class Model(Schema, InjectableProperties):
|
|
|
1824
1916
|
"Bob": bob.name,
|
|
1825
1917
|
}
|
|
1826
1918
|
|
|
1919
|
+
|
|
1827
1920
|
cli = clearskies.contexts.Cli(
|
|
1828
1921
|
my_application,
|
|
1829
1922
|
classes=[User],
|
|
@@ -1847,6 +1940,7 @@ class Model(Schema, InjectableProperties):
|
|
|
1847
1940
|
```
|
|
1848
1941
|
import clearskies
|
|
1849
1942
|
|
|
1943
|
+
|
|
1850
1944
|
class Order(clearskies.Model):
|
|
1851
1945
|
id_column_name = "id"
|
|
1852
1946
|
backend = clearskies.backends.MemoryBackend()
|
|
@@ -1856,6 +1950,7 @@ class Model(Schema, InjectableProperties):
|
|
|
1856
1950
|
status = clearskies.columns.Select(["Pending", "In Progress"])
|
|
1857
1951
|
total = clearskies.columns.Float()
|
|
1858
1952
|
|
|
1953
|
+
|
|
1859
1954
|
def my_application(orders):
|
|
1860
1955
|
orders.create({"user_id": "Bob", "status": "Pending", "total": 25})
|
|
1861
1956
|
orders.create({"user_id": "Alice", "status": "In Progress", "total": 15})
|
|
@@ -1870,12 +1965,12 @@ class Model(Schema, InjectableProperties):
|
|
|
1870
1965
|
"total": jane.total,
|
|
1871
1966
|
}
|
|
1872
1967
|
|
|
1968
|
+
|
|
1873
1969
|
cli = clearskies.contexts.Cli(
|
|
1874
1970
|
my_application,
|
|
1875
1971
|
classes=[Order],
|
|
1876
1972
|
)
|
|
1877
1973
|
cli()
|
|
1878
|
-
|
|
1879
1974
|
```
|
|
1880
1975
|
"""
|
|
1881
1976
|
self.no_single_model()
|