Poll_App / polls /views.py
Anuj-Panthri's picture
edit bug fixes
e3a5295
from django.shortcuts import render,get_object_or_404
from django.http import HttpResponse,Http404,HttpResponseRedirect,JsonResponse
from django.contrib.auth import login as auth_login,logout as auth_logout
from django.contrib.auth import get_user_model
from django.contrib.auth.decorators import login_required
from django.urls import reverse
import json
from .models import Question,Choice,Vote,ThemeColor
from .forms import UserSignupForm,UserLoginForm
User = get_user_model() # user model
# Create your views here.
login_url="/login/"
@login_required(login_url=login_url)
def index(request):
latest_questions_list = Question.objects.order_by("-pub_date")[:5]
for q in latest_questions_list:
q.has_voted=q.has_user_voted(request.user)
# print(latest_questions_list[0].has_voted)
context={"latest_questions_list":latest_questions_list,
}
return render(request,"polls/index.html",context)
@login_required(login_url=login_url)
def vote(request):
if request.method=='POST':
json_data=json.loads(request.body)
print(json_data)
choice=get_object_or_404(Choice,pk=json_data['choice_id'])
# check if already has voted on this question
old_vote_on_same_question=Vote.objects.filter(user=request.user,choice__question=choice.question)
if len(old_vote_on_same_question)>0:
return JsonResponse({
"message":"error",
'error_message':"you have already voted !"
})
vote=Vote.objects.create(choice=choice,user=request.user)
vote.save()
# get percentage of each choice for showing result
vote_percent_dict={c.pk:c.vote_percent for c in choice.question.choice_set.all()}
# print(vote_percent_dict)
return JsonResponse({
"message":"success",
"vote_percent_dict" :vote_percent_dict,
})
def signup(request):
form=UserSignupForm(request.POST or None)
context={}
if form.is_valid():
form.save()
# successfully login the user
auth_login(request,User.objects.get(email=form.cleaned_data['email']))
next_url=request.POST['next'] if request.POST['next']!='' else reverse("polls:index")
return HttpResponseRedirect(next_url)
if form.is_bound:
data={}
fields=['username','email']
for field in fields:
if form.errors.get(field) is None:
data[field]=form.data[field]
context['errors']=form.errors
context['data']=data
print(data)
# print(form.errors.as_json())
return render(request,"polls/signup.html",context)
def login(request):
form = UserLoginForm(request.POST or None)
context={}
if form.is_valid():
# print(form.cleaned_data)
email=form.cleaned_data.get('email')
password=form.cleaned_data.get('password')
try:
user = User.objects.get(email=email)
# print(user)
if user.check_password(password):
# successfully login the user
auth_login(request,user)
next_url=request.POST['next'] if request.POST['next']!='' else reverse("polls:index")
return HttpResponseRedirect(next_url)
else:
# incorrect password
form.add_error('password','incorrect password.')
except User.DoesNotExist:
# add error no such user
form.add_error('email','No Account associated with this email.')
if form.is_bound:
data={}
fields=['email']
for field in fields:
if form.errors.get(field) is None:
data[field]=form.data[field]
context={'errors':form.errors,
'data':data}
# print(context)
return render(request,"polls/login.html",context)
@login_required(login_url=login_url)
def create(request):
if request.method=="GET":
context={}
if "q" in request.GET:
context['q']=get_object_or_404(Question,pk=request.GET['q'])
# "No such question exists"
if context['q'].author!=request.user:
# they don't have access to this question
raise Http404("this question does't belongs to you.")
# get themes
themes=ThemeColor.objects.all()
context["themes"]=themes
return render(request,'polls/create.html',context)
json_data=json.loads(request.body)
print(json_data)
if "theme_color" in json_data:
theme_color=ThemeColor.objects.get(pk=json_data['theme_color'])
else:
theme_color=None
if "id" in json_data:
question=get_object_or_404(Question,pk=json_data['id'])
question.choice_set.all().delete()
else:
question=Question.objects.create(author=request.user,question_text=json_data['question_text'])
question.author=request.user
question.question_text=json_data['question_text']
question.theme_color=theme_color
question.save()
for choice_text in json_data['choice_text_list']:
choice=Choice.objects.create(question=question,choice_text=choice_text)
choice.save()
return JsonResponse({
"redirect":reverse("polls:index")
})
@login_required(login_url=login_url)
def your_polls(request):
latest_questions_list = Question.objects.filter(author=request.user).order_by("-pub_date")[:5]
for q in latest_questions_list:
q.has_voted=q.has_user_voted(request.user)
context={"latest_questions_list":latest_questions_list,
"canDelete":True}
return render(request,'polls/your_polls.html',context)
@login_required(login_url=login_url)
def your_votes(request):
user_voted_questions = Vote.objects.filter(user=request.user)
user_voted_questions = Choice.objects.filter(vote_set__in=user_voted_questions)
user_voted_questions = Question.objects.filter(choice_set__in=user_voted_questions)
# user_voted_questions = Question.objects.all()
print(user_voted_questions)
# print(user_voted_questions[0].choice_set)
for q in user_voted_questions:
q.has_voted=True
context={"latest_questions_list":user_voted_questions}
return render(request,'polls/your_votes.html',context)
@login_required(login_url=login_url)
def detail(request,question_id):
try:
question=Question.objects.get(pk=question_id)
except Question.DoesNotExist:
raise Http404("Question Does Not Exists")
# question=get_object_or_404(Question,pk=question_id)
question.has_voted=question.has_user_voted(request.user)
return render(request,"polls/detail.html",{"latest_questions_list":[question]})
def logout(request):
auth_logout(request)
return HttpResponseRedirect(reverse('polls:login'))
@login_required(login_url=login_url)
def delete_view(request):
if request.method=="POST":
json_data=json.loads(request.body)
question=get_object_or_404(Question,pk=json_data['question_id'])
question.delete()
return JsonResponse({"message":"success"})
def settings(request):
raise Http404()