diff --git a/.github/workflows/pythonpackage.yml b/.github/workflows/pythonpackage.yml index a174ab2f..444b9e25 100644 --- a/.github/workflows/pythonpackage.yml +++ b/.github/workflows/pythonpackage.yml @@ -8,8 +8,15 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: ["3.8", "3.9", "3.10", "3.11"] - django-version: ["32","4"] + include: + # Explicitly include Python 3.8 and 3.9 only with Django 4 + - python-version: "3.8" + django-version: "4" + - python-version: "3.9" + django-version: "4" + # Define the general matrix for Python with Django + python-version: ["3.10", "3.11", "3.12"] + django-version: ["4"] steps: - uses: actions/checkout@v4 @@ -21,7 +28,7 @@ jobs: - uses: actions/cache@v4 with: path: ~/.cache/pip - key: ${{ hashFiles('requirements.txt') }}-${{ hashFiles('requirements-testing.txt')}}-${{ hashFiles('tox.ini') }}-${{ matrix.python-version }}-${{ matrix.django-version }} + key: ${{ hashFiles('requirements.txt') }}-${{ hashFiles('requirements-testing.txt')}}-${{ hashFiles('tox.ini') }}-${{ matrix.python-version }}-${{ matrix.django-version }} - name: Install dependencies run: | diff --git a/constraints-Django5.txt b/constraints-Django5.txt new file mode 100644 index 00000000..a4769e29 --- /dev/null +++ b/constraints-Django5.txt @@ -0,0 +1 @@ +Django >=5,<6 diff --git a/helpdesk/query.py b/helpdesk/query.py index 9c5a0930..ea69a133 100644 --- a/helpdesk/query.py +++ b/helpdesk/query.py @@ -1,6 +1,8 @@ from base64 import b64decode, b64encode -from django.db.models import Q +from django.db.models import Q, Max +from django.db.models import F, Window, Subquery, OuterRef +from .models import FollowUp from django.urls import reverse from django.utils.html import escape from django.utils.translation import gettext as _ @@ -65,8 +67,9 @@ DATATABLES_ORDER_COLUMN_CHOICES = Choices( ('6', 'due_date'), ('7', 'assigned_to'), ('8', 'submitter_email'), - # ('9', 'time_spent'), - ('10', 'kbitem'), + ('9', 'last_followup'), + # ('10', 'time_spent'), + ('11', 'kbitem'), ) @@ -169,13 +172,26 @@ class __Query__: search_value = kwargs.get('search[value]', [""])[0] order_column = kwargs.get('order[0][column]', ['5'])[0] order = kwargs.get('order[0][dir]', ["asc"])[0] - + order_column = DATATABLES_ORDER_COLUMN_CHOICES[order_column] # django orm '-' -> desc if order == 'desc': order_column = '-' + order_column - - queryset = objects.all().order_by(order_by) + + queryset = objects.annotate( + last_followup=Subquery( + FollowUp.objects.order_by().annotate( + last_followup=Window( + expression=Max("date"), + partition_by=[F("ticket_id"),], + order_by="-date" + ) + ).filter( + ticket_id=OuterRef("id") + ).values("last_followup").distinct() + ) + ).order_by(order_by) + total = queryset.count() if search_value: # Dead code currently diff --git a/helpdesk/serializers.py b/helpdesk/serializers.py index c8c4dbb7..142e6689 100644 --- a/helpdesk/serializers.py +++ b/helpdesk/serializers.py @@ -18,6 +18,7 @@ class DatatablesTicketSerializer(serializers.ModelSerializer): ticket = serializers.SerializerMethodField() assigned_to = serializers.SerializerMethodField() submitter = serializers.SerializerMethodField() + last_followup = serializers.SerializerMethodField() created = serializers.SerializerMethodField() due_date = serializers.SerializerMethodField() status = serializers.SerializerMethodField() @@ -30,8 +31,8 @@ class DatatablesTicketSerializer(serializers.ModelSerializer): model = Ticket # fields = '__all__' fields = ('ticket', 'id', 'priority', 'title', 'queue', 'status', - 'created', 'due_date', 'assigned_to', 'submitter', 'row_class', - 'time_spent', 'kbitem') + 'created', 'due_date', 'assigned_to', 'submitter', 'last_followup', + 'row_class', 'time_spent', 'kbitem') def get_queue(self, obj): return {"title": obj.queue.title, "id": obj.queue.id} @@ -70,8 +71,11 @@ class DatatablesTicketSerializer(serializers.ModelSerializer): def get_kbitem(self, obj): return obj.kbitem.title if obj.kbitem else "" - - + + def get_last_followup(self, obj): + return obj.last_followup + + class FollowUpAttachmentSerializer(serializers.ModelSerializer): class Meta: model = FollowUpAttachment diff --git a/helpdesk/templates/helpdesk/report_index.html b/helpdesk/templates/helpdesk/report_index.html index 63194afb..30470312 100644 --- a/helpdesk/templates/helpdesk/report_index.html +++ b/helpdesk/templates/helpdesk/report_index.html @@ -27,11 +27,11 @@