279 lines
9.8 KiB
Python
279 lines
9.8 KiB
Python
"""
|
|
Meetings page
|
|
"""
|
|
|
|
import contextlib
|
|
from typing import Any
|
|
|
|
from django.contrib import messages
|
|
from django.db.models import Q
|
|
from django.http import HttpResponse
|
|
from django.shortcuts import render
|
|
from django.urls import reverse, reverse_lazy
|
|
from django.utils.decorators import method_decorator
|
|
from django.utils.translation import gettext_lazy as _
|
|
|
|
from horilla_views.cbv_methods import login_required
|
|
from horilla_views.generic.cbv.views import (
|
|
HorillaDetailedView,
|
|
HorillaFormView,
|
|
HorillaListView,
|
|
HorillaNavView,
|
|
TemplateView,
|
|
)
|
|
from notifications.signals import notify
|
|
from pms.filters import MeetingsFilter
|
|
from pms.forms import MeetingResponseForm, MeetingsForm
|
|
from pms.models import Meetings
|
|
|
|
|
|
@method_decorator(login_required, name="dispatch")
|
|
class MeetingsView(TemplateView):
|
|
"""
|
|
for meeting page
|
|
"""
|
|
|
|
template_name = "cbv/meetings/meetings.html"
|
|
|
|
|
|
@method_decorator(login_required, name="dispatch")
|
|
class MeetingsList(HorillaListView):
|
|
"""
|
|
List view of the page
|
|
"""
|
|
|
|
def __init__(self, **kwargs: Any) -> None:
|
|
super().__init__(**kwargs)
|
|
self.search_url = reverse("meetings-list")
|
|
self.view_id = "meetingManagerContainer"
|
|
|
|
def get_queryset(self):
|
|
queryset = super().get_queryset()
|
|
active = (
|
|
True
|
|
if self.request.GET.get("is_active", True)
|
|
in ["unknown", "True", "true", True]
|
|
else False
|
|
)
|
|
queryset = queryset.filter(is_active=active)
|
|
|
|
if not self.request.user.has_perm("pms.view_meetings"):
|
|
employee_id = self.request.user.employee_get
|
|
queryset = queryset.filter(
|
|
Q(employee_id=employee_id) | Q(manager=employee_id)
|
|
).distinct()
|
|
return queryset.order_by("-id")
|
|
return queryset.order_by("-id")
|
|
|
|
model = Meetings
|
|
filter_class = MeetingsFilter
|
|
|
|
header_attrs = {"mom_col": 'style="width: 20%;"', "action": 'style= "width: 320px"'}
|
|
|
|
columns = [
|
|
(_("Title"), "title_col"),
|
|
(_("Employees"), "employees_col"),
|
|
(_("Managers"), "managers_col"),
|
|
(_("Date"), "date_col"),
|
|
(_("MoM"), "mom_col"),
|
|
]
|
|
|
|
sortby_mapping = [("Date", "date_col")]
|
|
|
|
bulk_update_fields = ["manager"]
|
|
|
|
action_method = "action_col"
|
|
|
|
row_attrs = """
|
|
{diff_cell}
|
|
class="oh-permission-table--collapsed"
|
|
hx-get='{meeting_detail_view}?instance_ids={ordered_ids}'
|
|
hx-target="#genericModalBody"
|
|
data-target="#genericModal"
|
|
data-toggle="oh-modal-toggle"
|
|
"""
|
|
|
|
|
|
@method_decorator(login_required, name="dispatch")
|
|
class MeetingsNav(HorillaNavView):
|
|
"""
|
|
Nav bar
|
|
"""
|
|
|
|
def __init__(self, **kwargs: Any) -> None:
|
|
super().__init__(**kwargs)
|
|
self.search_url = reverse("meetings-list")
|
|
if self.request.user.has_perm("pms.add_meetings"):
|
|
self.create_attrs = f"""
|
|
hx-get='{reverse_lazy('create-meeting')}'
|
|
data-toggle="oh-modal-toggle"
|
|
data-target="#genericModal"
|
|
hx-target="#genericModalBody"
|
|
"""
|
|
|
|
nav_title = _("Meetings")
|
|
filter_instance = MeetingsFilter()
|
|
filter_body_template = "cbv/meetings/filter.html"
|
|
filter_form_context_name = "filter_form"
|
|
search_swap_target = "#listContainer"
|
|
|
|
|
|
@method_decorator(login_required, name="dispatch")
|
|
class MeetingsDetailedView(HorillaDetailedView):
|
|
"""
|
|
detail view of page
|
|
"""
|
|
|
|
cols = {
|
|
"mom_detail_col": 12,
|
|
"employ_detail_col": 12,
|
|
"manager_detail_col": 12,
|
|
"answerable_col": 12,
|
|
}
|
|
|
|
def __init__(self, **kwargs: Any) -> None:
|
|
super().__init__(**kwargs)
|
|
self.body = [
|
|
(_("Date"), "date"),
|
|
(_("Question Template"), "question_template"),
|
|
(_("Managers"), "manager_detail_col"),
|
|
(_("Employees"), "employ_detail_col"),
|
|
(_("Answerable employees"), "answerable_col"),
|
|
(_("Minutes of Meeting"), "mom_detail_col"),
|
|
]
|
|
|
|
action_method = "detail_action"
|
|
|
|
model = Meetings
|
|
title = _("Details")
|
|
header = {
|
|
"title": "title",
|
|
"subtitle": "Meeting",
|
|
"avatar": "get_avatar",
|
|
}
|
|
|
|
|
|
@method_decorator(login_required, name="dispatch")
|
|
class MeetingsFormView(HorillaFormView):
|
|
"""
|
|
Form View
|
|
"""
|
|
|
|
model = Meetings
|
|
form_class = MeetingsForm
|
|
template_name = "cbv/meetings/forms/meet_create.html"
|
|
new_display_title = _("Meetings")
|
|
|
|
def get_context_data(self, **kwargs):
|
|
context = super().get_context_data(**kwargs)
|
|
self.form_class(initial={"manager": self.request.user.employee_get})
|
|
if self.form.instance.pk:
|
|
self.form_class.verbose_name = _("Update Meeting")
|
|
self.form_class(instance=self.form.instance)
|
|
context["form"] = self.form
|
|
return context
|
|
|
|
def form_invalid(self, form: Any) -> HttpResponse:
|
|
# form = self.form_class(self.request.POST)
|
|
if self.form.instance.pk:
|
|
self.form_class.verbose_name = _("Update Meeting")
|
|
if not form.is_valid():
|
|
errors = form.errors.as_data()
|
|
return render(
|
|
self.request, self.template_name, {"form": form, "errors": errors}
|
|
)
|
|
return super().form_invalid(form)
|
|
|
|
def form_valid(self, form: MeetingsForm) -> HttpResponse:
|
|
if form.is_valid():
|
|
if form.instance.pk:
|
|
message = _("Meeting updated successfully")
|
|
else:
|
|
message = _("Meeting added successfully")
|
|
instance = form.save()
|
|
managers = [
|
|
manager.employee_user_id for manager in form.cleaned_data["manager"]
|
|
]
|
|
answer_employees = [
|
|
answer_emp.employee_user_id
|
|
for answer_emp in form.cleaned_data["answer_employees"]
|
|
]
|
|
employees = form.cleaned_data["employee_id"]
|
|
employees = [
|
|
employee.employee_user_id
|
|
for employee in employees.exclude(
|
|
id__in=form.cleaned_data["answer_employees"]
|
|
)
|
|
]
|
|
messages.success(self.request, _(message))
|
|
with contextlib.suppress(Exception):
|
|
notify.send(
|
|
self.request.user.employee_get,
|
|
recipient=managers,
|
|
verb=f"You have been added as a manager for the meeting {instance.title}",
|
|
verb_ar=f"لقد تمت إضافتك كمدير للاجتماع {instance.title}",
|
|
verb_de=f"Sie wurden als Manager für das Meeting {instance.title} hinzugefügt",
|
|
verb_es=f"Se le ha agregado como administrador de la reunión {instance.title}",
|
|
verb_fr=f"Vous avez été ajouté en tant que responsable de réunion {instance.title}",
|
|
icon="information",
|
|
redirect=reverse("view-meetings") + f"?search={instance.title}",
|
|
)
|
|
with contextlib.suppress(Exception):
|
|
notify.send(
|
|
self.request.user.employee_get,
|
|
recipient=employees,
|
|
verb=f"You have been added to the meeting {instance.title}",
|
|
verb_ar=f"لقد تمت إضافتك إلى اجتماع {instance.title}.",
|
|
verb_de=f"Sie wurden zur {instance.title} Besprechung hinzugefügt",
|
|
verb_es=f"Te han agregado a la reunión {instance.title}",
|
|
verb_fr=f"Vous avez été ajouté à la réunion {instance.title}",
|
|
icon="information",
|
|
redirect=reverse("view-meetings") + f"?search={instance.title}",
|
|
)
|
|
with contextlib.suppress(Exception):
|
|
notify.send(
|
|
self.request.user.employee_get,
|
|
recipient=answer_employees,
|
|
verb=f"You have been added as an answerable employee for the meeting {instance.title}",
|
|
verb_ar=f"لقد تمت إضافتك كموظف مسؤول عن الاجتماع {instance.title}",
|
|
verb_de=f"Du wurden als Mitarbeiter zum Ausfüllen für das {instance.title}-Meeting hinzugefügt",
|
|
verb_es=f"Se le ha agregado como empleado responsable de la reunión {instance.title}",
|
|
verb_fr=f"Vous avez été ajouté en tant que employé responsable pour la réunion {instance.title}",
|
|
icon="information",
|
|
redirect=reverse("view-meetings") + f"?search={instance.title}",
|
|
)
|
|
return self.HttpResponse()
|
|
return super().form_valid(form)
|
|
|
|
|
|
@method_decorator(login_required, name="dispatch")
|
|
class MeetingResponseFormView(HorillaFormView):
|
|
"""
|
|
Form View
|
|
"""
|
|
|
|
model = Meetings
|
|
form_class = MeetingResponseForm
|
|
# template_name = "cbv/recruitment/forms/create_form.html"
|
|
new_display_title = "Add Response"
|
|
|
|
def get_context_data(self, **kwargs):
|
|
context = super().get_context_data(**kwargs)
|
|
meet_id = self.kwargs.get("id")
|
|
meeting = Meetings.objects.filter(id=meet_id).first()
|
|
form = self.form_class(instance=meeting)
|
|
context["form"] = form
|
|
return context
|
|
|
|
def form_valid(self, form: MeetingResponseForm) -> HttpResponse:
|
|
meet_id = self.kwargs.get("id")
|
|
meeting = Meetings.objects.filter(id=meet_id).first()
|
|
if form.is_valid():
|
|
message = _("Response added successfully")
|
|
response = self.request.POST.get("response")
|
|
meeting.response = response
|
|
meeting.save()
|
|
messages.success(self.request, message)
|
|
return self.HttpResponse()
|
|
return super().form_valid(form)
|