django-whiteneuron 0.2.44__tar.gz → 0.2.48__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 (185) hide show
  1. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/PKG-INFO +52 -9
  2. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/README.md +45 -3
  3. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/django_whiteneuron.egg-info/PKG-INFO +52 -9
  4. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/django_whiteneuron.egg-info/SOURCES.txt +2 -0
  5. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/django_whiteneuron.egg-info/requires.txt +3 -2
  6. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/pyproject.toml +8 -21
  7. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/admin.py +37 -150
  8. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/modeladmin.py +36 -59
  9. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/models.py +126 -153
  10. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/utils.py +28 -12
  11. django_whiteneuron-0.2.48/whiteneuron/locale/vi/LC_MESSAGES/django.mo +0 -0
  12. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/locale/vi/LC_MESSAGES/django.po +647 -673
  13. django_whiteneuron-0.2.48/whiteneuron/static/base/css/styles.css +2 -0
  14. django_whiteneuron-0.2.48/whiteneuron/templates/admin/base/app_change_list.html +202 -0
  15. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/templates/admin/base/image_change_form.html +1 -1
  16. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/templates/admin/base/userprofile_change_form.html +1 -1
  17. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/templates/admin/change_list.html +0 -1
  18. django_whiteneuron-0.2.48/whiteneuron/templates/admin/wn_change_form.html +12 -0
  19. django_whiteneuron-0.2.48/whiteneuron/templates/admin/wn_history_panel.html +113 -0
  20. django_whiteneuron-0.2.44/whiteneuron/locale/vi/LC_MESSAGES/django.mo +0 -0
  21. django_whiteneuron-0.2.44/whiteneuron/static/base/css/styles.css +0 -2
  22. django_whiteneuron-0.2.44/whiteneuron/templates/admin/base/app_change_list.html +0 -170
  23. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/LICENSE +0 -0
  24. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/django_whiteneuron.egg-info/dependency_links.txt +0 -0
  25. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/django_whiteneuron.egg-info/top_level.txt +0 -0
  26. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/setup.cfg +0 -0
  27. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/__init__.py +0 -0
  28. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/__init__.py +0 -0
  29. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/apps.py +0 -0
  30. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/asgi.py +0 -0
  31. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/ckeditor.py +0 -0
  32. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/filters.py +0 -0
  33. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/forms.py +0 -0
  34. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/management/__init__.py +0 -0
  35. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/management/commands/__init__.py +0 -0
  36. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/management/commands/init_admin.py +0 -0
  37. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/management/commands/init_groupuser.py +0 -0
  38. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/management/commands/init_guest.py +0 -0
  39. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/middleware.py +0 -0
  40. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/migrations/0001_initial.py +0 -0
  41. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/migrations/0002_imagemodel_userprofile_user_avatar_user_biography_and_more.py +0 -0
  42. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/migrations/0003_notification_obj_link.py +0 -0
  43. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/migrations/0004_delete_notification.py +0 -0
  44. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/migrations/0005_user_show_softdelete.py +0 -0
  45. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/migrations/0006_user_is_bot.py +0 -0
  46. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/migrations/0007_app.py +0 -0
  47. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/migrations/0008_app_created_at_app_created_by_app_deleted_at_and_more.py +0 -0
  48. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/migrations/0009_alter_app_table.py +0 -0
  49. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/migrations/0010_app_category.py +0 -0
  50. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/migrations/0011_alter_app_options.py +0 -0
  51. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/migrations/0012_app_permission.py +0 -0
  52. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/migrations/0013_app_thumbnail_url.py +0 -0
  53. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/migrations/0014_alter_app_created_at_alter_app_updated_at_and_more.py +0 -0
  54. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/migrations/0015_ipblacklist.py +0 -0
  55. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/migrations/0016_uablacklist.py +0 -0
  56. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/migrations/0017_alter_uablacklist_pattern.py +0 -0
  57. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/migrations/__init__.py +0 -0
  58. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/resources.py +0 -0
  59. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/settings.py +0 -0
  60. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/sites.py +0 -0
  61. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/tasks.py +0 -0
  62. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/templatetags/__init__.py +0 -0
  63. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/templatetags/unfold_list_custom.py +0 -0
  64. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/templatetags/wn_filters.py +0 -0
  65. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/tests.py +0 -0
  66. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/thread_local.py +0 -0
  67. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/urls.py +0 -0
  68. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/views.py +0 -0
  69. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/widgets.py +0 -0
  70. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/contrib/__init__.py +0 -0
  71. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/contrib/wn_import_export/__init__.py +0 -0
  72. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/contrib/wn_import_export/admin.py +0 -0
  73. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/contrib/wn_import_export/constants.py +0 -0
  74. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/contrib/wn_import_export/mixins.py +0 -0
  75. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/contrib/wn_import_export/tasks.py +0 -0
  76. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/contrib/wn_import_export/utils.py +0 -0
  77. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/contrib/wn_modeltranslation/__init__.py +0 -0
  78. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/contrib/wn_modeltranslation/admin.py +0 -0
  79. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/contrib/wn_modeltranslation/utils.py +0 -0
  80. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/dashboard/__init__.py +0 -0
  81. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/dashboard/admin.py +0 -0
  82. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/dashboard/apps.py +0 -0
  83. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/dashboard/migrations/__init__.py +0 -0
  84. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/dashboard/models.py +0 -0
  85. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/dashboard/tests.py +0 -0
  86. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/dashboard/views.py +0 -0
  87. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/feedbacks/__init__.py +0 -0
  88. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/feedbacks/admin.py +0 -0
  89. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/feedbacks/apps.py +0 -0
  90. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/feedbacks/migrations/0001_initial.py +0 -0
  91. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/feedbacks/migrations/0002_feedbackdata_created_by_feedbackdata_deleted_at_and_more.py +0 -0
  92. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/feedbacks/migrations/0003_feedbackdata_note.py +0 -0
  93. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/feedbacks/migrations/0004_alter_feedbackdata_object_id.py +0 -0
  94. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/feedbacks/migrations/0005_feedbackdata_field.py +0 -0
  95. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/feedbacks/migrations/0006_alter_feedbackdata_created_at_and_more.py +0 -0
  96. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/feedbacks/migrations/__init__.py +0 -0
  97. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/feedbacks/models.py +0 -0
  98. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/feedbacks/tests.py +0 -0
  99. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/feedbacks/urls.py +0 -0
  100. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/feedbacks/utils.py +0 -0
  101. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/feedbacks/views.py +0 -0
  102. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/file_management/__init__.py +0 -0
  103. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/file_management/admin.py +0 -0
  104. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/file_management/apps.py +0 -0
  105. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/file_management/migrations/0001_initial.py +0 -0
  106. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/file_management/migrations/0002_alter_excelfile_options_alter_pdffile_options_and_more.py +0 -0
  107. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/file_management/migrations/0003_alter_excelfile_created_at_and_more.py +0 -0
  108. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/file_management/migrations/__init__.py +0 -0
  109. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/file_management/models.py +0 -0
  110. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/file_management/tests.py +0 -0
  111. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/file_management/utils.py +0 -0
  112. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/file_management/views.py +0 -0
  113. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/manage.py +0 -0
  114. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/notification/__init__.py +0 -0
  115. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/notification/admin.py +0 -0
  116. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/notification/apps.py +0 -0
  117. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/notification/consumers.py +0 -0
  118. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/notification/management/__init__.py +0 -0
  119. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/notification/management/commands/__init__.py +0 -0
  120. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/notification/management/commands/call_demo_noti.py +0 -0
  121. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/notification/migrations/0001_initial.py +0 -0
  122. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/notification/migrations/0002_alter_notificationconfig_event_type.py +0 -0
  123. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/notification/migrations/0003_notification.py +0 -0
  124. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/notification/migrations/0004_alter_notification_flag.py +0 -0
  125. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/notification/migrations/0005_notification_keywords.py +0 -0
  126. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/notification/migrations/0006_remove_notification_keywords.py +0 -0
  127. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/notification/migrations/0007_notification_changed_data.py +0 -0
  128. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/notification/migrations/0008_alter_notification_changed_data.py +0 -0
  129. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/notification/migrations/0009_notification_action_by_alter_notification_user.py +0 -0
  130. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/notification/migrations/0010_alter_notification_user.py +0 -0
  131. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/notification/migrations/0011_alter_notification_user.py +0 -0
  132. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/notification/migrations/0012_alter_notification_action_and_more.py +0 -0
  133. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/notification/migrations/__init__.py +0 -0
  134. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/notification/models.py +0 -0
  135. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/notification/routing.py +0 -0
  136. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/notification/tests.py +0 -0
  137. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/notification/utils.py +0 -0
  138. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/notification/views.py +0 -0
  139. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/static/base/css/btn-styles.css +0 -0
  140. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/static/base/css/ckeditor5.css +0 -0
  141. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/static/base/css/loading.css +0 -0
  142. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/static/base/forms/css/html-editor.css +0 -0
  143. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/static/base/forms/js/format.html.js +0 -0
  144. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/static/base/forms/js/trix.config.js +0 -0
  145. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/static/base/images/delete.svg +0 -0
  146. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/static/base/images/edit.svg +0 -0
  147. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/static/base/images/icon-viewlink.svg +0 -0
  148. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/static/base/images/loading.gif +0 -0
  149. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/static/base/images/login-bg.jpg +0 -0
  150. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/static/base/images/login_bg.jpg +0 -0
  151. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/static/base/images/logo/WhiteNeuron.png +0 -0
  152. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/static/base/js/chart.min.js +0 -0
  153. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/static/base/js/d3.v7.min.js +0 -0
  154. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/static/base/js/loading.js +0 -0
  155. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/static/base/js/whiteneuron.js +0 -0
  156. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/synchronization/__init__.py +0 -0
  157. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/synchronization/admin.py +0 -0
  158. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/synchronization/apps.py +0 -0
  159. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/synchronization/migrations/__init__.py +0 -0
  160. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/synchronization/models.py +0 -0
  161. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/synchronization/tests.py +0 -0
  162. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/synchronization/views.py +0 -0
  163. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/templates/400.html +0 -0
  164. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/templates/403.html +0 -0
  165. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/templates/404.html +0 -0
  166. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/templates/429.html +0 -0
  167. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/templates/500.html +0 -0
  168. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/templates/admin/auth/user/add_form.html +0 -0
  169. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/templates/admin/base.html +0 -0
  170. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/templates/admin/feedbacks/feedback_change_form.html +0 -0
  171. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/templates/admin/grid_view_results.html +0 -0
  172. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/templates/admin/header.html +0 -0
  173. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/templates/admin/index.html +0 -0
  174. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/templates/admin/login.html +0 -0
  175. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/templates/admin/login_after.html +0 -0
  176. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/templates/admin/search_form.html +0 -0
  177. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/templates/admin/submit_line.html +0 -0
  178. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/templates/base/forms/helpers/toolbar.html +0 -0
  179. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/templates/base/forms/wysiwyg.html +0 -0
  180. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/templates/base.html +0 -0
  181. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/templates/unfold/helpers/account_links.html +0 -0
  182. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/templates/unfold/helpers/app_list_badge.html +0 -0
  183. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/templates/unfold/helpers/field_password.html +0 -0
  184. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/templates/unfold/helpers/navigation_user.html +0 -0
  185. {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/templates/unfold/helpers/pagination.html +0 -0
@@ -1,8 +1,8 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: django-whiteneuron
3
- Version: 0.2.44
3
+ Version: 0.2.48
4
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.com>
5
+ Author-email: White Neuron <anhnt@whiteneuron.ai>
6
6
  License: MIT License
7
7
 
8
8
  Copyright (c) 2025 Nguyễn Tú Anh
@@ -25,7 +25,7 @@ License: MIT License
25
25
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
26
26
  SOFTWARE.
27
27
 
28
- Project-URL: homepage, https://github.com/White-Neuron/django-whiteneuron
28
+ Project-URL: homepage, https://whiteneuron.ai
29
29
  Project-URL: repository, https://github.com/White-Neuron/django-whiteneuron
30
30
  Project-URL: changelog, https://github.com/White-Neuron/django-whiteneuron/releases
31
31
  Project-URL: Bug Tracker, https://github.com/White-Neuron/django-whiteneuron/issues
@@ -34,7 +34,7 @@ Keywords: django,plugin,admin,dashboard,whiteneuron
34
34
  Classifier: Development Status :: 4 - Beta
35
35
  Classifier: Intended Audience :: Developers
36
36
  Classifier: Framework :: Django
37
- Classifier: Framework :: Django :: 5.0
37
+ Classifier: Framework :: Django :: 5.2
38
38
  Classifier: Programming Language :: Python :: 3
39
39
  Classifier: Programming Language :: Python :: 3.11
40
40
  Classifier: Programming Language :: Python :: 3.12
@@ -44,7 +44,7 @@ Requires-Python: >=3.11
44
44
  Description-Content-Type: text/markdown
45
45
  License-File: LICENSE
46
46
  Requires-Dist: django-debug-toolbar>=5.0.1
47
- Requires-Dist: django>=5.1.6
47
+ Requires-Dist: django>=5.2.12
48
48
  Requires-Dist: django-celery-beat>=2.7.0
49
49
  Requires-Dist: django-guardian>=2.4.0
50
50
  Requires-Dist: django-imagekit>=5.0.0
@@ -58,7 +58,7 @@ Requires-Dist: markdown>=3.7
58
58
  Requires-Dist: openai>=1.58.1
59
59
  Requires-Dist: openpyxl>=3.1.5
60
60
  Requires-Dist: pandas>=2.2.3
61
- Requires-Dist: pillow>=11.0.0
61
+ Requires-Dist: pillow>=12.1.1
62
62
  Requires-Dist: python-dotenv>=1.0.1
63
63
  Requires-Dist: redis>=5.2.1
64
64
  Requires-Dist: sentry-sdk==2.28.0
@@ -74,6 +74,7 @@ Requires-Dist: django-ckeditor-5>=0.2.18
74
74
  Requires-Dist: django-cors-headers>=4.3.0
75
75
  Requires-Dist: django-unfold>=0.85.0
76
76
  Requires-Dist: djangoql>=0.18.1
77
+ Requires-Dist: cryptography>=46.0.5
77
78
  Provides-Extra: dev
78
79
  Requires-Dist: pytest; extra == "dev"
79
80
  Requires-Dist: black; extra == "dev"
@@ -94,18 +95,59 @@ A modern Django Admin extension focused on UI/UX, dashboard, feedback, file mana
94
95
 
95
96
  ## Current Version
96
97
 
97
- - 0.2.44
98
+ - 0.2.48
98
99
 
99
100
  ## Compatibility
100
101
 
101
102
  - Python >= 3.11
102
- - Django >= 5.1.6
103
+ - Django >= 5.2.12
103
104
  - django-unfold >= 0.85.0
104
105
  - Tailwind CSS 4.x + daisyUI 5.x (for the bundled frontend styles)
105
106
 
106
107
  ## Changelog
107
108
 
108
- ### v0.2.44 (2026-04-02) — latest
109
+ ### v0.2.48 (2026-04-06) — latest
110
+ **Feature: Change history panel — modal UI, M2M diff, permission gate**
111
+ - **Added**: Change history panel shown on every change-form — floating "History" button (bottom-right, `fixed position`) opens a scrollable modal listing the 50 most recent `Notification` records for the object.
112
+ - **Added**: Each history entry displays: action badge (Create/Update/Delete/Restore), actor avatar + username, timestamp, and an **old → new diff** for every changed field using `changed_data` from the `Notification` model.
113
+ - **Added**: `has_view_history_permission()` on `ModelAdmin` — panel is shown only to superusers or users with `change` permission; read-only staff cannot see history.
114
+ - **Added**: `show_history = True` class attribute on `ModelAdmin` — subclasses can opt out per model by setting `show_history = False`.
115
+ - **Fixed**: DaisyUI v5 `ui-` prefix applied correctly to `ui-modal`, `ui-modal-box`, `ui-modal-backdrop`, `ui-btn` — resolves invisible/broken modal.
116
+ - **Fixed**: Trigger `<button type="button">` — prevents accidental form submission when clicking the History button.
117
+ - **Fixed**: Close button and backdrop use `dialog.close()` via JS — avoids nested `<form method="dialog">` inside the admin form (HTML spec violation that caused the button to escape DOM).
118
+ - **Fixed**: UNFOLD's built-in "Lịch sử" button hidden via `{% block object-tools-items %}{% endblock %}` — eliminates duplicate history link in the toolbar.
119
+ - **Improved**: `import ast` and `reverse` moved to module-level imports in `modeladmin.py`.
120
+ - **Improved**: All panel strings wrapped in `{% trans %}` for full i18n support.
121
+ - **Improved**: `change_list.html` — pagination state (`p=...`) now preserved in `sessionStorage` alongside filters; navigating back from a change form restores the correct page instead of jumping to page 1.
122
+
123
+ ### v0.2.47 (2026-04-05)
124
+ **Feature: M2M change tracking, zero-DB App dashboard, dual-view UI**
125
+ - **Added**: `m2m_changed` signal handler for all concrete `BaseModel` subclasses — `.add()`, `.remove()`, `.set()`, `.clear()` on any ManyToMany field now correctly updates `updated_at`/`updated_by` and sends a notification to superusers with the same `changed_data` format as `save()`.
126
+ - **Added**: App dashboard — two toggle-able view modes: **grid** (2-level category → app cards) and **list** (flat grouped), persisted via `localStorage`.
127
+ - **Removed**: `init_app_db()` DB-write mechanism — App dashboard now reads directly from `settings.UNFOLD['SIDEBAR']` via a new `_parse_sidebar_apps()` helper; zero DB writes on page load.
128
+ - **Fixed**: `app_badge_callback()` counted from stale DB; now counts from `settings.UNFOLD['SIDEBAR']` — badge is always in sync with config.
129
+ - **Fixed**: `has_permission()` in `AppAdmin` now handles callable UNFOLD permissions (lambdas) in addition to dotted-string imports.
130
+ - **Fixed**: Protocol-relative URLs (`//cdn…`) in app icons/thumbnails were incorrectly routed to `{% static %}`; added `|slice:":2" == "//"` check across all render paths.
131
+ - **Fixed**: Mosaic `+N` counter (categories with >4 apps) correctly shows 3 icons + overflow count.
132
+ - **Improved**: Pagination and filter bars hidden on App dashboard via `{% block pagination %}` and `{% block filters %}` override.
133
+ - **Improved**: `pyproject.toml` — `package-data` reduced from 14 lines to 3; removed unused `pyasn1` dep, dead `[tool.uv.workspace]`, empty `[tool.setuptools]`; fixed `Framework :: Django :: 5.2` classifier.
134
+
135
+ ### v0.2.46 (2026-04-04)
136
+ **Fix: Email template — logo URL, company name, and contact details**
137
+ - **Fixed**: Logo URL updated from `api.logo.com` to stable Google-hosted URL.
138
+ - **Fixed**: Company name updated to `White Neuron Co., Ltd` (official name).
139
+ - **Fixed**: Title updated to `Founder & CTO`.
140
+ - **Fixed**: Website URL in signature changed to full `https://whiteneuron.ai`.
141
+
142
+ ### v0.2.45 (2026-04-03)
143
+ **Security: 11 CVE fixes across django, pillow, cryptography, pyasn1**
144
+ - **Security**: `django` lower bound raised from `>=5.1.6` to `>=5.2.12` — patches 7 CVEs including SQL Injection (CVE-2026-1207), DoS ×5, race condition in file-system storage (CVE-2026-25674), and URLField vulnerability (CVE-2026-25673).
145
+ - **Security**: `pillow` lower bound raised from `>=11.0.0` to `>=12.1.1` — patches heap buffer overflow (CVE-2026-25990).
146
+ - **Security**: `cryptography>=46.0.5` added as explicit dependency — patches Improper Input Validation (CVE-2026-26007); previously uncontrolled transitive dependency.
147
+ - **Security**: `pyasn1>=0.6.2` added as explicit dependency — patches CVE-2026-23490; `==0.6.1` was the sole affected version.
148
+ - **Validation**: `safety` scan confirms 0 known vulnerabilities after upgrade (down from 11).
149
+
150
+ ### v0.2.44 (2026-04-02)
109
151
  **Fixes & Improvements: Feedback System — Error handling, input limits, i18n lazy evaluation**
110
152
  - **Fixed**: `changeform_view` now returns `JsonResponse({"success": True})` after a successful resolve instead of falling through to `super()` with a POST request — prevents a spurious HTTP 403 caused by `has_change_permission = False`.
111
153
  - **Fixed**: `note` is read from `request.POST` instead of `request.GET` — prevents HTTP 414 (URI Too Long) when the note is lengthy.
@@ -113,6 +155,7 @@ A modern Django Admin extension focused on UI/UX, dashboard, feedback, file mana
113
155
  - **Added**: Two-sided character limits — `maxlength` attribute + live counter on client; server-side validation: `note ≤ 500`, `feedback_message ≤ 2000`.
114
156
  - **Added**: `get_short_message()` in `FeedbackDataAdmin.list_display` — truncates to 200 words via Django's `Truncator`.
115
157
  - **Fixed**: `search_help_text` moved from `__init__` to a `@property` using `format_lazy` — now re-evaluates per request and responds correctly to language switches instead of being frozen at server startup.
158
+ - **Improved**: `base_badge_callback()` accepts an optional `filter_kwargs` parameter; `feedback_data_badge_callback()` now scopes the badge count to the current user for non-superusers.
116
159
 
117
160
  ### v0.2.43 (2026-04-01)
118
161
  **Feature: Feedback System — DaisyUI modals, anti-spam cooldown, i18n, security hardening**
@@ -11,18 +11,59 @@ A modern Django Admin extension focused on UI/UX, dashboard, feedback, file mana
11
11
 
12
12
  ## Current Version
13
13
 
14
- - 0.2.44
14
+ - 0.2.48
15
15
 
16
16
  ## Compatibility
17
17
 
18
18
  - Python >= 3.11
19
- - Django >= 5.1.6
19
+ - Django >= 5.2.12
20
20
  - django-unfold >= 0.85.0
21
21
  - Tailwind CSS 4.x + daisyUI 5.x (for the bundled frontend styles)
22
22
 
23
23
  ## Changelog
24
24
 
25
- ### v0.2.44 (2026-04-02) — latest
25
+ ### v0.2.48 (2026-04-06) — latest
26
+ **Feature: Change history panel — modal UI, M2M diff, permission gate**
27
+ - **Added**: Change history panel shown on every change-form — floating "History" button (bottom-right, `fixed position`) opens a scrollable modal listing the 50 most recent `Notification` records for the object.
28
+ - **Added**: Each history entry displays: action badge (Create/Update/Delete/Restore), actor avatar + username, timestamp, and an **old → new diff** for every changed field using `changed_data` from the `Notification` model.
29
+ - **Added**: `has_view_history_permission()` on `ModelAdmin` — panel is shown only to superusers or users with `change` permission; read-only staff cannot see history.
30
+ - **Added**: `show_history = True` class attribute on `ModelAdmin` — subclasses can opt out per model by setting `show_history = False`.
31
+ - **Fixed**: DaisyUI v5 `ui-` prefix applied correctly to `ui-modal`, `ui-modal-box`, `ui-modal-backdrop`, `ui-btn` — resolves invisible/broken modal.
32
+ - **Fixed**: Trigger `<button type="button">` — prevents accidental form submission when clicking the History button.
33
+ - **Fixed**: Close button and backdrop use `dialog.close()` via JS — avoids nested `<form method="dialog">` inside the admin form (HTML spec violation that caused the button to escape DOM).
34
+ - **Fixed**: UNFOLD's built-in "Lịch sử" button hidden via `{% block object-tools-items %}{% endblock %}` — eliminates duplicate history link in the toolbar.
35
+ - **Improved**: `import ast` and `reverse` moved to module-level imports in `modeladmin.py`.
36
+ - **Improved**: All panel strings wrapped in `{% trans %}` for full i18n support.
37
+ - **Improved**: `change_list.html` — pagination state (`p=...`) now preserved in `sessionStorage` alongside filters; navigating back from a change form restores the correct page instead of jumping to page 1.
38
+
39
+ ### v0.2.47 (2026-04-05)
40
+ **Feature: M2M change tracking, zero-DB App dashboard, dual-view UI**
41
+ - **Added**: `m2m_changed` signal handler for all concrete `BaseModel` subclasses — `.add()`, `.remove()`, `.set()`, `.clear()` on any ManyToMany field now correctly updates `updated_at`/`updated_by` and sends a notification to superusers with the same `changed_data` format as `save()`.
42
+ - **Added**: App dashboard — two toggle-able view modes: **grid** (2-level category → app cards) and **list** (flat grouped), persisted via `localStorage`.
43
+ - **Removed**: `init_app_db()` DB-write mechanism — App dashboard now reads directly from `settings.UNFOLD['SIDEBAR']` via a new `_parse_sidebar_apps()` helper; zero DB writes on page load.
44
+ - **Fixed**: `app_badge_callback()` counted from stale DB; now counts from `settings.UNFOLD['SIDEBAR']` — badge is always in sync with config.
45
+ - **Fixed**: `has_permission()` in `AppAdmin` now handles callable UNFOLD permissions (lambdas) in addition to dotted-string imports.
46
+ - **Fixed**: Protocol-relative URLs (`//cdn…`) in app icons/thumbnails were incorrectly routed to `{% static %}`; added `|slice:":2" == "//"` check across all render paths.
47
+ - **Fixed**: Mosaic `+N` counter (categories with >4 apps) correctly shows 3 icons + overflow count.
48
+ - **Improved**: Pagination and filter bars hidden on App dashboard via `{% block pagination %}` and `{% block filters %}` override.
49
+ - **Improved**: `pyproject.toml` — `package-data` reduced from 14 lines to 3; removed unused `pyasn1` dep, dead `[tool.uv.workspace]`, empty `[tool.setuptools]`; fixed `Framework :: Django :: 5.2` classifier.
50
+
51
+ ### v0.2.46 (2026-04-04)
52
+ **Fix: Email template — logo URL, company name, and contact details**
53
+ - **Fixed**: Logo URL updated from `api.logo.com` to stable Google-hosted URL.
54
+ - **Fixed**: Company name updated to `White Neuron Co., Ltd` (official name).
55
+ - **Fixed**: Title updated to `Founder & CTO`.
56
+ - **Fixed**: Website URL in signature changed to full `https://whiteneuron.ai`.
57
+
58
+ ### v0.2.45 (2026-04-03)
59
+ **Security: 11 CVE fixes across django, pillow, cryptography, pyasn1**
60
+ - **Security**: `django` lower bound raised from `>=5.1.6` to `>=5.2.12` — patches 7 CVEs including SQL Injection (CVE-2026-1207), DoS ×5, race condition in file-system storage (CVE-2026-25674), and URLField vulnerability (CVE-2026-25673).
61
+ - **Security**: `pillow` lower bound raised from `>=11.0.0` to `>=12.1.1` — patches heap buffer overflow (CVE-2026-25990).
62
+ - **Security**: `cryptography>=46.0.5` added as explicit dependency — patches Improper Input Validation (CVE-2026-26007); previously uncontrolled transitive dependency.
63
+ - **Security**: `pyasn1>=0.6.2` added as explicit dependency — patches CVE-2026-23490; `==0.6.1` was the sole affected version.
64
+ - **Validation**: `safety` scan confirms 0 known vulnerabilities after upgrade (down from 11).
65
+
66
+ ### v0.2.44 (2026-04-02)
26
67
  **Fixes & Improvements: Feedback System — Error handling, input limits, i18n lazy evaluation**
27
68
  - **Fixed**: `changeform_view` now returns `JsonResponse({"success": True})` after a successful resolve instead of falling through to `super()` with a POST request — prevents a spurious HTTP 403 caused by `has_change_permission = False`.
28
69
  - **Fixed**: `note` is read from `request.POST` instead of `request.GET` — prevents HTTP 414 (URI Too Long) when the note is lengthy.
@@ -30,6 +71,7 @@ A modern Django Admin extension focused on UI/UX, dashboard, feedback, file mana
30
71
  - **Added**: Two-sided character limits — `maxlength` attribute + live counter on client; server-side validation: `note ≤ 500`, `feedback_message ≤ 2000`.
31
72
  - **Added**: `get_short_message()` in `FeedbackDataAdmin.list_display` — truncates to 200 words via Django's `Truncator`.
32
73
  - **Fixed**: `search_help_text` moved from `__init__` to a `@property` using `format_lazy` — now re-evaluates per request and responds correctly to language switches instead of being frozen at server startup.
74
+ - **Improved**: `base_badge_callback()` accepts an optional `filter_kwargs` parameter; `feedback_data_badge_callback()` now scopes the badge count to the current user for non-superusers.
33
75
 
34
76
  ### v0.2.43 (2026-04-01)
35
77
  **Feature: Feedback System — DaisyUI modals, anti-spam cooldown, i18n, security hardening**
@@ -1,8 +1,8 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: django-whiteneuron
3
- Version: 0.2.44
3
+ Version: 0.2.48
4
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.com>
5
+ Author-email: White Neuron <anhnt@whiteneuron.ai>
6
6
  License: MIT License
7
7
 
8
8
  Copyright (c) 2025 Nguyễn Tú Anh
@@ -25,7 +25,7 @@ License: MIT License
25
25
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
26
26
  SOFTWARE.
27
27
 
28
- Project-URL: homepage, https://github.com/White-Neuron/django-whiteneuron
28
+ Project-URL: homepage, https://whiteneuron.ai
29
29
  Project-URL: repository, https://github.com/White-Neuron/django-whiteneuron
30
30
  Project-URL: changelog, https://github.com/White-Neuron/django-whiteneuron/releases
31
31
  Project-URL: Bug Tracker, https://github.com/White-Neuron/django-whiteneuron/issues
@@ -34,7 +34,7 @@ Keywords: django,plugin,admin,dashboard,whiteneuron
34
34
  Classifier: Development Status :: 4 - Beta
35
35
  Classifier: Intended Audience :: Developers
36
36
  Classifier: Framework :: Django
37
- Classifier: Framework :: Django :: 5.0
37
+ Classifier: Framework :: Django :: 5.2
38
38
  Classifier: Programming Language :: Python :: 3
39
39
  Classifier: Programming Language :: Python :: 3.11
40
40
  Classifier: Programming Language :: Python :: 3.12
@@ -44,7 +44,7 @@ Requires-Python: >=3.11
44
44
  Description-Content-Type: text/markdown
45
45
  License-File: LICENSE
46
46
  Requires-Dist: django-debug-toolbar>=5.0.1
47
- Requires-Dist: django>=5.1.6
47
+ Requires-Dist: django>=5.2.12
48
48
  Requires-Dist: django-celery-beat>=2.7.0
49
49
  Requires-Dist: django-guardian>=2.4.0
50
50
  Requires-Dist: django-imagekit>=5.0.0
@@ -58,7 +58,7 @@ Requires-Dist: markdown>=3.7
58
58
  Requires-Dist: openai>=1.58.1
59
59
  Requires-Dist: openpyxl>=3.1.5
60
60
  Requires-Dist: pandas>=2.2.3
61
- Requires-Dist: pillow>=11.0.0
61
+ Requires-Dist: pillow>=12.1.1
62
62
  Requires-Dist: python-dotenv>=1.0.1
63
63
  Requires-Dist: redis>=5.2.1
64
64
  Requires-Dist: sentry-sdk==2.28.0
@@ -74,6 +74,7 @@ Requires-Dist: django-ckeditor-5>=0.2.18
74
74
  Requires-Dist: django-cors-headers>=4.3.0
75
75
  Requires-Dist: django-unfold>=0.85.0
76
76
  Requires-Dist: djangoql>=0.18.1
77
+ Requires-Dist: cryptography>=46.0.5
77
78
  Provides-Extra: dev
78
79
  Requires-Dist: pytest; extra == "dev"
79
80
  Requires-Dist: black; extra == "dev"
@@ -94,18 +95,59 @@ A modern Django Admin extension focused on UI/UX, dashboard, feedback, file mana
94
95
 
95
96
  ## Current Version
96
97
 
97
- - 0.2.44
98
+ - 0.2.48
98
99
 
99
100
  ## Compatibility
100
101
 
101
102
  - Python >= 3.11
102
- - Django >= 5.1.6
103
+ - Django >= 5.2.12
103
104
  - django-unfold >= 0.85.0
104
105
  - Tailwind CSS 4.x + daisyUI 5.x (for the bundled frontend styles)
105
106
 
106
107
  ## Changelog
107
108
 
108
- ### v0.2.44 (2026-04-02) — latest
109
+ ### v0.2.48 (2026-04-06) — latest
110
+ **Feature: Change history panel — modal UI, M2M diff, permission gate**
111
+ - **Added**: Change history panel shown on every change-form — floating "History" button (bottom-right, `fixed position`) opens a scrollable modal listing the 50 most recent `Notification` records for the object.
112
+ - **Added**: Each history entry displays: action badge (Create/Update/Delete/Restore), actor avatar + username, timestamp, and an **old → new diff** for every changed field using `changed_data` from the `Notification` model.
113
+ - **Added**: `has_view_history_permission()` on `ModelAdmin` — panel is shown only to superusers or users with `change` permission; read-only staff cannot see history.
114
+ - **Added**: `show_history = True` class attribute on `ModelAdmin` — subclasses can opt out per model by setting `show_history = False`.
115
+ - **Fixed**: DaisyUI v5 `ui-` prefix applied correctly to `ui-modal`, `ui-modal-box`, `ui-modal-backdrop`, `ui-btn` — resolves invisible/broken modal.
116
+ - **Fixed**: Trigger `<button type="button">` — prevents accidental form submission when clicking the History button.
117
+ - **Fixed**: Close button and backdrop use `dialog.close()` via JS — avoids nested `<form method="dialog">` inside the admin form (HTML spec violation that caused the button to escape DOM).
118
+ - **Fixed**: UNFOLD's built-in "Lịch sử" button hidden via `{% block object-tools-items %}{% endblock %}` — eliminates duplicate history link in the toolbar.
119
+ - **Improved**: `import ast` and `reverse` moved to module-level imports in `modeladmin.py`.
120
+ - **Improved**: All panel strings wrapped in `{% trans %}` for full i18n support.
121
+ - **Improved**: `change_list.html` — pagination state (`p=...`) now preserved in `sessionStorage` alongside filters; navigating back from a change form restores the correct page instead of jumping to page 1.
122
+
123
+ ### v0.2.47 (2026-04-05)
124
+ **Feature: M2M change tracking, zero-DB App dashboard, dual-view UI**
125
+ - **Added**: `m2m_changed` signal handler for all concrete `BaseModel` subclasses — `.add()`, `.remove()`, `.set()`, `.clear()` on any ManyToMany field now correctly updates `updated_at`/`updated_by` and sends a notification to superusers with the same `changed_data` format as `save()`.
126
+ - **Added**: App dashboard — two toggle-able view modes: **grid** (2-level category → app cards) and **list** (flat grouped), persisted via `localStorage`.
127
+ - **Removed**: `init_app_db()` DB-write mechanism — App dashboard now reads directly from `settings.UNFOLD['SIDEBAR']` via a new `_parse_sidebar_apps()` helper; zero DB writes on page load.
128
+ - **Fixed**: `app_badge_callback()` counted from stale DB; now counts from `settings.UNFOLD['SIDEBAR']` — badge is always in sync with config.
129
+ - **Fixed**: `has_permission()` in `AppAdmin` now handles callable UNFOLD permissions (lambdas) in addition to dotted-string imports.
130
+ - **Fixed**: Protocol-relative URLs (`//cdn…`) in app icons/thumbnails were incorrectly routed to `{% static %}`; added `|slice:":2" == "//"` check across all render paths.
131
+ - **Fixed**: Mosaic `+N` counter (categories with >4 apps) correctly shows 3 icons + overflow count.
132
+ - **Improved**: Pagination and filter bars hidden on App dashboard via `{% block pagination %}` and `{% block filters %}` override.
133
+ - **Improved**: `pyproject.toml` — `package-data` reduced from 14 lines to 3; removed unused `pyasn1` dep, dead `[tool.uv.workspace]`, empty `[tool.setuptools]`; fixed `Framework :: Django :: 5.2` classifier.
134
+
135
+ ### v0.2.46 (2026-04-04)
136
+ **Fix: Email template — logo URL, company name, and contact details**
137
+ - **Fixed**: Logo URL updated from `api.logo.com` to stable Google-hosted URL.
138
+ - **Fixed**: Company name updated to `White Neuron Co., Ltd` (official name).
139
+ - **Fixed**: Title updated to `Founder & CTO`.
140
+ - **Fixed**: Website URL in signature changed to full `https://whiteneuron.ai`.
141
+
142
+ ### v0.2.45 (2026-04-03)
143
+ **Security: 11 CVE fixes across django, pillow, cryptography, pyasn1**
144
+ - **Security**: `django` lower bound raised from `>=5.1.6` to `>=5.2.12` — patches 7 CVEs including SQL Injection (CVE-2026-1207), DoS ×5, race condition in file-system storage (CVE-2026-25674), and URLField vulnerability (CVE-2026-25673).
145
+ - **Security**: `pillow` lower bound raised from `>=11.0.0` to `>=12.1.1` — patches heap buffer overflow (CVE-2026-25990).
146
+ - **Security**: `cryptography>=46.0.5` added as explicit dependency — patches Improper Input Validation (CVE-2026-26007); previously uncontrolled transitive dependency.
147
+ - **Security**: `pyasn1>=0.6.2` added as explicit dependency — patches CVE-2026-23490; `==0.6.1` was the sole affected version.
148
+ - **Validation**: `safety` scan confirms 0 known vulnerabilities after upgrade (down from 11).
149
+
150
+ ### v0.2.44 (2026-04-02)
109
151
  **Fixes & Improvements: Feedback System — Error handling, input limits, i18n lazy evaluation**
110
152
  - **Fixed**: `changeform_view` now returns `JsonResponse({"success": True})` after a successful resolve instead of falling through to `super()` with a POST request — prevents a spurious HTTP 403 caused by `has_change_permission = False`.
111
153
  - **Fixed**: `note` is read from `request.POST` instead of `request.GET` — prevents HTTP 414 (URI Too Long) when the note is lengthy.
@@ -113,6 +155,7 @@ A modern Django Admin extension focused on UI/UX, dashboard, feedback, file mana
113
155
  - **Added**: Two-sided character limits — `maxlength` attribute + live counter on client; server-side validation: `note ≤ 500`, `feedback_message ≤ 2000`.
114
156
  - **Added**: `get_short_message()` in `FeedbackDataAdmin.list_display` — truncates to 200 words via Django's `Truncator`.
115
157
  - **Fixed**: `search_help_text` moved from `__init__` to a `@property` using `format_lazy` — now re-evaluates per request and responds correctly to language switches instead of being frozen at server startup.
158
+ - **Improved**: `base_badge_callback()` accepts an optional `filter_kwargs` parameter; `feedback_data_badge_callback()` now scopes the badge count to the current user for non-superusers.
116
159
 
117
160
  ### v0.2.43 (2026-04-01)
118
161
  **Feature: Feedback System — DaisyUI modals, anti-spam cooldown, i18n, security hardening**
@@ -164,6 +164,8 @@ whiteneuron/templates/admin/login.html
164
164
  whiteneuron/templates/admin/login_after.html
165
165
  whiteneuron/templates/admin/search_form.html
166
166
  whiteneuron/templates/admin/submit_line.html
167
+ whiteneuron/templates/admin/wn_change_form.html
168
+ whiteneuron/templates/admin/wn_history_panel.html
167
169
  whiteneuron/templates/admin/auth/user/add_form.html
168
170
  whiteneuron/templates/admin/base/app_change_list.html
169
171
  whiteneuron/templates/admin/base/image_change_form.html
@@ -1,5 +1,5 @@
1
1
  django-debug-toolbar>=5.0.1
2
- django>=5.1.6
2
+ django>=5.2.12
3
3
  django-celery-beat>=2.7.0
4
4
  django-guardian>=2.4.0
5
5
  django-imagekit>=5.0.0
@@ -13,7 +13,7 @@ markdown>=3.7
13
13
  openai>=1.58.1
14
14
  openpyxl>=3.1.5
15
15
  pandas>=2.2.3
16
- pillow>=11.0.0
16
+ pillow>=12.1.1
17
17
  python-dotenv>=1.0.1
18
18
  redis>=5.2.1
19
19
  sentry-sdk==2.28.0
@@ -29,6 +29,7 @@ django-ckeditor-5>=0.2.18
29
29
  django-cors-headers>=4.3.0
30
30
  django-unfold>=0.85.0
31
31
  djangoql>=0.18.1
32
+ cryptography>=46.0.5
32
33
 
33
34
  [dev]
34
35
  pytest
@@ -1,16 +1,16 @@
1
1
  [project]
2
2
  name = "django-whiteneuron"
3
- version = "0.2.44"
3
+ version = "0.2.48"
4
4
  description = "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
5
  authors = [
6
- {name = "White Neuron", email = "anhnt@whiteneuron.com"}
6
+ {name = "White Neuron", email = "anhnt@whiteneuron.ai"}
7
7
  ]
8
8
  license = {file = "LICENSE"}
9
9
  readme = "README.md"
10
10
  keywords = ["django", "plugin", "admin", "dashboard", "whiteneuron"]
11
11
  dependencies = [
12
12
  "django-debug-toolbar>=5.0.1",
13
- "django>=5.1.6",
13
+ "django>=5.2.12",
14
14
  "django-celery-beat>=2.7.0",
15
15
  "django-guardian>=2.4.0",
16
16
  "django-imagekit>=5.0.0",
@@ -24,7 +24,7 @@ dependencies = [
24
24
  "openai>=1.58.1",
25
25
  "openpyxl>=3.1.5",
26
26
  "pandas>=2.2.3",
27
- "pillow>=11.0.0",
27
+ "pillow>=12.1.1",
28
28
  "python-dotenv>=1.0.1",
29
29
  "redis>=5.2.1",
30
30
  "sentry-sdk==2.28.0",
@@ -40,6 +40,7 @@ dependencies = [
40
40
  'django-cors-headers>=4.3.0',
41
41
  "django-unfold>=0.85.0",
42
42
  "djangoql>=0.18.1",
43
+ "cryptography>=46.0.5",
43
44
  ]
44
45
  requires-python = ">=3.11"
45
46
 
@@ -47,7 +48,7 @@ classifiers = [
47
48
  "Development Status :: 4 - Beta",
48
49
  "Intended Audience :: Developers",
49
50
  "Framework :: Django",
50
- "Framework :: Django :: 5.0",
51
+ "Framework :: Django :: 5.2",
51
52
  "Programming Language :: Python :: 3",
52
53
  "Programming Language :: Python :: 3.11",
53
54
  "Programming Language :: Python :: 3.12",
@@ -56,37 +57,23 @@ classifiers = [
56
57
  ]
57
58
 
58
59
  [project.urls]
59
- homepage = "https://github.com/White-Neuron/django-whiteneuron"
60
+ homepage = "https://whiteneuron.ai"
60
61
  repository = "https://github.com/White-Neuron/django-whiteneuron"
61
62
  changelog = "https://github.com/White-Neuron/django-whiteneuron/releases"
62
63
  "Bug Tracker" = "https://github.com/White-Neuron/django-whiteneuron/issues"
63
64
  "PyPI" = "https://pypi.org/project/django-whiteneuron/"
64
65
 
65
- [tool.setuptools]
66
66
  [tool.setuptools.packages.find]
67
67
  where = ["."]
68
68
  include = ["whiteneuron*"]
69
69
 
70
70
  [tool.setuptools.package-data]
71
71
  "whiteneuron" = [
72
- "base/templates/**/*",
73
- "base/static/**/*",
74
- "feedbacks/templates/**/*",
75
- "feedbacks/static/**/*",
76
72
  "templates/**/*",
77
- "templates/**/**/*",
78
- "templates/**/**/**/*",
79
73
  "static/**/*",
80
- "static/**/**/*",
81
- "static/**/**/**/*",
82
- 'locale/**/*',
83
- 'locale/**/**/*',
84
- 'locale/**/**/**/*',
74
+ "locale/**/*",
85
75
  ]
86
76
 
87
- [tool.uv.workspace]
88
- members = ["demo"]
89
-
90
77
  [project.optional-dependencies]
91
78
  dev = ["pytest", "black", "flake8", "pre-commit"]
92
79