Add a way to do up,down vote in model

This commit is contained in:
sosokker 2023-09-12 16:31:03 +07:00
parent c2ab9ee760
commit e4f31bff6b
3 changed files with 71 additions and 3 deletions

View File

@ -0,0 +1,28 @@
# Generated by Django 4.2.4 on 2023-09-12 09:10
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('polls', '0009_tag_remove_choice_votes_vote_question_tags'),
]
operations = [
migrations.CreateModel(
name='SentimentVote',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('vote_types', models.BooleanField()),
('question', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='polls.question')),
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
options={
'unique_together': {('user', 'question')},
},
),
]

View File

@ -9,7 +9,7 @@ Attributes:
None None
""" """
from django.db import models from django.db import models, IntegrityError
from django.utils import timezone from django.utils import timezone
from django.contrib import admin from django.contrib import admin
from django.core.validators import MaxValueValidator, MinValueValidator from django.core.validators import MaxValueValidator, MinValueValidator
@ -160,6 +160,36 @@ class Question(models.Model):
""" """
return self.vote_set.count() return self.vote_set.count()
# ! Most of the code from https://stackoverflow.com/a/70869267
def upvote(self, user):
try:
self.sentimentvote_set.create(user=user, question=self, vote_types=True)
self.up_vote_count += 1
self.save()
except IntegrityError:
vote = self.sentimentvote_set.filter(user=user)
if vote[0].vote_types == False:
vote.update(vote_types=True)
self.save()
else:
return 'already_upvoted'
return 'ok'
def downvote(self, user):
try:
self.sentimentvote_set.create(user=user, question=self, vote_types=False)
self.up_vote_count += 1
self.save()
except IntegrityError:
vote = self.sentimentvote_set.filter(user=user)
if vote[0].vote_types == True:
vote.update(vote_types=False)
self.save()
else:
return 'already_downvoted'
return 'ok'
class Choice(models.Model): class Choice(models.Model):
""" """
@ -194,3 +224,13 @@ class Vote(models.Model):
def __str__(self): def __str__(self):
return f"{self.user} voted for {self.choice} in {self.question}" return f"{self.user} voted for {self.choice} in {self.question}"
# ! Most of the code from https://stackoverflow.com/a/70869267
class SentimentVote(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
question = models.ForeignKey(Question, on_delete=models.CASCADE)
vote_types = models.BooleanField()
class Meta:
unique_together = ['user', 'question']

View File

@ -112,8 +112,8 @@ def vote(request, question_id):
messages.success(request, "You vote successfully🥳") messages.success(request, "You vote successfully🥳")
return HttpResponseRedirect(reverse("polls:results", args=(question.id,))) return HttpResponseRedirect(reverse("polls:results", args=(question.id,)))
else: else:
messages.success(request, "You vote successfully🥳")
Vote.objects.create(choice=selected_choice, user=request.user, question=question).save() Vote.objects.create(choice=selected_choice, user=request.user, question=question).save()
messages.success(request, "You vote successfully🥳")
return HttpResponseRedirect(reverse("polls:results", args=(question.id,))) return HttpResponseRedirect(reverse("polls:results", args=(question.id,)))
else: else:
messages.error(request, "You cannot vote by typing the URL.") messages.error(request, "You cannot vote by typing the URL.")