15.2.592. server/camcops_server/templates/taskcommon/task.mako

## -*- coding: utf-8 -*-
<%doc>

camcops_server/templates/taskcommon/task.mako

===============================================================================

    Copyright (C) 2012, University of Cambridge, Department of Psychiatry.
    Created by Rudolf Cardinal (rnc1001@cam.ac.uk).

    This file is part of CamCOPS.

    CamCOPS is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    CamCOPS is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with CamCOPS. If not, see <https://www.gnu.org/licenses/>.

===============================================================================

</%doc>

## <%page args="task: Task, viewtype: str, anonymise: bool, signature: bool, paged_media: bool, pdf_landscape: bool"/>

<%!

from cardinal_pythonlib.datetimefunc import format_datetime
from camcops_server.cc_modules.cc_constants import (
    CSS_PAGED_MEDIA,
    DateFormat,
    ERA_NOW,
)
from camcops_server.cc_modules.cc_html import (
    answer,
    get_yes_no,
)
from camcops_server.cc_modules.cc_pyramid import Icons, Routes, ViewArg, ViewParam
from camcops_server.cc_modules.cc_version_string import CAMCOPS_SERVER_VERSION_STRING

def inherit_file(context):
    ## https://groups.google.com/forum/#!topic/mako-discuss/okPBlbGhy_U
    viewtype = context['viewtype']
    if viewtype == ViewArg.HTML:
        return "base_web.mako"
    elif viewtype == ViewArg.PDF:
        if CSS_PAGED_MEDIA:
            pdf_landscape = context['pdf_landscape']
            if pdf_landscape:
                return "base_pdf_landscape.mako"
            else:
                return "base_pdf_portrait.mako"
        else:
            return "base_pdf_no_paged_media.mako"
    else:
        raise ValueError("This template is only for HTML/PDF views")

%>

<%inherit file="${ inherit_file(context) }"/>
## ... don't use "| n" for that.

## ============================================================================
## Title (overriding base.mako)
## ============================================================================

<%block name="title">
    <title>${ task.title_for_html(req, anonymise=anonymise) }</title>
</%block>

## ============================================================================
## For CSS paged media, extra headers
## ============================================================================

%if CSS_PAGED_MEDIA and viewtype == ViewArg.PDF:
    <%block name="extra_header_content">
        <%include file="task_page_header.mako" args="task=task, anonymise=anonymise"/>
    </%block>
    <%block name="extra_footer_content">
        <%include file="task_page_footer.mako" args="task=task"/>
    </%block>
%endif
## For non-paged media (i.e. wkhtmltopdf), the headers/footers are made separately.

## ============================================================================
## Task descriptive header: patient details, task details
## ============================================================================

<%include file="task_descriptive_header.mako" args="task=task, anonymise=anonymise"/>

## ============================================================================
## "Not current" warning and explanation (if applicable)
## ============================================================================

%if not task._current:
    <%include file="task_not_current.mako" args="task=task"/>
%endif

## ============================================================================
## "Invalid contents" warning (if applicable)
## ============================================================================

%if not task.field_contents_valid():
    <%include file="task_contents_invalid.mako" args="task=task"/>
%endif

## ============================================================================
## Special notes (if applicable)
## ============================================================================

%if task.special_notes:
    <%include file="special_notes.mako" args="special_notes=task.special_notes, title='TASK SPECIAL NOTES', viewtype=viewtype"/>
%endif

## ============================================================================
## Clinician
## ============================================================================

%if task.has_clinician:
    <%include file="clinician.mako" args="task=task"/>
%endif

## ============================================================================
## Respondent
## ============================================================================

%if task.has_respondent:
    <%include file="respondent.mako" args="task=task"/>
%endif

## ============================================================================
## Main task content
## ============================================================================

${ task.get_task_html(req) | n }

## ============================================================================
## "Office" stuff
## ============================================================================

