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.
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/PKG-INFO +52 -9
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/README.md +45 -3
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/django_whiteneuron.egg-info/PKG-INFO +52 -9
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/django_whiteneuron.egg-info/SOURCES.txt +2 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/django_whiteneuron.egg-info/requires.txt +3 -2
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/pyproject.toml +8 -21
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/admin.py +37 -150
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/modeladmin.py +36 -59
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/models.py +126 -153
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/utils.py +28 -12
- django_whiteneuron-0.2.48/whiteneuron/locale/vi/LC_MESSAGES/django.mo +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/locale/vi/LC_MESSAGES/django.po +647 -673
- django_whiteneuron-0.2.48/whiteneuron/static/base/css/styles.css +2 -0
- django_whiteneuron-0.2.48/whiteneuron/templates/admin/base/app_change_list.html +202 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/templates/admin/base/image_change_form.html +1 -1
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/templates/admin/base/userprofile_change_form.html +1 -1
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/templates/admin/change_list.html +0 -1
- django_whiteneuron-0.2.48/whiteneuron/templates/admin/wn_change_form.html +12 -0
- django_whiteneuron-0.2.48/whiteneuron/templates/admin/wn_history_panel.html +113 -0
- django_whiteneuron-0.2.44/whiteneuron/locale/vi/LC_MESSAGES/django.mo +0 -0
- django_whiteneuron-0.2.44/whiteneuron/static/base/css/styles.css +0 -2
- django_whiteneuron-0.2.44/whiteneuron/templates/admin/base/app_change_list.html +0 -170
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/LICENSE +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/django_whiteneuron.egg-info/dependency_links.txt +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/django_whiteneuron.egg-info/top_level.txt +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/setup.cfg +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/__init__.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/__init__.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/apps.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/asgi.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/ckeditor.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/filters.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/forms.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/management/__init__.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/management/commands/__init__.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/management/commands/init_admin.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/management/commands/init_groupuser.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/management/commands/init_guest.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/middleware.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/migrations/0001_initial.py +0 -0
- {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
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/migrations/0003_notification_obj_link.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/migrations/0004_delete_notification.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/migrations/0005_user_show_softdelete.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/migrations/0006_user_is_bot.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/migrations/0007_app.py +0 -0
- {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
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/migrations/0009_alter_app_table.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/migrations/0010_app_category.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/migrations/0011_alter_app_options.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/migrations/0012_app_permission.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/migrations/0013_app_thumbnail_url.py +0 -0
- {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
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/migrations/0015_ipblacklist.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/migrations/0016_uablacklist.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/migrations/0017_alter_uablacklist_pattern.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/migrations/__init__.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/resources.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/settings.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/sites.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/tasks.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/templatetags/__init__.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/templatetags/unfold_list_custom.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/templatetags/wn_filters.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/tests.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/thread_local.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/urls.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/views.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/base/widgets.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/contrib/__init__.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/contrib/wn_import_export/__init__.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/contrib/wn_import_export/admin.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/contrib/wn_import_export/constants.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/contrib/wn_import_export/mixins.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/contrib/wn_import_export/tasks.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/contrib/wn_import_export/utils.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/contrib/wn_modeltranslation/__init__.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/contrib/wn_modeltranslation/admin.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/contrib/wn_modeltranslation/utils.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/dashboard/__init__.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/dashboard/admin.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/dashboard/apps.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/dashboard/migrations/__init__.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/dashboard/models.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/dashboard/tests.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/dashboard/views.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/feedbacks/__init__.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/feedbacks/admin.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/feedbacks/apps.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/feedbacks/migrations/0001_initial.py +0 -0
- {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
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/feedbacks/migrations/0003_feedbackdata_note.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/feedbacks/migrations/0004_alter_feedbackdata_object_id.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/feedbacks/migrations/0005_feedbackdata_field.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/feedbacks/migrations/0006_alter_feedbackdata_created_at_and_more.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/feedbacks/migrations/__init__.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/feedbacks/models.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/feedbacks/tests.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/feedbacks/urls.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/feedbacks/utils.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/feedbacks/views.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/file_management/__init__.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/file_management/admin.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/file_management/apps.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/file_management/migrations/0001_initial.py +0 -0
- {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
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/file_management/migrations/0003_alter_excelfile_created_at_and_more.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/file_management/migrations/__init__.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/file_management/models.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/file_management/tests.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/file_management/utils.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/file_management/views.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/manage.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/notification/__init__.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/notification/admin.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/notification/apps.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/notification/consumers.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/notification/management/__init__.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/notification/management/commands/__init__.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/notification/management/commands/call_demo_noti.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/notification/migrations/0001_initial.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/notification/migrations/0002_alter_notificationconfig_event_type.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/notification/migrations/0003_notification.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/notification/migrations/0004_alter_notification_flag.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/notification/migrations/0005_notification_keywords.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/notification/migrations/0006_remove_notification_keywords.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/notification/migrations/0007_notification_changed_data.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/notification/migrations/0008_alter_notification_changed_data.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/notification/migrations/0009_notification_action_by_alter_notification_user.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/notification/migrations/0010_alter_notification_user.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/notification/migrations/0011_alter_notification_user.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/notification/migrations/0012_alter_notification_action_and_more.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/notification/migrations/__init__.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/notification/models.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/notification/routing.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/notification/tests.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/notification/utils.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/notification/views.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/static/base/css/btn-styles.css +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/static/base/css/ckeditor5.css +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/static/base/css/loading.css +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/static/base/forms/css/html-editor.css +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/static/base/forms/js/format.html.js +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/static/base/forms/js/trix.config.js +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/static/base/images/delete.svg +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/static/base/images/edit.svg +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/static/base/images/icon-viewlink.svg +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/static/base/images/loading.gif +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/static/base/images/login-bg.jpg +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/static/base/images/login_bg.jpg +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/static/base/images/logo/WhiteNeuron.png +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/static/base/js/chart.min.js +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/static/base/js/d3.v7.min.js +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/static/base/js/loading.js +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/static/base/js/whiteneuron.js +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/synchronization/__init__.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/synchronization/admin.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/synchronization/apps.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/synchronization/migrations/__init__.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/synchronization/models.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/synchronization/tests.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/synchronization/views.py +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/templates/400.html +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/templates/403.html +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/templates/404.html +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/templates/429.html +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/templates/500.html +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/templates/admin/auth/user/add_form.html +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/templates/admin/base.html +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/templates/admin/feedbacks/feedback_change_form.html +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/templates/admin/grid_view_results.html +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/templates/admin/header.html +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/templates/admin/index.html +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/templates/admin/login.html +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/templates/admin/login_after.html +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/templates/admin/search_form.html +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/templates/admin/submit_line.html +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/templates/base/forms/helpers/toolbar.html +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/templates/base/forms/wysiwyg.html +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/templates/base.html +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/templates/unfold/helpers/account_links.html +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/templates/unfold/helpers/app_list_badge.html +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/templates/unfold/helpers/field_password.html +0 -0
- {django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/whiteneuron/templates/unfold/helpers/navigation_user.html +0 -0
- {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.
|
|
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.
|
|
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://
|
|
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.
|
|
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.
|
|
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>=
|
|
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.
|
|
98
|
+
- 0.2.48
|
|
98
99
|
|
|
99
100
|
## Compatibility
|
|
100
101
|
|
|
101
102
|
- Python >= 3.11
|
|
102
|
-
- Django >= 5.
|
|
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.
|
|
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.
|
|
14
|
+
- 0.2.48
|
|
15
15
|
|
|
16
16
|
## Compatibility
|
|
17
17
|
|
|
18
18
|
- Python >= 3.11
|
|
19
|
-
- Django >= 5.
|
|
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.
|
|
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**
|
{django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/django_whiteneuron.egg-info/PKG-INFO
RENAMED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: django-whiteneuron
|
|
3
|
-
Version: 0.2.
|
|
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.
|
|
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://
|
|
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.
|
|
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.
|
|
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>=
|
|
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.
|
|
98
|
+
- 0.2.48
|
|
98
99
|
|
|
99
100
|
## Compatibility
|
|
100
101
|
|
|
101
102
|
- Python >= 3.11
|
|
102
|
-
- Django >= 5.
|
|
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.
|
|
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**
|
{django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/django_whiteneuron.egg-info/SOURCES.txt
RENAMED
|
@@ -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
|
{django_whiteneuron-0.2.44 → django_whiteneuron-0.2.48}/django_whiteneuron.egg-info/requires.txt
RENAMED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
django-debug-toolbar>=5.0.1
|
|
2
|
-
django>=5.
|
|
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>=
|
|
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.
|
|
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.
|
|
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.
|
|
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>=
|
|
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.
|
|
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://
|
|
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
|
-
"
|
|
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
|
|