146 lines
4.5 KiB
Python
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()
|