Skip to content

Commit 9f64a04

Browse files
author
oko-x
committed
triv: history updates, fake inline improvements
1 parent 84707ee commit 9f64a04

File tree

4 files changed

+131
-83
lines changed

4 files changed

+131
-83
lines changed

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[tool.poetry]
22
name = "django-smartbase-admin"
3-
version = "0.2.52"
3+
version = "0.2.53"
44
description = ""
55
authors = ["SmartBase <[email protected]>"]
66
readme = "README.md"

src/django_smartbase_admin/admin/admin_base.py

Lines changed: 74 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -430,13 +430,14 @@ def get_inline_instances(self, request, obj=None):
430430
inlines = []
431431
for inline_class in inline_classes:
432432
inline = inline_class(self.model, self.admin_site)
433+
if hasattr(inline, "init_inline_dynamic"):
434+
inline.init_inline_dynamic(request, obj)
433435
if request:
434436
if not inline.has_view_or_change_permission(request, obj):
435437
continue
436438
if not inline.has_add_permission(request, obj):
437439
inline.max_num = 0
438-
if hasattr(inline, "init_inline_dynamic"):
439-
inline.init_inline_dynamic(request, obj)
440+
if hasattr(inline, "init_view_dynamic"):
440441
inline.init_view_dynamic(request, request.request_data)
441442
inlines.append(inline)
442443
return inlines
@@ -754,27 +755,45 @@ def construct_change_message(self, request, form, formsets, add=False):
754755
elif form.changed_data:
755756
change_details = {}
756757
for field in form.changed_data:
757-
initial_value = form.initial[field]
758-
new_value = form.cleaned_data[field]
759-
if isinstance(initial_value, int): # Assuming the ID is an integer
760-
field_model = form._meta.model._meta.get_field(
761-
field
762-
).related_model
763-
if field_model:
764-
initial_value_repr = (
765-
self._get_object_repr_by_id(field_model, initial_value)
766-
+ f" ({initial_value})"
767-
)
768-
new_value_repr = str(new_value) + f" ({new_value.id})"
758+
try:
759+
initial_value = form.initial[field]
760+
new_value = form.cleaned_data[field]
761+
if isinstance(initial_value, int):
762+
field_model = form._meta.model._meta.get_field(
763+
field
764+
).related_model
765+
if field_model:
766+
initial_value_repr = self._get_object_repr_by_id(
767+
field_model, initial_value
768+
)
769+
new_value_repr = str(new_value)
770+
else:
771+
initial_value_repr = str(initial_value)
772+
new_value_repr = str(new_value)
769773
else:
770774
initial_value_repr = str(initial_value)
771775
new_value_repr = str(new_value)
772-
else:
776+
except KeyError:
777+
initial_value = form.fields[field].initial
778+
new_value = form.cleaned_data[field]
773779
initial_value_repr = str(initial_value)
774780
new_value_repr = str(new_value)
775781
if initial_value_repr != new_value_repr:
776-
change_details[field] = (initial_value_repr, new_value_repr)
777-
change_message.append({"changed": change_details})
782+
change_details[field] = {
783+
"initial": initial_value_repr,
784+
"new": new_value_repr,
785+
"object_id": (
786+
new_value.id if hasattr(new_value, "id") else ""
787+
),
788+
"content_type_id": (
789+
get_content_type_for_model(new_value).pk
790+
if hasattr(new_value, "_meta")
791+
else ""
792+
),
793+
"object_name": field,
794+
}
795+
if change_details:
796+
change_message.append({"changed": change_details})
778797

779798
if formsets:
780799
with translation_override(None):
@@ -789,25 +808,30 @@ def construct_change_message(self, request, form, formsets, add=False):
789808
)
790809
change_message.append(
791810
{
792-
"added": (
793-
added_object._meta.verbose_name,
794-
object_details,
795-
)
811+
"added": {
812+
"initial": None,
813+
"new": object_details,
814+
"object_id": (
815+
added_object.id if added_object.id else ""
816+
),
817+
"content_type_id": get_content_type_for_model(
818+
added_object
819+
).pk,
820+
"object_name": added_object._meta.verbose_name,
821+
}
796822
}
797823
)
798824

