2024-10-10 15:45:44 +05:30
|
|
|
from collections import Counter
|
|
|
|
|
|
|
|
|
|
from django.db.models import Q
|
2024-10-10 15:41:46 +05:30
|
|
|
from django.http import QueryDict
|
|
|
|
|
from rest_framework.pagination import PageNumberPagination
|
2024-10-10 15:45:44 +05:30
|
|
|
|
2024-10-10 15:41:46 +05:30
|
|
|
from employee.models import EmployeeWorkInformation
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def get_filter_url(current_url, request):
|
2024-10-10 15:45:44 +05:30
|
|
|
url_parts = current_url.split("?")
|
2024-10-10 15:41:46 +05:30
|
|
|
base_url = request.path
|
|
|
|
|
query_params = QueryDict(url_parts[1], mutable=True)
|
2024-10-10 15:45:44 +05:30
|
|
|
query_params.pop("groupby_field", None)
|
|
|
|
|
return base_url + "?" + query_params.urlencode()
|
2024-10-10 15:41:46 +05:30
|
|
|
|
|
|
|
|
|
|
|
|
|
def groupby_queryset(request, url, field_name, queryset):
|
2024-10-10 15:45:44 +05:30
|
|
|
queryset_with_counts = queryset.values(field_name)
|
2024-10-10 15:41:46 +05:30
|
|
|
|
|
|
|
|
counts = Counter(item[field_name] for item in queryset_with_counts)
|
|
|
|
|
|
|
|
|
|
result_list = []
|
|
|
|
|
for i in counts:
|
2024-10-10 15:45:44 +05:30
|
|
|
result_list.append({field_name: i, "count": counts[i]})
|
2024-10-10 15:41:46 +05:30
|
|
|
|
|
|
|
|
counts_and_objects = []
|
|
|
|
|
url = get_filter_url(url, request)
|
|
|
|
|
for item in result_list:
|
2024-10-10 15:45:44 +05:30
|
|
|
count = item["count"]
|
2024-10-10 15:41:46 +05:30
|
|
|
related_fields = field_name.split("__")
|
|
|
|
|
if item[field_name]:
|
2024-10-10 15:45:44 +05:30
|
|
|
related_obj = queryset.filter(**{field_name: item[field_name]}).first()
|
2024-10-10 15:41:46 +05:30
|
|
|
for field in related_fields:
|
|
|
|
|
related_obj = getattr(related_obj, field)
|
|
|
|
|
counts_and_objects.append(
|
2024-10-10 15:45:44 +05:30
|
|
|
{
|
|
|
|
|
"count": count,
|
|
|
|
|
"name": str(related_obj),
|
|
|
|
|
"filter_url": f"{url}&{field_name}={item[field_name]}",
|
|
|
|
|
}
|
|
|
|
|
)
|
2024-10-10 15:41:46 +05:30
|
|
|
pagination = PageNumberPagination()
|
|
|
|
|
page = pagination.paginate_queryset(counts_and_objects, request)
|
|
|
|
|
return pagination.get_paginated_response(page)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def permission_based_queryset(user, perm, queryset, user_obj=None):
|
|
|
|
|
if user.has_perm(perm):
|
|
|
|
|
return queryset
|
|
|
|
|
|
|
|
|
|
employee = user.employee_get
|
|
|
|
|
is_manager = EmployeeWorkInformation.objects.filter(
|
|
|
|
|
reporting_manager_id=employee
|
|
|
|
|
).exists()
|
|
|
|
|
if is_manager:
|
|
|
|
|
if user_obj:
|
|
|
|
|
return queryset.filter(
|
2024-10-10 15:45:44 +05:30
|
|
|
Q(employee_id=employee)
|
|
|
|
|
| Q(employee_id__employee_work_info__reporting_manager_id=employee)
|
2024-10-10 15:41:46 +05:30
|
|
|
)
|
|
|
|
|
manager_filter = Q(employee_id=employee)
|
|
|
|
|
subordinates_filter = Q(
|
2024-10-10 15:45:44 +05:30
|
|
|
employee_id__employee_work_info__reporting_manager_id=employee
|
|
|
|
|
)
|
2024-10-10 15:41:46 +05:30
|
|
|
merged_filter = manager_filter | subordinates_filter
|
|
|
|
|
merged_queryset = queryset.filter(merged_filter)
|
|
|
|
|
return merged_queryset
|
|
|
|
|
|
|
|
|
|
return queryset.filter(employee_id=employee)
|