Skip to content

Commit

Permalink
bug(search functionality): fix search functionality
Browse files Browse the repository at this point in the history
- Fix search by author

[Fixes  #163183529]
  • Loading branch information
Nta1e committed Jan 30, 2019
1 parent 9bf19a7 commit 9e628fa
Show file tree
Hide file tree
Showing 12 changed files with 395 additions and 9 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -97,4 +97,5 @@ db.sqlite3
.vscode/
.DS_Store/
*.swp
authors/apps/.DS_Store
# migrations/
133 changes: 133 additions & 0 deletions authors/apps/articles/migrations/0001_initial.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
# Generated by Django 2.1.3 on 2019-01-14 17:26

from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):

initial = True

dependencies = [
]

operations = [
migrations.CreateModel(
name='Article',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('title', models.CharField(db_index=True, max_length=255)),
('body', models.TextField(db_index=True)),
('description', models.CharField(db_index=True, max_length=255)),
('slug', models.SlugField(max_length=255, unique=True)),
('published', models.BooleanField(default=True)),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('favourited', models.BooleanField(default=False)),
('favouriteCount', models.IntegerField(default=0)),
('likes_count', models.IntegerField(default=0)),
('read_time', models.IntegerField(default=0)),
('view_count', models.IntegerField(default=0)),
('read_count', models.IntegerField(default=0)),
('facebook_shares', models.IntegerField(default=0)),
('twitter_shares', models.IntegerField(default=0)),
('email_shares', models.IntegerField(default=0)),
('avg_rating', models.DecimalField(decimal_places=1, default=0, max_digits=3)),
],
options={
'ordering': ['-created_at', '-updated_at'],
},
),
migrations.CreateModel(
name='ArticleImg',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('image_url', models.URLField(blank=True, null=True)),
('description', models.CharField(db_index=True, max_length=255)),
('position_in_body_before', models.IntegerField(null=True)),
],
),
migrations.CreateModel(
name='Bookmarks',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('article_slug', models.CharField(max_length=225)),
],
),
migrations.CreateModel(
name='ComentLikes',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('like', models.BooleanField()),
],
),
migrations.CreateModel(
name='Comments',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('comment_body', models.TextField()),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now_add=True)),
('likes_count', models.IntegerField(default=0)),
],
options={
'get_latest_by': ['created_at'],
},
),
migrations.CreateModel(
name='Favourites',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('favourite', models.BooleanField(default=False)),
],
),
migrations.CreateModel(
name='Likes',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('like', models.BooleanField()),
],
),
migrations.CreateModel(
name='Ratings',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('user_id', models.IntegerField()),
('rating', models.IntegerField()),
],
),
migrations.CreateModel(
name='Readings',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('read_count', models.IntegerField(default=0)),
],
),
migrations.CreateModel(
name='ReportArticle',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('reason', models.CharField(db_index=True, max_length=255)),
('reported_at', models.DateTimeField(auto_now_add=True)),
],
options={
'ordering': ['-reported_at'],
},
),
migrations.CreateModel(
name='Shares',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('platform', models.CharField(max_length=10)),
('article', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='articles.Article')),
],
),
migrations.CreateModel(
name='Tag',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('tag', models.CharField(max_length=255)),
('slug', models.SlugField(unique=True)),
],
),
]
124 changes: 124 additions & 0 deletions authors/apps/articles/migrations/0002_auto_20190114_1726.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
# Generated by Django 2.1.3 on 2019-01-14 17:26

from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):

initial = True

dependencies = [
('articles', '0001_initial'),
('profiles', '0001_initial'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]

operations = [
migrations.AddField(
model_name='shares',
name='user',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL),
),
migrations.AddField(
model_name='reportarticle',
name='article_id',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='articles.Article'),
),
migrations.AddField(
model_name='reportarticle',
name='article_slug',
field=models.ForeignKey(db_column='slug', null=True, on_delete=django.db.models.deletion.CASCADE, related_name='a_slug', to='articles.Article', to_field='slug'),
),
migrations.AddField(
model_name='reportarticle',
name='reported_by',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='profiles.Profile'),
),
migrations.AddField(
model_name='readings',
name='article',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='articles.Article'),
),
migrations.AddField(
model_name='readings',
name='author',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL),
),
migrations.AddField(
model_name='ratings',
name='article',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='articles.Article'),
),
migrations.AddField(
model_name='likes',
name='article',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='articles.Article'),
),
migrations.AddField(
model_name='likes',
name='profile',
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='profiles.Profile'),
),
migrations.AddField(
model_name='favourites',
name='article',
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='article_id', to='articles.Article'),
),
migrations.AddField(
model_name='favourites',
name='profile',
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='profiles.Profile'),
),
migrations.AddField(
model_name='comments',
name='article',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='articles.Article'),
),
migrations.AddField(
model_name='comments',
name='author',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL),
),
migrations.AddField(
model_name='comments',
name='parent',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='articles.Comments'),
),
migrations.AddField(
model_name='comentlikes',
name='comment',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='articles.Comments'),
),
migrations.AddField(
model_name='comentlikes',
name='profile',
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='profiles.Profile'),
),
migrations.AddField(
model_name='bookmarks',
name='article',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='articles.Article'),
),
migrations.AddField(
model_name='bookmarks',
name='profile',
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='profiles.Profile'),
),
migrations.AddField(
model_name='articleimg',
name='article',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='articles.Article'),
),
migrations.AddField(
model_name='article',
name='author',
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='profiles.Profile'),
),
migrations.AddField(
model_name='article',
name='tags',
field=models.ManyToManyField(related_name='articles', to='articles.Tag'),
),
]
3 changes: 2 additions & 1 deletion authors/apps/articles/pagination.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,4 +16,5 @@ def get_paginated_response(self, data):
'total_pages': self.page.paginator.num_pages,
'current_page': self.page.number,
'results': data
})
})

