djresttoolkit 0.16.1__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.16.1 → djresttoolkit-0.17.1}/PKG-INFO +91 -14
- {djresttoolkit-0.16.1 → djresttoolkit-0.17.1}/README.md +90 -13
- 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.16.1 → 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/src/djresttoolkit/views/mixins/__init__.py +16 -0
- djresttoolkit-0.17.1/src/djresttoolkit/views/mixins/_cache_action_mixin.py +44 -0
- djresttoolkit-0.17.1/src/djresttoolkit/views/mixins/_cache_invalidate_mixin.py +38 -0
- djresttoolkit-0.17.1/src/djresttoolkit/views/mixins/_cache_key_mixin.py +33 -0
- djresttoolkit-0.17.1/src/djresttoolkit/views/mixins/_cache_list_retrieve_mixin.py +57 -0
- djresttoolkit-0.17.1/src/djresttoolkit/views/mixins/_cache_ops_mixin.py +47 -0
- djresttoolkit-0.17.1/uv.lock +864 -0
- djresttoolkit-0.16.1/src/djresttoolkit/views/mixins/__init__.py +0 -6
- {djresttoolkit-0.16.1 → djresttoolkit-0.17.1}/.gitignore +0 -0
- {djresttoolkit-0.16.1 → djresttoolkit-0.17.1}/LICENSE +0 -0
- {djresttoolkit-0.16.1/src/djresttoolkit → djresttoolkit-0.17.1/demo/apps/todos}/__init__.py +0 -0
- {djresttoolkit-0.16.1/src/djresttoolkit → djresttoolkit-0.17.1/demo/apps/todos}/dbseed/__init__.py +0 -0
- {djresttoolkit-0.16.1/src/djresttoolkit/management → djresttoolkit-0.17.1/demo/apps/todos/migrations}/__init__.py +0 -0
- /djresttoolkit-0.16.1/src/djresttoolkit/admin.py → /djresttoolkit-0.17.1/demo/apps/todos/views.py +0 -0
- {djresttoolkit-0.16.1/src/djresttoolkit/management/commands → djresttoolkit-0.17.1/demo/apps_config}/__init__.py +0 -0
- {djresttoolkit-0.16.1 → djresttoolkit-0.17.1}/demo/staticfiles/admin/img/LICENSE +0 -0
- {djresttoolkit-0.16.1/src/djresttoolkit/migrations → djresttoolkit-0.17.1/src/djresttoolkit}/__init__.py +0 -0
- /djresttoolkit-0.16.1/src/djresttoolkit/models/__init__.py → /djresttoolkit-0.17.1/src/djresttoolkit/admin.py +0 -0
- {djresttoolkit-0.16.1 → djresttoolkit-0.17.1}/src/djresttoolkit/apps.py +0 -0
- {djresttoolkit-0.16.1/src/djresttoolkit/serializers → djresttoolkit-0.17.1/src/djresttoolkit/dbseed}/__init__.py +0 -0
- {djresttoolkit-0.16.1 → djresttoolkit-0.17.1}/src/djresttoolkit/dbseed/models/__init__.py +0 -0
- {djresttoolkit-0.16.1 → djresttoolkit-0.17.1}/src/djresttoolkit/dbseed/models/_choice_field.py +0 -0
- {djresttoolkit-0.16.1 → djresttoolkit-0.17.1}/src/djresttoolkit/dbseed/models/_gen.py +0 -0
- {djresttoolkit-0.16.1 → djresttoolkit-0.17.1}/src/djresttoolkit/dbseed/models/_seed_model.py +0 -0
- {djresttoolkit-0.16.1 → djresttoolkit-0.17.1}/src/djresttoolkit/envconfig/__init__.py +0 -0
- {djresttoolkit-0.16.1 → djresttoolkit-0.17.1}/src/djresttoolkit/envconfig/_env_settings.py +0 -0
- {djresttoolkit-0.16.1 → djresttoolkit-0.17.1}/src/djresttoolkit/mail/__init__.py +0 -0
- {djresttoolkit-0.16.1 → djresttoolkit-0.17.1}/src/djresttoolkit/mail/_email_sender.py +0 -0
- {djresttoolkit-0.16.1 → djresttoolkit-0.17.1}/src/djresttoolkit/mail/_models.py +0 -0
- {djresttoolkit-0.16.1 → djresttoolkit-0.17.1}/src/djresttoolkit/mail/_types.py +0 -0
- {djresttoolkit-0.16.1/src/djresttoolkit/views/_api_views → djresttoolkit-0.17.1/src/djresttoolkit/management}/__init__.py +0 -0
- /djresttoolkit-0.16.1/src/djresttoolkit/py.typed → /djresttoolkit-0.17.1/src/djresttoolkit/management/commands/__init__.py +0 -0
- {djresttoolkit-0.16.1 → djresttoolkit-0.17.1}/src/djresttoolkit/management/commands/dbflush.py +0 -0
- {djresttoolkit-0.16.1 → djresttoolkit-0.17.1}/src/djresttoolkit/management/commands/dbseed.py +0 -0
- {djresttoolkit-0.16.1 → djresttoolkit-0.17.1}/src/djresttoolkit/middlewares/__init__.py +0 -0
- {djresttoolkit-0.16.1 → djresttoolkit-0.17.1}/src/djresttoolkit/middlewares/_response_time_middleware.py +0 -0
- {djresttoolkit-0.16.1 → djresttoolkit-0.17.1}/src/djresttoolkit/models/mixins/__init__.py +0 -0
- {djresttoolkit-0.16.1 → djresttoolkit-0.17.1}/src/djresttoolkit/models/mixins/_model_choice_fields_mixin.py +0 -0
- {djresttoolkit-0.16.1 → djresttoolkit-0.17.1}/src/djresttoolkit/pagination/__init__.py +0 -0
- {djresttoolkit-0.16.1 → djresttoolkit-0.17.1}/src/djresttoolkit/pagination/_page_number_pagination.py +0 -0
- {djresttoolkit-0.16.1 → djresttoolkit-0.17.1}/src/djresttoolkit/pagination/_paginated_data_builder.py +0 -0
- {djresttoolkit-0.16.1 → djresttoolkit-0.17.1}/src/djresttoolkit/renderers/__init__.py +0 -0
- {djresttoolkit-0.16.1 → djresttoolkit-0.17.1}/src/djresttoolkit/renderers/_throttle_info_json_renderer.py +0 -0
- {djresttoolkit-0.16.1 → djresttoolkit-0.17.1}/src/djresttoolkit/serializers/mixins/__init__.py +0 -0
- {djresttoolkit-0.16.1 → djresttoolkit-0.17.1}/src/djresttoolkit/serializers/mixins/_absolute_url_file_mixin.py +0 -0
- {djresttoolkit-0.16.1 → djresttoolkit-0.17.1}/src/djresttoolkit/serializers/mixins/_bulk_create_mixin.py +0 -0
- {djresttoolkit-0.16.1 → djresttoolkit-0.17.1}/src/djresttoolkit/throttling/__init__.py +0 -0
- {djresttoolkit-0.16.1 → djresttoolkit-0.17.1}/src/djresttoolkit/throttling/_throttle_inspector.py +0 -0
- {djresttoolkit-0.16.1 → djresttoolkit-0.17.1}/src/djresttoolkit/urls/__init__.py +0 -0
- {djresttoolkit-0.16.1 → djresttoolkit-0.17.1}/src/djresttoolkit/urls/_build_absolute_uri.py +0 -0
- {djresttoolkit-0.16.1 → djresttoolkit-0.17.1}/src/djresttoolkit/views/__init__.py +0 -0
- {djresttoolkit-0.16.1 → djresttoolkit-0.17.1}/src/djresttoolkit/views/_api_views/_choice_fields_apiview.py +0 -0
- {djresttoolkit-0.16.1 → djresttoolkit-0.17.1}/src/djresttoolkit/views/_exceptions/__init__.py +0 -0
- {djresttoolkit-0.16.1 → djresttoolkit-0.17.1}/src/djresttoolkit/views/_exceptions/_exception_handler.py +0 -0
- {djresttoolkit-0.16.1 → 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.
|
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
|
@@ -112,6 +112,9 @@ djresttoolkit is a collection of utilities and helpers for Django and Django RES
|
|
112
112
|
- **PaginatedDataBuilder**
|
113
113
|
Builder that combines `PageNumberPagination` + serializers to return standardized paginated responses with `"page"` + `"results"`.
|
114
114
|
|
115
|
+
- **Caching Mixins**
|
116
|
+
This module provides a set of DRF mixins to handle caching for `list`, `retrieve`, and `custom actions` with automatic invalidation on create, update, and destroy.
|
117
|
+
|
115
118
|
## 📦 Installation
|
116
119
|
|
117
120
|
- **By using uv:**
|
@@ -312,7 +315,7 @@ print(settings.database_url)
|
|
312
315
|
#### Features
|
313
316
|
|
314
317
|
- Prioritizes `.env` variables over YAML.
|
315
|
-
- Supports nested keys: `DATABASE__HOST
|
318
|
+
- Supports nested keys: `DATABASE__HOST`:- `settings.database.host`.
|
316
319
|
- Designed to be subclassed for project-specific settings.
|
317
320
|
|
318
321
|
### 4. EmailSender — API Reference
|
@@ -928,17 +931,17 @@ from djresttoolkit.pagination import PageNumberPagination
|
|
928
931
|
- Clients can control items per page using `?page-size=`.
|
929
932
|
- Structured pagination metadata:
|
930
933
|
|
931
|
-
- `current
|
932
|
-
- `total
|
933
|
-
- `size
|
934
|
-
- `total_items
|
935
|
-
- `next
|
936
|
-
- `previous
|
934
|
+
- `current`:- current page number
|
935
|
+
- `total`:- total number of pages
|
936
|
+
- `size`:- number of items per page
|
937
|
+
- `total_items`:- total number of items across all pages
|
938
|
+
- `next`:- next page URL
|
939
|
+
- `previous`:- previous page URL
|
937
940
|
- Standardized API response format.
|
938
941
|
|
939
942
|
### Attributes of Page Number Pagination
|
940
943
|
|
941
|
-
- `page_size_query_param: str
|
944
|
+
- `page_size_query_param: str`:- Query parameter name (`"page-size"`).
|
942
945
|
|
943
946
|
### Page Number Pagination Methods
|
944
947
|
|
@@ -983,8 +986,8 @@ from djresttoolkit.pagination import PaginatedDataBuilder
|
|
983
986
|
- Integrates with **DRF serializers**.
|
984
987
|
- Handles **invalid pages** gracefully by raising `NotFound`.
|
985
988
|
- Returns both:
|
986
|
-
- `"page"
|
987
|
-
- `"results"
|
989
|
+
- `"page"`:- pagination metadata
|
990
|
+
- `"results"`:- serialized data.
|
988
991
|
- Provides **structured pagination response format**.
|
989
992
|
|
990
993
|
---
|
@@ -999,9 +1002,9 @@ builder = PaginatedDataBuilder(
|
|
999
1002
|
)
|
1000
1003
|
```
|
1001
1004
|
|
1002
|
-
- `request: Request
|
1003
|
-
- `serializer_class: type[BaseSerializer]
|
1004
|
-
- `queryset: QuerySet
|
1005
|
+
- `request: Request`:- DRF request object.
|
1006
|
+
- `serializer_class: type[BaseSerializer]`:- DRF serializer class for the model.
|
1007
|
+
- `queryset: QuerySet`:- Django queryset to paginate.
|
1005
1008
|
|
1006
1009
|
### Paginated Data Builder Methods
|
1007
1010
|
|
@@ -1031,6 +1034,80 @@ builder = PaginatedDataBuilder(
|
|
1031
1034
|
}
|
1032
1035
|
```
|
1033
1036
|
|
1037
|
+
### 16. Caching Mixins — API Reference
|
1038
|
+
|
1039
|
+
This module provides a set of DRF mixins to handle **caching for list, retrieve, and custom actions** with automatic invalidation on create, update, and destroy.
|
1040
|
+
|
1041
|
+
#### 1️ `CacheKeyMixin`
|
1042
|
+
|
1043
|
+
- **Purpose**: Generate unique cache keys for DRF viewset actions.
|
1044
|
+
- **Attributes**:
|
1045
|
+
- `cache_timeout: int = 300`:- default cache duration in seconds.
|
1046
|
+
- **Methods**:
|
1047
|
+
- `get_cache_timeout()`:- returns the cache timeout.
|
1048
|
+
- `get_cache_key(action_type, pk=None, action_name=None)`:- returns a cache key string based on action type:**
|
1049
|
+
- `list` or `custom-list`:- hash of query parameters.
|
1050
|
+
- `retrieve` or `custom-detail`:- uses primary key (`pk`).
|
1051
|
+
|
1052
|
+
#### 2️ `CacheOpsMixin`
|
1053
|
+
|
1054
|
+
- **Purpose**: Get, set, and invalidate cache.
|
1055
|
+
- **Methods**:
|
1056
|
+
- `get_or_set_cache(cache_key, data_fn, timeout=None)`:- fetch from cache or compute and set.
|
1057
|
+
- `invalidate_cache(pk=None, custom_actions=None)`:- delete cached items:
|
1058
|
+
- Deletes retrieve/detail caches for a `pk`.
|
1059
|
+
- Deletes list caches (supports `delete_pattern` if available).
|
1060
|
+
|
1061
|
+
#### 3️ `CacheActionMixin`
|
1062
|
+
|
1063
|
+
- **Purpose**: Decorator for caching custom DRF `@action` methods.
|
1064
|
+
- **Methods**:
|
1065
|
+
- `cache_action(detail=False, action_name=None)`:- returns a decorator that caches action results automatically.
|
1066
|
+
- Works for:
|
1067
|
+
- `detail=False`:- custom-list action cache.
|
1068
|
+
- `detail=True`:- custom-detail action cache.
|
1069
|
+
|
1070
|
+
#### 4️ `CacheListRetrieveMixin`
|
1071
|
+
|
1072
|
+
- **Purpose**: Caches DRF `list()` and `retrieve()` responses.
|
1073
|
+
- **Methods**:
|
1074
|
+
- `list(request, *args, **kwargs)`:- caches list responses.
|
1075
|
+
- `retrieve(request, *args, **kwargs)`:- caches detail responses.
|
1076
|
+
- `_get_list_data(request)`:- internal method to fetch paginated list data.
|
1077
|
+
- `_get_detail_data()`:- internal method to fetch a single object.
|
1078
|
+
|
1079
|
+
#### 5️ `CacheInvalidateMixin`
|
1080
|
+
|
1081
|
+
- **Purpose**: Automatically invalidates caches on write operations.
|
1082
|
+
- **Methods**:
|
1083
|
+
- `create(request, *args, **kwargs)`:- invalidates list caches.
|
1084
|
+
- `update(request, *args, **kwargs)`:- invalidates detail caches for `pk`.
|
1085
|
+
- `destroy(request, *args, **kwargs)`:- invalidates detail caches for `pk`.
|
1086
|
+
|
1087
|
+
#### Example of Caching Mixins
|
1088
|
+
|
1089
|
+
```python
|
1090
|
+
from rest_framework.viewsets import ModelViewSet
|
1091
|
+
from myapp.models import Book
|
1092
|
+
from myapp.serializers import BookSerializer
|
1093
|
+
from djresttoolkit.cache_mixins import CacheInvalidateMixin, CacheActionMixin
|
1094
|
+
|
1095
|
+
class BookViewSet(CacheInvalidateMixin, ModelViewSet):
|
1096
|
+
queryset = Book.objects.all()
|
1097
|
+
serializer_class = BookSerializer
|
1098
|
+
basename = "book"
|
1099
|
+
|
1100
|
+
@CacheActionMixin.cache_action(detail=False)
|
1101
|
+
def popular(self, request):
|
1102
|
+
data = Book.objects.filter(is_popular=True)
|
1103
|
+
serializer = self.get_serializer(data, many=True)
|
1104
|
+
return Response(serializer.data)
|
1105
|
+
```
|
1106
|
+
|
1107
|
+
- Automatically caches `list`, `retrieve`, and `popular` actions.
|
1108
|
+
- Invalidates caches when books are created, updated, or deleted.
|
1109
|
+
- Supports custom cache keys per action.
|
1110
|
+
|
1034
1111
|
## 🛠️ Planned Features
|
1035
1112
|
|
1036
1113
|
- Add more utils
|
@@ -54,6 +54,9 @@ djresttoolkit is a collection of utilities and helpers for Django and Django RES
|
|
54
54
|
- **PaginatedDataBuilder**
|
55
55
|
Builder that combines `PageNumberPagination` + serializers to return standardized paginated responses with `"page"` + `"results"`.
|
56
56
|
|
57
|
+
- **Caching Mixins**
|
58
|
+
This module provides a set of DRF mixins to handle caching for `list`, `retrieve`, and `custom actions` with automatic invalidation on create, update, and destroy.
|
59
|
+
|
57
60
|
## 📦 Installation
|
58
61
|
|
59
62
|
- **By using uv:**
|
@@ -254,7 +257,7 @@ print(settings.database_url)
|
|
254
257
|
#### Features
|
255
258
|
|
256
259
|
- Prioritizes `.env` variables over YAML.
|
257
|
-
- Supports nested keys: `DATABASE__HOST
|
260
|
+
- Supports nested keys: `DATABASE__HOST`:- `settings.database.host`.
|
258
261
|
- Designed to be subclassed for project-specific settings.
|
259
262
|
|
260
263
|
### 4. EmailSender — API Reference
|
@@ -870,17 +873,17 @@ from djresttoolkit.pagination import PageNumberPagination
|
|
870
873
|
- Clients can control items per page using `?page-size=`.
|
871
874
|
- Structured pagination metadata:
|
872
875
|
|
873
|
-
- `current
|
874
|
-
- `total
|
875
|
-
- `size
|
876
|
-
- `total_items
|
877
|
-
- `next
|
878
|
-
- `previous
|
876
|
+
- `current`:- current page number
|
877
|
+
- `total`:- total number of pages
|
878
|
+
- `size`:- number of items per page
|
879
|
+
- `total_items`:- total number of items across all pages
|
880
|
+
- `next`:- next page URL
|
881
|
+
- `previous`:- previous page URL
|
879
882
|
- Standardized API response format.
|
880
883
|
|
881
884
|
### Attributes of Page Number Pagination
|
882
885
|
|
883
|
-
- `page_size_query_param: str
|
886
|
+
- `page_size_query_param: str`:- Query parameter name (`"page-size"`).
|
884
887
|
|
885
888
|
### Page Number Pagination Methods
|
886
889
|
|
@@ -925,8 +928,8 @@ from djresttoolkit.pagination import PaginatedDataBuilder
|
|
925
928
|
- Integrates with **DRF serializers**.
|
926
929
|
- Handles **invalid pages** gracefully by raising `NotFound`.
|
927
930
|
- Returns both:
|
928
|
-
- `"page"
|
929
|
-
- `"results"
|
931
|
+
- `"page"`:- pagination metadata
|
932
|
+
- `"results"`:- serialized data.
|
930
933
|
- Provides **structured pagination response format**.
|
931
934
|
|
932
935
|
---
|
@@ -941,9 +944,9 @@ builder = PaginatedDataBuilder(
|
|
941
944
|
)
|
942
945
|
```
|
943
946
|
|
944
|
-
- `request: Request
|
945
|
-
- `serializer_class: type[BaseSerializer]
|
946
|
-
- `queryset: QuerySet
|
947
|
+
- `request: Request`:- DRF request object.
|
948
|
+
- `serializer_class: type[BaseSerializer]`:- DRF serializer class for the model.
|
949
|
+
- `queryset: QuerySet`:- Django queryset to paginate.
|
947
950
|
|
948
951
|
### Paginated Data Builder Methods
|
949
952
|
|
@@ -973,6 +976,80 @@ builder = PaginatedDataBuilder(
|
|
973
976
|
}
|
974
977
|
```
|
975
978
|
|
979
|
+
### 16. Caching Mixins — API Reference
|
980
|
+
|
981
|
+
This module provides a set of DRF mixins to handle **caching for list, retrieve, and custom actions** with automatic invalidation on create, update, and destroy.
|
982
|
+
|
983
|
+
#### 1️ `CacheKeyMixin`
|
984
|
+
|
985
|
+
- **Purpose**: Generate unique cache keys for DRF viewset actions.
|
986
|
+
- **Attributes**:
|
987
|
+
- `cache_timeout: int = 300`:- default cache duration in seconds.
|
988
|
+
- **Methods**:
|
989
|
+
- `get_cache_timeout()`:- returns the cache timeout.
|
990
|
+
- `get_cache_key(action_type, pk=None, action_name=None)`:- returns a cache key string based on action type:**
|
991
|
+
- `list` or `custom-list`:- hash of query parameters.
|
992
|
+
- `retrieve` or `custom-detail`:- uses primary key (`pk`).
|
993
|
+
|
994
|
+
#### 2️ `CacheOpsMixin`
|
995
|
+
|
996
|
+
- **Purpose**: Get, set, and invalidate cache.
|
997
|
+
- **Methods**:
|
998
|
+
- `get_or_set_cache(cache_key, data_fn, timeout=None)`:- fetch from cache or compute and set.
|
999
|
+
- `invalidate_cache(pk=None, custom_actions=None)`:- delete cached items:
|
1000
|
+
- Deletes retrieve/detail caches for a `pk`.
|
1001
|
+
- Deletes list caches (supports `delete_pattern` if available).
|
1002
|
+
|
1003
|
+
#### 3️ `CacheActionMixin`
|
1004
|
+
|
1005
|
+
- **Purpose**: Decorator for caching custom DRF `@action` methods.
|
1006
|
+
- **Methods**:
|
1007
|
+
- `cache_action(detail=False, action_name=None)`:- returns a decorator that caches action results automatically.
|
1008
|
+
- Works for:
|
1009
|
+
- `detail=False`:- custom-list action cache.
|
1010
|
+
- `detail=True`:- custom-detail action cache.
|
1011
|
+
|
1012
|
+
#### 4️ `CacheListRetrieveMixin`
|
1013
|
+
|
1014
|
+
- **Purpose**: Caches DRF `list()` and `retrieve()` responses.
|
1015
|
+
- **Methods**:
|
1016
|
+
- `list(request, *args, **kwargs)`:- caches list responses.
|
1017
|
+
- `retrieve(request, *args, **kwargs)`:- caches detail responses.
|
1018
|
+
- `_get_list_data(request)`:- internal method to fetch paginated list data.
|
1019
|
+
- `_get_detail_data()`:- internal method to fetch a single object.
|
1020
|
+
|
1021
|
+
#### 5️ `CacheInvalidateMixin`
|
1022
|
+
|
1023
|
+
- **Purpose**: Automatically invalidates caches on write operations.
|
1024
|
+
- **Methods**:
|
1025
|
+
- `create(request, *args, **kwargs)`:- invalidates list caches.
|
1026
|
+
- `update(request, *args, **kwargs)`:- invalidates detail caches for `pk`.
|
1027
|
+
- `destroy(request, *args, **kwargs)`:- invalidates detail caches for `pk`.
|
1028
|
+
|
1029
|
+
#### Example of Caching Mixins
|
1030
|
+
|
1031
|
+
```python
|
1032
|
+
from rest_framework.viewsets import ModelViewSet
|
1033
|
+
from myapp.models import Book
|
1034
|
+
from myapp.serializers import BookSerializer
|
1035
|
+
from djresttoolkit.cache_mixins import CacheInvalidateMixin, CacheActionMixin
|
1036
|
+
|
1037
|
+
class BookViewSet(CacheInvalidateMixin, ModelViewSet):
|
1038
|
+
queryset = Book.objects.all()
|
1039
|
+
serializer_class = BookSerializer
|
1040
|
+
basename = "book"
|
1041
|
+
|
1042
|
+
@CacheActionMixin.cache_action(detail=False)
|
1043
|
+
def popular(self, request):
|
1044
|
+
data = Book.objects.filter(is_popular=True)
|
1045
|
+
serializer = self.get_serializer(data, many=True)
|
1046
|
+
return Response(serializer.data)
|
1047
|
+
```
|
1048
|
+
|
1049
|
+
- Automatically caches `list`, `retrieve`, and `popular` actions.
|
1050
|
+
- Invalidates caches when books are created, updated, or deleted.
|
1051
|
+
- Supports custom cache keys per action.
|
1052
|
+
|
976
1053
|
## 🛠️ Planned Features
|
977
1054
|
|
978
1055
|
- Add more utils
|
@@ -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
|
+
]
|