From 3c399fe8fc920377c66d3de922e1c50cfc77a605 Mon Sep 17 00:00:00 2001 From: level09 Date: Sat, 27 Jun 2026 20:49:03 +0200 Subject: [PATCH] feat(eventtypes): add independent incident scope for event types --- enferno/admin/models/Eventtype.py | 3 ++ enferno/admin/templates/admin/eventtypes.html | 11 ++++- enferno/admin/templates/admin/incidents.html | 2 +- enferno/admin/validation/models.py | 1 + enferno/admin/views/eventtypes.py | 2 +- enferno/data/eventtypes.csv | 46 +++++++++---------- .../static/js/components/IncidentSearchBox.js | 2 +- ...2e9f4a1b8_add_for_incident_to_eventtype.py | 35 ++++++++++++++ tests/factories.py | 2 + tests/test_lookup_crud.py | 9 +++- 10 files changed, 84 insertions(+), 29 deletions(-) create mode 100644 migrations/versions/c7d2e9f4a1b8_add_for_incident_to_eventtype.py diff --git a/enferno/admin/models/Eventtype.py b/enferno/admin/models/Eventtype.py index 468ebb0a2..fbc151fe3 100644 --- a/enferno/admin/models/Eventtype.py +++ b/enferno/admin/models/Eventtype.py @@ -26,6 +26,7 @@ class Eventtype(db.Model, BaseMixin): title_ar = db.Column(db.String) for_actor = db.Column(db.Boolean, default=False) for_bulletin = db.Column(db.Boolean, default=False) + for_incident = db.Column(db.Boolean, default=False) comments = db.Column(db.String) # custom serialization method @@ -37,6 +38,7 @@ def to_dict(self) -> dict[str, Any]: "title_ar": self.title_ar or None, "for_actor": self.for_actor, "for_bulletin": self.for_bulletin, + "for_incident": self.for_incident, "comments": self.comments, "updated_at": DateHelper.serialize_datetime(self.updated_at), } @@ -60,6 +62,7 @@ def from_json(self, json: dict[str, Any]) -> "Eventtype": self.title_ar = json.get("title_ar", self.title_ar) self.for_actor = json.get("for_actor", self.for_actor) self.for_bulletin = json.get("for_bulletin", self.for_bulletin) + self.for_incident = json.get("for_incident", self.for_incident) self.comments = json.get("comments", self.comments) return self diff --git a/enferno/admin/templates/admin/eventtypes.html b/enferno/admin/templates/admin/eventtypes.html index a3461ffb0..45c57b529 100644 --- a/enferno/admin/templates/admin/eventtypes.html +++ b/enferno/admin/templates/admin/eventtypes.html @@ -65,17 +65,23 @@ - + - + + + + + + @@ -210,6 +216,7 @@ {title: "{{_('Title (ar)')}}", value: "title_ar"}, {title: "{{_('For Actors')}}", value: "for_actor"}, {title: "{{_('For Bulletins')}}", value: "for_bulletin"}, + {title: "{{_('For Incidents')}}", value: "for_incident"}, {title: "{{_('Comments')}}", value: "comments"}, {% if current_user.roles_in(['Admin','Mod']) %} {title: "{{_('Actions')}}", value: "action", sortable: false} diff --git a/enferno/admin/templates/admin/incidents.html b/enferno/admin/templates/admin/incidents.html index b092f2adb..2edc774f2 100644 --- a/enferno/admin/templates/admin/incidents.html +++ b/enferno/admin/templates/admin/incidents.html @@ -456,7 +456,7 @@ saving: false, eventDialog: false, reviewDialog: false, - eventParams: {typ: 'for_bulletin'}, + eventParams: {typ: 'for_incident'}, reviewKey: 0, // search and relate bulletin dialog vars diff --git a/enferno/admin/validation/models.py b/enferno/admin/validation/models.py index 21006513b..7360a3bd7 100644 --- a/enferno/admin/validation/models.py +++ b/enferno/admin/validation/models.py @@ -840,6 +840,7 @@ class EventtypeValidationModel(one_must_exist(["title", "title_ar"])): title_ar: Optional[str] = None for_actor: Optional[bool] = None for_bulletin: Optional[bool] = None + for_incident: Optional[bool] = None comments: Optional[str] = None # sent by the front-end on PUT, but not used by the from_json method id: Optional[int] = None diff --git a/enferno/admin/views/eventtypes.py b/enferno/admin/views/eventtypes.py index fd6edbd88..fcab5d03f 100644 --- a/enferno/admin/views/eventtypes.py +++ b/enferno/admin/views/eventtypes.py @@ -45,7 +45,7 @@ def api_eventtypes() -> Response: query.append(Eventtype.title.ilike("%" + q + "%")) typ = request.args.get("typ", None) - if typ and typ in ["for_bulletin", "for_actor"]: + if typ and typ in ["for_bulletin", "for_actor", "for_incident"]: query.append(getattr(Eventtype, typ) == True) result = ( Eventtype.query.filter(*query) diff --git a/enferno/data/eventtypes.csv b/enferno/data/eventtypes.csv index 5fa4cc9ae..3937f2d1c 100644 --- a/enferno/data/eventtypes.csv +++ b/enferno/data/eventtypes.csv @@ -1,23 +1,23 @@ -id,title,title_ar,comments,for_actor,for_bulletin -10,Birth,,,1,0 -11,Death,,,1,0 -12,Detained/Abducted,,,1,0 -13,Released,,,1,0 -14,Missing,,,1,0 -15,Returned,,,1,0 -16,Wounded,,,1,0 -17,Defected,,,1,0 -18,IDP,,,1,0 -19,Refugee,,,1,0 -20,Other,,,1,0 -21,Burial,,,1,0 -22,Trial,,,1,0 -23,Residence,,,1,0 -24,Found,,,1,0 -25,Stillbirth,,,1,0 -26,Sighting,,,1,0 -27,Held,,,1,0 -28,Publication,,,1,0 -29,Incident,,,0,1 -30,Post-Incident,,,0,1 -31,Non-Incident,,,0,1 \ No newline at end of file +id,title,title_ar,comments,for_actor,for_bulletin,for_incident +10,Birth,,,1,0,0 +11,Death,,,1,0,0 +12,Detained/Abducted,,,1,0,0 +13,Released,,,1,0,0 +14,Missing,,,1,0,0 +15,Returned,,,1,0,0 +16,Wounded,,,1,0,0 +17,Defected,,,1,0,0 +18,IDP,,,1,0,0 +19,Refugee,,,1,0,0 +20,Other,,,1,0,0 +21,Burial,,,1,0,0 +22,Trial,,,1,0,0 +23,Residence,,,1,0,0 +24,Found,,,1,0,0 +25,Stillbirth,,,1,0,0 +26,Sighting,,,1,0,0 +27,Held,,,1,0,0 +28,Publication,,,1,0,0 +29,Incident,,,0,1,1 +30,Post-Incident,,,0,1,1 +31,Non-Incident,,,0,1,1 diff --git a/enferno/static/js/components/IncidentSearchBox.js b/enferno/static/js/components/IncidentSearchBox.js index f8afe7fa9..956286877 100644 --- a/enferno/static/js/components/IncidentSearchBox.js +++ b/enferno/static/js/components/IncidentSearchBox.js @@ -325,7 +325,7 @@ const IncidentSearchBox = Vue.defineComponent({