[FIX] BASE: Resolved issue in announcement, employees didn't get the notification

This commit is contained in:
Horilla
2025-06-24 10:28:38 +05:30
parent 69d1e84858
commit e4580d2a10
2 changed files with 84 additions and 48 deletions

View File

@@ -82,63 +82,82 @@ def announcement_list(request):
@hx_request_required
def create_announcement(request):
"""
This method renders form and template to update Announcement
Create a new announcement and notify relevant users.
"""
form = AnnouncementForm()
if request.method == "POST":
form = AnnouncementForm(request.POST, request.FILES)
if form.is_valid():
anou, attachment_ids = form.save(commit=False)
anou.save()
anou.attachments.set(attachment_ids)
announcement, attachment_ids = form.save(commit=False)
announcement.save()
announcement.attachments.set(attachment_ids)
employees = form.cleaned_data["employees"]
departments = form.cleaned_data["department"]
job_positions = form.cleaned_data["job_position"]
company = form.cleaned_data["company_id"]
anou.department.set(departments)
anou.job_position.set(job_positions)
anou.company_id.set(company)
announcement.department.set(departments)
announcement.job_position.set(job_positions)
announcement.company_id.set(company)
dept_ids = departments.values_list("id", flat=True)
job_ids = job_positions.values_list("id", flat=True)
employees_from_dept = Employee.objects.filter(
employee_work_info__department_id__in=dept_ids
)
employees_from_job = Employee.objects.filter(
employee_work_info__job_position_id__in=job_ids
)
all_employees = (
employees | employees_from_dept | employees_from_job
).distinct()
announcement.employees.add(*all_employees)
all_emps = employees_from_dept | employees_from_job | employees
user_map = User.objects.filter(employee_get__in=all_emps).distinct()
dept_emp_ids = set(employees_from_dept.values_list("id", flat=True))
job_emp_ids = set(employees_from_job.values_list("id", flat=True))
direct_emp_ids = set(employees.values_list("id", flat=True))
notified_ids = dept_emp_ids.union(job_emp_ids)
direct_only_ids = direct_emp_ids - notified_ids
sender = request.user.employee_get
def send_notification(users, verb):
if users.exists():
notify.send(
sender,
recipient=users,
verb=verb,
verb_ar="لقد تم ذكرك في إعلان.",
verb_de="Sie wurden in einer Ankündigung erwähnt.",
verb_es="Has sido mencionado en un anuncio.",
verb_fr="Vous avez été mentionné dans une annonce.",
redirect="/",
icon="chatbox-ellipses",
)
send_notification(
user_map.filter(employee_get__id__in=dept_emp_ids),
_("Your department was mentioned in an announcement."),
)
send_notification(
user_map.filter(employee_get__id__in=job_emp_ids),
_("Your job position was mentioned in an announcement."),
)
send_notification(
user_map.filter(employee_get__id__in=direct_only_ids),
_("You have been mentioned in an announcement."),
)
messages.success(request, _("Announcement created successfully."))
form = AnnouncementForm() # Reset the form
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(
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(
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",
)
form = AnnouncementForm()
return render(request, "announcement/announcement_form.html", {"form": form})

View File

@@ -2361,7 +2361,6 @@ class AnnouncementForm(ModelForm):
filter_class=EmployeeFilter,
filter_instance_contex_name="f",
filter_template_path="employee_filters.html",
required=True,
),
label="Employees",
)
@@ -2421,14 +2420,32 @@ class AnnouncementForm(ModelForm):
def clean(self):
cleaned_data = super().clean()
# Remove 'employees' field error if it's handled manually
if isinstance(self.fields["employees"], HorillaMultiSelectField):
self.errors.pop("employees", None)
employee_data = self.fields["employees"].queryset.filter(
id__in=self.data.getlist("employees")
)
cleaned_data["employees"] = employee_data
# Get submitted M2M values
employees_selected = cleaned_data.get("employees")
departments_selected = self.cleaned_data.get("department")
job_positions_selected = self.cleaned_data.get("job_position")
# Check if none of the three are selected
if (
not employees_selected
and not departments_selected
and not job_positions_selected
):
raise forms.ValidationError(
_(
"You must select at least one of: Employees, Department, or Job Position."
)
)
return cleaned_data