[Backport] Fixing upvote downvote api

remotes/origin/issue/4217/improving-mail-design
Alejandro Alonso 2016-10-13 11:18:28 +02:00 committed by David Barragán Merino
parent 15b61257ee
commit 8eb4bc2b3c
1 changed files with 14 additions and 10 deletions

View File

@ -23,6 +23,8 @@ from django.db import transaction as tx
from django.apps import apps from django.apps import apps
from django.contrib.auth import get_user_model from django.contrib.auth import get_user_model
from django_pglocks import advisory_lock
from .models import Votes, Vote from .models import Votes, Vote
@ -37,14 +39,15 @@ def add_vote(obj, user):
:param user: User adding the vote. :class:`~taiga.users.models.User` instance. :param user: User adding the vote. :class:`~taiga.users.models.User` instance.
""" """
obj_type = apps.get_model("contenttypes", "ContentType").objects.get_for_model(obj) obj_type = apps.get_model("contenttypes", "ContentType").objects.get_for_model(obj)
vote, created = Vote.objects.get_or_create(content_type=obj_type, object_id=obj.id, user=user) with advisory_lock("vote-{}-{}".format(obj_type.id, obj.id)):
if not created: vote, created = Vote.objects.get_or_create(content_type=obj_type, object_id=obj.id, user=user)
return if not created:
return
votes, _ = Votes.objects.get_or_create(content_type=obj_type, object_id=obj.id) votes, _ = Votes.objects.get_or_create(content_type=obj_type, object_id=obj.id)
votes.count = F('count') + 1 votes.count = F('count') + 1
votes.save() votes.save()
return vote return vote
@tx.atomic @tx.atomic
@ -58,9 +61,10 @@ def remove_vote(obj, user):
:param user: User removing her vote. :class:`~taiga.users.models.User` instance. :param user: User removing her vote. :class:`~taiga.users.models.User` instance.
""" """
obj_type = apps.get_model("contenttypes", "ContentType").objects.get_for_model(obj) obj_type = apps.get_model("contenttypes", "ContentType").objects.get_for_model(obj)
qs = Vote.objects.filter(content_type=obj_type, object_id=obj.id, user=user) with advisory_lock("vote-{}-{}".format(obj_type.id, obj.id)):
if not qs.exists(): qs = Vote.objects.filter(content_type=obj_type, object_id=obj.id, user=user)
return if not qs.exists():
return
qs.delete() qs.delete()