From f123b31643885f30cc5aa35aa85f31e4b65a0174 Mon Sep 17 00:00:00 2001 From: Horilla Date: Mon, 10 Mar 2025 13:58:22 +0530 Subject: [PATCH] [ADD] BASE: Add field filtered employees to announcements --- base/models.py | 9 ++++++++- base/signals.py | 26 +++++++++++++++++++++++--- 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/base/models.py b/base/models.py index db4610bbf..e12b198d6 100644 --- a/base/models.py +++ b/base/models.py @@ -174,7 +174,9 @@ class JobRole(HorillaModel): job_position_id = models.ForeignKey( JobPosition, on_delete=models.PROTECT, verbose_name=_("Job Position") ) - job_role = models.CharField(max_length=50, blank=False, null=True) + job_role = models.CharField( + max_length=50, blank=False, null=True, verbose_name=_("Job Role") + ) company_id = models.ManyToManyField(Company, blank=True, verbose_name=_("Company")) objects = HorillaCompanyManager("job_position_id__department_id__company_id") @@ -1490,6 +1492,8 @@ class Announcement(HorillaModel): from employee.models import Employee + model_employee = Employee + title = models.CharField(max_length=100) description = models.TextField(null=True) attachments = models.ManyToManyField( @@ -1507,6 +1511,9 @@ class Announcement(HorillaModel): related_name="announcement", ) disable_comments = models.BooleanField(default=False) + filtered_employees = models.ManyToManyField( + Employee, related_name="announcement_filtered_employees", editable=False + ) objects = HorillaCompanyManager(related_company_field="company_id") def get_views(self): diff --git a/base/signals.py b/base/signals.py index a1c214831..5bd4c855d 100644 --- a/base/signals.py +++ b/base/signals.py @@ -1,11 +1,11 @@ from datetime import datetime from django.apps import apps -from django.db.models import Max -from django.db.models.signals import post_migrate, post_save +from django.db.models import Max, Q +from django.db.models.signals import m2m_changed, post_migrate, post_save from django.dispatch import receiver -from base.models import PenaltyAccounts +from base.models import Announcement, PenaltyAccounts from horilla.methods import get_horilla_model_class @@ -80,3 +80,23 @@ def clean_work_records(sender, **kwargs): .exclude(id=record["latest_id"]) .delete()[0] ) + + +@receiver(m2m_changed, sender=Announcement.employees.through) +def filtered_employees(sender, instance, action, **kwargs): + """ + filtered employees + """ + if action not in ["post_add", "post_remove", "post_clear"]: + return # Only run after M2M changes + employee_ids = list(instance.employees.values_list("id", flat=True)) + department_ids = list(instance.department.values_list("id", flat=True)) + job_position_ids = list(instance.job_position.values_list("id", flat=True)) + + employees = instance.model_employee.objects.filter( + Q(id__in=employee_ids) + | Q(employee_work_info__department_id__in=department_ids) + | Q(employee_work_info__job_position_id__in=job_position_ids) + ) + + instance.filtered_employees.set(employees)