[Backport] Fixing upvote downvote api
parent
15b61257ee
commit
8eb4bc2b3c
|
@ -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()
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue