django-pfx 1.7.dev6__tar.gz → 1.8.dev2__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.
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/.gitlab-ci.yml +2 -2
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/PKG-INFO +1 -1
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/django_pfx.egg-info/PKG-INFO +1 -1
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/django_pfx.egg-info/SOURCES.txt +1 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/locale/fr/LC_MESSAGES/django.po +6 -6
- django_pfx-1.8.dev2/pfx/pfxcore/migrations/0004_alter_loginban_failed_counter_and_more.py +24 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/models/login_ban.py +19 -14
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/.gitignore +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/.pre-commit-config.yaml +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/LICENSE +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/MANIFEST.in +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/README.md +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/django_pfx.egg-info/dependency_links.txt +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/django_pfx.egg-info/requires.txt +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/django_pfx.egg-info/top_level.txt +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/doc/Makefile +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/doc/conf.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/doc/index.rst +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/doc/source/api.views.rst +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/doc/source/authentication.md +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/doc/source/decorator.md +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/doc/source/generate_openapi.md +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/doc/source/getting_started.md +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/doc/source/internationalisation.md +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/doc/source/model.md +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/doc/source/pfx_views.md +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/doc/source/profiling.md +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/doc/source/settings.md +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/doc/source/testing.md +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/img/pfx.png +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/img/pfx.svg +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/make_messages +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/manage.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/__init__.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/__init__.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/apidoc/__init__.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/apidoc/parameters.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/apidoc/schema.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/apidoc/tags.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/apps.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/decorator/__init__.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/decorator/rest.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/default_settings.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/exceptions.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/fields/__init__.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/fields/decimal_field.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/fields/media_field.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/fields/minutes_duration_field.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/fields/rich_text_field.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/http/__init__.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/http/json_response.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/locale/fr/LC_MESSAGES/django.mo +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/management/__init__.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/management/commands/__init__.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/management/commands/makeapidoc.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/management/commands/profile.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/middleware/__init__.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/middleware/authentication.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/middleware/locale.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/middleware/profiling.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/migrations/0001_initial.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/migrations/0002_pfxpermissionsuser.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/migrations/0003_delete_pfxpermissionsuser.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/migrations/__init__.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/migrations/operations/__init__.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/migrations/operations/permissions.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/models/__init__.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/models/abstract_pfx_base_user.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/models/cache_mixins.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/models/not_null_fields.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/models/ordered_model_mixin.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/models/otp_user_mixin.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/models/pfx_models.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/models/pfx_user.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/models/user_filtered_queryset_mixin.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/serializers/__init__.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/serializers/json.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/settings.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/shortcuts.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/storage/__init__.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/storage/exceptions.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/storage/local_storage.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/storage/s3_storage.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/templates/registration/otp_code_email.txt +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/templates/registration/otp_code_subject.txt +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/templates/registration/password_reset_email.txt +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/templates/registration/password_reset_subject.txt +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/templates/registration/welcome_email.txt +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/templates/registration/welcome_subject.txt +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/test.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/urls.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/views/__init__.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/views/authentication_views.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/views/fields.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/views/filters_views.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/views/locale_views.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/views/media_rest_view_mixin.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/views/ordered_rest_view_mixin.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/views/parameters/__init__.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/views/parameters/date_format.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/views/parameters/groups.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/views/parameters/list_count.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/views/parameters/list_items.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/views/parameters/list_mode.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/views/parameters/list_order.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/views/parameters/list_search.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/views/parameters/media_redirect.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/views/parameters/meta_fields.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/views/parameters/meta_filters.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/views/parameters/meta_orders.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/views/parameters/subset.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/views/parameters/subset_limit.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/views/parameters/subset_offset.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/views/parameters/subset_page.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/views/parameters/subset_page_size.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/views/parameters/subset_page_subset.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/views/rest_views.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/settings/__init__.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/settings/dev.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pyproject.toml +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/requirements.txt +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/serve-doc +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/setup.cfg +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/setup.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/tests/__init__.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/tests/apps.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/tests/locale/fr/LC_MESSAGES/django.po +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/tests/migrations/0001_initial.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/tests/migrations/0002_alter_book_cover.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/tests/migrations/0003_book_local_file.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/tests/migrations/__init__.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/tests/models.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/tests/settings/__init__.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/tests/settings/ci.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/tests/settings/common.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/tests/settings/dev.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/tests/settings/dev_custom_example.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/tests/settings/dev_default.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/tests/tests/__init__.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/tests/tests/basic_api_errors.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/tests/tests/basic_api_test.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/tests/tests/test_api_doc.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/tests/tests/test_api_doc_search.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/tests/tests/test_auth_api.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/tests/tests/test_body_mixin.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/tests/tests/test_cache.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/tests/tests/test_client.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/tests/tests/test_fields_choices.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/tests/tests/test_fields_date.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/tests/tests/test_fields_decimal.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/tests/tests/test_fields_minutes_duration.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/tests/tests/test_fields_one2many.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/tests/tests/test_fields_rich_text.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/tests/tests/test_filters.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/tests/tests/test_locale_api.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/tests/tests/test_ordered_rest_view_mixin.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/tests/tests/test_perm_tests.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/tests/tests/test_permissions.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/tests/tests/test_perms_api.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/tests/tests/test_post_migrate_groups_update.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/tests/tests/test_profiling_middleware.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/tests/tests/test_settings.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/tests/tests/test_shortcuts.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/tests/tests/test_timezone_middleware.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/tests/tests/test_tools.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/tests/tests/test_user_queryset.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/tests/tests/test_view_decorators.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/tests/tests/test_view_fields.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/tests/urls.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/tests/views.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/tests_base_user/__init__.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/tests_base_user/migrations/0001_initial.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/tests_base_user/migrations/__init__.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/tests_base_user/settings/__init__.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/tests_base_user/settings/ci.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/tests_base_user/settings/common.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/tests_base_user/settings/dev.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/tests_base_user/settings/dev_custom_example.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/tests_base_user/settings/dev_default.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/tests_base_user/tests/__init__.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/tests_base_user/tests/test_api.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/tests_base_user/tests/test_auth_api.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/tests_base_user/urls.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/tests_base_user/views.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/tests_custom_user/__init__.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/tests_custom_user/migrations/0001_initial.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/tests_custom_user/migrations/__init__.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/tests_custom_user/models.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/tests_custom_user/settings/__init__.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/tests_custom_user/settings/ci.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/tests_custom_user/settings/common.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/tests_custom_user/settings/dev.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/tests_custom_user/settings/dev_custom_example.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/tests_custom_user/settings/dev_default.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/tests_custom_user/tests/__init__.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/tests_custom_user/tests/test_api.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/tests_custom_user/tests/test_auth_api.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/tests_custom_user/urls.py +0 -0
- {django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/tests_custom_user/views.py +0 -0
|
@@ -27,7 +27,7 @@ stages:
|
|
|
27
27
|
|
|
28
28
|
quality check:
|
|
29
29
|
variables:
|
|
30
|
-
DJANGO_VERSION: 'django==
|
|
30
|
+
DJANGO_VERSION: 'django==5.2.*' # LTS
|
|
31
31
|
script:
|
|
32
32
|
- apt-get update
|
|
33
33
|
- apt-get install -y gettext
|
|
@@ -110,7 +110,7 @@ package:
|
|
|
110
110
|
- job: quality check
|
|
111
111
|
- job: test
|
|
112
112
|
rules:
|
|
113
|
-
- if: $CI_COMMIT_TAG =~ /^\d+\.\d
|
|
113
|
+
- if: $CI_COMMIT_TAG =~ /^\d+\.\d+(\.\d+)?$/
|
|
114
114
|
when: on_success
|
|
115
115
|
- if: $CI_COMMIT_BRANCH == "master"
|
|
116
116
|
when: on_success
|
|
@@ -67,6 +67,7 @@ pfx/pfxcore/middleware/profiling.py
|
|
|
67
67
|
pfx/pfxcore/migrations/0001_initial.py
|
|
68
68
|
pfx/pfxcore/migrations/0002_pfxpermissionsuser.py
|
|
69
69
|
pfx/pfxcore/migrations/0003_delete_pfxpermissionsuser.py
|
|
70
|
+
pfx/pfxcore/migrations/0004_alter_loginban_failed_counter_and_more.py
|
|
70
71
|
pfx/pfxcore/migrations/__init__.py
|
|
71
72
|
pfx/pfxcore/migrations/operations/__init__.py
|
|
72
73
|
pfx/pfxcore/migrations/operations/permissions.py
|
|
@@ -7,7 +7,7 @@ msgid ""
|
|
|
7
7
|
msgstr ""
|
|
8
8
|
"Project-Id-Version: \n"
|
|
9
9
|
"Report-Msgid-Bugs-To: \n"
|
|
10
|
-
"POT-Creation-Date: 2026-03-
|
|
10
|
+
"POT-Creation-Date: 2026-03-11 15:09+0100\n"
|
|
11
11
|
"PO-Revision-Date: 2021-06-22 23:31+0200\n"
|
|
12
12
|
"Last-Translator: \n"
|
|
13
13
|
"Language-Team: \n"
|
|
@@ -67,23 +67,23 @@ msgstr ""
|
|
|
67
67
|
msgid "users"
|
|
68
68
|
msgstr ""
|
|
69
69
|
|
|
70
|
-
#: models/login_ban.py:
|
|
70
|
+
#: models/login_ban.py:54
|
|
71
71
|
msgid "Username"
|
|
72
72
|
msgstr "Nom d’utilisateur"
|
|
73
73
|
|
|
74
|
-
#: models/login_ban.py:
|
|
74
|
+
#: models/login_ban.py:55
|
|
75
75
|
msgid "Failed counter"
|
|
76
76
|
msgstr "Compteur d’échec"
|
|
77
77
|
|
|
78
|
-
#: models/login_ban.py:
|
|
78
|
+
#: models/login_ban.py:56
|
|
79
79
|
msgid "Last failed"
|
|
80
80
|
msgstr "Dernier échec"
|
|
81
81
|
|
|
82
|
-
#: models/login_ban.py:
|
|
82
|
+
#: models/login_ban.py:61
|
|
83
83
|
msgid "Login ban"
|
|
84
84
|
msgstr "Login banni"
|
|
85
85
|
|
|
86
|
-
#: models/login_ban.py:
|
|
86
|
+
#: models/login_ban.py:62
|
|
87
87
|
msgid "Login bans"
|
|
88
88
|
msgstr "Login bannis"
|
|
89
89
|
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# Generated by Django 4.2.25 on 2026-03-11 09:19
|
|
2
|
+
# flake8: noqa
|
|
3
|
+
|
|
4
|
+
from django.db import migrations, models
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class Migration(migrations.Migration):
|
|
8
|
+
|
|
9
|
+
dependencies = [
|
|
10
|
+
('pfxcore', '0003_delete_pfxpermissionsuser'),
|
|
11
|
+
]
|
|
12
|
+
|
|
13
|
+
operations = [
|
|
14
|
+
migrations.AlterField(
|
|
15
|
+
model_name='loginban',
|
|
16
|
+
name='failed_counter',
|
|
17
|
+
field=models.IntegerField(default=0, verbose_name='Failed counter'),
|
|
18
|
+
),
|
|
19
|
+
migrations.AlterField(
|
|
20
|
+
model_name='loginban',
|
|
21
|
+
name='last_failed',
|
|
22
|
+
field=models.DateTimeField(verbose_name='Last failed'),
|
|
23
|
+
),
|
|
24
|
+
]
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
from datetime import timedelta
|
|
2
2
|
|
|
3
|
-
from django.db import models
|
|
4
|
-
from django.
|
|
3
|
+
from django.db import IntegrityError, models
|
|
4
|
+
from django.db.models import F
|
|
5
|
+
from django.utils import timezone as tz
|
|
5
6
|
from django.utils.translation import gettext_lazy as _
|
|
6
7
|
|
|
7
8
|
from pfx.pfxcore.settings import settings
|
|
@@ -21,19 +22,27 @@ class LoginBanQuerySet(models.QuerySet):
|
|
|
21
22
|
ban.failed_counter //
|
|
22
23
|
settings.PFX_LOGIN_BAN_FAILED_NUMBER - 1))
|
|
23
24
|
ban_time = ban.last_failed + timedelta(seconds=seconds)
|
|
24
|
-
now =
|
|
25
|
+
now = tz.now()
|
|
25
26
|
if now < ban_time:
|
|
26
27
|
return ban_time - now
|
|
27
28
|
return False
|
|
28
29
|
|
|
30
|
+
def _increment(self, username, last_failed):
|
|
31
|
+
return self.filter(username=username).update(
|
|
32
|
+
failed_counter=F("failed_counter") + 1,
|
|
33
|
+
last_failed=last_failed)
|
|
34
|
+
|
|
29
35
|
def ban(self, username):
|
|
30
36
|
if not username:
|
|
31
37
|
return
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
38
|
+
now = tz.now()
|
|
39
|
+
updated = self._increment(username, now)
|
|
40
|
+
if not updated:
|
|
41
|
+
try:
|
|
42
|
+
self.create(
|
|
43
|
+
username=username, failed_counter=1, last_failed=now)
|
|
44
|
+
except IntegrityError:
|
|
45
|
+
self._increment(username, now)
|
|
37
46
|
|
|
38
47
|
def unban(self, username):
|
|
39
48
|
if not username:
|
|
@@ -43,8 +52,8 @@ class LoginBanQuerySet(models.QuerySet):
|
|
|
43
52
|
|
|
44
53
|
class LoginBan(models.Model):
|
|
45
54
|
username = models.CharField(_("Username"), max_length=150, unique=True)
|
|
46
|
-
failed_counter = models.IntegerField(_("Failed counter"))
|
|
47
|
-
last_failed = models.DateTimeField(_("Last failed")
|
|
55
|
+
failed_counter = models.IntegerField(_("Failed counter"), default=0)
|
|
56
|
+
last_failed = models.DateTimeField(_("Last failed"))
|
|
48
57
|
|
|
49
58
|
objects = LoginBanQuerySet.as_manager()
|
|
50
59
|
|
|
@@ -54,7 +63,3 @@ class LoginBan(models.Model):
|
|
|
54
63
|
|
|
55
64
|
def __str__(self):
|
|
56
65
|
return self.username
|
|
57
|
-
|
|
58
|
-
def save(self, *args, **kwargs):
|
|
59
|
-
self.failed_counter = (self.failed_counter or 0) + 1
|
|
60
|
-
return super().save(*args, **kwargs)
|
|
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
|
|
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
|
{django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/migrations/0002_pfxpermissionsuser.py
RENAMED
|
File without changes
|
{django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/migrations/0003_delete_pfxpermissionsuser.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/migrations/operations/permissions.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
|
{django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/models/user_filtered_queryset_mixin.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
|
{django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/templates/registration/otp_code_email.txt
RENAMED
|
File without changes
|
{django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/templates/registration/otp_code_subject.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/templates/registration/welcome_email.txt
RENAMED
|
File without changes
|
{django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/templates/registration/welcome_subject.txt
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
|
{django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/views/parameters/subset_page_size.py
RENAMED
|
File without changes
|
{django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/pfx/pfxcore/views/parameters/subset_page_subset.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
|
|
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
|
{django_pfx-1.7.dev6 → django_pfx-1.8.dev2}/tests_custom_user/settings/dev_custom_example.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|