310 lines
12 KiB
Python
310 lines
12 KiB
Python
"""
|
|
This page handles the cbv methods for document request page
|
|
"""
|
|
|
|
from typing import Any
|
|
|
|
from django import forms
|
|
from django.contrib import messages
|
|
from django.http import HttpResponse
|
|
from django.shortcuts import get_object_or_404
|
|
from django.urls import reverse, reverse_lazy
|
|
from django.utils.decorators import method_decorator
|
|
from django.utils.translation import gettext_lazy as _
|
|
|
|
from base.methods import choosesubordinates, is_reportingmanager
|
|
from employee.filters import DocumentPipelineFilter, DocumentRequestFilter
|
|
from employee.models import Employee
|
|
from horilla.decorators import manager_can_enter
|
|
from horilla_documents.forms import DocumentForm
|
|
from horilla_documents.forms import DocumentRejectCbvForm as RejectForm
|
|
from horilla_documents.forms import DocumentRequestForm, DocumentUpdateForm
|
|
from horilla_documents.models import Document, DocumentRequest
|
|
from horilla_views.cbv_methods import login_required
|
|
from horilla_views.generic.cbv.pipeline import Pipeline
|
|
from horilla_views.generic.cbv.views import (
|
|
HorillaFormView,
|
|
HorillaListView,
|
|
HorillaNavView,
|
|
)
|
|
from notifications.signals import notify
|
|
|
|
|
|
@method_decorator(login_required, name="dispatch")
|
|
@method_decorator(
|
|
manager_can_enter("horilla_documents.add_documentrequests"), name="dispatch"
|
|
)
|
|
class DocumentRequestCreateForm(HorillaFormView):
|
|
"""
|
|
form view for create and update document request
|
|
"""
|
|
|
|
form_class = DocumentRequestForm
|
|
model = DocumentRequest
|
|
new_display_title = _("Create Document Request")
|
|
|
|
def get_context_data(self, **kwargs):
|
|
context = super().get_context_data(**kwargs)
|
|
self.form = choosesubordinates(
|
|
self.request, self.form, "horilla_documents.add_documentrequest"
|
|
)
|
|
if self.form.instance.pk:
|
|
self.form_class.verbose_name = _("Update Document Request")
|
|
|
|
return context
|
|
|
|
def form_valid(self, form: DocumentRequestForm) -> HttpResponse:
|
|
if form.is_valid():
|
|
if form.instance.pk:
|
|
pk = self.form.instance.pk
|
|
documents = Document.objects.filter(document_request_id=pk)
|
|
doc_obj = form.save()
|
|
doc_obj.employee_id.set(
|
|
Employee.objects.filter(id__in=form.data.getlist("employee_id"))
|
|
)
|
|
documents.exclude(employee_id__in=doc_obj.employee_id.all()).delete()
|
|
messages.success(
|
|
self.request, _("Document Request Updated Successfully")
|
|
)
|
|
else:
|
|
messages.success(
|
|
self.request, _("Document request created successfully")
|
|
)
|
|
emp = form.cleaned_data["employee_id"].all()
|
|
users = [user.employee_user_id for user in emp]
|
|
notify.send(
|
|
self.request.user.employee_get,
|
|
recipient=users,
|
|
verb=f"{self.request.user.employee_get} requested a document.",
|
|
verb_ar=f"طلب {self.request.user.employee_get} مستنداً.",
|
|
verb_de=f"{self.request.user.employee_get} hat ein Dokument angefordert.",
|
|
verb_es=f"{self.request.user.employee_get} solicitó un documento.",
|
|
verb_fr=f"{self.request.user.employee_get} a demandé un document.",
|
|
redirect=reverse("employee-profile"),
|
|
icon="chatbox-ellipses",
|
|
)
|
|
form.save()
|
|
return self.HttpResponse("<script>window.location.reload();</script>")
|
|
return super().form_valid(form)
|
|
|
|
|
|
class DocumentCreateForm(HorillaFormView):
|
|
"""
|
|
form view for upload document
|
|
"""
|
|
|
|
form_class = DocumentForm
|
|
model = Document
|
|
new_display_title = _("Document")
|
|
|
|
def get_initial(self) -> dict:
|
|
initial = super().get_initial()
|
|
employee_id = self.kwargs.get("emp_id")
|
|
initial["employee_id"] = employee_id
|
|
initial["expiry_date"] = None
|
|
return initial
|
|
|
|
def form_valid(self, form: DocumentForm) -> HttpResponse:
|
|
if form.is_valid():
|
|
messages.success(self.request, _("Document Uploaded Successfully"))
|
|
form.save()
|
|
return HttpResponse("<script>window.location.reload();</script>")
|
|
return super().form_valid(form)
|
|
|
|
|
|
@method_decorator(login_required, name="dispatch")
|
|
@method_decorator(manager_can_enter("horilla_documents.add_document"), name="dispatch")
|
|
class DocumentRejectCbvForm(HorillaFormView):
|
|
"""
|
|
form view for rejecting document on document request and employee individual view
|
|
"""
|
|
|
|
model = Document
|
|
form_class = RejectForm
|
|
hx_confirm = _("Do you want to reject this request")
|
|
|
|
def get_context_data(self, **kwargs):
|
|
context = super().get_context_data(**kwargs)
|
|
if self.form.instance.pk:
|
|
self.form_class.verbose_name = _("Reject")
|
|
return context
|
|
|
|
def form_valid(self, form: RejectForm) -> HttpResponse:
|
|
if form.is_valid():
|
|
if self.form.instance.document:
|
|
self.form.instance.status = "rejected"
|
|
form.save()
|
|
messages.success(self.request, _("Document request rejected"))
|
|
else:
|
|
messages.error(self.request, _("No document uploaded"))
|
|
return HttpResponse("<script>window.location.reload();</script>")
|
|
return super().form_valid(form)
|
|
|
|
|
|
class DocumentUploadForm(HorillaFormView):
|
|
"""
|
|
form view for upload documents on document request and employee individual view
|
|
"""
|
|
|
|
model = Document
|
|
form_class = DocumentUpdateForm
|
|
template_name = "cbv/documents/inherit_form.html"
|
|
|
|
def get_context_data(self, **kwargs):
|
|
context = super().get_context_data(**kwargs)
|
|
self.form.fields["title"].widget = forms.HiddenInput()
|
|
self.form.fields["employee_id"].widget = forms.HiddenInput()
|
|
self.form.fields["document_request_id"].widget = forms.HiddenInput()
|
|
self.form.fields["status"].widget = forms.HiddenInput()
|
|
self.form.fields["reject_reason"].widget = forms.HiddenInput()
|
|
self.form.fields["is_digital_asset"].widget = forms.HiddenInput()
|
|
|
|
if self.form.instance.pk:
|
|
self.form_class.verbose_name = _("Upload File")
|
|
return context
|
|
|
|
def form_valid(self, form: DocumentUpdateForm) -> HttpResponse:
|
|
if form.is_valid():
|
|
if form.instance.pk:
|
|
messages.success(self.request, _("Document uploaded successfully"))
|
|
try:
|
|
notify.send(
|
|
self.request.user.employee_get,
|
|
recipient=self.request.user.employee_get.get_reporting_manager().employee_user_id,
|
|
verb=f"{self.request.user.employee_get} uploaded a document",
|
|
verb_ar=f"قام {self.request.user.employee_get} بتحميل مستند",
|
|
verb_de=f"{self.request.user.employee_get} hat ein Dokument hochgeladen",
|
|
verb_es=f"{self.request.user.employee_get} subió un documento",
|
|
verb_fr=f"{self.request.user.employee_get} a téléchargé un document",
|
|
redirect=reverse(
|
|
"employee-view-individual",
|
|
kwargs={"obj_id": self.request.user.employee_get.id},
|
|
),
|
|
icon="chatbox-ellipses",
|
|
)
|
|
except:
|
|
pass
|
|
form.instance.status = "requested"
|
|
form.save()
|
|
return HttpResponse("<script>window.location.reload();</script>")
|
|
return super().form_valid(form)
|
|
|
|
|
|
class DocumentRequestNav(HorillaNavView):
|
|
"""
|
|
For nav bar
|
|
"""
|
|
|
|
def __init__(self, **kwargs: Any) -> None:
|
|
super().__init__(**kwargs)
|
|
self.search_url = reverse("document-request-filter-view")
|
|
self.create_attrs = f"""
|
|
data-toggle="oh-modal-toggle"
|
|
data-target="#genericModal"
|
|
hx-target="#genericModalBody"
|
|
hx-get="{reverse_lazy('document-request-create')}"
|
|
"""
|
|
|
|
if self.request.user.has_perm(
|
|
"employee.change_employee"
|
|
) or is_reportingmanager(self.request):
|
|
if self.request.user.has_perm(
|
|
"horilla_documents.change_documentrequest"
|
|
) or is_reportingmanager(self.request):
|
|
self.actions = [
|
|
{
|
|
"action": _("Bulk Approve Requests"),
|
|
"attrs": f"""
|
|
id="bulkApproveDocument"
|
|
hx-post="{reverse('document-bulk-approve')}"
|
|
hx-confirm='Do you really want to approve all the selected requests?'
|
|
style="cursor: pointer;"
|
|
hx-on:click="validateDocsIds(event, 'approved');"
|
|
data-action="approved"
|
|
""",
|
|
},
|
|
{
|
|
"action": _("Bulk Reject Requests"),
|
|
"attrs": f"""
|
|
hx-get={reverse('document-bulk-reject')}
|
|
data-target="#objectCreateModal"
|
|
data-toggle="oh-modal-toggle"
|
|
hx-on:click="validateDocsIds(event, 'rejected');"
|
|
data-action="rejected"
|
|
hx-target="#objectCreateModalTarget"
|
|
id="bulkRejectDocument"
|
|
style="cursor: pointer;"
|
|
""",
|
|
},
|
|
]
|
|
else:
|
|
self.actions = None
|
|
|
|
nav_title = _("Document Requests")
|
|
filter_body_template = "cbv/documents/document_filter.html"
|
|
filter_instance = DocumentRequestFilter()
|
|
filter_form_context_name = "form"
|
|
search_swap_target = "#view-container"
|
|
|
|
|
|
class DocumentRequestPipelineView(Pipeline):
|
|
"""
|
|
Pipeline view for document request
|
|
"""
|
|
|
|
model = Document
|
|
filter_class = DocumentRequestFilter
|
|
grouper = "document_request_id"
|
|
template_name = "cbv/documents/pipeline.html"
|
|
|
|
allowed_fields = [
|
|
{
|
|
"field": "document_request_id",
|
|
"model": DocumentRequest,
|
|
"filter": DocumentPipelineFilter,
|
|
"url": reverse_lazy("document-request-list"),
|
|
"parameters": [
|
|
"document_request_id={pk}",
|
|
],
|
|
"actions": [
|
|
{
|
|
"action": _("Edit"),
|
|
"attrs": """
|
|
class="oh-dropdown__link oh-dropdown__link"
|
|
data-toggle="oh-modal-toggle"
|
|
data-target="#objectCreateModal"
|
|
hx-get="{get_edit_url}"
|
|
hx-target="#objectCreateModalTarget"
|
|
""",
|
|
},
|
|
{
|
|
"action": _("Delete"),
|
|
"attrs": """
|
|
class="oh-dropdown__link oh-dropdown__link"
|
|
hx-confirm="Are you sure you want to delete this document request?"
|
|
hx-post="{get_delete_url}"
|
|
hx-target="body"
|
|
""",
|
|
},
|
|
],
|
|
}
|
|
]
|
|
|
|
|
|
class DocumentListView(HorillaListView):
|
|
"""
|
|
List view for document request
|
|
"""
|
|
|
|
model = Document
|
|
filter_class = DocumentRequestFilter
|
|
template_name = "cbv/documents/document_list.html"
|
|
filter_keys_to_remove = ["document_request_id"]
|
|
|
|
def get_queryset(self, queryset=None, filtered=False, *args, **kwargs):
|
|
queryset = super().get_queryset(queryset, filtered, *args, **kwargs)
|
|
queryset = queryset.filter(
|
|
document_request_id__pk=self.request.GET.get("document_request_id")
|
|
)
|
|
return queryset
|