Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
47 commits
Select commit Hold shift + click to select a range
7db7341
feat(event): make event source enum
sudip-khanal Apr 22, 2026
08306d5
feat(api): add new api endpoint for emergency
sudip-khanal Apr 24, 2026
90c6415
feat(api): add related appeal id on emergency api endpoint
sudip-khanal Apr 28, 2026
1b9e513
fix(test): fix emergency api test case
sudip-khanal May 12, 2026
7b49bf2
feat(api): add script to update event source
sudip-khanal Apr 29, 2026
7c0b6b4
feat(api): update on emergency endpoint
susilnem May 13, 2026
2a7d53c
feat(dref): replace field report with event and update dref approve l…
susilnem May 13, 2026
9b2cca4
feat(dref): add script to migrate events from appeal based on appeal …
susilnem May 13, 2026
5f7da1b
feat(event): add latest field report on mini event endpoint
susilnem May 14, 2026
c592416
feat(emergency): add staging logic for emergency page
susilnem May 15, 2026
b9a0faf
Merge pull request #2734 from IFRCGo/fix/emergency-api-test-case
susilnem May 12, 2026
9fd289f
feat(emergency): Add new stage for appeal dref type
susilnem May 21, 2026
f041e46
feat(emergency): add previous data on field report and dref ops update
susilnem May 22, 2026
5a8fa4f
Merge pull request #2736 from IFRCGo/feature/attach-dref-emergency-page
susilnem May 25, 2026
9031e69
feat(dref): trigger event translation for approved dref
susilnem May 28, 2026
8b67ca9
feat(emergency): Squash migration
susilnem May 25, 2026
e9568a9
feat(dref): add test cases for dref approved event translation
susilnem Jun 1, 2026
848529f
Merge pull request #2754 from IFRCGo/feature/dref-event-trigger-trans…
susilnem Jun 2, 2026
66b216b
fix(test): use datetime for filling the date fields
susilnem Jun 15, 2026
1587c1c
fix(emergency): fill DREF data gaps on emergency pages
frozenhelium Jun 24, 2026
70c40bb
perf(emergency): remove ORDER BY from EXISTS subqueries, prefetch fie…
susilnem Jun 24, 2026
35db831
Merge pull request #2769 from IFRCGo/fix/emergency-data-gaps
susilnem Jun 25, 2026
2dfda79
feat(dref-summary): add new model and register for translation.
sandeshit Jun 22, 2026
d977797
Merge pull request #2768 from IFRCGo/feature/optimise-query-emergency…
susilnem Jun 25, 2026
dfe4e1c
feat(serializer): create a serializer for summary.
sandeshit Jun 22, 2026
ef10979
feat(dref): retrigger from admin panel and latest source doc.
sandeshit Jun 29, 2026
9dffc1b
feat(dref-summary): summary generation logic and scaffolding.
sandeshit Jun 29, 2026
c7d8e60
feat(migrations): merge migrations
sandeshit Jun 29, 2026
2025c16
feat(dref): Add DummyClientLLM and redislock check
susilnem Jul 7, 2026
dcd2e1d
feat(dref): add step for the processing status and use delay translation
susilnem Jul 3, 2026
728f13c
fix(dref): guard summary generation writes against concurrent-source …
susilnem Jul 8, 2026
31b258e
Merge pull request #2771 from IFRCGo/feat/dref-summary-generation
susilnem Jul 3, 2026
0e0919d
Merge pull request #2775 from IFRCGo/feature/create-dummy-llm-client
susilnem Jul 8, 2026
e1a3b97
Merge pull request #2767 from IFRCGo/feat/dref-summary-emergency-endp…
susilnem Jul 8, 2026
6cddeea
fix(dref): expose disaster_category on emergency DREF serializers
frozenhelium Jul 6, 2026
7fb85d6
Merge pull request #2774 from IFRCGo/fix/emergency-disaster-categoriz…
susilnem Jul 8, 2026
f9bc325
chore: update env key for azure api key
susilnem Jul 8, 2026
2dfc24e
dref(summary): Alter summary generation fields. (#2798)
sandeshit Jul 27, 2026
bd3401f
feat(dref): add additional fields on emergency page
susilnem Jul 17, 2026
178114e
feat(emergency): expose ops update summary of change
frozenhelium Jul 26, 2026
2a93f82
Merge pull request #2797 from IFRCGo/feature/emergency-page-feedbacks
susilnem Jul 27, 2026
b924a62
feat(summary): add summarization fields for imminent type.
sandeshit Aug 3, 2026
98d136c
feat(llm): alter the api version for azure-openai.
sandeshit Aug 3, 2026
77c280c
fixup! feat(llm): alter the api version for azure-openai.
sandeshit Aug 5, 2026
6a4ca6b
fixup! feat(llm): alter the api version for azure-openai.
sandeshit Aug 11, 2026
aecfeb5
fixup! feat(llm): alter the api version for azure-openai.
sandeshit Aug 13, 2026
bdfc395
fixup! feat(llm): alter the api version for azure-openai.
sandeshit Aug 13, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
108 changes: 56 additions & 52 deletions api/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.models import Permission, User
from django.contrib.gis import admin as geoadmin
from django.core.exceptions import ValidationError
from django.db.models import OuterRef, Subquery, Value
from django.db.models.functions import Concat
from django.http import HttpResponse, HttpResponseRedirect
Expand All @@ -26,7 +25,6 @@

import api.models as models
from api.admin_classes import RegionRestrictedAdmin
from api.event_sources import SOURCES
from api.management.commands.index_and_notify import Command as Notify
from lang.admin import TranslationAdmin, TranslationInlineModelAdmin
from notifications.models import RecordType, SubscriptionType
Expand Down Expand Up @@ -182,38 +180,6 @@ def queryset(self, request, queryset):
return queryset.filter(is_featured=False)


class EventSourceFilter(admin.SimpleListFilter):
title = _("source")
parameter_name = "event_source"

def lookups(self, request, model_admin):
return (
("input", _("Manual input")),
("gdacs", _("GDACs scraper")),
("who", _("WHO scraper")),
("report_ingest", _("Field report ingest")),
("report_admin", _("Field report admin")),
("appeal_admin", _("Appeals admin")),
("unknown", _("Unknown automated")),
)

def queryset(self, request, queryset):
if self.value() == "input":
return queryset.filter(auto_generated=False)
elif self.value() == "gdacs":
return queryset.filter(auto_generated_source=SOURCES["gdacs"])
elif self.value() == "who":
return queryset.filter(auto_generated_source__startswith="www.who.int")
elif self.value() == "report_ingest":
return queryset.filter(auto_generated_source=SOURCES["report_ingest"])
elif self.value() == "report_admin":
return queryset.filter(auto_generated_source=SOURCES["report_admin"])
elif self.value() == "appeal_admin":
return queryset.filter(auto_generated_source=SOURCES["appeal_admin"])
elif self.value() == "unknown":
return queryset.filter(auto_generated=True).filter(auto_generated_source__isnull=True)


class DisasterTypeAdmin(CompareVersionAdmin, TranslationAdmin, admin.ModelAdmin):
search_fields = ("name",)

Expand Down Expand Up @@ -242,7 +208,55 @@ class EventLinkInline(admin.TabularInline, TranslationInlineModelAdmin):
model = models.EventLink


class EventAdminForm(forms.ModelForm):
class Meta:
model = models.Event
fields = "__all__"

def clean(self):
cleaned_data = super().clean()
if self.instance.pk is None:
return cleaned_data

new_severity = cleaned_data.get("ifrc_severity_level")
new_update_date = cleaned_data.get("ifrc_severity_level_update_date")
original_severity = self.instance.ifrc_severity_level
original_update_date = self.instance.ifrc_severity_level_update_date

if original_update_date is not None and new_update_date is None:
self.add_error(
"ifrc_severity_level_update_date",
"This field cannot be cleared once it has been set.",
)
return cleaned_data

severity_changed = original_severity != new_severity
update_date_changed = original_update_date != new_update_date

if severity_changed and not update_date_changed:
self.add_error(
"ifrc_severity_level_update_date",
"You must update this field when changing the severity level.",
)
return cleaned_data

if (
severity_changed
and update_date_changed
and original_update_date is not None
and new_update_date is not None
and original_update_date > new_update_date
):
self.add_error(
"ifrc_severity_level_update_date",
"This date can not be earlier than the previous one.",
)

return cleaned_data


class EventAdmin(CompareVersionAdmin, RegionRestrictedAdmin, TranslationAdmin):
form = EventAdminForm

@admin.display(ordering="ifrc_severity_level_update_date")
def level_updated_at(self, obj):
Expand Down Expand Up @@ -270,9 +284,9 @@ def level_updated_at(self, obj):
"cc_status",
"glide",
"auto_generated",
"auto_generated_source",
"source",
)
list_filter = [IsFeaturedFilter, EventSourceFilter]
list_filter = [IsFeaturedFilter, "source"]
actions = ["create_field_reports"]
search_fields = (
"name",
Expand Down Expand Up @@ -393,7 +407,7 @@ def changeform_view(self, request, object_id=None, form_url="", extra_context=No
self.readonly_fields = (
"appeals",
"field_reports",
"auto_generated_source",
"source",
"parent_event",
"created_at",
"updated_at",
Expand All @@ -402,9 +416,10 @@ def changeform_view(self, request, object_id=None, form_url="", extra_context=No
self.readonly_fields = (
"appeals",
"field_reports",
"auto_generated_source",
"source",
"created_at",
"updated_at",
"who_guid",
)

# Set severity level from GET parameter
Expand Down Expand Up @@ -461,19 +476,8 @@ def save_model(self, request, obj, form, change):
severity_changed = original.ifrc_severity_level != obj.ifrc_severity_level
update_date_changed = original.ifrc_severity_level_update_date != obj.ifrc_severity_level_update_date

if severity_changed and not update_date_changed:
messages.error(
request, "You must update the 'IFRC Severity Level Update Date/Time' when changing the severity level."
)
raise ValidationError("Cannot change severity level without updating the update date/time.")

# Validation for these fields is handled in EventAdminForm.clean().
if severity_changed and update_date_changed:
if (
original.ifrc_severity_level_update_date is not None
and original.ifrc_severity_level_update_date > obj.ifrc_severity_level_update_date
):
messages.error(request, "A severity level update date can not be earlier than the previous one.")
raise ValidationError("A severity level update date can not be earlier than the previous one.")
models.EventSeverityLevelHistory.objects.create(
event=obj,
ifrc_severity_level=original.ifrc_severity_level,
Expand Down Expand Up @@ -675,7 +679,7 @@ def create_events(self, request, queryset):
dtype=getattr(report, "dtype"),
disaster_start_date=getattr(report, "created_at"),
auto_generated=True,
auto_generated_source=SOURCES["report_admin"],
source=models.Event.EventSource.FIELD_REPORT_ADMIN,
)
if getattr(report, "countries").exists():
for country in report.countries.all():
Expand Down Expand Up @@ -784,7 +788,7 @@ def create_events(self, request, queryset):
dtype=getattr(appeal, "dtype"),
disaster_start_date=getattr(appeal, "start_date"),
auto_generated=True,
auto_generated_source=SOURCES["appeal_admin"],
source=models.Event.EventSource.APPEAL_ADMIN,
)
if appeal.country is not None:
event.countries.add(appeal.country)
Expand Down
Loading
Loading