You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

162 lines
4.9 KiB

4 years ago
import datetime
import json
import requests
from django.core.exceptions import ValidationError
from django.core.paginator import Paginator, EmptyPage
from django.core.validators import validate_email
from django.http import Http404
4 years ago
from django.http import HttpResponse, HttpRequest
from django.shortcuts import render
4 years ago
from django.utils.timezone import make_aware
from django.utils.translation import gettext as _
from django.views.decorators.cache import never_cache
from django.views.decorators.http import require_POST, require_safe
from almalinux.settings import HUBSPOT_APIKEY, HUBSPOT_SUB_ID
from .models import Backer, PressArticle, BlogPost, Page, FAQEntry
4 years ago
4 years ago
# Public views
@require_safe
@never_cache
4 years ago
def index(request: HttpRequest) -> HttpResponse:
4 years ago
backers = Backer.objects.order_by('-priority').all()
press_articles = PressArticle.objects.order_by('-priority').all()
lang_code = request.LANGUAGE_CODE # type: ignore
if lang_code != 'en':
# If the slug does not exist in this language, use EN
if 0 == FAQEntry.objects.filter(lang=lang_code).count():
lang_code = 'en'
faq_entries = FAQEntry.objects.filter(lang=lang_code).order_by('-priority').all()
return render(request, 'index.html', {
'backers': backers,
'press_articles': press_articles,
'faq_entries': faq_entries
})
@require_POST
def subscribe_post(request: HttpRequest) -> HttpResponse:
email = request.POST.get('email')
try:
validate_email(email)
except ValidationError:
return render(request, 'subscribe_post.html', {
'error': _('Email address is not valid')
})
payload = {
'emailAddress': email,
'subscriptionId': HUBSPOT_SUB_ID,
'legalBasis': 'CONSENT_WITH_NOTICE',
'legalBasisExplanation': 'At users request in almalinux.org website'
}
response = requests.request(
'POST',
'https://api.hubapi.com/communication-preferences/v3/subscribe',
data=json.dumps(payload),
headers={
'accept': 'application/json',
'content-type': 'application/json'
},
params={'hapikey': HUBSPOT_APIKEY}
)
response_data = json.loads(response.text)
is_error = response_data['status'] == 'error'
error_message = _('Failed to subscribe to mailing list, please try again later')
if is_error and 'is already subscribed' in response_data['message']:
error_message = _('You are already subscribed to this mailing list!')
return render(request, 'subscribe_post.html', {
'error': error_message if is_error else None,
})
# noinspection DuplicatedCode
@require_safe
@never_cache
def content_page(request: HttpRequest, slug: str = None) -> HttpResponse:
now = make_aware(datetime.datetime.utcnow())
lang_code = request.LANGUAGE_CODE # type: ignore
if lang_code != 'en':
# If the slug does not exist in this language, use EN
if 0 == Page.objects.filter(date__lte=now, published=True, lang=lang_code, slug=slug).count():
lang_code = 'en'
try:
page = Page.objects.filter(date__lte=now, published=True, lang=lang_code, slug=slug).get()
except Page.DoesNotExist:
raise Http404
return render(request, 'page/page.html', {
'page': page
})
@require_safe
@never_cache
def blog_index(request: HttpRequest, page_num: int = 1) -> HttpResponse:
if page_num < 1:
raise Http404
now = make_aware(datetime.datetime.utcnow())
lang_code = request.LANGUAGE_CODE # type: ignore
if lang_code != 'en':
# If there are no posts in this language, show EN content
if 0 == BlogPost.objects.filter(date__lte=now, published=True, lang=lang_code).count():
lang_code = 'en'
post_q = (BlogPost.objects
.filter(date__lte=now, published=True, lang=lang_code)
.order_by('-date')
.all())
paginator = Paginator(post_q, 15)
try:
posts = paginator.page(page_num)
except EmptyPage:
raise Http404
return render(request, 'blog/index.html', {
'posts': posts,
})
# noinspection DuplicatedCode
@require_safe
@never_cache
def blog_post(request: HttpRequest, slug: str = None) -> HttpResponse:
now = make_aware(datetime.datetime.utcnow())
lang_code = request.LANGUAGE_CODE # type: ignore
if lang_code != 'en':
# If the slug does not exist in this language, use EN
if 0 == BlogPost.objects.filter(date__lte=now, published=True, lang=lang_code, slug=slug).count():
lang_code = 'en'
try:
post = BlogPost.objects.filter(date__lte=now, published=True, lang=lang_code, slug=slug).get()
except BlogPost.DoesNotExist:
raise Http404
return render(request, 'blog/post.html', {
'post': post
})
def not_found(request: HttpRequest, exception: Exception) -> HttpResponse:
return render(request, '404.html', status=404)