From b795d32486b1bc26574c74e2dc759254f91ff4ef Mon Sep 17 00:00:00 2001 From: erikvw Date: Fri, 9 Feb 2024 13:57:11 -0600 Subject: [PATCH] fix issue where tmg ae button not carrying action identifier to form, add buttons for navigation to subject --- .../bootstrap3/tmg/tmg_ae_listboard.html | 5 +- .../tmg/tmg_ae_listboard_result.html | 42 +++++----- .../bootstrap3/tmg/tmg_button_group.html | 8 ++ .../templatetags/edc_adverse_event_extras.py | 81 +++++++++++-------- .../tmg/tmg_ae_listboard_view_mixin.py | 3 +- edc_adverse_event/view_utils/tmg_button.py | 25 +++++- .../views/tmg/status_listboards.py | 6 +- 7 files changed, 113 insertions(+), 57 deletions(-) create mode 100644 edc_adverse_event/templates/edc_adverse_event/bootstrap3/tmg/tmg_button_group.html diff --git a/edc_adverse_event/templates/edc_adverse_event/bootstrap3/tmg/tmg_ae_listboard.html b/edc_adverse_event/templates/edc_adverse_event/bootstrap3/tmg/tmg_ae_listboard.html index 5049a30..ad08a08 100644 --- a/edc_adverse_event/templates/edc_adverse_event/bootstrap3/tmg/tmg_ae_listboard.html +++ b/edc_adverse_event/templates/edc_adverse_event/bootstrap3/tmg/tmg_ae_listboard.html @@ -17,7 +17,10 @@  {{ listboard_panel_title }}  {% if results|length > 0 %} {{ results|length }} of {{ paginator.count }}{% endif %} - {% include 'edc_dashboard/bootstrap3/search_form.html' %} + {% if subject_identifier %} + Subject Review + {% endif %} + {% include 'edc_dashboard/bootstrap3/search_form.html' %} diff --git a/edc_adverse_event/templates/edc_adverse_event/bootstrap3/tmg/tmg_ae_listboard_result.html b/edc_adverse_event/templates/edc_adverse_event/bootstrap3/tmg/tmg_ae_listboard_result.html index a6b6328..3fe77ea 100644 --- a/edc_adverse_event/templates/edc_adverse_event/bootstrap3/tmg/tmg_ae_listboard_result.html +++ b/edc_adverse_event/templates/edc_adverse_event/bootstrap3/tmg/tmg_ae_listboard_result.html @@ -14,57 +14,63 @@ {% if may_access_page %} {% for result in results %}
-
{{ forloop.counter }} {{ result.subject_identifier }} {% copy_string_to_clipboard_button result.subject_identifier %} {{ utc_date|timeuntil:result.report_datetime.date }} ago
+
+ {{ forloop.counter }} {{ result.subject_identifier }} {% copy_string_to_clipboard_button result.subject_identifier %} {{ utc_date|timeuntil:result.report_datetime.date }} ago + + + +
{# AE TMG #} - {% render_tmg_panel action_item=result by_user_created_only=True counter=forloop.counter report_status=result.reference_obj.report_status %} -
+
TMG documents in workflow
+ {% render_tmg_panel action_item=result by_user_created_only=True counter=forloop.counter report_status=result.reference_obj.report_status next_url_name=listboard_filter_url %} {% death_report_tmg_queryset action_item=result as qs %} {% for death_report_tmg in qs %} - {% render_tmg_panel reference_obj=death_report_tmg by_user_created_only=True counter=forloop.counter %} + {% render_tmg_panel reference_obj=death_report_tmg by_user_created_only=True counter=forloop.counter next_url_name=listboard_filter_url %} {% endfor %} {% death_report_tmg2_queryset action_item=result as qs %} {% for death_report_tmg2 in qs %} - {% render_tmg_panel reference_obj=death_report_tmg2 by_user_created_only=True counter=forloop.counter %} + {% render_tmg_panel reference_obj=death_report_tmg2 by_user_created_only=True counter=forloop.counter next_url_name=listboard_filter_url %} {% endfor %} - +
{# AE INTIAL #} - {% render_tmg_panel action_item=result.parent_action_item counter=forloop.counter %} - {% if result.parent_action_item.reference_obj.action_identifier != result.related_action_item.reference_obj.action_identifier %} - {% render_tmg_panel action_item=result.related_action_item counter=forloop.counter %} +
First document in workflow
+ {% if result.parent_action_item %} + {% render_tmg_panel action_item=result.parent_action_item counter=forloop.counter next_url_name=listboard_filter_url %} + {% if result.related_action_item and result.parent_action_item.reference_obj.action_identifier != result.related_action_item.reference_obj.action_identifier %} + {% render_tmg_panel action_item=result.related_action_item counter=forloop.counter next_url_name=listboard_filter_url %} + {% endif %} {% endif %}
+
+
Clinical documents in workflow
{% ae_followup_queryset ae_initial=result.parent_action_item.reference_obj as qs %} {% if qs.count == 0 %}
There are no follow-ups to this AE
{% endif %} {% for ae_followup in qs %} - {% render_tmg_panel reference_obj=ae_followup counter=forloop.counter %} + {% render_tmg_panel reference_obj=ae_followup counter=forloop.counter next_url_name=listboard_filter_url %} {% endfor %} {% death_report_queryset subject_identifier=result.subject_identifier as qs %} {% for death_report in qs %} - {% render_tmg_panel reference_obj=death_report counter=forloop.counter %} + {% render_tmg_panel reference_obj=death_report counter=forloop.counter next_url_name=listboard_filter_url %} {% endfor %} - - - -
- {{ result.identifier }} {{ result.display_name }}
diff --git a/edc_adverse_event/templates/edc_adverse_event/bootstrap3/tmg/tmg_button_group.html b/edc_adverse_event/templates/edc_adverse_event/bootstrap3/tmg/tmg_button_group.html new file mode 100644 index 0000000..56b11d9 --- /dev/null +++ b/edc_adverse_event/templates/edc_adverse_event/bootstrap3/tmg/tmg_button_group.html @@ -0,0 +1,8 @@ +{% if subject_identifier %} +
+ TMG + New + Open + Closed +
+{% endif %} diff --git a/edc_adverse_event/templatetags/edc_adverse_event_extras.py b/edc_adverse_event/templatetags/edc_adverse_event_extras.py index 980e776..e8b66cf 100644 --- a/edc_adverse_event/templatetags/edc_adverse_event_extras.py +++ b/edc_adverse_event/templatetags/edc_adverse_event_extras.py @@ -189,44 +189,49 @@ def render_tmg_panel( by_user_created_only: bool | None = None, counter: int = None, report_status: str | None = None, + next_url_name: str | None = None, ) -> dict: reference_obj = reference_obj or get_reference_obj(action_item) if not action_item and reference_obj: action_item = reference_obj.action_item disable_all = True if not has_valid_tmg_perms(request=context["request"]) else False - btn = TmgButton( - user=context["request"].user, - subject_identifier=action_item.subject_identifier, - model_obj=reference_obj, - model_cls=action_item.action_cls.reference_model_cls(), - request=context["request"], - only_user_created_may_access=by_user_created_only, - forloop_counter=counter, - current_site=context["request"].site, - disable_all=disable_all, - ) - if view_only: - panel_color = "info" - elif not reference_obj: - panel_color = "warning" - else: - panel_color = "success" - - # panel_label - display_name = action_item.display_name.replace("Submit", "").replace("pending", "") - identifier = action_item.identifier or "New" - panel_label = _(f"{display_name} {identifier}") - - return dict( - btn=btn, - panel_color=panel_color, - reference_obj=reference_obj, - action_item=action_item, - OPEN=OPEN, - CLOSED=CLOSED, - report_status=report_status, - panel_label=panel_label, - ) + if action_item: + params = dict( + user=context["request"].user, + subject_identifier=action_item.subject_identifier, + model_obj=reference_obj, + model_cls=action_item.action_cls.reference_model_cls(), + request=context["request"], + only_user_created_may_access=by_user_created_only, + forloop_counter=counter, + current_site=context["request"].site, + disable_all=disable_all, + action_item=action_item, + ) + if next_url_name: + params.update(next_url_name=next_url_name.split(":")[1]) + btn = TmgButton(**params) + if view_only: + panel_color = "info" + elif not reference_obj: + panel_color = "warning" + else: + panel_color = "success" + # panel_label + display_name = action_item.display_name.replace("Submit", "").replace("pending", "") + identifier = action_item.identifier or "New" + panel_label = _(f"{display_name} {identifier}") + return dict( + btn=btn, + panel_color=panel_color, + reference_obj=reference_obj, + action_item=action_item, + OPEN=OPEN, + CLOSED=CLOSED, + report_status=report_status, + panel_label=panel_label, + ) + return {} @register.simple_tag(takes_context=True) @@ -253,3 +258,13 @@ def get_empty_qs_message(status: str, search_term: str): if search_term: msg = f"{msg[:-1]} for your search criteria" return _(msg) + + +@register.inclusion_tag( + f"edc_adverse_event/bootstrap{get_bootstrap_version()}/tmg/tmg_button_group.html", + takes_context=True, +) +def render_tmg_button_group(context, subject_identifier: str): + if context["request"].user.userprofile.roles.filter(name=TMG_ROLE).exists(): + return dict(subject_identifier=subject_identifier) + return {} diff --git a/edc_adverse_event/view_mixins/tmg/tmg_ae_listboard_view_mixin.py b/edc_adverse_event/view_mixins/tmg/tmg_ae_listboard_view_mixin.py index fa13b59..b85e433 100644 --- a/edc_adverse_event/view_mixins/tmg/tmg_ae_listboard_view_mixin.py +++ b/edc_adverse_event/view_mixins/tmg/tmg_ae_listboard_view_mixin.py @@ -37,7 +37,7 @@ class TmgAeListboardViewMixin( navbar_name = get_default_navbar() navbar_selected_item = "tmg_home" ordering = "-report_datetime" - paginate_by = 50 + paginate_by = 10 search_form_url = "tmg_ae_listboard_url" action_type_names = [AE_TMG_ACTION] @@ -54,6 +54,7 @@ def get_context_data(self, **kwargs) -> dict[str, Any]: kwargs.update( AE_TMG_ACTION=AE_TMG_ACTION, utc_date=get_utcnow().date(), + subject_identifier=self.kwargs.get("subject_identifier"), ) return super().get_context_data(**kwargs) diff --git a/edc_adverse_event/view_utils/tmg_button.py b/edc_adverse_event/view_utils/tmg_button.py index f98dfd8..e333a26 100644 --- a/edc_adverse_event/view_utils/tmg_button.py +++ b/edc_adverse_event/view_utils/tmg_button.py @@ -7,6 +7,7 @@ from edc_subject_dashboard.view_utils import ModelButton if TYPE_CHECKING: + from edc_action_item.models import ActionItem from edc_model.models import BaseUuidModel from edc_adverse_event.model_mixins import ( @@ -28,11 +29,12 @@ class DeathReportModel(DeathReportModelMixin, BaseUuidModel): ... @dataclass class TmgButton(ModelButton): model_obj: DeathReportTmgModel | DeathReportModel | AeFollowupModel | AeInitialModel = None - next_url_name: str = "open_tmg_ae_listboard_url" + next_url_name: str | None = field(default="open_tmg_ae_listboard_url") only_user_created_may_access: bool | None = None forloop_counter: int | None = None colors: tuple[str, str, str] = field(default=("warning", "success", "success")) titles: tuple[str, str, str] = field(default=(_("Add"), _("Change"), _("View"))) + action_item: ActionItem = (None,) disable_all: bool = False @@ -88,3 +90,24 @@ def label(self) -> str: ): return _("View") return _(super().label) + + @property + def extra_kwargs(self) -> dict[str, str | int]: + opts = {} + if self.action_item.parent_action_item: + parent_action_item = getattr(self.action_item, "parent_action_item", None) + if parent_action_item: + opts.update( + parent_action_item=str(parent_action_item.id), + ) + related_action_item = getattr(self.action_item, "parent_action_item", None) + if related_action_item: + opts.update( + related_action_item=str(related_action_item.id), + ) + opts = dict( + ae_initial=str(self.action_item.parent_action_item.reference_obj.id), + action_identifier=self.action_item.action_identifier, + action_item=str(self.action_item.id), + ) + return opts diff --git a/edc_adverse_event/views/tmg/status_listboards.py b/edc_adverse_event/views/tmg/status_listboards.py index 3cc6304..139c71c 100644 --- a/edc_adverse_event/views/tmg/status_listboards.py +++ b/edc_adverse_event/views/tmg/status_listboards.py @@ -7,18 +7,18 @@ class NewTmgAeListboardView(StatusTmgAeListboardView): listboard_url = "new_tmg_ae_listboard_url" search_form_url = "new_tmg_ae_listboard_url" status = NEW - listboard_panel_title = "TMG: New AE Reports" + listboard_panel_title = "TMG AE Reports: New" class OpenTmgAeListboardView(StatusTmgAeListboardView): listboard_url = "open_tmg_ae_listboard_url" search_form_url = "open_tmg_ae_listboard_url" status = OPEN - listboard_panel_title = "TMG: Open AE Reports" + listboard_panel_title = "TMG AE Reports: Open" class ClosedTmgAeListboardView(StatusTmgAeListboardView): listboard_url = "closed_tmg_ae_listboard_url" search_form_url = "closed_tmg_ae_listboard_url" status = CLOSED - listboard_panel_title = "TMG: Closed AE Reports" + listboard_panel_title = "TMG AE Reports: Closed"