Files
ihrm/project/cbv/dashboard.py
2025-02-14 10:08:50 +05:30

109 lines
3.8 KiB
Python

"""
Dashbord of project
"""
import calendar
import datetime
from typing import Any
from django.db.models import Count, Q
from django.db.models.query import QuerySet
from django.urls import resolve, reverse
from django.utils.decorators import method_decorator
from django.utils.translation import gettext_lazy as _
from base.methods import get_subordinates
from horilla_views.cbv_methods import login_required
from horilla_views.generic.cbv.views import HorillaDetailedView, HorillaListView
from project.cbv.cbv_decorators import is_projectmanager_or_member_or_perms
from project.filters import ProjectFilter
from project.models import Project
@method_decorator(login_required, name="dispatch")
@method_decorator(
is_projectmanager_or_member_or_perms("project.view_project"), name="dispatch"
)
class ProjectsDueInMonth(HorillaListView):
model = Project
filter_class = ProjectFilter
bulk_select_option = False
columns = [(_("Project"), "title", "get_avatar")]
show_filter_tags = False
def get_queryset(self):
queryset = super().get_queryset()
if not self.request.user.has_perm("project.view_project"):
employee = self.request.user.employee_get
task_filter = queryset.filter(
Q(task__task_members=employee) | Q(task__task_manager=employee)
)
project_filter = queryset.filter(Q(manager=employee) | Q(members=employee))
queryset = task_filter | project_filter
today = datetime.date.today()
first_day = today.replace(day=1)
last_day = calendar.monthrange(today.year, today.month)[1]
last_day_of_month = today.replace(day=last_day)
queryset = queryset.filter(
Q(end_date__gte=first_day) & Q(end_date__lte=last_day_of_month)
).exclude(status="expired")
return queryset
def __init__(self, **kwargs: Any) -> None:
super().__init__(**kwargs)
self.search_url = reverse("projects-due-in-this-month")
row_attrs = """
hx-get='{get_detail_url}?instance_ids={ordered_ids}'
hx-target="#genericModalBody"
data-target="#genericModal"
data-toggle="oh-modal-toggle"
"""
class ProjectDetailView(HorillaDetailedView):
"""
detail view of the projects
"""
model = Project
title = _("Details")
header = {"title": "title", "subtitle": "", "avatar": "get_avatar"}
body = [
(_("Manager"), "manager"),
(_("Members"), "get_members"),
(_("Status"), "status_column"),
(_("No of Tasks"), "task_count"),
(_("Start date"), "start_date"),
(_("End date"), "end_date"),
(_("Document"), "get_document_html"),
(_("Description"), "description"),
]
def __init__(self, **kwargs: Any) -> None:
super().__init__(**kwargs)
instnce_id = resolve(self.request.path_info).kwargs.get("pk")
employee = self.request.user.employee_get
project = Project.objects.get(id=instnce_id)
if (
employee in project.managers.all()
or employee in project.members.all()
or self.request.user.has_perm("project.view_project")
):
self.actions = [
{
"action": _("View Project"),
"icon": "create-outline",
"attrs": """
class = "oh-btn oh-btn--info w-100"
{redirect}
""",
}
]
def get_queryset(self) -> QuerySet[Any]:
queryset = super().get_queryset()
queryset = queryset.annotate(task_count=Count("task"))
return queryset