Данный проект выполняет функцию по рассылке сообщений клиентам.
Реализована своё ядро по обработке данных для задач по рассписанию.
- create_task_interval
- update_task_interval
- delete_task_interval
create_task_interval
# Создание задачи по рассписанию
# Описанный ниже пример в окружении метода
# form_valid
form = form.save()
periodicity = form.cleaned_data['periodicity']
start_time = form.cleaned_data['date_first_send']
kwargs = {'template_render': 'mail_form/mail_send_form.html'}
create_task_interval(object_=form, # Сущность типа <Item> Model.
task='mail_center.tasks.send', # Ссылка на задачу.
interval=periodicity, # Интервал.
start_time=start_time, # Время начала.
**kwargs, # Доп. Данные. Обычно ссылка на HTML.
)
update_task_interval
# Обновление задачи по рассписанию
# Описанный ниже пример в окружении метода
# form_valid
form = form.save()
periodicity = form.cleaned_data['periodicity']
start_time = form.cleaned_data['date_first_send']
kwargs = {'template_render': 'mail_form/mail_send_form.html'}
update_task_interval(object_=form, # Сущность типа <Item> Model.
interval=periodicity, # Интервал.
start_time=start_time, # Время начала.
changed_data=form.changed_data, # Измененые данные.
**kwargs, # Доп. Данные. Обычно ссылка на HTML.
)
delete_task_interval
# Удаление задачи по рассписанию
# Описанный ниже пример в окружении метода
# form_valid
delete_task_interval(object_=self.object)
Реализован ручной Кэш, для этого описанны специализированные функции.
- get_or_set_cache
- delete_cache
get_or_set_cache
from .models import SendingMessage
# Получение всего QuerySet
queryset = get_or_set_cache(SendingMessage, is_queryset_all=True) # -> QuerySet
# Получение определенной сущности
slug = 'some_slug_id_item'
self.object = get_or_set_cache(model=queryset, slug=slug) # -> <Item>
# Получение сущности по полю name
name = 'some_name_item'
self.object = get_or_set_cache(
model=queryset,
type_field='name',
slug=slug,
) # -> <Item>
delete_cache
# Удаление из Кэша всего QuerySet
delete_cache(SendingMessage, is_queryset_all=True)
# Удаление из Кэша опеределенной сущности
queryset = QuerySet(<Item:1>, <Item:2>)
slug = 'some_slug_id_item'
delete_cache(
model=queryset,
slug=slug,
)
Реализован класс для Backend аутентификации по Email
- EmailAuthBackend
# settings.py
AUTHENTICATION_BACKENDS = [
'users.authentication.EmailAuthBackend',
]
Используется Брокер сообщений RabbitMQ и Worker Celery
rabbitmq:
hostname: rabbitmq
image: rabbitmq:4.0.3-management
env_file:
- .env
ports:
- 5672:5672
- 15672:15672
volumes:
- rabbitmq-data:/var/lib/rabbitmq
volumes:
rabbitmq-data:
# .env
RABBITMQ_DEFAULT_USER=guest # Логин RabbitMQ
RABBITMQ_DEFAULT_PASS=guest # Пароль RabbitMQ
celery_worker:
build:
context: .
dockerfile: ./docker/django/Dockerfile
command: /start-celeryworker
volumes:
- .:/app
env_file:
- .env
from celery import Celery
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings')
app = Celery('mail_center')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()
После настройки RabbitMQ и Celery Вам необходимо запустить проект (инструкции ниже) а затем перейти по адрессу: http://localhost:15672/ Это будет страница RabbitMQ для просмотра всех каналов, очередей, обмеников, пользователей, и.т.д. Вам нужно будет ввести логин и пароль для аутентификации который вы указали в .env
Redis NoSQL база данных которая может играть роль как брокера сообщений так и базой данных для Cache.
redis:
image: redis:7.2.5-alpine
expose:
- 6379
Предварительная настройка не требуется для стандартного объема задач.
Flower это мощное приложение для отслеживания всех задач на стороне Worker.
dashboard:
build:
context: .
dockerfile: ./docker/django/Dockerfile
command: /start-flower
volumes:
- .:/app
ports:
- 5555:5555
env_file:
- .env
Предварительная настройка не требуется, все настройки подтягиваются автоматически из RabbitMQ.
Для использования Flower вам нужно перейти по адрессу: http://localhost:5555/ У вас откроется страница Flower с полной информацией о Worker и Tasks.
- django
- psycopg2-binary
- pillow
- pytils
- redis
- hiredis
- celery
- django-celery-beat
- python-crontab
- flower
- gunicorn
- django-phonenumbers
- django-phonenumber-field
- django-countries
Для успешной установки следующие инструкции:
- Настройте .env.sample, а затем переменуйте его в .env
# .env.sample
POSTGRES_PASSWORD=password # Пароль для Базы Данных (настройка)
DB_PASSWORD=password # Пароль для Базы Данных (использование)
RABBITMQ_DEFAULT_USER=user # Логин RabbitMQ
RABBITMQ_DEFAULT_PASS=password # Пароль RabbitMQ
# Email настройки можете не указывать если "DEBAG=True" в settings.py
HOST_USER=user@yandex.ru # Хост почты для рассылки (Если установлен режим DEBAG=False)
PASS_USER=password # Пароль от почты для рассыки (Если установлен режим DEBAG=False)
- Docker В проекте присутствует Docker. Если у вас нет Docker вы можете установить его через официальный сайт. Оф. сайт: link
Неоходимо сделать билд образов и контейнеров
docker compose build
Затем запустить образы
docker compose up
Инструкции использования:
- После запуска в Docker проекта вы можете открывать его в вашем Web Браузере http://localhost/
- Вы попадаете на главную страницу с описанием о сайте и краткой информацией о сайте. Вам доступны только вкладки "Главная страница", "Центр рассылок", "Блог", "Войти".
- Вы можете перейти во вкладку "Блог" и увидеть все статьи которые есть.
- Нажмите на кнопку "Войти" и попадаете на форму аутентификации.
- Нажмите на кнопку "Регистрация".
- Введите все обязательные поля. Если все данные верные вам будет отправлено на почту сообщение о подтверждении регистрации. !!!ВАЖНО!!! Если стоит DEBAG=True уведомление о регистрации прийдет в консоль от Worker, оно не чем не отличается от обычного за исключением того что оно не отправится на реальный Эмеил. !!!ВАЖНО!!!
- Перейдите по полученной ссылке из Эмеила и вы верифицируете вашу почту.
- Затем вы можете снова нажать на кнопку Войти и ввести данные в форму аутентификации.
- Вы попадаете на "Центр рассылок", пока что рассылок у вас нет.
- Для создания сообщения для рассылки перейдите на вкладку "Центр сообщений".
- В центре сообщений нажмите на кнопку "Создать сообщение".
- Введите заголовок и содержимое сообщения и нажмите на кнопку "Создать".
- В списке сообщений вы увидете только что созданное вами сообщение, вы можете Редактировать (изменять) его или Деактивировать - Активировать. При изменения статуса по центру будет изменяться напись.
- Теперь нужно добавить клиентов для рассылки. Перейдите на вкладку "Центр клиентов".
- Ваш список клиентов будет пуст, нажмите "Добавить клиента".
- Введите данные клиента и нажмите кнопку "Создать".
- В списке клиентов вы увидете только что созданного клиента. Вы можете Изменить его данные или Деактивировать - Активировать его. Исходя из статуса будет меняться надпись на карточке клиента.
- Теперь можно создать рассылку, перейдите на вкладку "Центр рассылок".
- В Центре рассылок у вас не будет не каких рассылок, нажмите "Добавить рассылку".
- Вас перекинет в "Центр сообщений" для выбора сообщения для рассылки.
- Нажмите на зеленую кнопку "Начать рассылку" которая расположена на карточке сообщения.
- Вы попадаете в форму создания рассылки. У вас отображается "Выбранное сообщение" с контекстом сообщения, "Настройки сообщения" с выбором времени начала рассылки и интервала, а так же "Выбор клиентов" там где отображается список активных клиентов.
- Выберете клиентов и настройки для рассылки и нажмите кнопку "Принять".
- Начинается рассылка клиентам. !!! ВАЖНО !!! Если DEBAG=True все сообщения из рассылки будут приходить только в консоль от Worker, если вы хотите создать реальную рассылку, вам нужно установить DEBAG=False, заполнить соотвествующие Эмеил поля, если вы их не заполняли и тогда рассыка пойдет на реальные Эмеилы. !!! ВАЖНО !!!
- После создания рассылки вы попадаете на страницу текущей созданной рассылки со всеми данными о ней. Так же имеется шкала которая визуализирует сколько времени осталось до следующей итерации отправки сообщения. Вы можете "Изменить" рассылку, "Заморозить", в этом случае статус рассылки изменится на "Заморожена" и рассылка остановится, "Завершить" - завершает рассылку без возможности ее возобновить, статус будет "Завершена".
- !!! АДМИНИСТРАТОР !!!
- Если зайти с правами доспута Администратора появляются дополнительные возможности.
- Открывается новая вкладка "Для администратора" с возмоностями "Добавить пользователя", "Список пользователей", "Панель администратора".
- Так же у администратора есть возможность изменять данные любого пользователя, а так же удалять рассылки.
- В панели администратора есть возможность совершить любые действия.