[ADD] BASE: Option to select primary mail server (#104)

This commit is contained in:
Ashwanth Balakrishnan
2024-03-06 20:56:22 +05:30
committed by GitHub
parent 63f37177f5
commit 18523883e0
3 changed files with 38 additions and 27 deletions

3
.gitignore vendored
View File

@@ -142,3 +142,6 @@ node_modules/
#whoosh folder #whoosh folder
whoosh_index/ whoosh_index/
#VSCode
.vscode/

View File

@@ -3,6 +3,7 @@ email_backend.py
This module is used to write email backends This module is used to write email backends
""" """
from django.core.mail.backends.smtp import EmailBackend from django.core.mail.backends.smtp import EmailBackend
from base.models import EmailLog from base.models import EmailLog
from horilla import settings from horilla import settings
@@ -35,7 +36,7 @@ class ConfiguredEmailBackend(EmailBackend):
).first() ).first()
if configuration is None: if configuration is None:
configuration = DynamicEmailConfiguration.objects.filter( configuration = DynamicEmailConfiguration.objects.filter(
company_id__isnull=True is_primary=True
).first() ).first()
# Use default settings if configuration is not available # Use default settings if configuration is not available
host = configuration.host if configuration else host or settings.EMAIL_HOST host = configuration.host if configuration else host or settings.EMAIL_HOST

View File

