Skip to content

Commit

Permalink
Merge branch 'updated-search-capabilities' of github.com:ubclaunchpad…
Browse files Browse the repository at this point in the history
…/bounce into updated-search-capabilities
  • Loading branch information
bfbachmann committed Mar 23, 2019
2 parents f847571 + bd1b87e commit c3a5d25
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 22 deletions.
33 changes: 16 additions & 17 deletions bounce/db/user.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
from sqlalchemy import Column, Integer, String, desc, func, or_
from sqlalchemy.orm import relationship
from sqlalchemy.types import TIMESTAMP
# from sqlachemy import or

from . import BASE

Expand Down Expand Up @@ -63,39 +62,39 @@ def select_by_id(session, user_id):
return session.query(User).filter(User.identifier == user_id).first()


def search(session, fullname=None, username=None, id=None,
email=None, created_at=None, page=0, size=MAX_SIZE):
def search(session,
full_name=None,
username=None,
identifier=None,
email=None,
created_at=None,
page=0,
size=MAX_SIZE):
"""Returns a list of users that contain content from the user's query"""
# number used for offset is the
# page number multiplied by the size of each page

offset_num = page * size
users = session.query(User)
not_null_filters = []

triggered = False
if fullname or username or email or id or created_at:
triggered = True
not_null_filters = []

if fullname:
not_null_filters.append(User.full_name.ilike(f'%{fullname}%'))
if full_name:
not_null_filters.append(User.full_name.ilike(f'%{full_name}%'))
if username:
not_null_filters.append(User.username.ilike(f'%{username}%'))
# users = users.filter(User.username.ilike(f'%{username}%'))
if email:
# users = users.filter(User.email.ilike(f'%{email}%'))
not_null_filters.append(User.email.ilike(f'%{email}%'))
if id:
# users = users.filter(User.id.ilike(f'%{id}%'))
not_null_filters.append(User.id == int(id))
if identifier:
not_null_filters.append(User.id.ilike(f'%{identifier}%'))
if created_at:
# users = users.filter(User.created_at.ilike(f'%{created_at}%'))
not_null_filters.append(User.id.ilike(f'%{id}%'))
not_null_filters.append(User.id.ilike(f'%{created_at}%'))

# TODO: implement search_vector functionality:
# users = users.filter(User.search_vector.match(query))
# Currently search_vector column isn't working properly

if not triggered:
if not not_null_filters:
# show users ordered by most recently created
users = users.order_by(desc(User.created_at))
else:
Expand Down
11 changes: 7 additions & 4 deletions bounce/server/api/users.py
Original file line number Diff line number Diff line change
Expand Up @@ -225,22 +225,24 @@ async def get(self, session, request):
"""Handles a GET /club/search request by returning
users that contain content from the query."""

# pylint: disable=too-many-locals
full_name = None
username = None
email = None
id = None
identifier = None
created_at = None

if 'full_name' in request.args:
full_name = request.args.get('full_name', None)
full_name = request.args['full_name']
if 'username' in request.args:
username = request.args['username']
if 'email' in request.args:
email = request.args['email']
if 'id' in request.args:
id = request.args['id']
identifier = request.args['id']
if 'created_at' in request.args:
created_at = request.args['created at']
# pylint: enable=too-many-locals

page = int(request.args['page'])

Expand All @@ -251,7 +253,8 @@ async def get(self, session, request):
raise APIError('size too low', status=400)

queried_users, result_count, total_pages = user.search(
session, full_name, email, id, username, created_at, page, size)
session, full_name, email, identifier, username,
created_at, page, size)
if not queried_users:
# Failed to find users that match the query
raise APIError('No users match your query', status=404)
Expand Down
3 changes: 2 additions & 1 deletion tests/api/endpoints/test_1_users_and_login.py
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,8 @@ def test_paginate_users__failure(server):


def test_search_users__success(server):
_, response = server.app.test_client.get('/users/search?full_name=gin&username=gin')
_, response = server.app.test_client.get(
'/users/search?username=gin&full_name=gin')
assert response.status == 200
body = response.json
assert len(body.get('results')) == 2
Expand Down

0 comments on commit c3a5d25

Please sign in to comment.