Skip to content

Commit 142f5a9

Browse files
committed
Add regenerate summary action in admin
1 parent 9d4444b commit 142f5a9

File tree

3 files changed

+47
-5
lines changed

3 files changed

+47
-5
lines changed

per/admin.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,14 @@
44

55
from django.contrib import admin
66
from django.http import HttpResponse
7+
from django.utils.translation import get_language as django_get_language
78
from reversion_compare.admin import CompareVersionAdmin
89

910
import per.models as models
1011
from api.models import Appeal
1112
from lang.admin import TranslationAdmin, TranslationInlineModelAdmin
1213
from per.admin_classes import GotoNextModelAdmin, RegionRestrictedAdmin
14+
from per.task import generate_summary
1315

1416

1517
class FormDataInline(admin.TabularInline, TranslationInlineModelAdmin):
@@ -324,6 +326,23 @@ class OpsLearningCacheResponseAdmin(TranslationAdmin):
324326
"exported_file",
325327
"exported_at",
326328
)
329+
actions = ["regenerate_summary"]
330+
331+
def regenerate_summary(self, request, queryset):
332+
"""
333+
Regenerate the summary of the selected OpsLearningCacheResponse objects.
334+
"""
335+
requested_lang = django_get_language()
336+
for obj in queryset:
337+
generate_summary.delay(
338+
ops_learning_summary_id=obj.id,
339+
filter_data=obj.used_filters,
340+
translation_lazy=requested_lang != "en",
341+
# NOTE: Regenerating the summary will overwrite the cache
342+
overwrite_prompt_cache=True,
343+
)
344+
345+
regenerate_summary.short_description = "Regenerate Summary for selected Ops Learning Cache Response"
327346

328347

329348
class OpsLearningPromptResponseCacheAdmin(admin.ModelAdmin):

per/ops_learning_summary.py

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -831,13 +831,21 @@ def _modify_summary(summary: dict) -> dict:
831831
return processed_summary
832832

833833
@classmethod
834-
def _get_or_create_summary(cls, prompt: str, prompt_hash: str, type: OpsLearningPromptResponseCache.PromptType) -> dict:
834+
def _get_or_create_summary(
835+
cls, prompt: str, prompt_hash: str, type: OpsLearningPromptResponseCache.PromptType, overwrite_prompt_cache: bool = False
836+
) -> dict:
835837
instance, created = OpsLearningPromptResponseCache.objects.get_or_create(
836838
prompt_hash=prompt_hash,
837839
type=type,
838840
defaults={"prompt": prompt},
839841
)
840-
if created or not bool(instance.response):
842+
"""
843+
NOTE:
844+
1. If the prompt response is not found in the cache, it regenerates the summary
845+
2. If overwrite_prompt_cache is True, it regenerates the summary
846+
3. If new obj is created, it generates the summary
847+
"""
848+
if overwrite_prompt_cache or created or not bool(instance.response):
841849
summary = cls.generate_summary(prompt, type)
842850
instance.response = summary
843851
instance.save(update_fields=["response"])
@@ -926,6 +934,7 @@ def get_or_create_primary_summary(
926934
cls,
927935
ops_learning_summary_instance: OpsLearningCacheResponse,
928936
primary_learning_prompt: str,
937+
overwrite_prompt_cache: bool = False,
929938
):
930939
"""Retrieves or Generates the primary summary based on the provided prompt."""
931940
logger.info("Retrieving or generating primary summary.")
@@ -938,6 +947,7 @@ def get_or_create_primary_summary(
938947
prompt=primary_learning_prompt,
939948
prompt_hash=primary_prompt_hash,
940949
type=OpsLearningPromptResponseCache.PromptType.PRIMARY,
950+
overwrite_prompt_cache=overwrite_prompt_cache,
941951
)
942952

943953
# Saving into the database
@@ -959,6 +969,7 @@ def get_or_create_secondary_summary(
959969
cls,
960970
ops_learning_summary_instance: OpsLearningCacheResponse,
961971
secondary_learning_prompt: str,
972+
overwrite_prompt_cache: bool = False,
962973
):
963974
"""Retrieves or Generates the summary based on the provided prompts."""
964975
logger.info("Retrieving or generating secondary summary.")
@@ -971,6 +982,7 @@ def get_or_create_secondary_summary(
971982
prompt=secondary_learning_prompt,
972983
prompt_hash=secondary_prompt_hash,
973984
type=OpsLearningPromptResponseCache.PromptType.SECONDARY,
985+
overwrite_prompt_cache=overwrite_prompt_cache,
974986
)
975987

976988
# Saving into the database

per/task.py

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from per.ops_learning_summary import OpsLearningSummaryTask
88

99

10-
def generate_ops_learning_summary(ops_learning_summary_id: int, filter_data: dict):
10+
def generate_ops_learning_summary(ops_learning_summary_id: int, filter_data: dict, overwrite_prompt_cache: bool = False):
1111
ops_learning_summary_instance = OpsLearningCacheResponse.objects.filter(id=ops_learning_summary_id).first()
1212
if not ops_learning_summary_instance:
1313
logger.error("Ops learning summary not found", exc_info=True)
@@ -44,6 +44,7 @@ def generate_ops_learning_summary(ops_learning_summary_id: int, filter_data: dic
4444
OpsLearningSummaryTask.get_or_create_primary_summary(
4545
ops_learning_summary_instance=ops_learning_summary_instance,
4646
primary_learning_prompt=primary_learning_prompt,
47+
overwrite_prompt_cache=overwrite_prompt_cache,
4748
)
4849

4950
# Prioritize excerpts for secondary insights
@@ -54,6 +55,7 @@ def generate_ops_learning_summary(ops_learning_summary_id: int, filter_data: dic
5455
OpsLearningSummaryTask.get_or_create_secondary_summary(
5556
ops_learning_summary_instance=ops_learning_summary_instance,
5657
secondary_learning_prompt=secondary_learning_prompt,
58+
overwrite_prompt_cache=overwrite_prompt_cache,
5759
)
5860

5961
# Change Ops Learning Summary Status to SUCCESS
@@ -79,10 +81,19 @@ def generate_ops_learning_summary(ops_learning_summary_id: int, filter_data: dic
7981

8082

8183
@shared_task
82-
def generate_summary(ops_learning_summary_id: int, filter_data: dict, translation_lazy: bool = True):
84+
def generate_summary(
85+
ops_learning_summary_id: int,
86+
filter_data: dict,
87+
translation_lazy: bool = True,
88+
overwrite_prompt_cache: bool = False,
89+
):
8390
with redis_lock(key=RedisLockKey.OPERATION_LEARNING_SUMMARY, id=ops_learning_summary_id) as acquired:
8491
if not acquired:
8592
logger.warning("Ops learning summary generation is already in progress")
8693
return False
8794
with override_settings(CELERY_TASK_ALWAYS_EAGER=not translation_lazy):
88-
return generate_ops_learning_summary(ops_learning_summary_id, filter_data)
95+
return generate_ops_learning_summary(
96+
ops_learning_summary_id=ops_learning_summary_id,
97+
filter_data=filter_data,
98+
overwrite_prompt_cache=overwrite_prompt_cache,
99+
)

0 commit comments

Comments
 (0)