@@ -3,6 +3,7 @@ models.py
This module is used to register django models This module is used to register django models
""" """
from collections.abc import Iterable from collections.abc import Iterable
from typing import Any from typing import Any
import django import django
@@ -33,11 +34,13 @@ def validate_time_format(value):
except ValueError as e: except ValueError as e:
raise ValidationError(_("Invalid format, excepted HH:MM")) from e raise ValidationError(_("Invalid format, excepted HH:MM")) from e
def clear_messages(request): def clear_messages(request):
storage = messages.get_messages(request) storage = messages.get_messages(request)
for message in storage: for message in storage:
pass pass
class Company(models.Model): class Company(models.Model):
""" """
Company model Company model
@@ -717,14 +720,16 @@ class WorkTypeRequest(models.Model):
ordering = [ ordering = [
"-id", "-id",
] ]
def delete(self,*args, **kwargs):
request = getattr(_thread_locals,"request",None) def delete(self, *args, **kwargs):
request = getattr(_thread_locals, "request", None)
if not self.approved: if not self.approved:
super().delete(*args, **kwargs) super().delete(*args, **kwargs)
else: else:
if request: if request:
clear_messages(request) clear_messages(request)
messages.warning(request,"The request entry cannot be deleted.") messages.warning(request, "The request entry cannot be deleted.")
def is_any_work_type_request_exists(self): def is_any_work_type_request_exists(self):
approved_work_type_requests_range = WorkTypeRequest.objects.filter( approved_work_type_requests_range = WorkTypeRequest.objects.filter(
employee_id=self.employee_id, employee_id=self.employee_id,
@@ -777,9 +782,7 @@ class WorkTypeRequest(models.Model):
) )
if not self.is_permanent_work_type: if not self.is_permanent_work_type:
if not self.requested_till: if not self.requested_till:
raise ValidationError( raise ValidationError(_("Requested till field is required."))
_("Requested till field is required.")
)
def __str__(self) -> str: def __str__(self) -> str:
return f"{self.employee_id.employee_first_name} \ return f"{self.employee_id.employee_first_name} \
@@ -796,7 +799,7 @@ class WorktyperequestComment(models.Model):
request_id = models.ForeignKey(WorkTypeRequest, on_delete=models.CASCADE) request_id = models.ForeignKey(WorkTypeRequest, on_delete=models.CASCADE)
employee_id = models.ForeignKey(Employee, on_delete=models.CASCADE) employee_id = models.ForeignKey(Employee, on_delete=models.CASCADE)
comment = models.TextField(null=True, verbose_name=_("Comment")) comment = models.TextField(null=True, verbose_name=_("Comment"))
files = models.ManyToManyField(BaserequestFile,blank=True) files = models.ManyToManyField(BaserequestFile, blank=True)
created_at = models.DateTimeField( created_at = models.DateTimeField(
auto_now_add=True, auto_now_add=True,
verbose_name=_("Created At"), verbose_name=_("Created At"),
@@ -894,9 +897,7 @@ class ShiftRequest(models.Model):
) )
if not self.is_permanent_shift: if not self.is_permanent_shift:
if not self.requested_till: if not self.requested_till:
raise ValidationError( raise ValidationError(_("Requested till field is required."))
_("Requested till field is required.")
)
def is_any_request_exists(self): def is_any_request_exists(self):
approved_shift_requests_range = ShiftRequest.objects.filter( approved_shift_requests_range = ShiftRequest.objects.filter(
@@ -940,21 +941,20 @@ class ShiftRequest(models.Model):
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
super().save(*args, **kwargs) super().save(*args, **kwargs)
def delete(self,*args, **kwargs): def delete(self, *args, **kwargs):
request = getattr(_thread_locals,"request",None) request = getattr(_thread_locals, "request", None)
if not self.approved: if not self.approved:
super().delete(*args, **kwargs) super().delete(*args, **kwargs)
else: else:
if request: if request:
clear_messages(request) clear_messages(request)
messages.warning(request,"The request entry cannot be deleted.") messages.warning(request, "The request entry cannot be deleted.")
def __str__(self) -> str: def __str__(self) -> str:
return f"{self.employee_id.employee_first_name} \ return f"{self.employee_id.employee_first_name} \
{self.employee_id.employee_last_name} - {self.requested_date}" {self.employee_id.employee_last_name} - {self.requested_date}"
class ShiftrequestComment(models.Model): class ShiftrequestComment(models.Model):
""" """
ShiftrequestComment Model ShiftrequestComment Model
@@ -964,7 +964,7 @@ class ShiftrequestComment(models.Model):
request_id = models.ForeignKey(ShiftRequest, on_delete=models.CASCADE) request_id = models.ForeignKey(ShiftRequest, on_delete=models.CASCADE)
employee_id = models.ForeignKey(Employee, on_delete=models.CASCADE) employee_id = models.ForeignKey(Employee, on_delete=models.CASCADE)
files = models.ManyToManyField(BaserequestFile,blank=True) files = models.ManyToManyField(BaserequestFile, blank=True)
comment = models.TextField(null=True, verbose_name=_("Comment")) comment = models.TextField(null=True, verbose_name=_("Comment"))
created_at = models.DateTimeField( created_at = models.DateTimeField(
auto_now_add=True, auto_now_add=True,
@@ -994,6 +994,9 @@ class DynamicEmailConfiguration(models.Model):
SingletoneModel to keep the mail server configurations SingletoneModel to keep the mail server configurations
""" """
is_primary = models.BooleanField(
default=False, verbose_name=_("Primary Mail Server")
)
host = models.CharField( host = models.CharField(
blank=True, null=True, max_length=256, verbose_name=_("Email Host") blank=True, null=True, max_length=256, verbose_name=_("Email Host")
) )
@@ -1040,16 +1043,16 @@ class DynamicEmailConfiguration(models.Model):
) )
) )
if not self.company_id: if not self.company_id:
servers_same_company = DynamicEmailConfiguration.objects.filter(
company_id__isnull=True
).exclude(id=self.id)
if servers_same_company.exists():
raise ValidationError({"company_id": _("This field is required")}) raise ValidationError({"company_id": _("This field is required")})
def __str__(self): def __str__(self):
return self.username return self.username
def save(self, *args, **kwargs) -> None: def save(self, *args, **kwargs) -> None:
if self.is_primary:
DynamicEmailConfiguration.objects.filter(is_primary=True).update(
is_primary=False
)
super().save(*args, **kwargs) super().save(*args, **kwargs)
servers_same_company = DynamicEmailConfiguration.objects.filter( servers_same_company = DynamicEmailConfiguration.objects.filter(
company_id=self.company_id company_id=self.company_id
@@ -1267,20 +1270,22 @@ class AnnouncementExpire(models.Model):
class Announcement(models.Model): class Announcement(models.Model):
""" """
Anonuncement Model for stroing all announcements. Anonuncement Model for stroing all announcements.
""" """
from employee.models import Employee from employee.models import Employee
title = models.CharField(max_length=30) title = models.CharField(max_length=30)
description = models.TextField(null=True,max_length=255) description = models.TextField(null=True, max_length=255)
attachments = models.ManyToManyField( attachments = models.ManyToManyField(
Attachment, related_name="announcement_attachments", blank=True Attachment, related_name="announcement_attachments", blank=True
) )
created_on = models.DateTimeField(auto_now_add=True) created_on = models.DateTimeField(auto_now_add=True)
expire_date = models.DateField(null=True, blank=True) expire_date = models.DateField(null=True, blank=True)
employees = models.ManyToManyField(Employee, related_name="announcement_employees", blank=True) employees = models.ManyToManyField(
Employee, related_name="announcement_employees", blank=True
)
department = models.ManyToManyField(Department, blank=True) department = models.ManyToManyField(Department, blank=True)
job_position = models.ManyToManyField(JobPosition, blank=True) job_position = models.ManyToManyField(JobPosition, blank=True)
disable_comments = models.BooleanField(default=False) disable_comments = models.BooleanField(default=False)
@@ -1290,6 +1295,7 @@ class Announcement(models.Model):
This method is used to get the view count of the announcement This method is used to get the view count of the announcement
""" """
return self.announcementview_set.filter(viewed=True) return self.announcementview_set.filter(viewed=True)
def __str__(self): def __str__(self):
return self.title return self.title
@@ -1303,7 +1309,7 @@ class AnnouncementComment(models.Model):
announcement_id = models.ForeignKey(Announcement, on_delete=models.CASCADE) announcement_id = models.ForeignKey(Announcement, on_delete=models.CASCADE)
employee_id = models.ForeignKey(Employee, on_delete=models.CASCADE) employee_id = models.ForeignKey(Employee, on_delete=models.CASCADE)
comment = models.TextField(null=True, verbose_name=_("Comment"),max_length=255) comment = models.TextField(null=True, verbose_name=_("Comment"), max_length=255)
created_at = models.DateTimeField( created_at = models.DateTimeField(
auto_now_add=True, auto_now_add=True,
verbose_name=_("Created At"), verbose_name=_("Created At"),
@@ -1315,10 +1321,11 @@ class AnnouncementView(models.Model):
""" """
Announcemnt View Model Announcemnt View Model
""" """
user = models.ForeignKey(User, on_delete=models.CASCADE) user = models.ForeignKey(User, on_delete=models.CASCADE)
announcement = models.ForeignKey(Announcement, on_delete=models.CASCADE) announcement = models.ForeignKey(Announcement, on_delete=models.CASCADE)
viewed = models.BooleanField(default=False) viewed = models.BooleanField(default=False)
created_at = models.DateTimeField(auto_now_add=True,null=True) created_at = models.DateTimeField(auto_now_add=True, null=True)
class EmailLog(models.Model): class EmailLog(models.Model):