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.

214 lines
6.5 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, redirect
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
4 years ago
from .models import Backer, PressArticle, BlogPost, Page, FAQEntry, CommercialSupportVendor, GovernanceMember, \
MediaElement
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()
commercial_support_vendors = CommercialSupportVendor.objects.order_by('-priority').all()
4 years ago
press_articles = PressArticle.objects.order_by('-priority').all()
lang_code = request.LANGUAGE_CODE # type: ignore
if lang_code != 'en':
# If the entries does not exist in this language, use EN
4 years ago
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,
'commercial_support_vendors': commercial_support_vendors,
4 years ago
'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).first()
4 years ago
except BlogPost.DoesNotExist:
raise Http404
return render(request, 'blog/post.html', {
'post': post
})
# TODO
# @require_safe
# @never_cache
# def showcase_index(request: HttpRequest) -> HttpResponse:
# lang_code = request.LANGUAGE_CODE # type: ignore
#
# if lang_code != 'en':
# # If the features does not exist in this language, use EN
# if 0 == ShowcaseFeature.objects.filter(lang=lang_code).count():
# lang_code = 'en'
#
# showcase_features = ShowcaseFeature.objects.filter(lang=lang_code).order_by('-priority').all()
#
# return render(request, 'showcase/index.html', {
# 'showcase_features': showcase_features,
# })
@require_safe
@never_cache
def contribute_index(request: HttpRequest) -> HttpResponse:
return render(request, 'contribute/index.html', {})
@require_safe
@never_cache
def foundation_members(request: HttpRequest) -> HttpResponse:
board_of_directors = GovernanceMember.objects.filter(type='governance_board').order_by('-priority').all()
return render(request, 'foundation/members/index.html', {
'board_of_directors': board_of_directors,
})
@never_cache
@require_safe
def media_element(_: HttpRequest, media_id: int) -> HttpResponse:
element = MediaElement.objects.get(id=media_id)
if element is None:
raise Http404
return redirect(element.file.url)
4 years ago
@require_safe
@never_cache
def elevate(request: HttpRequest) -> HttpResponse:
return render(request, 'elevate/index.html', {})
4 years ago
def not_found(request: HttpRequest, exception: Exception) -> HttpResponse:
return render(request, '404.html', status=404)