multi email recipient

This commit is contained in:
Setyo Nugroho 2022-11-21 22:06:57 +07:00
parent d1227fd6fb
commit 505eadc6af
5 changed files with 172 additions and 11 deletions

12
api/custom_validator.py Normal file
View file

@ -0,0 +1,12 @@
from django.core import validators
from django.core.exceptions import ValidationError
from rest_framework import serializers
def email_list(value):
try:
emails = value.replace(" ", "").split(",")
for email in emails:
validators.validate_email(email)
except ValidationError:
raise serializers.ValidationError('Field contain invalid email address')

View file

@ -1,6 +1,7 @@
from djmoney.contrib.django_rest_framework import MoneyField from djmoney.contrib.django_rest_framework import MoneyField
from rest_framework import serializers from rest_framework import serializers
from api import custom_validator
from core.models import Invoice, BillingProject, Notification from core.models import Invoice, BillingProject, Notification
from core.component import component from core.component import component
@ -58,7 +59,7 @@ class SimpleInvoiceSerializer(serializers.ModelSerializer):
class BillingProjectSerializer(serializers.ModelSerializer): class BillingProjectSerializer(serializers.ModelSerializer):
tenant_id = serializers.CharField(required=False, read_only=True) tenant_id = serializers.CharField(required=False, read_only=True)
email_notification = serializers.EmailField(required=False) email_notification = serializers.CharField(required=False, validators=[custom_validator.email_list])
class Meta: class Meta:
model = BillingProject model = BillingProject
@ -71,4 +72,5 @@ class NotificationSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = Notification model = Notification
fields = ['id', 'project', 'title', 'short_description', 'content', 'sent_status', 'is_read', 'created_at', 'recipient'] fields = ['id', 'project', 'title', 'short_description', 'content', 'sent_status', 'is_read', 'created_at',
'recipient']

View file

@ -5,7 +5,6 @@ import pytz
from django.db import transaction from django.db import transaction
from django.utils import timezone from django.utils import timezone
from djmoney.money import Money from djmoney.money import Money
from djmoney.settings import DEFAULT_CURRENCY
from rest_framework import viewsets, serializers from rest_framework import viewsets, serializers
from rest_framework.decorators import action from rest_framework.decorators import action
from rest_framework.response import Response from rest_framework.response import Response
@ -17,7 +16,7 @@ from core.exception import PriceNotFound
from core.models import Invoice, BillingProject, Notification from core.models import Invoice, BillingProject, Notification
from core.notification import send_notification_from_template from core.notification import send_notification_from_template
from core.utils.dynamic_setting import get_dynamic_settings, get_dynamic_setting, set_dynamic_setting, BILLING_ENABLED, \ from core.utils.dynamic_setting import get_dynamic_settings, get_dynamic_setting, set_dynamic_setting, BILLING_ENABLED, \
INVOICE_TAX, COMPANY_NAME, COMPANY_LOGO, COMPANY_ADDRESS INVOICE_TAX, COMPANY_NAME, COMPANY_ADDRESS
from core.utils.model_utils import InvoiceComponentMixin from core.utils.model_utils import InvoiceComponentMixin
from yuyu import settings from yuyu import settings

View file

