from urllib.parse import urlparse from django.shortcuts import redirect from django.urls import Resolver404, path, resolve, reverse from employee.models import Employee from horilla.urls import urlpatterns from recruitment.models import Candidate def _split_path(self, path=None): """Returns a list of the path components between slashes""" if not path: path = self.path if path.endswith("/"): path = path[:-1] if path.startswith("/"): path = path[1:] if path == "": return list() result = path.split("/") return result sidebar_urls = [ "dashboard", "pipeline", "recruitment-survey-question-template-view", "candidate-view", "recruitment-view", "stage-view", "view-onboarding-dashboard", "onboarding-view", "candidates-view", "employee-profile", "employee-view", "shift-request-view", "work-type-request-view", "rotating-shift-assign", "rotating-work-type-assign", "view-payroll-dashboard", "view-contract", "view-allowance", "view-deduction", "view-payslip", "filing-status-view", "attendance-view", "work-records", "request-attendance-view", "attendance-overtime-view", "attendance-activity-view", "late-come-early-out-view", "view-my-attendance", "leave-dashboard", "leave-employee-dashboard", "user-leave", "user-request-view", "leave-allocation-request-view", "type-view", "assign-view", "request-view", "holiday-view", "company-leave-view", "dashboard-view", "objective-list-view", "feedback-view", "period-view", "question-template-view", "asset-category-view", "asset-request-allocation-view", "settings", "attendance-settings", "employee-permission-assign", "user-group-assign", "currency", "department-view", "job-position-view", "job-role-view", "work-type-view", "rotating-work-type-view", "employee-type-view", "employee-shift-view", "employee-shift-schedule-view", "rotating-shift-view", "attendance-settings-view", "user-group-view", "company-view", "document-request-view", "faq-category-view", "ticket-view", "tag-view", "ticket-type-view", "mail-server-conf", "multiple-approval-condition", "skill-zone-view", "view-mail-templates", "view-loan", "view-reimbursement", "department-manager-view", "date-settings", "offboarding-pipeline", "pagination-settings-view", "organisation-chart", "disciplinary-actions", "view-policies", "resignation-requests-view", "action-type", "general-settings", "view-biometric-devices", "employee-tag-view", "grace-settings-view", "helpdesk-tag-view", "restrict-view", "asset-history", "view-key-result", "view-meetings", "interview-view", "view-compensatory-leave", "compensatory-leave-settings-view", ] remove_urls = [ "feedback-detailed-view", "question-template-detailed-view", "employee-view-new", ] user_breadcrumbs = {} def breadcrumbs(request): base_url = request.build_absolute_uri("/") user_id = str(request.user) if user_id not in user_breadcrumbs: user_breadcrumbs[user_id] = [ {"url": base_url, "name": "Horilla", "found": True} ] try: user_breadcrumb = user_breadcrumbs[user_id] qs = request.META.get("QUERY_STRING", "") pairs = qs.split("&") filtered_pairs = [pair for pair in pairs if "=" in pair and pair.split("=")[1]] filtered_query_string = "&".join(filtered_pairs) emp_query_string = None for item in user_breadcrumb: if item["name"] in ["employee-view", "candidate-view"]: items = item["url"].split("?", 1) if len(items) > 1: emp_query_string = items[1] break parts = _split_path(request) path = base_url candidates = Candidate.objects.filter(is_active=True) employees = Employee.objects.all() if len(parts) > 1: if "recruitment" in parts: if "search-candidate" in parts: pass elif "candidate-view" in parts: pass elif "get-mail-log-rec" in parts: pass else: # Store the candidates in the session request.session["filtered_candidates"] = [ candidate.id for candidate in candidates ] if "employee-filter-view" in parts: pass elif "employee-view" in parts: pass elif "view-penalties" in parts: pass elif parts[0] == "employee" and parts[-1].isdigit(): pass else: # Store the employees in the session request.session["filtered_employees"] = [ employee.id for employee in employees ] if len(parts) == 0: user_breadcrumbs[user_id].clear() user_breadcrumb.append({"url": base_url, "name": "Horilla", "found": True}) if len(parts) > 1: last_path = parts[-1] if ( last_path in sidebar_urls or parts[-2] == "employee-view" or parts[-2] == "candidate-view" ): breadcrumbs = user_breadcrumbs[user_id] first_path = breadcrumbs[0] user_breadcrumbs[user_id].clear() user_breadcrumbs[user_id].append(first_path) for i, item in enumerate(parts): path = path + item + "/" parsed_url = urlparse(path) check_path = parsed_url.path try: resolver_match = resolve(check_path) found = True except Resolver404 as e: found = False new_dict = {"url": path, "name": item, "found": found} if item.isdigit(): # Handle the case when item is a digit (e.g., an ID) current_url = resolve(request.path_info) url_kwargs = current_url.kwargs model_value = url_kwargs.get("model") if model_value: try: object = model_value.objects.get(id=item) new_dict["name"] = str(object) except: pass key = "HTTP_HX_REQUEST" names = [d["name"] for d in user_breadcrumb] if ( new_dict not in user_breadcrumb and new_dict["name"] not in remove_urls + names and key not in request.META.keys() and not new_dict["name"].isdigit() ): if new_dict["name"] in ["employee-view", "candidate-view"]: new_dict["url"] = f'{new_dict["url"]}?{emp_query_string}' user_breadcrumb.append(new_dict) try: prev_url = user_breadcrumb[-1] prev_url["url"] = prev_url["url"].split("?")[0] if filtered_query_string: prev_url["url"] = f'{prev_url["url"]}?{filtered_query_string}' else: prev_url["url"] = f'{prev_url["url"]}' except: pass user_breadcrumbs[user_id] = user_breadcrumb except Exception as e: user_breadcrumb[user_id].clear() user_breadcrumbs[user_id] = [ {"url": base_url, "name": "Horilla", "found": True} ] return {"breadcrumbs": user_breadcrumbs[user_id]} urlpatterns.append( path("recruitment/", lambda request: redirect("recruitment-dashboard")) ) urlpatterns.append( path("onboarding/", lambda request: redirect("view-onboarding-dashboard")) ) urlpatterns.append(path("employee/", lambda request: redirect("employee-view"))) urlpatterns.append( path("attendance/", lambda request: redirect("attendance-dashboard")) ) urlpatterns.append( path( "leave/", lambda request: redirect( reverse("leave-employee-dashboard") + "?dashboard=true" ), ) ) urlpatterns.append(path("payroll/", lambda request: redirect("view-payroll-dashboard"))) urlpatterns.append(path("pms/", lambda request: redirect("dashboard-view")))