Skip to content

Commit

Permalink
Merge e600bcc into e13c5dc
Browse files Browse the repository at this point in the history
  • Loading branch information
AmosWels committed Oct 18, 2018
2 parents e13c5dc + e600bcc commit 3eeb4e5
Show file tree
Hide file tree
Showing 7 changed files with 102 additions and 25 deletions.
7 changes: 2 additions & 5 deletions authors/apps/articles/models.py
Original file line number Diff line number Diff line change
@@ -1,17 +1,14 @@
from authors.apps.authentication.models import User
from django.conf import settings
from django.contrib.postgres.fields import ArrayField
from django.db import models
from django.db.models import Avg, Count
from django.utils import timezone
from django.utils.text import slugify
from taggit.managers import TaggableManager

from .utils import get_unique_slug, time

from django.contrib.postgres.fields import ArrayField
from authors.apps.authentication.models import User

from .utils import get_unique_slug, time
from taggit.managers import TaggableManager


class Category(models.Model):
Expand Down
6 changes: 6 additions & 0 deletions authors/apps/articles/renderers.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,14 @@ class RateUserJSONRenderer(AhJSONRenderer):
charset = 'utf-8'
object_label = 'rate'


class CategoryJSONRenderer(AhJSONRenderer):
charset = 'utf-8'
object_label = 'category'


class ShareArticleJSONRenderer(AhJSONRenderer):
charset = 'utf-8'
object_label = 'share'


12 changes: 12 additions & 0 deletions authors/apps/articles/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -82,3 +82,15 @@ def validate(self, data):

def get_favorites_count(self, instance):
return instance.favorited_by.count()


class ShareEmailSerializer(serializers.Serializer):
email = serializers.EmailField(max_length=255)

def check(self, data):
email = data.get['email', None]

if email is None:
raise serializers.ValidationError(
'An email is required to share.'
)
16 changes: 11 additions & 5 deletions authors/apps/articles/urls.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
from django.urls import path

from .views import (ArticleAPIView, ArticleAPIDetailsView,
RateArticleView, LikeArticleView, LikeAPIDetailsView,
TagListAPIView, TagRetrieveAPIView, CategoryListCreateAPIView, CategoryRetrieveAPIView, FavoriteArticleView, UnFavoriteArticleView)
from .views import (
ArticleAPIView, ArticleAPIDetailsView,
RateArticleView, LikeArticleView, LikeAPIDetailsView,
TagListAPIView, TagRetrieveAPIView, CategoryListCreateAPIView,
CategoryRetrieveAPIView, FavoriteArticleView, UnFavoriteArticleView,
ShareArticleAPIView,)

app_name = "articles"

Expand All @@ -13,13 +16,16 @@
path('articles/<str:slug>/rating/', RateArticleView.as_view()),
path('articles/<str:slug>/like/',
LikeArticleView.as_view(), name='like_article'),
path('articles/<str:slug>/share/',
ShareArticleAPIView.as_view(), name='share_article'),
path('articles/<str:slug>/dislike/',
LikeAPIDetailsView.as_view(), name='dislike'),
path("tags/", TagListAPIView.as_view()),
path("tags/<str:tag_name>/", TagRetrieveAPIView.as_view()),
path("categories/", CategoryListCreateAPIView.as_view()),
path("categories/<str:cat_name>/", CategoryRetrieveAPIView.as_view()),
path('articles/<str:slug>/favorite/',FavoriteArticleView.as_view(), name = "favorite"),
path('articles/<str:slug>/unfavorite/',UnFavoriteArticleView.as_view(), name = "unfavorite")
path('articles/<str:slug>/favorite/', FavoriteArticleView.as_view(), name="favorite"),
path('articles/<str:slug>/unfavorite/', UnFavoriteArticleView.as_view(), name="unfavorite")


]
62 changes: 47 additions & 15 deletions authors/apps/articles/views.py
Original file line number Diff line number Diff line change
@@ -1,28 +1,27 @@
import json

