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 14, 2019
1 parent 9bf19a7 commit bf07583
Show file tree
Hide file tree
Showing 11 changed files with 383 additions and 3 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

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)

1 change: 1 addition & 0 deletions authors/apps/articles/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -862,6 +862,7 @@ def post(self, request, slug):
avg.update_avg_articles_table(rated["article"], a["avg_rating"])

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

class ArticlesFilter(filters.FilterSet):
tag = filters.CharFilter(field_name='tags__tag', lookup_expr='exact')
author = filters.CharFilter(field_name='author__user__username', lookup_expr='exact')
Expand Down
37 changes: 37 additions & 0 deletions authors/apps/authentication/migrations/0001_initial.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
# Generated by Django 2.1.3 on 2019-01-14 17:26

from django.db import migrations, models


class Migration(migrations.Migration):

initial = True

dependencies = [
('auth', '0009_alter_user_last_name_max_length'),
]

operations = [
migrations.CreateModel(
name='User',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('password', models.CharField(max_length=128, verbose_name='password')),
('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')),
('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')),
('username', models.CharField(db_index=True, max_length=255, unique=True)),
('email', models.EmailField(db_index=True, max_length=254, unique=True)),
('is_active', models.BooleanField(default=True)),
('social_id', models.CharField(db_index=True, max_length=255, null=True)),
('is_verified', models.BooleanField(default=False)),
('is_staff', models.BooleanField(default=False)),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.Group', verbose_name='groups')),
('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.Permission', verbose_name='user permissions')),
],
options={
'abstract': False,
},
),
]
1 change: 1 addition & 0 deletions authors/apps/authentication/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ def post(self, request, *args, **kwargs):
serializer.save()
address = serializer.data['email']
user = User.objects.filter(email=user['email']).first()


RegistrationAPIView.generate_activation_link(user, request)
return Response({"message": "A verification email has been sent to {}".format(
Expand Down
Loading

0 comments on commit bf07583

Please sign in to comment.