ramifice 0.5.11__py3-none-any.whl → 0.6.0__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 +3 -3
- ramifice/commons/__init__.py +5 -5
- ramifice/commons/general.py +2 -2
- ramifice/commons/indexes.py +1 -1
- ramifice/commons/many.py +7 -3
- ramifice/commons/one.py +7 -3
- ramifice/commons/tools.py +1 -1
- ramifice/commons/unit_manager.py +3 -3
- ramifice/fields/__init__.py +28 -28
- ramifice/fields/bool_field.py +3 -3
- ramifice/fields/choice_float_dyn_field.py +4 -4
- ramifice/fields/choice_float_field.py +4 -4
- ramifice/fields/choice_float_mult_dyn_field.py +4 -4
- ramifice/fields/choice_float_mult_field.py +4 -4
- ramifice/fields/choice_int_dyn_field.py +4 -4
- ramifice/fields/choice_int_field.py +4 -4
- ramifice/fields/choice_int_mult_dyn_field.py +4 -4
- ramifice/fields/choice_int_mult_field.py +4 -4
- ramifice/fields/choice_text_dyn_field.py +4 -4
- ramifice/fields/choice_text_field.py +4 -4
- ramifice/fields/choice_text_mult_dyn_field.py +4 -4
- ramifice/fields/choice_text_mult_field.py +4 -4
- ramifice/fields/color_field.py +4 -4
- ramifice/fields/date_field.py +3 -3
- ramifice/fields/date_time_field.py +3 -3
- ramifice/fields/email_field.py +4 -4
- ramifice/fields/file_field.py +19 -18
- ramifice/fields/float_field.py +4 -4
- ramifice/fields/general/__init__.py +1 -1
- ramifice/fields/general/choice_group.py +3 -1
- ramifice/fields/general/date_group.py +2 -1
- ramifice/fields/general/field.py +3 -1
- ramifice/fields/general/file_group.py +3 -1
- ramifice/fields/general/number_group.py +3 -1
- ramifice/fields/general/text_group.py +3 -1
- ramifice/fields/id_field.py +2 -2
- ramifice/fields/image_field.py +18 -37
- ramifice/fields/integer_field.py +4 -4
- ramifice/fields/ip_field.py +4 -4
- ramifice/fields/password_field.py +2 -2
- ramifice/fields/phone_field.py +4 -4
- ramifice/fields/slug_field.py +4 -4
- ramifice/fields/text_field.py +3 -3
- ramifice/fields/url_field.py +4 -4
- ramifice/models/decorator.py +33 -61
- ramifice/models/model.py +2 -2
- ramifice/paladins/__init__.py +6 -6
- ramifice/paladins/check.py +17 -30
- ramifice/paladins/delete.py +6 -6
- ramifice/paladins/groups/__init__.py +10 -10
- ramifice/paladins/groups/bool_group.py +1 -1
- ramifice/paladins/groups/choice_group.py +2 -2
- ramifice/paladins/groups/date_group.py +5 -2
- ramifice/paladins/groups/file_group.py +7 -4
- ramifice/paladins/groups/id_group.py +2 -2
- ramifice/paladins/groups/img_group.py +27 -15
- ramifice/paladins/groups/num_group.py +6 -2
- ramifice/paladins/groups/pass_group.py +3 -3
- ramifice/paladins/groups/slug_group.py +2 -2
- ramifice/paladins/groups/text_group.py +16 -5
- ramifice/paladins/password.py +2 -2
- ramifice/paladins/refrash.py +3 -3
- ramifice/paladins/save.py +3 -3
- ramifice/paladins/tools.py +1 -3
- ramifice/utils/fixtures.py +1 -1
- ramifice/utils/migration.py +5 -7
- ramifice/utils/mixins/__init__.py +4 -4
- ramifice/utils/tools.py +2 -2
- ramifice/utils/translations.py +1 -1
- ramifice/utils/unit.py +2 -2
- {ramifice-0.5.11.dist-info → ramifice-0.6.0.dist-info}/METADATA +4 -17
- ramifice-0.6.0.dist-info/RECORD +84 -0
- ramifice/models/pseudo.py +0 -181
- ramifice-0.5.11.dist-info/RECORD +0 -85
- {ramifice-0.5.11.dist-info → ramifice-0.6.0.dist-info}/WHEEL +0 -0
- {ramifice-0.5.11.dist-info → ramifice-0.6.0.dist-info}/licenses/LICENSE +0 -0
@@ -3,13 +3,14 @@
|
|
3
3
|
Supported fields: ImageField
|
4
4
|
"""
|
5
5
|
|
6
|
+
import asyncio
|
6
7
|
from typing import Any
|
7
8
|
|
8
9
|
from PIL import Image
|
9
10
|
|
10
|
-
from
|
11
|
-
from
|
12
|
-
from
|
11
|
+
from ramifice.paladins.tools import accumulate_error, panic_type_error
|
12
|
+
from ramifice.utils import translations
|
13
|
+
from ramifice.utils.tools import to_human_size
|
13
14
|
|
14
15
|
|
15
16
|
class ImgGroupMixin:
|
@@ -18,7 +19,7 @@ class ImgGroupMixin:
|
|
18
19
|
Supported fields: ImageField
|
19
20
|
"""
|
20
21
|
|
21
|
-
def img_group(self, params: dict[str, Any]) -> None:
|
22
|
+
async def img_group(self, params: dict[str, Any]) -> None:
|
22
23
|
"""Checking image fields."""
|
23
24
|
field = params["field_data"]
|
24
25
|
value = field.value or None
|
@@ -79,37 +80,48 @@ class ImgGroupMixin:
|
|
79
80
|
# Extension to the upper register and delete the point.
|
80
81
|
ext_upper = value["ext_upper"]
|
81
82
|
# Get image file.
|
82
|
-
with Image.open
|
83
|
+
with await asyncio.to_thread(Image.open, path) as img:
|
83
84
|
width, height = img.size
|
84
85
|
value["width"] = width
|
85
86
|
value["height"] = height
|
86
|
-
resample = (
|
87
|
-
Image.Resampling.LANCZOS # High quality and low performance.
|
88
|
-
if params["field_data"].high_quality
|
89
|
-
else Image.Resampling.BICUBIC
|
90
|
-
)
|
91
87
|
for size_name in ["lg", "md", "sm", "xs"]:
|
92
88
|
max_size = thumbnails.get(size_name)
|
93
89
|
if max_size is None:
|
94
90
|
continue
|
95
91
|
size = max_size, max_size
|
96
|
-
img.thumbnail(size=size, resample=
|
92
|
+
img.thumbnail(size=size, resample=Image.Resampling.LANCZOS)
|
97
93
|
if size_name == "lg":
|
98
94
|
value["path_lg"] = f"{imgs_dir_path}/lg{extension}"
|
99
95
|
value["url_lg"] = f"{imgs_dir_url}/lg{extension}"
|
100
|
-
|
96
|
+
await asyncio.to_thread(
|
97
|
+
img.save,
|
98
|
+
fp=value["path_lg"],
|
99
|
+
format=ext_upper,
|
100
|
+
)
|
101
101
|
elif size_name == "md":
|
102
102
|
value["path_md"] = f"{imgs_dir_path}/md{extension}"
|
103
103
|
value["url_md"] = f"{imgs_dir_url}/md{extension}"
|
104
|
-
|
104
|
+
await asyncio.to_thread(
|
105
|
+
img.save,
|
106
|
+
fp=value["path_md"],
|
107
|
+
format=ext_upper,
|
108
|
+
)
|
105
109
|
elif size_name == "sm":
|
106
110
|
value["path_sm"] = f"{imgs_dir_path}/sm{extension}"
|
107
111
|
value["url_sm"] = f"{imgs_dir_url}/sm{extension}"
|
108
|
-
|
112
|
+
await asyncio.to_thread(
|
113
|
+
img.save,
|
114
|
+
fp=value["path_sm"],
|
115
|
+
format=ext_upper,
|
116
|
+
)
|
109
117
|
elif size_name == "xs":
|
110
118
|
value["path_xs"] = f"{imgs_dir_path}/xs{extension}"
|
111
119
|
value["url_xs"] = f"{imgs_dir_url}/xs{extension}"
|
112
|
-
|
120
|
+
await asyncio.to_thread(
|
121
|
+
img.save,
|
122
|
+
fp=value["path_xs"],
|
123
|
+
format=ext_upper,
|
124
|
+
)
|
113
125
|
# Insert result.
|
114
126
|
if params["is_save"] and (value["is_new_img"] or value["save_as_is"]):
|
115
127
|
value["is_delete"] = False
|
@@ -6,8 +6,12 @@ Supported fields:
|
|
6
6
|
|
7
7
|
from typing import Any
|
8
8
|
|
9
|
-
from
|
10
|
-
|
9
|
+
from ramifice.paladins.tools import (
|
10
|
+
accumulate_error,
|
11
|
+
check_uniqueness,
|
12
|
+
panic_type_error,
|
13
|
+
)
|
14
|
+
from ramifice.utils import translations
|
11
15
|
|
12
16
|
|
13
17
|
class NumGroupMixin:
|
@@ -7,9 +7,9 @@ from typing import Any
|
|
7
7
|
|
8
8
|
from argon2 import PasswordHasher
|
9
9
|
|
10
|
-
from
|
11
|
-
from
|
12
|
-
from
|
10
|
+
from ramifice.paladins.tools import accumulate_error, panic_type_error
|
11
|
+
from ramifice.utils import translations
|
12
|
+
from ramifice.utils.tools import is_password
|
13
13
|
|
14
14
|
|
15
15
|
class PassGroupMixin:
|
@@ -8,8 +8,8 @@ from typing import Any
|
|
8
8
|
|
9
9
|
from slugify import slugify
|
10
10
|
|
11
|
-
from
|
12
|
-
from
|
11
|
+
from ramifice.paladins.tools import check_uniqueness
|
12
|
+
from ramifice.utils.errors import PanicError
|
13
13
|
|
14
14
|
|
15
15
|
class SlugGroupMixin:
|
@@ -5,13 +5,23 @@ Supported fields:
|
|
5
5
|
IPField | EmailField | ColorField
|
6
6
|
"""
|
7
7
|
|
8
|
+
import asyncio
|
8
9
|
from typing import Any
|
9
10
|
|
10
11
|
from email_validator import EmailNotValidError, validate_email
|
11
12
|
|
12
|
-
from
|
13
|
-
|
14
|
-
|
13
|
+
from ramifice.paladins.tools import (
|
14
|
+
accumulate_error,
|
15
|
+
check_uniqueness,
|
16
|
+
panic_type_error,
|
17
|
+
)
|
18
|
+
from ramifice.utils import translations
|
19
|
+
from ramifice.utils.tools import (
|
20
|
+
is_color,
|
21
|
+
is_ip,
|
22
|
+
is_phone,
|
23
|
+
is_url,
|
24
|
+
)
|
15
25
|
|
16
26
|
|
17
27
|
class TextGroupMixin:
|
@@ -62,9 +72,10 @@ class TextGroupMixin:
|
|
62
72
|
# Validation Email, Url, IP, Color, Phone.
|
63
73
|
if "EmailField" == field_type:
|
64
74
|
try:
|
65
|
-
emailinfo =
|
75
|
+
emailinfo = await asyncio.to_thread(
|
76
|
+
validate_email,
|
66
77
|
str(value),
|
67
|
-
check_deliverability=
|
78
|
+
check_deliverability=True,
|
68
79
|
)
|
69
80
|
value = emailinfo.normalized
|
70
81
|
params["field_data"].value = value
|
ramifice/paladins/password.py
CHANGED
@@ -5,8 +5,8 @@ from typing import Any
|
|
5
5
|
from argon2 import PasswordHasher
|
6
6
|
from pymongo.asynchronous.collection import AsyncCollection
|
7
7
|
|
8
|
-
from
|
9
|
-
from
|
8
|
+
from ramifice.utils import globals
|
9
|
+
from ramifice.utils.errors import OldPassNotMatchError, PanicError
|
10
10
|
|
11
11
|
|
12
12
|
class PasswordMixin:
|
ramifice/paladins/refrash.py
CHANGED
@@ -4,9 +4,9 @@ from typing import Any
|
|
4
4
|
|
5
5
|
from pymongo.asynchronous.collection import AsyncCollection
|
6
6
|
|
7
|
-
from
|
8
|
-
from
|
9
|
-
from .
|
7
|
+
from ramifice.paladins.tools import refresh_from_mongo_doc
|
8
|
+
from ramifice.utils import globals
|
9
|
+
from ramifice.utils.errors import PanicError
|
10
10
|
|
11
11
|
|
12
12
|
class RefrashMixin:
|
ramifice/paladins/save.py
CHANGED
@@ -5,9 +5,9 @@ from typing import Any
|
|
5
5
|
|
6
6
|
from pymongo.asynchronous.collection import AsyncCollection
|
7
7
|
|
8
|
-
from
|
9
|
-
from
|
10
|
-
from .
|
8
|
+
from ramifice.paladins.tools import ignored_fields_to_none, refresh_from_mongo_doc
|
9
|
+
from ramifice.utils import globals
|
10
|
+
from ramifice.utils.errors import PanicError
|
11
11
|
|
12
12
|
|
13
13
|
class SaveMixin:
|
ramifice/paladins/tools.py
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
from typing import Any
|
4
4
|
|
5
|
-
from
|
5
|
+
from ramifice.utils import errors, translations
|
6
6
|
|
7
7
|
|
8
8
|
def ignored_fields_to_none(inst_model: Any) -> None:
|
@@ -58,8 +58,6 @@ async def check_uniqueness(
|
|
58
58
|
is_multi_language: bool = False,
|
59
59
|
) -> bool:
|
60
60
|
"""Check the uniqueness of the value in the collection."""
|
61
|
-
if not params["is_migrate_model"]:
|
62
|
-
return True
|
63
61
|
q_filter = None
|
64
62
|
if is_multi_language:
|
65
63
|
lang_filter = [{f"{field_name}.{lang}": value} for lang in translations.LANGUAGES]
|
ramifice/utils/fixtures.py
CHANGED
ramifice/utils/migration.py
CHANGED
@@ -11,10 +11,10 @@ from pymongo import AsyncMongoClient
|
|
11
11
|
from pymongo.asynchronous.collection import AsyncCollection
|
12
12
|
from termcolor import colored
|
13
13
|
|
14
|
-
from
|
15
|
-
from . import globals
|
16
|
-
from .errors import DoesNotMatchRegexError, NoModelsForMigrationError, PanicError
|
17
|
-
from .fixtures import apply_fixture
|
14
|
+
from ramifice.models.model import Model
|
15
|
+
from ramifice.utils import globals
|
16
|
+
from ramifice.utils.errors import DoesNotMatchRegexError, NoModelsForMigrationError, PanicError
|
17
|
+
from ramifice.utils.fixtures import apply_fixture
|
18
18
|
|
19
19
|
|
20
20
|
class Monitor:
|
@@ -31,9 +31,7 @@ class Monitor:
|
|
31
31
|
globals.MONGO_CLIENT = mongo_client
|
32
32
|
globals.MONGO_DATABASE = globals.MONGO_CLIENT[globals.DATABASE_NAME]
|
33
33
|
# Get Model list.
|
34
|
-
self.model_list: list[Any] =
|
35
|
-
cls_model for cls_model in Model.__subclasses__() if cls_model.META["is_migrate_model"]
|
36
|
-
]
|
34
|
+
self.model_list: list[Any] = Model.__subclasses__()
|
37
35
|
# Raise the exception if there are no models for migration.
|
38
36
|
if len(self.model_list) == 0:
|
39
37
|
raise NoModelsForMigrationError() # type: ignore[no-untyped-call]
|
@@ -1,6 +1,6 @@
|
|
1
1
|
"""A set of mixins for Ramifice."""
|
2
2
|
|
3
|
-
from .add_valid import AddValidMixin
|
4
|
-
from .hooks import HooksMixin
|
5
|
-
from .indexing import IndexMixin
|
6
|
-
from .json_converter import JsonMixin
|
3
|
+
from ramifice.utils.mixins.add_valid import AddValidMixin
|
4
|
+
from ramifice.utils.mixins.hooks import HooksMixin
|
5
|
+
from ramifice.utils.mixins.indexing import IndexMixin
|
6
|
+
from ramifice.utils.mixins.json_converter import JsonMixin
|
ramifice/utils/tools.py
CHANGED
@@ -10,7 +10,7 @@ import phonenumbers
|
|
10
10
|
from bson.objectid import ObjectId
|
11
11
|
from email_validator import EmailNotValidError, validate_email
|
12
12
|
|
13
|
-
from .globals import REGEX
|
13
|
+
from ramifice.utils.globals import REGEX
|
14
14
|
|
15
15
|
|
16
16
|
def is_password(password: str | None) -> bool:
|
@@ -36,7 +36,7 @@ def get_file_size(path: str) -> int:
|
|
36
36
|
|
37
37
|
def normal_email(email: str | None) -> str | None:
|
38
38
|
"""Normalizing email address.
|
39
|
-
|
39
|
+
|
40
40
|
Use this before requeste to a database.
|
41
41
|
For example, on the login page.
|
42
42
|
"""
|
ramifice/utils/translations.py
CHANGED
ramifice/utils/unit.py
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: ramifice
|
3
|
-
Version: 0.
|
3
|
+
Version: 0.6.0
|
4
4
|
Summary: ORM-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/
|
@@ -23,6 +23,8 @@ Classifier: Programming Language :: Python :: Implementation :: CPython
|
|
23
23
|
Classifier: Topic :: Database
|
24
24
|
Classifier: Typing :: Typed
|
25
25
|
Requires-Python: <4.0,>=3.12
|
26
|
+
Requires-Dist: aiofiles>=24.1.0
|
27
|
+
Requires-Dist: aioshutil>=1.5
|
26
28
|
Requires-Dist: argon2-cffi>=25.1.0
|
27
29
|
Requires-Dist: babel>=2.17.0
|
28
30
|
Requires-Dist: email-validator>=2.2.0
|
@@ -58,6 +60,7 @@ Description-Content-Type: text/markdown
|
|
58
60
|
<a href="https://pepy.tech/projects/ramifice"><img src="https://static.pepy.tech/badge/ramifice" alt="PyPI Downloads"></a>
|
59
61
|
<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>
|
60
62
|
<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>
|
63
|
+
<a href="https://github.com/kebasyaty/ramifice" alt="PyPI implementation"><img src="https://img.shields.io/pypi/implementation/ramifice" alt="PyPI implementation"></a>
|
61
64
|
<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>
|
62
65
|
</p>
|
63
66
|
<p align="center">
|
@@ -148,16 +151,12 @@ class User:
|
|
148
151
|
# ngettext = translations.ngettext
|
149
152
|
self.avatar = ImageField(
|
150
153
|
label=gettext("Avatar"),
|
151
|
-
placeholder=gettext("Upload your photo"),
|
152
154
|
default="public/media/default/no-photo.png",
|
153
155
|
# Directory for images inside media directory.
|
154
156
|
target_dir="users/avatars",
|
155
157
|
# Available 4 sizes from lg to xs or None.
|
156
158
|
# Hint: By default = None
|
157
159
|
thumbnails={"lg": 512, "md": 256, "sm": 128, "xs": 64},
|
158
|
-
# True - high quality and low performance for thumbnails.
|
159
|
-
# Hint: By default = False
|
160
|
-
high_quality=True,
|
161
160
|
# The maximum size of the original image in bytes.
|
162
161
|
# Hint: By default = 2 MB
|
163
162
|
max_size=524288, # 0.5 MB = 512 KB = 524288 Bytes (in binary)
|
@@ -167,7 +166,6 @@ class User:
|
|
167
166
|
)
|
168
167
|
self.username = TextField(
|
169
168
|
label=gettext("Username"),
|
170
|
-
placeholder=gettext("Enter your username"),
|
171
169
|
maxlength=150,
|
172
170
|
required=True,
|
173
171
|
unique=True,
|
@@ -177,11 +175,9 @@ class User:
|
|
177
175
|
)
|
178
176
|
self.password = PasswordField(
|
179
177
|
label=gettext("Password"),
|
180
|
-
placeholder=gettext("Enter your password"),
|
181
178
|
)
|
182
179
|
self.сonfirm_password = PasswordField(
|
183
180
|
label=gettext("Confirm password"),
|
184
|
-
placeholder=gettext("Repeat your password"),
|
185
181
|
# If true, the value of this field is not saved in the database.
|
186
182
|
ignored=True,
|
187
183
|
)
|
@@ -342,14 +338,6 @@ See the documentation [here](https://kebasyaty.github.io/ramifice/ "here").
|
|
342
338
|
<td align="left">1000</td>
|
343
339
|
<td align="left">limiting query results.</td>
|
344
340
|
</tr>
|
345
|
-
<tr>
|
346
|
-
<td align="left">is_migrate_model</td>
|
347
|
-
<td align="left">True</td>
|
348
|
-
<td align="left">
|
349
|
-
Set to <b>False</b> if you do not need to migrate the Model to the database.<br>
|
350
|
-
This can be use to validate a web forms - Search form, Contact form, etc.
|
351
|
-
</td>
|
352
|
-
</tr>
|
353
341
|
<tr>
|
354
342
|
<td align="left">is_create_doc</td>
|
355
343
|
<td align="left">True</td>
|
@@ -380,7 +368,6 @@ See the documentation [here](https://kebasyaty.github.io/ramifice/ "here").
|
|
380
368
|
service_name="ServiceName",
|
381
369
|
fixture_name="FixtureName",
|
382
370
|
db_query_docs_limit=1000,
|
383
|
-
is_migrate_model=True,
|
384
371
|
is_create_doc = True,
|
385
372
|
is_update_doc = True,
|
386
373
|
is_delete_doc = True,
|
@@ -0,0 +1,84 @@
|
|
1
|
+
ramifice/__init__.py,sha256=jLlfcFwSvw_X3dTRz3MbaLJ8SfqlNNrZ8jSwBrS3EMI,783
|
2
|
+
ramifice/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
3
|
+
ramifice/commons/__init__.py,sha256=NZeqK9PEX7q8bVfiUaysdk_GShpA-5EfdM61mhj3wHg,513
|
4
|
+
ramifice/commons/general.py,sha256=Jte8VWCGuMaQidCT19eFjh7tfaTEjBnkto_0mDJoxc4,5384
|
5
|
+
ramifice/commons/indexes.py,sha256=GlAUtYnGaqNjuupg-KLzDzak9eDcOWZiE9y-Iz2AKXQ,3653
|
6
|
+
ramifice/commons/many.py,sha256=5F3TsiUZuygILsNt5Er-mWHXot2qua_GEnHlT6AB-0M,9253
|
7
|
+
ramifice/commons/one.py,sha256=8B5IQHX68x8hsbrb90vu-WgCH9zge2jJ3RmlJ256xU0,6781
|
8
|
+
ramifice/commons/tools.py,sha256=xCalseb-sEDTqHyIv3r0o29n0VIWzmXZZoY3DTIVAIM,2373
|
9
|
+
ramifice/commons/unit_manager.py,sha256=RGKxNovICXiaCzqdzsuvO4fehcSnSa0BDw-ax0J3MuE,4509
|
10
|
+
ramifice/fields/__init__.py,sha256=u_XTUfcWTI96lvxinMPm_s9XNJ4jNDd8zhL9vwRvckc,1710
|
11
|
+
ramifice/fields/bool_field.py,sha256=aTOLSO4k6TRvfWpRupvAuOFSuPQfRBViCE4wI2AJYgo,2101
|
12
|
+
ramifice/fields/choice_float_dyn_field.py,sha256=5vfMjTr2jarr3sSaPfE-YejtTfK24CrTUPRCyn29QOE,3157
|
13
|
+
ramifice/fields/choice_float_field.py,sha256=jNjEfkLXAwaAHgubGOQrT9AttwbRgxHkqhtRqMgMtsk,3950
|
14
|
+
ramifice/fields/choice_float_mult_dyn_field.py,sha256=ReXje9VvEPUthqrP3fjr16VVi0GWvqiN7CQp4UeUDr4,3220
|
15
|
+
ramifice/fields/choice_float_mult_field.py,sha256=70L_mMKvvVowKS7E06BSsQ9IAX3s0q6k4_MhePcsYOU,4296
|
16
|
+
ramifice/fields/choice_int_dyn_field.py,sha256=yWYoESTjrk2_RxFwaVYuIXo6troyWHZK1Ey2kMJvRMs,3151
|
17
|
+
ramifice/fields/choice_int_field.py,sha256=2ejg7z-Ct-Ho56bZeB-SBuvNd0Aq7rQf7AFg41qxW-w,3938
|
18
|
+
ramifice/fields/choice_int_mult_dyn_field.py,sha256=TKwqvZOqUMnq7mdWrUofcnWq61FRAHBeMsIuiMXQXVw,3216
|
19
|
+
ramifice/fields/choice_int_mult_field.py,sha256=e39ue_sybVO9q5S1eKg6kTox6k8gIZSUEhmIlbpwF_c,4290
|
20
|
+
ramifice/fields/choice_text_dyn_field.py,sha256=6AR0vy_ZNv6XAgypzsgWrfNgHXS-7CX0OCA1gA9cy2Q,3147
|
21
|
+
ramifice/fields/choice_text_field.py,sha256=HTEfKUZKBDE3Rv9eKYenodURc4O_iClPQLK2y5LSfBU,4143
|
22
|
+
ramifice/fields/choice_text_mult_dyn_field.py,sha256=RxTDktctGVFKXbLWeISNrpEOIEysp7xjX0VoAn6a3NQ,3212
|
23
|
+
ramifice/fields/choice_text_mult_field.py,sha256=WCpOmrmPZpvIYV9WCo2xAHhAT_Iogd0tuuuR-raGm4c,4286
|
24
|
+
ramifice/fields/color_field.py,sha256=Syam8MtB--B0HzAT3w3QuWz3pPixSMbh8xGPmbGYLCs,3570
|
25
|
+
ramifice/fields/date_field.py,sha256=xhMRsEwk4CztDae5va2Tx0v9Oh55M4p0S4Y0qu-ZlIk,5251
|
26
|
+
ramifice/fields/date_time_field.py,sha256=RKxXVWTWGNxTri-MDlOAZNSwgtL46m-0grh3wKX-gi8,5286
|
27
|
+
ramifice/fields/email_field.py,sha256=qXG7zHkr5ox4CFrb6QYarBMl8gwcq8KlVFVCj-zfvs0,3477
|
28
|
+
ramifice/fields/file_field.py,sha256=YLdZvotj6ymEVRjYGU4xsiHkP_zI8krk3TuHaowvfDo,8126
|
29
|
+
ramifice/fields/float_field.py,sha256=wadjiYakzv4uzWD8wI2E0B9w78Or4hZiAmrNXlOy8EI,4629
|
30
|
+
ramifice/fields/id_field.py,sha256=NqdM0UJAi-iXJc7wa6CAJNG0-i4YNt08XGkHqV5ingc,4157
|
31
|
+
ramifice/fields/image_field.py,sha256=MfKILPPz2ye8x696eEu8loRRpIWgP4neVoZ7ucNkDIw,11545
|
32
|
+
ramifice/fields/integer_field.py,sha256=QpLqLItG4mVMYOhpGDVFNr-wDFqeUuERtfZy7C-EslE,4605
|
33
|
+
ramifice/fields/ip_field.py,sha256=q-2OgT4VBDo8yzrX7wwuSHwexwsM8wDwnHOyQRACItI,3386
|
34
|
+
ramifice/fields/password_field.py,sha256=EzIsegHdsVpnj9D-cTI1Q9RBbW07qUx7I7UFcMWW8Hk,3238
|
35
|
+
ramifice/fields/phone_field.py,sha256=-rjW8d00phqHi0YK_R8eZtwPHszyT9Aqxdb3M_KOxIY,3659
|
36
|
+
ramifice/fields/slug_field.py,sha256=V0kQ8bfqTv3Rxs17dmhGpe_LmgNS7LOGkvvK2fZJYfE,2729
|
37
|
+
ramifice/fields/text_field.py,sha256=JUMF8yx1eZ79k9mw28TxVCPcPqecXjqOpkDf25a5Tu4,4136
|
38
|
+
ramifice/fields/url_field.py,sha256=LsHNn38bDt_7kaggX53P-nE3C4pYIlp1NeOPcH06lTk,4037
|
39
|
+
ramifice/fields/general/__init__.py,sha256=JzgIDseNQLB_IDwY9-JSiT_bONxvhJmbKl5PhQzTnpE,40
|
40
|
+
ramifice/fields/general/choice_group.py,sha256=aNO8LnsafGOOQ7d2lAppI9YtzVHbWUZ6t1znEEIbAv8,962
|
41
|
+
ramifice/fields/general/date_group.py,sha256=C5VgR0CBEGgG7nIYEeI82hVXttngSJAGFvEdXC_OpGY,1213
|
42
|
+
ramifice/fields/general/field.py,sha256=qm7N-U5H1V6BK_6quJeGGpTmb9IqA-vxZlNHwoABye0,1384
|
43
|
+
ramifice/fields/general/file_group.py,sha256=T-IwFnlJAWaRcQKVn09IJCdFNGgnUfMkjLzWFFqn7gY,1117
|
44
|
+
ramifice/fields/general/number_group.py,sha256=LOPHbKAnIuqW4DEh2fH78w6qOQjp0OhkuP7MoikhlkA,761
|
45
|
+
ramifice/fields/general/text_group.py,sha256=m9EnlYGwqlck-JIYOCUd0hUYAVr8jH4YCnTmm9QlCkQ,1103
|
46
|
+
ramifice/models/__init__.py,sha256=h_QQ5rSJNZ-7kmx7wIFd8E8RmUS94b_x4jdwMbq8zm4,15
|
47
|
+
ramifice/models/decorator.py,sha256=vEblLbpQQ0BkdTI2ch-BtDvCqWSEXe2aaEjxND705_Q,5954
|
48
|
+
ramifice/models/model.py,sha256=JPEUYONRHVj7uE5vnuodc65dGHyBQCRmV8mdVUAgyXw,7118
|
49
|
+
ramifice/paladins/__init__.py,sha256=EJ6EEKXUcMG5P1bDmlEa4W3fsxSz5u6mzDG_oU1efMQ,618
|
50
|
+
ramifice/paladins/check.py,sha256=OeEDtL3lNR94bL1shrHloAHXHZtHnl6IWzEgukD9HSU,6580
|
51
|
+
ramifice/paladins/delete.py,sha256=hnLpyMoNbgegQ_GF-A7iEHj7cbk1oSc5xyTy1BNLxsE,3426
|
52
|
+
ramifice/paladins/password.py,sha256=pp0AVMf98w-2Ps3hHqwwIDSsXh93s-1TrBbeEI83Ly8,3041
|
53
|
+
ramifice/paladins/refrash.py,sha256=4xojazc5BqCkE8_st11gH5tj2LpflzWVn2ZD-uNoOsg,1096
|
54
|
+
ramifice/paladins/save.py,sha256=Z8vmqEksCK8XY27-BsgN2lyaNxLregOo5p0_XB9qUys,3895
|
55
|
+
ramifice/paladins/tools.py,sha256=zc2VXp1U_BCT4IQWopwhxJ5vqci9jX128U5_nMeHawY,2652
|
56
|
+
ramifice/paladins/validation.py,sha256=gcEJXIEPu1g7Z54vl14YTs5rCmxOEYsgQH1usFfyy7k,1730
|
57
|
+
ramifice/paladins/groups/__init__.py,sha256=GxJWM3IkYT3HW9pnJ1QTEjdOKJnjEoAaQ8SRukXnIW0,712
|
58
|
+
ramifice/paladins/groups/bool_group.py,sha256=rz1XIIdhOqbCOYZT1Yl84XaJg-0vwdcqCnt0BH-xHVA,808
|
59
|
+
ramifice/paladins/groups/choice_group.py,sha256=KmrjbuHLLl6yGbRkdoMflf1thh17GLWrcbfaqrHlDiE,1813
|
60
|
+
ramifice/paladins/groups/date_group.py,sha256=V3MCp8eA7txVLh6xmg76G9_y62TzWIQWqH59Ip26Xag,3779
|
61
|
+
ramifice/paladins/groups/file_group.py,sha256=ySS7L5zcm2XrZRQUUOU8kgzqrucZ95UYzXD6pALWqE4,2982
|
62
|
+
ramifice/paladins/groups/id_group.py,sha256=zN_Glu_cMGk8jMSDli3vYPvYrQXvQJNJFzb-t-qtZlQ,1290
|
63
|
+
ramifice/paladins/groups/img_group.py,sha256=YDJTvbRoqQ2nf7-2QbIQ72I4j_c98_d5LZNrD9kCy0Q,6040
|
64
|
+
ramifice/paladins/groups/num_group.py,sha256=sbxzTdl33TVySfaNfqMixyBkJ69v6AqEgraFUN3Kftk,2317
|
65
|
+
ramifice/paladins/groups/pass_group.py,sha256=uuIIqMBXsYG7vTHc_AhdgWuNCivxTgQMjkEu0-ElSmY,1887
|
66
|
+
ramifice/paladins/groups/slug_group.py,sha256=ztiA2v7e5lQYRZtlLw8WGOhSWaYQfOdZ6wkKbx3ZbTM,2329
|
67
|
+
ramifice/paladins/groups/text_group.py,sha256=FSrZbm3Fd0SU0IIFFBxs9XN2HPSFHshgwIRiLaUDwNY,4456
|
68
|
+
ramifice/utils/__init__.py,sha256=xixHoOX4ja5jIUZemem1qn4k4aonv3G3Q76azQK_pkU,43
|
69
|
+
ramifice/utils/errors.py,sha256=iuhq7fzpUmsOyeXeg2fJjta8yAuqlXLKsZVMpfUhtHE,1901
|
70
|
+
ramifice/utils/fixtures.py,sha256=IG55gdFUbrWRQ2cL3Df9mYBgjVlFrlRuWB7UeK1Nzd8,3173
|
71
|
+
ramifice/utils/globals.py,sha256=uR20um3Qg_1SG1t7WyWbpq8kQD-9Mslyr_c1yh5Hw9w,1751
|
72
|
+
ramifice/utils/migration.py,sha256=JUhYaJ61IS1W_Khof0sbqeHDQrI7-XcmTQ41PhCdjcQ,11017
|
73
|
+
ramifice/utils/tools.py,sha256=1yFIOrkWToM55OpMMId9T26hZqPQWnxLU3_jQ4Ejazg,2743
|
74
|
+
ramifice/utils/translations.py,sha256=aEkNKilD7RlJjBixqhh0cfIMw9lg13woaIwd3dyR8G4,4247
|
75
|
+
ramifice/utils/unit.py,sha256=PPNKWYFJ8cz0nwbBPaTdL58_Nr7N0fIHFJBpKG2ZLKI,2482
|
76
|
+
ramifice/utils/mixins/__init__.py,sha256=GrxJDsw73bEkitIh0-0BCxNnUK-N5uRXMCRlaPoaz1o,265
|
77
|
+
ramifice/utils/mixins/add_valid.py,sha256=TLOObedzXNA9eCylfAVbVCqIKE5sV-P5AdIN7avj-GA,407
|
78
|
+
ramifice/utils/mixins/hooks.py,sha256=33jvJRhfnJeL2Hd_YFXk3M_7wjqHaByU2wRjKyboL6s,914
|
79
|
+
ramifice/utils/mixins/indexing.py,sha256=Z0427HoaVRyNmSNN8Fx0mSICgAKV-gDdu3iR5qYUEbs,329
|
80
|
+
ramifice/utils/mixins/json_converter.py,sha256=WhigXyDAV-FfILaZuwvRFRIk0D90Rv3dG5t-mv5fVyc,1107
|
81
|
+
ramifice-0.6.0.dist-info/METADATA,sha256=mGAJxiS68kKIy6ZO94iagVCIAXPPVM2hoxSZnwHGKyk,20987
|
82
|
+
ramifice-0.6.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
83
|
+
ramifice-0.6.0.dist-info/licenses/LICENSE,sha256=LrEL0aTZx90HDwFUQCJutORiDjJL9AnuVvCtspXIqt4,1095
|
84
|
+
ramifice-0.6.0.dist-info/RECORD,,
|