109 lines
3.7 KiB
Python
109 lines
3.7 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
|