2024-08-05 14:22:44 +05:30
|
|
|
import contextlib
|
2024-09-21 15:16:52 +05:30
|
|
|
import importlib
|
2024-08-19 17:20:37 +05:30
|
|
|
|
2024-08-28 16:56:49 +05:30
|
|
|
from django.contrib.auth.models import User
|
2024-08-05 14:22:44 +05:30
|
|
|
from django.contrib.contenttypes.models import ContentType
|
|
|
|
|
|
2024-09-21 15:16:52 +05:30
|
|
|
from horilla.horilla_settings import APP_URLS, DYNAMIC_URL_PATTERNS
|
|
|
|
|
|
2024-08-05 14:22:44 +05:30
|
|
|
|
|
|
|
|
def get_horilla_model_class(app_label, model):
|
|
|
|
|
"""
|
|
|
|
|
Retrieves the model class for the given app label and model name using Django's ContentType framework.
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
app_label (str): The label of the application where the model is defined.
|
|
|
|
|
model (str): The name of the model to retrieve.
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
Model: The Django model class corresponding to the specified app label and model name.
|
|
|
|
|
|
|
|
|
|
"""
|
|
|
|
|
content_type = ContentType.objects.get(app_label=app_label, model=model)
|
|
|
|
|
model_class = content_type.model_class()
|
|
|
|
|
return model_class
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def dynamic_attr(obj, attribute_path):
|
|
|
|
|
"""
|
|
|
|
|
Retrieves the value of a nested attribute from a related object dynamically.
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
obj: The base object from which to start accessing attributes.
|
|
|
|
|
attribute_path (str): The path of the nested attribute to retrieve, using
|
|
|
|
|
double underscores ('__') to indicate relationship traversal.
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
The value of the nested attribute if it exists, or None if it doesn't exist.
|
|
|
|
|
"""
|
|
|
|
|
attributes = attribute_path.split("__")
|
|
|
|
|
|
|
|
|
|
for attr in attributes:
|
|
|
|
|
with contextlib.suppress(Exception):
|
|
|
|
|
Contract = get_horilla_model_class(app_label="payroll", model="contract")
|
|
|
|
|
if isinstance(obj.first(), Contract):
|
|
|
|
|
obj = obj.filter(is_active=True).first()
|
|
|
|
|
|
|
|
|
|
obj = getattr(obj, attr, None)
|
|
|
|
|
if obj is None:
|
|
|
|
|
break
|
|
|
|
|
return obj
|
2024-08-28 16:56:49 +05:30
|
|
|
|
|
|
|
|
|
|
|
|
|
def horilla_users_with_perms(permissions):
|
|
|
|
|
"""
|
|
|
|
|
Filters users who have any of the specified permissions or are superusers.
|
|
|
|
|
|
|
|
|
|
:param permissions: A list of permission strings in the format 'app_label.codename'
|
|
|
|
|
or a single permission string.
|
|
|
|
|
:return: A queryset of users who have any of the specified permissions or are superusers.
|
|
|
|
|
"""
|
|
|
|
|
# Ensure permissions is a list even if a single permission string is provided
|
|
|
|
|
if isinstance(permissions, str):
|
|
|
|
|
permissions = [permissions]
|
|
|
|
|
|
|
|
|
|
# Start with a queryset that includes all superusers
|
|
|
|
|
users_with_permissions = User.objects.filter(is_superuser=True)
|
|
|
|
|
|
|
|
|
|
# Filter users based on the permissions list
|
|
|
|
|
for perm in permissions:
|
|
|
|
|
app_label, codename = perm.split(".")
|
|
|
|
|
users_with_permissions |= User.objects.filter(
|
|
|
|
|
user_permissions__codename=codename,
|
|
|
|
|
user_permissions__content_type__app_label=app_label,
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
return users_with_permissions.distinct()
|
2024-09-13 18:02:59 +05:30
|
|
|
|
|
|
|
|
|
|
|
|
|
def get_urlencode(request):
|
|
|
|
|
get_data = request.GET.copy()
|
|
|
|
|
get_data.pop("instances_ids", None)
|
|
|
|
|
previous_data = get_data.urlencode()
|
|
|
|
|
return previous_data
|
2024-09-21 15:16:52 +05:30
|
|
|
|
|
|
|
|
|
|
|
|
|
def remove_dynamic_url(path_info):
|
|
|
|
|
"""Function to remove a dynamically added URL from any app's urlpatterns."""
|
|
|
|
|
|
|
|
|
|
# Iterate over all app URL patterns
|
|
|
|
|
for app_urls in APP_URLS:
|
|
|
|
|
try:
|
|
|
|
|
# Dynamically import the app's urls.py module
|
|
|
|
|
urls_module = importlib.import_module(app_urls)
|
|
|
|
|
# Access the urlpatterns in the module
|
|
|
|
|
urlpatterns = getattr(urls_module, "urlpatterns", None)
|
|
|
|
|
|
|
|
|
|
if urlpatterns:
|
|
|
|
|
# Check if the pattern exists in this app's urlpatterns
|
|
|
|
|
for path in urlpatterns:
|
|
|
|
|
if path.name == path_info:
|
|
|
|
|
urlpatterns.remove(path)
|
|
|
|
|
break
|
|
|
|
|
|
|
|
|
|
except ModuleNotFoundError:
|
|
|
|
|
print(f"Module {app_urls} not found. Skipping...")
|
|
|
|
|
|
|
|
|
|
# Also remove it from the tracked dynamic paths
|
|
|
|
|
if path_info in DYNAMIC_URL_PATTERNS:
|
|
|
|
|
DYNAMIC_URL_PATTERNS.remove(path_info)
|