django-whiteneuron 0.3.1.2__tar.gz → 0.3.8.0__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 (222) hide show
  1. django_whiteneuron-0.3.8.0/PKG-INFO +456 -0
  2. django_whiteneuron-0.3.8.0/README.md +371 -0
  3. django_whiteneuron-0.3.8.0/django_whiteneuron.egg-info/PKG-INFO +456 -0
  4. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/django_whiteneuron.egg-info/SOURCES.txt +22 -10
  5. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/django_whiteneuron.egg-info/requires.txt +5 -5
  6. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/pyproject.toml +9 -10
  7. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/base/admin.py +174 -40
  8. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/base/filters.py +1 -1
  9. django_whiteneuron-0.3.8.0/whiteneuron/base/management/commands/cleanup_old_activities.py +92 -0
  10. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/base/management/commands/init_admin.py +1 -0
  11. django_whiteneuron-0.3.8.0/whiteneuron/base/management/commands/update_visit_profiles.py +81 -0
  12. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/base/middleware.py +157 -12
  13. django_whiteneuron-0.3.8.0/whiteneuron/base/migrations/0018_user_uuid.py +32 -0
  14. django_whiteneuron-0.3.8.0/whiteneuron/base/migrations/0019_alter_user_uuid.py +19 -0
  15. django_whiteneuron-0.3.8.0/whiteneuron/base/migrations/0020_add_visit_profile_and_fk_fields.py +40 -0
  16. django_whiteneuron-0.3.8.0/whiteneuron/base/migrations/0021_populate_visit_profiles.py +64 -0
  17. django_whiteneuron-0.3.8.0/whiteneuron/base/migrations/0022_remove_duplicate_visit_profiles.py +61 -0
  18. django_whiteneuron-0.3.8.0/whiteneuron/base/migrations/0023_remove_useractivity_ip_address_and_more.py +41 -0
  19. django_whiteneuron-0.3.8.0/whiteneuron/base/migrations/0024_alter_visitprofile_user_agent_to_charfield.py +18 -0
  20. django_whiteneuron-0.3.8.0/whiteneuron/base/migrations/0025_alter_anonymousactivity_options_and_more.py +21 -0
  21. django_whiteneuron-0.3.8.0/whiteneuron/base/migrations/0026_alter_anonymousactivity_profile_and_more.py +24 -0
  22. django_whiteneuron-0.3.8.0/whiteneuron/base/migrations/0027_alter_anonymousactivity_method_and_more.py +23 -0
  23. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/base/modeladmin.py +56 -18
  24. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/base/models.py +100 -33
  25. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/base/settings.py +61 -24
  26. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/base/urls.py +3 -2
  27. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/base/utils.py +55 -38
  28. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/base/views.py +33 -3
  29. django_whiteneuron-0.3.8.0/whiteneuron/base/widgets.py +17 -0
  30. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/dashboard/views.py +66 -20
  31. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/feedbacks/admin.py +13 -0
  32. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/feedbacks/urls.py +2 -1
  33. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/file_management/admin.py +72 -8
  34. django_whiteneuron-0.3.8.0/whiteneuron/file_management/migrations/0005_alter_excelfile_file_alter_excelfile_title_and_more.py +33 -0
  35. django_whiteneuron-0.3.8.0/whiteneuron/file_management/migrations/0006_excelfile_is_public_pdffile_is_public.py +23 -0
  36. django_whiteneuron-0.3.8.0/whiteneuron/file_management/migrations/0007_htmlfile.py +41 -0
  37. django_whiteneuron-0.3.8.0/whiteneuron/file_management/migrations/0008_excelfile_allowed_groups_excelfile_allowed_users_and_more.py +46 -0
  38. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/file_management/models.py +20 -5
  39. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/file_management/urls.py +2 -1
  40. django_whiteneuron-0.3.8.0/whiteneuron/file_management/utils.py +11 -0
  41. django_whiteneuron-0.3.8.0/whiteneuron/file_management/views.py +110 -0
  42. django_whiteneuron-0.3.8.0/whiteneuron/locale/vi/LC_MESSAGES/django.mo +0 -0
  43. django_whiteneuron-0.3.8.0/whiteneuron/locale/vi/LC_MESSAGES/django.po +2565 -0
  44. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/notification/admin.py +3 -2
  45. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/notification/models.py +6 -4
  46. django_whiteneuron-0.3.8.0/whiteneuron/notification/utils.py +20 -0
  47. django_whiteneuron-0.3.8.0/whiteneuron/static/base/css/styles.css +2 -0
  48. django_whiteneuron-0.3.8.0/whiteneuron/static/base/forms/js/mdeditor.js +270 -0
  49. django_whiteneuron-0.3.8.0/whiteneuron/static/base/images/logo/LOGO.jpg +0 -0
  50. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/templates/admin/base/app_change_list.html +2 -2
  51. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/templates/admin/change_list.html +1 -1
  52. django_whiteneuron-0.3.8.0/whiteneuron/templates/admin/feedbacks/change_form_feedback_list.html +70 -0
  53. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/templates/admin/grid_view_results.html +3 -3
  54. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/templates/admin/header.html +7 -2
  55. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/templates/admin/index.html +16 -11
  56. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/templates/admin/search_form.html +1 -1
  57. django_whiteneuron-0.3.8.0/whiteneuron/templates/admin/signature.html +26 -0
  58. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/templates/base/announcement.html +2 -2
  59. django_whiteneuron-0.3.8.0/whiteneuron/templates/base/forms/mdeditor.html +31 -0
  60. django_whiteneuron-0.3.8.0/whiteneuron/templates/unfold/helpers/account_links.html +67 -0
  61. django_whiteneuron-0.3.8.0/whiteneuron/templates/unfold/helpers/language_switch.html +17 -0
  62. django_whiteneuron-0.3.8.0/whiteneuron/templates/unfold/helpers/theme_switch.html +26 -0
  63. django_whiteneuron-0.3.1.2/PKG-INFO +0 -351
  64. django_whiteneuron-0.3.1.2/README.md +0 -265
  65. django_whiteneuron-0.3.1.2/django_whiteneuron.egg-info/PKG-INFO +0 -351
  66. django_whiteneuron-0.3.1.2/whiteneuron/base/widgets.py +0 -29
  67. django_whiteneuron-0.3.1.2/whiteneuron/file_management/utils.py +0 -8
  68. django_whiteneuron-0.3.1.2/whiteneuron/file_management/views.py +0 -50
  69. django_whiteneuron-0.3.1.2/whiteneuron/locale/vi/LC_MESSAGES/django.mo +0 -0
  70. django_whiteneuron-0.3.1.2/whiteneuron/locale/vi/LC_MESSAGES/django.po +0 -1524
  71. django_whiteneuron-0.3.1.2/whiteneuron/notification/utils.py +0 -11
  72. django_whiteneuron-0.3.1.2/whiteneuron/static/base/css/styles.css +0 -2
  73. django_whiteneuron-0.3.1.2/whiteneuron/static/base/forms/css/html-editor.css +0 -89
  74. django_whiteneuron-0.3.1.2/whiteneuron/static/base/forms/js/format.html.js +0 -171
  75. django_whiteneuron-0.3.1.2/whiteneuron/static/base/forms/js/trix.config.js +0 -257
  76. django_whiteneuron-0.3.1.2/whiteneuron/synchronization/__init__.py +0 -0
  77. django_whiteneuron-0.3.1.2/whiteneuron/synchronization/admin.py +0 -3
  78. django_whiteneuron-0.3.1.2/whiteneuron/synchronization/apps.py +0 -6
  79. django_whiteneuron-0.3.1.2/whiteneuron/synchronization/migrations/__init__.py +0 -0
  80. django_whiteneuron-0.3.1.2/whiteneuron/synchronization/models.py +0 -29
  81. django_whiteneuron-0.3.1.2/whiteneuron/synchronization/tests.py +0 -3
  82. django_whiteneuron-0.3.1.2/whiteneuron/synchronization/views.py +0 -3
  83. django_whiteneuron-0.3.1.2/whiteneuron/templates/admin/signature.html +0 -245
  84. django_whiteneuron-0.3.1.2/whiteneuron/templates/unfold/helpers/account_links.html +0 -126
  85. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/LICENSE +0 -0
  86. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/django_whiteneuron.egg-info/dependency_links.txt +0 -0
  87. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/django_whiteneuron.egg-info/top_level.txt +0 -0
  88. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/setup.cfg +0 -0
  89. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/__init__.py +0 -0
  90. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/base/__init__.py +0 -0
  91. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/base/apps.py +0 -0
  92. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/base/asgi.py +0 -0
  93. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/base/ckeditor.py +0 -0
  94. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/base/forms.py +0 -0
  95. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/base/management/__init__.py +0 -0
  96. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/base/management/commands/__init__.py +0 -0
  97. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/base/management/commands/init_groupuser.py +0 -0
  98. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/base/management/commands/init_guest.py +0 -0
  99. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/base/migrations/0001_initial.py +0 -0
  100. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/base/migrations/0002_imagemodel_userprofile_user_avatar_user_biography_and_more.py +0 -0
  101. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/base/migrations/0003_notification_obj_link.py +0 -0
  102. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/base/migrations/0004_delete_notification.py +0 -0
  103. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/base/migrations/0005_user_show_softdelete.py +0 -0
  104. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/base/migrations/0006_user_is_bot.py +0 -0
  105. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/base/migrations/0007_app.py +0 -0
  106. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/base/migrations/0008_app_created_at_app_created_by_app_deleted_at_and_more.py +0 -0
  107. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/base/migrations/0009_alter_app_table.py +0 -0
  108. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/base/migrations/0010_app_category.py +0 -0
  109. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/base/migrations/0011_alter_app_options.py +0 -0
  110. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/base/migrations/0012_app_permission.py +0 -0
  111. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/base/migrations/0013_app_thumbnail_url.py +0 -0
  112. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/base/migrations/0014_alter_app_created_at_alter_app_updated_at_and_more.py +0 -0
  113. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/base/migrations/0015_ipblacklist.py +0 -0
  114. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/base/migrations/0016_uablacklist.py +0 -0
  115. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/base/migrations/0017_alter_uablacklist_pattern.py +0 -0
  116. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/base/migrations/__init__.py +0 -0
  117. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/base/resources.py +0 -0
  118. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/base/sites.py +0 -0
  119. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/base/tasks.py +0 -0
  120. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/base/templatetags/__init__.py +0 -0
  121. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/base/templatetags/unfold_list_custom.py +0 -0
  122. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/base/templatetags/wn_filters.py +0 -0
  123. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/base/tests.py +0 -0
  124. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/base/thread_local.py +0 -0
  125. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/contrib/__init__.py +0 -0
  126. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/contrib/wn_import_export/__init__.py +0 -0
  127. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/contrib/wn_import_export/admin.py +0 -0
  128. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/contrib/wn_import_export/constants.py +0 -0
  129. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/contrib/wn_import_export/mixins.py +0 -0
  130. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/contrib/wn_import_export/tasks.py +0 -0
  131. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/contrib/wn_import_export/utils.py +0 -0
  132. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/contrib/wn_modeltranslation/__init__.py +0 -0
  133. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/contrib/wn_modeltranslation/admin.py +0 -0
  134. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/contrib/wn_modeltranslation/utils.py +0 -0
  135. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/dashboard/__init__.py +0 -0
  136. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/dashboard/admin.py +0 -0
  137. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/dashboard/apps.py +0 -0
  138. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/dashboard/migrations/__init__.py +0 -0
  139. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/dashboard/models.py +0 -0
  140. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/dashboard/tests.py +0 -0
  141. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/feedbacks/__init__.py +0 -0
  142. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/feedbacks/apps.py +0 -0
  143. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/feedbacks/migrations/0001_initial.py +0 -0
  144. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/feedbacks/migrations/0002_feedbackdata_created_by_feedbackdata_deleted_at_and_more.py +0 -0
  145. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/feedbacks/migrations/0003_feedbackdata_note.py +0 -0
  146. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/feedbacks/migrations/0004_alter_feedbackdata_object_id.py +0 -0
  147. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/feedbacks/migrations/0005_feedbackdata_field.py +0 -0
  148. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/feedbacks/migrations/0006_alter_feedbackdata_created_at_and_more.py +0 -0
  149. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/feedbacks/migrations/__init__.py +0 -0
  150. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/feedbacks/models.py +0 -0
  151. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/feedbacks/tests.py +0 -0
  152. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/feedbacks/utils.py +0 -0
  153. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/feedbacks/views.py +0 -0
  154. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/file_management/__init__.py +0 -0
  155. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/file_management/apps.py +0 -0
  156. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/file_management/migrations/0001_initial.py +0 -0
  157. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/file_management/migrations/0002_alter_excelfile_options_alter_pdffile_options_and_more.py +0 -0
  158. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/file_management/migrations/0003_alter_excelfile_created_at_and_more.py +0 -0
  159. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/file_management/migrations/0004_excelfile_hash_pdffile_hash.py +0 -0
  160. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/file_management/migrations/__init__.py +0 -0
  161. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/file_management/tests.py +0 -0
  162. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/manage.py +0 -0
  163. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/notification/__init__.py +0 -0
  164. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/notification/apps.py +0 -0
  165. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/notification/consumers.py +0 -0
  166. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/notification/management/__init__.py +0 -0
  167. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/notification/management/commands/__init__.py +0 -0
  168. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/notification/management/commands/call_demo_noti.py +0 -0
  169. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/notification/migrations/0001_initial.py +0 -0
  170. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/notification/migrations/0002_alter_notificationconfig_event_type.py +0 -0
  171. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/notification/migrations/0003_notification.py +0 -0
  172. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/notification/migrations/0004_alter_notification_flag.py +0 -0
  173. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/notification/migrations/0005_notification_keywords.py +0 -0
  174. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/notification/migrations/0006_remove_notification_keywords.py +0 -0
  175. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/notification/migrations/0007_notification_changed_data.py +0 -0
  176. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/notification/migrations/0008_alter_notification_changed_data.py +0 -0
  177. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/notification/migrations/0009_notification_action_by_alter_notification_user.py +0 -0
  178. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/notification/migrations/0010_alter_notification_user.py +0 -0
  179. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/notification/migrations/0011_alter_notification_user.py +0 -0
  180. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/notification/migrations/0012_alter_notification_action_and_more.py +0 -0
  181. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/notification/migrations/__init__.py +0 -0
  182. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/notification/routing.py +0 -0
  183. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/notification/tests.py +0 -0
  184. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/notification/views.py +0 -0
  185. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/static/base/css/btn-styles.css +0 -0
  186. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/static/base/css/ckeditor5.css +0 -0
  187. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/static/base/css/loading.css +0 -0
  188. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/static/base/images/delete.svg +0 -0
  189. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/static/base/images/edit.svg +0 -0
  190. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/static/base/images/icon-viewlink.svg +0 -0
  191. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/static/base/images/loading.gif +0 -0
  192. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/static/base/images/login-bg.jpg +0 -0
  193. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/static/base/images/login_bg.jpg +0 -0
  194. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/static/base/images/logo/WhiteNeuron.png +0 -0
  195. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/static/base/js/chart.min.js +0 -0
  196. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/static/base/js/d3.v7.min.js +0 -0
  197. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/static/base/js/loading.js +0 -0
  198. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/static/base/js/whiteneuron.js +0 -0
  199. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/templates/400.html +0 -0
  200. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/templates/403.html +0 -0
  201. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/templates/404.html +0 -0
  202. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/templates/429.html +0 -0
  203. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/templates/500.html +0 -0
  204. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/templates/admin/auth/user/add_form.html +0 -0
  205. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/templates/admin/base/image_change_form.html +0 -0
  206. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/templates/admin/base/userprofile_change_form.html +0 -0
  207. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/templates/admin/base.html +0 -0
  208. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/templates/admin/feedbacks/feedback_change_form.html +0 -0
  209. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/templates/admin/login.html +0 -0
  210. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/templates/admin/login_after.html +0 -0
  211. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/templates/admin/submit_line.html +0 -0
  212. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/templates/admin/wn_change_form.html +0 -0
  213. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/templates/admin/wn_history_panel.html +0 -0
  214. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/templates/base/forms/helpers/toolbar.html +0 -0
  215. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/templates/base/forms/wysiwyg.html +0 -0
  216. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/templates/base.html +0 -0
  217. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/templates/file_management/widgets/clearable_file_input_no_download.html +0 -0
  218. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/templates/unfold/helpers/app_list_badge.html +0 -0
  219. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/templates/unfold/helpers/field_password.html +0 -0
  220. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/templates/unfold/helpers/navigation_user.html +0 -0
  221. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/templates/unfold/helpers/pagination.html +0 -0
  222. {django_whiteneuron-0.3.1.2 → django_whiteneuron-0.3.8.0}/whiteneuron/templates/unfold/helpers/userlinks.html +0 -0
