This commit is contained in:
parent
5ac1715adb
commit
fd4590f611
10 changed files with 81 additions and 61 deletions
|
|
@ -3,9 +3,5 @@ from django.contrib import admin
|
|||
from .models import Email
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
admin.site.register(Email)
|
||||
|
||||
|
|
|
|||
37
apps/emails/migrations/0001_initial.py
Normal file
37
apps/emails/migrations/0001_initial.py
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
# Generated by Django 5.1.4 on 2025-09-06 08:28
|
||||
|
||||
import django.db.models.deletion
|
||||
import uuid
|
||||
from django.conf import settings
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
initial = True
|
||||
|
||||
dependencies = [
|
||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||
migrations.swappable_dependency(settings.OAUTH2_PROVIDER_APPLICATION_MODEL),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='Email',
|
||||
fields=[
|
||||
('uuid', models.UUIDField(db_index=True, default=uuid.uuid4, editable=False, primary_key=True, serialize=False, unique=True)),
|
||||
('created_at', models.DateTimeField(auto_now_add=True, db_index=True)),
|
||||
('updated_at', models.DateTimeField(auto_now=True, db_index=True)),
|
||||
('title', models.CharField(max_length=128)),
|
||||
('message', models.TextField()),
|
||||
('priority', models.IntegerField(default=5)),
|
||||
('extras', models.JSONField(default=dict)),
|
||||
('stats', models.IntegerField(choices=[(0, 'init'), (1, 'Start'), (2, 'done'), (3, 'timeout'), (4, 'failed')], default=0)),
|
||||
('application', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='+', to=settings.OAUTH2_PROVIDER_APPLICATION_MODEL)),
|
||||
('user', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='+', to=settings.AUTH_USER_MODEL)),
|
||||
],
|
||||
options={
|
||||
'abstract': False,
|
||||
},
|
||||
),
|
||||
]
|
||||
|
|
@ -18,20 +18,34 @@ class Email(BaseModel):
|
|||
TIMEOUT = 3, _('timeout')
|
||||
FAILED = 4, _('failed')
|
||||
|
||||
user = models.ForeignKey(User, on_delete=models.PROTECT)
|
||||
user = models.ForeignKey(User, on_delete=models.PROTECT, related_name='+')
|
||||
application = models.ForeignKey(oauth2_settings.APPLICATION_MODEL, on_delete=models.PROTECT,
|
||||
related_name='+', null=True, blank=True)
|
||||
|
||||
title = models.CharField(max_length=128)
|
||||
message = models.TextField()
|
||||
priority = models.IntegerField(default=5)
|
||||
extras = models.JSONField(default=dict)
|
||||
extras = models.JSONField(default=dict, null=True, blank=True)
|
||||
stats = models.IntegerField(default=StateChoices.INIT, choices=StateChoices.choices)
|
||||
|
||||
# bulk = models.ForeignKey("BulkEmail", null=True, blank=True, on_delete=models.PROTECT)
|
||||
|
||||
objects = EmailQuerySet.as_manager()
|
||||
|
||||
def send_email(self):
|
||||
def __str__(self):
|
||||
return self.title
|
||||
|
||||
def send(self):
|
||||
from apps.emails.tasks import send_email
|
||||
send_email.delay(str(self.uuid))
|
||||
send_email(self.uuid)
|
||||
|
||||
def _send_email(self):
|
||||
from django.core.mail import send_mail
|
||||
from django.conf import settings
|
||||
send_mail(
|
||||
self.title,
|
||||
self.message,
|
||||
settings.EMAIL_HOST_USER,
|
||||
["xdshia49@gmail.com"],
|
||||
fail_silently=False,
|
||||
)
|
||||
|
|
|
|||
|
|
@ -7,6 +7,8 @@ class EmailSerializer(serializers.ModelSerializer):
|
|||
class Meta:
|
||||
model = Email
|
||||
fields = (
|
||||
"title",
|
||||
"message",
|
||||
"user",
|
||||
"application"
|
||||
)
|
||||
|
|
|
|||
|
|
@ -3,10 +3,10 @@ from utils.clients import gotify
|
|||
|
||||
|
||||
@celery_app.task
|
||||
def send_email(push_message_uuid):
|
||||
def send_email(email_uuid):
|
||||
from .models import Email
|
||||
email = Email.objects.get(uuid=push_message_uuid)
|
||||
email.send_email()
|
||||
email = Email.objects.get(uuid=email_uuid)
|
||||
email._send_email()
|
||||
|
||||
email.state = email.StateChoices.DONE
|
||||
email.save()
|
||||
|
|
|
|||
|
|
@ -4,56 +4,10 @@ from . import views
|
|||
from django.urls import NoReverseMatch, path, re_path
|
||||
|
||||
|
||||
app_name = 'push_notifications'
|
||||
|
||||
|
||||
class ApplicationRouter(DefaultRouter):
|
||||
|
||||
routes = [
|
||||
# List route.
|
||||
Route(
|
||||
url=r'^{prefix}/<user_uuid>{trailing_slash}$',
|
||||
mapping={
|
||||
'get': 'list',
|
||||
'post': 'create'
|
||||
},
|
||||
name='{basename}-list',
|
||||
detail=False,
|
||||
initkwargs={'suffix': 'List'}
|
||||
),
|
||||
# Dynamically generated list routes. Generated using
|
||||
# @action(detail=False) decorator on methods of the viewset.
|
||||
DynamicRoute(
|
||||
url=r'^{prefix}/<user_uuid>/{url_path}{trailing_slash}$',
|
||||
name='{basename}-{url_name}',
|
||||
detail=False,
|
||||
initkwargs={}
|
||||
),
|
||||
# # Detail route.
|
||||
Route(
|
||||
url=r'^{prefix}/<user_uuid>/{lookup}{trailing_slash}$',
|
||||
mapping={
|
||||
'get': 'retrieve',
|
||||
'put': 'update',
|
||||
'patch': 'partial_update',
|
||||
'delete': 'destroy'
|
||||
},
|
||||
name='{basename}-detail',
|
||||
detail=True,
|
||||
initkwargs={'suffix': 'Instance'}
|
||||
),
|
||||
# # Dynamically generated detail routes. Generated using
|
||||
# # @action(detail=True) decorator on methods of the viewset.
|
||||
DynamicRoute(
|
||||
url=r'^{prefix}/<user_uuid>/{lookup}/{url_path}{trailing_slash}$',
|
||||
name='{basename}-{url_name}',
|
||||
detail=True,
|
||||
initkwargs={}
|
||||
),
|
||||
]
|
||||
app_name = 'emails'
|
||||
|
||||
|
||||
application_router = DefaultRouter()
|
||||
application_router.register('application', views.ApplicationPushUserViewSet, basename='application')
|
||||
application_router.register('application', views.ApplicationEmailViewSet, basename='application')
|
||||
|
||||
urlpatterns = application_router.urls
|
||||
|
|
|
|||
|
|
@ -43,4 +43,4 @@ class ApplicationEmailViewSet(
|
|||
user = get_object_or_404(User, uuid=user_uuid)
|
||||
application = get_application(self.request)
|
||||
instance = serializer.save(user=user, application=application)
|
||||
instance.send_email()
|
||||
instance.send()
|
||||
|
|
|
|||
|
|
@ -1,5 +1,8 @@
|
|||
from django.contrib import admin
|
||||
from .models import User
|
||||
|
||||
class UserAdmin(admin.ModelAdmin):
|
||||
list_display = ('uuid', 'username', 'first_name', 'last_name')
|
||||
search_fields = ('uuid', 'username', 'first_name', 'last_name')
|
||||
|
||||
admin.site.register(User)
|
||||
admin.site.register(User, UserAdmin)
|
||||
|
|
|
|||
|
|
@ -55,6 +55,7 @@ INSTALLED_APPS = [
|
|||
'apps.users',
|
||||
'apps.gooyal_oauth2',
|
||||
'apps.push_notifications',
|
||||
'apps.emails'
|
||||
]
|
||||
|
||||
MIDDLEWARE = [
|
||||
|
|
@ -340,3 +341,15 @@ CELERY_RESULT_BACKEND = REDIS_BASE_URL
|
|||
# status_forcelist=[500, 502, 503, 504]
|
||||
# )
|
||||
# )
|
||||
|
||||
EMAIL_BACKEND = "django.core.mail.backends.smtp.EmailBackend"
|
||||
EMAIL_HOST = config('EMAIL_HOST')
|
||||
EMAIL_PORT = config('EMAIL_PORT', cast=int)
|
||||
EMAIL_HOST_USER = config('EMAIL_HOST_USER')
|
||||
EMAIL_HOST_PASSWORD = config('EMAIL_HOST_PASSWORD')
|
||||
EMAIL_USE_TLS = config('EMAIL_USE_TLS', default=False, cast=bool)
|
||||
EMAIL_USE_SSL = config('EMAIL_USE_SSL', default=False, cast=bool)
|
||||
EMAIL_TIMEOUT = config('EMAIL_TIMEOUT', cast=int)
|
||||
EMAIL_SSL_KEYFILE = config('EMAIL_SSL_KEYFILE', None)
|
||||
EMAIL_SSL_CERTFILE = config('EMAIL_SSL_CERTFILE', None)
|
||||
|
||||
|
|
|
|||
|
|
@ -37,6 +37,7 @@ urlpatterns = [
|
|||
path('', include('apps.core.urls')),
|
||||
path('push/user/', include('apps.push_notifications.user_urls')),
|
||||
path('push/application/<user_uuid>/', include('apps.push_notifications.application_urls')),
|
||||
path('email/application/<user_uuid>/', include('apps.emails.urls')),
|
||||
# path('users/', include('apps.users.urls')),
|
||||
# path('oauth2/', include('oauth2_provider.urls', namespace='oauth2_provider')),
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue