Compare commits
No commits in common. "9a010aa97b2af095372671075b70f9085ba48dfb" and "fd4590f6119babcef48f793e075802646e8cd896" have entirely different histories.
9a010aa97b
...
fd4590f611
14 changed files with 43 additions and 170 deletions
|
|
@ -1,4 +1,4 @@
|
||||||
openapi-python-client
|
openapi-python-client
|
||||||
https://push.gooyal.ir/swagger?base=push.gooyal.ir
|
https://push.gooyal.com/swagger?base=push.gooyal.com
|
||||||
|
|
||||||
npm install -g swagger2openapi
|
npm install -g swagger2openapi
|
||||||
|
|
@ -1,8 +1,7 @@
|
||||||
from django.contrib import admin
|
from django.contrib import admin
|
||||||
|
|
||||||
from .models import Email, EmailQueue
|
from .models import Email
|
||||||
|
|
||||||
|
|
||||||
admin.site.register(Email)
|
admin.site.register(Email)
|
||||||
admin.site.register(EmailQueue)
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,41 +0,0 @@
|
||||||
# Generated by Django 5.2.6 on 2025-09-06 13:55
|
|
||||||
|
|
||||||
import django.db.models.deletion
|
|
||||||
import uuid
|
|
||||||
from django.conf import settings
|
|
||||||
from django.db import migrations, models
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('emails', '0001_initial'),
|
|
||||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='email',
|
|
||||||
name='extras',
|
|
||||||
field=models.JSONField(blank=True, default=dict, null=True),
|
|
||||||
),
|
|
||||||
migrations.CreateModel(
|
|
||||||
name='EmailQueue',
|
|
||||||
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=255, verbose_name='title')),
|
|
||||||
('last_sent', models.DateTimeField(auto_now_add=True, verbose_name='last sent')),
|
|
||||||
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='user')),
|
|
||||||
],
|
|
||||||
options={
|
|
||||||
'abstract': False,
|
|
||||||
},
|
|
||||||
),
|
|
||||||
migrations.AddField(
|
|
||||||
model_name='email',
|
|
||||||
name='queue',
|
|
||||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='+', to='emails.emailqueue'),
|
|
||||||
),
|
|
||||||
]
|
|
||||||
|
|
@ -1,5 +1,4 @@
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.db.models import F
|
|
||||||
from oauth2_provider.settings import oauth2_settings
|
from oauth2_provider.settings import oauth2_settings
|
||||||
|
|
||||||
from apps.users.models import User
|
from apps.users.models import User
|
||||||
|
|
@ -7,18 +6,6 @@ from utils.models import BaseModel
|
||||||
from django.utils.translation import gettext_lazy as _
|
from django.utils.translation import gettext_lazy as _
|
||||||
|
|
||||||
|
|
||||||
class EmailQueueQuerySet(models.query.QuerySet):
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
class EmailQueue(BaseModel):
|
|
||||||
title = models.CharField(_('title'), max_length=255)
|
|
||||||
user = models.ForeignKey(User, verbose_name=_('user'), on_delete=models.PROTECT)
|
|
||||||
last_sent = models.DateTimeField(_('last sent'), auto_now_add=True)
|
|
||||||
|
|
||||||
objects = EmailQueueQuerySet.as_manager()
|
|
||||||
|
|
||||||
|
|
||||||
class EmailQuerySet(models.QuerySet):
|
class EmailQuerySet(models.QuerySet):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
@ -40,8 +27,6 @@ class Email(BaseModel):
|
||||||
priority = models.IntegerField(default=5)
|
priority = models.IntegerField(default=5)
|
||||||
extras = models.JSONField(default=dict, null=True, blank=True)
|
extras = models.JSONField(default=dict, null=True, blank=True)
|
||||||
stats = models.IntegerField(default=StateChoices.INIT, choices=StateChoices.choices)
|
stats = models.IntegerField(default=StateChoices.INIT, choices=StateChoices.choices)
|
||||||
queue = models.ForeignKey(EmailQueue, on_delete=models.PROTECT, related_name='+', null=True, blank=True)
|
|
||||||
|
|
||||||
|
|
||||||
# bulk = models.ForeignKey("BulkEmail", null=True, blank=True, on_delete=models.PROTECT)
|
# bulk = models.ForeignKey("BulkEmail", null=True, blank=True, on_delete=models.PROTECT)
|
||||||
|
|
||||||
|
|
@ -52,7 +37,7 @@ class Email(BaseModel):
|
||||||
|
|
||||||
def send(self):
|
def send(self):
|
||||||
from apps.emails.tasks import send_email
|
from apps.emails.tasks import send_email
|
||||||
send_email.delay(self.uuid)
|
send_email(self.uuid)
|
||||||
|
|
||||||
def _send_email(self):
|
def _send_email(self):
|
||||||
from django.core.mail import send_mail
|
from django.core.mail import send_mail
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,6 @@ class EmailSerializer(serializers.ModelSerializer):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Email
|
model = Email
|
||||||
fields = (
|
fields = (
|
||||||
"queue",
|
|
||||||
"title",
|
"title",
|
||||||
"message",
|
"message",
|
||||||
"user",
|
"user",
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,6 @@
|
||||||
from django.db.models import F
|
|
||||||
from django.utils import timezone
|
|
||||||
import logging
|
|
||||||
from apps.emails.models import Email, EmailQueue
|
|
||||||
from main import celery_app
|
from main import celery_app
|
||||||
from utils.clients import gotify
|
from utils.clients import gotify
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
|
||||||
|
|
||||||
@celery_app.task
|
@celery_app.task
|
||||||
def send_email(email_uuid):
|
def send_email(email_uuid):
|
||||||
|
|
@ -15,40 +10,3 @@ def send_email(email_uuid):
|
||||||
|
|
||||||
email.state = email.StateChoices.DONE
|
email.state = email.StateChoices.DONE
|
||||||
email.save()
|
email.save()
|
||||||
|
|
||||||
|
|
||||||
@celery_app.task
|
|
||||||
def send_email_for_queued_events():
|
|
||||||
logger.info('Sending email for queued events')
|
|
||||||
for email_queue in EmailQueue.objects.all():
|
|
||||||
logger.info('Sending email for queue %s', email_queue.title)
|
|
||||||
qs = Email.objects.filter(queue=email_queue, stats=Email.StateChoices.INIT, created_at__gte=F('queue__last_sent'))
|
|
||||||
if email_queue.last_sent <= timezone.now() - timezone.timedelta(minutes=10) and qs.exists():
|
|
||||||
logger.info('Sending email for queue %s', email_queue.title)
|
|
||||||
from django.core.mail import send_mail
|
|
||||||
from django.conf import settings
|
|
||||||
title = 'you have some queued task(s)'
|
|
||||||
message = f"you have {qs.count()} queued task(s) \n"
|
|
||||||
|
|
||||||
for index, email in enumerate(qs, start=1):
|
|
||||||
message += f"{index} - {email.title} \n"
|
|
||||||
|
|
||||||
send_mail(
|
|
||||||
title,
|
|
||||||
message,
|
|
||||||
settings.EMAIL_HOST_USER,
|
|
||||||
["xdshia49@gmail.com"],
|
|
||||||
fail_silently=True,
|
|
||||||
)
|
|
||||||
email_queue.last_sent = timezone.now()
|
|
||||||
email_queue.save()
|
|
||||||
|
|
||||||
|
|
||||||
celery_app.conf.beat_schedule = {
|
|
||||||
'print-every-minute': {
|
|
||||||
'task': 'apps.emails.tasks.send_email_for_queued_events',
|
|
||||||
'schedule': 10.0, # هر 60 ثانیه
|
|
||||||
# یا میتوانید از crontab استفاده کنید:
|
|
||||||
# 'schedule': crontab(minute='*/1'),
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -43,5 +43,4 @@ class ApplicationEmailViewSet(
|
||||||
user = get_object_or_404(User, uuid=user_uuid)
|
user = get_object_or_404(User, uuid=user_uuid)
|
||||||
application = get_application(self.request)
|
application = get_application(self.request)
|
||||||
instance = serializer.save(user=user, application=application)
|
instance = serializer.save(user=user, application=application)
|
||||||
if not instance.queue:
|
|
||||||
instance.send()
|
instance.send()
|
||||||
|
|
|
||||||
|
|
@ -5,4 +5,4 @@ while ! nc -z $DB_HOST 5432 ; do
|
||||||
done
|
done
|
||||||
#python3 manage.py collectstatic --noinput
|
#python3 manage.py collectstatic --noinput
|
||||||
#python3 manage.py migrate
|
#python3 manage.py migrate
|
||||||
celery -A main worker --loglevel=info -B
|
celery -A main worker --loglevel=info
|
||||||
|
|
@ -48,7 +48,6 @@ INSTALLED_APPS = [
|
||||||
'crispy_bootstrap5',
|
'crispy_bootstrap5',
|
||||||
'django_filters',
|
'django_filters',
|
||||||
'jalali_date',
|
'jalali_date',
|
||||||
"django_celery_beat",
|
|
||||||
# 'django_minio_backend.apps.DjangoMinioBackendConfig',
|
# 'django_minio_backend.apps.DjangoMinioBackendConfig',
|
||||||
|
|
||||||
# local apps
|
# local apps
|
||||||
|
|
@ -224,9 +223,7 @@ SPECTACULAR_SETTINGS = {
|
||||||
AUTH_USER_MODEL = 'users.User'
|
AUTH_USER_MODEL = 'users.User'
|
||||||
CORS_ORIGIN_ALLOW_ALL = True
|
CORS_ORIGIN_ALLOW_ALL = True
|
||||||
CORS_ALLOW_ALL_ORIGINS = True
|
CORS_ALLOW_ALL_ORIGINS = True
|
||||||
CSRF_TRUSTED_ORIGINS = ['http://*', 'https://*',
|
CSRF_TRUSTED_ORIGINS = ['http://*', 'https://*', 'http://*.gooyal.com', 'https://*.gooyal.com']
|
||||||
'http://*.gooyal.com', 'https://*.gooyal.com',
|
|
||||||
'http://*.gooyal.ir', 'https://*.gooyal.ir']
|
|
||||||
|
|
||||||
JALALI_DATE_DEFAULTS = {
|
JALALI_DATE_DEFAULTS = {
|
||||||
'Strftime': {
|
'Strftime': {
|
||||||
|
|
@ -236,7 +233,6 @@ JALALI_DATE_DEFAULTS = {
|
||||||
}
|
}
|
||||||
REDIS_BASE_URL = config('REDIS_BASE_URL')
|
REDIS_BASE_URL = config('REDIS_BASE_URL')
|
||||||
GOTIFY_ADMIN_CLIENT_TOKEN = config('GOTIFY_ADMIN_CLIENT_TOKEN')
|
GOTIFY_ADMIN_CLIENT_TOKEN = config('GOTIFY_ADMIN_CLIENT_TOKEN')
|
||||||
GOTIFY_BASE_PUBLIC_URL = config('GOTIFY_BASE_PUBLIC_URL')
|
|
||||||
|
|
||||||
CACHES = {
|
CACHES = {
|
||||||
"default": {
|
"default": {
|
||||||
|
|
|
||||||
|
|
@ -19,5 +19,3 @@ httpx
|
||||||
django-redis
|
django-redis
|
||||||
django_minio_backend
|
django_minio_backend
|
||||||
xlrd
|
xlrd
|
||||||
django-celery-beat
|
|
||||||
# aiosmtpd #??
|
|
||||||
|
|
@ -1,37 +1,32 @@
|
||||||
#
|
#
|
||||||
# This file is autogenerated by pip-compile with Python 3.13
|
# This file is autogenerated by pip-compile with Python 3.11
|
||||||
# by the following command:
|
# by the following command:
|
||||||
#
|
#
|
||||||
# pip-compile
|
# pip-compile
|
||||||
#
|
#
|
||||||
aiosmtpd==1.4.6
|
|
||||||
# via -r requirements.in
|
|
||||||
amqp==5.3.1
|
amqp==5.3.1
|
||||||
# via kombu
|
# via kombu
|
||||||
anyio==4.10.0
|
anyio==4.9.0
|
||||||
# via httpx
|
# via httpx
|
||||||
argon2-cffi==25.1.0
|
argon2-cffi==25.1.0
|
||||||
# via minio
|
# via minio
|
||||||
argon2-cffi-bindings==25.1.0
|
argon2-cffi-bindings==21.2.0
|
||||||
# via argon2-cffi
|
# via argon2-cffi
|
||||||
asgiref==3.9.1
|
asgiref==3.8.1
|
||||||
# via
|
# via
|
||||||
# django
|
# django
|
||||||
# django-cors-headers
|
# django-cors-headers
|
||||||
atpublic==6.0.1
|
async-timeout==5.0.1
|
||||||
# via aiosmtpd
|
# via redis
|
||||||
attrs==25.3.0
|
attrs==25.3.0
|
||||||
# via
|
# via
|
||||||
# aiosmtpd
|
|
||||||
# jsonschema
|
# jsonschema
|
||||||
# referencing
|
# referencing
|
||||||
billiard==4.2.1
|
billiard==4.2.1
|
||||||
# via celery
|
# via celery
|
||||||
celery==5.5.3
|
celery==5.5.3
|
||||||
# via
|
# via -r requirements.in
|
||||||
# -r requirements.in
|
certifi==2025.6.15
|
||||||
# django-celery-beat
|
|
||||||
certifi==2025.8.3
|
|
||||||
# via
|
# via
|
||||||
# httpcore
|
# httpcore
|
||||||
# httpx
|
# httpx
|
||||||
|
|
@ -41,7 +36,7 @@ cffi==1.17.1
|
||||||
# via
|
# via
|
||||||
# argon2-cffi-bindings
|
# argon2-cffi-bindings
|
||||||
# cryptography
|
# cryptography
|
||||||
charset-normalizer==3.4.3
|
charset-normalizer==3.4.2
|
||||||
# via requests
|
# via requests
|
||||||
click==8.2.1
|
click==8.2.1
|
||||||
# via
|
# via
|
||||||
|
|
@ -57,15 +52,12 @@ click-repl==0.3.0
|
||||||
# via celery
|
# via celery
|
||||||
crispy-bootstrap5==2025.6
|
crispy-bootstrap5==2025.6
|
||||||
# via -r requirements.in
|
# via -r requirements.in
|
||||||
cron-descriptor==2.0.6
|
cryptography==45.0.4
|
||||||
# via django-celery-beat
|
|
||||||
cryptography==45.0.7
|
|
||||||
# via jwcrypto
|
# via jwcrypto
|
||||||
django==5.2.6
|
django==5.2.3
|
||||||
# via
|
# via
|
||||||
# -r requirements.in
|
# -r requirements.in
|
||||||
# crispy-bootstrap5
|
# crispy-bootstrap5
|
||||||
# django-celery-beat
|
|
||||||
# django-cors-headers
|
# django-cors-headers
|
||||||
# django-crispy-forms
|
# django-crispy-forms
|
||||||
# django-filter
|
# django-filter
|
||||||
|
|
@ -73,11 +65,8 @@ django==5.2.6
|
||||||
# django-minio-backend
|
# django-minio-backend
|
||||||
# django-oauth-toolkit
|
# django-oauth-toolkit
|
||||||
# django-redis
|
# django-redis
|
||||||
# django-timezone-field
|
|
||||||
# djangorestframework
|
# djangorestframework
|
||||||
# drf-spectacular
|
# drf-spectacular
|
||||||
django-celery-beat==2.8.1
|
|
||||||
# via -r requirements.in
|
|
||||||
django-cors-headers==4.7.0
|
django-cors-headers==4.7.0
|
||||||
# via -r requirements.in
|
# via -r requirements.in
|
||||||
django-crispy-forms==2.4
|
django-crispy-forms==2.4
|
||||||
|
|
@ -94,17 +83,15 @@ django-oauth-toolkit==3.0.1
|
||||||
# via -r requirements.in
|
# via -r requirements.in
|
||||||
django-redis==6.0.0
|
django-redis==6.0.0
|
||||||
# via -r requirements.in
|
# via -r requirements.in
|
||||||
django-timezone-field==7.1
|
djangorestframework==3.16.0
|
||||||
# via django-celery-beat
|
|
||||||
djangorestframework==3.16.1
|
|
||||||
# via
|
# via
|
||||||
# -r requirements.in
|
# -r requirements.in
|
||||||
# drf-spectacular
|
# drf-spectacular
|
||||||
drf-spectacular==0.28.0
|
drf-spectacular==0.28.0
|
||||||
# via -r requirements.in
|
# via -r requirements.in
|
||||||
gevent==25.8.2
|
gevent==25.5.1
|
||||||
# via -r requirements.in
|
# via -r requirements.in
|
||||||
greenlet==3.2.4
|
greenlet==3.2.3
|
||||||
# via gevent
|
# via gevent
|
||||||
gunicorn==23.0.0
|
gunicorn==23.0.0
|
||||||
# via -r requirements.in
|
# via -r requirements.in
|
||||||
|
|
@ -125,7 +112,7 @@ jalali-core==1.0.0
|
||||||
# via jdatetime
|
# via jdatetime
|
||||||
jdatetime==5.2.0
|
jdatetime==5.2.0
|
||||||
# via django-jalali-date
|
# via django-jalali-date
|
||||||
jsonschema==4.25.1
|
jsonschema==4.24.0
|
||||||
# via drf-spectacular
|
# via drf-spectacular
|
||||||
jsonschema-specifications==2025.4.1
|
jsonschema-specifications==2025.4.1
|
||||||
# via jsonschema
|
# via jsonschema
|
||||||
|
|
@ -133,7 +120,7 @@ jwcrypto==1.5.6
|
||||||
# via django-oauth-toolkit
|
# via django-oauth-toolkit
|
||||||
kombu==5.5.4
|
kombu==5.5.4
|
||||||
# via celery
|
# via celery
|
||||||
minio==7.2.16
|
minio==7.2.15
|
||||||
# via django-minio-backend
|
# via django-minio-backend
|
||||||
oauthlib==3.3.1
|
oauthlib==3.3.1
|
||||||
# via django-oauth-toolkit
|
# via django-oauth-toolkit
|
||||||
|
|
@ -141,9 +128,9 @@ packaging==25.0
|
||||||
# via
|
# via
|
||||||
# gunicorn
|
# gunicorn
|
||||||
# kombu
|
# kombu
|
||||||
pillow==11.3.0
|
pillow==11.2.1
|
||||||
# via -r requirements.in
|
# via -r requirements.in
|
||||||
prompt-toolkit==3.0.52
|
prompt-toolkit==3.0.51
|
||||||
# via click-repl
|
# via click-repl
|
||||||
psycopg[binary,pool]==3.2.9
|
psycopg[binary,pool]==3.2.9
|
||||||
# via -r requirements.in
|
# via -r requirements.in
|
||||||
|
|
@ -155,15 +142,13 @@ pycparser==2.22
|
||||||
# via cffi
|
# via cffi
|
||||||
pycryptodome==3.23.0
|
pycryptodome==3.23.0
|
||||||
# via minio
|
# via minio
|
||||||
python-crontab==3.3.0
|
|
||||||
# via django-celery-beat
|
|
||||||
python-dateutil==2.9.0.post0
|
python-dateutil==2.9.0.post0
|
||||||
# via celery
|
# via celery
|
||||||
python-decouple==3.8
|
python-decouple==3.8
|
||||||
# via -r requirements.in
|
# via -r requirements.in
|
||||||
pyyaml==6.0.2
|
pyyaml==6.0.2
|
||||||
# via drf-spectacular
|
# via drf-spectacular
|
||||||
redis==6.4.0
|
redis==6.2.0
|
||||||
# via
|
# via
|
||||||
# -r requirements.in
|
# -r requirements.in
|
||||||
# django-redis
|
# django-redis
|
||||||
|
|
@ -171,11 +156,11 @@ referencing==0.36.2
|
||||||
# via
|
# via
|
||||||
# jsonschema
|
# jsonschema
|
||||||
# jsonschema-specifications
|
# jsonschema-specifications
|
||||||
requests==2.32.5
|
requests==2.32.4
|
||||||
# via
|
# via
|
||||||
# -r requirements.in
|
# -r requirements.in
|
||||||
# django-oauth-toolkit
|
# django-oauth-toolkit
|
||||||
rpds-py==0.27.1
|
rpds-py==0.25.1
|
||||||
# via
|
# via
|
||||||
# jsonschema
|
# jsonschema
|
||||||
# referencing
|
# referencing
|
||||||
|
|
@ -185,16 +170,16 @@ sniffio==1.3.1
|
||||||
# via anyio
|
# via anyio
|
||||||
sqlparse==0.5.3
|
sqlparse==0.5.3
|
||||||
# via django
|
# via django
|
||||||
typing-extensions==4.15.0
|
typing-extensions==4.14.0
|
||||||
# via
|
# via
|
||||||
# cron-descriptor
|
# anyio
|
||||||
# jwcrypto
|
# jwcrypto
|
||||||
# minio
|
# minio
|
||||||
|
# psycopg
|
||||||
# psycopg-pool
|
# psycopg-pool
|
||||||
|
# referencing
|
||||||
tzdata==2025.2
|
tzdata==2025.2
|
||||||
# via
|
# via kombu
|
||||||
# django-celery-beat
|
|
||||||
# kombu
|
|
||||||
uritemplate==4.2.0
|
uritemplate==4.2.0
|
||||||
# via drf-spectacular
|
# via drf-spectacular
|
||||||
urllib3==2.5.0
|
urllib3==2.5.0
|
||||||
|
|
@ -210,7 +195,7 @@ wcwidth==0.2.13
|
||||||
# via prompt-toolkit
|
# via prompt-toolkit
|
||||||
xlrd==2.0.2
|
xlrd==2.0.2
|
||||||
# via -r requirements.in
|
# via -r requirements.in
|
||||||
zope-event==5.1.1
|
zope-event==5.1
|
||||||
# via gevent
|
# via gevent
|
||||||
zope-interface==7.2
|
zope-interface==7.2
|
||||||
# via gevent
|
# via gevent
|
||||||
|
|
|
||||||
|
|
@ -19,7 +19,6 @@ from gotify_rest_api_client.api.application import create_app
|
||||||
from gotify_rest_api_client.types import Unset
|
from gotify_rest_api_client.types import Unset
|
||||||
|
|
||||||
ADMIN_CLIENT_TOKEN = settings.GOTIFY_ADMIN_CLIENT_TOKEN
|
ADMIN_CLIENT_TOKEN = settings.GOTIFY_ADMIN_CLIENT_TOKEN
|
||||||
GOTIFY_BASE_PUBLIC_URL = settings.GOTIFY_BASE_PUBLIC_URL
|
|
||||||
|
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
|
|
@ -45,7 +44,7 @@ def log_response(response):
|
||||||
|
|
||||||
|
|
||||||
def get_client(access_token):
|
def get_client(access_token):
|
||||||
client = AuthenticatedClient(base_url=GOTIFY_BASE_PUBLIC_URL, token=access_token,
|
client = AuthenticatedClient(base_url="https://push.gooyal.com", token=access_token,
|
||||||
httpx_args={"event_hooks": {"request": [log_request], "response": [log_response]}},
|
httpx_args={"event_hooks": {"request": [log_request], "response": [log_response]}},
|
||||||
)
|
)
|
||||||
return client
|
return client
|
||||||
|
|
@ -55,12 +54,12 @@ def get_basic_client(username, password):
|
||||||
auth = httpx.BasicAuth(username=username, password=password)
|
auth = httpx.BasicAuth(username=username, password=password)
|
||||||
prefix, token = auth._auth_header.split()
|
prefix, token = auth._auth_header.split()
|
||||||
|
|
||||||
# httpx_client = httpx.Client(auth=auth, base_url=GOTIFY_BASE_PUBLIC_URL)
|
# httpx_client = httpx.Client(auth=auth, base_url="https://push.gooyal.com")
|
||||||
client = AuthenticatedClient(base_url=GOTIFY_BASE_PUBLIC_URL, token=token, prefix=prefix,
|
client = AuthenticatedClient(base_url="https://push.gooyal.com", token=token, prefix=prefix,
|
||||||
httpx_args={
|
httpx_args={
|
||||||
"event_hooks": {"request": [log_request], "response": [log_response]},
|
"event_hooks": {"request": [log_request], "response": [log_response]},
|
||||||
# "auth": auth,
|
# "auth": auth,
|
||||||
# "base_url": GOTIFY_BASE_PUBLIC_URL
|
# "base_url": "https://push.gooyal.com"
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
# client.set_httpx_client(httpx_client)
|
# client.set_httpx_client(httpx_client)
|
||||||
|
|
@ -68,11 +67,7 @@ def get_basic_client(username, password):
|
||||||
|
|
||||||
|
|
||||||
def send_notif(token, title=None, message=None, priority=None, extras=None):
|
def send_notif(token, title=None, message=None, priority=None, extras=None):
|
||||||
if extras:
|
extras = extras or Unset()
|
||||||
extras = MessageExternalModelExtras.from_dict(extras)
|
|
||||||
else:
|
|
||||||
extras = Unset()
|
|
||||||
|
|
||||||
final_data = MessageExternalModel(appid=1, date=timezone.now(), id=1, title=title, message=message, priority=priority, extras=extras)
|
final_data = MessageExternalModel(appid=1, date=timezone.now(), id=1, title=title, message=message, priority=priority, extras=extras)
|
||||||
client = get_client(access_token=token)
|
client = get_client(access_token=token)
|
||||||
response: Any = create_message.sync(client=client, body=final_data)
|
response: Any = create_message.sync(client=client, body=final_data)
|
||||||
|
|
|
||||||
|
|
@ -19,7 +19,7 @@
|
||||||
},
|
},
|
||||||
"version": "2.0.2"
|
"version": "2.0.2"
|
||||||
},
|
},
|
||||||
"host": "push.gooyal.ir",
|
"host": "push.gooyal.com",
|
||||||
"paths": {
|
"paths": {
|
||||||
"/application": {
|
"/application": {
|
||||||
"get": {
|
"get": {
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
openapi: 3.0.0
|
openapi: 3.0.0
|
||||||
x-origin:
|
x-origin:
|
||||||
- url: https://push.gooyal.ir/swagger?base=push.gooyal.ir%2F
|
- url: https://push.gooyal.com/swagger?base=push.gooyal.com%2F
|
||||||
format: swagger
|
format: swagger
|
||||||
version: "2.0"
|
version: "2.0"
|
||||||
converter:
|
converter:
|
||||||
|
|
@ -1452,8 +1452,8 @@ paths:
|
||||||
schema:
|
schema:
|
||||||
$ref: "#/components/schemas/VersionInfo"
|
$ref: "#/components/schemas/VersionInfo"
|
||||||
servers:
|
servers:
|
||||||
- url: http://push.gooyal.ir/
|
- url: http://push.gooyal.com/
|
||||||
- url: https://push.gooyal.ir/
|
- url: https://push.gooyal.com/
|
||||||
components:
|
components:
|
||||||
securitySchemes:
|
securitySchemes:
|
||||||
appTokenAuthorizationHeader:
|
appTokenAuthorizationHeader:
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue