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.
Files changed (245) hide show
  1. djresttoolkit-0.17.1/.python-version +1 -0
  2. djresttoolkit-0.17.1/.vscode/settings.json +12 -0
  3. {djresttoolkit-0.16.1 → djresttoolkit-0.17.1}/PKG-INFO +91 -14
  4. {djresttoolkit-0.16.1 → djresttoolkit-0.17.1}/README.md +90 -13
  5. djresttoolkit-0.17.1/demo/apps/todos/admin.py +48 -0
  6. djresttoolkit-0.17.1/demo/apps/todos/apps.py +7 -0
  7. djresttoolkit-0.17.1/demo/apps/todos/dbseed/tag_seed.py +13 -0
  8. djresttoolkit-0.17.1/demo/apps/todos/dbseed/todo_seed.py +44 -0
  9. djresttoolkit-0.17.1/demo/apps/todos/dbseed/todo_tag_seed.py +22 -0
  10. djresttoolkit-0.17.1/demo/apps/todos/migrations/0001_initial.py +131 -0
  11. djresttoolkit-0.17.1/demo/apps/todos/models.py +118 -0
  12. djresttoolkit-0.17.1/demo/apps/todos/tests.py +3 -0
  13. djresttoolkit-0.17.1/demo/apps/todos/urls.py +7 -0
  14. djresttoolkit-0.17.1/demo/apps_config/asgi.py +10 -0
  15. djresttoolkit-0.17.1/demo/apps_config/serializers.py +7 -0
  16. djresttoolkit-0.17.1/demo/apps_config/settings.py +248 -0
  17. djresttoolkit-0.17.1/demo/apps_config/urls.py +17 -0
  18. djresttoolkit-0.17.1/demo/apps_config/views.py +40 -0
  19. djresttoolkit-0.17.1/demo/apps_config/wsgi.py +9 -0
  20. djresttoolkit-0.17.1/demo/env_config/__init__.py +3 -0
  21. djresttoolkit-0.17.1/demo/env_config/env_settings.py +54 -0
  22. djresttoolkit-0.17.1/demo/manage.py +22 -0
  23. djresttoolkit-0.17.1/demo/staticfiles/admin/css/autocomplete.css +279 -0
  24. djresttoolkit-0.17.1/demo/staticfiles/admin/css/base.css +1180 -0
  25. djresttoolkit-0.17.1/demo/staticfiles/admin/css/changelists.css +343 -0
  26. djresttoolkit-0.17.1/demo/staticfiles/admin/css/dark_mode.css +130 -0
  27. djresttoolkit-0.17.1/demo/staticfiles/admin/css/dashboard.css +29 -0
  28. djresttoolkit-0.17.1/demo/staticfiles/admin/css/forms.css +498 -0
  29. djresttoolkit-0.17.1/demo/staticfiles/admin/css/login.css +61 -0
  30. djresttoolkit-0.17.1/demo/staticfiles/admin/css/nav_sidebar.css +150 -0
  31. djresttoolkit-0.17.1/demo/staticfiles/admin/css/responsive.css +904 -0
  32. djresttoolkit-0.17.1/demo/staticfiles/admin/css/responsive_rtl.css +89 -0
  33. djresttoolkit-0.17.1/demo/staticfiles/admin/css/rtl.css +293 -0
  34. djresttoolkit-0.17.1/demo/staticfiles/admin/css/unusable_password_field.css +19 -0
  35. djresttoolkit-0.17.1/demo/staticfiles/admin/css/vendor/select2/LICENSE-SELECT2.md +21 -0
  36. djresttoolkit-0.17.1/demo/staticfiles/admin/css/vendor/select2/select2.css +481 -0
  37. djresttoolkit-0.17.1/demo/staticfiles/admin/css/vendor/select2/select2.min.css +1 -0
  38. djresttoolkit-0.17.1/demo/staticfiles/admin/css/widgets.css +613 -0
  39. djresttoolkit-0.17.1/demo/staticfiles/admin/img/README.txt +7 -0
  40. djresttoolkit-0.17.1/demo/staticfiles/admin/img/calendar-icons.svg +63 -0
  41. djresttoolkit-0.17.1/demo/staticfiles/admin/img/gis/move_vertex_off.svg +1 -0
  42. djresttoolkit-0.17.1/demo/staticfiles/admin/img/gis/move_vertex_on.svg +1 -0
  43. djresttoolkit-0.17.1/demo/staticfiles/admin/img/icon-addlink.svg +3 -0
  44. djresttoolkit-0.17.1/demo/staticfiles/admin/img/icon-alert.svg +3 -0
  45. djresttoolkit-0.17.1/demo/staticfiles/admin/img/icon-calendar.svg +9 -0
  46. djresttoolkit-0.17.1/demo/staticfiles/admin/img/icon-changelink.svg +3 -0
  47. djresttoolkit-0.17.1/demo/staticfiles/admin/img/icon-clock.svg +9 -0
  48. djresttoolkit-0.17.1/demo/staticfiles/admin/img/icon-deletelink.svg +3 -0
  49. djresttoolkit-0.17.1/demo/staticfiles/admin/img/icon-hidelink.svg +3 -0
  50. djresttoolkit-0.17.1/demo/staticfiles/admin/img/icon-no.svg +3 -0
  51. djresttoolkit-0.17.1/demo/staticfiles/admin/img/icon-unknown-alt.svg +3 -0
  52. djresttoolkit-0.17.1/demo/staticfiles/admin/img/icon-unknown.svg +3 -0
  53. djresttoolkit-0.17.1/demo/staticfiles/admin/img/icon-viewlink.svg +3 -0
  54. djresttoolkit-0.17.1/demo/staticfiles/admin/img/icon-yes.svg +3 -0
  55. djresttoolkit-0.17.1/demo/staticfiles/admin/img/inline-delete.svg +3 -0
  56. djresttoolkit-0.17.1/demo/staticfiles/admin/img/search.svg +3 -0
  57. djresttoolkit-0.17.1/demo/staticfiles/admin/img/selector-icons.svg +34 -0
  58. djresttoolkit-0.17.1/demo/staticfiles/admin/img/sorting-icons.svg +19 -0
  59. djresttoolkit-0.17.1/demo/staticfiles/admin/img/tooltag-add.svg +3 -0
  60. djresttoolkit-0.17.1/demo/staticfiles/admin/img/tooltag-arrowright.svg +3 -0
  61. djresttoolkit-0.17.1/demo/staticfiles/admin/js/SelectBox.js +116 -0
  62. djresttoolkit-0.17.1/demo/staticfiles/admin/js/SelectFilter2.js +311 -0
  63. djresttoolkit-0.17.1/demo/staticfiles/admin/js/actions.js +204 -0
  64. djresttoolkit-0.17.1/demo/staticfiles/admin/js/admin/DateTimeShortcuts.js +408 -0
  65. djresttoolkit-0.17.1/demo/staticfiles/admin/js/admin/RelatedObjectLookups.js +252 -0
  66. djresttoolkit-0.17.1/demo/staticfiles/admin/js/autocomplete.js +33 -0
  67. djresttoolkit-0.17.1/demo/staticfiles/admin/js/calendar.js +239 -0
  68. djresttoolkit-0.17.1/demo/staticfiles/admin/js/cancel.js +29 -0
  69. djresttoolkit-0.17.1/demo/staticfiles/admin/js/change_form.js +16 -0
  70. djresttoolkit-0.17.1/demo/staticfiles/admin/js/core.js +184 -0
  71. djresttoolkit-0.17.1/demo/staticfiles/admin/js/filters.js +30 -0
  72. djresttoolkit-0.17.1/demo/staticfiles/admin/js/inlines.js +359 -0
  73. djresttoolkit-0.17.1/demo/staticfiles/admin/js/jquery.init.js +8 -0
  74. djresttoolkit-0.17.1/demo/staticfiles/admin/js/nav_sidebar.js +79 -0
  75. djresttoolkit-0.17.1/demo/staticfiles/admin/js/popup_response.js +15 -0
  76. djresttoolkit-0.17.1/demo/staticfiles/admin/js/prepopulate.js +43 -0
  77. djresttoolkit-0.17.1/demo/staticfiles/admin/js/prepopulate_init.js +15 -0
  78. djresttoolkit-0.17.1/demo/staticfiles/admin/js/theme.js +51 -0
  79. djresttoolkit-0.17.1/demo/staticfiles/admin/js/unusable_password_field.js +29 -0
  80. djresttoolkit-0.17.1/demo/staticfiles/admin/js/urlify.js +169 -0
  81. djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/jquery/LICENSE.txt +20 -0
  82. djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/jquery/jquery.js +10716 -0
  83. djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/jquery/jquery.min.js +2 -0
  84. djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/LICENSE.md +21 -0
  85. djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/af.js +3 -0
  86. djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/ar.js +3 -0
  87. djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/az.js +3 -0
  88. djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/bg.js +3 -0
  89. djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/bn.js +3 -0
  90. djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/bs.js +3 -0
  91. djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/ca.js +3 -0
  92. djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/cs.js +3 -0
  93. djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/da.js +3 -0
  94. djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/de.js +3 -0
  95. djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/dsb.js +3 -0
  96. djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/el.js +3 -0
  97. djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/en.js +3 -0
  98. djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/es.js +3 -0
  99. djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/et.js +3 -0
  100. djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/eu.js +3 -0
  101. djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/fa.js +3 -0
  102. djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/fi.js +3 -0
  103. djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/fr.js +3 -0
  104. djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/gl.js +3 -0
  105. djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/he.js +3 -0
  106. djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/hi.js +3 -0
  107. djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/hr.js +3 -0
  108. djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/hsb.js +3 -0
  109. djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/hu.js +3 -0
  110. djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/hy.js +3 -0
  111. djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/id.js +3 -0
  112. djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/is.js +3 -0
  113. djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/it.js +3 -0
  114. djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/ja.js +3 -0
  115. djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/ka.js +3 -0
  116. djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/km.js +3 -0
  117. djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/ko.js +3 -0
  118. djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/lt.js +3 -0
  119. djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/lv.js +3 -0
  120. djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/mk.js +3 -0
  121. djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/ms.js +3 -0
  122. djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/nb.js +3 -0
  123. djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/ne.js +3 -0
  124. djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/nl.js +3 -0
  125. djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/pl.js +3 -0
  126. djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/ps.js +3 -0
  127. djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/pt-BR.js +3 -0
  128. djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/pt.js +3 -0
  129. djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/ro.js +3 -0
  130. djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/ru.js +3 -0
  131. djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/sk.js +3 -0
  132. djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/sl.js +3 -0
  133. djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/sq.js +3 -0
  134. djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/sr-Cyrl.js +3 -0
  135. djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/sr.js +3 -0
  136. djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/sv.js +3 -0
  137. djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/th.js +3 -0
  138. djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/tk.js +3 -0
  139. djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/tr.js +3 -0
  140. djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/uk.js +3 -0
  141. djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/vi.js +3 -0
  142. djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/zh-CN.js +3 -0
  143. djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/i18n/zh-TW.js +3 -0
  144. djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/select2.full.js +6820 -0
  145. djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/select2/select2.full.min.js +2 -0
  146. djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/xregexp/LICENSE.txt +21 -0
  147. djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/xregexp/xregexp.js +6126 -0
  148. djresttoolkit-0.17.1/demo/staticfiles/admin/js/vendor/xregexp/xregexp.min.js +17 -0
  149. djresttoolkit-0.17.1/demo/staticfiles/rest_framework/css/bootstrap-theme.min.css +6 -0
  150. djresttoolkit-0.17.1/demo/staticfiles/rest_framework/css/bootstrap-theme.min.css.map +1 -0
  151. djresttoolkit-0.17.1/demo/staticfiles/rest_framework/css/bootstrap-tweaks.css +237 -0
  152. djresttoolkit-0.17.1/demo/staticfiles/rest_framework/css/bootstrap.min.css +6 -0
  153. djresttoolkit-0.17.1/demo/staticfiles/rest_framework/css/bootstrap.min.css.map +1 -0
  154. djresttoolkit-0.17.1/demo/staticfiles/rest_framework/css/default.css +82 -0
  155. djresttoolkit-0.17.1/demo/staticfiles/rest_framework/css/font-awesome-4.0.3.css +1338 -0
  156. djresttoolkit-0.17.1/demo/staticfiles/rest_framework/css/prettify.css +30 -0
  157. djresttoolkit-0.17.1/demo/staticfiles/rest_framework/docs/css/base.css +359 -0
  158. djresttoolkit-0.17.1/demo/staticfiles/rest_framework/docs/css/highlight.css +125 -0
  159. djresttoolkit-0.17.1/demo/staticfiles/rest_framework/docs/css/jquery.json-view.min.css +11 -0
  160. djresttoolkit-0.17.1/demo/staticfiles/rest_framework/docs/img/favicon.ico +0 -0
  161. djresttoolkit-0.17.1/demo/staticfiles/rest_framework/docs/img/grid.png +0 -0
  162. djresttoolkit-0.17.1/demo/staticfiles/rest_framework/docs/js/api.js +315 -0
  163. djresttoolkit-0.17.1/demo/staticfiles/rest_framework/docs/js/highlight.pack.js +2 -0
  164. djresttoolkit-0.17.1/demo/staticfiles/rest_framework/docs/js/jquery.json-view.min.js +7 -0
  165. djresttoolkit-0.17.1/demo/staticfiles/rest_framework/fonts/fontawesome-webfont.eot +0 -0
  166. djresttoolkit-0.17.1/demo/staticfiles/rest_framework/fonts/fontawesome-webfont.svg +414 -0
  167. djresttoolkit-0.17.1/demo/staticfiles/rest_framework/fonts/fontawesome-webfont.ttf +0 -0
  168. djresttoolkit-0.17.1/demo/staticfiles/rest_framework/fonts/fontawesome-webfont.woff +0 -0
  169. djresttoolkit-0.17.1/demo/staticfiles/rest_framework/fonts/glyphicons-halflings-regular.eot +0 -0
  170. djresttoolkit-0.17.1/demo/staticfiles/rest_framework/fonts/glyphicons-halflings-regular.svg +288 -0
  171. djresttoolkit-0.17.1/demo/staticfiles/rest_framework/fonts/glyphicons-halflings-regular.ttf +0 -0
  172. djresttoolkit-0.17.1/demo/staticfiles/rest_framework/fonts/glyphicons-halflings-regular.woff +0 -0
  173. djresttoolkit-0.17.1/demo/staticfiles/rest_framework/fonts/glyphicons-halflings-regular.woff2 +0 -0
  174. djresttoolkit-0.17.1/demo/staticfiles/rest_framework/img/glyphicons-halflings-white.png +0 -0
  175. djresttoolkit-0.17.1/demo/staticfiles/rest_framework/img/glyphicons-halflings.png +0 -0
  176. djresttoolkit-0.17.1/demo/staticfiles/rest_framework/img/grid.png +0 -0
  177. djresttoolkit-0.17.1/demo/staticfiles/rest_framework/js/ajax-form.js +133 -0
  178. djresttoolkit-0.17.1/demo/staticfiles/rest_framework/js/bootstrap.min.js +6 -0
  179. djresttoolkit-0.17.1/demo/staticfiles/rest_framework/js/coreapi-0.1.1.js +2043 -0
  180. djresttoolkit-0.17.1/demo/staticfiles/rest_framework/js/csrf.js +53 -0
  181. djresttoolkit-0.17.1/demo/staticfiles/rest_framework/js/default.js +47 -0
  182. djresttoolkit-0.17.1/demo/staticfiles/rest_framework/js/jquery-3.7.1.min.js +2 -0
  183. djresttoolkit-0.17.1/demo/staticfiles/rest_framework/js/load-ajax-form.js +3 -0
  184. djresttoolkit-0.17.1/demo/staticfiles/rest_framework/js/prettify-min.js +28 -0
  185. {djresttoolkit-0.16.1 → djresttoolkit-0.17.1}/pyproject.toml +1 -8
  186. djresttoolkit-0.17.1/src/djresttoolkit/migrations/__init__.py +0 -0
  187. djresttoolkit-0.17.1/src/djresttoolkit/models/__init__.py +0 -0
  188. djresttoolkit-0.17.1/src/djresttoolkit/py.typed +0 -0
  189. djresttoolkit-0.17.1/src/djresttoolkit/serializers/__init__.py +0 -0
  190. djresttoolkit-0.17.1/src/djresttoolkit/views/_api_views/__init__.py +0 -0
  191. djresttoolkit-0.17.1/src/djresttoolkit/views/mixins/__init__.py +16 -0
  192. djresttoolkit-0.17.1/src/djresttoolkit/views/mixins/_cache_action_mixin.py +44 -0
  193. djresttoolkit-0.17.1/src/djresttoolkit/views/mixins/_cache_invalidate_mixin.py +38 -0
  194. djresttoolkit-0.17.1/src/djresttoolkit/views/mixins/_cache_key_mixin.py +33 -0
  195. djresttoolkit-0.17.1/src/djresttoolkit/views/mixins/_cache_list_retrieve_mixin.py +57 -0
  196. djresttoolkit-0.17.1/src/djresttoolkit/views/mixins/_cache_ops_mixin.py +47 -0
  197. djresttoolkit-0.17.1/uv.lock +864 -0
  198. djresttoolkit-0.16.1/src/djresttoolkit/views/mixins/__init__.py +0 -6
  199. {djresttoolkit-0.16.1 → djresttoolkit-0.17.1}/.gitignore +0 -0
  200. {djresttoolkit-0.16.1 → djresttoolkit-0.17.1}/LICENSE +0 -0
  201. {djresttoolkit-0.16.1/src/djresttoolkit → djresttoolkit-0.17.1/demo/apps/todos}/__init__.py +0 -0
  202. {djresttoolkit-0.16.1/src/djresttoolkit → djresttoolkit-0.17.1/demo/apps/todos}/dbseed/__init__.py +0 -0
  203. {djresttoolkit-0.16.1/src/djresttoolkit/management → djresttoolkit-0.17.1/demo/apps/todos/migrations}/__init__.py +0 -0
  204. /djresttoolkit-0.16.1/src/djresttoolkit/admin.py → /djresttoolkit-0.17.1/demo/apps/todos/views.py +0 -0
  205. {djresttoolkit-0.16.1/src/djresttoolkit/management/commands → djresttoolkit-0.17.1/demo/apps_config}/__init__.py +0 -0
  206. {djresttoolkit-0.16.1 → djresttoolkit-0.17.1}/demo/staticfiles/admin/img/LICENSE +0 -0
  207. {djresttoolkit-0.16.1/src/djresttoolkit/migrations → djresttoolkit-0.17.1/src/djresttoolkit}/__init__.py +0 -0
  208. /djresttoolkit-0.16.1/src/djresttoolkit/models/__init__.py → /djresttoolkit-0.17.1/src/djresttoolkit/admin.py +0 -0
  209. {djresttoolkit-0.16.1 → djresttoolkit-0.17.1}/src/djresttoolkit/apps.py +0 -0
  210. {djresttoolkit-0.16.1/src/djresttoolkit/serializers → djresttoolkit-0.17.1/src/djresttoolkit/dbseed}/__init__.py +0 -0
  211. {djresttoolkit-0.16.1 → djresttoolkit-0.17.1}/src/djresttoolkit/dbseed/models/__init__.py +0 -0
  212. {djresttoolkit-0.16.1 → djresttoolkit-0.17.1}/src/djresttoolkit/dbseed/models/_choice_field.py +0 -0
  213. {djresttoolkit-0.16.1 → djresttoolkit-0.17.1}/src/djresttoolkit/dbseed/models/_gen.py +0 -0
  214. {djresttoolkit-0.16.1 → djresttoolkit-0.17.1}/src/djresttoolkit/dbseed/models/_seed_model.py +0 -0
  215. {djresttoolkit-0.16.1 → djresttoolkit-0.17.1}/src/djresttoolkit/envconfig/__init__.py +0 -0
  216. {djresttoolkit-0.16.1 → djresttoolkit-0.17.1}/src/djresttoolkit/envconfig/_env_settings.py +0 -0
  217. {djresttoolkit-0.16.1 → djresttoolkit-0.17.1}/src/djresttoolkit/mail/__init__.py +0 -0
  218. {djresttoolkit-0.16.1 → djresttoolkit-0.17.1}/src/djresttoolkit/mail/_email_sender.py +0 -0
  219. {djresttoolkit-0.16.1 → djresttoolkit-0.17.1}/src/djresttoolkit/mail/_models.py +0 -0
  220. {djresttoolkit-0.16.1 → djresttoolkit-0.17.1}/src/djresttoolkit/mail/_types.py +0 -0
  221. {djresttoolkit-0.16.1/src/djresttoolkit/views/_api_views → djresttoolkit-0.17.1/src/djresttoolkit/management}/__init__.py +0 -0
  222. /djresttoolkit-0.16.1/src/djresttoolkit/py.typed → /djresttoolkit-0.17.1/src/djresttoolkit/management/commands/__init__.py +0 -0
  223. {djresttoolkit-0.16.1 → djresttoolkit-0.17.1}/src/djresttoolkit/management/commands/dbflush.py +0 -0
  224. {djresttoolkit-0.16.1 → djresttoolkit-0.17.1}/src/djresttoolkit/management/commands/dbseed.py +0 -0
  225. {djresttoolkit-0.16.1 → djresttoolkit-0.17.1}/src/djresttoolkit/middlewares/__init__.py +0 -0
  226. {djresttoolkit-0.16.1 → djresttoolkit-0.17.1}/src/djresttoolkit/middlewares/_response_time_middleware.py +0 -0
  227. {djresttoolkit-0.16.1 → djresttoolkit-0.17.1}/src/djresttoolkit/models/mixins/__init__.py +0 -0
  228. {djresttoolkit-0.16.1 → djresttoolkit-0.17.1}/src/djresttoolkit/models/mixins/_model_choice_fields_mixin.py +0 -0
  229. {djresttoolkit-0.16.1 → djresttoolkit-0.17.1}/src/djresttoolkit/pagination/__init__.py +0 -0
  230. {djresttoolkit-0.16.1 → djresttoolkit-0.17.1}/src/djresttoolkit/pagination/_page_number_pagination.py +0 -0
  231. {djresttoolkit-0.16.1 → djresttoolkit-0.17.1}/src/djresttoolkit/pagination/_paginated_data_builder.py +0 -0
  232. {djresttoolkit-0.16.1 → djresttoolkit-0.17.1}/src/djresttoolkit/renderers/__init__.py +0 -0
  233. {djresttoolkit-0.16.1 → djresttoolkit-0.17.1}/src/djresttoolkit/renderers/_throttle_info_json_renderer.py +0 -0
  234. {djresttoolkit-0.16.1 → djresttoolkit-0.17.1}/src/djresttoolkit/serializers/mixins/__init__.py +0 -0
  235. {djresttoolkit-0.16.1 → djresttoolkit-0.17.1}/src/djresttoolkit/serializers/mixins/_absolute_url_file_mixin.py +0 -0
  236. {djresttoolkit-0.16.1 → djresttoolkit-0.17.1}/src/djresttoolkit/serializers/mixins/_bulk_create_mixin.py +0 -0
  237. {djresttoolkit-0.16.1 → djresttoolkit-0.17.1}/src/djresttoolkit/throttling/__init__.py +0 -0
  238. {djresttoolkit-0.16.1 → djresttoolkit-0.17.1}/src/djresttoolkit/throttling/_throttle_inspector.py +0 -0
  239. {djresttoolkit-0.16.1 → djresttoolkit-0.17.1}/src/djresttoolkit/urls/__init__.py +0 -0
  240. {djresttoolkit-0.16.1 → djresttoolkit-0.17.1}/src/djresttoolkit/urls/_build_absolute_uri.py +0 -0
  241. {djresttoolkit-0.16.1 → djresttoolkit-0.17.1}/src/djresttoolkit/views/__init__.py +0 -0
  242. {djresttoolkit-0.16.1 → djresttoolkit-0.17.1}/src/djresttoolkit/views/_api_views/_choice_fields_apiview.py +0 -0
  243. {djresttoolkit-0.16.1 → djresttoolkit-0.17.1}/src/djresttoolkit/views/_exceptions/__init__.py +0 -0
  244. {djresttoolkit-0.16.1 → djresttoolkit-0.17.1}/src/djresttoolkit/views/_exceptions/_exception_handler.py +0 -0
  245. {djresttoolkit-0.16.1 → djresttoolkit-0.17.1}/src/djresttoolkit/views/mixins/_retrieve_object_mixin.py +0 -0
