phantasmobile/app/listmonk/views.py

85 lines
2.9 KiB
Python
Raw Permalink Normal View History

2025-01-23 14:03:55 +05:30
import json
from brake.decorators import ratelimit
2023-10-15 17:10:38 +01:00
from django.conf import settings
2025-01-23 14:03:55 +05:30
from django.contrib.auth import get_user_model
2023-10-15 17:10:38 +01:00
from django.db.models.functions import ExtractWeek, ExtractYear
2025-01-23 14:03:55 +05:30
from django.shortcuts import redirect, render
2023-09-23 14:38:28 +02:00
from django.template.loader import render_to_string
2023-09-23 14:58:41 +02:00
from django.utils import timezone
2023-10-15 17:10:38 +01:00
from django.utils.timezone import datetime, timedelta
2025-01-23 14:03:55 +05:30
from django.core.validators import validate_email
import django.contrib.auth
2023-09-23 14:38:28 +02:00
from ..item import models
2024-02-06 17:47:54 +01:00
from ..item.views import get_weeks, format_week, get_monday, get_byline
2025-01-23 14:03:55 +05:30
from ..item.utils import render_to_json
from ..utils import default_context
from . import utils
User = get_user_model()
2023-09-23 14:38:28 +02:00
def week(year, month, day):
2023-09-23 14:58:41 +02:00
now = timezone.make_aware(datetime.now(), timezone.get_default_timezone())
2023-09-23 14:38:28 +02:00
context = {}
2023-09-23 14:58:41 +02:00
archive = models.Item.objects.filter(
published__lte=now
).annotate(
year=ExtractYear('published')
).annotate(
week=ExtractWeek('published')
)
2023-09-23 14:38:28 +02:00
date = datetime.strptime('%s-%s-%s' % (year, month, day), '%Y-%m-%d')
week = int(date.strftime('%W'))
year = int(year)
archive_week = archive.filter(year=year, week=week).order_by('published')
context['weeks'] = get_weeks(archive)
2023-09-23 17:30:03 +02:00
monday = context['this_week'] = date.strftime('%Y-%m-%d')
2023-09-23 14:38:28 +02:00
context['this_year'] = date.strftime('%Y')
2023-09-23 17:30:45 +02:00
context['week_title'] = 'Phantas.ma weekly update %s' % format_week(monday)
2024-02-06 17:47:54 +01:00
context['week_byline'] = get_byline(monday)
2023-10-01 09:16:27 +02:00
context['week_link'] = settings.URL + '/_' + monday
2023-09-23 14:38:28 +02:00
context['items'] = archive_week
return render_to_string("weekly_email.html", context)
2025-01-23 14:03:55 +05:30
@ratelimit(method="POST", block=True, rate="5/m")
def subscribe(request):
context = default_context(request)
response = {}
request_type = 'json'
if request.method == "POST":
if "email" in request.POST:
data = request.POST
request_type = 'html'
else:
data = json.loads(request.body)
if not response:
try:
validate_email(data["email"])
except ValidationError as e:
response['error'] = 'please enter a valid email address.'
else:
try:
if utils.is_subscribed(data["email"]):
pass
elif not utils.add_email(data["email"]):
response['error'] = 'failed to add email to weekly digest.'
except:
response['error'] = 'failed to add your email, please try again later.'
if request_type == 'html':
if 'error' in response:
context['error'] = response['error']
return render(request, 'subscribe.html', context)
else:
context["subscribed"] = True
return render(request, 'subscribe.html', context)
return render_to_json(response)
else:
return render(request, 'subscribe.html', context)