from django.template import RequestContext from django.shortcuts import render from django.views import View from django.views.generic.base import TemplateView 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 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 def SubmissionForm(req, abbreviation, season, episode): show = Show.objects.get(abbr=abbreviation) episode = Episode.objects.filter(show=show,season__number=season,episode=episode).first() # Check for login status if not 'user_id' in req.session: return HttpResponse('

Error

You need to be logged in to submit. Please log in

', status=400) user = User.objects.get(user_id=req.session['user_id']) # 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(View): def post (self, req, abbreviation, subid, positive): # Convert positive parameter into a boolean pos_bool = int(positive) == 1 # Check for login status if not 'user_id' in req.session: return HttpResponse('

Error

You need to be logged in to vote. Please log in

', status=400) user = User.objects.get(user_id=req.session['user_id']) # 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))