launchx/innovate/views.py

131 lines
4.7 KiB
Python

from django.shortcuts import render, redirect
from .forms import CompetitorFormset, CompetitorForm, TeamForm, ScoreForm
from .models import Competitor, Team, Judge, Score
from django.contrib.auth.decorators import login_required
from django.template.loader import render_to_string
from django.utils.html import strip_tags
from django.core.mail import EmailMultiAlternatives, send_mail
from config.settings import EMAIL_HOST_USER
# Create your views here.
def home(request):
return render(request, 'innovate/index.html')
def signup(request):
formset = CompetitorFormset(queryset=Competitor.objects.none())
team_form = TeamForm()
if request.method == 'POST':
formset = CompetitorFormset(request.POST)
team_form = TeamForm(request.POST, request.FILES)
if formset.is_valid() and team_form.is_valid():
team = team_form.save()
is_leader = True
members = []
for form in formset:
name = form.cleaned_data.get('name')
email = form.cleaned_data.get('email')
school = form.cleaned_data.get('school')
county = form.cleaned_data.get('school')
if name and email and school and county:
m = Competitor(name=name, email=email, school=school, county=county, is_leader=is_leader, team=team)
is_leader = False
members.append(m)
send_confirmation(request, team, members)
for m in members:
m.save()
return redirect('landing')
return render(request, 'innovate/signup.html', {'formset': formset, 'team_form': team_form})
def send_confirmation(request, team, members):
subject = "🥳 InnovateTJ Signup Confirmation"
recepients = []
for member in members:
recepients.append(member.email)
context = {
'team': team,
'members': members
}
html_message = render_to_string('innovate/email_template.html', context=context)
plain_message = strip_tags(html_message)
sender = [EMAIL_HOST_USER]
email = EmailMultiAlternatives(
subject,
plain_message,
EMAIL_HOST_USER,
recepients,
reply_to=sender
)
email.attach_alternative(html_message, "text/html")
email.send(fail_silently=False)
def confirm(request):
return render(request, 'innovate/confirm.html')
@login_required
def portal(request):
judge = Judge.objects.get(user=request.user)
team_numbers = [team.number for team in Team.objects.all() if ((team.number % 2 == 0 and judge.isEven) or (team.number % 2 != 0 and not judge.isEven))]
teams, completed_teams = [], []
for number in team_numbers:
if Score.objects.filter(team=Team.objects.get(number=number), judge=judge).count() == 0:
teams.append(Team.objects.get(number=number))
else:
completed_teams.append((Team.objects.get(number=number), Score.objects.get(team=Team.objects.get(number=number), judge=judge)))
context = {
'teams': teams,
'completed_teams': completed_teams,
'completed_teams_count': len(completed_teams),
'teams_count': len(team_numbers)
}
return render(request, 'innovate/portal.html', context=context)
@login_required
def feedback(request):
form = ScoreForm()
judge = Judge.objects.get(user=request.user)
if type(judge) != Judge:
print('no team or judge')
return redirect('judges-portal')
if request.method == 'POST':
form = ScoreForm(request.POST)
if form.is_valid():
team = Team.objects.get(number=request.POST['team_number'])
if ((team.number % 2 != 0 and judge.isEven) or (team.number % 2 == 0 and not judge.isEven)):
print('judge not approved')
return redirect('judges-portal')
score = form.save(commit=False)
score.judge = judge
score.team = team
score.feedback = form.cleaned_data['feedback']
score.save()
return redirect('judges-portal')
elif request.GET.get('team'):
team = Team.objects.get(number=request.GET['team'])
if team == None:
print('no team or judge')
elif ((team.number % 2 != 0 and judge.isEven) or (team.number % 2 == 0 and not judge.isEven)):
print('judge not approved')
elif Score.objects.filter(team=team, judge=judge).count() != 0:
print('feedback already exists')
else:
context = {
'team': team,
'judge': judge,
'form': form,
}
return render(request, 'innovate/feedback.html', context=context)
return redirect('judges-portal')