diff --git a/apps/notification/celery.py b/apps/notification/celery.py new file mode 100644 index 00000000..3ca31569 --- /dev/null +++ b/apps/notification/celery.py @@ -0,0 +1,21 @@ +import string +import time + +from celery import shared_task +from django.core.mail import EmailMultiAlternatives +from django.template.loader import render_to_string + + +@shared_task(name="notification") +def send_email(subject: string, text: string, to: list): + context = { + 'subject': subject, + 'context': text + } + email_html_message = render_to_string('email/notification.html', context) + email_plaintext_message = render_to_string('email/notification.txt', context) + msg = EmailMultiAlternatives(subject=subject, from_email="datadays.sharif@gmail.com", + bcc=to, body=email_plaintext_message) + msg.attach_alternative(email_html_message, "text/html") + msg.send() + time.sleep(60) diff --git a/apps/notification/migrations/0001_initial.py b/apps/notification/migrations/0001_initial.py index e6bfce80..5960428b 100644 --- a/apps/notification/migrations/0001_initial.py +++ b/apps/notification/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.2.8 on 2019-12-21 13:54 +# Generated by Django 2.2.8 on 2020-01-10 18:56 from django.conf import settings from django.db import migrations, models @@ -18,6 +18,7 @@ class Migration(migrations.Migration): name='EmailText', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('subject', models.CharField(max_length=100)), ('text', models.TextField()), ('html', models.TextField(editable=False)), ], @@ -26,7 +27,7 @@ class Migration(migrations.Migration): name='Subscriber', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('email', models.EmailField(max_length=254)), + ('email', models.EmailField(max_length=254, unique=True)), ], ), migrations.CreateModel( diff --git a/apps/notification/migrations/0002_auto_20191221_1640.py b/apps/notification/migrations/0002_auto_20191221_1640.py deleted file mode 100644 index dece19ed..00000000 --- a/apps/notification/migrations/0002_auto_20191221_1640.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 2.2.8 on 2019-12-21 16:40 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('notification', '0001_initial'), - ] - - operations = [ - migrations.AlterField( - model_name='subscriber', - name='email', - field=models.EmailField(max_length=254, unique=True), - ), - ] diff --git a/apps/notification/migrations/0002_emailtext_receivers.py b/apps/notification/migrations/0002_emailtext_receivers.py new file mode 100644 index 00000000..0901c977 --- /dev/null +++ b/apps/notification/migrations/0002_emailtext_receivers.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.8 on 2020-01-14 17:17 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('notification', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='emailtext', + name='receivers', + field=models.ManyToManyField(to='notification.Subscriber'), + ), + ] diff --git a/apps/notification/models.py b/apps/notification/models.py index 86c5c93c..e00a9a20 100644 --- a/apps/notification/models.py +++ b/apps/notification/models.py @@ -1,11 +1,13 @@ import markdown from django.contrib.auth.models import User -from django.core.mail import send_mail +from django.core.mail import EmailMultiAlternatives +from django.template.loader import render_to_string + from django.db import models +from apps.notification.celery import * # Create your models here. -from rest_framework.validators import UniqueValidator class Notification(models.Model): @@ -14,15 +16,34 @@ class Notification(models.Model): text = models.TextField(max_length=200, null=False) seen = models.BooleanField(default=False, null=False) + def __str__(self): + return self.text + class Subscriber(models.Model): email = models.EmailField(null=False, unique=True) + def __str__(self): + return self.email + class EmailText(models.Model): + subject = models.CharField(null=False, max_length=100) text = models.TextField(null=False) html = models.TextField(editable=False) + receivers = models.ManyToManyField(Subscriber) + + def __str__(self): + return self.text def save(self, force_insert=False, force_update=False, using=None, update_fields=None): self.html = markdown.markdown(self.text) + if not self.pk: + subscribers = list() + for subscriber in Subscriber.objects.values_list('email'): + subscribers.append(subscriber[0]) + for i in range(0, len(subscribers) + 1, 20): + send_email.apply_async([self.subject, self.text, subscribers[i:i + 20]]) + + super().save(force_insert, force_update, using, update_fields) diff --git a/apps/notification/templates/email/notification.html b/apps/notification/templates/email/notification.html new file mode 100644 index 00000000..3328ad3d --- /dev/null +++ b/apps/notification/templates/email/notification.html @@ -0,0 +1,16 @@ +{% load static i18n %} + +{% get_current_language_bidi as LANGUAGE_BIDI %} + + + +
+ +