@ -0,0 +1,149 @@
# Generated by Django 3.2.6 on 2022-11-21 15:05
from django.db import migrations, models
import djmoney.models.fields
class Migration(migrations.Migration):
dependencies = [
('core', '0010_auto_20221031_1801'),
]
operations = [
migrations.AlterField(
model_name='billingproject',
name='email_notification',
field=models.CharField(blank=True, max_length=512, null=True),
),
migrations.AlterField(
model_name='flavorprice',
name='hourly_price_currency',
field=djmoney.models.fields.CurrencyField(choices=[('IDR', 'Indonesian Rupiah')], default='IDR', editable=False, max_length=3),
),
migrations.AlterField(
model_name='flavorprice',
name='monthly_price_currency',
field=djmoney.models.fields.CurrencyField(choices=[('IDR', 'Indonesian Rupiah')], default='IDR', editable=False, max_length=3),
),
migrations.AlterField(
model_name='floatingipsprice',
name='hourly_price_currency',
field=djmoney.models.fields.CurrencyField(choices=[('IDR', 'Indonesian Rupiah')], default='IDR', editable=False, max_length=3),
),
migrations.AlterField(
model_name='floatingipsprice',
name='monthly_price_currency',
field=djmoney.models.fields.CurrencyField(choices=[('IDR', 'Indonesian Rupiah')], default='IDR', editable=False, max_length=3),
),
migrations.AlterField(
model_name='imageprice',
name='hourly_price_currency',
field=djmoney.models.fields.CurrencyField(choices=[('IDR', 'Indonesian Rupiah')], default='IDR', editable=False, max_length=3),
),
migrations.AlterField(
model_name='imageprice',
name='monthly_price_currency',
field=djmoney.models.fields.CurrencyField(choices=[('IDR', 'Indonesian Rupiah')], default='IDR', editable=False, max_length=3),
),
migrations.AlterField(
model_name='invoice',
name='tax_currency',
field=djmoney.models.fields.CurrencyField(choices=[('IDR', 'Indonesian Rupiah')], default='IDR', editable=False, max_length=3),
),
migrations.AlterField(
model_name='invoice',
name='total_currency',
field=djmoney.models.fields.CurrencyField(choices=[('IDR', 'Indonesian Rupiah')], default='IDR', editable=False, max_length=3),
),
migrations.AlterField(
model_name='invoicefloatingip',
name='hourly_price_currency',
field=djmoney.models.fields.CurrencyField(choices=[('IDR', 'Indonesian Rupiah')], default='IDR', editable=False, max_length=3),
),
migrations.AlterField(
model_name='invoicefloatingip',
name='monthly_price_currency',
field=djmoney.models.fields.CurrencyField(choices=[('IDR', 'Indonesian Rupiah')], default='IDR', editable=False, max_length=3),
),
migrations.AlterField(
model_name='invoiceimage',
name='hourly_price_currency',
field=djmoney.models.fields.CurrencyField(choices=[('IDR', 'Indonesian Rupiah')], default='IDR', editable=False, max_length=3),
),
migrations.AlterField(
model_name='invoiceimage',
name='monthly_price_currency',
field=djmoney.models.fields.CurrencyField(choices=[('IDR', 'Indonesian Rupiah')], default='IDR', editable=False, max_length=3),
),
migrations.AlterField(
model_name='invoiceinstance',
name='hourly_price_currency',
field=djmoney.models.fields.CurrencyField(choices=[('IDR', 'Indonesian Rupiah')], default='IDR', editable=False, max_length=3),
),
migrations.AlterField(
model_name='invoiceinstance',
name='monthly_price_currency',
field=djmoney.models.fields.CurrencyField(choices=[('IDR', 'Indonesian Rupiah')], default='IDR', editable=False, max_length=3),
),
migrations.AlterField(
model_name='invoicerouter',
name='hourly_price_currency',
field=djmoney.models.fields.CurrencyField(choices=[('IDR', 'Indonesian Rupiah')], default='IDR', editable=False, max_length=3),
),
migrations.AlterField(
model_name='invoicerouter',
name='monthly_price_currency',
field=djmoney.models.fields.CurrencyField(choices=[('IDR', 'Indonesian Rupiah')], default='IDR', editable=False, max_length=3),
),
migrations.AlterField(
model_name='invoicesnapshot',
name='hourly_price_currency',
field=djmoney.models.fields.CurrencyField(choices=[('IDR', 'Indonesian Rupiah')], default='IDR', editable=False, max_length=3),
),
migrations.AlterField(
model_name='invoicesnapshot',
name='monthly_price_currency',
field=djmoney.models.fields.CurrencyField(choices=[('IDR', 'Indonesian Rupiah')], default='IDR', editable=False, max_length=3),
),
migrations.AlterField(
model_name='invoicevolume',
name='hourly_price_currency',
field=djmoney.models.fields.CurrencyField(choices=[('IDR', 'Indonesian Rupiah')], default='IDR', editable=False, max_length=3),
),
migrations.AlterField(
model_name='invoicevolume',
name='monthly_price_currency',
field=djmoney.models.fields.CurrencyField(choices=[('IDR', 'Indonesian Rupiah')], default='IDR', editable=False, max_length=3),
),
migrations.AlterField(
model_name='routerprice',
name='hourly_price_currency',
field=djmoney.models.fields.CurrencyField(choices=[('IDR', 'Indonesian Rupiah')], default='IDR', editable=False, max_length=3),
),
migrations.AlterField(
model_name='routerprice',
name='monthly_price_currency',
field=djmoney.models.fields.CurrencyField(choices=[('IDR', 'Indonesian Rupiah')], default='IDR', editable=False, max_length=3),
),
migrations.AlterField(
model_name='snapshotprice',
name='hourly_price_currency',
field=djmoney.models.fields.CurrencyField(choices=[('IDR', 'Indonesian Rupiah')], default='IDR', editable=False, max_length=3),
),
migrations.AlterField(
model_name='snapshotprice',
name='monthly_price_currency',
field=djmoney.models.fields.CurrencyField(choices=[('IDR', 'Indonesian Rupiah')], default='IDR', editable=False, max_length=3),
),
migrations.AlterField(
model_name='volumeprice',
name='hourly_price_currency',
field=djmoney.models.fields.CurrencyField(choices=[('IDR', 'Indonesian Rupiah')], default='IDR', editable=False, max_length=3),
),
migrations.AlterField(
model_name='volumeprice',
name='monthly_price_currency',
field=djmoney.models.fields.CurrencyField(choices=[('IDR', 'Indonesian Rupiah')], default='IDR', editable=False, max_length=3),
),
]

View file

@ -1,7 +1,6 @@
import logging import logging
import re
import math import math
import re
from django.conf import settings from django.conf import settings
from django.core.mail import send_mail from django.core.mail import send_mail
@ -68,7 +67,7 @@ class ImagePrice(BaseModel, TimestampMixin, PriceMixin):
# region Invoicing # region Invoicing
class BillingProject(BaseModel, TimestampMixin): class BillingProject(BaseModel, TimestampMixin):
tenant_id = models.CharField(max_length=256) tenant_id = models.CharField(max_length=256)
email_notification = models.EmailField(max_length=256, blank=True, null=True) email_notification = models.CharField(max_length=512, blank=True, null=True)
def __str__(self): def __str__(self):
return self.tenant_id return self.tenant_id
@ -268,7 +267,7 @@ class Notification(BaseModel, TimestampMixin):
is_read = models.BooleanField() is_read = models.BooleanField()
def recipient(self): def recipient(self):
if self.project: if self.project and self.project.email_notification:
return self.project.email_notification return self.project.email_notification
return 'Admin' return 'Admin'
@ -281,9 +280,9 @@ class Notification(BaseModel, TimestampMixin):
# Strip single spaces in the beginning of each line # Strip single spaces in the beginning of each line
return text_only.replace('\n ', '\n').strip() return text_only.replace('\n ', '\n').strip()
recipient = [get_dynamic_setting(EMAIL_ADMIN)] recipient = get_dynamic_setting(EMAIL_ADMIN).split(",")
if self.project is not None: if self.project and self.project.email_notification:
recipient.append(self.project.email_notification) recipient += self.project.email_notification.split(",")
send_mail( send_mail(
subject=self.title, subject=self.title,