from authors.apps.articles.renderers import ArticleJSONRenderer
from authors.apps.articles.serializers import ArticleSerializer, TagSerializer
from django.core.exceptions import ObjectDoesNotExist
from django.core.paginator import EmptyPage, PageNotAnInteger, Paginator
from django.core.mail import EmailMessage
from django.http import JsonResponse
from django.shortcuts import get_object_or_404, render
from rest_framework import generics, serializers, status
from rest_framework import filters, generics, serializers, status
from rest_framework.exceptions import PermissionDenied, ValidationError
from rest_framework.generics import ListCreateAPIView
from rest_framework.permissions import (AllowAny, IsAuthenticated,
IsAuthenticatedOrReadOnly)
from rest_framework.response import Response
from django.http import JsonResponse
from rest_framework.views import APIView
from taggit.models import Tag

from .exceptions import TagHasNoArticles, CatHasNoArticles
from .models import Article, LikeArticle, RateArticle, Category
from rest_framework import filters
from .exceptions import TagHasNoArticles
from .renderers import (ArticleJSONRenderer, LikeUserJSONRenderer,
RateUserJSONRenderer, TagJSONRenderer, CategoryJSONRenderer)
from .serializers import (ArticleSerializer, LikeArticleSerializer,
RateArticleSerializer, CategorySerializer)
from authors.apps.articles.renderers import ArticleJSONRenderer
from authors.apps.articles.serializers import ArticleSerializer, TagSerializer

from .exceptions import CatHasNoArticles, TagHasNoArticles
from .models import Article, Category, LikeArticle, RateArticle
from .renderers import (ArticleJSONRenderer, CategoryJSONRenderer,
LikeUserJSONRenderer, RateUserJSONRenderer,
ShareArticleJSONRenderer, TagJSONRenderer)
from .serializers import (ArticleSerializer, CategorySerializer,
LikeArticleSerializer, RateArticleSerializer,
ShareEmailSerializer)


class TagListAPIView(generics.ListAPIView):
Expand Down Expand Up @@ -263,3 +262,36 @@ def delete(self, request, *args, **kwargs):
serializer = self.serializer_class(article)

return Response(serializer.data, status=status.HTTP_200_OK)


class ShareArticleAPIView(generics.CreateAPIView):
permission_classes = (IsAuthenticated,)
renderer_classes = (ShareArticleJSONRenderer,)
serializer_class = ShareEmailSerializer

def create(self, request, *args, **kwargs):
article_slug = self.kwargs['slug']
article = get_object_or_404(Article, slug=article_slug)
share = request.data.get('share', {})
serializer = self.serializer_class(data=share)
serializer.is_valid(raise_exception=True)
share_data = serializer.data
self.shareArticleMail(
share, request, share_data, article)
return Response(share_data, status=status.HTTP_200_OK)

def shareArticleMail(self, share, request, share_data, article):
user_instance = self.request.user
host = request.get_host()
user = user_instance.username
subject = article.title
share_slug = article.slug
body = 'Click on the link below to view Article! \n\n \
{}/api/articles/{}/ \n\n shared by [ {} ]'.format(
host, share_slug, user)
to_email = [share['email']]
email = EmailMessage(subject, body, to=to_email,)
email.send()
share_data.update({
'message': 'Article shared succesfully'
})
19 changes: 19 additions & 0 deletions tests/test_articles/test_articles.py
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,25 @@ def test_filter_title(self):
response = self.client.get('/api/articles/?title={}/'.format(title),
format="json")
self.assertEqual(response.status_code, status.HTTP_200_OK)

def test_share_article(self):
self.create_login_user()
article = self.client.post('/api/articles/',self.create_article,
format="json")
articleslug = article.data["slug"]
response = self.client.post('/api/articles/{}/share/'.format(articleslug),
self.share_article, format="json")
self.assertEqual(response.status_code, status.HTTP_200_OK)

def test_share_wrong_article_slug(self):
self.create_login_user()
article = self.client.post('/api/articles/',self.create_article,
format="json")
articleslug = "j"
response = self.client.post('/api/articles/{}/share/'.format(articleslug),
self.share_article, format="json")
self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)




Expand Down
5 changes: 5 additions & 0 deletions tests/test_authentication/test_base.py
Original file line number Diff line number Diff line change
Expand Up @@ -152,3 +152,8 @@ def __init__(self):
"likes": True,
}
}
self.share_article = {
"share": {
"email": self.email
}
}

0 comments on commit 3eeb4e5

Please sign in to comment.