clear-skies 1.18.3__tar.gz → 1.18.5__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 clear-skies might be problematic. Click here for more details.
- {clear_skies-1.18.3 → clear_skies-1.18.5}/PKG-INFO +1 -1
- {clear_skies-1.18.3 → clear_skies-1.18.5}/pyproject.toml +1 -1
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/authentication/__init__.py +4 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/authentication/auth0_jwks.py +0 -1
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/column_types/column.py +6 -0
- clear_skies-1.18.5/src/clearskies/column_types/datetime.py +92 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/columns.py +16 -11
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/handlers/create.py +1 -1
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/handlers/input_processing.py +4 -2
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/handlers/update.py +1 -1
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/model.py +16 -5
- clear_skies-1.18.3/src/clearskies/column_types/datetime.py +0 -51
- {clear_skies-1.18.3 → clear_skies-1.18.5}/LICENSE +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/README.md +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/__init__.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/application.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/authentication/auth_exception.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/authentication/authorization.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/authentication/jwks.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/authentication/public.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/authentication/secret_bearer.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/autodoc/__init__.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/autodoc/formats/__init__.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/autodoc/formats/oai3_json/__init__.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/autodoc/formats/oai3_json/oai3_json.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/autodoc/formats/oai3_json/oai3_schema_resolver.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/autodoc/formats/oai3_json/parameter.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/autodoc/formats/oai3_json/request.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/autodoc/formats/oai3_json/response.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/autodoc/formats/oai3_json/schema/__init__.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/autodoc/formats/oai3_json/schema/array.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/autodoc/formats/oai3_json/schema/default.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/autodoc/formats/oai3_json/schema/enum.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/autodoc/formats/oai3_json/schema/object.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/autodoc/formats/oai3_json/test.json +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/autodoc/request/__init__.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/autodoc/request/header.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/autodoc/request/json_body.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/autodoc/request/request.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/autodoc/request/url_parameter.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/autodoc/request/url_path.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/autodoc/response/__init__.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/autodoc/response/response.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/autodoc/schema/__init__.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/autodoc/schema/array.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/autodoc/schema/base64.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/autodoc/schema/boolean.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/autodoc/schema/date.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/autodoc/schema/datetime.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/autodoc/schema/double.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/autodoc/schema/enum.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/autodoc/schema/integer.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/autodoc/schema/long.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/autodoc/schema/number.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/autodoc/schema/object.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/autodoc/schema/password.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/autodoc/schema/string.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/backends/__init__.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/backends/api_backend.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/backends/backend.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/backends/cursor_backend.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/backends/example_backend.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/backends/file_backend.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/backends/json_backend.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/backends/memory_backend.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/backends/restful_api_advanced_search_backend.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/backends/secrets_backend.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/binding_config.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/column_types/__init__.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/column_types/audit.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/column_types/belongs_to.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/column_types/boolean.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/column_types/category_tree.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/column_types/created.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/column_types/created_by_authorization_data.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/column_types/created_by_ip.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/column_types/created_by_user_agent.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/column_types/email.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/column_types/float.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/column_types/has_many.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/column_types/integer.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/column_types/json.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/column_types/many_to_many.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/column_types/many_to_many_with_data.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/column_types/select.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/column_types/string.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/column_types/updated.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/column_types/uuid.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/condition_parser.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/contexts/__init__.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/contexts/bash.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/contexts/build_context.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/contexts/cli.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/contexts/context.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/contexts/convert_to_application.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/contexts/extract_handler.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/contexts/test.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/contexts/wsgi.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/decorators/__init__.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/decorators/auth0_jwks.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/decorators/authorization.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/decorators/binding_classes.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/decorators/binding_modules.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/decorators/bindings.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/decorators/create.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/decorators/delete.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/decorators/docs.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/decorators/get.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/decorators/jwks.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/decorators/merge.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/decorators/patch.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/decorators/post.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/decorators/public.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/decorators/response_headers.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/decorators/return_raw_response.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/decorators/schema.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/decorators/secret_bearer.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/decorators/security_headers.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/di/__init__.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/di/additional_config.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/di/di.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/di/standard_dependencies.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/di/test_module/__init__.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/di/test_module/another_module/__init__.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/di/test_module/module_class.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/environment.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/functional/__init__.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/functional/string.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/functional/validations.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/handlers/__init__.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/handlers/advanced_search.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/handlers/base.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/handlers/callable.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/handlers/crud_by_method.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/handlers/database_connector.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/handlers/delete.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/handlers/exceptions/__init__.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/handlers/exceptions/authentication.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/handlers/exceptions/authorization.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/handlers/exceptions/client_error.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/handlers/exceptions/input_error.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/handlers/exceptions/not_found.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/handlers/get.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/handlers/health_check.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/handlers/list.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/handlers/mygrations.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/handlers/request_method_routing.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/handlers/restful_api.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/handlers/routing.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/handlers/schema_helper.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/handlers/simple_routing.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/handlers/simple_routing_route.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/handlers/simple_search.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/handlers/write.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/input_outputs/__init__.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/input_outputs/cli.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/input_outputs/exceptions/__init__.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/input_outputs/exceptions/cli_input_error.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/input_outputs/exceptions/cli_not_found.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/input_outputs/input_output.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/input_outputs/wsgi.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/input_requirements/__init__.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/input_requirements/maximum_length.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/input_requirements/minimum_length.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/input_requirements/required.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/input_requirements/requirement.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/input_requirements/unique.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/mocks/__init__.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/mocks/input_output.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/mocks/models.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/models.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/secrets/__init__.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/secrets/additional_configs/__init__.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/secrets/additional_configs/mysql_connection_dynamic_producer.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/secrets/additional_configs/mysql_connection_dynamic_producer_via_ssh_cert_bastion.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/secrets/akeyless.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/secrets/exceptions/__init__.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/secrets/exceptions/not_found.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/secrets/secrets.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/security_headers/__init__.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/security_headers/base.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/security_headers/cache_control.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/security_headers/cors.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/security_headers/csp.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/security_headers/hsts.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/security_headers/x_content_type_options.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/security_headers/x_frame_options.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/tests/__init__.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/tests/simple_api/__init__.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/tests/simple_api/models/__init__.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/tests/simple_api/models/status.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/tests/simple_api/models/user.py +0 -0
- {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/tests/simple_api/users_api.py +0 -0
|
@@ -214,6 +214,12 @@ class Column(ABC):
|
|
|
214
214
|
if on_change_actions and model.was_changed(self.name):
|
|
215
215
|
self.execute_actions(on_change_actions, model)
|
|
216
216
|
|
|
217
|
+
def values_match(self, value_1, value_2):
|
|
218
|
+
"""
|
|
219
|
+
Compares two values to see if they are the same
|
|
220
|
+
"""
|
|
221
|
+
return value_1 == value_2
|
|
222
|
+
|
|
217
223
|
def pre_delete(self, model):
|
|
218
224
|
"""
|
|
219
225
|
Make any changes needed to the data before starting the delete process
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
from .column import Column
|
|
2
|
+
from datetime import datetime, timezone
|
|
3
|
+
import dateparser
|
|
4
|
+
from ..autodoc.schema import DateTime as AutoDocDateTime
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class DateTime(Column):
|
|
8
|
+
_auto_doc_class = AutoDocDateTime
|
|
9
|
+
|
|
10
|
+
def __init__(self, di):
|
|
11
|
+
super().__init__(di)
|
|
12
|
+
|
|
13
|
+
def from_backend(self, value):
|
|
14
|
+
if not value or value == "0000-00-00 00:00:00":
|
|
15
|
+
date = None
|
|
16
|
+
elif type(value) == str:
|
|
17
|
+
date = dateparser.parse(value)
|
|
18
|
+
else:
|
|
19
|
+
date = value
|
|
20
|
+
return date.replace(tzinfo=timezone.utc) if date else None
|
|
21
|
+
|
|
22
|
+
def to_backend(self, data):
|
|
23
|
+
if not self.name in data or type(data[self.name]) == str or data[self.name] == None:
|
|
24
|
+
return data
|
|
25
|
+
|
|
26
|
+
# hopefully this is a Python datetime object in UTC timezone...
|
|
27
|
+
return {**data, **{self.name: data[self.name].strftime("%Y-%m-%d %H:%M:%S")}}
|
|
28
|
+
|
|
29
|
+
def to_json(self, model):
|
|
30
|
+
datetime = model.get(self.name, silent=True)
|
|
31
|
+
return {self.name: datetime.isoformat() if datetime else None}
|
|
32
|
+
|
|
33
|
+
def build_condition(self, value, operator=None, column_prefix=""):
|
|
34
|
+
date = dateparser.parse(value).astimezone(timezone.utc).strftime("%Y-%m-%d %H:%M:%S")
|
|
35
|
+
if not operator:
|
|
36
|
+
operator = "="
|
|
37
|
+
return f"{column_prefix}{self.name}{operator}{date}"
|
|
38
|
+
|
|
39
|
+
def is_allowed_operator(self, operator, relationship_reference=None):
|
|
40
|
+
"""
|
|
41
|
+
This is called when processing user data to decide if the end-user is specifying an allowed operator
|
|
42
|
+
"""
|
|
43
|
+
return operator in ["=", "<", ">", "<=", ">="]
|
|
44
|
+
|
|
45
|
+
def input_error_for_value(self, value, operator=None):
|
|
46
|
+
value = dateparser.parse(value)
|
|
47
|
+
if not value:
|
|
48
|
+
return "given value did not appear to be a valid date"
|
|
49
|
+
if not value.tzinfo:
|
|
50
|
+
return "date is missing timezone information"
|
|
51
|
+
return ""
|
|
52
|
+
|
|
53
|
+
def values_match(self, value_1, value_2):
|
|
54
|
+
"""
|
|
55
|
+
Compares two values to see if they are the same
|
|
56
|
+
"""
|
|
57
|
+
# in this function we deal with data directly out of the backend, so our date is likely
|
|
58
|
+
# to be string-ified and we want to look for default (e.g. null) values in string form.
|
|
59
|
+
if type(value_1) == str and "0000-00-00" in value_1:
|
|
60
|
+
value_1 = None
|
|
61
|
+
if type(value_2) == str and "0000-00-00" in value_2:
|
|
62
|
+
value_2 = None
|
|
63
|
+
number_values = 0
|
|
64
|
+
if value_1:
|
|
65
|
+
number_values += 1
|
|
66
|
+
if value_2:
|
|
67
|
+
number_values += 1
|
|
68
|
+
if number_values == 0:
|
|
69
|
+
return True
|
|
70
|
+
if number_values == 1:
|
|
71
|
+
return False
|
|
72
|
+
|
|
73
|
+
if type(value_1) == str:
|
|
74
|
+
value_1 = dateparser.parse(value_1)
|
|
75
|
+
if type(value_2) == str:
|
|
76
|
+
value_2 = dateparser.parse(value_2)
|
|
77
|
+
|
|
78
|
+
# we need to make sure we're comparing in the same timezones. For our purposes, a difference in timezone
|
|
79
|
+
# is fine as long as they represent the same time (e.g. 16:00EST == 20:00UTC). For python, same time in different
|
|
80
|
+
# timezones is treated as different datetime objects.
|
|
81
|
+
if value_1.tzinfo is not None and value_2.tzinfo is not None:
|
|
82
|
+
value_1 = value_1.astimezone(value_2.tzinfo)
|
|
83
|
+
|
|
84
|
+
# two times can be the same but if one is datetime-aware and one is not, python will treat them as not equal.
|
|
85
|
+
# we want to treat such times as being the same. Therefore, check for equality but ignore the timezone.
|
|
86
|
+
for to_check in ["year", "month", "day", "hour", "minute", "second", "microsecond"]:
|
|
87
|
+
if getattr(value_1, to_check) != getattr(value_2, to_check):
|
|
88
|
+
return False
|
|
89
|
+
|
|
90
|
+
# and since we already converted the timezones to match (or one has a timezone and one doesn't), we're good to go.
|
|
91
|
+
# if we passed the above loop then the times are the same.
|
|
92
|
+
return True
|
|
@@ -17,18 +17,23 @@ class Columns:
|
|
|
17
17
|
if name in columns:
|
|
18
18
|
raise ValueError(f"Duplicate column '{name}' found for model '{model_class.__name__}'")
|
|
19
19
|
column_overrides = overrides[name] if (overrides is not None and name in overrides) else {}
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
20
|
+
# if the overrides changes the class then we need to completely replace the column definition
|
|
21
|
+
# with what is in the overrides.
|
|
22
|
+
if "class" in column_overrides and id(column_overrides["class"]) != id(configuration["class"]):
|
|
23
|
+
configuration = column_overrides
|
|
24
|
+
else:
|
|
25
|
+
configuration = {
|
|
26
|
+
**configuration,
|
|
27
|
+
**column_overrides,
|
|
28
|
+
"input_requirements": self._resolve_input_requirements(
|
|
29
|
+
self._merge_input_requirements(
|
|
30
|
+
configuration.get("input_requirements"),
|
|
31
|
+
column_overrides.get("input_requirements"),
|
|
32
|
+
),
|
|
33
|
+
name,
|
|
34
|
+
model_class.__name__,
|
|
27
35
|
),
|
|
28
|
-
|
|
29
|
-
model_class.__name__,
|
|
30
|
-
),
|
|
31
|
-
}
|
|
36
|
+
}
|
|
32
37
|
columns[name] = self.build_column(name, configuration, model_class)
|
|
33
38
|
|
|
34
39
|
# overrides can add columns too - need to handle those separately
|
|
@@ -23,7 +23,7 @@ class Create(Write):
|
|
|
23
23
|
if input_errors:
|
|
24
24
|
self._logging.debug("Request rejected due to input errors: " + json.dumps(input_errors))
|
|
25
25
|
raise InputError(input_errors)
|
|
26
|
-
model.save(input_data)
|
|
26
|
+
model.save(input_data, columns=self._columns)
|
|
27
27
|
|
|
28
28
|
return self.success(input_output, self._model_as_json(model, input_output))
|
|
29
29
|
|
|
@@ -9,11 +9,13 @@ class InputProcessing:
|
|
|
9
9
|
def _get_writeable_columns(self):
|
|
10
10
|
if self._writeable_columns is None:
|
|
11
11
|
self._writeable_columns = self._get_rw_columns("writeable")
|
|
12
|
+
additional_columns = OrderedDict()
|
|
12
13
|
for column in self._writeable_columns.values():
|
|
13
14
|
more_columns = column.additional_write_columns(is_create=self._is_create)
|
|
14
|
-
# do it one-at-a-time so we don't lose our OrderedDict
|
|
15
15
|
for additional_column_name, additional_column in more_columns.items():
|
|
16
|
-
|
|
16
|
+
additional_columns[additional_column_name] = additional_column
|
|
17
|
+
for additional_column_name, additional_column in additional_columns.items():
|
|
18
|
+
self._writeable_columns[additional_column_name] = additional_column
|
|
17
19
|
return self._writeable_columns
|
|
18
20
|
|
|
19
21
|
def _extra_column_errors(self, input_data):
|
|
@@ -10,6 +10,7 @@ class Model(Models):
|
|
|
10
10
|
_configured_columns = None
|
|
11
11
|
_data = None
|
|
12
12
|
_previous_data = None
|
|
13
|
+
_touched_columns = None
|
|
13
14
|
_transformed = None
|
|
14
15
|
id_column_name = "id"
|
|
15
16
|
|
|
@@ -18,6 +19,7 @@ class Model(Models):
|
|
|
18
19
|
self._transformed = {}
|
|
19
20
|
self._data = {}
|
|
20
21
|
self._previous_data = None
|
|
22
|
+
self._touched_columns = None
|
|
21
23
|
|
|
22
24
|
def model_class(self):
|
|
23
25
|
"""
|
|
@@ -120,7 +122,7 @@ class Model(Models):
|
|
|
120
122
|
def data(self, data):
|
|
121
123
|
self._data = {} if data is None else data
|
|
122
124
|
|
|
123
|
-
def save(self, data):
|
|
125
|
+
def save(self, data, columns=None):
|
|
124
126
|
"""
|
|
125
127
|
Save data to the database and update the model!
|
|
126
128
|
|
|
@@ -128,7 +130,8 @@ class Model(Models):
|
|
|
128
130
|
"""
|
|
129
131
|
if not len(data):
|
|
130
132
|
raise ValueError("You have to pass in something to save!")
|
|
131
|
-
columns
|
|
133
|
+
if columns is None:
|
|
134
|
+
columns = self.columns()
|
|
132
135
|
|
|
133
136
|
old_data = self.data
|
|
134
137
|
data = self.columns_pre_save(data, columns)
|
|
@@ -150,6 +153,7 @@ class Model(Models):
|
|
|
150
153
|
self.data = new_data
|
|
151
154
|
self._transformed = {}
|
|
152
155
|
self._previous_data = old_data
|
|
156
|
+
self._touched_columns = list(data.keys())
|
|
153
157
|
|
|
154
158
|
self.columns_save_finished(columns)
|
|
155
159
|
self.save_finished()
|
|
@@ -190,9 +194,11 @@ class Model(Models):
|
|
|
190
194
|
"""Returns True/False to denote if a column was changed in the last save"""
|
|
191
195
|
if self._previous_data is None:
|
|
192
196
|
raise ValueError("was_changed was called before a save was finished - you must save something first")
|
|
197
|
+
if key not in self._touched_columns:
|
|
198
|
+
return False
|
|
193
199
|
|
|
194
|
-
has_old_value =
|
|
195
|
-
has_new_value =
|
|
200
|
+
has_old_value = bool(self._previous_data.get(key))
|
|
201
|
+
has_new_value = bool(self._data.get(key))
|
|
196
202
|
|
|
197
203
|
if has_new_value != has_old_value:
|
|
198
204
|
return True
|
|
@@ -200,7 +206,12 @@ class Model(Models):
|
|
|
200
206
|
if not has_old_value:
|
|
201
207
|
return False
|
|
202
208
|
|
|
203
|
-
|
|
209
|
+
columns = self.columns()
|
|
210
|
+
new_value = self.__getattr__(key)
|
|
211
|
+
old_value = self._previous_data[key]
|
|
212
|
+
if key not in columns:
|
|
213
|
+
return old_value != new_value
|
|
214
|
+
return not columns[key].values_match(old_value, new_value)
|
|
204
215
|
|
|
205
216
|
def previous_value(self, key):
|
|
206
217
|
return self.get_transformed_from_data(key, self._previous_data, cache=False, check_providers=False, silent=True)
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
from .column import Column
|
|
2
|
-
from datetime import datetime, timezone
|
|
3
|
-
import dateparser
|
|
4
|
-
from ..autodoc.schema import DateTime as AutoDocDateTime
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
class DateTime(Column):
|
|
8
|
-
_auto_doc_class = AutoDocDateTime
|
|
9
|
-
|
|
10
|
-
def __init__(self, di):
|
|
11
|
-
super().__init__(di)
|
|
12
|
-
|
|
13
|
-
def from_backend(self, value):
|
|
14
|
-
if not value or value == "0000-00-00 00:00:00":
|
|
15
|
-
date = None
|
|
16
|
-
elif type(value) == str:
|
|
17
|
-
date = dateparser.parse(value)
|
|
18
|
-
else:
|
|
19
|
-
date = value
|
|
20
|
-
return date.replace(tzinfo=timezone.utc) if date else None
|
|
21
|
-
|
|
22
|
-
def to_backend(self, data):
|
|
23
|
-
if not self.name in data or type(data[self.name]) == str or data[self.name] == None:
|
|
24
|
-
return data
|
|
25
|
-
|
|
26
|
-
# hopefully this is a Python datetime object in UTC timezone...
|
|
27
|
-
return {**data, **{self.name: data[self.name].strftime("%Y-%m-%d %H:%M:%S")}}
|
|
28
|
-
|
|
29
|
-
def to_json(self, model):
|
|
30
|
-
datetime = model.get(self.name, silent=True)
|
|
31
|
-
return {self.name: datetime.isoformat() if datetime else None}
|
|
32
|
-
|
|
33
|
-
def build_condition(self, value, operator=None, column_prefix=""):
|
|
34
|
-
date = dateparser.parse(value).astimezone(timezone.utc).strftime("%Y-%m-%d %H:%M:%S")
|
|
35
|
-
if not operator:
|
|
36
|
-
operator = "="
|
|
37
|
-
return f"{column_prefix}{self.name}{operator}{date}"
|
|
38
|
-
|
|
39
|
-
def is_allowed_operator(self, operator, relationship_reference=None):
|
|
40
|
-
"""
|
|
41
|
-
This is called when processing user data to decide if the end-user is specifying an allowed operator
|
|
42
|
-
"""
|
|
43
|
-
return operator in ["=", "<", ">", "<=", ">="]
|
|
44
|
-
|
|
45
|
-
def input_error_for_value(self, value, operator=None):
|
|
46
|
-
value = dateparser.parse(value)
|
|
47
|
-
if not value:
|
|
48
|
-
return "given value did not appear to be a valid date"
|
|
49
|
-
if not value.tzinfo:
|
|
50
|
-
return "date is missing timezone information"
|
|
51
|
-
return ""
|
|
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
|
{clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/autodoc/formats/oai3_json/__init__.py
RENAMED
|
File without changes
|
{clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/autodoc/formats/oai3_json/oai3_json.py
RENAMED
|
File without changes
|
|
File without changes
|
{clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/autodoc/formats/oai3_json/parameter.py
RENAMED
|
File without changes
|
{clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/autodoc/formats/oai3_json/request.py
RENAMED
|
File without changes
|
{clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/autodoc/formats/oai3_json/response.py
RENAMED
|
File without changes
|
|
File without changes
|
{clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/autodoc/formats/oai3_json/schema/array.py
RENAMED
|
File without changes
|
{clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/autodoc/formats/oai3_json/schema/default.py
RENAMED
|
File without changes
|
{clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/autodoc/formats/oai3_json/schema/enum.py
RENAMED
|
File without changes
|
{clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/autodoc/formats/oai3_json/schema/object.py
RENAMED
|
File without changes
|
{clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/autodoc/formats/oai3_json/test.json
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
|
|
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
|
{clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/column_types/created_by_user_agent.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/column_types/many_to_many_with_data.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
|
|
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
|
{clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/di/test_module/another_module/__init__.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
|
{clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/handlers/exceptions/authentication.py
RENAMED
|
File without changes
|
{clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/handlers/exceptions/authorization.py
RENAMED
|
File without changes
|
{clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/handlers/exceptions/client_error.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
|
{clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/input_outputs/exceptions/__init__.py
RENAMED
|
File without changes
|
{clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/input_outputs/exceptions/cli_input_error.py
RENAMED
|
File without changes
|
{clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/input_outputs/exceptions/cli_not_found.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/input_requirements/maximum_length.py
RENAMED
|
File without changes
|
{clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/input_requirements/minimum_length.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
|
{clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/secrets/additional_configs/__init__.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
|
{clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/security_headers/x_content_type_options.py
RENAMED
|
File without changes
|
{clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/security_headers/x_frame_options.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/tests/simple_api/models/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|