Skip to content

Commit

Permalink
Link goal-related models in admin
Browse files Browse the repository at this point in the history
  • Loading branch information
SupraSummus committed Dec 1, 2024
1 parent ddf8cfe commit 32aa25f
Show file tree
Hide file tree
Showing 2 changed files with 76 additions and 26 deletions.
76 changes: 51 additions & 25 deletions django_goals/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@

from django.contrib import admin, messages
from django.db import models
from django.utils.html import format_html
from django.urls import reverse
from django.urls.exceptions import NoReverseMatch
from django.utils.html import format_html, format_html_join
from django.utils.translation import gettext as _
from django_object_actions import DjangoObjectActions, action

Expand Down Expand Up @@ -113,33 +115,57 @@ def instructions_pre(self, obj):

@admin.display(description='Related Objects')
def related_objects(self, obj):
related_objects = []
rows_html = []
for field in obj._meta._relation_tree:
if field.model._meta.app_label == 'django_goals':
continue
related_objects.extend(field.model.objects.filter(**{field.name: obj}))
rows_html = []
for related_object in related_objects:
row_html = format_html(
(
'<tr>'
'<td>{related_app}</td>'
'<td>{related_model}</td>'
'<td>{related_object}</td>'
'</tr>'
),
related_app=related_object._meta.app_label,
related_model=related_object._meta.verbose_name,
related_object=format_html(
'<a href="{related_object_url}">{related_object}</a>',
related_object_url=admin.site.url + related_object.get_admin_url(),
related_object=related_object,
),
)
rows_html.append(row_html)
return format_html(
'<table><tbody>{}</tbody></table>',
''.join(rows_html),
related_objects = field.model.objects.filter(**{field.name: obj})
for related_object in related_objects:
try:
object_admin_url = reverse(
f'admin:{related_object._meta.app_label}_{related_object._meta.model_name}_change',
args=(related_object.pk,),
)
except NoReverseMatch:
object_link = format_html(
'<span>{related_object}</span>',
related_object=related_object,
)
else:
object_link = format_html(
'<a href="{object_admin_url}">{related_object}</a>',
object_admin_url=object_admin_url,
related_object=related_object,
)
row_html = format_html(
(
'<tr>'
'<td>{related_app}</td>'
'<td>{related_model}</td>'
'<td>{related_field}</td>'
'<td>{related_object}</td>'
'</tr>'
),
related_app=related_object._meta.app_label,
related_model=related_object._meta.verbose_name,
related_field=field.verbose_name,
related_object=object_link,
)
rows_html.append(row_html)
return format_html_join(
'',
(
'<table>'
'<thead><tr>'
'<th>App</th>'
'<th>Model</th>'
'<th>Field</th>'
'<th>Object</th>'
'</tr></thead>'
'<tbody>{}</tbody>'
'</table>'
),
((row,) for row in rows_html),
)

@action(label=_('Retry'), methods=['POST'], button_type='form')
Expand Down
26 changes: 25 additions & 1 deletion example_app/merge_sort.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from django.contrib import admin
from django.contrib.postgres.fields import ArrayField
from django.db import models
from django.db import models, transaction

from django_goals.models import AllDone, Goal, RetryMeLater, schedule
from django_goals.utils import is_goal_completed
Expand Down Expand Up @@ -69,3 +70,26 @@ def ensure_sorted(goal):
merge_sort.save(update_fields=['sorted_numbers'])

return AllDone()


@admin.register(MergeSort)
class MergeSortAdmin(admin.ModelAdmin):
readonly_fields = (
'goal',
'subsort_a',
'subsort_b',
'sorted_numbers',
)

def has_change_permission(self, request, obj=None):
return False

def has_delete_permission(self, request, obj=None):
return False

def save_model(self, request, obj, form, change):
super().save_model(request, obj, form, change)
if obj.goal is None:
with transaction.atomic():
obj.goal = schedule(ensure_sorted)
obj.save(update_fields=['goal'])

0 comments on commit 32aa25f

Please sign in to comment.