ramifice 0.8.27__py3-none-any.whl → 0.8.29__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.
- ramifice/__init__.py +2 -0
- ramifice/commons/many.py +4 -8
- ramifice/commons/one.py +1 -3
- ramifice/commons/unit_manager.py +2 -4
- ramifice/fields/choice_float_field.py +2 -5
- ramifice/fields/choice_float_mult_field.py +3 -8
- ramifice/fields/choice_int_field.py +2 -5
- ramifice/fields/choice_int_mult_field.py +3 -8
- ramifice/fields/choice_text_field.py +3 -8
- ramifice/fields/choice_text_mult_field.py +3 -8
- ramifice/fields/color_field.py +1 -3
- ramifice/fields/date_field.py +1 -3
- ramifice/fields/date_time_field.py +1 -3
- ramifice/fields/email_field.py +1 -3
- ramifice/fields/float_field.py +3 -5
- ramifice/fields/image_field.py +1 -1
- ramifice/fields/integer_field.py +3 -5
- ramifice/fields/ip_field.py +1 -3
- ramifice/fields/phone_field.py +1 -3
- ramifice/fields/url_field.py +1 -3
- ramifice/models/decorator.py +1 -3
- ramifice/paladins/check.py +1 -3
- ramifice/paladins/groups/date_group.py +1 -3
- ramifice/paladins/groups/file_group.py +1 -3
- ramifice/paladins/groups/img_group.py +1 -3
- ramifice/paladins/groups/num_group.py +2 -6
- ramifice/paladins/save.py +2 -8
- ramifice/utils/fixtures.py +1 -1
- ramifice/utils/migration.py +7 -18
- ramifice/utils/unit.py +1 -4
- {ramifice-0.8.27.dist-info → ramifice-0.8.29.dist-info}/METADATA +11 -11
- {ramifice-0.8.27.dist-info → ramifice-0.8.29.dist-info}/RECORD +34 -34
- {ramifice-0.8.27.dist-info → ramifice-0.8.29.dist-info}/WHEEL +0 -0
- {ramifice-0.8.27.dist-info → ramifice-0.8.29.dist-info}/licenses/LICENSE +0 -0
ramifice/__init__.py
CHANGED
@@ -26,6 +26,7 @@ __all__ = (
|
|
26
26
|
"model",
|
27
27
|
"translations",
|
28
28
|
"Migration",
|
29
|
+
"to_human_size",
|
29
30
|
"Unit",
|
30
31
|
)
|
31
32
|
|
@@ -36,6 +37,7 @@ from xloft import NamedTuple
|
|
36
37
|
from ramifice.models.decorator import model
|
37
38
|
from ramifice.utils import translations
|
38
39
|
from ramifice.utils.migration import Migration
|
40
|
+
from ramifice.utils.tools import to_human_size
|
39
41
|
from ramifice.utils.unit import Unit
|
40
42
|
|
41
43
|
logging.basicConfig(
|
ramifice/commons/many.py
CHANGED
@@ -148,9 +148,7 @@ class ManyMixin:
|
|
148
148
|
session=session,
|
149
149
|
allow_disk_use=allow_disk_use,
|
150
150
|
)
|
151
|
-
inst_model_dict = {
|
152
|
-
key: val for key, val in cls().__dict__.items() if not callable(val) and not val.ignored
|
153
|
-
}
|
151
|
+
inst_model_dict = {key: val for key, val in cls().__dict__.items() if not callable(val) and not val.ignored}
|
154
152
|
lang = translations.CURRENT_LOCALE
|
155
153
|
async for mongo_doc in cursor:
|
156
154
|
doc_list.append(
|
@@ -158,7 +156,7 @@ class ManyMixin:
|
|
158
156
|
inst_model_dict,
|
159
157
|
mongo_doc,
|
160
158
|
lang,
|
161
|
-
)
|
159
|
+
),
|
162
160
|
)
|
163
161
|
return doc_list
|
164
162
|
|
@@ -218,9 +216,7 @@ class ManyMixin:
|
|
218
216
|
session=session,
|
219
217
|
allow_disk_use=allow_disk_use,
|
220
218
|
)
|
221
|
-
inst_model_dict = {
|
222
|
-
key: val for key, val in cls().__dict__.items() if not callable(val) and not val.ignored
|
223
|
-
}
|
219
|
+
inst_model_dict = {key: val for key, val in cls().__dict__.items() if not callable(val) and not val.ignored}
|
224
220
|
lang = translations.CURRENT_LOCALE
|
225
221
|
async for mongo_doc in cursor:
|
226
222
|
doc_list.append(
|
@@ -228,7 +224,7 @@ class ManyMixin:
|
|
228
224
|
inst_model_dict,
|
229
225
|
mongo_doc,
|
230
226
|
lang,
|
231
|
-
)
|
227
|
+
),
|
232
228
|
)
|
233
229
|
return orjson.dumps(doc_list).decode("utf-8") if len(doc_list) > 0 else None
|
234
230
|
|
ramifice/commons/one.py
CHANGED
@@ -60,9 +60,7 @@ class OneMixin:
|
|
60
60
|
# Get document.
|
61
61
|
raw_doc = None
|
62
62
|
mongo_doc = await collection.find_one(filter, *args, **kwargs)
|
63
|
-
inst_model_dict = {
|
64
|
-
key: val for key, val in cls().__dict__.items() if not callable(val) and not val.ignored
|
65
|
-
}
|
63
|
+
inst_model_dict = {key: val for key, val in cls().__dict__.items() if not callable(val) and not val.ignored}
|
66
64
|
if mongo_doc is not None:
|
67
65
|
raw_doc = mongo_doc_to_raw_doc(
|
68
66
|
inst_model_dict,
|
ramifice/commons/unit_manager.py
CHANGED
@@ -35,12 +35,10 @@ class UnitMixin:
|
|
35
35
|
"""
|
36
36
|
# Get access to super collection.
|
37
37
|
# (Contains Model state and dynamic field data.)
|
38
|
-
super_collection: AsyncCollection = constants.MONGO_DATABASE[
|
39
|
-
constants.SUPER_COLLECTION_NAME
|
40
|
-
]
|
38
|
+
super_collection: AsyncCollection = constants.MONGO_DATABASE[constants.SUPER_COLLECTION_NAME]
|
41
39
|
# Get Model state.
|
42
40
|
model_state: dict[str, Any] | None = await super_collection.find_one(
|
43
|
-
filter={"collection_name": cls.META["collection_name"]}
|
41
|
+
filter={"collection_name": cls.META["collection_name"]},
|
44
42
|
)
|
45
43
|
# Check the presence of a Model state.
|
46
44
|
if model_state is None:
|
@@ -75,15 +75,12 @@ class ChoiceFloatField(Field, ChoiceGroup, JsonMixin):
|
|
75
75
|
if not isinstance(choices, list):
|
76
76
|
raise AssertionError("Parameter `choices` - Not а `list` type!")
|
77
77
|
if len(choices) == 0:
|
78
|
-
raise AssertionError(
|
79
|
-
"The `choices` parameter should not contain an empty list!"
|
80
|
-
)
|
78
|
+
raise AssertionError("The `choices` parameter should not contain an empty list!")
|
81
79
|
if default is not None and not isinstance(default, float):
|
82
80
|
raise AssertionError("Parameter `default` - Not а `float` type!")
|
83
81
|
if default is not None and choices is not None and not self.has_value():
|
84
82
|
raise AssertionError(
|
85
|
-
"Parameter `default` does not coincide with "
|
86
|
-
+ "list of permissive values in `choicees`."
|
83
|
+
"Parameter `default` does not coincide with " + "list of permissive values in `choicees`.",
|
87
84
|
)
|
88
85
|
if not isinstance(label, str):
|
89
86
|
raise AssertionError("Parameter `default` - Not а `str` type!")
|
@@ -76,20 +76,15 @@ class ChoiceFloatMultField(Field, ChoiceGroup, JsonMixin):
|
|
76
76
|
if not isinstance(choices, list):
|
77
77
|
raise AssertionError("Parameter `choices` - Not а `list` type!")
|
78
78
|
if len(choices) == 0:
|
79
|
-
raise AssertionError(
|
80
|
-
"The `choices` parameter should not contain an empty list!"
|
81
|
-
)
|
79
|
+
raise AssertionError("The `choices` parameter should not contain an empty list!")
|
82
80
|
if default is not None:
|
83
81
|
if not isinstance(default, list):
|
84
82
|
raise AssertionError("Parameter `default` - Not а `list` type!")
|
85
83
|
if len(default) == 0:
|
86
|
-
raise AssertionError(
|
87
|
-
"The `default` parameter should not contain an empty list!"
|
88
|
-
)
|
84
|
+
raise AssertionError("The `default` parameter should not contain an empty list!")
|
89
85
|
if choices is not None and not self.has_value():
|
90
86
|
raise AssertionError(
|
91
|
-
"Parameter `default` does not coincide with "
|
92
|
-
+ "list of permissive values in `choicees`."
|
87
|
+
"Parameter `default` does not coincide with " + "list of permissive values in `choicees`.",
|
93
88
|
)
|
94
89
|
if not isinstance(label, str):
|
95
90
|
raise AssertionError("Parameter `default` - Not а `str` type!")
|
@@ -75,15 +75,12 @@ class ChoiceIntField(Field, ChoiceGroup, JsonMixin):
|
|
75
75
|
if not isinstance(choices, list):
|
76
76
|
raise AssertionError("Parameter `choices` - Not а `list` type!")
|
77
77
|
if len(choices) == 0:
|
78
|
-
raise AssertionError(
|
79
|
-
"The `choices` parameter should not contain an empty list!"
|
80
|
-
)
|
78
|
+
raise AssertionError("The `choices` parameter should not contain an empty list!")
|
81
79
|
if default is not None and not isinstance(default, int):
|
82
80
|
raise AssertionError("Parameter `default` - Not а `str` type!")
|
83
81
|
if default is not None and choices is not None and not self.has_value():
|
84
82
|
raise AssertionError(
|
85
|
-
"Parameter `default` does not coincide with "
|
86
|
-
+ "list of permissive values in `choicees`."
|
83
|
+
"Parameter `default` does not coincide with " + "list of permissive values in `choicees`.",
|
87
84
|
)
|
88
85
|
if not isinstance(label, str):
|
89
86
|
raise AssertionError("Parameter `default` - Not а `str` type!")
|
@@ -76,20 +76,15 @@ class ChoiceIntMultField(Field, ChoiceGroup, JsonMixin):
|
|
76
76
|
if not isinstance(choices, list):
|
77
77
|
raise AssertionError("Parameter `choices` - Not а `list` type!")
|
78
78
|
if len(choices) == 0:
|
79
|
-
raise AssertionError(
|
80
|
-
"The `choices` parameter should not contain an empty list!"
|
81
|
-
)
|
79
|
+
raise AssertionError("The `choices` parameter should not contain an empty list!")
|
82
80
|
if default is not None:
|
83
81
|
if not isinstance(default, list):
|
84
82
|
raise AssertionError("Parameter `default` - Not а `list` type!")
|
85
83
|
if len(default) == 0:
|
86
|
-
raise AssertionError(
|
87
|
-
"The `default` parameter should not contain an empty list!"
|
88
|
-
)
|
84
|
+
raise AssertionError("The `default` parameter should not contain an empty list!")
|
89
85
|
if choices is not None and not self.has_value():
|
90
86
|
raise AssertionError(
|
91
|
-
"Parameter `default` does not coincide with "
|
92
|
-
+ "list of permissive values in `choicees`."
|
87
|
+
"Parameter `default` does not coincide with " + "list of permissive values in `choicees`.",
|
93
88
|
)
|
94
89
|
if not isinstance(label, str):
|
95
90
|
raise AssertionError("Parameter `default` - Not а `str` type!")
|
@@ -75,20 +75,15 @@ class ChoiceTextField(Field, ChoiceGroup, JsonMixin):
|
|
75
75
|
if not isinstance(choices, list):
|
76
76
|
raise AssertionError("Parameter `choices` - Not а `list` type!")
|
77
77
|
if len(choices) == 0:
|
78
|
-
raise AssertionError(
|
79
|
-
"The `choices` parameter should not contain an empty list!"
|
80
|
-
)
|
78
|
+
raise AssertionError("The `choices` parameter should not contain an empty list!")
|
81
79
|
if default is not None:
|
82
80
|
if not isinstance(default, str):
|
83
81
|
raise AssertionError("Parameter `default` - Not а `str` type!")
|
84
82
|
if len(default) == 0:
|
85
|
-
raise AssertionError(
|
86
|
-
"The `default` parameter should not contain an empty string!"
|
87
|
-
)
|
83
|
+
raise AssertionError("The `default` parameter should not contain an empty string!")
|
88
84
|
if choices is not None and not self.has_value():
|
89
85
|
raise AssertionError(
|
90
|
-
"Parameter `default` does not coincide with "
|
91
|
-
+ "list of permissive values in `choicees`."
|
86
|
+
"Parameter `default` does not coincide with " + "list of permissive values in `choicees`.",
|
92
87
|
)
|
93
88
|
if not isinstance(label, str):
|
94
89
|
raise AssertionError("Parameter `default` - Not а `str` type!")
|
@@ -76,20 +76,15 @@ class ChoiceTextMultField(Field, ChoiceGroup, JsonMixin):
|
|
76
76
|
if not isinstance(choices, list):
|
77
77
|
raise AssertionError("Parameter `choices` - Not а `list` type!")
|
78
78
|
if len(choices) == 0:
|
79
|
-
raise AssertionError(
|
80
|
-
"The `choices` parameter should not contain an empty list!"
|
81
|
-
)
|
79
|
+
raise AssertionError("The `choices` parameter should not contain an empty list!")
|
82
80
|
if default is not None:
|
83
81
|
if not isinstance(default, list):
|
84
82
|
raise AssertionError("Parameter `default` - Not а `list` type!")
|
85
83
|
if len(default) == 0:
|
86
|
-
raise AssertionError(
|
87
|
-
"The `default` parameter should not contain an empty list!"
|
88
|
-
)
|
84
|
+
raise AssertionError("The `default` parameter should not contain an empty list!")
|
89
85
|
if choices is not None and not self.has_value():
|
90
86
|
raise AssertionError(
|
91
|
-
"Parameter `default` does not coincide with "
|
92
|
-
+ "list of permissive values in `choicees`."
|
87
|
+
"Parameter `default` does not coincide with " + "list of permissive values in `choicees`.",
|
93
88
|
)
|
94
89
|
if not isinstance(label, str):
|
95
90
|
raise AssertionError("Parameter `default` - Not а `str` type!")
|
ramifice/fields/color_field.py
CHANGED
@@ -56,9 +56,7 @@ class ColorField(Field, TextGroup, JsonMixin):
|
|
56
56
|
if not isinstance(default, str):
|
57
57
|
raise AssertionError("Parameter `default` - Not а `str` type!")
|
58
58
|
if len(default) == 0:
|
59
|
-
raise AssertionError(
|
60
|
-
"The `default` parameter should not contain an empty string!"
|
61
|
-
)
|
59
|
+
raise AssertionError("The `default` parameter should not contain an empty string!")
|
62
60
|
if constants.REGEX["color_code"].match(default) is None:
|
63
61
|
raise AssertionError("Parameter `default` - Not а color code!")
|
64
62
|
if not isinstance(label, str):
|
ramifice/fields/date_field.py
CHANGED
@@ -59,9 +59,7 @@ class DateField(Field, DateGroup):
|
|
59
59
|
if not isinstance(min_date, datetime):
|
60
60
|
raise AssertionError("Parameter `min_date` - Not а `str` type!")
|
61
61
|
if max_date is not None and min_date is not None and max_date <= min_date:
|
62
|
-
raise AssertionError(
|
63
|
-
"The `max_date` parameter should be more than the `min_date`!"
|
64
|
-
)
|
62
|
+
raise AssertionError("The `max_date` parameter should be more than the `min_date`!")
|
65
63
|
if default is not None:
|
66
64
|
if not isinstance(default, datetime):
|
67
65
|
raise AssertionError("Parameter `default` - Not а `str` type!")
|
@@ -59,9 +59,7 @@ class DateTimeField(Field, DateGroup):
|
|
59
59
|
if not isinstance(min_date, datetime):
|
60
60
|
raise AssertionError("Parameter `min_date` - Not а `str` type!")
|
61
61
|
if max_date is not None and min_date is not None and max_date <= min_date:
|
62
|
-
raise AssertionError(
|
63
|
-
"The `max_date` parameter should be more than the `min_date`!"
|
64
|
-
)
|
62
|
+
raise AssertionError("The `max_date` parameter should be more than the `min_date`!")
|
65
63
|
if default is not None:
|
66
64
|
if not isinstance(default, datetime):
|
67
65
|
raise AssertionError("Parameter `default` - Not а `str` type!")
|
ramifice/fields/email_field.py
CHANGED
@@ -51,9 +51,7 @@ class EmailField(Field, TextGroup, JsonMixin):
|
|
51
51
|
if not isinstance(default, str):
|
52
52
|
raise AssertionError("Parameter `default` - Not а `str` type!")
|
53
53
|
if len(default) == 0:
|
54
|
-
raise AssertionError(
|
55
|
-
"The `default` parameter should not contain an empty string!"
|
56
|
-
)
|
54
|
+
raise AssertionError("The `default` parameter should not contain an empty string!")
|
57
55
|
try:
|
58
56
|
validate_email(default, check_deliverability=True)
|
59
57
|
except EmailNotValidError:
|
ramifice/fields/float_field.py
CHANGED
@@ -57,7 +57,7 @@ class FloatField(Field, NumberGroup, JsonMixin):
|
|
57
57
|
if input_type not in ["number", "range"]:
|
58
58
|
raise AssertionError(
|
59
59
|
"Parameter `input_type` - Invalid input type! "
|
60
|
-
+ "The permissible value of `number` or `range`."
|
60
|
+
+ "The permissible value of `number` or `range`.",
|
61
61
|
)
|
62
62
|
if max_number is not None and not isinstance(max_number, float):
|
63
63
|
raise AssertionError("Parameter `max_number` - Not а number `float` type!")
|
@@ -66,15 +66,13 @@ class FloatField(Field, NumberGroup, JsonMixin):
|
|
66
66
|
if not isinstance(step, float):
|
67
67
|
raise AssertionError("Parameter `step` - Not а number `float` type!")
|
68
68
|
if max_number is not None and min_number is not None and max_number <= min_number:
|
69
|
-
raise AssertionError(
|
70
|
-
"The `max_number` parameter should be more than the `min_number`!"
|
71
|
-
)
|
69
|
+
raise AssertionError("The `max_number` parameter should be more than the `min_number`!")
|
72
70
|
if default is not None:
|
73
71
|
if not isinstance(default, float):
|
74
72
|
raise AssertionError("Parameter `default` - Not а number `float` type!")
|
75
73
|
if max_number is not None and default > max_number:
|
76
74
|
raise AssertionError("Parameter `default` is more `max_number`!")
|
77
|
-
if max_number is not None and default < min_number:
|
75
|
+
if max_number is not None and default < min_number:
|
78
76
|
raise AssertionError("Parameter `default` is less `min_number`!")
|
79
77
|
if not isinstance(label, str):
|
80
78
|
raise AssertionError("Parameter `default` - Not а `str` type!")
|
ramifice/fields/image_field.py
CHANGED
@@ -86,7 +86,7 @@ class ImageField(Field, FileGroup, JsonMixin):
|
|
86
86
|
raise AssertionError(
|
87
87
|
"The `thumbnails` parameter -> "
|
88
88
|
+ f"The `{size_name}` key should be less than a previous size!"
|
89
|
-
+ 'Example: {"lg": 1200, "md": 600, "sm": 300, "xs": 150 }'
|
89
|
+
+ 'Example: {"lg": 1200, "md": 600, "sm": 300, "xs": 150 }',
|
90
90
|
)
|
91
91
|
curr_size_thumb = max_size_thumb
|
92
92
|
if not isinstance(label, str):
|
ramifice/fields/integer_field.py
CHANGED
@@ -57,7 +57,7 @@ class IntegerField(Field, NumberGroup, JsonMixin):
|
|
57
57
|
if input_type not in ["number", "range"]:
|
58
58
|
raise AssertionError(
|
59
59
|
"Parameter `input_type` - Invalid input type! "
|
60
|
-
+ "The permissible value of `number` or `range`."
|
60
|
+
+ "The permissible value of `number` or `range`.",
|
61
61
|
)
|
62
62
|
if max_number is not None and not isinstance(max_number, int):
|
63
63
|
raise AssertionError("Parameter `max_number` - Not а number `int` type!")
|
@@ -66,15 +66,13 @@ class IntegerField(Field, NumberGroup, JsonMixin):
|
|
66
66
|
if not isinstance(step, int):
|
67
67
|
raise AssertionError("Parameter `step` - Not а number `int` type!")
|
68
68
|
if max_number is not None and min_number is not None and max_number <= min_number:
|
69
|
-
raise AssertionError(
|
70
|
-
"The `max_number` parameter should be more than the `min_number`!"
|
71
|
-
)
|
69
|
+
raise AssertionError("The `max_number` parameter should be more than the `min_number`!")
|
72
70
|
if default is not None:
|
73
71
|
if not isinstance(default, int):
|
74
72
|
raise AssertionError("Parameter `default` - Not а number `int` type!")
|
75
73
|
if max_number is not None and default > max_number:
|
76
74
|
raise AssertionError("Parameter `default` is more `max_number`!")
|
77
|
-
if max_number is not None and default < min_number:
|
75
|
+
if max_number is not None and default < min_number:
|
78
76
|
raise AssertionError("Parameter `default` is less `min_number`!")
|
79
77
|
if not isinstance(label, str):
|
80
78
|
raise AssertionError("Parameter `default` - Not а `str` type!")
|
ramifice/fields/ip_field.py
CHANGED
@@ -50,9 +50,7 @@ class IPField(Field, TextGroup, JsonMixin):
|
|
50
50
|
if not isinstance(default, str):
|
51
51
|
raise AssertionError("Parameter `default` - Not а `str` type!")
|
52
52
|
if len(default) == 0:
|
53
|
-
raise AssertionError(
|
54
|
-
"The `default` parameter should not contain an empty string!"
|
55
|
-
)
|
53
|
+
raise AssertionError("The `default` parameter should not contain an empty string!")
|
56
54
|
try:
|
57
55
|
ipaddress.ip_address(default)
|
58
56
|
except ValueError:
|
ramifice/fields/phone_field.py
CHANGED
@@ -54,9 +54,7 @@ class PhoneField(Field, TextGroup, JsonMixin):
|
|
54
54
|
if not isinstance(default, str):
|
55
55
|
raise AssertionError("Parameter `default` - Not а `str` type!")
|
56
56
|
if len(default) == 0:
|
57
|
-
raise AssertionError(
|
58
|
-
"The `default` parameter should not contain an empty string!"
|
59
|
-
)
|
57
|
+
raise AssertionError("The `default` parameter should not contain an empty string!")
|
60
58
|
try:
|
61
59
|
phone_default = phonenumbers.parse(default)
|
62
60
|
if not phonenumbers.is_valid_number(phone_default):
|
ramifice/fields/url_field.py
CHANGED
@@ -50,9 +50,7 @@ class URLField(Field, TextGroup, JsonMixin):
|
|
50
50
|
if not isinstance(default, str):
|
51
51
|
raise AssertionError("Parameter `default` - Not а `str` type!")
|
52
52
|
if len(default) == 0:
|
53
|
-
raise AssertionError(
|
54
|
-
"The `default` parameter should not contain an empty string!"
|
55
|
-
)
|
53
|
+
raise AssertionError("The `default` parameter should not contain an empty string!")
|
56
54
|
result = urlparse(default)
|
57
55
|
if not result.scheme or not result.netloc:
|
58
56
|
raise AssertionError("Parameter `default` - Invalid URL address!")
|
ramifice/models/decorator.py
CHANGED
@@ -158,8 +158,6 @@ def caching(cls: Any, service_name: str) -> dict[str, Any]:
|
|
158
158
|
metadata["data_dynamic_fields"] = data_dynamic_fields
|
159
159
|
metadata["count_all_fields"] = count_all_fields
|
160
160
|
metadata["count_fields_no_ignored"] = count_fields_no_ignored
|
161
|
-
metadata["regex_mongo_filter"] = re.compile(
|
162
|
-
rf'(?P<field>"(?:{"|".join(supported_lang_fields)})":)'
|
163
|
-
)
|
161
|
+
metadata["regex_mongo_filter"] = re.compile(rf'(?P<field>"(?:{"|".join(supported_lang_fields)})":)')
|
164
162
|
|
165
163
|
return metadata
|
ramifice/paladins/check.py
CHANGED
@@ -80,9 +80,7 @@ class CheckMixin(
|
|
80
80
|
"field_data": None,
|
81
81
|
"full_model_name": cls_model.META["full_model_name"],
|
82
82
|
"is_migration_process": is_migration_process,
|
83
|
-
"curr_doc": (
|
84
|
-
await collection.find_one({"_id": doc_id}) if is_save and is_update else None
|
85
|
-
),
|
83
|
+
"curr_doc": (await collection.find_one({"_id": doc_id}) if is_save and is_update else None),
|
86
84
|
}
|
87
85
|
|
88
86
|
# Run checking fields.
|
@@ -105,9 +105,7 @@ class DateGroupMixin:
|
|
105
105
|
locale=translations.CURRENT_LOCALE,
|
106
106
|
)
|
107
107
|
)
|
108
|
-
err_msg = translations._(
|
109
|
-
"The date %s must not be less than min=%s !" % value_str, min_date_str
|
110
|
-
)
|
108
|
+
err_msg = translations._("The date %s must not be less than min=%s !" % value_str, min_date_str)
|
111
109
|
accumulate_error(err_msg, params)
|
112
110
|
# Insert result.
|
113
111
|
if params["is_save"]:
|
@@ -66,9 +66,7 @@ class FileGroupMixin:
|
|
66
66
|
return
|
67
67
|
# Accumulate an error if the file size exceeds the maximum value.
|
68
68
|
if value["size"] > field.max_size:
|
69
|
-
err_msg = translations._(
|
70
|
-
"File size exceeds the maximum value %s !" % to_human_size(field.max_size)
|
71
|
-
)
|
69
|
+
err_msg = translations._("File size exceeds the maximum value %s !" % to_human_size(field.max_size))
|
72
70
|
accumulate_error(err_msg, params)
|
73
71
|
return
|
74
72
|
# Insert result.
|
@@ -66,9 +66,7 @@ class ImgGroupMixin:
|
|
66
66
|
return
|
67
67
|
# Accumulate an error if the file size exceeds the maximum value.
|
68
68
|
if value["size"] > field.max_size:
|
69
|
-
err_msg = translations._(
|
70
|
-
"Image size exceeds the maximum value %s !" % to_human_size(field.max_size)
|
71
|
-
)
|
69
|
+
err_msg = translations._("Image size exceeds the maximum value %s !" % to_human_size(field.max_size))
|
72
70
|
accumulate_error(err_msg, params)
|
73
71
|
return
|
74
72
|
# Create thumbnails.
|
@@ -49,16 +49,12 @@ class NumGroupMixin:
|
|
49
49
|
# Validation the `max_number` field attribute.
|
50
50
|
max_number = field.max_number
|
51
51
|
if max_number is not None and value > max_number:
|
52
|
-
err_msg = translations._(
|
53
|
-
"The value %d must not be greater than max=%d !" % value, max_number
|
54
|
-
)
|
52
|
+
err_msg = translations._("The value %d must not be greater than max=%d !" % value, max_number)
|
55
53
|
accumulate_error(err_msg, params)
|
56
54
|
# Validation the `min_number` field attribute.
|
57
55
|
min_number = field.min_number
|
58
56
|
if min_number is not None and value < min_number:
|
59
|
-
err_msg = translations._(
|
60
|
-
"The value %d must not be less than min=%d !" % value, min_number
|
61
|
-
)
|
57
|
+
err_msg = translations._("The value %d must not be less than min=%d !" % value, min_number)
|
62
58
|
accumulate_error(err_msg, params)
|
63
59
|
# Validation the `unique` field attribute.
|
64
60
|
if field.unique and not await check_uniqueness(value, params, field_name):
|
ramifice/paladins/save.py
CHANGED
@@ -54,9 +54,7 @@ class SaveMixin:
|
|
54
54
|
# Run hook.
|
55
55
|
await self.post_update()
|
56
56
|
# Refresh Model.
|
57
|
-
mongo_doc: dict[str, Any] | None = await collection.find_one(
|
58
|
-
{"_id": checked_data["_id"]}
|
59
|
-
)
|
57
|
+
mongo_doc: dict[str, Any] | None = await collection.find_one({"_id": checked_data["_id"]})
|
60
58
|
if mongo_doc is None:
|
61
59
|
msg = (
|
62
60
|
f"Model: `{self.full_model_name()}` > "
|
@@ -80,11 +78,7 @@ class SaveMixin:
|
|
80
78
|
# Refresh Model.
|
81
79
|
mongo_doc = await collection.find_one({"_id": checked_data["_id"]})
|
82
80
|
if mongo_doc is None:
|
83
|
-
msg = (
|
84
|
-
f"Model: `{self.full_model_name()}` > "
|
85
|
-
+ "Method: `save` => "
|
86
|
-
+ "The document was not created."
|
87
|
-
)
|
81
|
+
msg = f"Model: `{self.full_model_name()}` > " + "Method: `save` => " + "The document was not created."
|
88
82
|
logger.critical(msg)
|
89
83
|
raise PanicError(msg)
|
90
84
|
refresh_from_mongo_doc(self, mongo_doc)
|
ramifice/utils/fixtures.py
CHANGED
@@ -31,7 +31,7 @@ async def apply_fixture(
|
|
31
31
|
fixture_path: str = f"config/fixtures/{fixture_name}.yml"
|
32
32
|
data_yaml: dict[str, Any] | list[dict[str, Any]] | None = None
|
33
33
|
|
34
|
-
with open(fixture_path
|
34
|
+
with open(fixture_path) as file:
|
35
35
|
data_yaml = yaml.safe_load(file)
|
36
36
|
|
37
37
|
if not bool(data_yaml):
|
ramifice/utils/migration.py
CHANGED
@@ -52,9 +52,7 @@ class Migration:
|
|
52
52
|
"""
|
53
53
|
# Get access to super collection.
|
54
54
|
# (Contains Model state and dynamic field data.)
|
55
|
-
super_collection: AsyncCollection = constants.MONGO_DATABASE[
|
56
|
-
constants.SUPER_COLLECTION_NAME
|
57
|
-
]
|
55
|
+
super_collection: AsyncCollection = constants.MONGO_DATABASE[constants.SUPER_COLLECTION_NAME]
|
58
56
|
# Switch the `is_model_exist` parameter in `False`.
|
59
57
|
async for model_state in super_collection.find():
|
60
58
|
q_filter = {"collection_name": model_state["collection_name"]}
|
@@ -65,12 +63,10 @@ class Migration:
|
|
65
63
|
"""Get the state of the current model from a super collection."""
|
66
64
|
# Get access to super collection.
|
67
65
|
# (Contains Model state and dynamic field data.)
|
68
|
-
super_collection: AsyncCollection = constants.MONGO_DATABASE[
|
69
|
-
constants.SUPER_COLLECTION_NAME
|
70
|
-
]
|
66
|
+
super_collection: AsyncCollection = constants.MONGO_DATABASE[constants.SUPER_COLLECTION_NAME]
|
71
67
|
# Get state of current Model.
|
72
68
|
model_state: dict[str, Any] | None = await super_collection.find_one(
|
73
|
-
{"collection_name": metadata["collection_name"]}
|
69
|
+
{"collection_name": metadata["collection_name"]},
|
74
70
|
)
|
75
71
|
if model_state is not None:
|
76
72
|
model_state["is_model_exist"] = True
|
@@ -102,9 +98,7 @@ class Migration:
|
|
102
98
|
database = constants.MONGO_DATABASE
|
103
99
|
# Get access to super collection.
|
104
100
|
# (Contains Model state and dynamic field data.)
|
105
|
-
super_collection: AsyncCollection = constants.MONGO_DATABASE[
|
106
|
-
constants.SUPER_COLLECTION_NAME
|
107
|
-
]
|
101
|
+
super_collection: AsyncCollection = constants.MONGO_DATABASE[constants.SUPER_COLLECTION_NAME]
|
108
102
|
# Delete data for non-existent Models.
|
109
103
|
async for model_state in super_collection.find():
|
110
104
|
if model_state["is_model_exist"] is False:
|
@@ -183,8 +177,7 @@ class Migration:
|
|
183
177
|
for field_name, field_type in metadata["field_name_and_type"].items():
|
184
178
|
if (
|
185
179
|
field_type == "PasswordField"
|
186
|
-
and model_state["field_name_and_type"].get(field_name)
|
187
|
-
== "PasswordField"
|
180
|
+
and model_state["field_name_and_type"].get(field_name) == "PasswordField"
|
188
181
|
):
|
189
182
|
checked_data[field_name] = mongo_doc[field_name]
|
190
183
|
# Update date and time.
|
@@ -200,9 +193,7 @@ class Migration:
|
|
200
193
|
if model_state["data_dynamic_fields"].get(field_name, False) == False: # noqa: E712
|
201
194
|
model_state["data_dynamic_fields"][field_name] = field_data
|
202
195
|
else:
|
203
|
-
metadata["data_dynamic_fields"][field_name] = model_state[
|
204
|
-
"data_dynamic_fields"
|
205
|
-
][field_name]
|
196
|
+
metadata["data_dynamic_fields"][field_name] = model_state["data_dynamic_fields"][field_name]
|
206
197
|
# Refresh state of current Model.
|
207
198
|
model_state["data_dynamic_fields"] = metadata["data_dynamic_fields"]
|
208
199
|
model_state["field_name_and_type"] = metadata["field_name_and_type"]
|
@@ -224,9 +215,7 @@ class Migration:
|
|
224
215
|
# Apply fixture to current Model.
|
225
216
|
fixture_name: str | None = cls_model.META["fixture_name"]
|
226
217
|
if fixture_name is not None:
|
227
|
-
collection: AsyncCollection = constants.MONGO_DATABASE[
|
228
|
-
cls_model.META["collection_name"]
|
229
|
-
]
|
218
|
+
collection: AsyncCollection = constants.MONGO_DATABASE[cls_model.META["collection_name"]]
|
230
219
|
if await collection.estimated_document_count() == 0:
|
231
220
|
await apply_fixture(
|
232
221
|
fixture_name=fixture_name,
|
ramifice/utils/unit.py
CHANGED
@@ -32,10 +32,7 @@ class Unit(JsonMixin):
|
|
32
32
|
msg = "Class: `Unit` > Field: `field` => Not а `str` type!"
|
33
33
|
raise PanicError(msg)
|
34
34
|
if not isinstance(title, dict):
|
35
|
-
msg =
|
36
|
-
"Class: `Unit` > Field: `title` => Not а `str` type! "
|
37
|
-
+ 'Example: {"en": "Title", "ru": "Заголовок"}'
|
38
|
-
)
|
35
|
+
msg = "Class: `Unit` > Field: `title` => Not а `str` type! " + 'Example: {"en": "Title", "ru": "Заголовок"}'
|
39
36
|
raise PanicError(msg)
|
40
37
|
if not isinstance(value, (float, int, str)):
|
41
38
|
msg = "Class: `Unit` > Field: `value` => Not a `float | int | str` type!"
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: ramifice
|
3
|
-
Version: 0.8.
|
3
|
+
Version: 0.8.29
|
4
4
|
Summary: ORM-pseudo-like API MongoDB for Python language.
|
5
5
|
Project-URL: Homepage, https://github.com/kebasyaty/ramifice
|
6
6
|
Project-URL: Documentation, https://kebasyaty.github.io/ramifice/
|
@@ -60,9 +60,9 @@ Description-Content-Type: text/markdown
|
|
60
60
|
<a href="https://github.com/kebasyaty/ramifice/issues"><img src="https://img.shields.io/github/issues/kebasyaty/ramifice.svg" alt="GitHub issues"></a>
|
61
61
|
<a href="https://pepy.tech/projects/ramifice"><img src="https://static.pepy.tech/badge/ramifice" alt="PyPI Downloads"></a>
|
62
62
|
<a href="https://github.com/kebasyaty/ramifice/blob/main/LICENSE" alt="GitHub license"><img src="https://img.shields.io/github/license/kebasyaty/ramifice" alt="GitHub license"></a>
|
63
|
+
<a href="https://mypy-lang.org/" alt="Types: Mypy"><img src="https://img.shields.io/badge/types-Mypy-202235.svg?color=0c7ebf" alt="Types: Mypy"></a>
|
63
64
|
<a href="https://docs.astral.sh/ruff/" alt="Code style: Ruff"><img src="https://img.shields.io/badge/code%20style-Ruff-FDD835.svg" alt="Code style: Ruff"></a>
|
64
65
|
<a href="https://github.com/kebasyaty/ramifice" alt="PyPI implementation"><img src="https://img.shields.io/pypi/implementation/ramifice" alt="PyPI implementation"></a>
|
65
|
-
<a href="https://github.com/kebasyaty/ramifice" alt="GitHub repository"><img src="https://img.shields.io/badge/--ecebeb?logo=github&logoColor=000000" alt="GitHub repository"></a>
|
66
66
|
<br>
|
67
67
|
<a href="https://pypi.org/project/ramifice"><img src="https://img.shields.io/pypi/format/ramifice" alt="Format"></a>
|
68
68
|
<a href="https://github.com/kebasyaty/ramifice"><img src="https://img.shields.io/github/languages/top/kebasyaty/ramifice" alt="Top"></a>
|
@@ -96,7 +96,7 @@ Online browsable documentation is available at [https://kebasyaty.github.io/rami
|
|
96
96
|
|
97
97
|
## Requirements
|
98
98
|
|
99
|
-
[View the list of requirements
|
99
|
+
[View the list of requirements](https://github.com/kebasyaty/ramifice/blob/v0/REQUIREMENTS.md "Requirements").
|
100
100
|
|
101
101
|
## Installation
|
102
102
|
|
@@ -105,7 +105,7 @@ Online browsable documentation is available at [https://kebasyaty.github.io/rami
|
|
105
105
|
[](https://github.com/kebasyaty/ramifice/blob/v0/assets/UBUNTU_INSTALL_MONGODB.md)
|
106
106
|
[](https://www.mongodb.com/try/download/community)
|
107
107
|
|
108
|
-
|
108
|
+
2. Run:
|
109
109
|
|
110
110
|
```shell
|
111
111
|
# Fedora:
|
@@ -128,14 +128,14 @@ uv add ramifice
|
|
128
128
|
|
129
129
|
## Usage
|
130
130
|
|
131
|
-
It is recommended to look at examples
|
131
|
+
[It is recommended to look at examples here](https://github.com/kebasyaty/ramifice/tree/v0/examples "It is recommended to look at examples here").
|
132
132
|
|
133
133
|
```python
|
134
134
|
import re
|
135
135
|
import asyncio
|
136
136
|
from typing import Any
|
137
137
|
from datetime import datetime
|
138
|
-
import pprint
|
138
|
+
from pprint import pprint as pp
|
139
139
|
|
140
140
|
from pymongo import AsyncMongoClient
|
141
141
|
from ramifice import (
|
@@ -143,13 +143,13 @@ from ramifice import (
|
|
143
143
|
model,
|
144
144
|
translations,
|
145
145
|
Migration,
|
146
|
+
to_human_size,
|
146
147
|
)
|
147
148
|
from ramifice.fields import (
|
148
149
|
ImageField,
|
149
150
|
PasswordField,
|
150
151
|
TextField,
|
151
152
|
)
|
152
|
-
from ramifice.utils.tools import to_human_size
|
153
153
|
|
154
154
|
|
155
155
|
@model(service_name="Accounts")
|
@@ -245,7 +245,7 @@ async def main():
|
|
245
245
|
{f"username": user.username.value}
|
246
246
|
)
|
247
247
|
if user_details is not None:
|
248
|
-
|
248
|
+
pp(user_details)
|
249
249
|
else:
|
250
250
|
print("No User!")
|
251
251
|
|
@@ -323,9 +323,9 @@ uv run pybabel compile -d config/translations/ramifice
|
|
323
323
|
|
324
324
|
## Model Parameters
|
325
325
|
|
326
|
-
See the documentation
|
326
|
+
[See the documentation here.](https://kebasyaty.github.io/ramifice/ "See the documentation here.")
|
327
327
|
|
328
|
-
|
328
|
+
( only `service_name` is a required parameter )
|
329
329
|
|
330
330
|
<div>
|
331
331
|
<table>
|
@@ -614,7 +614,7 @@ size: int = get_file_size(path) # => 9843
|
|
614
614
|
|
615
615
|
## Changelog
|
616
616
|
|
617
|
-
[View the change history
|
617
|
+
[View the change history](https://github.com/kebasyaty/ramifice/blob/v0/CHANGELOG.md "Changelog").
|
618
618
|
|
619
619
|
## License
|
620
620
|
|
@@ -1,41 +1,41 @@
|
|
1
|
-
ramifice/__init__.py,sha256=
|
1
|
+
ramifice/__init__.py,sha256=XdLGeKCFqIVRyaj4M_dpdVvQ8Kx8rL3FtyuR08Ehnc4,1590
|
2
2
|
ramifice/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
3
3
|
ramifice/commons/__init__.py,sha256=HwOckqlNkt4OzFbYqnLw9x0VXLbwO_mJaJ9MLYgSvtI,545
|
4
4
|
ramifice/commons/general.py,sha256=ZryiRH-qf_cH9HCul7EP11UU-k4YO_rp_kku2FWAwj4,5433
|
5
5
|
ramifice/commons/indexes.py,sha256=dBPVYeJGbEyENLEzGjQmQ2XYOr3qqzjonj6zyH4rl54,3696
|
6
|
-
ramifice/commons/many.py,sha256=
|
7
|
-
ramifice/commons/one.py,sha256=
|
6
|
+
ramifice/commons/many.py,sha256=sirqV6oEPMaBlYc8UvReLUQtwvbhr5d2V1kYQ-xpK8o,9378
|
7
|
+
ramifice/commons/one.py,sha256=Ppq7vZpmvcfnpurgH3rXSix1KUUwDHYeJQqKkqedE14,6955
|
8
8
|
ramifice/commons/tools.py,sha256=o0o-0W7VDAMPiEOWF9Du7W7py94fCLFx8KJc7LM6HP4,2423
|
9
|
-
ramifice/commons/unit_manager.py,sha256=
|
9
|
+
ramifice/commons/unit_manager.py,sha256=OCDh8Ms-zCYgHEwwyXp83qYDmRBSgkkAnZiJHSuEGm8,4945
|
10
10
|
ramifice/fields/__init__.py,sha256=hjqCZG_kKsHdHtSd05vHn9SiFpk-YSvKEsVFaXim5Sw,2360
|
11
11
|
ramifice/fields/bool_field.py,sha256=d3sKQWMAfEycgtBIhIIov2XVoqLbN8th8i3H7YLrNdg,2769
|
12
12
|
ramifice/fields/choice_float_dyn_field.py,sha256=e-i7CtmDVqWzRJJ5Pq4PmI69riHDPx9NX51h2qFsjEE,3912
|
13
|
-
ramifice/fields/choice_float_field.py,sha256=
|
13
|
+
ramifice/fields/choice_float_field.py,sha256=2XyMkRa6uxc9q5cxB89upoCqaUaUqZ39BLLYcE9Hmc8,4811
|
14
14
|
ramifice/fields/choice_float_mult_dyn_field.py,sha256=45nr0FoY9roO2pJ0FfzBIMu6ih5cl7_3NyKVwtUAHrA,3979
|
15
|
-
ramifice/fields/choice_float_mult_field.py,sha256=
|
15
|
+
ramifice/fields/choice_float_mult_field.py,sha256=lvcSWEwYFOuxpPect3kRh6QnDGfzB2Y0JkODmhfurQo,5121
|
16
16
|
ramifice/fields/choice_int_dyn_field.py,sha256=qUAZivbZSmGYhoPo-vu9P0psEjj-ZtUWjmjYv9GY6yc,3904
|
17
|
-
ramifice/fields/choice_int_field.py,sha256=
|
17
|
+
ramifice/fields/choice_int_field.py,sha256=e0E2P1s21918KeYaKQrMsYb64QXztdcBiHzH7J6cLEw,4797
|
18
18
|
ramifice/fields/choice_int_mult_dyn_field.py,sha256=QajFttWuw5Z_S_ik48zev83tVIiPOgHjzPFnxmkO_e4,3973
|
19
|
-
ramifice/fields/choice_int_mult_field.py,sha256=
|
19
|
+
ramifice/fields/choice_int_mult_field.py,sha256=Aet8kmD8tmHk0IF13P4LTTpAQwKX8f7YwhkJSMVf3TI,5113
|
20
20
|
ramifice/fields/choice_text_dyn_field.py,sha256=H_BGtTuNNGJdXDZmGGPpi-7c0GtDGJwkyNFbKScLs28,3895
|
21
|
-
ramifice/fields/choice_text_field.py,sha256=
|
21
|
+
ramifice/fields/choice_text_field.py,sha256=Kkm_CZCNXlMH9_brp0bR93ByPUU0R8MKsleVvdrc6nc,4957
|
22
22
|
ramifice/fields/choice_text_mult_dyn_field.py,sha256=OrPZ-y2ihcJeLkTWJrcPgMijedq_5czbPEmISg1HdWU,3964
|
23
|
-
ramifice/fields/choice_text_mult_field.py,sha256=
|
24
|
-
ramifice/fields/color_field.py,sha256
|
25
|
-
ramifice/fields/date_field.py,sha256=
|
26
|
-
ramifice/fields/date_time_field.py,sha256=
|
27
|
-
ramifice/fields/email_field.py,sha256=
|
23
|
+
ramifice/fields/choice_text_mult_field.py,sha256=H3qp6B4Rw81FEycmBJ9wiwhTQc_hlE5TmRZJNj_Z-yc,5104
|
24
|
+
ramifice/fields/color_field.py,sha256=Q1ZezPW6Jl-9olKCx47pMdHTCauBY_lwoudxIhZpAgw,4449
|
25
|
+
ramifice/fields/date_field.py,sha256=svJjb6KgsmpW4RO8y3Opkh2uFwwSVfzyeb7nd5tNXLs,6267
|
26
|
+
ramifice/fields/date_time_field.py,sha256=jINGK1VrRt1boXmjJb6_WU7G7h_qnbUSolKNFOtVXFg,6324
|
27
|
+
ramifice/fields/email_field.py,sha256=joReU6YV-ViewMiRVvHozVjIhXuPMwxA-cmqwR5kkHY,4389
|
28
28
|
ramifice/fields/file_field.py,sha256=dAsOYXPjMNwC_t8jCyoNEwlRAsGEd9V_tiuix0qTukU,9476
|
29
|
-
ramifice/fields/float_field.py,sha256=
|
29
|
+
ramifice/fields/float_field.py,sha256=0OjoR9nwDs-Isv_lJoAT_jtdKmnd7-MqltCUiCViups,5796
|
30
30
|
ramifice/fields/id_field.py,sha256=36VroZIgCH6uKuYjjWTXIycZ06ZGy4reLX6FhMUphCI,4757
|
31
|
-
ramifice/fields/image_field.py,sha256=
|
32
|
-
ramifice/fields/integer_field.py,sha256=
|
33
|
-
ramifice/fields/ip_field.py,sha256=
|
31
|
+
ramifice/fields/image_field.py,sha256=dZOB8ctt-7KeB-ePDwgeIgpNP6tLfnxWBU_E5_6dApc,12855
|
32
|
+
ramifice/fields/integer_field.py,sha256=WKzmy-v2uLmIYlrTwcmuoUGfjWQhGD9wHukfQ0fUipk,5770
|
33
|
+
ramifice/fields/ip_field.py,sha256=GjDo1g5PEolqb8_AcDqgE_BnTITqew2rZcqmEn3S5WA,4293
|
34
34
|
ramifice/fields/password_field.py,sha256=lKELnyIjlAIJWeCR_3BCa0ZL5R0L73cf9zimigIgN3g,3902
|
35
|
-
ramifice/fields/phone_field.py,sha256=
|
35
|
+
ramifice/fields/phone_field.py,sha256=neaa9sCLtQR5zr0eiF6CkoSHIif2h2j01DY_VDgpNzk,4580
|
36
36
|
ramifice/fields/slug_field.py,sha256=wJtyf5LWP5pxw6G91_sYSs02QY7kvLYyB1_99_6gz5o,3552
|
37
37
|
ramifice/fields/text_field.py,sha256=fBVxBzHwj7R0TiSXnidqA5XHJdEz16WShT6TGjC-B6g,5299
|
38
|
-
ramifice/fields/url_field.py,sha256=
|
38
|
+
ramifice/fields/url_field.py,sha256=MbaXUVbmYIaYHN4sldaSIsojqxUjT0zHDpuzGC1pHrY,4292
|
39
39
|
ramifice/fields/general/__init__.py,sha256=JzgIDseNQLB_IDwY9-JSiT_bONxvhJmbKl5PhQzTnpE,40
|
40
40
|
ramifice/fields/general/choice_group.py,sha256=fdxfUEKavnW3SahtmyXNDsIJ1O67wCqZb0g-qnNc9cc,896
|
41
41
|
ramifice/fields/general/date_group.py,sha256=0Y4njV6AboQKCpSpjNRWiO8iJF4EdnVWOvmRz_M_7MY,1185
|
@@ -44,40 +44,40 @@ ramifice/fields/general/file_group.py,sha256=HjCww3B6eS9gUmr6AGZTXhHVhS_VBvn0Xpb
|
|
44
44
|
ramifice/fields/general/number_group.py,sha256=QvJnnpvWvU5J-99mWk7h-00hW7busClv1eSR_DPll4A,753
|
45
45
|
ramifice/fields/general/text_group.py,sha256=y5j_7I-TzOpr6vJpbEFHN1JRc6s0wa6BVSqnHMMmX-4,1077
|
46
46
|
ramifice/models/__init__.py,sha256=I4p5Y_oHG9ZLZ3vR44PpCGGvB-C2W7fSQPb5qJsm-VQ,178
|
47
|
-
ramifice/models/decorator.py,sha256=
|
47
|
+
ramifice/models/decorator.py,sha256=bFUN62UXLKSVteyd8GRZGEK-u-IgJQq1U_HrCrws5ZU,6350
|
48
48
|
ramifice/models/model.py,sha256=kexnWtfmQaiGZU2qKeAhuHLxmuIFFe-xHwCULzLs9bc,7639
|
49
49
|
ramifice/paladins/__init__.py,sha256=bFr12UzadCCpuIkGSd6reeIeQ5td8W7LfckduP84WXc,1517
|
50
50
|
ramifice/paladins/add_valid.py,sha256=c-vIkbbIBC94T4czxkQC40uwNEe6w8wQgNVgu4cjeoY,439
|
51
|
-
ramifice/paladins/check.py,sha256=
|
51
|
+
ramifice/paladins/check.py,sha256=7zRYKzaa2tXJq8OVNe52SEFt9YFkrElsf4-mvhVD_B0,6908
|
52
52
|
ramifice/paladins/delete.py,sha256=k3N2qlaHZLWtFUTqWvtkYaqW9h3uK7ecpLjKr5gfoGE,3690
|
53
53
|
ramifice/paladins/hooks.py,sha256=jTOcz5eb3WUpIy21h-CcnsISDDsTgDCWjitszcFxZFE,1057
|
54
54
|
ramifice/paladins/indexing.py,sha256=ep6iSUhnH70eaNASr0Kx3yeuRE_i9BEdVUUiJBo4hZE,363
|
55
55
|
ramifice/paladins/password.py,sha256=7lZmsl-bBely5zlVz0aCYlC5yf8nHp1YswoFF4CZWBI,3297
|
56
56
|
ramifice/paladins/refrash.py,sha256=oS-N1QVwQGwt5lSxS01bpM6ETGuMLV_RFt1u5v2uEds,1221
|
57
|
-
ramifice/paladins/save.py,sha256=
|
57
|
+
ramifice/paladins/save.py,sha256=ahuPKo6qh9MHPXs_QNo9RbeBvN74uWtuI27k84gx5f4,3631
|
58
58
|
ramifice/paladins/tools.py,sha256=8rkWPGrVMJiYN97EZuX52nVFVfB6qa08avYT4v8ohLA,2918
|
59
59
|
ramifice/paladins/validation.py,sha256=vJ55g4al-V_aGxFSrnXDwAxjJXWv00Z8ZGexFipRD1c,1890
|
60
60
|
ramifice/paladins/groups/__init__.py,sha256=GdIBJaMKz7L8pBKMAA__a4m-p0g0_RlzCcvDLDMMiec,958
|
61
61
|
ramifice/paladins/groups/bool_group.py,sha256=X8P4YDh02gNzxTo9rgeCnmnV88jApUPqPLYIkpf5vGg,841
|
62
62
|
ramifice/paladins/groups/choice_group.py,sha256=NkD2sKqBkdUMHY36pFdvL4uQ-81LXByRHF_lhCEAI6Y,1848
|
63
|
-
ramifice/paladins/groups/date_group.py,sha256=
|
64
|
-
ramifice/paladins/groups/file_group.py,sha256=
|
63
|
+
ramifice/paladins/groups/date_group.py,sha256=3i6U2mwFMxW8s5rRi7RtSr7my6a5Cdy5MRWe601hjGA,3780
|
64
|
+
ramifice/paladins/groups/file_group.py,sha256=vDeW5JCqKHWa43LILcVWJSU1TG-CrwKXQZhchWsZgM8,2975
|
65
65
|
ramifice/paladins/groups/id_group.py,sha256=9iurBTOuhG1_8Wmxc5piTMcUNxAW3H0ZavA1sW7uopY,1321
|
66
|
-
ramifice/paladins/groups/img_group.py,sha256=
|
67
|
-
ramifice/paladins/groups/num_group.py,sha256=
|
66
|
+
ramifice/paladins/groups/img_group.py,sha256=xSrDYqviuMt7mxOZiO0jKll1WnVlWRaSynk7ZvdEJ4c,6131
|
67
|
+
ramifice/paladins/groups/num_group.py,sha256=oiBqm9lFsyHBKZgxfWvcQUpePPIT_0TBGPVrt0ae57s,2285
|
68
68
|
ramifice/paladins/groups/pass_group.py,sha256=54kvAyoUCEjujTw0Dh6oUrtv3RU80sWEem_b-3Ytv0k,1920
|
69
69
|
ramifice/paladins/groups/slug_group.py,sha256=sf-9CebDLoCDsaxyPVJKMhi6D_tWFeg3ET8Qk5E8pU8,2505
|
70
70
|
ramifice/paladins/groups/text_group.py,sha256=TWvUxFctwDtXSJQL_E4TvHX1Yh-cDx5MJLGLAJyC6Xc,4478
|
71
71
|
ramifice/utils/__init__.py,sha256=lAD90nw2VfGSuf0SLjOkeFScBPmc48XFvecueAfq73w,468
|
72
72
|
ramifice/utils/constants.py,sha256=zDVG2D8u0UMNl1Ik90PhZCdxjmK81uwqxosorersbXE,2630
|
73
73
|
ramifice/utils/errors.py,sha256=eEV7-aVR0U19vKqTd9JRHFJXcOv6N1HtXSzqeQpdciE,2796
|
74
|
-
ramifice/utils/fixtures.py,sha256=
|
75
|
-
ramifice/utils/migration.py,sha256=
|
74
|
+
ramifice/utils/fixtures.py,sha256=0hdJGu895zDvVg5HUmRVUqDLZbvM-7BlhwTF6vhRqJI,3374
|
75
|
+
ramifice/utils/migration.py,sha256=rA6RMIB7xrLNGUJHPuvxA5O0B3NkmG155et82kOtu7g,11316
|
76
76
|
ramifice/utils/mixins.py,sha256=XSkxJllqsMxN7xcP_9kn3-GRS4a1l_QQpFOlD3e-tIM,1123
|
77
77
|
ramifice/utils/tools.py,sha256=EKNJAV9Ch17IrmghLcu7-I69gDNkDSqPepG9GKU7WkA,3163
|
78
78
|
ramifice/utils/translations.py,sha256=EWITTDd4uXukRubOchqGwNjmZWt5HxoxRgq_kKeGsR8,4646
|
79
|
-
ramifice/utils/unit.py,sha256=
|
80
|
-
ramifice-0.8.
|
81
|
-
ramifice-0.8.
|
82
|
-
ramifice-0.8.
|
83
|
-
ramifice-0.8.
|
79
|
+
ramifice/utils/unit.py,sha256=fxeWGWh5GkI8E9lxsf80HOh-NihSrqEmIQAQlUKMIaE,2497
|
80
|
+
ramifice-0.8.29.dist-info/METADATA,sha256=hfYwYXqfRfVsffnIR8v6hpZ7xrqOL83KMSYJ0ZHyy_s,21066
|
81
|
+
ramifice-0.8.29.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
82
|
+
ramifice-0.8.29.dist-info/licenses/LICENSE,sha256=LrEL0aTZx90HDwFUQCJutORiDjJL9AnuVvCtspXIqt4,1095
|
83
|
+
ramifice-0.8.29.dist-info/RECORD,,
|
File without changes
|
File without changes
|