1 change: 1 addition & 0 deletions authors/apps/articles/relations.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,3 +17,4 @@ def to_internal_value(self, data):

def to_representation(self, value):
return value.tag

16 changes: 11 additions & 5 deletions authors/apps/articles/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@
ReportArticle,
Ratings
)


class ArticleImgSerializer(serializers.ModelSerializer):

class Meta:
Expand Down Expand Up @@ -58,7 +60,7 @@ def update(self, instance, validated_data):
instance.tags.clear()
for tag in tags:
instance.tags.add(tag)

for (key, value) in validated_data.items():
setattr(instance, key, value)

Expand All @@ -80,13 +82,14 @@ class Meta:
class UpdateRetrieveArticleViewSerializer(serializers.ModelSerializer):
author = ProfileSerializer(read_only=True)
tagList = TagField(many=True, required=False, source='tags')

class Meta:
model = Article
"""
List all of the fields that could possibly be included in a request
or response, this includes fields specified explicitly above.
"""
fields = ['id','title', 'body', 'description', 'tagList',
fields = ['id', 'title', 'body', 'description', 'tagList',
'author', 'slug', 'published', 'created_at', 'updated_at', ]


Expand All @@ -111,6 +114,7 @@ class Meta:
'article', 'favourite', 'profile'
]


class LikeArticleViewSerializer(serializers.ModelSerializer):
article = CreateArticleViewSerializer(read_only=True)

Expand Down Expand Up @@ -160,6 +164,7 @@ class Meta:
fields = ['article_id', 'article_slug',
'reported_by', 'reason', 'reported_at', ]


class FacebookShareSeriaizer(serializers.ModelSerializer):
"""
This class increments number of shares for an article via the facebook platform
Expand All @@ -176,10 +181,11 @@ class EmailShareSeriaizer(serializers.ModelSerializer):
"""
This class increments number of shares for an article via the facebook platform
"""



class RatingSerializer(serializers.ModelSerializer):
rating = serializers.IntegerField(read_only=False)

class Meta:
model = Ratings
fields = ['article','user_id','rating']
fields = ['article', 'user_id', 'rating']
43 changes: 43 additions & 0 deletions authors/apps/articles/test/test_search_functionality.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
from rest_framework.views import status
from .base import BaseTestArticles
from ...authentication.models import User
from ....apps.profiles.models import Profile
from ..models import Article



class SearchFunctionalityTestCase(BaseTestArticles):

def test_search_by_author(self):
self.client.credentials(
HTTP_AUTHORIZATION='Bearer ' + self.login_user())
self.client.post(
'/api/articles/', data=self.article, format='json')
self.client.post(
'/api/articles/', data=self.article, format='json')
response = self.client.get(
'/api/articles/search?author=henry1',format='json')
self.assertEqual(response.status_code, status.HTTP_200_OK)

def test_search_by_tag(self):
self.client.credentials(
HTTP_AUTHORIZATION='Bearer ' + self.login_user())
self.client.post(
'/api/articles/', data=self.article, format='json')
self.client.post(
'/api/articles/', data=self.article, format='json')
response = self.client.get(
'/api/articles/search?tag=Rails',format='json')
self.assertEqual(response.status_code, status.HTTP_200_OK)

def test_search_by_tag_and_author(self):
self.client.credentials(
HTTP_AUTHORIZATION='Bearer ' + self.login_user())
self.client.post(
'/api/articles/', data=self.article, format='json')
self.client.post(
'/api/articles/', data=self.article, format='json')
response = self.client.get(
'/api/articles/search?tag=Rails&author=henry1',format='json')
self.assertEqual(response.status_code, status.HTTP_200_OK)

Loading

0 comments on commit 9e628fa

Please sign in to comment.