Skip to content

Commit

Permalink
Merge 01878c4 into 8bd64d4
Browse files Browse the repository at this point in the history
  • Loading branch information
ElishaMisoi committed May 8, 2019
2 parents 8bd64d4 + 01878c4 commit 730b317
Show file tree
Hide file tree
Showing 9 changed files with 376 additions and 6 deletions.
18 changes: 18 additions & 0 deletions authors/apps/articles/migrations/0019_auto_20190507_0905.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Generated by Django 2.1 on 2019-05-07 09:05

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('articles', '0018_auto_20190501_0942'),
]

operations = [
migrations.AlterField(
model_name='articlemodel',
name='description',
field=models.CharField(max_length=100),
),
]
14 changes: 14 additions & 0 deletions authors/apps/articles/migrations/0021_merge_20190508_1054.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# Generated by Django 2.1 on 2019-05-08 10:54

from django.db import migrations


class Migration(migrations.Migration):

dependencies = [
('articles', '0019_auto_20190507_0905'),
('articles', '0020_merge_20190508_0813'),
]

operations = [
]
33 changes: 33 additions & 0 deletions authors/apps/articles/migrations/0022_auto_20190508_1135.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# Generated by Django 2.1 on 2019-05-08 11:35

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('articles', '0021_merge_20190508_1054'),
]

operations = [
migrations.AlterField(
model_name='articlemodel',
name='description',
field=models.TextField(),
),
migrations.AlterField(
model_name='articlemodel',
name='num_vote_down',
field=models.IntegerField(default=0),
),
migrations.AlterField(
model_name='articlemodel',
name='num_vote_up',
field=models.IntegerField(default=0),
),
migrations.AlterField(
model_name='articlemodel',
name='vote_score',
field=models.IntegerField(default=0),
),
]
14 changes: 14 additions & 0 deletions authors/apps/articles/migrations/0026_merge_20190508_1408.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# Generated by Django 2.1 on 2019-05-08 14:08

from django.db import migrations


class Migration(migrations.Migration):

dependencies = [
('articles', '0022_auto_20190508_1135'),
('articles', '0025_merge_20190508_1042'),
]

operations = [
]
4 changes: 3 additions & 1 deletion authors/apps/articles/urls.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from django.urls import path, include
from rest_framework import routers
from .views import ArticleView, CommentView, LikeView, DisLikeView, FavoriteArticle
from .views import (ArticleView, CommentView, LikeView,
DisLikeView, FavoriteArticle, ArticleList)


router = routers.DefaultRouter()
Expand All @@ -15,4 +16,5 @@
path('articles/<slug>/favorite/', FavoriteArticle.as_view({'post': 'create',
'get': 'list',
'delete': 'destroy'})),
path('article/search/', ArticleList.as_view(), name='article-search'),
]
18 changes: 18 additions & 0 deletions authors/apps/articles/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
import datetime
from rest_framework.response import Response
from .models import User
from .models import ArticleModel
from django_filters import FilterSet, rest_framework


def ImageUploader(image):
Expand Down Expand Up @@ -93,3 +95,19 @@ def add_social_share(request):
request['title'], request['url'])

return request


class ArticleFilter(FilterSet):
"""
Custom filter class for articles
"""
title = rest_framework.CharFilter('title',
lookup_expr='icontains')
author = rest_framework.CharFilter('author__username',
lookup_expr='icontains')
tag = rest_framework.CharFilter('tagList',
lookup_expr='icontains')

class Meta:
model = ArticleModel
fields = ("title", "author", "tag")
38 changes: 34 additions & 4 deletions authors/apps/articles/views.py
Original file line number Diff line number Diff line change
@@ -1,17 +1,18 @@
from django.shortcuts import render
from rest_framework import (generics, permissions,
status, views, viewsets, serializers)
filters, status, views, viewsets, serializers)
from rest_framework.generics import ListAPIView
from rest_framework.response import Response
from rest_framework.pagination import PageNumberPagination
from rest_framework.decorators import permission_classes
from .serializers import ArticleSerializer, TABLE, CommentSerializer, FavoriteArticleSerializer
from .serializers import (ArticleSerializer, TABLE,
CommentSerializer, FavoriteArticleSerializer)
from django.contrib.auth.models import User
from ..authentication.models import User
from .models import ArticleModel, FavoriteArticleModel
from rest_framework.permissions import (
IsAuthenticatedOrReadOnly, IsAuthenticated, IsAdminUser, AllowAny
)

from django.utils import timezone
from django.http import JsonResponse
from django.core.files.storage import FileSystemStorage
Expand All @@ -27,7 +28,9 @@
)
from rest_framework.exceptions import ValidationError
from .utils import (ImageUploader, user_object,
configure_response, add_social_share)
configure_response, add_social_share, ArticleFilter)
from django_filters.rest_framework import DjangoFilterBackend
from django.shortcuts import get_object_or_404


class ArticleView(viewsets.ModelViewSet):
Expand Down Expand Up @@ -448,3 +451,30 @@ def destroy(self, request, slug=None, *args, **kwargs):
'error': 'Article with slug {} not found'.format(slug)
}
return Response(data=response, status=status.HTTP_404_NOT_FOUND)


class ArticleList(ListAPIView):
permission_classes = [AllowAny]
queryset = ArticleModel.objects.all()
serializer_class = ArticleSerializer
filter_backends = (DjangoFilterBackend, filters.SearchFilter, )
filter_class = ArticleFilter
search_fields = ('author__username', 'description', 'body', 'title', )

def list(self, request):
# with filter
queryset = self.filter_queryset(self.get_queryset())

# pagination
page = self.paginate_queryset(queryset)
serializer = self.get_serializer(page, many=True)
dictionary = None
data = []
if serializer.data:
for article in serializer.data:
dictionary = dict(article)
dictionary = add_social_share(dictionary)
dictionary['author'] = user_object(dictionary['author'])
data.append(dictionary)
return self.get_paginated_response(data=data)
return Response({'status': 404, 'message': 'We could not find what you are looking for.'}, status=404)
7 changes: 6 additions & 1 deletion authors/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@
'threadedcomments',
'django_comments',
'authors.apps.ratings',
'django_filters',
]

COMMENTS_APP = 'fluent_comments'
Expand Down Expand Up @@ -163,15 +164,19 @@

'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_jwt.authentication.JSONWebTokenAuthentication',

),

'DEFAULT_PERMISSION_CLASSES': (
'authors.apps.profiles.permissions.IsGetOrIsAuthenticated',
),
'DEFAULT_PAGINATION_CLASS':
'rest_framework.pagination.LimitOffsetPagination',
'PAGE_SIZE':
env.int('DJANGO_DEFAULT_PAGE_SIZE', default=25),

'DEFAULT_FILTER_BACKENDS': (
'django_filters.rest_framework.DjangoFilterBackend',
),
}

# jwt authentication settings
Expand Down
Loading

0 comments on commit 730b317

Please sign in to comment.