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.
213 lines
6.5 KiB
213 lines
6.5 KiB
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
|
|
from django.http import HttpResponse, HttpRequest
|
|
from django.shortcuts import render, redirect
|
|
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, CommercialSupportVendor, GovernanceMember, \
|
|
MediaElement
|
|
|
|
|
|
# Public views
|
|
@require_safe
|
|
@never_cache
|
|
def index(request: HttpRequest) -> HttpResponse:
|
|
backers = Backer.objects.order_by('-priority').all()
|
|
commercial_support_vendors = CommercialSupportVendor.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 entries 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,
|
|
'commercial_support_vendors': commercial_support_vendors,
|
|
'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()
|
|
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)
|
|
|
|
|
|
@require_safe
|
|
@never_cache
|
|
def elevate(request: HttpRequest) -> HttpResponse:
|
|
return render(request, 'elevate/index.html', {})
|
|
|
|
|
|
def not_found(request: HttpRequest, exception: Exception) -> HttpResponse:
|
|
return render(request, '404.html', status=404)
|
|
|