150 lines
5.7 KiB
Python
150 lines
5.7 KiB
Python
"""
|
|
Announcement page
|
|
"""
|
|
|
|
from django.contrib import messages
|
|
from django.contrib.auth.models import User
|
|
from django.http import HttpResponse
|
|
from django.urls import resolve, reverse
|
|
from django.utils.decorators import method_decorator
|
|
from django.utils.translation import gettext_lazy as _
|
|
|
|
from base.forms import AnnouncementForm
|
|
from base.methods import closest_numbers
|
|
from base.models import Announcement, AnnouncementView
|
|
from employee.models import Employee
|
|
from horilla_views.cbv_methods import login_required, permission_required
|
|
from horilla_views.generic.cbv.views import (
|
|
HorillaDetailedView,
|
|
HorillaFormView,
|
|
HorillaListView,
|
|
)
|
|
from notifications.signals import notify
|
|
|
|
|
|
@method_decorator(login_required, name="dispatch")
|
|
@method_decorator(permission_required(perm="base.add_announcement"), name="dispatch")
|
|
class AnnouncementFormView(HorillaFormView):
|
|
"""
|
|
form view for create button
|
|
"""
|
|
|
|
form_class = AnnouncementForm
|
|
model = Announcement
|
|
new_display_title = _("Create Announcements.")
|
|
|
|
def get_context_data(self, **kwargs):
|
|
context = super().get_context_data(**kwargs)
|
|
if self.form.instance.pk:
|
|
self.form_class.verbose_name = _("Edit Announcement.")
|
|
|
|
return context
|
|
|
|
def form_valid(self, form: AnnouncementForm) -> HttpResponse:
|
|
if form.is_valid():
|
|
if form.instance.pk:
|
|
message = _("Announcement updated successfully.")
|
|
else:
|
|
message = _("Announcement created successfully.")
|
|
anou, attachment_ids = form.save(commit=False)
|
|
|
|
employees = form.cleaned_data["employees"]
|
|
departments = form.cleaned_data["department"]
|
|
job_positions = form.cleaned_data["job_position"]
|
|
company = form.cleaned_data.get(
|
|
"company_id", [self.request.user.employee_get.get_company()]
|
|
)
|
|
|
|
if not (employees or departments or job_positions):
|
|
employees = Employee.objects.filter(
|
|
employee_work_info__company_id__in=company, is_active=True
|
|
)
|
|
message = _(
|
|
f"Announcement created successfully to all employees in {', '.join(company.values_list('company', flat=True))}."
|
|
)
|
|
|
|
anou.save()
|
|
anou.attachments.set(attachment_ids)
|
|
anou.department.set(departments)
|
|
anou.job_position.set(job_positions)
|
|
emp_dep = User.objects.filter(
|
|
employee_get__employee_work_info__department_id__in=departments
|
|
)
|
|
emp_jobs = User.objects.filter(
|
|
employee_get__employee_work_info__job_position_id__in=job_positions
|
|
)
|
|
employees = employees | Employee.objects.filter(
|
|
employee_work_info__department_id__in=departments
|
|
)
|
|
employees = employees | Employee.objects.filter(
|
|
employee_work_info__job_position_id__in=job_positions
|
|
)
|
|
anou.employees.add(*employees)
|
|
notify.send(
|
|
self.request.user.employee_get,
|
|
recipient=emp_dep,
|
|
verb="Your department was mentioned in a post.",
|
|
verb_ar="تم ذكر قسمك في منشور.",
|
|
verb_de="Ihr Abteilung wurde in einem Beitrag erwähnt.",
|
|
verb_es="Tu departamento fue mencionado en una publicación.",
|
|
verb_fr="Votre département a été mentionné dans un post.",
|
|
redirect="/",
|
|
icon="chatbox-ellipses",
|
|
)
|
|
notify.send(
|
|
self.request.user.employee_get,
|
|
recipient=emp_jobs,
|
|
verb="Your job position was mentioned in a post.",
|
|
verb_ar="تم ذكر وظيفتك في منشور.",
|
|
verb_de="Ihre Arbeitsposition wurde in einem Beitrag erwähnt.",
|
|
verb_es="Tu puesto de trabajo fue mencionado en una publicación.",
|
|
verb_fr="Votre poste de travail a été mentionné dans un post.",
|
|
redirect="/",
|
|
icon="chatbox-ellipses",
|
|
)
|
|
messages.success(self.request, message)
|
|
return HttpResponse("<script>window.location.reload();</script>")
|
|
return super().form_valid(form)
|
|
|
|
|
|
class AnnouncementDetailView(HorillaDetailedView):
|
|
|
|
model = Announcement
|
|
template_name = "announcement/announcement_one.html"
|
|
|
|
def get_context_data(self, **kwargs):
|
|
import ast
|
|
|
|
context = super().get_context_data(**kwargs)
|
|
instance_ids = ast.literal_eval(self.request.GET.get("instance_ids", "[]"))
|
|
url_info = resolve(self.request.path)
|
|
url_name = url_info.url_name
|
|
key = next(iter(url_info.kwargs), "pk")
|
|
|
|
if self.instance:
|
|
announcement_view_obj, _ = AnnouncementView.objects.get_or_create(
|
|
user=self.request.user, announcement=self.instance
|
|
)
|
|
announcement_view_obj.viewed = True
|
|
announcement_view_obj.save()
|
|
|
|
if instance_ids:
|
|
prev_id, next_id = closest_numbers(instance_ids, self.instance.pk)
|
|
|
|
context.update(
|
|
{
|
|
"instance_ids": str(instance_ids),
|
|
"ids_key": self.ids_key,
|
|
"next_url": reverse(url_name, kwargs={key: next_id}),
|
|
"previous_url": reverse(url_name, kwargs={key: prev_id}),
|
|
}
|
|
)
|
|
|
|
get_params = self.request.GET.copy()
|
|
get_params.pop(self.ids_key, None)
|
|
context["extra_query"] = get_params.urlencode()
|
|
else:
|
|
context["extra_query"] = ""
|
|
|
|
return context
|