This repository has been archived on 2022-11-26. You can view files and clone it, but cannot push or open issues or pull requests.
Episodes.Community/LandingPage/views.py

97 lines
3.6 KiB
Python

# Episodes.Community - Community-Driven TV Show Episode Link Sharing Site
# Copyright (C) 2017 Evert "Diamond" Prants <evert@lunasqu.ee>, Taizo "Tsa6" Simpson <taizo@tsa6.net>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
from django.shortcuts import render
from django.views import View
from django.views.generic.base import TemplateView
from django.contrib.auth import login as auth_login, authenticate
from django.conf import settings
from django.http import HttpResponse
from django.http import HttpResponseRedirect
from django.db.models import Max
from django.contrib.auth.views import logout
import requests
import hashlib
import json
from .models import User
from .models import Show
from .models import Submission
from .models import DiscussionBoard
# Create your views here.
# Redirect url should point to this view
class LoginRedirect(View):
def get(self, req):
# Check request has correct arguments
request_valid = 'state' in req.GET and 'code' in req.GET
if not request_valid:
r = HttpResponse('<h1>Error</h1><p>There was an error in your request. Please <a href=/login>try again</a></p>')
r.status = 400
return r
# Check state
userstate = generateState(req)
if userstate == req.GET['state']:
code = req.GET['code']
user = authenticate(code=code)
if user is not None and user.is_active:
auth_login(req, user)
return HttpResponseRedirect('/')
return HttpResponse('<h1>Error</h1><br><p>It looks like something went wrong while trying to authenticate you. Please try again later.</p>', status=500)
return HttpResponse('<h1>Unmatching state tokens</h1><br><p>It looks like the request to login wasn\'t started by you. Try going back to the home page and logging in again.</p>', status=400)
class Login(View):
def get(self, req):
url = '%sauthorize?response_type=code&client_id=%s&redirect_uri=%s&scope=email privilege&state=%s'%(settings.AUTH_TOKEN_ENDPOINT,settings.AUTH_CLIENT_ID,settings.AUTH_REDIRECT_URL, generateState(req))
response = HttpResponse("Redirecting you to the IcyNet auth page...")
response.status_code = 302
response['Location'] = url
return response
def LogoutView(request):
logout(request)
return HttpResponseRedirect('/')
def generateState(request):
request.session.save()
m = hashlib.sha256()
m.update(bytearray(request.session.session_key, 'utf-8'))
m.update(bytearray(settings.SECRET_KEY, 'utf-8'))
return m.hexdigest()
class LandingPage(TemplateView):
template_name = "landing_page.html"
def get_context_data(self, **kwargs):
ctx = super().get_context_data()
ctx['recent'] = Show.objects.annotate(recency=Max('episodes__airdate')).order_by('-recency')[:8]
ctx['stats'] = {
'shows': Show.objects.count(),
'episodes': Submission.objects.count(),
'boards': DiscussionBoard.objects.count()
}
return ctx