diff --git a/posts/admin.py b/posts/admin.py
index 8d15f9f112..cf727daed8 100644
--- a/posts/admin.py
+++ b/posts/admin.py
@@ -1,8 +1,9 @@
from admin_auto_filters.filters import AutocompleteFilterFactory
-from django.contrib import admin
+from django.contrib import admin, messages
from django.db.models import QuerySet
+from django.shortcuts import redirect
from django.http import HttpResponse
-from django.urls import reverse
+from django.urls import reverse, path
from django.utils.html import format_html
from django.utils.safestring import mark_safe
@@ -44,7 +45,12 @@ class PostAdmin(CustomTranslationAdmin):
"coauthors",
]
search_fields = ["id", "title_original"]
- readonly_fields = ["notebook", "hotness_explanation", "view_questions"]
+ readonly_fields = [
+ "notebook",
+ "hotness_explanation",
+ "view_questions",
+ "update_pseudo_materialized_fields_button",
+ ]
actions = [
"export_selected_posts_data",
"export_selected_posts_data_anonymized",
@@ -96,6 +102,22 @@ def view_questions(self, obj):
)
return format_html('View Questions', url)
+ def update_pseudo_materialized_fields_button(self, obj):
+ if not obj:
+ return ""
+ url = reverse(
+ "admin:posts_post_update_pseudo_materialized_fields", args=[obj.pk]
+ )
+ return format_html(
+ '{}',
+ url,
+ "Update Materialized Fields (e.g. open time)",
+ )
+
+ update_pseudo_materialized_fields_button.short_description = (
+ "Update Marterialized Fields"
+ )
+
def other_project_count(self, obj):
return obj.projects.count()
@@ -161,12 +183,36 @@ def mark_as_deleted(self, request, queryset: QuerySet[Post]):
mark_as_deleted.short_description = "Mark as DELETED"
+ def get_urls(self):
+ urls = super().get_urls()
+ custom_urls = [
+ path(
+ "/update-pseudo-materialized-fields/",
+ self.admin_site.admin_view(
+ self.process_update_pseudo_materialized_fields_request
+ ),
+ name="posts_post_update_pseudo_materialized_fields",
+ ),
+ ]
+ return custom_urls + urls
+
+ def process_update_pseudo_materialized_fields_request(
+ self, request, post_id, *args, **kwargs
+ ):
+ post = self.get_object(request, post_id)
+ if not post:
+ messages.error(request, "Post not found.")
+ return redirect("admin:posts_post_changelist")
+ post.update_pseudo_materialized_fields()
+ messages.success(request, "Updated Materialized Fields")
+ return redirect(reverse("admin:posts_post_change", args=[post.pk]))
+
def get_fields(self, request, obj=None):
fields = super().get_fields(request, obj)
- for field in ["view_questions"]:
+ for field in ["view_questions", "update_pseudo_materialized_fields_button"]:
if field in fields:
fields.remove(field)
- fields.insert(0, field)
+ fields = ["view_questions", "update_pseudo_materialized_fields_button"] + fields
return fields