Skip to content

Commit

Permalink
feat: added newsletter functionality with celery ✨
Browse files Browse the repository at this point in the history
  • Loading branch information
hossainchisty committed Oct 26, 2021
1 parent ee5ff83 commit dd95361
Show file tree
Hide file tree
Showing 24 changed files with 1,836 additions and 3 deletions.
Empty file added newsletter/__init__.py
Empty file.
40 changes: 40 additions & 0 deletions newsletter/admin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
from django.contrib import admin

from .models import Subscriber


@admin.register(Subscriber)
class SubscriberAdmin(admin.ModelAdmin):
list_display = ('email', 'confirmed', 'created_at')
list_filter = ('created_at',)
search_fields = ('email', 'confirmed')
date_hierarchy = 'created_at'
ordering = ('-created_at',)
fields = ('email', 'created_at')
readonly_fields = ('created_at',)
list_per_page = 100
list_max_show_all = 200

def has_delete_permission(self, request, obj=None):
'''
Remove the delete button from the admin panel
'''
return False

def has_add_permission(self, request):
'''
Remove the add button from the admin panel
'''
return False

def has_edit_permission(self, request, obj=None):
'''
Remove the edit button from the admin panel
'''
return False

def has_change_permission(self, request, obj=None):
'''
Remove the change button from the admin panel
'''
return False
6 changes: 6 additions & 0 deletions newsletter/apps.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
from django.apps import AppConfig


class NewsletterConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'newsletter'
26 changes: 26 additions & 0 deletions newsletter/fixtures/subscriber.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
[
{
"model": "newsletter.subscriber",
"pk": 1,
"fields": {
"email": "[email protected]",
"confirmed": true
}
},
{
"model": "newsletter.subscriber",
"pk": 2,
"fields": {
"email": "[email protected]",
"confirmed": true
}
},
{
"model": "newsletter.subscriber",
"pk": 3,
"fields": {
"email": "[email protected]",
"confirmed": true
}
}
]
29 changes: 29 additions & 0 deletions newsletter/migrations/0001_initial.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# Generated by Django 3.2.6 on 2021-10-23 18:46

from django.db import migrations, models
import django.utils.timezone


class Migration(migrations.Migration):

initial = True

dependencies = [
]

operations = [
migrations.CreateModel(
name='Subscriber',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('created_at', models.DateTimeField(default=django.utils.timezone.now, editable=False)),
('updated_at', models.DateTimeField(default=django.utils.timezone.now, editable=False)),
('email', models.EmailField(max_length=254, unique=True, verbose_name='Email')),
('confirmed', models.BooleanField(default=False)),
],
options={
'verbose_name': 'Subscriber',
'verbose_name_plural': 'Subscribers',
},
),
]
Empty file.
14 changes: 14 additions & 0 deletions newsletter/models.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
from django.db import models
from model.common_fields import BaseModel


class Subscriber(BaseModel):
email = models.EmailField(unique=True, verbose_name='Email')
confirmed = models.BooleanField(default=False)

class Meta:
verbose_name = 'Subscriber'
verbose_name_plural = 'Subscribers'

def __str__(self):
return self.email + " (" + ("not " if not self.confirmed else "") + "confirmed)"
29 changes: 29 additions & 0 deletions newsletter/tasks.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
from celery import shared_task

from django.conf import settings
from django.core.mail import EmailMessage
from django.template.loader import render_to_string

from .models import Subscriber


@shared_task
def async_send_newsletter():
'''
Asynchronously send newsletter to all subscribers.
Time period:
- Time zone: Asia/Dhaka, Bangladesh.
- Every weeks at 00:00 ⏰
'''
confirme_subscribers = Subscriber.objects.filter(confirmed=True)
for subscriber in confirme_subscribers:
body = render_to_string("newsletter/mail/newsletter.html")
mail = EmailMessage(
subject="Newsletter🎉",
body=body,
from_email=settings.EMAIL_HOST_USER,
to=[subscriber.email],
)
mail.content_subtype = "HTML"
mail.send()
return "Newsletter sent to {}".format(subscriber.email)
Loading

0 comments on commit dd95361

Please sign in to comment.