Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

TP2000-1719 Ticket list view #1416

Merged
merged 21 commits into from
Mar 7, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
b2a1321
Add status tags
mattjamc Feb 20, 2025
1fd38b1
Merge branch 'TP2000-1471--task-workflow' of github.com:uktrade/tamat…
mattjamc Feb 20, 2025
81328f9
Add initial filtering
mattjamc Feb 21, 2025
c2856d0
User full name
mattjamc Feb 21, 2025
aff1a65
added support for sorting tickets by ID in descending or ascending order
marya-shariq Feb 25, 2025
732a50b
Merge branch 'TP2000-1471--task-workflow' into TP2000-1719-Ticket-lis…
marya-shariq Mar 3, 2025
c95244c
Merge branch 'TP2000-1471--task-workflow' into TP2000-1719-Ticket-lis…
marya-shariq Mar 3, 2025
97b2d15
Merge branch 'TP2000-1471--task-workflow' into TP2000-1719-Ticket-lis…
marya-shariq Mar 3, 2025
3c36734
small bug fix for sort_by_fields (previously using 'id', now correctl…
marya-shariq Mar 3, 2025
b264644
wip for assignment filter idk tho
marya-shariq Mar 4, 2025
306c288
Merge branch 'TP2000-1471--task-workflow' of github.com:uktrade/tamat…
mattjamc Mar 5, 2025
8e31096
Merge branch 'TP2000-1719-Ticket-list-view' of github.com:uktrade/tam…
mattjamc Mar 5, 2025
0cfbb9a
Merge branch 'TP2000-1471--task-workflow' into TP2000-1719-Ticket-lis…
mattjamc Mar 5, 2025
90d7e4e
Fix ID ordering
mattjamc Mar 5, 2025
5823740
removed experimental assignee filtering
marya-shariq Mar 5, 2025
821ac47
unit test for ordering of tickets by eif date in ascending or descend…
marya-shariq Mar 5, 2025
ed8b87c
Remove empty test
mattjamc Mar 6, 2025
464a83d
addressed comments on PR - utilised macros for displaying assignees a…
marya-shariq Mar 6, 2025
5dbafaa
Merge branch 'TP2000-1719-Ticket-list-view' of github.com:uktrade/tam…
marya-shariq Mar 6, 2025
456b68e
removed status tag generator from list view
marya-shariq Mar 6, 2025
5d4de9d
using display assignee macro in list view jinja template
marya-shariq Mar 7, 2025
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
24 changes: 23 additions & 1 deletion tasks/filters.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
from django.db.models import TextChoices
from django.forms import CheckboxSelectMultiple
from django.forms import widgets
from django.urls import reverse_lazy
from django_filters import ChoiceFilter
from django_filters import ModelChoiceFilter
from django_filters import ModelMultipleChoiceFilter

from common.filters import TamatoFilter
from common.models import User
from common.widgets import RadioSelect
from tasks.forms import TaskFilterForm
from tasks.models import ProgressState
from tasks.models import Task
from tasks.models import TaskWorkflowTemplate
Expand Down Expand Up @@ -51,9 +55,27 @@ class TaskWorkflowFilter(TamatoFilter):
widget=CheckboxSelectMultiple,
)

work_type = ModelChoiceFilter(
label="Work type",
queryset=TaskWorkflowTemplate.objects.all(),
field_name="taskworkflow__creator_template",
widget=widgets.Select(),
)

assignees = ModelChoiceFilter(
label="Assignees",
field_name="assignees",
queryset=User.objects.active_tms(),
)

class Meta:
model = Task
fields = ["search", "category", "progress_state"]
form = TaskFilterForm
fields = [
"search",
"progress_state",
"assignees",
]

@property
def qs(self):
Expand Down
28 changes: 28 additions & 0 deletions tasks/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,12 @@

from crispy_forms_gds.helper import FormHelper
from crispy_forms_gds.layout import HTML
from crispy_forms_gds.layout import Button
from crispy_forms_gds.layout import Fieldset
from crispy_forms_gds.layout import Layout
from crispy_forms_gds.layout import Size
from crispy_forms_gds.layout import Submit
from django import forms
from django.contrib.auth import get_user_model
from django.db import transaction
from django.forms import CharField
Expand Down Expand Up @@ -469,3 +471,29 @@ def __init__(self, *args, **kwargs):


TaskTemplateDeleteForm = delete_form_for(TaskTemplate)


class TaskFilterForm(forms.Form):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.init_fields()
self.helper = FormHelper()

self.helper.layout = Layout(
"search",
"progress_state",
"assignees",
"work_type",
Button(
"submit",
"Search and filter",
),
HTML(
f'<a class="govuk-button govuk-button--secondary" href="{self.clear_url}"> Clear </a>',
),
)

def init_fields(self):
self.fields["assignees"].label_from_instance = (
lambda obj: f"{obj.get_displayname()}"
)
37 changes: 13 additions & 24 deletions tasks/jinja2/tasks/workflows/list.jinja
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@

{% from "components/table/macro.njk" import govukTable %}
{% from "components/create_sortable_anchor.jinja" import create_sortable_anchor %}
{% from "tasks/macros/display_details.jinja" import display_status %}
{% from "tasks/macros/display_details.jinja" import display_assignees %}

