Source code for backend.search

"""
search.py
==============
Endpoints for operations related to matching users. All routes start with
/api/search
All incoming request parameters are wrapped in a JSON body.
All outgoing response returns are wrapped in a JSON entry with key 'payload',
like this:

.. code-block::

    {
      "error": "false",
      "error-msg": None,
        "payload": {
        "return-1": "true"
      }
    }


Note that method documentation assumes you are using jsonResponse/errorResponse
to generate the response, and only shows the actual returns within payload.
Ditto for request parameters.
"""
from flask import (
    Blueprint, flash, g, redirect, render_template, request, session, url_for, current_app
)
bp = Blueprint('search', __name__, url_prefix='/api/search')
from form_response import *

[docs]@bp.route('/get', methods=['POST']) def search_results(): """ POST /get get search results Parameters ---------- name: str case-insensitive name search classes: list(str) name of classes to search for major: str major to search for bytes: int[42] availibility to search for Returns ------- tutors: list(str) list of UIDs of tutors which match search criteria Raises ------ BadRequest Some part of the required parameters is missing. See Also -------- backend.schedule: magic 42 """ redis_client = current_app.config['RDSCXN'] if request.method == 'POST': data = request.get_json() if not data: error = 'Data Body Required' return errorResponse(error) name = data.get('name') cla = data.get('classes') schedule = data.get('bytes') users = redis_client.keys('user*') uid_list = [] if not schedule: return errorResponse('Please include bytes (schedule)') if not name: name = '' if not cla: cla = [] for u in users: user = redis_client.hgetall(u) uid = int(u[4:]) user_name = construct_name(user) classes = redis_client.lrange("classes{}".format(uid), 0, -1) cla = set(cla) classes = set(classes) if 'isTutor' in user.keys(): isTutor = user['isTutor']=="1" else: isTutor = False user_sched = list(map(int, redis_client.lrange('schedule{}'.format(uid), 0, -1))) overlaps = schedule_overlaps(schedule, user_sched) if ((name != '' and user_name.lower().find(name.lower()) >= 0) or (len(cla.intersection(classes)) > 0) or overlaps) and isTutor: uid_list.append(uid) return jsonResponse(uid_list) return jsonResponse()
[docs]def construct_name(user): """ Helper function for search. Not used in requests.""" name = [] if 'fname' in user.keys(): name.append(user['fname']) if 'lname' in user.keys(): name.append(user['lname']) return ' '.join(name)
[docs]def schedule_overlaps(schedule, user_sched): """ Helper function for search. Not used in requests.""" if not schedule or not user_sched: return False for i in range(len(schedule)): if schedule[i] == 1 and user_sched[i] == 1: return True return False