From e4f31bff6b03f676236b8619cff7a2188a9036aa Mon Sep 17 00:00:00 2001 From: sosokker Date: Tue, 12 Sep 2023 16:31:03 +0700 Subject: [PATCH] Add a way to do up,down vote in model --- polls/migrations/0010_sentimentvote.py | 28 ++++++++++++++++ polls/models.py | 44 ++++++++++++++++++++++++-- polls/views.py | 2 +- 3 files changed, 71 insertions(+), 3 deletions(-) create mode 100644 polls/migrations/0010_sentimentvote.py diff --git a/polls/migrations/0010_sentimentvote.py b/polls/migrations/0010_sentimentvote.py new file mode 100644 index 0000000..564797e --- /dev/null +++ b/polls/migrations/0010_sentimentvote.py @@ -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')}, + }, + ), + ] diff --git a/polls/models.py b/polls/models.py index 217b0bb..a9c0508 100644 --- a/polls/models.py +++ b/polls/models.py @@ -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}" \ No newline at end of file + 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'] \ No newline at end of file diff --git a/polls/views.py b/polls/views.py index ca199e0..3cd85c0 100644 --- a/polls/views.py +++ b/polls/views.py @@ -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.")