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