Files
ihrm/horilla_automations/models.py

146 lines
4.5 KiB
Python

from django.db import models
from django.urls import reverse
from django.utils.translation import gettext_lazy as _trans
from base.methods import eval_validate
from base.models import HorillaMailTemplate
from employee.models import Employee
from horilla.models import HorillaModel
from horilla_views.cbv_methods import render_template
MODEL_CHOICES = []
CONDITIONS = [
("equal", _trans("Equal (==)")),
("notequal", _trans("Not Equal (!=)")),
("lt", _trans("Less Than (<)")),
("gt", _trans("Greater Than (>)")),
("le", _trans("Less Than or Equal To (<=)")),
("ge", _trans("Greater Than or Equal To (>=)")),
("icontains", _trans("Contains")),
]
class MailAutomation(HorillaModel):
"""
MailAutoMation
"""
choices = [
("on_create", "On Create"),
("on_update", "On Update"),
("on_delete", "On Delete"),
]
SEND_OPTIONS = [
("email", "Send as Email"),
("notification", "Send as Notification"),
("both", "Send as Email and Notification"),
]
title = models.CharField(max_length=256, unique=True)
method_title = models.CharField(max_length=100, editable=False)
model = models.CharField(max_length=100, choices=MODEL_CHOICES, null=False)
mail_to = models.TextField(verbose_name="Mail to/Notify to")
mail_details = models.CharField(
max_length=250,
help_text=_trans(
"Fill mail template details(reciever/instance, `self` will be the person who trigger the automation), `As template` option will sent instead of the mail template"
),
)
mail_detail_choice = models.TextField(default="", editable=False)
trigger = models.CharField(max_length=10, choices=choices)
# udpate the on_update logic to if and only if when
# changes in the previous and current value
mail_template = models.ForeignKey(
HorillaMailTemplate, on_delete=models.CASCADE, null=True, blank=True
)
also_sent_to = models.ManyToManyField(
Employee,
blank=True,
verbose_name=_trans("Also Send to"),
)
delivery_channel = models.CharField(
default="email",
max_length=50,
choices=SEND_OPTIONS,
verbose_name=_trans("Choose Delivery Channel"),
)
template_attachments = models.ManyToManyField(
HorillaMailTemplate,
related_name="template_attachment",
blank=True,
)
condition_html = models.TextField(null=True, editable=False)
condition_querystring = models.TextField(null=True, editable=False)
condition = models.TextField()
xss_exempt_fields = [
"condition_html",
"condition",
"condition_querystring",
]
def save(self, *args, **kwargs):
if not self.pk:
self.method_title = self.title.replace(" ", "_").lower()
return super().save(*args, **kwargs)
def __str__(self) -> str:
return self.title
def get_avatar(self):
"""
Method will retun the api to the avatar or path to the profile image
"""
url = f"https://ui-avatars.com/api/?name={self.title}&background=random"
return url
def get_mail_to_display(self):
"""
method that returns the display value for `mail_to`
field
"""
mail_to = eval_validate(self.mail_to)
mappings = []
for mapping in mail_to:
mapping = mapping.split("__")
display = ""
for split in mapping:
split = split.replace("_id", "").replace("_", " ")
split = split.capitalize()
display = display + f"{split} >"
display = display[:-1]
mappings.append(display)
return render_template(
"horilla_automations/mail_to.html", {"instance": self, "mappings": mappings}
)
def get_mail_cc_display(self):
employees = self.also_sent_to.all()
return render_template(
"horilla_automations/mail_cc.html", {"employees": employees}
)
def detailed_url(self):
return reverse("automation-detailed-view", kwargs={"pk": self.pk})
def conditions(self):
return render_template(
"horilla_automations/conditions.html", {"instance": self}
)
def delete_url(self):
return reverse("delete-automation", kwargs={"pk": self.pk})
def edit_url(self):
"""
Edit url
"""
return reverse("update-automation", kwargs={"pk": self.pk})
def trigger_display(self):
""""""
return self.get_trigger_display()