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
"""
from django.db import models
from django.db import models, IntegrityError
from django.utils import timezone
from django.contrib import admin
from django.core.validators import MaxValueValidator, MinValueValidator
@ -160,6 +160,36 @@ class Question(models.Model):
"""
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):
"""
@ -193,4 +223,14 @@ class Vote(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
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🥳")
return HttpResponseRedirect(reverse("polls:results", args=(question.id,)))
else:
messages.success(request, "You vote successfully🥳")
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,)))
else:
messages.error(request, "You cannot vote by typing the URL.")