[ADD] BASE: Option to select primary mail server (#104)
This commit is contained in:
committed by
GitHub
parent
63f37177f5
commit
18523883e0
3
.gitignore
vendored
3
.gitignore
vendored
@@ -142,3 +142,6 @@ node_modules/
|
|||||||
|
|
||||||
#whoosh folder
|
#whoosh folder
|
||||||
whoosh_index/
|
whoosh_index/
|
||||||
|
|
||||||
|
#VSCode
|
||||||
|
.vscode/
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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(
|
raise ValidationError({"company_id": _("This field is required")})
|
||||||
company_id__isnull=True
|
|
||||||
).exclude(id=self.id)
|
|
||||||
if servers_same_company.exists():
|
|
||||||
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):
|
||||||
|
|||||||
Reference in New Issue
Block a user