From 5428a5e44b0a65e4f17011627f44bdc69fd4f50d Mon Sep 17 00:00:00 2001 From: Horilla Date: Mon, 8 Apr 2024 15:17:01 +0530 Subject: [PATCH] [FIX] BASE: Fixed sorting also working when clicking on pagination --- base/methods.py | 44 ++++++++++++++++++++++++++++++++++++-------- 1 file changed, 36 insertions(+), 8 deletions(-) diff --git a/base/methods.py b/base/methods.py index 62f36da84..57fa3ddd0 100644 --- a/base/methods.py +++ b/base/methods.py @@ -2,6 +2,8 @@ from datetime import date, datetime, time import io import json import random +import pandas as pd + from django.apps import apps from django.core.exceptions import ObjectDoesNotExist from django.db.models import ForeignKey, ManyToManyField, OneToOneField @@ -9,7 +11,10 @@ from django.forms.models import ModelChoiceField from django.http import HttpResponse from django.template.loader import render_to_string from django.utils.translation import gettext as _ -import pandas as pd +from django.db import models +from django.db.models import F +from django.db.models.functions import Lower + from xhtml2pdf import pisa from base.models import Company, DynamicPagination from employee.models import Employee, EmployeeWorkInformation @@ -137,19 +142,39 @@ def sortby(request, queryset, key): } orderingList.append(ordering) sortby = request.GET.get(key) + sort_count = request.GET.getlist(key).count(sortby) + order = None if sortby is not None and sortby != "": + + field_parts = sortby.split("__") + + model_meta = queryset.model._meta + # here will update the orderingList ordering["field"] = sortby - queryset = queryset.order_by(f'{ordering["ordering"]}{sortby}') - if ordering["ordering"] == "-": - ordering["ordering"] = "" - else: + if sort_count % 2 == 0: ordering["ordering"] = "-" + order = sortby + else: + ordering["ordering"] = "" + order = f"-{sortby}" + + for part in field_parts: + field = model_meta.get_field(part) + if isinstance(field, models.ForeignKey): + model_meta = field.related_model._meta + else: + if isinstance(field, models.CharField): + queryset = queryset.annotate(lower_title=Lower(sortby)) + queryset = queryset.order_by(f"{ordering['ordering']}lower_title") + else: + queryset = queryset.order_by(f'{ordering["ordering"]}{sortby}') + orderingList = [item for item in orderingList if item["id"] != id] orderingList.append(ordering) - order = f'{ordering["ordering"]}{sortby}' setattr(request, "sort_option", {}) request.sort_option["order"] = order + return queryset @@ -307,7 +332,6 @@ def get_key_instances(model, data_dict): object = str(object) del data_dict["id"] data_dict["Object"] = [object] - keys_to_remove = [ key for key, value in data_dict.items() @@ -327,6 +351,8 @@ def get_key_instances(model, data_dict): "opage", "click_id", "csrfmiddlewaretoken", + "assign_sortby", + "request_sortby", ] or "dynamic_page" in key ] @@ -481,7 +507,9 @@ def export_data(request, model, form_class, filter_class, file_name): } # Convert the string to a datetime.time object - check_in_time = datetime.strptime(str(value).split('.')[0], "%H:%M:%S").time() + check_in_time = datetime.strptime( + str(value).split(".")[0], "%H:%M:%S" + ).time() # Print the formatted time for each format for format_name, format_string in time_formats.items():