799825
for form in formset.forms:
800826
if form.has_changed():
801-
changed_object = form.instance
802-
if changed_object not in added_objects:
803-
changed_details = {}
804-
for field in form.changed_data:
805-
if field != "DELETE":
827+
changed_details = {}
828+
for field in form.changed_data:
829+
if field != "DELETE":
830+
changed_object = form.instance
831+
if changed_object not in added_objects:
806832
initial_value = form.initial.get(field)
807833
new_value = form.cleaned_data[field]
808-
if isinstance(
809-
initial_value, int
810-
): # Assuming the ID is an integer
834+
if isinstance(initial_value, int):
811835
field_model = (
812836
formset.model._meta.get_field(
813837
field
@@ -829,10 +853,19 @@ def construct_change_message(self, request, form, formsets, add=False):
829853
initial_value_repr = str(initial_value)
830854
new_value_repr = str(new_value)
831855
if initial_value_repr != new_value_repr:
832-
changed_details[field] = (
833-
initial_value_repr,
834-
new_value_repr,
835-
)
856+
changed_details[field] = {
857+
"initial": initial_value_repr,
858+
"new": new_value_repr,
859+
"object_id": (
860+
new_value.id
861+
if hasattr(new_value, "id")
862+
else ""
863+
),
864+
"content_type_id": get_content_type_for_model(
865+
new_value
866+
).pk,
867+
"object_name": new_value._meta.verbose_name,
868+
}
836869
change_message.append(
837870
{"changed": changed_details}
838871
)
@@ -841,13 +874,18 @@ def construct_change_message(self, request, form, formsets, add=False):
841874
change_message.append(
842875
{
843876
"deleted": {
844-
"name": str(deleted_object._meta.verbose_name),
845-
"object": str(deleted_object),
877+
"initial": str(deleted_object),
878+
"new": None,
879+
"object_id": None,
880+
"content_type_id": get_content_type_for_model(
881+
deleted_object
882+
).pk,
883+
"object_name": deleted_object._meta.verbose_name,
846884
}
847885
}
848886
)
849887
return change_message
850-
except:
888+
except Exception as e:
851889
return super().construct_change_message(request, form, formsets, add)
852890

853891
def _get_object_repr_by_id(self, model, object_id):

src/django_smartbase_admin/engine/fake_inline.py

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,19 +31,20 @@ def filter(self, *args, **kwargs):
3131

3232
class SBAdminFakeInlineFormset(BaseInlineFormSet):
3333
original_model = None
34-
35-
def delete_existing(self, obj, commit=True):
36-
raise NotImplementedError
34+
inline_instance = None
3735

3836
def save_new(self, form, commit=True):
39-
raise NotImplementedError
37+
return self.inline_instance.save_new_fake_inline_instance(
38+
form, self.inline_instance.parent_instance, commit
39+
)
4040

4141

4242
class SBAdminFakeInlineMixin:
4343
fk_name = "inline_fake_relationship"
4444
model_name = "FakeRelationship"
4545
formset = SBAdminFakeInlineFormset
4646
original_model = None
47+
path_to_parent_instance_id = None # path to parent instance id in fake inline model
4748

4849
def __init__(self, parent_model, admin_site):
4950
super().__init__(parent_model, admin_site)
@@ -70,16 +71,40 @@ def get_formset(self, request, obj=None, **kwargs):
7071
formset = super().get_formset(request, obj, **kwargs)
7172
formset.queryset = self.get_queryset(request)
7273
formset.original_model = self.original_model
74+
formset.inline_instance = self
7375
return formset
7476

77+
def has_add_permission(self, request, obj=None):
78+
# don't allow adding new fake inline instances if parent instance is not saved yet
79+
if not self.parent_instance.id:
80+
return False
81+
return super().has_add_permission(request, obj)
82+
7583
def filter_fake_inline_identifier_by_parent_instance(
7684
self, inline_queryset, parent_instance
7785
):
7886
# filter queryset by parent istance, in queryset there is annotated 'identifier' by get_fake_inline_identifier_annotate
7987
# example usage:
8088
# qs = inline_queryset.filter(path_to_parent_instance__id: parent_instance.id)
8189
# return qs
82-
raise NotImplementedError
90+
if not self.path_to_parent_instance_id:
91+
raise NotImplementedError
92+
qs = inline_queryset.filter(
93+
**{self.path_to_parent_instance_id: parent_instance.id}
94+
)
95+
return qs
96+
97+
def save_new_fake_inline_instance(self, form, parent_instance, commit=True):
98+
# save new instance of fake inline model
99+
if not self.path_to_parent_instance_id:
100+
raise NotImplementedError
101+
fake_inline_object = form.save(commit=False)
102+
if parent_instance.id:
103+
setattr(
104+
fake_inline_object, self.path_to_parent_instance_id, parent_instance.id
105+
)
106+
fake_inline_object.save()
107+
return fake_inline_object
83108

84109
def get_fake_inline_identifier_annotate(self):
85110
# this field is used as related 'id' of the inline and can later be used as reference for filtering, so the annotated value

src/django_smartbase_admin/templatetags/sb_admin_tags.py

Lines changed: 26 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -146,58 +146,43 @@ def get_log_entry_message(log_entry):
146146
messages = []
147147
for sub_message in change_message:
148148
if "added" in sub_message:
149-
if sub_message["added"]:
150-
obj_name, added_fields = sub_message["added"]
151-
messages.append(
152-
gettext("Added {obj_name} “{fields}”.\n").format(
153-
obj_name=obj_name,
154-
fields=added_fields,
149+
try:
150+
if sub_message["added"]:
151+
added_data = sub_message["added"]
152+
messages.append(
153+
gettext("Added {object_name}: {new}”.\n").format(
154+
**added_data
155+
)
155156
)
156-
)
157-
158-
else:
159-
messages.append(gettext("Added.\n"))
157+
except Exception as e:
158+
messages.append(str(sub_message["added"]))
160159

161160
elif "changed" in sub_message:
162-
try:
163-
for fields in sub_message["changed"]:
164-
if fields == "fields":
165-
formatted_fields = (" and ").join(
166-
sub_message["changed"][fields]
167-
)
161+
162+
changed_data = sub_message["changed"]
163+
164+
for key, values in changed_data.items():
165+
try:
166+
if values["object_name"].upper() != key.upper():
168167
messages.append(
169-
gettext("Changed {fields}.\n").format(
170-
fields=formatted_fields
171-
)
168+
gettext(
169+
"Changed {object_name} - {key}: from “{initial}” to “{new}”.\n"
170+
).format(key=key, **values)
172171
)
173-
174172
else:
175-
old_value, new_value = sub_message["changed"][fields]
176-
old_value = fields + ": " + old_value
177173
messages.append(
178174
gettext(
179-
"Changed {old_value} for {new_value}.\n"
180-
).format(
181-
old_value=(
182-
old_value
183-
if len(old_value) - len(fields) <= 50
184-
else old_value[: 50 + len(fields)]
185-
),
186-
new_value=(
187-
new_value
188-
if len(new_value) <= 50
189-
else new_value[:50]
190-
),
191-
**sub_message["changed"],
192-
)
175+
"Changed {key}: from “{initial}” to “{new}”.\n"
176+
).format(**values, key=key)
193177
)
194-
except Exception as e:
195-
messages.append(str(sub_message["changed"]))
178+
except Exception as e:
179+
messages.append(str(sub_message["changed"]))
196180
elif "deleted" in sub_message:
197-
sub_message["deleted"]["name"] = gettext(sub_message["deleted"]["name"])
181+
deleted_data = sub_message["deleted"]
198182
messages.append(
199-
gettext("Deleted {name} “{object}”.\n").format(
200-
**sub_message["deleted"]
183+
gettext('Deleted {object_name}: "{initial}."\n').format(
184+
initial=deleted_data.get("initial"),
185+
object_name=deleted_data.get("object_name"),
201186
)
202187
)
203188

0 commit comments

Comments
 (0)