{% set page_title = "Find and view workflows" %}
{% set page_title = "Find and view tickets" %}

{% block breadcrumb %}
{{ breadcrumbs(request, [
Expand All @@ -16,8 +18,8 @@
{% block content %}
<h1 class="govuk-heading-xl">{{ page_title }}</h1>
<p class="govuk-body">
Search for workflows. Alternatively,
<a class="govuk-link" href="{{ url('workflow:task-workflow-ui-create') }}">create a new workflow</a>
Search for tickets. Alternatively,
<a class="govuk-link" href="{{ url('workflow:task-workflow-ui-create') }}">create a new ticket</a>
</p>

<div class="filter-layout">
Expand Down Expand Up @@ -45,35 +47,22 @@
>{{ object.taskworkflow.pk }}</a>
{%- endset -%}

{%- set workbasket_linked_id -%}
{% if object.workbasket %}
<a
class="govuk-link"
href="{{ url("workbaskets:workbasket-ui-detail", kwargs={"pk": object.workbasket.pk}) }}"
>{{ object.workbasket.pk }}</a>
{%- else -%}
-
{%- endif -%}
{%- endset -%}

{{ table_rows.append([
{"text": task_linked_id},
{"html": task_linked_id},
{"text": object.title},
{"text": object.category or "-"},
{"text": object.progress_state},
{"text": workbasket_linked_id},
{"text": "{:%d %b %Y}".format(object.created_at)},
{"html": display_assignees(object.assignees.assigned())},
{"text": "{:%d %b %Y}".format(object.taskworkflow.eif_date) if object.taskworkflow.eif_date else "-"},
{"text": display_status(object.progress_state.__str__())},
]) or "" }}
{% endfor %}

{{ govukTable({
"head": [
{"text": "ID"},
{"text": "Title"},
{"text": "Category"},
{"text": create_sortable_anchor(request, "ID", sorting_urls["taskworkflow__id"])},
{"text": "Ticket name"},
{"text": "Assignee"},
{"text": create_sortable_anchor(request, "Entry into force date", sorting_urls["taskworkflow__eif_date"])},
{"text": "Status"},
{"text": "Workbasket"},
{"text": create_sortable_anchor(request, "Created", sorting_urls["created_at"])},
],
"rows": table_rows
}) }}
Expand Down
42 changes: 41 additions & 1 deletion tasks/tests/test_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
from tasks.models import TaskWorkflow
from tasks.models import TaskWorkflowTemplate
from tasks.tests.factories import TaskItemTemplateFactory
from tasks.tests.factories import TaskWorkflowFactory
from tasks.tests.factories import TaskWorkflowTemplateFactory

pytestmark = pytest.mark.django_db
Expand Down Expand Up @@ -730,7 +731,8 @@ def test_workflow_delete_view(
assert f"Ticket ID: {workflow_pk}" in soup.select(".govuk-panel__title")[0].text


def test_workflow_list_view(valid_user_client, task_workflow):
def test_ticket_list_view(valid_user_client, task_workflow):
"""Test that the ticket list view returns 200 and renders correctly."""
response = valid_user_client.get(reverse("workflow:task-workflow-ui-list"))

assert response.status_code == 200
Expand All @@ -744,6 +746,44 @@ def test_workflow_list_view(valid_user_client, task_workflow):
].text == str(task_workflow.pk)


def test_workflow_list_view_eif_date(
valid_user_client,
):
"""Tests that workflows listed on `TaskWorkflowList` view can be sorted by
entry into force (eif) date in ascending or descending order."""

workflow_instance_1 = TaskWorkflowFactory.create(eif_date=date(2022, 1, 1))
workflow_instance_2 = TaskWorkflowFactory.create(eif_date=date(2022, 2, 2))

url = reverse(
"workflow:task-workflow-ui-list",
)
response = valid_user_client.get(
f"{url}?sort_by=taskworkflow__eif_date&ordered=asc",
)
page = BeautifulSoup(
response.content.decode(response.charset),
"html.parser",
)
ticket_ids = [
int(sid.text) for sid in page.select(".govuk-table tbody tr td:first-child")
]
assert ticket_ids == [workflow_instance_1.id, workflow_instance_2.id]

response = valid_user_client.get(
f"{url}?sort_by=taskworkflow__eif_date&ordered=desc",
)
page = BeautifulSoup(
response.content.decode(response.charset),
"html.parser",
)

ticket_ids = [
int(sid.text) for sid in page.select(".govuk-table tbody tr td:first-child")
]
assert ticket_ids == [workflow_instance_2.id, workflow_instance_1.id]


def test_task_and_workflow_list_view(valid_user_client, task, task_workflow):
response = valid_user_client.get(reverse("workflow:task-and-workflow-ui-list"))

Expand Down
2 changes: 1 addition & 1 deletion tasks/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -383,7 +383,7 @@ class TaskWorkflowListView(
permission_required = "tasks.view_task"
paginate_by = settings.DEFAULT_PAGINATOR_PER_PAGE_MAX
filterset_class = TaskWorkflowFilter
sort_by_fields = ["created_at"]
sort_by_fields = ["taskworkflow__id", "taskworkflow__eif_date"]

def get_queryset(self):
queryset = Task.objects.all()
Expand Down