ul-api-utils 7.7.10__tar.gz → 7.8.0__tar.gz
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 ul-api-utils might be problematic. Click here for more details.
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/PKG-INFO +1 -1
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/setup.py +1 -1
- ul-api-utils-7.8.0/ul_api_utils/resources/web_forms/custom_fields/custom_checkbox_select.py +5 -0
- ul-api-utils-7.8.0/ul_api_utils/resources/web_forms/custom_widgets/custom_select_widget.py +86 -0
- ul-api-utils-7.8.0/ul_api_utils/resources/web_forms/custom_widgets/custom_text_input_widget.py +42 -0
- ul-api-utils-7.8.0/ul_api_utils/resources/web_forms/uni_form.py +75 -0
- ul-api-utils-7.8.0/ul_api_utils/utils/jinja/__init__.py +0 -0
- ul-api-utils-7.8.0/ul_api_utils/validators/__init__.py +0 -0
- ul-api-utils-7.8.0/ul_api_utils/validators/__tests__/__init__.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils.egg-info/PKG-INFO +1 -1
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils.egg-info/SOURCES.txt +7 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/LICENSE +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/README.md +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/example/__init__.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/example/conf.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/example/main.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/example/models/__init__.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/example/permissions.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/example/pure_flask_example.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/example/rate_limit_load.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/example/routes/__init__.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/example/routes/api_some.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/example/workers/__init__.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/example/workers/worker.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/setup.cfg +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/__init__.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/access/__init__.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/api_resource/__init__.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/api_resource/api_request.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/api_resource/api_resource.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/api_resource/api_resource_config.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/api_resource/api_resource_fn_typing.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/api_resource/api_resource_type.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/api_resource/api_response.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/api_resource/api_response_db.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/api_resource/api_response_payload_alias.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/api_resource/db_types.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/api_resource/signature_check.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/commands/__init__.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/commands/cmd_enc_keys.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/commands/cmd_gen_api_user_token.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/commands/cmd_gen_new_api_user.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/commands/cmd_generate_api_docs.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/commands/cmd_start.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/commands/cmd_worker_start.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/commands/start/__init__.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/commands/start/gunicorn.conf.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/commands/start/wsgi.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/conf/ul-debugger-main.js +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/conf/ul-debugger-ui.js +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/conf.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/const.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/debug/__init__.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/debug/debugger.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/debug/malloc.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/debug/stat.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/encrypt/__init__.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/encrypt/encrypt_decrypt_abstract.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/encrypt/encrypt_decrypt_aes_xtea.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/errors.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/internal_api/__init__.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/internal_api/__tests__/__init__.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/internal_api/__tests__/internal_api.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/internal_api/__tests__/internal_api_content_type.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/internal_api/internal_api.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/internal_api/internal_api_check_context.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/internal_api/internal_api_error.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/internal_api/internal_api_response.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/main.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/modules/__init__.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/modules/__tests__/__init__.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/modules/__tests__/test_api_sdk_jwt.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/modules/api_sdk.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/modules/api_sdk_config.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/modules/api_sdk_jwt.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/modules/intermediate_state.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/modules/worker_context.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/modules/worker_sdk.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/modules/worker_sdk_config.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/py.typed +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/resources/__init__.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/resources/caching.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/resources/debugger_scripts.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/resources/health_check/__init__.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/resources/health_check/const.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/resources/health_check/health_check.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/resources/health_check/health_check_template.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/resources/health_check/resource.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/resources/not_implemented.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/resources/permissions.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/resources/rate_limitter.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/resources/swagger.py +0 -0
- {ul-api-utils-7.7.10/ul_api_utils/utils → ul-api-utils-7.8.0/ul_api_utils/resources/web_forms}/__init__.py +0 -0
- {ul-api-utils-7.7.10/ul_api_utils/utils/__tests__ → ul-api-utils-7.8.0/ul_api_utils/resources/web_forms/custom_fields}/__init__.py +0 -0
- {ul-api-utils-7.7.10/ul_api_utils/utils/flask_swagger_generator → ul-api-utils-7.8.0/ul_api_utils/resources/web_forms/custom_widgets}/__init__.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/sentry.py +0 -0
- {ul-api-utils-7.7.10/ul_api_utils/utils/flask_swagger_generator/specifiers → ul-api-utils-7.8.0/ul_api_utils/utils}/__init__.py +0 -0
- {ul-api-utils-7.7.10/ul_api_utils/utils/flask_swagger_generator/utils → ul-api-utils-7.8.0/ul_api_utils/utils/__tests__}/__init__.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/utils/__tests__/api_path_version.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/utils/__tests__/unwrap_typing.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/utils/api_encoding.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/utils/api_format.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/utils/api_method.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/utils/api_pagination.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/utils/api_path_version.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/utils/api_request_info.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/utils/avro.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/utils/broker_topics_message_count.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/utils/cached_per_request.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/utils/colors.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/utils/constants.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/utils/decode_base64.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/utils/deprecated.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/utils/flags.py +0 -0
- {ul-api-utils-7.7.10/ul_api_utils/utils/jinja → ul-api-utils-7.8.0/ul_api_utils/utils/flask_swagger_generator}/__init__.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/utils/flask_swagger_generator/conf.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/utils/flask_swagger_generator/exceptions.py +0 -0
- {ul-api-utils-7.7.10/ul_api_utils/validators → ul-api-utils-7.8.0/ul_api_utils/utils/flask_swagger_generator/specifiers}/__init__.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/utils/flask_swagger_generator/specifiers/swagger_models.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/utils/flask_swagger_generator/specifiers/swagger_specifier.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/utils/flask_swagger_generator/specifiers/swagger_three_specifier.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/utils/flask_swagger_generator/specifiers/swagger_version.py +0 -0
- {ul-api-utils-7.7.10/ul_api_utils/validators/__tests__ → ul-api-utils-7.8.0/ul_api_utils/utils/flask_swagger_generator/utils}/__init__.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/utils/flask_swagger_generator/utils/input_type.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/utils/flask_swagger_generator/utils/parameter_type.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/utils/flask_swagger_generator/utils/replace_in_dict.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/utils/flask_swagger_generator/utils/request_type.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/utils/flask_swagger_generator/utils/schema_type.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/utils/flask_swagger_generator/utils/security_type.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/utils/imports.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/utils/jinja/t_url_for.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/utils/jinja/to_pretty_json.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/utils/json_encoder.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/utils/load_modules.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/utils/token_check.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/utils/token_check_through_request.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/utils/unwrap_typing.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/utils/uuid_converter.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/validators/__tests__/test_custom_fields.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/validators/custom_fields.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/validators/validate_empty_object.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/validators/validate_uuid.py +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils.egg-info/dependency_links.txt +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils.egg-info/entry_points.txt +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils.egg-info/requires.txt +0 -0
- {ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils.egg-info/top_level.txt +0 -0
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
from typing import Any
|
|
2
|
+
|
|
3
|
+
from markupsafe import Markup
|
|
4
|
+
from wtforms import SelectField # type: ignore
|
|
5
|
+
from wtforms.widgets.core import html_params, Select # type: ignore
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class CustomLiveSearchPlaceholderSelect(Select):
|
|
9
|
+
"""
|
|
10
|
+
Renders a CUSTOM select field.
|
|
11
|
+
|
|
12
|
+
If `multiple` is True, then the `size` property should be specified on
|
|
13
|
+
rendering to make the field useful.
|
|
14
|
+
|
|
15
|
+
The field must provide an `iter_choices()` method which the widget will
|
|
16
|
+
call on rendering; this method must yield tuples of
|
|
17
|
+
`(value, label, selected)`.
|
|
18
|
+
It also must provide a `has_groups()` method which tells whether choices
|
|
19
|
+
are divided into groups, and if they do, the field must have an
|
|
20
|
+
`iter_groups()` method that yields tuples of `(label, choices)`, where
|
|
21
|
+
`choices` is an iterable of `(value, label, selected)` tuples.
|
|
22
|
+
Otherwise, `selected` is False for any option field in select item group.
|
|
23
|
+
"""
|
|
24
|
+
def __call__(self, field: SelectField, **kwargs: Any) -> Markup:
|
|
25
|
+
kwargs.setdefault("id", field.id)
|
|
26
|
+
if self.multiple:
|
|
27
|
+
kwargs["multiple"] = True
|
|
28
|
+
flags = getattr(field, "flags", {})
|
|
29
|
+
for k in dir(flags):
|
|
30
|
+
if k in self.validation_attrs and k not in kwargs:
|
|
31
|
+
kwargs[k] = getattr(flags, k)
|
|
32
|
+
|
|
33
|
+
html = ["<select data-live-search='true' data-show-subtext='true' %s>" % html_params(name=field.name, **kwargs),
|
|
34
|
+
"<option value='' disabled selected>Select something...</option>"]
|
|
35
|
+
|
|
36
|
+
if field.has_groups():
|
|
37
|
+
for group, choices in field.iter_groups():
|
|
38
|
+
html.append("<optgroup %s>" % html_params(label=group))
|
|
39
|
+
for val, label, selected in choices:
|
|
40
|
+
html.append(self.render_option(val, label, selected))
|
|
41
|
+
html.append("</optgroup>")
|
|
42
|
+
else:
|
|
43
|
+
for val, label, _ in field.iter_choices():
|
|
44
|
+
html.append(self.render_option(val, label, False))
|
|
45
|
+
html.append("</select>")
|
|
46
|
+
return Markup("".join(html))
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
class CustomLiveSearchSelect(Select):
|
|
50
|
+
"""
|
|
51
|
+
Renders a CUSTOM select field.
|
|
52
|
+
|
|
53
|
+
If `multiple` is True, then the `size` property should be specified on
|
|
54
|
+
rendering to make the field useful.
|
|
55
|
+
|
|
56
|
+
The field must provide an `iter_choices()` method which the widget will
|
|
57
|
+
call on rendering; this method must yield tuples of
|
|
58
|
+
`(value, label, selected)`.
|
|
59
|
+
It also must provide a `has_groups()` method which tells whether choices
|
|
60
|
+
are divided into groups, and if they do, the field must have an
|
|
61
|
+
`iter_groups()` method that yields tuples of `(label, choices)`, where
|
|
62
|
+
`choices` is an iterable of `(value, label, selected)` tuples.
|
|
63
|
+
Otherwise, `selected` is False for any option field in select item group.
|
|
64
|
+
"""
|
|
65
|
+
def __call__(self, field: SelectField, **kwargs: Any) -> Markup:
|
|
66
|
+
kwargs.setdefault("id", field.id)
|
|
67
|
+
if self.multiple:
|
|
68
|
+
kwargs["multiple"] = True
|
|
69
|
+
flags = getattr(field, "flags", {})
|
|
70
|
+
for k in dir(flags):
|
|
71
|
+
if k in self.validation_attrs and k not in kwargs:
|
|
72
|
+
kwargs[k] = getattr(flags, k)
|
|
73
|
+
|
|
74
|
+
html = ["<select data-live-search='true' data-show-subtext='true' %s>" % html_params(name=field.name, **kwargs)]
|
|
75
|
+
|
|
76
|
+
if field.has_groups():
|
|
77
|
+
for group, choices in field.iter_groups():
|
|
78
|
+
html.append("<optgroup %s>" % html_params(label=group))
|
|
79
|
+
for val, label, selected in choices:
|
|
80
|
+
html.append(self.render_option(val, label, selected))
|
|
81
|
+
html.append("</optgroup>")
|
|
82
|
+
else:
|
|
83
|
+
for val, label, selected in field.iter_choices():
|
|
84
|
+
html.append(self.render_option(val, label, selected))
|
|
85
|
+
html.append("</select>")
|
|
86
|
+
return Markup("".join(html))
|
ul-api-utils-7.8.0/ul_api_utils/resources/web_forms/custom_widgets/custom_text_input_widget.py
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
from typing import Optional, Any
|
|
2
|
+
|
|
3
|
+
from wtforms import StringField # type: ignore
|
|
4
|
+
from wtforms.widgets import TextInput # type: ignore
|
|
5
|
+
from markupsafe import Markup
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class CustomTextInput(TextInput):
|
|
9
|
+
"""
|
|
10
|
+
Render a single-line text input with optional input attributes ("required", "maxlength", "minlength", "pattern").
|
|
11
|
+
|
|
12
|
+
examples: TextInputCustom(required=True, min_length=5, max_length=255, pattern=r"^(d+(,d+)*)?$")
|
|
13
|
+
TextInputCustom(max_length=255, pattern=r"^(d+(,d+)*)?$")
|
|
14
|
+
TextInputCustom(required=True, pattern=r"^(d+(,d+)*)?$")
|
|
15
|
+
TextInputCustom(max_length=255)
|
|
16
|
+
In model usage: ... info={"label": "LABEL:", "widget": TextInputCustom(pattern=r"^(d+(,d+)*)?$")}
|
|
17
|
+
"""
|
|
18
|
+
validation_attrs = ["required", "maxlength", "minlength", "pattern"]
|
|
19
|
+
|
|
20
|
+
def __init__(self, required: Optional[bool] = None, max_length: Optional[int] = None, min_length: Optional[int] = None, pattern: Optional[str] = None):
|
|
21
|
+
super().__init__()
|
|
22
|
+
self.required = required
|
|
23
|
+
self.max_length = max_length
|
|
24
|
+
self.min_length = min_length
|
|
25
|
+
self.pattern = pattern
|
|
26
|
+
|
|
27
|
+
def __call__(self, field: StringField, **kwargs: Any) -> Markup:
|
|
28
|
+
kwargs.setdefault("id", field.id)
|
|
29
|
+
kwargs.setdefault("type", self.input_type)
|
|
30
|
+
if self.min_length:
|
|
31
|
+
kwargs.setdefault("minlength", self.min_length)
|
|
32
|
+
if self.max_length:
|
|
33
|
+
kwargs.setdefault("maxlength", self.max_length)
|
|
34
|
+
if self.pattern:
|
|
35
|
+
kwargs.setdefault("pattern", self.pattern)
|
|
36
|
+
if "value" not in kwargs:
|
|
37
|
+
kwargs["value"] = field._value()
|
|
38
|
+
flags = getattr(field, "flags", {})
|
|
39
|
+
for k in dir(flags):
|
|
40
|
+
if k in self.validation_attrs and k not in kwargs:
|
|
41
|
+
kwargs[k] = getattr(flags, k)
|
|
42
|
+
return Markup("<input %s>" % self.html_params(name=field.name, **kwargs))
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
from typing import Type, Any, Dict, Optional, Tuple
|
|
2
|
+
|
|
3
|
+
from ul_db_utils.modules.db import db
|
|
4
|
+
from sqlalchemy.dialects import postgresql
|
|
5
|
+
from sqlalchemy.dialects.postgresql import ARRAY
|
|
6
|
+
from wtforms_alchemy import ModelForm, ClassMap, FormGenerator # type: ignore
|
|
7
|
+
from wtforms.fields import SelectField # type: ignore
|
|
8
|
+
|
|
9
|
+
from ul_db_utils.model.base_model import BaseModel
|
|
10
|
+
|
|
11
|
+
from ul_api_utils.resources.web_forms.custom_fields.custom_checkbox_select import MultiCheckboxField
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def form_factory(model_obj: Type[BaseModel], edition: bool = False, *, extra_fields: Optional[Dict[str, Any]] = None) -> Type[ModelForm]:
|
|
15
|
+
"""
|
|
16
|
+
Returns generated model form.
|
|
17
|
+
|
|
18
|
+
Parameters:
|
|
19
|
+
model_obj (type_of(BaseModel)): model object which will use for form generation
|
|
20
|
+
edition (bool): flag to indicate creation or edition form will be generated
|
|
21
|
+
extra_fields (optional(dict(str, any))): additional fields for generated form
|
|
22
|
+
|
|
23
|
+
Returns:
|
|
24
|
+
Form (type_of(ModelForm)): web model form
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
class ExtraFieldsFormGenerator(FormGenerator):
|
|
28
|
+
def create_fields(self, form: Any, properties: Dict[str, Any]) -> None:
|
|
29
|
+
"""
|
|
30
|
+
Creates fields for given form based on given model attributes.
|
|
31
|
+
|
|
32
|
+
:param form: form to attach the generated fields into
|
|
33
|
+
:param properties: model attributes to generate the form fields from
|
|
34
|
+
"""
|
|
35
|
+
super(ExtraFieldsFormGenerator, self).create_fields(form, properties)
|
|
36
|
+
|
|
37
|
+
if extra_fields:
|
|
38
|
+
for field_name, field in extra_fields.items():
|
|
39
|
+
setattr(form, field_name, field)
|
|
40
|
+
|
|
41
|
+
class Form(ModelForm):
|
|
42
|
+
"""
|
|
43
|
+
A class for representing a web form.
|
|
44
|
+
|
|
45
|
+
...
|
|
46
|
+
|
|
47
|
+
Attributes
|
|
48
|
+
----------
|
|
49
|
+
property_columns : dict(str, any)
|
|
50
|
+
Model property columns such as ID, USER_CREATED etc.
|
|
51
|
+
|
|
52
|
+
Methods
|
|
53
|
+
-------
|
|
54
|
+
|
|
55
|
+
"""
|
|
56
|
+
|
|
57
|
+
property_columns: Dict[str, Any] = {}
|
|
58
|
+
|
|
59
|
+
def __init__(self, *args: Tuple[Any], **kwargs: Dict[str, Any]) -> None:
|
|
60
|
+
super(Form, self).__init__(*args, **kwargs)
|
|
61
|
+
self.property_columns = model_obj.get_property_columns(self._obj) if self._obj else {}
|
|
62
|
+
|
|
63
|
+
class Meta:
|
|
64
|
+
model = model_obj
|
|
65
|
+
type_map = ClassMap({postgresql.UUID: SelectField, ARRAY: MultiCheckboxField})
|
|
66
|
+
only = model_obj.get_edit_columns() if edition else model_obj.get_create_columns()
|
|
67
|
+
form_generator = ExtraFieldsFormGenerator
|
|
68
|
+
|
|
69
|
+
@classmethod
|
|
70
|
+
def get_session(cls) -> Any:
|
|
71
|
+
return db.session
|
|
72
|
+
|
|
73
|
+
Form.__name__ = f"{model_obj.__name__}Form"
|
|
74
|
+
|
|
75
|
+
return Form
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -86,6 +86,13 @@ ul_api_utils/resources/health_check/const.py
|
|
|
86
86
|
ul_api_utils/resources/health_check/health_check.py
|
|
87
87
|
ul_api_utils/resources/health_check/health_check_template.py
|
|
88
88
|
ul_api_utils/resources/health_check/resource.py
|
|
89
|
+
ul_api_utils/resources/web_forms/__init__.py
|
|
90
|
+
ul_api_utils/resources/web_forms/uni_form.py
|
|
91
|
+
ul_api_utils/resources/web_forms/custom_fields/__init__.py
|
|
92
|
+
ul_api_utils/resources/web_forms/custom_fields/custom_checkbox_select.py
|
|
93
|
+
ul_api_utils/resources/web_forms/custom_widgets/__init__.py
|
|
94
|
+
ul_api_utils/resources/web_forms/custom_widgets/custom_select_widget.py
|
|
95
|
+
ul_api_utils/resources/web_forms/custom_widgets/custom_text_input_widget.py
|
|
89
96
|
ul_api_utils/utils/__init__.py
|
|
90
97
|
ul_api_utils/utils/api_encoding.py
|
|
91
98
|
ul_api_utils/utils/api_format.py
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/api_resource/api_resource_fn_typing.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/api_resource/api_response_payload_alias.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/internal_api/__tests__/internal_api.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/internal_api/internal_api_check_context.py
RENAMED
|
File without changes
|
|
File without changes
|
{ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/internal_api/internal_api_response.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/modules/__tests__/test_api_sdk_jwt.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/resources/health_check/health_check.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/utils/broker_topics_message_count.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/utils/flask_swagger_generator/conf.py
RENAMED
|
File without changes
|
{ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/utils/flask_swagger_generator/exceptions.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/utils/token_check_through_request.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ul-api-utils-7.7.10 → ul-api-utils-7.8.0}/ul_api_utils/validators/__tests__/test_custom_fields.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|