<div class="office">
    ${ _("Created on device at:") }
        ${ format_datetime(task.when_created, DateFormat.SHORT_DATETIME_SECONDS) }.
    ${ _("Last modified at:") }
        ${ format_datetime(task.when_last_modified, DateFormat.SHORT_DATETIME_SECONDS) }.
    ${ _("Table:") }
        ${ task.tablename }.
    ${ _("Task PK on client device:") }
        ${ task.id }.
    ${ _("Uploading device ID:") }
        ${ task._device.get_friendly_name_and_id() if task._device else "?" }.
    ${ _("Tablet CamCOPS version at upload:") }
        ${ task._camcops_version }.
    ${ _("Uploaded at:") }
        ${ format_datetime(task._when_added_exact, DateFormat.SHORT_DATETIME_SECONDS) }.
    ${ _("Group:") }
        ${ task._group.name } (${ task._group_id }).
    ${ _("Added by:") }
        ${ task.get_adding_user_username() }.
    ${ _("Server PK:") }
        ${ task.pk }
        (${ _("predecessor") } ${ task._predecessor_pk },
        ${ _("successor") } ${ task._successor_pk }).
    ${ _("Current?") }
        %if task._current:
            ## some repetition as harder to have no space before "." otherwise!
            ${ get_yes_no(req, True) }.
        %else:
            ${ get_yes_no(req, False) }
            %if task._successor_pk is None:
                (${ _("deleted") }
            %else:
                (${ _("modified") }
            %endif
            ## TRANSLATOR: ... deleted/modified... by <username>... at <time>
            ${ _("by") }
                ${ task.get_removing_user_username() }
            ## TRANSLATOR: ... deleted/modified... by <username>... at <time>
            ${ _("at") }
                ${ format_datetime(task._when_removed_exact, DateFormat.SHORT_DATETIME_SECONDS) }.
        %endif
    ${ _("Preserved/erased from tablet?") }
        %if task.is_preserved():
            ${ get_yes_no(req, True) }
            %if task.was_forcibly_preserved():
                ## TRANSLATOR: ... [forcibly] preserved... by <username>... at <time>
                (${ _("forcibly preserved") }
            %else:
                ## TRANSLATOR: ... [forcibly] preserved... by <username>... at <time>
                (${ _("preserved") }
            %endif
            ## TRANSLATOR: ... [forcibly] preserved... by <username>... at <time>
            ${ _("by") }
                ${ task.get_preserving_user_username() }
            ## TRANSLATOR: ... [forcibly] preserved... by <username>... at <time>
            ${ _("at") }
                ${ task.era }.
            ## ... already an UTC ISO8601 string (BUT Python transformation now).
        %else:
            ${ get_yes_no(req, False) }.
        %endif
    ${ _("Patient server PK used:") }
        ${ task.get_patient_server_pk() if not task.is_anonymous else "N/A" }.
    ## TRANSLATOR: Information received from <url> (server version <version>) at: <datetime>.
    ${ _("Information retrieved from") }
        ${ req.url }
    ## TRANSLATOR: Information received from <url> (server version <version>) at: <datetime>.
    (${ _("server version") }
        ${ CAMCOPS_SERVER_VERSION_STRING })
    ## TRANSLATOR: Information received from <url> (server version <version>) at: <datetime>.
    ${ _("at:") }
        ${ format_datetime(req.now, DateFormat.SHORT_DATETIME_SECONDS) }.
</div>

## ============================================================================
## Extra hyperlinks for web version
## ============================================================================

%if viewtype == ViewArg.HTML:

    <div class="office">

        ## Link to help
        ${ req.icon_text(
            icon=Icons.INFO_EXTERNAL,
            url=task.help_url(),
            text=_("Task help")
        ) | n }
        |
        ## Link to details
        ${ req.icon_text(
            icon=Icons.INFO_INTERNAL,
            url=req.route_url(Routes.TASK_DETAILS, table_name=task.tablename),
            text=_("Task details")
        ) | n }


        ## Link to XML and FHIR versions (always identifiable)
        %if not anonymise:
            <p>
                View raw data:
                ${ req.icon_text(
                        icon=Icons.XML,
                        url=req.route_url(
                            Routes.TASK,
                            _query={
                                ViewParam.TABLE_NAME: task.tablename,
                                ViewParam.SERVER_PK: task.pk,
                                ViewParam.VIEWTYPE: ViewArg.XML,
                            }
                        ),
                        text="XML"
                ) | n }
                |
                ${ req.icon_text(
                        icon=Icons.JSON,
                        url=req.route_url(
                            Routes.TASK,
                            _query={
                                ViewParam.TABLE_NAME: task.tablename,
                                ViewParam.SERVER_PK: task.pk,
                                ViewParam.VIEWTYPE: ViewArg.FHIRJSON,
                            }
                        ),
                        text="FHIR"
                ) | n }
            </p>
        %endif

        ## Link to anonymous version (or back to identifiable):
        <p>
            %if anonymise:
                ${ req.icon_text(
                    icon=Icons.HTML_IDENTIFIABLE,
                    url=req.route_url(
                        Routes.TASK,
                        _query={
                                ViewParam.TABLE_NAME: task.tablename,
                                ViewParam.SERVER_PK: task.pk,
                            ViewParam.VIEWTYPE: ViewArg.HTML,
                        }
                    ),
                    text=_("View identifiable version")
                ) | n }
            %else:
                View anonymised version:
                ${ req.icon_text(
                        icon=Icons.HTML_ANONYMOUS,
                        url=req.route_url(
                            Routes.TASK,
                            _query={
                                ViewParam.TABLE_NAME: task.tablename,
                                ViewParam.SERVER_PK: task.pk,
                                ViewParam.VIEWTYPE: ViewArg.HTML,
                                ViewParam.ANONYMISE: True,
                            }
                        ),
                        text="HTML"
                ) | n }
                |
                ${ req.icon_text(
                    icon=Icons.PDF_ANONYMOUS,
                    url=request.route_url(
                        Routes.TASK,
                        _query={
                            ViewParam.TABLE_NAME: task.tablename,
                            ViewParam.SERVER_PK: task.pk,
                            ViewParam.VIEWTYPE: ViewArg.PDF,
                            ViewParam.ANONYMISE: True,
                        }
                    ),
                    text="PDF"
                ) | n }
            %endif
        </p>
    </div>

    ## Superuser options
    %if not anonymise:
        <div class="superuser">
            ## check this collapses to zero height with no content!
            %if req.user.authorized_to_add_special_note(task._group_id):
                <p>
                    ${ req.icon_text(
                        icon=Icons.SPECIAL_NOTE,
                        url=request.route_url(
                            Routes.ADD_SPECIAL_NOTE,
                            _query={
                                ViewParam.TABLE_NAME: task.tablename,
                                ViewParam.SERVER_PK: task.pk,
                            }
                        ),
                        text=_("Add special note")
                    ) | n }
                </p>
            %endif
            %if req.user.may_administer_group(task._group_id):
                %if task.has_patient and task.patient and task.patient.is_finalized:
                    <p>
                        ${ req.icon_text(
                            icon=Icons.PATIENT_EDIT,
                            url=request.route_url(
                                Routes.EDIT_FINALIZED_PATIENT,
                                _query={
                                    ViewParam.SERVER_PK: task.patient.pk,
                                    ViewParam.BACK_TASK_TABLENAME: task.tablename,
                                    ViewParam.BACK_TASK_SERVER_PK: task.pk,
                                }
                            ),
                            text=_("Edit patient details")
                        ) | n }
                    </p>
                %endif
            %endif
            %if req.user.authorized_to_erase_tasks(task._group_id):
                ## Note: prohibit manual erasure for non-finalized tasks.
                %if task.era != ERA_NOW:
                    <p>
                    %if not task.is_erased():
                        ${ req.icon_text(
                            icon=Icons.DELETE_MAJOR,
                            url=request.route_url(
                                Routes.ERASE_TASK_LEAVING_PLACEHOLDER,
                                _query={
                                    ViewParam.TABLE_NAME: task.tablename,
                                    ViewParam.SERVER_PK: task.pk,
                                }
                            ),
                            text=_("Erase task instance, leaving placeholder")
                        ) | n }
                        |
                    %endif
                        ${ req.icon_text(
                            icon=Icons.DELETE_MAJOR,
                            url=request.route_url(
                                Routes.ERASE_TASK_ENTIRELY,
                                _query={
                                    ViewParam.TABLE_NAME: task.tablename,
                                    ViewParam.SERVER_PK: task.pk,
                                }
                            ),
                            text=_("Erase task entirely")
                        ) | n }
                    </p>
                %endif
            %endif
        </div>
    %endif

    ## Links to predecessor / successor / PDF

    <div class="navigation">
        ## Links to predecessor/successor
        %if task._predecessor_pk is not None:
            <p><i>
                An older version of this record exists:
                ${ req.icon_text(
                    icon=Icons.GOTO_PREDECESSOR,
                    url=request.route_url(
                        Routes.TASK,
                        _query={
                            ViewParam.TABLE_NAME: task.tablename,
                            ViewParam.SERVER_PK: task._predecessor_pk,
                            ViewParam.VIEWTYPE: ViewArg.HTML,
                        }
                    ),
                    text=_("view previous version")
                ) | n }
            </i></p>
        %endif
        %if task._successor_pk is not None:
            <p><b>
                An newer version of this record exists:
                ${ req.icon_text(
                    icon=Icons.GOTO_SUCCESSOR,
                    url=request.route_url(
                        Routes.TASK,
                        _query={
                            ViewParam.TABLE_NAME: task.tablename,
                            ViewParam.SERVER_PK: task._successor_pk,
                            ViewParam.VIEWTYPE: ViewArg.HTML,
                        }
                    ),
                    text=_("view next version")
                ) | n }
            </b></p>
        %endif

        ## Link to PDF version
        <p>
            %if anonymise:
                ${ req.icon_text(
                    icon=Icons.PDF_ANONYMOUS,
                    url=request.route_url(
                        Routes.TASK,
                        _query={
                            ViewParam.TABLE_NAME: task.tablename,
                            ViewParam.SERVER_PK: task.pk,
                            ViewParam.VIEWTYPE: ViewArg.PDF,
                            ViewParam.ANONYMISE: True,
                        }
                    ),
                    text=_("View anonymised PDF")
                ) | n }
            %else:
                ${ req.icon_text(
                    icon=Icons.PDF_IDENTIFIABLE,
                    url=request.route_url(
                        Routes.TASK,
                        _query={
                            ViewParam.TABLE_NAME: task.tablename,
                            ViewParam.SERVER_PK: task.pk,
                            ViewParam.VIEWTYPE: ViewArg.PDF,
                        }
                    ),
                    text=_("View PDF for printing/saving")
                ) | n }
            %endif
        </p>
    </div>

%endif

## ============================================================================
## Signature block for PDF version
## ============================================================================

%if signature:
    <%include file="clinician_signature_block.mako"/>
%endif