Skip to content

Commit

Permalink
like dislike functionality working
Browse files Browse the repository at this point in the history
  • Loading branch information
Daniel Lwetabe authored and Daniel Lwetabe committed Apr 10, 2019
1 parent dac6abd commit e7f099d
Show file tree
Hide file tree
Showing 5 changed files with 87 additions and 5 deletions.
14 changes: 13 additions & 1 deletion authors/apps/articles/migrations/0001_initial.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Generated by Django 2.2 on 2019-04-05 07:50
# Generated by Django 2.2 on 2019-04-10 13:00

from django.db import migrations, models
import django.db.models.deletion
Expand All @@ -23,10 +23,22 @@ class Migration(migrations.Migration):
('body', models.TextField()),
('createdAt', models.DateTimeField(auto_now_add=True)),
('updatedAt', models.DateTimeField(auto_now=True)),
('likes', models.IntegerField(default=0)),
('dislikes', models.IntegerField(default=0)),
('author', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='author', to='profiles.Profile')),
],
options={
'get_latest_by': ['id'],
},
),
migrations.CreateModel(
name='ArticleLikeDislike',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('likes', models.BooleanField(default=False, null=True)),
('createdAt', models.DateTimeField(auto_now_add=True)),
('article', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='articles.Article')),
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='profiles.Profile')),
],
),
]
10 changes: 9 additions & 1 deletion authors/apps/articles/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,10 @@ class Article(models.Model):
author = models.ForeignKey(Profile, on_delete=models.CASCADE,
related_name='author')

#like-dislike
likes = models.IntegerField(default=0)
dislikes = models.IntegerField(default=0)

class Meta:
get_latest_by = ['id']

Expand All @@ -30,4 +34,8 @@ def get_slug(title):
def __str__(self):
return self.title


class ArticleLikeDislike(models.Model):
user = models.ForeignKey(Profile, on_delete=models.CASCADE)
article = models.ForeignKey(Article, on_delete=models.CASCADE)
likes = models.BooleanField(default=False, null=True)
createdAt = models.DateTimeField(auto_now_add=True)
10 changes: 10 additions & 0 deletions authors/apps/articles/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,13 @@ class Meta:
fields = '__all__'
model = models.Article
read_only_fields = ['author','slug']

class ArticleLikeDislikeSerializer(serializers.ModelSerializer):
class Meta:
fields = ["user", "article", "likes", "createdAt"]
model = models.ArticleLikeDislike
extra_kwargs = {
'user': {'write_only': True},
'article': {'write_only': True},
}
unique_together=["user", "likes"]
3 changes: 2 additions & 1 deletion authors/apps/articles/urls.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
from django.urls import path
from .views import ListCreateArticle, RetrieveUpdateDestroyArticle
from .views import ListCreateArticle, RetrieveUpdateDestroyArticle, ArticleLikeDislikeView

app_name = "article_application"
urlpatterns = [
path('articles/', ListCreateArticle.as_view(), name='list-articles'),
path('articles/<int:pk>', RetrieveUpdateDestroyArticle.as_view(), name='auth-articles'),
path('articles/<int:pk>/like', ArticleLikeDislikeView.as_view(), name='like-dislike'),
]
55 changes: 53 additions & 2 deletions authors/apps/articles/views.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from django.shortcuts import render
from rest_framework import generics ,status
from .models import Article
from .models import Article, ArticleLikeDislike
from authors.apps.profiles.models import Profile
from . import serializers
from rest_framework.response import Response
Expand Down Expand Up @@ -42,4 +42,55 @@ class RetrieveUpdateDestroyArticle(generics.RetrieveUpdateDestroyAPIView):
queryset = Article.objects.all()
serializer_class = serializers.ArticleSerializer


class ArticleLikeDislikeView(generics.GenericAPIView):
"""
Article should be liked or disliked and toggle
"""
permission_classes = (IsAuthenticatedOrReadOnly,)
serializer_class = serializers.ArticleLikeDislikeSerializer

def post(self, request, pk):
article = Article.objects.filter(pk=pk).first()
likes = request.data["likes"]
# querty = ArticleLikeDislike.objects.filter(article_id=article.id,
# user_id=request.user.id)
# liked_article = querty if querty else
query = ArticleLikeDislike.objects.filter(article_id=article.id,
user_id=request.user.id)
liked_article = query if query is not None else liked_article.update(likes=False)
# if liked_article:
#if row does not exist, create row with data below
#if likes == True:
serializer_data = self.serializer_class(data={
"user": request.user.id,
"article": article.id,
"likes": likes
})

serializer_data.is_valid(raise_exception=True)
serializer_data.save()
#data is going to be returned in the response

data = {
"article": article.title,
"username": request.user.username,
"details": serializer_data.data
}
# else:
# #like is toggled by user when endpoint is triggered twice OR ++
# value = not (liked_article.first().likes)
# liked_article.update(likes=value)
# data = {
# "article": article.title,
# "username": request.user.username,
# "details": {
# "likes": liked_article.first().likes,
# "created_at": liked_article.first().created_at
# }
# }
# updates the number of likes and dislikes of a given article
likes = ArticleLikeDislike.objects.filter(article_id=article.id, likes=True)
dislikes = ArticleLikeDislike.objects.filter(article_id=article.id, likes=False)
Article.objects.filter(pk=pk).update(likes=likes.count() , dislikes=dislikes.count())

return Response(data, status=status.HTTP_200_OK)

0 comments on commit e7f099d

Please sign in to comment.