2023-12-01 15:36:51 +05:30
|
|
|
"""
|
|
|
|
|
horilla_company_manager.py
|
|
|
|
|
"""
|
2024-03-10 19:37:46 +05:30
|
|
|
|
2024-07-04 10:33:51 +05:30
|
|
|
import logging
|
2024-06-12 16:44:05 +05:30
|
|
|
from typing import Coroutine, Sequence
|
2024-05-07 12:23:36 +05:30
|
|
|
|
2023-12-01 15:36:51 +05:30
|
|
|
from django.db import models
|
2024-06-12 16:44:05 +05:30
|
|
|
from django.db.models.query import QuerySet
|
2024-05-07 12:23:36 +05:30
|
|
|
|
2024-06-20 11:45:55 +05:30
|
|
|
from horilla.horilla_middlewares import _thread_locals
|
2025-06-11 14:36:06 +05:30
|
|
|
from horilla.signals import (
|
|
|
|
|
post_bulk_update,
|
|
|
|
|
post_model_clean,
|
|
|
|
|
pre_bulk_update,
|
|
|
|
|
pre_model_clean,
|
|
|
|
|
)
|
2024-06-12 16:44:05 +05:30
|
|
|
|
2024-07-04 10:33:51 +05:30
|
|
|
logger = logging.getLogger(__name__)
|
2024-06-12 16:44:05 +05:30
|
|
|
django_filter_update = QuerySet.update
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def update(self, *args, **kwargs):
|
2025-06-11 14:36:06 +05:30
|
|
|
"""
|
|
|
|
|
Bulk Update
|
|
|
|
|
"""
|
2024-06-12 16:44:05 +05:30
|
|
|
# pre_update signal
|
|
|
|
|
request = getattr(_thread_locals, "request", None)
|
|
|
|
|
self.request = request
|
|
|
|
|
pre_bulk_update.send(sender=self.model, queryset=self, args=args, kwargs=kwargs)
|
|
|
|
|
result = django_filter_update(self, *args, **kwargs)
|
|
|
|
|
# post_update signal
|
|
|
|
|
post_bulk_update.send(sender=self.model, queryset=self, args=args, kwargs=kwargs)
|
|
|
|
|
|
|
|
|
|
return result
|
|
|
|
|
|
|
|
|
|
|
2025-06-11 14:36:06 +05:30
|
|
|
django_model_clean = models.Model.clean
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def clean(self, *args, **kwargs):
|
|
|
|
|
"""
|
|
|
|
|
Method to override django clean and trigger to signals
|
|
|
|
|
"""
|
|
|
|
|
pre_model_clean.send(sender=self._meta.model, instance=self, **kwargs)
|
|
|
|
|
result = django_model_clean(self)
|
|
|
|
|
post_model_clean.send(sender=self._meta.model, instance=self, **kwargs)
|
|
|
|
|
return result
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
models.Model.clean = clean
|
|
|
|
|
|
2024-06-12 16:44:05 +05:30
|
|
|
setattr(QuerySet, "update", update)
|
2023-12-01 15:36:51 +05:30
|
|
|
|
|
|
|
|
|
|
|
|
|
class HorillaCompanyManager(models.Manager):
|
|
|
|
|
"""
|
|
|
|
|
HorillaCompanyManager
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
def __init__(self, related_company_field=None, *args, **kwargs):
|
|
|
|
|
super().__init__(*args, **kwargs)
|
|
|
|
|
self.related_company_field = related_company_field
|
2024-01-06 12:50:12 +05:30
|
|
|
self.check_fields = [
|
|
|
|
|
"employee_id",
|
|
|
|
|
"requested_employee_id",
|
|
|
|
|
]
|
2023-12-01 15:36:51 +05:30
|
|
|
|
|
|
|
|
def get_queryset(self):
|
|
|
|
|
"""
|
|
|
|
|
get_queryset method
|
|
|
|
|
"""
|
2024-05-24 20:35:12 +05:30
|
|
|
|
2023-12-01 15:36:51 +05:30
|
|
|
queryset = super().get_queryset()
|
|
|
|
|
request = getattr(_thread_locals, "request", None)
|
|
|
|
|
selected_company = None
|
|
|
|
|
if request is not None:
|
|
|
|
|
selected_company = request.session.get("selected_company")
|
|
|
|
|
try:
|
|
|
|
|
queryset = (
|
|
|
|
|
queryset.filter(self.model.company_filter)
|
|
|
|
|
if selected_company != "all" and selected_company
|
|
|
|
|
else queryset
|
|
|
|
|
)
|
|
|
|
|
except Exception as e:
|
2024-05-27 15:42:27 +05:30
|
|
|
logger.error(e)
|
2025-11-07 14:38:56 +05:30
|
|
|
return queryset.distinct()
|
2024-01-06 12:50:12 +05:30
|
|
|
|
|
|
|
|
def all(self):
|
|
|
|
|
"""
|
|
|
|
|
Override the all() method
|
|
|
|
|
"""
|
2024-01-08 14:11:46 +05:30
|
|
|
queryset = []
|
|
|
|
|
try:
|
|
|
|
|
queryset = self.get_queryset()
|
2025-11-07 14:38:56 +05:30
|
|
|
model_name = queryset.model._meta.model_name
|
|
|
|
|
if model_name == "employee":
|
|
|
|
|
request = getattr(_thread_locals, "request", None)
|
|
|
|
|
if request:
|
|
|
|
|
active = (
|
|
|
|
|
True
|
|
|
|
|
if request.GET.get("is_active", True)
|
|
|
|
|
in ["unknown", "True", "true", True]
|
|
|
|
|
else False
|
|
|
|
|
)
|
|
|
|
|
queryset = queryset.filter(is_active=active)
|
|
|
|
|
|
|
|
|
|
elif model_name == "offboardingemployee":
|
|
|
|
|
return queryset
|
|
|
|
|
else:
|
|
|
|
|
for field in queryset.model._meta.fields:
|
|
|
|
|
if isinstance(field, models.ForeignKey):
|
|
|
|
|
if field.name in self.check_fields:
|
|
|
|
|
related_model_is_active_filter = {
|
|
|
|
|
f"{field.name}__is_active": True
|
|
|
|
|
}
|
|
|
|
|
queryset = queryset.filter(**related_model_is_active_filter)
|
2025-09-24 12:34:23 +05:30
|
|
|
|
|
|
|
|
except Exception as e:
|
|
|
|
|
logger.error(e)
|
|
|
|
|
|
2024-01-06 12:50:12 +05:30
|
|
|
return queryset
|
2024-06-12 16:44:05 +05:30
|
|
|
|
|
|
|
|
def filter(self, *args, **kwargs):
|
|
|
|
|
queryset = super().filter(*args, **kwargs)
|
|
|
|
|
setattr(_thread_locals, "queryset_filter", queryset)
|
|
|
|
|
return queryset
|
2024-12-03 14:10:21 +05:30
|
|
|
|
2025-02-28 15:08:15 +05:30
|
|
|
def entire(self):
|
2024-12-03 14:10:21 +05:30
|
|
|
"""
|
|
|
|
|
Fetch all datas from a model without applying any company filter.
|
|
|
|
|
"""
|
|
|
|
|
queryset = super().get_queryset()
|
|
|
|
|
return queryset # No filtering applied
|