@@ -0,0 +1 @@
1
+ 3.13
@@ -0,0 +1,12 @@
1
+ {
2
+ "files.exclude": {
3
+ "**/.git": true,
4
+ "**/.svn": true,
5
+ "**/.hg": true,
6
+ "**/.DS_Store": true,
7
+ "**/Thumbs.db": true,
8
+ "**/__pycache__": true,
9
+ "**/.pytest_cache": true,
10
+ "**/.ruff_cache": true
11
+ }
12
+ }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: djresttoolkit
3
- Version: 0.16.1
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` `settings.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` current page number
932
- - `total` total number of pages
933
- - `size` number of items per page
934
- - `total_items` total number of items across all pages
935
- - `next` next page URL
936
- - `previous` previous page URL
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` Query parameter name (`"page-size"`).
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"` pagination metadata
987
- - `"results"` serialized data.
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` DRF request object.
1003
- - `serializer_class: type[BaseSerializer]` DRF serializer class for the model.
1004
- - `queryset: QuerySet` Django queryset to paginate.
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` `settings.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` current page number
874
- - `total` total number of pages
875
- - `size` number of items per page
876
- - `total_items` total number of items across all pages
877
- - `next` next page URL
878
- - `previous` previous page URL
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` Query parameter name (`"page-size"`).
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"` pagination metadata
929
- - `"results"` serialized data.
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` DRF request object.
945
- - `serializer_class: type[BaseSerializer]` DRF serializer class for the model.
946
- - `queryset: QuerySet` Django queryset to paginate.
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,7 @@
1
+ from django.apps import AppConfig
2
+
3
+
4
+ class TodosConfig(AppConfig):
5
+ default_auto_field = "django.db.models.BigAutoField"
6
+ name = "apps.todos"
7
+ label = "todos"
@@ -0,0 +1,13 @@
1
+ from djresttoolkit.dbseed.models import ( # type: ignore[import-not-found]
2
+ Field,
3
+ Gen,
4
+ SeedModel,
5
+ )
6
+
7
+ from ..models import Tag
8
+
9
+
10
+ class TagSeedModel(SeedModel):
11
+ __model__ = Tag
12
+
13
+ name: str = Field(default_factory=Gen.word)
@@ -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
+ ]