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

108 lines
3.8 KiB
Python

"""
Dashbord of project
"""
import calendar
import datetime
from typing import Any
from django.db.models import Count
from django.db.models.query import QuerySet
from django.urls import resolve, reverse
from django.utils.translation import gettext_lazy as _
from django.utils.decorators import method_decorator
from django.db.models import Q
from base.methods import get_subordinates
from horilla_views.generic.cbv.views import HorillaListView, HorillaDetailedView
from horilla_views.cbv_methods import login_required
from project.filters import ProjectFilter
from project.models import Project
from project.cbv.cbv_decorators import is_projectmanager_or_member_or_perms
@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