[UPDT] HORILLA_VIEWS: Converted string entries in group_by_fields to (field, verbose_name) tuples

This commit is contained in:
Horilla
2025-06-05 16:59:52 +05:30
parent 4437410819
commit a362c5580e
2 changed files with 68 additions and 16 deletions

View File

@@ -12,6 +12,7 @@ from bs4 import BeautifulSoup
from django import forms from django import forms
from django.contrib import messages from django.contrib import messages
from django.core.cache import cache as CACHE from django.core.cache import cache as CACHE
from django.core.exceptions import FieldDoesNotExist
from django.core.paginator import Page from django.core.paginator import Page
from django.http import HttpRequest, HttpResponse, QueryDict from django.http import HttpRequest, HttpResponse, QueryDict
from django.shortcuts import render from django.shortcuts import render
@@ -1263,10 +1264,58 @@ class HorillaNavView(TemplateView):
def __init__(self, **kwargs: Any) -> None: def __init__(self, **kwargs: Any) -> None:
super().__init__(**kwargs) super().__init__(**kwargs)
self._initialize_model_and_group_fields()
request = getattr(_thread_locals, "request", None) request = getattr(_thread_locals, "request", None)
self.request = request self.request = request
# update_initial_cache(request, CACHE, HorillaNavView) # update_initial_cache(request, CACHE, HorillaNavView)
def _initialize_model_and_group_fields(self) -> None:
"""
Initialize model_class and reinitialize filter_instance if model exists
for updating group_by_fields with verbose names.
"""
if not self.filter_instance:
return
model_class_ref = self.filter_instance._meta.model
if not model_class_ref:
return
model_instance = model_class_ref()
self.nav_title = self.nav_title or model_instance._meta.verbose_name_plural
self.filter_instance = self.filter_instance.__class__()
if not self.group_by_fields:
return
get_field = model_instance._meta.get_field
updated_fields = []
append = updated_fields.append
for field in self.group_by_fields:
if isinstance(field, str):
try:
verbose_name = get_field(field).verbose_name
append((field, verbose_name))
except FieldDoesNotExist:
# Check for related fields (field paths with '__')
if "__" in field and hasattr(
model_class_ref, "get_verbose_name_related_field"
):
try:
verbose_name = (
model_class_ref.get_verbose_name_related_field(field)
)
append((field, verbose_name))
continue
except Exception as e:
pass
append(field)
else:
append(field)
self.group_by_fields = updated_fields
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs) context = super().get_context_data(**kwargs)
context["nav_title"] = self.nav_title context["nav_title"] = self.nav_title

View File

@@ -22,7 +22,7 @@ from horilla.horilla_middlewares import _thread_locals
register = template.Library() register = template.Library()
numeric_test = re.compile(r'^\d+$') numeric_test = re.compile(r"^\d+$")
date_format_mapping = { date_format_mapping = {
"DD-MM-YYYY": "%d-%m-%Y", "DD-MM-YYYY": "%d-%m-%Y",
@@ -87,28 +87,31 @@ def getattribute(value, attr: str):
@register.filter(name="format") @register.filter(name="format")
def format(string: str, instance: object): def format(string: str, instance: object):
""" """
format Format a string by resolving instance attributes, including method calls like get_status_display.
""" """
attr_placeholder_regex = r"{([^}]*)}" attr_placeholder_regex = r"{([^}]*)}"
attr_placeholders = re.findall(attr_placeholder_regex, string) attr_placeholders = re.findall(attr_placeholder_regex, string)
if not attr_placeholders: if not attr_placeholders:
return string return string
flag = instance
format_context = {}
for attr_placeholder in attr_placeholders:
attr_name: str = attr_placeholder
attrs = attr_name.split("__")
for attr in attrs:
value = getattr(instance, attr, "")
if isinstance(value, types.MethodType):
value = value()
instance = value
format_context[attr_name] = value
instance = flag
formatted_string = string.format(**format_context)
return formatted_string original_instance = instance
format_context = {}
for attr_placeholder in attr_placeholders:
instance = original_instance # reset each time
attrs = attr_placeholder.split("__")
try:
for attr in attrs:
instance = getattr(instance, attr, "")
# If final resolved attr is a method, call it
if callable(instance):
instance = instance()
except Exception:
instance = ""
format_context[attr_placeholder] = instance
return string.format(**format_context)
@register.filter("accessibility") @register.filter("accessibility")