django-smartbase-admin 0.2.84__py3-none-any.whl → 0.2.85__py3-none-any.whl
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_smartbase_admin/actions/admin_action_list.py +9 -5
- django_smartbase_admin/admin/admin_base.py +50 -41
- django_smartbase_admin/engine/admin_base_view.py +71 -59
- {django_smartbase_admin-0.2.84.dist-info → django_smartbase_admin-0.2.85.dist-info}/METADATA +1 -1
- {django_smartbase_admin-0.2.84.dist-info → django_smartbase_admin-0.2.85.dist-info}/RECORD +7 -7
- {django_smartbase_admin-0.2.84.dist-info → django_smartbase_admin-0.2.85.dist-info}/LICENSE.md +0 -0
- {django_smartbase_admin-0.2.84.dist-info → django_smartbase_admin-0.2.85.dist-info}/WHEEL +0 -0
|
@@ -92,7 +92,7 @@ class SBAdminListAction(SBAdminAction):
|
|
|
92
92
|
)
|
|
93
93
|
self.deselected_rows = self.selection_data.get(DESELECTED_ROWS_KWARG_NAME, [])
|
|
94
94
|
self.page_size = page_size or self.table_params.get(
|
|
95
|
-
TABLE_PARAMS_SIZE_NAME, self.view.get_list_per_page()
|
|
95
|
+
TABLE_PARAMS_SIZE_NAME, self.view.get_list_per_page(request)
|
|
96
96
|
)
|
|
97
97
|
self.init_column_fields()
|
|
98
98
|
self.tabulator_definition = tabulator_definition
|
|
@@ -205,16 +205,18 @@ class SBAdminListAction(SBAdminAction):
|
|
|
205
205
|
self.threadsafe_request
|
|
206
206
|
),
|
|
207
207
|
"search_fields": self.view.get_search_fields(self.threadsafe_request),
|
|
208
|
-
"search_field_placeholder": self.view.get_search_field_placeholder(
|
|
208
|
+
"search_field_placeholder": self.view.get_search_field_placeholder(
|
|
209
|
+
self.threadsafe_request
|
|
210
|
+
),
|
|
209
211
|
"list_actions": self.view.process_actions_permissions(
|
|
210
212
|
self.threadsafe_request, list_actions
|
|
211
213
|
),
|
|
212
214
|
"list_selection_actions": self.view.get_sbadmin_list_selection_actions_grouped(
|
|
213
215
|
self.threadsafe_request
|
|
214
216
|
),
|
|
215
|
-
"config_url": self.view.get_config_url(),
|
|
217
|
+
"config_url": self.view.get_config_url(self.threadsafe_request),
|
|
216
218
|
"new_url": (
|
|
217
|
-
self.view.get_new_url()
|
|
219
|
+
self.view.get_new_url(self.threadsafe_request)
|
|
218
220
|
if self.view.has_add_permission(self.threadsafe_request)
|
|
219
221
|
else None
|
|
220
222
|
),
|
|
@@ -228,7 +230,9 @@ class SBAdminListAction(SBAdminAction):
|
|
|
228
230
|
for sort in self.table_params.get("sort", []):
|
|
229
231
|
order_by.append(f"{'-' if sort['dir'] == 'desc' else ''}{sort['field']}")
|
|
230
232
|
if len(order_by) == 0:
|
|
231
|
-
order_by = self.view.get_list_ordering() or [
|
|
233
|
+
order_by = self.view.get_list_ordering(self.threadsafe_request) or [
|
|
234
|
+
self.get_pk_field().name
|
|
235
|
+
]
|
|
232
236
|
return order_by
|
|
233
237
|
|
|
234
238
|
def get_order_by_fields_from_request(self):
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import json
|
|
2
2
|
import urllib.parse
|
|
3
|
+
from collections.abc import Iterable
|
|
3
4
|
from functools import partial
|
|
5
|
+
from typing import Any
|
|
4
6
|
|
|
5
7
|
from ckeditor.fields import RichTextFormField
|
|
6
8
|
from ckeditor_uploader.fields import RichTextUploadingFormField
|
|
@@ -16,6 +18,7 @@ from django.core.exceptions import (
|
|
|
16
18
|
PermissionDenied,
|
|
17
19
|
)
|
|
18
20
|
from django.db import models
|
|
21
|
+
from django.db.models import QuerySet
|
|
19
22
|
from django.forms import HiddenInput
|
|
20
23
|
from django.forms.models import (
|
|
21
24
|
ModelFormMetaclass,
|
|
@@ -24,7 +27,7 @@ from django.forms.models import (
|
|
|
24
27
|
from django.template.loader import render_to_string
|
|
25
28
|
from django.template.response import TemplateResponse
|
|
26
29
|
from django.urls import reverse
|
|
27
|
-
from django.utils.safestring import mark_safe
|
|
30
|
+
from django.utils.safestring import mark_safe, SafeString
|
|
28
31
|
from django.utils.text import capfirst
|
|
29
32
|
from django.utils.translation import gettext_lazy as _
|
|
30
33
|
from django_admin_inline_paginator.admin import TabularInlinePaginated
|
|
@@ -470,10 +473,10 @@ class SBAdminInlineAndAdminCommon(SBAdminFormFieldWidgetsMixin):
|
|
|
470
473
|
configuration, inline_view_instance.model, admin_site
|
|
471
474
|
)
|
|
472
475
|
|
|
473
|
-
def get_sbadmin_fake_inlines(self, request, obj):
|
|
476
|
+
def get_sbadmin_fake_inlines(self, request, obj) -> Iterable:
|
|
474
477
|
return self.sbadmin_fake_inlines or []
|
|
475
478
|
|
|
476
|
-
def get_inline_instances(self, request, obj=None):
|
|
479
|
+
def get_inline_instances(self, request, obj=None) -> list:
|
|
477
480
|
inline_classes = self.get_inlines(request, obj)
|
|
478
481
|
inline_classes = [*inline_classes] or []
|
|
479
482
|
inline_classes.extend(self.get_sbadmin_fake_inlines(request, obj))
|
|
@@ -492,7 +495,7 @@ class SBAdminInlineAndAdminCommon(SBAdminFormFieldWidgetsMixin):
|
|
|
492
495
|
inlines.append(inline)
|
|
493
496
|
return inlines
|
|
494
497
|
|
|
495
|
-
def init_view_dynamic(self, request, request_data=None, **kwargs):
|
|
498
|
+
def init_view_dynamic(self, request, request_data=None, **kwargs) -> None:
|
|
496
499
|
if SBAdminTranslationsService.is_translated_model(self.model):
|
|
497
500
|
has_default_form = (
|
|
498
501
|
self.form == TranslatableModelForm or self.form == forms.ModelForm
|
|
@@ -504,13 +507,13 @@ class SBAdminInlineAndAdminCommon(SBAdminFormFieldWidgetsMixin):
|
|
|
504
507
|
f"Admin '{self}' form class '{self.form}' needs to extend SBTranslatableModelForm in case of translatable model."
|
|
505
508
|
)
|
|
506
509
|
super().init_view_dynamic(request, request_data, **kwargs)
|
|
507
|
-
self.initialize_form_class(self.form)
|
|
510
|
+
self.initialize_form_class(self.form, request)
|
|
508
511
|
|
|
509
|
-
def initialize_form_class(self, form):
|
|
512
|
+
def initialize_form_class(self, form, request) -> None:
|
|
510
513
|
if form:
|
|
511
514
|
form.view = self
|
|
512
515
|
|
|
513
|
-
def initialize_all_base_fields_form(self, request):
|
|
516
|
+
def initialize_all_base_fields_form(self, request) -> None:
|
|
514
517
|
params = {
|
|
515
518
|
"form": self.form,
|
|
516
519
|
"fields": "__all__",
|
|
@@ -520,10 +523,10 @@ class SBAdminInlineAndAdminCommon(SBAdminFormFieldWidgetsMixin):
|
|
|
520
523
|
|
|
521
524
|
|
|
522
525
|
class SBAdminThirdParty(SBAdminInlineAndAdminCommon, SBAdminBaseView):
|
|
523
|
-
def get_menu_view_url(self, request):
|
|
526
|
+
def get_menu_view_url(self, request) -> str:
|
|
524
527
|
return reverse(f"sb_admin:{self.get_id()}_changelist")
|
|
525
528
|
|
|
526
|
-
def get_id(self):
|
|
529
|
+
def get_id(self) -> str:
|
|
527
530
|
return self.get_model_path()
|
|
528
531
|
|
|
529
532
|
def change_view(self, request, object_id, form_url="", extra_context=None):
|
|
@@ -536,7 +539,7 @@ class SBAdminThirdParty(SBAdminInlineAndAdminCommon, SBAdminBaseView):
|
|
|
536
539
|
extra_context.update(self.get_global_context(request))
|
|
537
540
|
return super().changelist_view(request, extra_context)
|
|
538
541
|
|
|
539
|
-
def get_action_url(self, action, modifier="template"):
|
|
542
|
+
def get_action_url(self, action, modifier="template") -> str:
|
|
540
543
|
return reverse(
|
|
541
544
|
"sb_admin:sb_admin_base",
|
|
542
545
|
kwargs={
|
|
@@ -555,7 +558,7 @@ class SBAdminTranslationStatusMixin:
|
|
|
555
558
|
main_language_code,
|
|
556
559
|
current_lang_code,
|
|
557
560
|
translations_edit_url,
|
|
558
|
-
):
|
|
561
|
+
) -> dict[str, Any]:
|
|
559
562
|
language_code = language[0]
|
|
560
563
|
language_title = language[1]
|
|
561
564
|
this_lang_count = languages_count.get(language_code, 0)
|
|
@@ -591,11 +594,11 @@ class SBAdminTranslationStatusMixin:
|
|
|
591
594
|
}
|
|
592
595
|
|
|
593
596
|
@classmethod
|
|
594
|
-
def get_empty_state(cls):
|
|
597
|
+
def get_empty_state(cls) -> SafeString:
|
|
595
598
|
return mark_safe("<div class='is-empty'></div>")
|
|
596
599
|
|
|
597
600
|
@admin.display(description="")
|
|
598
|
-
def sbadmin_translation_status(self, obj):
|
|
601
|
+
def sbadmin_translation_status(self, obj) -> SafeString:
|
|
599
602
|
if not SBAdminTranslationsService.is_i18n_enabled():
|
|
600
603
|
return self.get_empty_state()
|
|
601
604
|
|
|
@@ -666,19 +669,21 @@ class SBAdmin(
|
|
|
666
669
|
formset.inline_instance.parent_instance = form.instance
|
|
667
670
|
super().save_formset(request, form, formset, change)
|
|
668
671
|
|
|
669
|
-
def get_sbadmin_list_filter(self, request):
|
|
672
|
+
def get_sbadmin_list_filter(self, request) -> Iterable:
|
|
670
673
|
return self.sbadmin_list_filter or self.get_list_filter(request)
|
|
671
674
|
|
|
672
675
|
def get_form(self, request, obj=None, **kwargs):
|
|
673
676
|
self.initialize_all_base_fields_form(request)
|
|
674
677
|
form = super().get_form(request, obj, **kwargs)
|
|
675
|
-
self.initialize_form_class(form)
|
|
678
|
+
self.initialize_form_class(form, request)
|
|
676
679
|
return form
|
|
677
680
|
|
|
678
|
-
def get_id(self):
|
|
681
|
+
def get_id(self) -> str:
|
|
679
682
|
return self.get_model_path()
|
|
680
683
|
|
|
681
|
-
def get_sbadmin_fieldsets(
|
|
684
|
+
def get_sbadmin_fieldsets(
|
|
685
|
+
self, request, object_id=None
|
|
686
|
+
) -> Iterable[tuple[str | None, dict[str, Any]]]:
|
|
682
687
|
fieldsets = self.sbadmin_fieldsets or self.fieldsets
|
|
683
688
|
if fieldsets:
|
|
684
689
|
return fieldsets
|
|
@@ -690,7 +695,9 @@ class SBAdmin(
|
|
|
690
695
|
super().register_autocomplete_views(request)
|
|
691
696
|
self.get_form(request)()
|
|
692
697
|
|
|
693
|
-
def get_fieldsets(
|
|
698
|
+
def get_fieldsets(
|
|
699
|
+
self, request, obj=None
|
|
700
|
+
) -> list[tuple[str | None, dict[str, Any]]]:
|
|
694
701
|
fieldsets = []
|
|
695
702
|
object_id = obj.id if obj else None
|
|
696
703
|
for fieldset in self.get_sbadmin_fieldsets(request, object_id):
|
|
@@ -705,7 +712,9 @@ class SBAdmin(
|
|
|
705
712
|
fieldsets.append(fieldset_django)
|
|
706
713
|
return fieldsets
|
|
707
714
|
|
|
708
|
-
def get_fieldsets_context(
|
|
715
|
+
def get_fieldsets_context(
|
|
716
|
+
self, request, object_id
|
|
717
|
+
) -> dict[str, dict[str | None, dict[str, Any]]]:
|
|
709
718
|
fielsets_context = {}
|
|
710
719
|
for fieldset in self.get_sbadmin_fieldsets(request, object_id):
|
|
711
720
|
actions = fieldset[1].get("actions", [])
|
|
@@ -719,18 +728,18 @@ class SBAdmin(
|
|
|
719
728
|
fielsets_context[fieldset[0]] = fieldset[1]
|
|
720
729
|
return {"fieldsets_context": fielsets_context}
|
|
721
730
|
|
|
722
|
-
def get_sbadmin_tabs(self, request, object_id):
|
|
731
|
+
def get_sbadmin_tabs(self, request, object_id) -> Iterable:
|
|
723
732
|
return self.sbadmin_tabs
|
|
724
733
|
|
|
725
|
-
def get_tabs_context(self, request, object_id):
|
|
734
|
+
def get_tabs_context(self, request, object_id) -> dict[str, Iterable]:
|
|
726
735
|
return {"tabs_context": self.get_sbadmin_tabs(request, object_id)}
|
|
727
736
|
|
|
728
|
-
def get_context_data(self, request):
|
|
737
|
+
def get_context_data(self, request) -> dict[str, Any]:
|
|
729
738
|
return {
|
|
730
739
|
"base_change_list_template": self.change_list_template,
|
|
731
740
|
}
|
|
732
741
|
|
|
733
|
-
def get_menu_view_url(self, request):
|
|
742
|
+
def get_menu_view_url(self, request) -> str:
|
|
734
743
|
all_config = self.get_all_config(request)
|
|
735
744
|
url_suffix = ""
|
|
736
745
|
if all_config and all_config.get("all_params_changed", False):
|
|
@@ -744,10 +753,10 @@ class SBAdmin(
|
|
|
744
753
|
|
|
745
754
|
return f'{reverse(f"sb_admin:{self.get_id()}_changelist")}{url_suffix}'
|
|
746
755
|
|
|
747
|
-
def get_menu_label(self):
|
|
756
|
+
def get_menu_label(self) -> str:
|
|
748
757
|
return self.menu_label or self.model._meta.verbose_name_plural
|
|
749
758
|
|
|
750
|
-
def get_action_url(self, action, modifier="template"):
|
|
759
|
+
def get_action_url(self, action, modifier="template") -> str:
|
|
751
760
|
if not hasattr(self, action):
|
|
752
761
|
raise ImproperlyConfigured(f"Action {action} does not exist on {self}")
|
|
753
762
|
return reverse(
|
|
@@ -759,16 +768,16 @@ class SBAdmin(
|
|
|
759
768
|
},
|
|
760
769
|
)
|
|
761
770
|
|
|
762
|
-
def get_detail_url(self, object_id=None):
|
|
771
|
+
def get_detail_url(self, object_id=None) -> str:
|
|
763
772
|
return reverse(
|
|
764
773
|
f"sb_admin:{self.get_id()}_change",
|
|
765
774
|
kwargs={"object_id": object_id or OBJECT_ID_PLACEHOLDER},
|
|
766
775
|
)
|
|
767
776
|
|
|
768
|
-
def get_new_url(self):
|
|
777
|
+
def get_new_url(self, request) -> str:
|
|
769
778
|
return reverse(f"sb_admin:{self.get_id()}_add")
|
|
770
779
|
|
|
771
|
-
def get_previous_next_context(self, request, object_id):
|
|
780
|
+
def get_previous_next_context(self, request, object_id) -> dict | dict[str, Any]:
|
|
772
781
|
if not self.sbadmin_previous_next_buttons_enabled or not object_id:
|
|
773
782
|
return {}
|
|
774
783
|
changelist_filters = request.GET.get("_changelist_filters", "")
|
|
@@ -900,20 +909,20 @@ class SBAdminInline(
|
|
|
900
909
|
ordering = None
|
|
901
910
|
all_base_fields_form = None
|
|
902
911
|
|
|
903
|
-
def get_ordering(self, request):
|
|
912
|
+
def get_ordering(self, request) -> tuple[str]:
|
|
904
913
|
"""
|
|
905
914
|
Hook for specifying field ordering.
|
|
906
915
|
"""
|
|
907
916
|
return self.ordering or ("-id",)
|
|
908
917
|
|
|
909
|
-
def get_queryset(self, request=None):
|
|
918
|
+
def get_queryset(self, request=None) -> QuerySet:
|
|
910
919
|
qs = super().get_queryset(request)
|
|
911
920
|
return qs.order_by(*self.get_ordering(request))
|
|
912
921
|
|
|
913
|
-
def get_sbadmin_inline_list_actions(self, request):
|
|
922
|
+
def get_sbadmin_inline_list_actions(self, request) -> list:
|
|
914
923
|
return [*(self.sbadmin_inline_list_actions or [])]
|
|
915
924
|
|
|
916
|
-
def get_action_url(self, action, modifier="template"):
|
|
925
|
+
def get_action_url(self, action, modifier="template") -> str:
|
|
917
926
|
return reverse(
|
|
918
927
|
"sb_admin:sb_admin_base",
|
|
919
928
|
kwargs={
|
|
@@ -923,14 +932,14 @@ class SBAdminInline(
|
|
|
923
932
|
},
|
|
924
933
|
)
|
|
925
934
|
|
|
926
|
-
def register_autocomplete_views(self, request):
|
|
935
|
+
def register_autocomplete_views(self, request) -> None:
|
|
927
936
|
super().register_autocomplete_views(request)
|
|
928
937
|
form_class = self.get_formset(request, self.model()).form
|
|
929
|
-
self.initialize_form_class(form_class)
|
|
938
|
+
self.initialize_form_class(form_class, request)
|
|
930
939
|
form_class()
|
|
931
940
|
|
|
932
|
-
def get_context_data(self, request):
|
|
933
|
-
is_sortable_active = self.sortable_field_name and (
|
|
941
|
+
def get_context_data(self, request) -> dict[str, Any]:
|
|
942
|
+
is_sortable_active: bool = self.sortable_field_name and (
|
|
934
943
|
self.has_add_permission(request) or self.has_change_permission(request)
|
|
935
944
|
)
|
|
936
945
|
return {
|
|
@@ -938,7 +947,7 @@ class SBAdminInline(
|
|
|
938
947
|
"is_sortable_active": is_sortable_active,
|
|
939
948
|
}
|
|
940
949
|
|
|
941
|
-
def init_sortable_field(self):
|
|
950
|
+
def init_sortable_field(self) -> None:
|
|
942
951
|
if not self.sortable_field_name:
|
|
943
952
|
for field_name in self.sbadmin_sortable_field_options:
|
|
944
953
|
is_sortable_field_present = False
|
|
@@ -954,15 +963,15 @@ class SBAdminInline(
|
|
|
954
963
|
self.init_sortable_field()
|
|
955
964
|
super().__init__(parent_model, admin_site)
|
|
956
965
|
|
|
957
|
-
def init_view_dynamic(self, request, request_data=None, **kwargs):
|
|
966
|
+
def init_view_dynamic(self, request, request_data=None, **kwargs) -> None:
|
|
958
967
|
return super().init_view_dynamic(request, request_data, **kwargs)
|
|
959
968
|
|
|
960
|
-
def get_id(self):
|
|
969
|
+
def get_id(self) -> str:
|
|
961
970
|
return (
|
|
962
971
|
f"{self.__class__.__name__}_{SBAdminViewService.get_model_path(self.model)}"
|
|
963
972
|
)
|
|
964
973
|
|
|
965
|
-
def init_inline_dynamic(self, request, obj=None):
|
|
974
|
+
def init_inline_dynamic(self, request, obj=None) -> None:
|
|
966
975
|
self.threadsafe_request = request
|
|
967
976
|
self.parent_instance = obj
|
|
968
977
|
|
|
@@ -976,7 +985,7 @@ class SBAdminInline(
|
|
|
976
985
|
self.initialize_all_base_fields_form(request)
|
|
977
986
|
formset = super().get_formset(request, obj, **kwargs)
|
|
978
987
|
form_class = formset.form
|
|
979
|
-
self.initialize_form_class(form_class)
|
|
988
|
+
self.initialize_form_class(form_class, request)
|
|
980
989
|
return formset
|
|
981
990
|
|
|
982
991
|
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import json
|
|
2
2
|
import urllib.parse
|
|
3
3
|
from collections import defaultdict
|
|
4
|
+
from collections.abc import Iterable
|
|
5
|
+
from typing import Any
|
|
4
6
|
|
|
5
7
|
from django.contrib import messages
|
|
6
8
|
from django.contrib.admin.actions import delete_selected
|
|
@@ -54,34 +56,34 @@ class SBAdminBaseView(object):
|
|
|
54
56
|
def get_id(self):
|
|
55
57
|
raise NotImplementedError
|
|
56
58
|
|
|
57
|
-
def get_menu_label(self):
|
|
59
|
+
def get_menu_label(self) -> str:
|
|
58
60
|
return self.menu_label or self.model._meta.verbose_name_plural
|
|
59
61
|
|
|
60
|
-
def has_permission(self, request, obj=None, permission=None):
|
|
62
|
+
def has_permission(self, request, obj=None, permission=None) -> bool:
|
|
61
63
|
return SBAdminViewService.has_permission(
|
|
62
64
|
request=request, view=self, model=self.model, obj=obj, permission=permission
|
|
63
65
|
)
|
|
64
66
|
|
|
65
|
-
def has_add_permission(self, request, obj=None):
|
|
67
|
+
def has_add_permission(self, request, obj=None) -> bool:
|
|
66
68
|
return self.has_permission(request, obj, "add")
|
|
67
69
|
|
|
68
|
-
def has_view_permission(self, request, obj=None):
|
|
70
|
+
def has_view_permission(self, request, obj=None) -> bool:
|
|
69
71
|
return self.has_permission(request, obj, "view")
|
|
70
72
|
|
|
71
|
-
def has_change_permission(self, request, obj=None):
|
|
73
|
+
def has_change_permission(self, request, obj=None) -> bool:
|
|
72
74
|
return self.has_permission(request, obj, "change")
|
|
73
75
|
|
|
74
|
-
def has_delete_permission(self, request, obj=None):
|
|
76
|
+
def has_delete_permission(self, request, obj=None) -> bool:
|
|
75
77
|
return self.has_permission(request, obj, "delete")
|
|
76
78
|
|
|
77
|
-
def has_permission_for_action(self, request, action):
|
|
79
|
+
def has_permission_for_action(self, request, action: SBAdminCustomAction) -> bool:
|
|
78
80
|
return self.has_permission(
|
|
79
81
|
request=request,
|
|
80
82
|
obj=None,
|
|
81
83
|
permission=action,
|
|
82
84
|
)
|
|
83
85
|
|
|
84
|
-
def has_view_or_change_permission(self, request, obj=None):
|
|
86
|
+
def has_view_or_change_permission(self, request, obj=None) -> bool:
|
|
85
87
|
return self.has_view_permission(request, obj) or self.has_change_permission(
|
|
86
88
|
request, obj
|
|
87
89
|
)
|
|
@@ -92,7 +94,9 @@ class SBAdminBaseView(object):
|
|
|
92
94
|
|
|
93
95
|
return inner_view
|
|
94
96
|
|
|
95
|
-
def process_actions(
|
|
97
|
+
def process_actions(
|
|
98
|
+
self, request, actions: list[SBAdminCustomAction]
|
|
99
|
+
) -> list[SBAdminCustomAction]:
|
|
96
100
|
processed_actions = self.process_actions_permissions(request, actions)
|
|
97
101
|
for processed_action in processed_actions:
|
|
98
102
|
if isinstance(processed_action, SBAdminFormViewAction):
|
|
@@ -107,7 +111,9 @@ class SBAdminBaseView(object):
|
|
|
107
111
|
|
|
108
112
|
return processed_actions
|
|
109
113
|
|
|
110
|
-
def process_actions_permissions(
|
|
114
|
+
def process_actions_permissions(
|
|
115
|
+
self, request, actions: list[SBAdminCustomAction]
|
|
116
|
+
) -> list[SBAdminCustomAction]:
|
|
111
117
|
result = []
|
|
112
118
|
for action in actions:
|
|
113
119
|
if self.has_permission_for_action(request, action):
|
|
@@ -173,7 +179,7 @@ class SBAdminBaseView(object):
|
|
|
173
179
|
field.model_field = model_field
|
|
174
180
|
return field
|
|
175
181
|
|
|
176
|
-
def get_username_data(self, request):
|
|
182
|
+
def get_username_data(self, request) -> dict[str, Any]:
|
|
177
183
|
if request.request_data.user.first_name and request.request_data.user.last_name:
|
|
178
184
|
return {
|
|
179
185
|
"full_name": f"{request.request_data.user.first_name} {request.request_data.user.last_name}",
|
|
@@ -184,10 +190,14 @@ class SBAdminBaseView(object):
|
|
|
184
190
|
"initials": request.request_data.user.username[0],
|
|
185
191
|
}
|
|
186
192
|
|
|
187
|
-
def get_sbadmin_detail_actions(
|
|
193
|
+
def get_sbadmin_detail_actions(
|
|
194
|
+
self, request, object_id: int | str | None = None
|
|
195
|
+
) -> Iterable[SBAdminCustomAction] | None:
|
|
188
196
|
return self.sbadmin_detail_actions
|
|
189
197
|
|
|
190
|
-
def get_global_context(
|
|
198
|
+
def get_global_context(
|
|
199
|
+
self, request, object_id: int | str | None = None
|
|
200
|
+
) -> dict[str, Any]:
|
|
191
201
|
return {
|
|
192
202
|
"view_id": self.get_id(),
|
|
193
203
|
"configuration": request.request_data.configuration,
|
|
@@ -207,7 +217,7 @@ class SBAdminBaseView(object):
|
|
|
207
217
|
),
|
|
208
218
|
}
|
|
209
219
|
|
|
210
|
-
def get_model_path(self):
|
|
220
|
+
def get_model_path(self) -> str:
|
|
211
221
|
return SBAdminViewService.get_model_path(self.model)
|
|
212
222
|
|
|
213
223
|
|
|
@@ -239,10 +249,10 @@ class SBAdminBaseListView(SBAdminBaseView):
|
|
|
239
249
|
sbadmin_actions_initialized = False
|
|
240
250
|
sbadmin_list_action_class = SBAdminListAction
|
|
241
251
|
|
|
242
|
-
def activate_reorder(self, request):
|
|
252
|
+
def activate_reorder(self, request) -> None:
|
|
243
253
|
request.reorder_active = True
|
|
244
254
|
|
|
245
|
-
def action_list_json_reorder(self, request, modifier):
|
|
255
|
+
def action_list_json_reorder(self, request, modifier) -> JsonResponse:
|
|
246
256
|
self.activate_reorder(request)
|
|
247
257
|
return self.action_list_json(request, modifier, page_size=100)
|
|
248
258
|
|
|
@@ -273,22 +283,22 @@ class SBAdminBaseListView(SBAdminBaseView):
|
|
|
273
283
|
],
|
|
274
284
|
)
|
|
275
285
|
|
|
276
|
-
def is_reorder_active(self, request):
|
|
286
|
+
def is_reorder_active(self, request) -> bool:
|
|
277
287
|
return (
|
|
278
|
-
self.is_reorder_available()
|
|
288
|
+
self.is_reorder_available(request)
|
|
279
289
|
and getattr(request, "reorder_active", False) == True
|
|
280
290
|
)
|
|
281
291
|
|
|
282
|
-
def is_reorder_available(self):
|
|
292
|
+
def is_reorder_available(self, request) -> str | None:
|
|
283
293
|
return self.sbadmin_list_reorder_field
|
|
284
294
|
|
|
285
|
-
def action_table_reorder(self, request, modifier):
|
|
295
|
+
def action_table_reorder(self, request, modifier) -> JsonResponse:
|
|
286
296
|
self.activate_reorder(request)
|
|
287
297
|
qs = self.get_queryset(request)
|
|
288
298
|
pk_field = SBAdminViewService.get_pk_field_for_model(self.model).name
|
|
289
299
|
old_order = dict(
|
|
290
300
|
qs.values_list(pk_field, self.sbadmin_list_reorder_field).order_by(
|
|
291
|
-
*self.get_list_ordering()
|
|
301
|
+
*self.get_list_ordering(request)
|
|
292
302
|
)
|
|
293
303
|
)
|
|
294
304
|
current_row_id = json.loads(request.POST.get("currentRowId", ""))
|
|
@@ -316,30 +326,30 @@ class SBAdminBaseListView(SBAdminBaseView):
|
|
|
316
326
|
)
|
|
317
327
|
return JsonResponse({"message": request.POST})
|
|
318
328
|
|
|
319
|
-
def action_table_data_edit(self, request, modifier):
|
|
329
|
+
def action_table_data_edit(self, request, modifier) -> HttpResponse:
|
|
320
330
|
current_row_id = json.loads(request.POST.get("currentRowId", ""))
|
|
321
331
|
column_field_name = request.POST.get("columnFieldName", "")
|
|
322
332
|
cell_value = request.POST.get("cellValue", "")
|
|
323
333
|
messages.add_message(request, messages.ERROR, "Not Implemented")
|
|
324
334
|
return HttpResponse(status=200, content=render_notifications(request))
|
|
325
335
|
|
|
326
|
-
def init_actions(self, request):
|
|
336
|
+
def init_actions(self, request) -> None:
|
|
327
337
|
if self.sbadmin_actions_initialized:
|
|
328
338
|
return
|
|
329
339
|
self.process_actions(request, self.get_sbadmin_list_selection_actions(request))
|
|
330
340
|
self.sbadmin_actions_initialized = True
|
|
331
341
|
|
|
332
|
-
def init_view_dynamic(self, request, request_data=None, **kwargs):
|
|
342
|
+
def init_view_dynamic(self, request, request_data=None, **kwargs) -> None:
|
|
333
343
|
super().init_view_dynamic(request, request_data, **kwargs)
|
|
334
344
|
self.init_fields_cache(
|
|
335
345
|
self.get_sbadmin_list_display(request), request.request_data.configuration
|
|
336
346
|
)
|
|
337
347
|
self.init_actions(request)
|
|
338
348
|
|
|
339
|
-
def get_sbadmin_list_display(self, request):
|
|
340
|
-
return self.sbadmin_list_display or self.list_display
|
|
349
|
+
def get_sbadmin_list_display(self, request) -> list[str] | list:
|
|
350
|
+
return self.sbadmin_list_display or self.list_display or []
|
|
341
351
|
|
|
342
|
-
def register_autocomplete_views(self, request):
|
|
352
|
+
def register_autocomplete_views(self, request) -> None:
|
|
343
353
|
super().register_autocomplete_views(request)
|
|
344
354
|
self.init_fields_cache(
|
|
345
355
|
self.get_sbadmin_list_display(request),
|
|
@@ -352,7 +362,7 @@ class SBAdminBaseListView(SBAdminBaseView):
|
|
|
352
362
|
form.view = self
|
|
353
363
|
form()
|
|
354
364
|
|
|
355
|
-
def get_list_display(self, request):
|
|
365
|
+
def get_list_display(self, request) -> list[str] | list:
|
|
356
366
|
return [
|
|
357
367
|
getattr(field, "name", field)
|
|
358
368
|
for field in self.get_sbadmin_list_display(request)
|
|
@@ -364,12 +374,12 @@ class SBAdminBaseListView(SBAdminBaseView):
|
|
|
364
374
|
else:
|
|
365
375
|
return []
|
|
366
376
|
|
|
367
|
-
def get_list_ordering(self):
|
|
377
|
+
def get_list_ordering(self, request) -> Iterable[str] | list:
|
|
368
378
|
return self.ordering or []
|
|
369
379
|
|
|
370
|
-
def get_list_initial_order(self):
|
|
380
|
+
def get_list_initial_order(self, request) -> list[dict[str, Any]]:
|
|
371
381
|
order = []
|
|
372
|
-
for order_field in self.get_list_ordering():
|
|
382
|
+
for order_field in self.get_list_ordering(request):
|
|
373
383
|
direction = "desc" if order_field.startswith("-") else "asc"
|
|
374
384
|
order.append(
|
|
375
385
|
{
|
|
@@ -379,15 +389,15 @@ class SBAdminBaseListView(SBAdminBaseView):
|
|
|
379
389
|
)
|
|
380
390
|
return order
|
|
381
391
|
|
|
382
|
-
def get_list_per_page(self):
|
|
392
|
+
def get_list_per_page(self, request) -> int | None:
|
|
383
393
|
return self.list_per_page
|
|
384
394
|
|
|
385
|
-
def has_add_permission(self, request):
|
|
395
|
+
def has_add_permission(self, request, obj=None) -> bool:
|
|
386
396
|
if self.is_reorder_active(request):
|
|
387
397
|
return False
|
|
388
398
|
return super().has_add_permission(request)
|
|
389
399
|
|
|
390
|
-
def get_tabulator_definition(self, request):
|
|
400
|
+
def get_tabulator_definition(self, request) -> dict[str, Any]:
|
|
391
401
|
view_id = self.get_id()
|
|
392
402
|
tabulator_definition = {
|
|
393
403
|
"viewId": view_id,
|
|
@@ -404,8 +414,8 @@ class SBAdminBaseListView(SBAdminBaseView):
|
|
|
404
414
|
Action.TABLE_REORDER_ACTION.value
|
|
405
415
|
),
|
|
406
416
|
"tableDetailUrl": self.get_detail_url(),
|
|
407
|
-
"tableInitialSort": self.get_list_initial_order(),
|
|
408
|
-
"tableInitialPageSize": self.get_list_per_page(),
|
|
417
|
+
"tableInitialSort": self.get_list_initial_order(request),
|
|
418
|
+
"tableInitialPageSize": self.get_list_per_page(request),
|
|
409
419
|
"tableHistoryEnabled": self.sbadmin_table_history_enabled,
|
|
410
420
|
# used to initialize all columns with these values
|
|
411
421
|
"defaultColumnData": {},
|
|
@@ -447,9 +457,9 @@ class SBAdminBaseListView(SBAdminBaseView):
|
|
|
447
457
|
)
|
|
448
458
|
return tabulator_definition
|
|
449
459
|
|
|
450
|
-
def _get_sbadmin_list_actions(self, request):
|
|
460
|
+
def _get_sbadmin_list_actions(self, request) -> list[SBAdminCustomAction] | list:
|
|
451
461
|
list_actions = [*(self.get_sbadmin_list_actions(request) or [])]
|
|
452
|
-
if self.is_reorder_available():
|
|
462
|
+
if self.is_reorder_available(request):
|
|
453
463
|
list_actions = [
|
|
454
464
|
*list_actions,
|
|
455
465
|
SBAdminCustomAction(
|
|
@@ -461,7 +471,7 @@ class SBAdminBaseListView(SBAdminBaseView):
|
|
|
461
471
|
]
|
|
462
472
|
return list_actions
|
|
463
473
|
|
|
464
|
-
def get_sbadmin_list_actions(self, request):
|
|
474
|
+
def get_sbadmin_list_actions(self, request) -> list[SBAdminCustomAction]:
|
|
465
475
|
if not self.sbadmin_list_actions:
|
|
466
476
|
self.sbadmin_list_actions = [
|
|
467
477
|
SBAdminCustomAction(
|
|
@@ -472,7 +482,7 @@ class SBAdminBaseListView(SBAdminBaseView):
|
|
|
472
482
|
]
|
|
473
483
|
return self.sbadmin_list_actions
|
|
474
484
|
|
|
475
|
-
def get_sbadmin_list_selection_actions(self, request):
|
|
485
|
+
def get_sbadmin_list_selection_actions(self, request) -> list[SBAdminCustomAction]:
|
|
476
486
|
if not self.sbadmin_list_selection_actions:
|
|
477
487
|
self.sbadmin_list_selection_actions = [
|
|
478
488
|
SBAdminCustomAction(
|
|
@@ -489,7 +499,9 @@ class SBAdminBaseListView(SBAdminBaseView):
|
|
|
489
499
|
]
|
|
490
500
|
return self.sbadmin_list_selection_actions
|
|
491
501
|
|
|
492
|
-
def get_sbadmin_list_selection_actions_grouped(
|
|
502
|
+
def get_sbadmin_list_selection_actions_grouped(
|
|
503
|
+
self, request
|
|
504
|
+
) -> dict[str, list[SBAdminCustomAction]]:
|
|
493
505
|
result = {}
|
|
494
506
|
list_selection_actions = self.process_actions(
|
|
495
507
|
request, self.get_sbadmin_list_selection_actions(request)
|
|
@@ -500,7 +512,7 @@ class SBAdminBaseListView(SBAdminBaseView):
|
|
|
500
512
|
result[action.group].append(action)
|
|
501
513
|
return result
|
|
502
514
|
|
|
503
|
-
def get_sbadmin_xlsx_options(self, request):
|
|
515
|
+
def get_sbadmin_xlsx_options(self, request) -> SBAdminXLSXOptions:
|
|
504
516
|
self.sbadmin_xlsx_options = self.sbadmin_xlsx_options or SBAdminXLSXOptions(
|
|
505
517
|
header_cell_format=SBAdminXLSXFormat(
|
|
506
518
|
bg_color="#00aaa7", font_color="#ffffff", bold=True
|
|
@@ -512,7 +524,7 @@ class SBAdminBaseListView(SBAdminBaseView):
|
|
|
512
524
|
)
|
|
513
525
|
return self.sbadmin_xlsx_options
|
|
514
526
|
|
|
515
|
-
def action_xlsx_export(self, request, modifier):
|
|
527
|
+
def action_xlsx_export(self, request, modifier) -> HttpResponse:
|
|
516
528
|
action = self.sbadmin_list_action_class(self, request)
|
|
517
529
|
data = action.get_xlsx_data(request)
|
|
518
530
|
return SBAdminXLSXExportService.create_workbook_http_respone(*data)
|
|
@@ -637,15 +649,15 @@ class SBAdminBaseListView(SBAdminBaseView):
|
|
|
637
649
|
extra_context,
|
|
638
650
|
)
|
|
639
651
|
|
|
640
|
-
def action_list_json(self, request, modifier, page_size=None):
|
|
652
|
+
def action_list_json(self, request, modifier, page_size=None) -> JsonResponse:
|
|
641
653
|
action = self.sbadmin_list_action_class(self, request, page_size=page_size)
|
|
642
654
|
data = action.get_json_data()
|
|
643
655
|
return JsonResponse(data=data, safe=False)
|
|
644
656
|
|
|
645
|
-
def get_sbadmin_list_filter(self, request):
|
|
657
|
+
def get_sbadmin_list_filter(self, request) -> Iterable | None:
|
|
646
658
|
return self.sbadmin_list_filter
|
|
647
659
|
|
|
648
|
-
def get_all_config(self, request):
|
|
660
|
+
def get_all_config(self, request) -> dict[str, Any]:
|
|
649
661
|
all_config = {"name": _("All"), "url_params": {}, "default": True}
|
|
650
662
|
list_filter = self.get_sbadmin_list_filter(request) or []
|
|
651
663
|
if not list_filter:
|
|
@@ -669,10 +681,10 @@ class SBAdminBaseListView(SBAdminBaseView):
|
|
|
669
681
|
}
|
|
670
682
|
return all_config
|
|
671
683
|
|
|
672
|
-
def get_sbadmin_list_view_config(self, request):
|
|
684
|
+
def get_sbadmin_list_view_config(self, request) -> list:
|
|
673
685
|
return self.sbadmin_list_view_config or []
|
|
674
686
|
|
|
675
|
-
def get_base_config(self, request):
|
|
687
|
+
def get_base_config(self, request) -> list[dict[str, Any]]:
|
|
676
688
|
sbadmin_list_config = self.get_sbadmin_list_view_config(request)
|
|
677
689
|
list_view_config = [self.get_all_config(request), *sbadmin_list_config]
|
|
678
690
|
views = []
|
|
@@ -691,7 +703,7 @@ class SBAdminBaseListView(SBAdminBaseView):
|
|
|
691
703
|
)
|
|
692
704
|
return views
|
|
693
705
|
|
|
694
|
-
def get_config_data(self, request):
|
|
706
|
+
def get_config_data(self, request) -> dict[str, list[dict[str, Any]]]:
|
|
695
707
|
from django_smartbase_admin.models import SBAdminListViewConfiguration
|
|
696
708
|
|
|
697
709
|
current_views = list(
|
|
@@ -702,15 +714,15 @@ class SBAdminBaseListView(SBAdminBaseView):
|
|
|
702
714
|
.values()
|
|
703
715
|
)
|
|
704
716
|
for view in current_views:
|
|
705
|
-
view["detail_url"] = self.get_config_url(view["id"])
|
|
717
|
+
view["detail_url"] = self.get_config_url(request, view["id"])
|
|
706
718
|
config_views = self.get_base_config(request)
|
|
707
719
|
config_views.extend(current_views)
|
|
708
720
|
return {"current_views": config_views}
|
|
709
721
|
|
|
710
|
-
def get_ajax_url(self):
|
|
722
|
+
def get_ajax_url(self) -> str:
|
|
711
723
|
return self.get_action_url(Action.LIST_JSON.value)
|
|
712
724
|
|
|
713
|
-
def get_detail_url(self):
|
|
725
|
+
def get_detail_url(self) -> str:
|
|
714
726
|
url = reverse(
|
|
715
727
|
"sb_admin:sb_admin_base",
|
|
716
728
|
kwargs={
|
|
@@ -721,21 +733,21 @@ class SBAdminBaseListView(SBAdminBaseView):
|
|
|
721
733
|
)
|
|
722
734
|
return f"{url}/{OBJECT_ID_PLACEHOLDER}"
|
|
723
735
|
|
|
724
|
-
def get_config_url(self, config_name=None):
|
|
736
|
+
def get_config_url(self, request, config_name=None) -> str:
|
|
725
737
|
return self.get_action_url(Action.CONFIG.value, config_name)
|
|
726
738
|
|
|
727
|
-
def get_new_url(self):
|
|
739
|
+
def get_new_url(self, request) -> None:
|
|
728
740
|
return None
|
|
729
741
|
|
|
730
|
-
def get_context_data(self, request):
|
|
742
|
+
def get_context_data(self, request) -> dict:
|
|
731
743
|
return {}
|
|
732
744
|
|
|
733
|
-
def get_filters_version(self, request):
|
|
745
|
+
def get_filters_version(self, request) -> FilterVersions:
|
|
734
746
|
return (
|
|
735
747
|
self.filters_version or request.request_data.configuration.filters_version
|
|
736
748
|
)
|
|
737
749
|
|
|
738
|
-
def get_filters_template_name(self, request):
|
|
750
|
+
def get_filters_template_name(self, request) -> str:
|
|
739
751
|
filters_version = self.get_filters_version(request)
|
|
740
752
|
if filters_version is FilterVersions.FILTERS_VERSION_2:
|
|
741
753
|
return "sb_admin/components/filters_v2.html"
|
|
@@ -743,7 +755,7 @@ class SBAdminBaseListView(SBAdminBaseView):
|
|
|
743
755
|
# default
|
|
744
756
|
return "sb_admin/components/filters.html"
|
|
745
757
|
|
|
746
|
-
def get_tabulator_header_template_name(self, request):
|
|
758
|
+
def get_tabulator_header_template_name(self, request) -> str:
|
|
747
759
|
filters_version = self.get_filters_version(request)
|
|
748
760
|
if filters_version is FilterVersions.FILTERS_VERSION_2:
|
|
749
761
|
return "sb_admin/actions/partials/tabulator_header_v2.html"
|
|
@@ -751,5 +763,5 @@ class SBAdminBaseListView(SBAdminBaseView):
|
|
|
751
763
|
# default
|
|
752
764
|
return "sb_admin/actions/partials/tabulator_header_v1.html"
|
|
753
765
|
|
|
754
|
-
def get_search_field_placeholder(self):
|
|
766
|
+
def get_search_field_placeholder(self, request) -> str:
|
|
755
767
|
return self.search_field_placeholder
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
django_smartbase_admin/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2
2
|
django_smartbase_admin/actions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
3
|
-
django_smartbase_admin/actions/admin_action_list.py,sha256=
|
|
3
|
+
django_smartbase_admin/actions/admin_action_list.py,sha256=A-nQiP_iMaH8GPrfd3rtQPdil59WIuzzghfh36wcKhE,19621
|
|
4
4
|
django_smartbase_admin/actions/advanced_filters.py,sha256=Vm8b6TAwNehR8INjolFG7pEYL4ADO7XUiVOWpb0btM0,13481
|
|
5
5
|
django_smartbase_admin/admin/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
6
|
-
django_smartbase_admin/admin/admin_base.py,sha256=
|
|
6
|
+
django_smartbase_admin/admin/admin_base.py,sha256=_OdllV6oDvrqKyXDbAAM0GJVROjncwfpnpvC5_9LJtQ,41019
|
|
7
7
|
django_smartbase_admin/admin/site.py,sha256=VrJBhwgZsLa2GohvjnNL7m4dVR3S4Ou1V1UzfE1qOoQ,6577
|
|
8
8
|
django_smartbase_admin/admin/widgets.py,sha256=SrCf_pAzEPZj6OXJOYU0b9wlA9ICiBtalptKhY6MDnw,19189
|
|
9
9
|
django_smartbase_admin/apps.py,sha256=C1wT1YUEZNKcUJfpD01nIZEFgYEsuav52WFKvEURRDU,545
|
|
10
10
|
django_smartbase_admin/compilemessages.py,sha256=-_FEFQlOvE4L8UzSuUxSxZQjgGlwL9IZtmg59fW_kIQ,342
|
|
11
11
|
django_smartbase_admin/engine/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
12
12
|
django_smartbase_admin/engine/actions.py,sha256=n8PiG60Kj1ECHB4lfVH_jvHMyOjOZ-DvQfO9F2CuqW0,1733
|
|
13
|
-
django_smartbase_admin/engine/admin_base_view.py,sha256=
|
|
13
|
+
django_smartbase_admin/engine/admin_base_view.py,sha256=8Pd5a2F0PX5euZkVCeWbcF9JxmSvOKf_HQNveBenCDs,29941
|
|
14
14
|
django_smartbase_admin/engine/admin_entrypoint_view.py,sha256=jfMfcYPfdre2abHfC4KIxaP_epJFuCeTcujGhGd4Tl4,624
|
|
15
15
|
django_smartbase_admin/engine/admin_view.py,sha256=9wGffahDR3IYmhL9ZbX8uitwGdXdw5DIL5GnWBawmJM,4238
|
|
16
16
|
django_smartbase_admin/engine/configuration.py,sha256=P3iSiPm9QBl9etTDJIWzo7DzOBCryGwWtbF288PEtus,8120
|
|
@@ -665,7 +665,7 @@ django_smartbase_admin/views/dashboard_view.py,sha256=vtz5emYTQ5WDFeLA8HrcmjSOVd
|
|
|
665
665
|
django_smartbase_admin/views/global_filter_view.py,sha256=eYo1moJGyi7jc2cPDA5ZBiEgA7Hmc-DxbQvbqUpDkg8,1127
|
|
666
666
|
django_smartbase_admin/views/media_view.py,sha256=5BLWXuzynF7nM34t-mf2BQSRN5ojY8HxpLIqt7Jiq9g,292
|
|
667
667
|
django_smartbase_admin/views/translations_view.py,sha256=A02q1t13akLKd2Pg_ej4tVi5qPUKYxB2LqsBbYXM0l8,20267
|
|
668
|
-
django_smartbase_admin-0.2.
|
|
669
|
-
django_smartbase_admin-0.2.
|
|
670
|
-
django_smartbase_admin-0.2.
|
|
671
|
-
django_smartbase_admin-0.2.
|
|
668
|
+
django_smartbase_admin-0.2.85.dist-info/LICENSE.md,sha256=okRGMBOYvyhprt2eTpX_QXqpzC0MODF-U7zX-4fKPjQ,1078
|
|
669
|
+
django_smartbase_admin-0.2.85.dist-info/METADATA,sha256=ALs1l-SLzETVa6Joy_48awHH0ncurr9rmBTMofeaN8U,996
|
|
670
|
+
django_smartbase_admin-0.2.85.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
|
|
671
|
+
django_smartbase_admin-0.2.85.dist-info/RECORD,,
|
{django_smartbase_admin-0.2.84.dist-info → django_smartbase_admin-0.2.85.dist-info}/LICENSE.md
RENAMED
|
File without changes
|
|
File without changes
|