djresttoolkit 0.17.0__tar.gz → 0.17.1__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.
- djresttoolkit-0.17.1/.python-version +1 -0
- djresttoolkit-0.17.1/.vscode/settings.json +12 -0
- {djresttoolkit-0.17.0 → djresttoolkit-0.17.1}/PKG-INFO +1 -1
- djresttoolkit-0.17.1/demo/apps/todos/admin.py +48 -0
- djresttoolkit-0.17.1/demo/apps/todos/apps.py +7 -0
- djresttoolkit-0.17.1/demo/apps/todos/dbseed/tag_seed.py +13 -0
- djresttoolkit-0.17.1/demo/apps/todos/dbseed/todo_seed.py +44 -0
- djresttoolkit-0.17.1/demo/apps/todos/dbseed/todo_tag_seed.py +22 -0
- djresttoolkit-0.17.1/demo/apps/todos/migrations/0001_initial.py +131 -0
- djresttoolkit-0.17.1/demo/apps/todos/models.py +118 -0
- djresttoolkit-0.17.1/demo/apps/todos/tests.py +3 -0
- djresttoolkit-0.17.1/demo/apps/todos/urls.py +7 -0
- djresttoolkit-0.17.1/demo/apps_config/asgi.py +10 -0
- djresttoolkit-0.17.1/demo/apps_config/serializers.py +7 -0
- djresttoolkit-0.17.1/demo/apps_config/settings.py +248 -0
- djresttoolkit-0.17.1/demo/apps_config/urls.py +17 -0
- djresttoolkit-0.17.1/demo/apps_config/views.py +40 -0
- djresttoolkit-0.17.1/demo/apps_config/wsgi.py +9 -0
- djresttoolkit-0.17.1/demo/env_config/__init__.py +3 -0
- djresttoolkit-0.17.1/demo/env_config/env_settings.py +54 -0
- djresttoolkit-0.17.1/demo/manage.py +22 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/css/autocomplete.css +279 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/css/base.css +1180 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/css/changelists.css +343 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/css/dark_mode.css +130 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/css/dashboard.css +29 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/css/forms.css +498 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/css/login.css +61 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/css/nav_sidebar.css +150 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/css/responsive.css +904 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/css/responsive_rtl.css +89 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/css/rtl.css +293 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/css/unusable_password_field.css +19 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/css/vendor/select2/LICENSE-SELECT2.md +21 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/css/vendor/select2/select2.css +481 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/css/vendor/select2/select2.min.css +1 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/css/widgets.css +613 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/img/README.txt +7 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/img/calendar-icons.svg +63 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/img/gis/move_vertex_off.svg +1 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/img/gis/move_vertex_on.svg +1 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/img/icon-addlink.svg +3 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/img/icon-alert.svg +3 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/img/icon-calendar.svg +9 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/img/icon-changelink.svg +3 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/img/icon-clock.svg +9 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/img/icon-deletelink.svg +3 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/img/icon-hidelink.svg +3 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/img/icon-no.svg +3 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/img/icon-unknown-alt.svg +3 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/img/icon-unknown.svg +3 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/img/icon-viewlink.svg +3 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/img/icon-yes.svg +3 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/img/inline-delete.svg +3 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/img/search.svg +3 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/img/selector-icons.svg +34 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/img/sorting-icons.svg +19 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/img/tooltag-add.svg +3 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/img/tooltag-arrowright.svg +3 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/SelectBox.js +116 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/SelectFilter2.js +311 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/actions.js +204 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/admin/DateTimeShortcuts.js +408 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/admin/RelatedObjectLookups.js +252 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/autocomplete.js +33 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/calendar.js +239 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/cancel.js +29 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/change_form.js +16 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/core.js +184 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/filters.js +30 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/inlines.js +359 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/jquery.init.js +8 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/nav_sidebar.js +79 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/popup_response.js +15 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/prepopulate.js +43 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/prepopulate_init.js +15 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/theme.js +51 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/unusable_password_field.js +29 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/urlify.js +169 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/jquery/LICENSE.txt +20 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/jquery/jquery.js +10716 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/jquery/jquery.min.js +2 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/LICENSE.md +21 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/af.js +3 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/ar.js +3 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/az.js +3 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/bg.js +3 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/bn.js +3 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/bs.js +3 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/ca.js +3 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/cs.js +3 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/da.js +3 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/de.js +3 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/dsb.js +3 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/el.js +3 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/en.js +3 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/es.js +3 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/et.js +3 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/eu.js +3 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/fa.js +3 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/fi.js +3 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/fr.js +3 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/gl.js +3 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/he.js +3 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/hi.js +3 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/hr.js +3 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/hsb.js +3 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/hu.js +3 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/hy.js +3 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/id.js +3 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/is.js +3 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/it.js +3 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/ja.js +3 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/ka.js +3 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/km.js +3 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/ko.js +3 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/lt.js +3 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/lv.js +3 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/mk.js +3 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/ms.js +3 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/nb.js +3 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/ne.js +3 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/nl.js +3 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/pl.js +3 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/ps.js +3 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/pt-BR.js +3 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/pt.js +3 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/ro.js +3 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/ru.js +3 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/sk.js +3 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/sl.js +3 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/sq.js +3 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/sr-Cyrl.js +3 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/sr.js +3 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/sv.js +3 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/th.js +3 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/tk.js +3 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/tr.js +3 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/uk.js +3 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/vi.js +3 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/zh-CN.js +3 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/zh-TW.js +3 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/select2.full.js +6820 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/select2.full.min.js +2 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/xregexp/LICENSE.txt +21 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/xregexp/xregexp.js +6126 -0
- djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/xregexp/xregexp.min.js +17 -0
- djresttoolkit-0.17.1/demo/staticfiles/rest_framework/css/bootstrap-theme.min.css +6 -0
- djresttoolkit-0.17.1/demo/staticfiles/rest_framework/css/bootstrap-theme.min.css.map +1 -0
- djresttoolkit-0.17.1/demo/staticfiles/rest_framework/css/bootstrap-tweaks.css +237 -0
- djresttoolkit-0.17.1/demo/staticfiles/rest_framework/css/bootstrap.min.css +6 -0
- djresttoolkit-0.17.1/demo/staticfiles/rest_framework/css/bootstrap.min.css.map +1 -0
- djresttoolkit-0.17.1/demo/staticfiles/rest_framework/css/default.css +82 -0
- djresttoolkit-0.17.1/demo/staticfiles/rest_framework/css/font-awesome-4.0.3.css +1338 -0
- djresttoolkit-0.17.1/demo/staticfiles/rest_framework/css/prettify.css +30 -0
- djresttoolkit-0.17.1/demo/staticfiles/rest_framework/docs/css/base.css +359 -0
- djresttoolkit-0.17.1/demo/staticfiles/rest_framework/docs/css/highlight.css +125 -0
- djresttoolkit-0.17.1/demo/staticfiles/rest_framework/docs/css/jquery.json-view.min.css +11 -0
- djresttoolkit-0.17.1/demo/staticfiles/rest_framework/docs/img/favicon.ico +0 -0
- djresttoolkit-0.17.1/demo/staticfiles/rest_framework/docs/img/grid.png +0 -0
- djresttoolkit-0.17.1/demo/staticfiles/rest_framework/docs/js/api.js +315 -0
- djresttoolkit-0.17.1/demo/staticfiles/rest_framework/docs/js/highlight.pack.js +2 -0
- djresttoolkit-0.17.1/demo/staticfiles/rest_framework/docs/js/jquery.json-view.min.js +7 -0
- djresttoolkit-0.17.1/demo/staticfiles/rest_framework/fonts/fontawesome-webfont.eot +0 -0
- djresttoolkit-0.17.1/demo/staticfiles/rest_framework/fonts/fontawesome-webfont.svg +414 -0
- djresttoolkit-0.17.1/demo/staticfiles/rest_framework/fonts/fontawesome-webfont.ttf +0 -0
- djresttoolkit-0.17.1/demo/staticfiles/rest_framework/fonts/fontawesome-webfont.woff +0 -0
- djresttoolkit-0.17.1/demo/staticfiles/rest_framework/fonts/glyphicons-halflings-regular.eot +0 -0
- djresttoolkit-0.17.1/demo/staticfiles/rest_framework/fonts/glyphicons-halflings-regular.svg +288 -0
- djresttoolkit-0.17.1/demo/staticfiles/rest_framework/fonts/glyphicons-halflings-regular.ttf +0 -0
- djresttoolkit-0.17.1/demo/staticfiles/rest_framework/fonts/glyphicons-halflings-regular.woff +0 -0
- djresttoolkit-0.17.1/demo/staticfiles/rest_framework/fonts/glyphicons-halflings-regular.woff2 +0 -0
- djresttoolkit-0.17.1/demo/staticfiles/rest_framework/img/glyphicons-halflings-white.png +0 -0
- djresttoolkit-0.17.1/demo/staticfiles/rest_framework/img/glyphicons-halflings.png +0 -0
- djresttoolkit-0.17.1/demo/staticfiles/rest_framework/img/grid.png +0 -0
- djresttoolkit-0.17.1/demo/staticfiles/rest_framework/js/ajax-form.js +133 -0
- djresttoolkit-0.17.1/demo/staticfiles/rest_framework/js/bootstrap.min.js +6 -0
- djresttoolkit-0.17.1/demo/staticfiles/rest_framework/js/coreapi-0.1.1.js +2043 -0
- djresttoolkit-0.17.1/demo/staticfiles/rest_framework/js/csrf.js +53 -0
- djresttoolkit-0.17.1/demo/staticfiles/rest_framework/js/default.js +47 -0
- djresttoolkit-0.17.1/demo/staticfiles/rest_framework/js/jquery-3.7.1.min.js +2 -0
- djresttoolkit-0.17.1/demo/staticfiles/rest_framework/js/load-ajax-form.js +3 -0
- djresttoolkit-0.17.1/demo/staticfiles/rest_framework/js/prettify-min.js +28 -0
- {djresttoolkit-0.17.0 → djresttoolkit-0.17.1}/pyproject.toml +1 -8
- djresttoolkit-0.17.1/src/djresttoolkit/migrations/__init__.py +0 -0
- djresttoolkit-0.17.1/src/djresttoolkit/models/__init__.py +0 -0
- djresttoolkit-0.17.1/src/djresttoolkit/py.typed +0 -0
- djresttoolkit-0.17.1/src/djresttoolkit/serializers/__init__.py +0 -0
- djresttoolkit-0.17.1/src/djresttoolkit/views/_api_views/__init__.py +0 -0
- djresttoolkit-0.17.1/uv.lock +864 -0
- {djresttoolkit-0.17.0 → djresttoolkit-0.17.1}/.gitignore +0 -0
- {djresttoolkit-0.17.0 → djresttoolkit-0.17.1}/LICENSE +0 -0
- {djresttoolkit-0.17.0 → djresttoolkit-0.17.1}/README.md +0 -0
- {djresttoolkit-0.17.0/src/djresttoolkit → djresttoolkit-0.17.1/demo/apps/todos}/__init__.py +0 -0
- {djresttoolkit-0.17.0/src/djresttoolkit → djresttoolkit-0.17.1/demo/apps/todos}/dbseed/__init__.py +0 -0
- {djresttoolkit-0.17.0/src/djresttoolkit/management → djresttoolkit-0.17.1/demo/apps/todos/migrations}/__init__.py +0 -0
- /djresttoolkit-0.17.0/src/djresttoolkit/admin.py → /djresttoolkit-0.17.1/demo/apps/todos/views.py +0 -0
- {djresttoolkit-0.17.0/src/djresttoolkit/management/commands → djresttoolkit-0.17.1/demo/apps_config}/__init__.py +0 -0
- {djresttoolkit-0.17.0 → djresttoolkit-0.17.1}/demo/staticfiles/admin/img/LICENSE +0 -0
- {djresttoolkit-0.17.0/src/djresttoolkit/migrations → djresttoolkit-0.17.1/src/djresttoolkit}/__init__.py +0 -0
- /djresttoolkit-0.17.0/src/djresttoolkit/models/__init__.py → /djresttoolkit-0.17.1/src/djresttoolkit/admin.py +0 -0
- {djresttoolkit-0.17.0 → djresttoolkit-0.17.1}/src/djresttoolkit/apps.py +0 -0
- {djresttoolkit-0.17.0/src/djresttoolkit/serializers → djresttoolkit-0.17.1/src/djresttoolkit/dbseed}/__init__.py +0 -0
- {djresttoolkit-0.17.0 → djresttoolkit-0.17.1}/src/djresttoolkit/dbseed/models/__init__.py +0 -0
- {djresttoolkit-0.17.0 → djresttoolkit-0.17.1}/src/djresttoolkit/dbseed/models/_choice_field.py +0 -0
- {djresttoolkit-0.17.0 → djresttoolkit-0.17.1}/src/djresttoolkit/dbseed/models/_gen.py +0 -0
- {djresttoolkit-0.17.0 → djresttoolkit-0.17.1}/src/djresttoolkit/dbseed/models/_seed_model.py +0 -0
- {djresttoolkit-0.17.0 → djresttoolkit-0.17.1}/src/djresttoolkit/envconfig/__init__.py +0 -0
- {djresttoolkit-0.17.0 → djresttoolkit-0.17.1}/src/djresttoolkit/envconfig/_env_settings.py +0 -0
- {djresttoolkit-0.17.0 → djresttoolkit-0.17.1}/src/djresttoolkit/mail/__init__.py +0 -0
- {djresttoolkit-0.17.0 → djresttoolkit-0.17.1}/src/djresttoolkit/mail/_email_sender.py +0 -0
- {djresttoolkit-0.17.0 → djresttoolkit-0.17.1}/src/djresttoolkit/mail/_models.py +0 -0
- {djresttoolkit-0.17.0 → djresttoolkit-0.17.1}/src/djresttoolkit/mail/_types.py +0 -0
- {djresttoolkit-0.17.0/src/djresttoolkit/views/_api_views → djresttoolkit-0.17.1/src/djresttoolkit/management}/__init__.py +0 -0
- /djresttoolkit-0.17.0/src/djresttoolkit/py.typed → /djresttoolkit-0.17.1/src/djresttoolkit/management/commands/__init__.py +0 -0
- {djresttoolkit-0.17.0 → djresttoolkit-0.17.1}/src/djresttoolkit/management/commands/dbflush.py +0 -0
- {djresttoolkit-0.17.0 → djresttoolkit-0.17.1}/src/djresttoolkit/management/commands/dbseed.py +0 -0
- {djresttoolkit-0.17.0 → djresttoolkit-0.17.1}/src/djresttoolkit/middlewares/__init__.py +0 -0
- {djresttoolkit-0.17.0 → djresttoolkit-0.17.1}/src/djresttoolkit/middlewares/_response_time_middleware.py +0 -0
- {djresttoolkit-0.17.0 → djresttoolkit-0.17.1}/src/djresttoolkit/models/mixins/__init__.py +0 -0
- {djresttoolkit-0.17.0 → djresttoolkit-0.17.1}/src/djresttoolkit/models/mixins/_model_choice_fields_mixin.py +0 -0
- {djresttoolkit-0.17.0 → djresttoolkit-0.17.1}/src/djresttoolkit/pagination/__init__.py +0 -0
- {djresttoolkit-0.17.0 → djresttoolkit-0.17.1}/src/djresttoolkit/pagination/_page_number_pagination.py +0 -0
- {djresttoolkit-0.17.0 → djresttoolkit-0.17.1}/src/djresttoolkit/pagination/_paginated_data_builder.py +0 -0
- {djresttoolkit-0.17.0 → djresttoolkit-0.17.1}/src/djresttoolkit/renderers/__init__.py +0 -0
- {djresttoolkit-0.17.0 → djresttoolkit-0.17.1}/src/djresttoolkit/renderers/_throttle_info_json_renderer.py +0 -0
- {djresttoolkit-0.17.0 → djresttoolkit-0.17.1}/src/djresttoolkit/serializers/mixins/__init__.py +0 -0
- {djresttoolkit-0.17.0 → djresttoolkit-0.17.1}/src/djresttoolkit/serializers/mixins/_absolute_url_file_mixin.py +0 -0
- {djresttoolkit-0.17.0 → djresttoolkit-0.17.1}/src/djresttoolkit/serializers/mixins/_bulk_create_mixin.py +0 -0
- {djresttoolkit-0.17.0 → djresttoolkit-0.17.1}/src/djresttoolkit/throttling/__init__.py +0 -0
- {djresttoolkit-0.17.0 → djresttoolkit-0.17.1}/src/djresttoolkit/throttling/_throttle_inspector.py +0 -0
- {djresttoolkit-0.17.0 → djresttoolkit-0.17.1}/src/djresttoolkit/urls/__init__.py +0 -0
- {djresttoolkit-0.17.0 → djresttoolkit-0.17.1}/src/djresttoolkit/urls/_build_absolute_uri.py +0 -0
- {djresttoolkit-0.17.0 → djresttoolkit-0.17.1}/src/djresttoolkit/views/__init__.py +0 -0
- {djresttoolkit-0.17.0 → djresttoolkit-0.17.1}/src/djresttoolkit/views/_api_views/_choice_fields_apiview.py +0 -0
- {djresttoolkit-0.17.0 → djresttoolkit-0.17.1}/src/djresttoolkit/views/_exceptions/__init__.py +0 -0
- {djresttoolkit-0.17.0 → djresttoolkit-0.17.1}/src/djresttoolkit/views/_exceptions/_exception_handler.py +0 -0
- {djresttoolkit-0.17.0 → djresttoolkit-0.17.1}/src/djresttoolkit/views/mixins/__init__.py +0 -0
- {djresttoolkit-0.17.0 → djresttoolkit-0.17.1}/src/djresttoolkit/views/mixins/_cache_action_mixin.py +0 -0
- {djresttoolkit-0.17.0 → djresttoolkit-0.17.1}/src/djresttoolkit/views/mixins/_cache_invalidate_mixin.py +0 -0
- {djresttoolkit-0.17.0 → djresttoolkit-0.17.1}/src/djresttoolkit/views/mixins/_cache_key_mixin.py +0 -0
- {djresttoolkit-0.17.0 → djresttoolkit-0.17.1}/src/djresttoolkit/views/mixins/_cache_list_retrieve_mixin.py +0 -0
- {djresttoolkit-0.17.0 → djresttoolkit-0.17.1}/src/djresttoolkit/views/mixins/_cache_ops_mixin.py +0 -0
- {djresttoolkit-0.17.0 → djresttoolkit-0.17.1}/src/djresttoolkit/views/mixins/_retrieve_object_mixin.py +0 -0
@@ -0,0 +1 @@
|
|
1
|
+
3.13
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: djresttoolkit
|
3
|
-
Version: 0.17.
|
3
|
+
Version: 0.17.1
|
4
4
|
Summary: A collection of Django and DRF utilities to simplify API development.
|
5
5
|
Project-URL: Homepage, https://github.com/shaileshpandit141/djresttoolkit
|
6
6
|
Project-URL: Documentation, https://shaileshpandit141.github.io/djresttoolkit
|
@@ -0,0 +1,48 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
3
|
+
from typing import TYPE_CHECKING
|
4
|
+
|
5
|
+
from django.contrib import admin
|
6
|
+
from django.contrib.admin import ModelAdmin
|
7
|
+
|
8
|
+
from .models import Tag, Todo, TodoTag
|
9
|
+
|
10
|
+
if TYPE_CHECKING:
|
11
|
+
class TodoAdminBase(ModelAdmin[Todo]): ...
|
12
|
+
class TagAdminBase(ModelAdmin[Todo]): ...
|
13
|
+
class TodoTagAdminBase(ModelAdmin[Todo]): ...
|
14
|
+
else:
|
15
|
+
class TodoAdminBase(ModelAdmin): ...
|
16
|
+
class TagAdminBase(ModelAdmin): ...
|
17
|
+
class TodoTagAdminBase(ModelAdmin): ...
|
18
|
+
|
19
|
+
|
20
|
+
@admin.register(Todo)
|
21
|
+
class TodoAdmin(TodoAdminBase):
|
22
|
+
list_display = [
|
23
|
+
"id",
|
24
|
+
"user",
|
25
|
+
"title",
|
26
|
+
"due_date",
|
27
|
+
"priority",
|
28
|
+
"status",
|
29
|
+
]
|
30
|
+
list_display_links = list_display
|
31
|
+
ordering = ("-id",)
|
32
|
+
list_filter = ["priority", "status"]
|
33
|
+
search_fields = ["title"]
|
34
|
+
|
35
|
+
|
36
|
+
@admin.register(Tag)
|
37
|
+
class TagAdmin(TagAdminBase):
|
38
|
+
list_display = ["id", "name"]
|
39
|
+
list_display_links = list_display
|
40
|
+
ordering = ("-id",)
|
41
|
+
search_fields = ["name"]
|
42
|
+
|
43
|
+
|
44
|
+
@admin.register(TodoTag)
|
45
|
+
class TodoTagAdmin(TodoTagAdminBase):
|
46
|
+
list_display = ["id", "todo", "tag"]
|
47
|
+
list_display_links = list_display
|
48
|
+
ordering = ("-id",)
|
@@ -0,0 +1,44 @@
|
|
1
|
+
from django.utils import timezone
|
2
|
+
|
3
|
+
from djresttoolkit.dbseed.models import ( # type: ignore[import-not-found]
|
4
|
+
Field,
|
5
|
+
Gen,
|
6
|
+
SeedModel,
|
7
|
+
)
|
8
|
+
|
9
|
+
from ..models import Todo, TodoPriority, TodoStatus
|
10
|
+
|
11
|
+
|
12
|
+
class TodoSeedModel(SeedModel):
|
13
|
+
__model__ = Todo
|
14
|
+
|
15
|
+
title: str = Field(
|
16
|
+
default_factory=lambda: Gen.sentence(nb_words=4),
|
17
|
+
)
|
18
|
+
description: str = Field(
|
19
|
+
default_factory=lambda: Gen.sentence(nb_words=20),
|
20
|
+
)
|
21
|
+
due_date: str | None = Field(
|
22
|
+
default_factory=lambda: Gen.date_time_this_year(
|
23
|
+
before_now=False, after_now=True
|
24
|
+
)
|
25
|
+
.replace(tzinfo=timezone.get_current_timezone())
|
26
|
+
.isoformat(),
|
27
|
+
)
|
28
|
+
priority: str = Field(
|
29
|
+
default_factory=lambda: Gen.random_element(
|
30
|
+
elements=[choice[0] for choice in TodoPriority.choices]
|
31
|
+
),
|
32
|
+
)
|
33
|
+
status: str = Field(
|
34
|
+
default_factory=lambda: Gen.random_element(
|
35
|
+
elements=[choice[0] for choice in TodoStatus.choices]
|
36
|
+
),
|
37
|
+
)
|
38
|
+
completed_at: str | None = Field(
|
39
|
+
default_factory=lambda: Gen.date_time_this_year(
|
40
|
+
before_now=False, after_now=True
|
41
|
+
)
|
42
|
+
.replace(tzinfo=timezone.get_current_timezone())
|
43
|
+
.isoformat(),
|
44
|
+
)
|
@@ -0,0 +1,22 @@
|
|
1
|
+
from djresttoolkit.dbseed.models import ( # type: ignore[import-not-found]
|
2
|
+
Field,
|
3
|
+
Gen,
|
4
|
+
SeedModel,
|
5
|
+
)
|
6
|
+
|
7
|
+
from ..models import Tag, Todo, TodoTag
|
8
|
+
|
9
|
+
|
10
|
+
class TodoTagSeedModel(SeedModel):
|
11
|
+
__model__ = TodoTag
|
12
|
+
|
13
|
+
todo: int = Field(
|
14
|
+
default_factory=lambda: Gen.random_element(
|
15
|
+
list(Todo.objects.all().values_list("id", flat=True))
|
16
|
+
)
|
17
|
+
)
|
18
|
+
tag: int = Field(
|
19
|
+
default_factory=lambda: Gen.random_element(
|
20
|
+
list(Tag.objects.all().values_list("id", flat=True))
|
21
|
+
)
|
22
|
+
)
|
@@ -0,0 +1,131 @@
|
|
1
|
+
# Generated by Django 5.2.5 on 2025-08-18 05:32
|
2
|
+
|
3
|
+
import django.db.models.deletion
|
4
|
+
import uuid
|
5
|
+
from django.conf import settings
|
6
|
+
from django.db import migrations, models
|
7
|
+
|
8
|
+
|
9
|
+
class Migration(migrations.Migration):
|
10
|
+
|
11
|
+
initial = True
|
12
|
+
|
13
|
+
dependencies = [
|
14
|
+
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
15
|
+
]
|
16
|
+
|
17
|
+
operations = [
|
18
|
+
migrations.CreateModel(
|
19
|
+
name="Tag",
|
20
|
+
fields=[
|
21
|
+
(
|
22
|
+
"id",
|
23
|
+
models.BigAutoField(
|
24
|
+
editable=False, primary_key=True, serialize=False
|
25
|
+
),
|
26
|
+
),
|
27
|
+
(
|
28
|
+
"uuid",
|
29
|
+
models.UUIDField(default=uuid.uuid4, editable=False, unique=True),
|
30
|
+
),
|
31
|
+
("created_at", models.DateTimeField(auto_now_add=True)),
|
32
|
+
("updated_at", models.DateTimeField(auto_now=True)),
|
33
|
+
("name", models.CharField(max_length=50, unique=True)),
|
34
|
+
],
|
35
|
+
options={
|
36
|
+
"abstract": False,
|
37
|
+
},
|
38
|
+
),
|
39
|
+
migrations.CreateModel(
|
40
|
+
name="Todo",
|
41
|
+
fields=[
|
42
|
+
(
|
43
|
+
"id",
|
44
|
+
models.BigAutoField(
|
45
|
+
editable=False, primary_key=True, serialize=False
|
46
|
+
),
|
47
|
+
),
|
48
|
+
(
|
49
|
+
"uuid",
|
50
|
+
models.UUIDField(default=uuid.uuid4, editable=False, unique=True),
|
51
|
+
),
|
52
|
+
("created_at", models.DateTimeField(auto_now_add=True)),
|
53
|
+
("updated_at", models.DateTimeField(auto_now=True)),
|
54
|
+
("title", models.CharField(max_length=255)),
|
55
|
+
("description", models.TextField(blank=True, default="")),
|
56
|
+
("due_date", models.DateTimeField(blank=True, null=True)),
|
57
|
+
(
|
58
|
+
"priority",
|
59
|
+
models.CharField(
|
60
|
+
choices=[
|
61
|
+
("low", "Low"),
|
62
|
+
("medium", "Medium"),
|
63
|
+
("high", "High"),
|
64
|
+
("critical", "Critical"),
|
65
|
+
],
|
66
|
+
default="medium",
|
67
|
+
max_length=20,
|
68
|
+
),
|
69
|
+
),
|
70
|
+
(
|
71
|
+
"status",
|
72
|
+
models.CharField(
|
73
|
+
choices=[
|
74
|
+
("pending", "Pending"),
|
75
|
+
("in_progress", "In Progress"),
|
76
|
+
("completed", "Completed"),
|
77
|
+
("archived", "Archived"),
|
78
|
+
],
|
79
|
+
default="pending",
|
80
|
+
max_length=20,
|
81
|
+
),
|
82
|
+
),
|
83
|
+
("completed_at", models.DateTimeField(blank=True, null=True)),
|
84
|
+
(
|
85
|
+
"user",
|
86
|
+
models.ForeignKey(
|
87
|
+
help_text="Owner of this todo",
|
88
|
+
on_delete=django.db.models.deletion.CASCADE,
|
89
|
+
related_name="todos",
|
90
|
+
to=settings.AUTH_USER_MODEL,
|
91
|
+
),
|
92
|
+
),
|
93
|
+
],
|
94
|
+
options={
|
95
|
+
"abstract": False,
|
96
|
+
},
|
97
|
+
),
|
98
|
+
migrations.CreateModel(
|
99
|
+
name="TodoTag",
|
100
|
+
fields=[
|
101
|
+
(
|
102
|
+
"id",
|
103
|
+
models.BigAutoField(
|
104
|
+
auto_created=True,
|
105
|
+
primary_key=True,
|
106
|
+
serialize=False,
|
107
|
+
verbose_name="ID",
|
108
|
+
),
|
109
|
+
),
|
110
|
+
(
|
111
|
+
"tag",
|
112
|
+
models.ForeignKey(
|
113
|
+
on_delete=django.db.models.deletion.CASCADE,
|
114
|
+
related_name="tag_todos",
|
115
|
+
to="todos.tag",
|
116
|
+
),
|
117
|
+
),
|
118
|
+
(
|
119
|
+
"todo",
|
120
|
+
models.ForeignKey(
|
121
|
+
on_delete=django.db.models.deletion.CASCADE,
|
122
|
+
related_name="todo_tags",
|
123
|
+
to="todos.todo",
|
124
|
+
),
|
125
|
+
),
|
126
|
+
],
|
127
|
+
options={
|
128
|
+
"unique_together": {("todo", "tag")},
|
129
|
+
},
|
130
|
+
),
|
131
|
+
]
|
@@ -0,0 +1,118 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
3
|
+
import uuid
|
4
|
+
from uuid import UUID
|
5
|
+
|
6
|
+
from django.conf import settings
|
7
|
+
from django.contrib.auth.models import AbstractUser
|
8
|
+
from django.db.models import (
|
9
|
+
CASCADE,
|
10
|
+
BigAutoField,
|
11
|
+
CharField,
|
12
|
+
DateTimeField,
|
13
|
+
ForeignKey,
|
14
|
+
Model,
|
15
|
+
TextChoices,
|
16
|
+
TextField,
|
17
|
+
UUIDField,
|
18
|
+
)
|
19
|
+
from django.utils import timezone
|
20
|
+
|
21
|
+
|
22
|
+
class TodoPriority(TextChoices):
|
23
|
+
LOW = "low", "Low"
|
24
|
+
MEDIUM = "medium", "Medium"
|
25
|
+
HIGH = "high", "High"
|
26
|
+
CRITICAL = "critical", "Critical"
|
27
|
+
|
28
|
+
|
29
|
+
class TodoStatus(TextChoices):
|
30
|
+
PENDING = "pending", "Pending"
|
31
|
+
IN_PROGRESS = "in_progress", "In Progress"
|
32
|
+
COMPLETED = "completed", "Completed"
|
33
|
+
ARCHIVED = "archived", "Archived"
|
34
|
+
|
35
|
+
|
36
|
+
class BaseModel(Model):
|
37
|
+
"""Abstract base with UUID PK and timestamps."""
|
38
|
+
|
39
|
+
id: BigAutoField[int, int] = BigAutoField(primary_key=True, editable=False)
|
40
|
+
uuid: UUIDField[UUID, str] = UUIDField(
|
41
|
+
unique=True,
|
42
|
+
default=uuid.uuid4,
|
43
|
+
editable=False,
|
44
|
+
)
|
45
|
+
created_at: DateTimeField[str, str] = DateTimeField(auto_now_add=True)
|
46
|
+
updated_at: DateTimeField[str, str] = DateTimeField(auto_now=True)
|
47
|
+
|
48
|
+
class Meta:
|
49
|
+
abstract = True
|
50
|
+
|
51
|
+
|
52
|
+
class Todo(BaseModel):
|
53
|
+
"""Main Todo model."""
|
54
|
+
|
55
|
+
user: ForeignKey[int, AbstractUser] = ForeignKey(
|
56
|
+
settings.AUTH_USER_MODEL,
|
57
|
+
on_delete=CASCADE,
|
58
|
+
related_name="todos",
|
59
|
+
help_text="Owner of this todo",
|
60
|
+
)
|
61
|
+
title: CharField[str, str] = CharField(max_length=255)
|
62
|
+
description: TextField[str, str] = TextField(blank=True, default="")
|
63
|
+
due_date: DateTimeField[str | None, str | None] = DateTimeField(
|
64
|
+
null=True,
|
65
|
+
blank=True,
|
66
|
+
)
|
67
|
+
|
68
|
+
priority: CharField[str, str] = CharField(
|
69
|
+
max_length=20,
|
70
|
+
choices=TodoPriority.choices,
|
71
|
+
default=TodoPriority.MEDIUM,
|
72
|
+
)
|
73
|
+
status: CharField[str, str] = CharField(
|
74
|
+
max_length=20,
|
75
|
+
choices=TodoStatus.choices,
|
76
|
+
default=TodoStatus.PENDING,
|
77
|
+
)
|
78
|
+
|
79
|
+
completed_at: DateTimeField[str | None, str | None] = DateTimeField(
|
80
|
+
null=True,
|
81
|
+
blank=True,
|
82
|
+
)
|
83
|
+
|
84
|
+
def mark_completed(self) -> None:
|
85
|
+
"""Mark todo as completed safely."""
|
86
|
+
self.status = TodoStatus.COMPLETED
|
87
|
+
self.completed_at = str(timezone.now())
|
88
|
+
self.save(update_fields=["status", "completed_at", "updated_at"])
|
89
|
+
|
90
|
+
def __str__(self) -> str:
|
91
|
+
return f"Todo({self.id}, {self.title})"
|
92
|
+
|
93
|
+
|
94
|
+
class Tag(BaseModel):
|
95
|
+
"""Simple tags for todos."""
|
96
|
+
|
97
|
+
name: CharField[str, str] = CharField(max_length=50, unique=True)
|
98
|
+
|
99
|
+
def __str__(self) -> str:
|
100
|
+
return f"Tag({self.id}, {self.name})"
|
101
|
+
|
102
|
+
|
103
|
+
class TodoTag(Model):
|
104
|
+
"""Many-to-many through model for tagging."""
|
105
|
+
|
106
|
+
todo: ForeignKey[int, Todo] = ForeignKey(
|
107
|
+
Todo,
|
108
|
+
on_delete=CASCADE,
|
109
|
+
related_name="todo_tags",
|
110
|
+
)
|
111
|
+
tag: ForeignKey[int, Tag] = ForeignKey(
|
112
|
+
Tag,
|
113
|
+
on_delete=CASCADE,
|
114
|
+
related_name="tag_todos",
|
115
|
+
)
|
116
|
+
|
117
|
+
class Meta:
|
118
|
+
unique_together = ("todo", "tag")
|
@@ -0,0 +1,10 @@
|
|
1
|
+
import os
|
2
|
+
|
3
|
+
# Import Django's ASGI handler
|
4
|
+
from django.core.asgi import get_asgi_application
|
5
|
+
|
6
|
+
# Configure Django settings module path
|
7
|
+
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "apps_config.settings")
|
8
|
+
|
9
|
+
# Create ASGI application instance
|
10
|
+
application = get_asgi_application()
|
@@ -0,0 +1,248 @@
|
|
1
|
+
import sys
|
2
|
+
from pathlib import Path
|
3
|
+
|
4
|
+
from env_config import env_settings
|
5
|
+
|
6
|
+
# Configuration Settings File for the django backend
|
7
|
+
# --------------------------------------------------
|
8
|
+
BASE_DIR = Path(__file__).resolve().parent.parent.parent
|
9
|
+
|
10
|
+
# Add `src` to PYTHONPATH so "djresttoolkit" is importable
|
11
|
+
# --------------------------------------------------------
|
12
|
+
SRC_DIR = BASE_DIR / "src"
|
13
|
+
sys.path.insert(0, str(SRC_DIR))
|
14
|
+
|
15
|
+
# Security Configuration Settings
|
16
|
+
# -------------------------------
|
17
|
+
SECRET_KEY = env_settings.secret_key
|
18
|
+
|
19
|
+
# DEBUG Configuration Settings
|
20
|
+
# ----------------------------
|
21
|
+
DEBUG = True
|
22
|
+
|
23
|
+
# Allowed Host Configuration Settings
|
24
|
+
# -----------------------------------
|
25
|
+
ALLOWED_HOSTS = env_settings.allowed_hosts
|
26
|
+
|
27
|
+
# Configure CORS Settings
|
28
|
+
# -----------------------
|
29
|
+
CORS_ALLOWED_ORIGINS = env_settings.cors_allowed_origins
|
30
|
+
|
31
|
+
# Login Redirect URL Configuration Setting
|
32
|
+
# ----------------------------------------
|
33
|
+
LOGIN_REDIRECT_URL = "/"
|
34
|
+
LOGOUT_REDIRECT_URL = LOGIN_REDIRECT_URL
|
35
|
+
|
36
|
+
# Django built-in applications settings
|
37
|
+
# -------------------------------------
|
38
|
+
INSTALLED_APPS = [
|
39
|
+
"daphne",
|
40
|
+
"django.contrib.admin",
|
41
|
+
"django.contrib.auth",
|
42
|
+
"django.contrib.contenttypes",
|
43
|
+
"django.contrib.sessions",
|
44
|
+
"django.contrib.messages",
|
45
|
+
"django.contrib.staticfiles",
|
46
|
+
]
|
47
|
+
|
48
|
+
# Third-party applications Settings
|
49
|
+
# ---------------------------------
|
50
|
+
INSTALLED_APPS.extend(
|
51
|
+
[
|
52
|
+
"rest_framework",
|
53
|
+
"rest_framework.authtoken",
|
54
|
+
"corsheaders",
|
55
|
+
]
|
56
|
+
)
|
57
|
+
|
58
|
+
# User Define applications Settings
|
59
|
+
# ---------------------------------
|
60
|
+
INSTALLED_APPS.extend(
|
61
|
+
[
|
62
|
+
"djresttoolkit",
|
63
|
+
"apps.todos.apps.TodosConfig",
|
64
|
+
]
|
65
|
+
)
|
66
|
+
|
67
|
+
# Middleware Configuration Settings
|
68
|
+
# ---------------------------------
|
69
|
+
MIDDLEWARE = [
|
70
|
+
"django.middleware.security.SecurityMiddleware",
|
71
|
+
"django.contrib.sessions.middleware.SessionMiddleware",
|
72
|
+
"corsheaders.middleware.CorsMiddleware",
|
73
|
+
"django.middleware.common.CommonMiddleware",
|
74
|
+
"django.middleware.csrf.CsrfViewMiddleware",
|
75
|
+
"django.contrib.auth.middleware.AuthenticationMiddleware",
|
76
|
+
"django.contrib.messages.middleware.MessageMiddleware",
|
77
|
+
"django.middleware.clickjacking.XFrameOptionsMiddleware",
|
78
|
+
"djresttoolkit.middlewares.ResponseTimeMiddleware",
|
79
|
+
]
|
80
|
+
|
81
|
+
# Root urls file Configuration Settings
|
82
|
+
# -------------------------------------
|
83
|
+
ROOT_URLCONF = "apps_config.urls"
|
84
|
+
|
85
|
+
# Templates Configuration Settings
|
86
|
+
# --------------------------------
|
87
|
+
TEMPLATES = [
|
88
|
+
{
|
89
|
+
"BACKEND": "django.template.backends.django.DjangoTemplates",
|
90
|
+
"DIRS": [BASE_DIR / "templates"],
|
91
|
+
"APP_DIRS": True,
|
92
|
+
"OPTIONS": {
|
93
|
+
"context_processors": [
|
94
|
+
"django.template.context_processors.debug",
|
95
|
+
"django.template.context_processors.request",
|
96
|
+
"django.contrib.auth.context_processors.auth",
|
97
|
+
"django.contrib.messages.context_processors.messages",
|
98
|
+
],
|
99
|
+
},
|
100
|
+
},
|
101
|
+
]
|
102
|
+
|
103
|
+
# Application Server Configuration Setting
|
104
|
+
# ----------------------------------------
|
105
|
+
ASGI_APPLICATION = "apps_config.asgi.application"
|
106
|
+
|
107
|
+
# User Model Configuration Setting
|
108
|
+
# --------------------------------
|
109
|
+
AUTH_USER_MODEL = "auth.User"
|
110
|
+
|
111
|
+
# Default primary key field type Configuration Setting
|
112
|
+
# ----------------------------------------------------
|
113
|
+
DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField"
|
114
|
+
|
115
|
+
# SQLite Database Configuration for development environment
|
116
|
+
# ---------------------------------------------------------
|
117
|
+
DATABASES: dict[str, dict[str, object]] = {
|
118
|
+
"default": {
|
119
|
+
"ENGINE": "django.db.backends.sqlite3",
|
120
|
+
"NAME": BASE_DIR / "demo" / "db.sqlite3",
|
121
|
+
}
|
122
|
+
}
|
123
|
+
|
124
|
+
# Password Validators Configuration Settings
|
125
|
+
# ------------------------------------------
|
126
|
+
AUTH_PASSWORD_VALIDATORS = [
|
127
|
+
{
|
128
|
+
"NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator"
|
129
|
+
},
|
130
|
+
{"NAME": "django.contrib.auth.password_validation.MinimumLengthValidator"},
|
131
|
+
{"NAME": "django.contrib.auth.password_validation.CommonPasswordValidator"},
|
132
|
+
{"NAME": "django.contrib.auth.password_validation.NumericPasswordValidator"},
|
133
|
+
]
|
134
|
+
|
135
|
+
# Password hashing algorithms in order of preference
|
136
|
+
# Using multiple algorithms provides additional security layers
|
137
|
+
# -------------------------------------------------------------
|
138
|
+
PASSWORD_HASHERS = [
|
139
|
+
"django.contrib.auth.hashers.PBKDF2PasswordHasher",
|
140
|
+
"django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher",
|
141
|
+
"django.contrib.auth.hashers.BCryptSHA256PasswordHasher",
|
142
|
+
"django.contrib.auth.hashers.ScryptPasswordHasher",
|
143
|
+
"django.contrib.auth.hashers.Argon2PasswordHasher",
|
144
|
+
]
|
145
|
+
|
146
|
+
# Internationalization Configuration Settings
|
147
|
+
# -------------------------------------------
|
148
|
+
LANGUAGE_CODE = "en-us"
|
149
|
+
TIME_ZONE = "UTC"
|
150
|
+
USE_I18N = True
|
151
|
+
USE_TZ = True
|
152
|
+
|
153
|
+
# Static files (CSS, JavaScript, Images)
|
154
|
+
# STATIC AND MEDIA FILES Configuration Settings
|
155
|
+
# ---------------------------------------------
|
156
|
+
STATIC_URL = "/demo/static/"
|
157
|
+
STATIC_ROOT = BASE_DIR / "demo" / "staticfiles"
|
158
|
+
STATICFILES_DIRS = [BASE_DIR / "demo" / "static"]
|
159
|
+
|
160
|
+
# Configure media files (User-uploaded files)
|
161
|
+
# -------------------------------------------
|
162
|
+
MEDIA_ROOT = BASE_DIR / "uploads"
|
163
|
+
MEDIA_URL = "/media/"
|
164
|
+
|
165
|
+
# REST Framework Configuration Settings
|
166
|
+
# -------------------------------------
|
167
|
+
REST_FRAMEWORK = {
|
168
|
+
"NON_FIELD_ERRORS_KEY": "non_field",
|
169
|
+
"DEFAULT_AUTHENTICATION_CLASSES": [
|
170
|
+
"rest_framework.authentication.TokenAuthentication",
|
171
|
+
],
|
172
|
+
"DEFAULT_PERMISSION_CLASSES": [
|
173
|
+
"rest_framework.permissions.IsAuthenticated",
|
174
|
+
],
|
175
|
+
"DEFAULT_PARSER_CLASSES": [
|
176
|
+
"rest_framework.parsers.JSONParser",
|
177
|
+
"rest_framework.parsers.MultiPartParser",
|
178
|
+
],
|
179
|
+
"DEFAULT_RENDERER_CLASSES": [
|
180
|
+
"djresttoolkit.renderers.ThrottleInfoJSONRenderer",
|
181
|
+
"rest_framework.renderers.BrowsableAPIRenderer",
|
182
|
+
],
|
183
|
+
"DEFAULT_THROTTLE_CLASSES": [
|
184
|
+
"rest_framework.throttling.AnonRateThrottle",
|
185
|
+
],
|
186
|
+
"DEFAULT_THROTTLE_RATES": {
|
187
|
+
"anon": "100/day",
|
188
|
+
"user": "1000/day",
|
189
|
+
},
|
190
|
+
"DEFAULT_FILTER_BACKENDS": [
|
191
|
+
"django_filters.rest_framework.DjangoFilterBackend",
|
192
|
+
],
|
193
|
+
"EXCEPTION_HANDLER": "djresttoolkit.views.exception_handler",
|
194
|
+
"DEFAULT_PAGINATION_CLASS": "rest_framework.pagination.PageNumberPagination",
|
195
|
+
"PAGE_SIZE": 4,
|
196
|
+
"MAX_PAGE_SIZE": 8,
|
197
|
+
}
|
198
|
+
|
199
|
+
# Authentication Configuration Settings
|
200
|
+
# -------------------------------------
|
201
|
+
AUTHENTICATION_BACKENDS = ["django.contrib.auth.backends.ModelBackend"]
|
202
|
+
|
203
|
+
# EMAIL Configuration Settings
|
204
|
+
# ----------------------------
|
205
|
+
EMAIL_BACKEND = env_settings.email.backend # type: ignore[]
|
206
|
+
EMAIL_HOST = env_settings.email.host
|
207
|
+
EMAIL_PORT = env_settings.email.port
|
208
|
+
EMAIL_USE_TLS = env_settings.email.use_tls
|
209
|
+
EMAIL_USE_SSL = env_settings.email.use_ssl
|
210
|
+
EMAIL_HOST_USER = env_settings.email.host_user
|
211
|
+
EMAIL_HOST_PASSWORD = env_settings.email.host_password
|
212
|
+
DEFAULT_FROM_EMAIL = env_settings.email.default_from_email
|
213
|
+
|
214
|
+
# Google OAuth2 Configuration Settings
|
215
|
+
# ------------------------------------
|
216
|
+
GOOGLE_CLIENT_ID = env_settings.google.client_id
|
217
|
+
GOOGLE_CLIENT_SECRET = env_settings.google.client_secret
|
218
|
+
GOOGLE_REDIRECT_URI = env_settings.google.redirect_url
|
219
|
+
|
220
|
+
# Redis configuration for production
|
221
|
+
# ----------------------------------
|
222
|
+
CACHES = {
|
223
|
+
"default": {
|
224
|
+
"BACKEND": "django_redis.cache.RedisCache",
|
225
|
+
"LOCATION": env_settings.redis.cache_location,
|
226
|
+
"OPTIONS": {
|
227
|
+
"CLIENT_CLASS": "django_redis.client.DefaultClient",
|
228
|
+
},
|
229
|
+
}
|
230
|
+
}
|
231
|
+
|
232
|
+
# Celery Configuration Settings
|
233
|
+
# -----------------------------
|
234
|
+
# Redis as broker
|
235
|
+
CELERY_BROKER_URL = "redis://localhost:6379/0"
|
236
|
+
|
237
|
+
# Where results are stored
|
238
|
+
CELERY_RESULT_BACKEND = "redis://localhost:6379/0"
|
239
|
+
|
240
|
+
# Recommended settings
|
241
|
+
CELERY_ACCEPT_CONTENT = ["json"]
|
242
|
+
CELERY_TASK_SERIALIZER = "json"
|
243
|
+
CELERY_RESULT_SERIALIZER = "json"
|
244
|
+
CELERY_TIMEZONE = TIME_ZONE
|
245
|
+
|
246
|
+
# Task time limits (avoid runaway tasks)
|
247
|
+
CELERY_TASK_TIME_LIMIT = 30 * 60 # 30 mins
|
248
|
+
CELERY_TASK_SOFT_TIME_LIMIT = 25 * 60
|