@@ -0,0 +1,456 @@
1
+ Metadata-Version: 2.4
2
+ Name: django-whiteneuron
3
+ Version: 0.3.8.0
4
+ Summary: A modern Django Admin extension with enhanced UI/UX, dashboard, feedback, file management, rate limiting, IP blacklisting, and advanced admin integrations built on django-unfold.
5
+ Author-email: White Neuron <anhnt@whiteneuron.ai>
6
+ License: MIT License
7
+
8
+ Copyright (c) 2025 Nguyễn Tú Anh
9
+
10
+ Permission is hereby granted, free of charge, to any person obtaining a copy
11
+ of this software and associated documentation files (the "Software"), to deal
12
+ in the Software without restriction, including without limitation the rights
13
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
14
+ copies of the Software, and to permit persons to whom the Software is
15
+ furnished to do so, subject to the following conditions:
16
+
17
+ The above copyright notice and this permission notice shall be included in all
18
+ copies or substantial portions of the Software.
19
+
20
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
23
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
26
+ SOFTWARE.
27
+
28
+ Project-URL: homepage, https://whiteneuron.ai
29
+ Project-URL: repository, https://github.com/White-Neuron/django-whiteneuron
30
+ Project-URL: changelog, https://github.com/White-Neuron/django-whiteneuron/releases
31
+ Project-URL: Bug Tracker, https://github.com/White-Neuron/django-whiteneuron/issues
32
+ Project-URL: PyPI, https://pypi.org/project/django-whiteneuron/
33
+ Keywords: django,plugin,admin,dashboard,whiteneuron
34
+ Classifier: Development Status :: 4 - Beta
35
+ Classifier: Intended Audience :: Developers
36
+ Classifier: Framework :: Django
37
+ Classifier: Framework :: Django :: 5.2
38
+ Classifier: Programming Language :: Python :: 3
39
+ Classifier: Programming Language :: Python :: 3.13
40
+ Classifier: License :: OSI Approved :: MIT License
41
+ Classifier: Operating System :: OS Independent
42
+ Requires-Python: >=3.13
43
+ Description-Content-Type: text/markdown
44
+ License-File: LICENSE
45
+ Requires-Dist: django-debug-toolbar>=5.0.1
46
+ Requires-Dist: django<7.0.0,>=6.0.8
47
+ Requires-Dist: django-celery-beat>=2.7.0
48
+ Requires-Dist: django-guardian>=2.4.0
49
+ Requires-Dist: django-imagekit>=5.0.0
50
+ Requires-Dist: django-import-export>=4.3.3
51
+ Requires-Dist: django-modeltranslation>=0.19.11
52
+ Requires-Dist: django-ninja>=1.3.0
53
+ Requires-Dist: django-simple-history>=3.8.0
54
+ Requires-Dist: gunicorn>=23.0.0
55
+ Requires-Dist: hiredis>=3.1.0
56
+ Requires-Dist: markdown>=3.7
57
+ Requires-Dist: openai>=1.58.1
58
+ Requires-Dist: openpyxl>=3.1.5
59
+ Requires-Dist: pandas>=2.2.3
60
+ Requires-Dist: pillow>=12.2.0
61
+ Requires-Dist: python-dotenv>=1.0.1
62
+ Requires-Dist: redis>=5.2.1
63
+ Requires-Dist: sentry-sdk==2.28.0
64
+ Requires-Dist: django-browser-reload>=1.18.0
65
+ Requires-Dist: whitenoise>=6.9.0
66
+ Requires-Dist: django-crispy-forms>=2.4
67
+ Requires-Dist: django-colorfield>=0.14.0
68
+ Requires-Dist: channels>=4.2.2
69
+ Requires-Dist: channels-redis>=4.2.1
70
+ Requires-Dist: uvicorn>=0.34.3
71
+ Requires-Dist: daphne>=4.2.0
72
+ Requires-Dist: twisted[tls]>=26.4.0rc2
73
+ Requires-Dist: django-ckeditor-5>=0.2.18
74
+ Requires-Dist: django-cors-headers>=4.3.0
75
+ Requires-Dist: django-unfold>=0.92.0
76
+ Requires-Dist: djangoql>=0.18.1
77
+ Requires-Dist: pyopenssl>=26.4.0
78
+ Requires-Dist: md2html-tailwind4==1.5.3
79
+ Provides-Extra: dev
80
+ Requires-Dist: pytest; extra == "dev"
81
+ Requires-Dist: black; extra == "dev"
82
+ Requires-Dist: flake8; extra == "dev"
83
+ Requires-Dist: pre-commit; extra == "dev"
84
+ Dynamic: license-file
85
+
86
+ # django-whiteneuron
87
+
88
+ A modern Django Admin extension focused on UI/UX, dashboard, feedback, file management, and advanced admin integrations — built on top of [django-unfold](https://github.com/unfoldadmin/django-unfold).
89
+
90
+ [![PyPI version](https://img.shields.io/pypi/v/django-whiteneuron)](https://pypi.org/project/django-whiteneuron/)
91
+ [![Python](https://img.shields.io/pypi/pyversions/django-whiteneuron)](https://pypi.org/project/django-whiteneuron/)
92
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
93
+ [![Downloads](https://img.shields.io/pypi/dm/django-whiteneuron)](https://pypi.org/project/django-whiteneuron/)
94
+
95
+ ![django-whiteneuron](https://raw.githubusercontent.com/White-Neuron/django-whiteneuron/main2.0/docs/images/main.png)
96
+
97
+ ## Current Version
98
+ v0.3.8.0
99
+
100
+ ## Changelog
101
+
102
+ ### Latest: v0.3.8.0 (2026-09-25)
103
+ **Bugfixes: Django 6 format_html crash in Image previews, app mosaic thumbnail URLs, SHOW_FILE_MANAGEMENT sidebar flag**
104
+ - **Fixed**: `Image.imgThumbnail()` and `Image.imgPreview()` admin methods — replaced f-string interpolation inside `format_html()` with the proper template + args pattern; resolves the rendering crash on Django 6 and ensures interpolated values are HTML-escaped.
105
+ - **Fixed**: App changelist mosaic thumbnails (`templates/admin/base/app_change_list.html`) — relative `thumbnail_url` paths are now wrapped in `{% static %}` while absolute/protocol-relative URLs pass through unchanged, fixing broken thumbnail images.
106
+ - **Fixed**: `SHOW_FILE_MANAGEMENT=False` is no longer silently ignored — the Unfold sidebar is built conditionally at definition time instead of post-processing by title match; when disabled, File Management items merge into the System section before Notifications config.
107
+ - **Compatibility**: No breaking changes; safe for all v0.3.x users. Django 6.0.x only.
108
+
109
+ See [CHANGELOG.md](CHANGELOG.md) for the full version history.
110
+
111
+ ### Latest: v0.3.7.0 (2026-08-23)
112
+ **Security: Patch 6 CVEs across django, cryptography, sqlparse, setuptools**
113
+ - **Fixed**: Upgraded `django` lower bound to patch CVE-2026-15830 (GeoDjango DoS).
114
+ - **Fixed**: Upgraded `pyopenssl` to `>=26.4.0` — patches CVE-2026-69247 (Bleichenbacher oracle attack).
115
+ - **Fixed**: Added `sqlparse >=0.6.0` via transitive deps — patches 3 DoS CVEs (CVE-2026-71491, CVE-2026-54284, CVE-2026-59893).
116
+ - **Fixed**: Added `setuptools >=75.1.0` to build-system — patches CVE-2025-47273.
117
+ - **Compatibility**: No breaking changes; safe for all v0.3.x users. Django 6.0.x only.
118
+
119
+ ### Latest: v0.3.5 (2026-07-15)
120
+ **Feature: Public/private file access control and HTML file support**
121
+ - **Added**: `is_public`, `allowed_users`, `allowed_groups` fields to `BaseFile` model — files can now be marked public or restricted to specific users/groups.
122
+ - **Added**: `_check_access()` permission logic in download/preview views — enforces access control before serving files.
123
+ - **Added**: `HTMLFile` model with inline preview support.
124
+ - **Improved**: Admin UI — public/private badge column, conditional Access Control fieldset for private files.
125
+ - **Compatibility**: No breaking changes; safe for all v0.3.x users.
126
+
127
+ See [CHANGELOG.md](CHANGELOG.md) for the full version history.
128
+
129
+ ### Latest: v0.3.4.12 (2026-06-27)
130
+ **Cleanup: Remove .DS_Store from tracking, feedback list in admin, remove md2html-tailwind4 uv source**
131
+ - **Removed**: 7 `.DS_Store` files removed from git tracking — added `*/.DS_Store` to `.gitignore`.
132
+ - **Added**: `FeedbackBaseAdmin.render_change_form()` loads and passes `feedback_list` context for displaying feedback entries per model instance in admin change form.
133
+ - **Removed**: `[tool.uv.sources]` block for `md2html-tailwind4` from `pyproject.toml`.
134
+ - **Updated**: Tailwind CSS regenerated with v4.1.16.
135
+ - **Compatibility**: No breaking changes; safe for all v0.3.x users.
136
+
137
+ See [CHANGELOG.md](CHANGELOG.md) for the full version history.
138
+
139
+ ### Latest: v0.3.4.10 (2026-06-12)
140
+ **Security patch: Upgrade Django to 6.0.6+ (CVE-2026-8404, CVE-2026-48587, CVE-2026-6873)**
141
+ - **Fixed**: Upgraded `django` lower bound from `>=6.0.6` to `>=6.0.6,<7.0.0` — patches 5 security vulnerabilities: CVE-2026-8404 (CVSS 5.3), CVE-2026-48587 (CVSS 5.3), CVE-2026-6873 (CVSS 4.3), CVE-2026-7666 (CVSS 2.3), CVE-2026-35193 (CVSS 2.3).
142
+ - **Compatibility**: No breaking changes; safe for all v0.3.x users. Django 6.0.x only — pinned upper bound `<7.0.0`.
143
+
144
+ See [CHANGELOG.md](CHANGELOG.md) for the full version history.
145
+
146
+ ### Latest: v0.3.4.8 (2026-05-24)
147
+ **Feature: Badge callback caching layer for dashboard performance optimization**
148
+ - **Added**: Django cache-backed badge callbacks for dashboard model badges with 60s TTL to reduce database queries.
149
+ - **Added**: Per-user cached notification badge with 60s TTL and unauthenticated user guard.
150
+ - **Improved**: Replaced `timezone.now()` with `timezone.localtime()` across all badge queries.
151
+ - **Compatibility**: No breaking changes; safe for all v0.3.x users. Requires Django cache backend configured.
152
+
153
+ See [CHANGELOG.md](CHANGELOG.md) for the full version history.
154
+
155
+ ### Latest: v0.3.4.6.2 (2026-05-14)
156
+ **Improvement: Configurable rate-limit exempt paths and user activity exclude paths**
157
+ - **Improved**: `RateLimitMiddleware` now reads `RATE_LIMIT_EXEMPT_PATHS` from Django settings — comma-separated list of additional path prefixes to exclude from rate limiting.
158
+ - **Improved**: `UserActivityMiddleware` now reads `USER_ACTIVITY_EXCLUDE_PATHS` from Django settings — semicolon-separated list of `path,condition` pairs for excluding paths from activity tracking and rate limiting.
159
+ - **Compatibility**: No breaking changes; safe for all v0.3.x users. New settings are optional.
160
+
161
+ See [CHANGELOG.md](CHANGELOG.md) for the full version history.
162
+
163
+ ### Latest: v0.3.3.4 (2026-04-30)
164
+ **Patch release: Remove synchronization module, add language switcher template, update Vietnamese i18n**
165
+ - **Removed**: `synchronization/` module — cleaned up unused sync models, admin, views, tests, and migrations
166
+ - **Added**: Language switcher template for Unfold admin (`language_switch.html`) with multi-language support via `show_languages` context variable
167
+ - **Improved**: Vietnamese translations updated — removed stale synchronization references, added new entries for user profile and HTML editor
168
+ - **Compatibility**: No breaking changes; safe for all v0.3.3.x users
169
+ - **Validation**: Build, migrations (no changes), and manual admin UI/UX validation performed
170
+ - **Upgrade Guidance**: No manual migration required; upgrade recommended for all users on v0.3.3.x
171
+ - **Rollback**: Safe to revert to v0.3.3.3; no schema changes introduced
172
+
173
+ See [CHANGELOG.md](CHANGELOG.md) for the full version history.
174
+
175
+ ## Table of Contents
176
+
177
+ - [Changelog](#changelog)
178
+ - [Features](#features)
179
+ - [Installation](#installation)
180
+ - [Quick Start](#quick-start)
181
+ - [Configuration](#configuration)
182
+ - [Modules](#modules)
183
+ - [Middleware & Security](#middleware--security)
184
+ - [Frontend](#frontend)
185
+ - [Environment Variables](#environment-variables)
186
+ - [Management Commands](#management-commands)
187
+ - [Building & Releasing](#building--releasing)
188
+ - [Documentation](#documentation)
189
+ - [Contact](#contact)
190
+
191
+ ## Giới thiệu
192
+
193
+ Xem [docs/INTRODUCTION.md](docs/INTRODUCTION.md) để tìm hiểu chi tiết về django-whiteneuron — tại sao nên dùng, tính năng nổi bật và ai phù hợp.
194
+
195
+ ## Features
196
+
197
+ | Category | Feature | Description |
198
+ |---|---|---|
199
+ | **Core** | Custom User Model | UUID-based user model with bot support, avatar, biography |
200
+ | **Core** | Soft Delete System | `BaseModel` with soft delete, restore, and audit trail (`created_by`, `updated_by`) |
201
+ | **Core** | Auto Notifications | Real-time WebSocket notifications on CRUD operations via `BaseModel.save()` |
202
+ | **Dashboard** | Admin Dashboard | Custom dashboard callback with badge system, cache-backed for performance |
203
+ | **Security** | Rate Limiting | IP-based and user-based rate limiting with Redis backend (429 responses) |
204
+ | **Security** | IP Blacklist | Static (`.env` CIDR) + dynamic (admin-managed, Redis TTL) blocking |
205
+ | **Security** | UA Blacklist | User-Agent substring/regex matching via admin panel or `.env` |
206
+ | **Tracking** | Activity Logs | `UserActivity`, `AnonymousActivity`, `VisitProfile` — full request audit trail |
207
+ | **Files** | File Management | Excel/PDF upload with SHA-256 integrity verification |
208
+ | **Feedback** | Feedback System | Per-model feedback collection, viewable in admin change forms |
209
+ | **Admin** | Grid View | Card-based user listing with avatar, badges, and role indicators |
210
+ | **Admin** | Import/Export | `django-import-export` integration for data portability |
211
+ | **Admin** | Simple History | `django-simple-history` tracking on all models |
212
+ | **Admin** | Guardian Integration | Object-level permissions via `django-guardian` |
213
+ | **Editor** | CKEditor 5 | Rich text editing with Tailwind-styled output |
214
+ | **Email** | Login Notifications | Auto-generate password + send login email on user creation |
215
+
216
+ ## Installation
217
+
218
+ ### From PyPI (recommended)
219
+
220
+ ```bash
221
+ pip install django-whiteneuron
222
+ ```
223
+
224
+ Or with [uv](https://github.com/astral-sh/uv):
225
+
226
+ ```bash
227
+ uv add django-whiteneuron
228
+ ```
229
+
230
+ ### Specific version from PyPI
231
+
232
+ ```bash
233
+ uv add "django-whiteneuron==0.3.4.12"
234
+ ```
235
+
236
+ ### From GitHub tag
237
+
238
+ ```bash
239
+ uv add "git+https://github.com/White-Neuron/django-whiteneuron.git@v0.3.4.12"
240
+ ```
241
+
242
+ ### From local source
243
+
244
+ ```bash
245
+ uv pip install -e .
246
+ ```
247
+
248
+ ## Quick Start
249
+
250
+ ```bash
251
+ # 1. Add to INSTALLED_APPS (top of list)
252
+ # settings.py
253
+ INSTALLED_APPS = [
254
+ "whiteneuron",
255
+ "whiteneuron.base",
256
+ "whiteneuron.feedbacks",
257
+ "whiteneuron.file_management",
258
+ "whiteneuron.contrib",
259
+ "whiteneuron.dashboard",
260
+ # ... your other apps
261
+ ]
262
+
263
+ # 2. Set custom user model
264
+ AUTH_USER_MODEL = "base.User"
265
+
266
+ # 3. Add middleware (order matters)
267
+ MIDDLEWARE = [
268
+ "django.middleware.security.SecurityMiddleware",
269
+ "whiteneuron.base.middleware.RateLimitMiddleware", # ← immediately after SecurityMiddleware
270
+ "whitenoise.middleware.WhiteNoiseMiddleware",
271
+ "django.contrib.sessions.middleware.SessionMiddleware",
272
+ "django.middleware.common.CommonMiddleware",
273
+ "django.middleware.csrf.CsrfViewMiddleware",
274
+ "django.contrib.auth.middleware.AuthenticationMiddleware",
275
+ "django.contrib.messages.middleware.MessageMiddleware",
276
+ "django.middleware.clickjacking.XFrameOptionsMiddleware",
277
+ "whiteneuron.base.middleware.ReadonlyExceptionHandlerMiddleware",
278
+ "whiteneuron.base.middleware.UserActivityMiddleware", # ← after AuthenticationMiddleware
279
+ "whiteneuron.base.middleware.ThreadLocalMiddleware",
280
+ ]
281
+
282
+ # 4. Run migrations
283
+ python manage.py migrate
284
+
285
+ # 5. Create superuser and start
286
+ python manage.py createsuperuser
287
+ python manage.py runserver
288
+ ```
289
+
290
+ Access the admin at: `http://127.0.0.1:8000/admin/`
291
+
292
+ ## Configuration
293
+
294
+ ### UNFOLD Settings Example
295
+
296
+ ```python
297
+ from django.templatetags.static import static
298
+ from django.utils.translation import gettext_lazy as _
299
+
300
+ UNFOLD = {
301
+ "SITE_HEADER": _("White Neuron"),
302
+ "SITE_TITLE": _("White Neuron Admin"),
303
+ "SITE_SUBHEADER": _("Admin panel"),
304
+ "SITE_ICON": {
305
+ "light": lambda request: static("base/images/logo/WhiteNeuron.png"),
306
+ "dark": lambda request: static("base/images/logo/WhiteNeuron.png"),
307
+ },
308
+ "SITE_FAVICONS": [
309
+ {
310
+ "rel": "icon",
311
+ "sizes": "32x32",
312
+ "type": "image/svg+xml",
313
+ "href": lambda request: static("base/images/logo/WhiteNeuron.png"),
314
+ },
315
+ ],
316
+ "SHOW_HISTORY": False,
317
+ "SHOW_LANGUAGES": True,
318
+ "SHOW_VIEW_ON_SITE": True,
319
+ "SHOW_BACK_BUTTON": True,
320
+ "DASHBOARD_CALLBACK": "whiteneuron.dashboard.views.dashboard_callback",
321
+ "LOGIN": {
322
+ "image": lambda request: static("base/images/login-bg.jpg"),
323
+ },
324
+ "STYLES": [
325
+ lambda request: static("base/css/styles.css"),
326
+ lambda request: static("base/css/btn-styles.css"),
327
+ lambda request: static("base/css/loading.css"),
328
+ ],
329
+ "SCRIPTS": [
330
+ lambda request: static("base/js/loading.js"),
331
+ lambda request: static("base/js/whiteneuron.js"),
332
+ ],
333
+ "BORDER_RADIUS": "6px",
334
+ }
335
+ ```
336
+
337
+ ## Modules
338
+
339
+ | Module | Description | Key Models |
340
+ |---|---|---|
341
+ | `whiteneuron.base` | Core models, admin, middleware, utilities | `User`, `BaseModel`, `Image`, `Mail`, `App`, `IPBlacklist`, `UABlacklist` |
342
+ | `whiteneuron.dashboard` | Dashboard callback and badge system | — |
343
+ | `whiteneuron.notification` | WebSocket real-time notifications | `Notification`, `NotificationConfig` |
344
+ | `whiteneuron.file_management` | File upload with integrity verification | `ExcelFile`, `PDFFile` |
345
+ | `whiteneuron.feedbacks` | Per-model feedback collection | — |
346
+
347
+ ## Middleware & Security
348
+
349
+ ### Rate Limiting
350
+
351
+ ```python
352
+ RATE_LIMIT_REQUESTS = 60 # max requests per window (by IP)
353
+ RATE_LIMIT_WINDOW = 60 # in seconds
354
+ USER_RATE_LIMIT_REQUESTS = 60 # by authenticated user
355
+ USER_RATE_LIMIT_WINDOW = 60
356
+ ```
357
+
358
+ When limit exceeded:
359
+ - API (`/api/` or `Accept: application/json`) → JSON `{"detail": "Too many requests."}` (429)
360
+ - Browser → renders `429.html` with `Retry-After` header
361
+
362
+ ### IP Blacklist
363
+
364
+ **Static** — `.env` (CIDR ranges, loaded at startup):
365
+ ```env
366
+ IP_BLACKLIST=185.220.101.5,194.165.16.0/22,2001:db8::/32
367
+ ```
368
+
369
+ **Dynamic** — Admin panel + Redis (real-time):
370
+ - Permanent block: leave `blocked_until` empty
371
+ - Temporary block: set `blocked_until` → Redis TTL auto-expires
372
+
373
+ ### UA Blacklist
374
+
375
+ Static via `.env`:
376
+ ```env
377
+ UA_BLACKLIST=GPTBot,ClaudeBot,https://openai.com
378
+ ```
379
+
380
+ Dynamic via admin — supports regex patterns with real-time cache rebuild.
381
+
382
+ ## Frontend (Tailwind 4 + daisyUI 5)
383
+
384
+ ```bash
385
+ npm install -D @tailwindcss/cli@next daisyui@latest
386
+ bash scripts/tailwind.sh
387
+ ```
388
+
389
+ Or directly:
390
+ ```bash
391
+ npx @tailwindcss/cli -i styles.css -o whiteneuron/static/base/css/styles.css --minify
392
+ ```
393
+
394
+ ## Environment Variables
395
+
396
+ Copy `env.example` to `.env` and configure. Key variables:
397
+
398
+ | Variable | Description | Default |
399
+ |---|---|---|
400
+ | `SECRET_KEY` | Django secret key | — |
401
+ | `DEBUG` | Debug mode | `True` |
402
+ | `DATABASE` | Database type (`sqlite`/`postgres`) | `sqlite` |
403
+ | `REDIS` / `CACHE_REDIS_LOCATION` | Redis connection | `redis://127.0.0.1:6379` |
404
+ | `CELERY_BROKER_URL` | Celery broker URL | `redis://localhost:6379/0` |
405
+ | `RATE_LIMIT_REQUESTS` | IP rate limit count | `60` |
406
+ | `IP_BLACKLIST` | Static IP blocks (CIDR) | — |
407
+ | `UA_BLACKLIST` | Static UA blocks | — |
408
+
409
+ See `env.example` for the full list.
410
+
411
+ ## Management Commands
412
+
413
+ | Command | Description |
414
+ |---|---|
415
+ | `init_admin` | Create initial admin user |
416
+ | `init_guest` | Create guest user account |
417
+ | `init_groupuser` | Initialize group users |
418
+ | `cleanup_old_activities` | Remove old activity records |
419
+ | `update_visit_profiles` | Update visit profile data |
420
+
421
+ ## Building & Releasing
422
+
423
+ ```bash
424
+ bash scripts/build.sh
425
+ ```
426
+
427
+ This builds Tailwind CSS assets, runs migrations, and creates the Python package via `uv build`.
428
+
429
+ ## Error Pages
430
+
431
+ Templates in `whiteneuron/templates/` are used automatically when `DEBUG=False`:
432
+
433
+ | Template | Error |
434
+ |---|---|
435
+ | `400.html` | Bad Request |
436
+ | `403.html` | Forbidden |
437
+ | `404.html` | Not Found |
438
+ | `429.html` | Too Many Requests |
439
+ | `500.html` | Server Error |
440
+
441
+ ## Documentation
442
+
443
+ - **Giới thiệu**: Xem [docs/INTRODUCTION.md](docs/INTRODUCTION.md) — tài liệu giới thiệu dự án, tính năng nổi bật và ai nên dùng.
444
+ - **Hướng dẫn chi tiết**: Xem [docs/GUIDE.md](docs/GUIDE.md) cho tài liệu module, model, middleware và cấu hình đầy đủ.
445
+ - **Changelog**: See [CHANGELOG.md](CHANGELOG.md) for full version history.
446
+ - **CKEditor 5 Customization**: See [docs/CKEDITOR5_CUSTOMIZATION.md](docs/CKEDITOR5_CUSTOMIZATION.md).
447
+
448
+ ## Contact
449
+
450
+ - Email: [anhnt@whiteneuron.com](mailto:anhnt@whiteneuron.com)
451
+ - Website: [https://whiteneuron.ai](https://whiteneuron.ai)
452
+ - GitHub: [https://github.com/White-Neuron/django-whiteneuron](https://github.com/White-Neuron/django-whiteneuron)
453
+
454
+ ## License
455
+
456
+ MIT License.