from django.template import RequestContext from django.shortcuts import render from django.views import View from django.views.generic.base import TemplateView from django.contrib.auth.decorators import login_required from django.conf import settings from django.http import Http404 from django.http import HttpResponse from django.http import HttpResponseRedirect from django.db.models import Case, When, Value, IntegerField, Count, F from django.contrib.auth.mixins import LoginRequiredMixin from LandingPage.models import User from LandingPage.models import Show from LandingPage.models import Season from LandingPage.models import Episode from LandingPage.models import Submission, SubmissionVote from . import forms import datetime # Create your views here. # Index page of a show class IndexView(TemplateView): template_name = "show.html" def get_context_data(self, abbreviation, **kwargs): ctx = super().get_context_data() # Get show by abbreviation, add episode count to the show and return only the first object show = Show.objects.filter(abbr=abbreviation).first() # 404 if not show: raise Http404("Show does not exist") # Get all seasons of the show and annotate episode counts onto them seasons = show.seasons.all() # Add fields to context ctx['show'] = show ctx['seasons'] = seasons return ctx # Episodes page of a show class EpisodeView(TemplateView): template_name = "episode.html" def get_context_data(self, abbreviation, season, episode, **kwargs): ctx = super().get_context_data() # Get show by abbreviation show = Show.objects.filter(abbr=abbreviation).first() # Get episode by season and episode number episode = Episode.objects.filter(show=show,season__number=season,episode=episode).first() # 404's if not show: raise Http404("Show does not exist") if not episode: raise Http404("Episode does not exist") # I acknowledge that this is a mess. A functional mess. But a mess nonetheless. Hey, that rhymed! submissions = episode.submissions.annotate( positives=Count( Case( When( votes__positive=True, then=Value(1) ) ) ), negatives=Count('votes') - F('positives'), score=F('positives') - F('negatives') ).order_by('-score') # Add fields to context ctx['show'] = show ctx['episode'] = episode ctx['submissions'] = submissions return ctx # Submission form GET and POST @login_required def SubmissionForm(req, abbreviation, season, episode): show = Show.objects.get(abbr=abbreviation) episode = Episode.objects.filter(show=show,season__number=season,episode=episode).first() user = req.user # 404's if not show: raise Http404("Show does not exist") if not episode: raise Http404("Episode does not exist") form = forms.SubmissionForm() # Request context ctx = { 'form': form, 'show': show, 'episode': episode } # Handle POST if req.method == 'POST': form = forms.SubmissionForm(req.POST) ctx['form'] = form if form.is_valid(): form_data = form.cleaned_data # Check if the URL has already been submitted if Submission.objects.filter(episode=episode,url=form_data['url']).count() > 0: ctx['error'] = 'This URL has already been submitted!' return render(req, "submit.html", ctx) # Check if there has been a submission by this user for this episode within the last 24 hours if Submission.objects.filter(user=user,episode=episode,timestamp__gte=datetime.datetime.now() - datetime.timedelta(hours=24)).count() > 0: ctx['error'] = 'You can only submit one link for an episode in 24 hours!' return render(req, "submit.html", ctx) # Have to do this because you can't add fields to a form # If you know a better way of doing this, be my guest new_submission = form.save(commit=False) new_submission.user = user new_submission.episode = episode new_submission.save() return HttpResponseRedirect('/show/%s/episode/%d/%d'%(abbreviation, episode.season.number, episode.episode)) else: ctx['error'] = 'Invalid fields!' return render(req, "submit.html", ctx) # Vote request # /show/{{abbr}}/vote/{{submission id}}/{{positive == 1}} class SubmissionVoteSubmit(LoginRequiredMixin, View): def post (self, req, abbreviation, subid, positive): # Convert positive parameter into a boolean pos_bool = int(positive) == 1 user = req.user # Get the submission from the database submission = Submission.objects.filter(id=subid).first() # 404 if not submission: raise Http404("Submission does not exist") # Prevent voting for own submission if submission.user == user: return HttpResponse('

Error

You cannot vote for your own submission.

', status=400) # Allow changing a vote from positive to negative or vice-versa. Delete vote if its a re-vote vote = submission.votes.filter(user=user,submission__id=submission.id).first() if vote: if not vote.positive == pos_bool: vote.positive = pos_bool vote.save() else: vote.delete() else: new_vote = SubmissionVote( user=user, submission=submission, positive=pos_bool ) new_vote.save() return HttpResponseRedirect('/show/%s/episode/%d/%d'%(abbreviation, submission.episode.season.number, submission.episode.episode))