예제 #1
0
def get_popular_major(request, id='asdas31asdada'):
    """

    :param request:
    :param id: you will receive a school id (str) (required)
    :return: you need to return a list of popular majors of this school
    10 tags will look good on the page.
    [{
        'name': "Computer Science"
    },{},...]
    and use JsonResponseResult().ok(data=data) return
    if there is any exception raised,
    use JsonResponseResult().error(data=[], msg="explain your error", code="500") return
    """

    logger.info("func 'get_popular_major' get a param id -> " + id)
    connection = ConnectionPool()
    result = connection.executeQuery("\
        match(n)-[]-(m {name: '" + id + "'})\
        match(n)-[]-(c)\
        return labels(c) as c, c.name\
        ")

    detail = []
    for item in result:
        if item['c'][0] == "n_pop_majors_node":
            detail.append(item['c.name'])
    data = []
    for major in detail:
        data.append({'name': major})

    return JsonResponseResult().ok(data=data)
예제 #2
0
def get_loc_data(request, id='asdas31asdada'):
    """

    :param request:
    :param id: you will receive a school id (str) (required)
    :return: you need to return a list of historical ranking data of this school
    {
        "markers": [
                {'label': 'School',
                 'color': 'blue',
                 'lat': '40.702147',
                 'lng': '-74.015794',
                 'size': 'normal'}
            ],
        "center": "Los Angeles, CA"
    }
    and use JsonResponseResult().ok(data=data) return
    if there is any exception raised,
    use JsonResponseResult().error(data=[], msg="explain your error", code="500") return
    """
    logger.info("func 'get_ranking_data' get a param id -> " + id)
    connection = ConnectionPool()
    result = connection.executeQuery("\
        match(n)-[]-(m {name: '" + id + "'})\
            match(n)-[]-(c)\
            return labels(c) as c, c.name\
            ")
    detail, data = {}, {}
    for item in result:
        if item['c'][0] == "addr_node":
            detail['address'] = item.get('c.name', '')
        if item['c'][0] == "city_node":
            detail['city'] = item.get('c.name', '')
        if item['c'][0] == "state_node":
            detail['state'] = item.get('c.name', '')

    center_str = detail['city'] + ", " + detail['state']
    markers = []
    if '' != detail['address']:
        lag, lng = address2geo(detail['address'], center_str)
        markers.append({
            'label': 'School',
            'color': 'orange',
            'lat': lag,
            'lng': lng,
            'size': 'normal'
        })

    data['markers'] = markers
    data['center'] = center_str

    return JsonResponseResult().ok(data=data)
예제 #3
0
def testNeo4j(request):
    """
    This func just tell you how to connect to neo4j and do the search
    :param request:
    :return:
    """
    connection = ConnectionPool()
    # result = connection.executeQuery(
    #     "MATCH (cloudAtlas2 {title: $param, tagline: $param1}) RETURN cloudAtlas2",
    #         param="Cloud Atlas",
    #         param1="Everything is connected")
    result2 = connection.executeQuery(
        "MATCH (tom:Person {name: \"Tom Hanks\"})-[:ACTED_IN]->(tomHanksMovies) RETURN tom,tomHanksMovies"
    )
    return JsonResponseResult().ok(data=result2)
예제 #4
0
def tag_query(tag_str):
    connection = ConnectionPool()
    data_objs = []
    for school in tag_str:
        result = connection.executeQuery("match (node_school {name: '" +
                                         school + "'})\
            match (node_school)-[:AVG_ACT]->(node_avg_act) \
            match (node_school)-[r:HAS_QS_RANK]->(node_qs_rank) \
            match (node_school)-[:HAS_TUITION_OF]->(node_tuition)\
            match (node_school)-[:HAS_SAT_MAX_OF]->(node_sat_max)\
            match (node_school)-[:HAS_SAT_MIN_OF]->(node_sat_min)\
            match (node_school)-[:ID]->(node_id)\
            match (node_school)-[:IS_TYPE]->(node_school_type)\
            match (node_school)-[:IN_REGION]->(node_region)\
            match (node_school)-[:HAS_LOGO]->(node_logo)\
            match (node_school)-[:HAS_CC_SCORE]->(node_cc_score)\
            match (node_school)-[:HAS_ADDRESS]->(node_address)\
            match (node_school)-[:HAS_STATE]->(node_state)\
            match (node_school)-[:HAS_CITY]->(node_city)\
            match (node_school)-[:HAS_ZIP]->(node_zip)\
            match (node_school)-[:HAS_WEBSITE]->(node_web)\
            match (node_school)-[:IS_TYPE]->(node_type)\
            match (node_school)-[:ACCEPT_RATE]->(node_accept_rate)\
            match (node_school)-[:HAS_STUDENT_FACULTY_RATIO_OF]->(node_s_f_ratio)\
            match (node_school)-[:HAS_SETTING]->(node_school_setting)\
            match (node_school)-[:HAS_SIZE]->(node_size)\
            match (node_school)-[:HAS_TELEPHONE]->(node_telephone)\
            return node_id.name, node_school.name, node_logo.name,\
            node_cc_score.name, node_address.name, node_state.name,\
            node_city.name, node_zip.name, node_tuition.name, node_web.name,\
            node_type.name, node_accept_rate.name, node_sat_max.name,\
            node_sat_min.name, node_telephone.name, node_qs_rank.name, \
            node_s_f_ratio.name,node_school_setting.name, node_size.name,\
            node_avg_act.name LIMIT 90\
        ")
        data_objs.append(result)
    return data_objs
예제 #5
0
def index(request):
    """
    this func is using to render the index page when user first clicked our app.
    :param request: Nothing send here.
    :return: no matter what happened you need to return a dict_list (element in list is dict)
    [{
        'id': '1',                      # -> school_id (str)
        'name': 'University of AAAAAA', # -> school name (str)
        'logo': 'school_logo.jpg',      # -> school-name.jpg (str) e.g. university-of-southern-california.jpg
        'desc': '',                     # -> school description (str)
        'rating': {
            'QS': 5,                    # -> QS score  (float)
            'CC': 3,                    # -> college confidential score  (float)
        },
        'review': '3453',               # -> # of review (str)
        'detail': 'detail/1',           # -> its detail link, just combine detail + "/" + school_id
        'address': '1420 22nd W St, Los Angeles, CA, 90007',
        'tuition': '$17,234',           # -> tuition (str)
        'school_type': 'Private School',# -> school type
        'ACT': '1500-1570',             # -> ACT score range
        'acceptance_rate': '7.88%'
    }, {}, ...]
    and use JsonResponseResult().ok(data=data) return
    if there is any exception raised,
    use JsonResponseResult().error(data=[], msg="explain your error", code="500") return
    """
    logger.info("revoked func 'index'")
    connection = ConnectionPool()
    result = connection.executeQuery(
        "\
        match (node_school)-[r:HAS_QS_RANK]->(node_qs_rank)\
        where 1 <=toInteger(node_qs_rank.name) <= 15\
        match (node_school)-[:AVG_ACT]->(node_avg_act)\
        match (node_school)-[:HAS_SAT_MAX_OF]->(node_sat_max)\
        where node_sat_max.name is not null\
        match (node_school)-[:HAS_SAT_MIN_OF]->(node_sat_min)\
        where node_sat_min.name is not null\
        match (node_school)-[:HAS_TUITION_OF]->(node_tuition)\
        match (node_school)-[:ID]->(node_id)\
        match (node_school)-[:HAS_LOGO]->(node_logo)\
        match (node_school)-[:HAS_WEBSITE]->(node_web)\
        match (node_school)-[:HAS_CC_SCORE]->(node_cc_score)\
        match (node_school)-[:HAS_ADDRESS]->(node_address)\
        match (node_school)-[:HAS_STATE]->(node_state)\
        match (node_school)-[:HAS_CITY]->(node_city)\
        match (node_school)-[:HAS_ZIP]->(node_zip)\
        match (node_school)-[:HAS_TUITION_OF]->(node_tuition)\
        match (node_school)-[:IS_TYPE]->(node_type)\
        match (node_school)-[:HAS_SIZE]->(node_size)\
        match (node_school)-[:ACCEPT_RATE]->(node_accept_rate)\
        match (node_school)-[:HAS_TELEPHONE]->(node_telephone)\
        match (node_school)-[:AVG_GPA]->(node_gpa)\
        match (node_school)-[:HAS_STUDENT_FACULTY_RATIO_OF]->(node_s_f_ratio)\
        match (node_school)-[:HAS_SETTING]->(node_school_setting)\
        return node_id.name, node_school.name, node_logo.name,\
        node_cc_score.name, node_address.name, node_state.name,\
        node_city.name, node_zip.name, node_tuition.name,\
        node_type.name, node_accept_rate.name, node_sat_max.name,\
        node_sat_min.name, node_telephone.name, node_avg_act.name,\
        node_qs_rank.name, node_gpa.name, node_web.name, node_size.name,\
        node_s_f_ratio.name,node_school_setting.name\
        order by toInteger(node_qs_rank.name)\
        limit 36\
        ")

    data = []
    for school in result:
        obj = {
            'id': school.get('node_id.name', ''),
            'name': school.get('node_school.name', ''),
            'logo': extract_logo_name(school['node_logo.name']),
            'desc': school['node_school.name'] + " is a " + school.get('node_type.name', 'private')
                    + " research university in " + school.get('node_city.name', 'somewhere')
                    + ". And its campus located in " + school.get('node_school_setting.name', 'unknown') + " area. "
                    + "And its campus size is " + school.get('node_size.name', 'unknown') + ". "
                    + "And its student-faculty-ratio is " + school.get('node_s_f_ratio.name', 'unknown') + " . ",
            'rating': {
                'QS': format_qs_score(school.get('node_qs_rank.name', '')),
                'CC': min(int(float(school['node_cc_score.name']) / 400) + 1, 5)
            },
            'detail': 'detail/' + school.get('node_id.name', ''),
            'address': school.get('node_address.name', '') + ' ' +
                       school.get('node_city.name', '') + ', ' +
                       school.get('node_state.name', '') + ' ' +
                       school.get('node_zip.name', ''),
            'tuition': '$' + str(int(float(school['node_tuition.name']))),
            'school_type': school.get('node_type.name', '').capitalize(),
            'ACT': school.get('node_sat_min.name', '') + '-' + school.get('node_sat_max.name', ''),
            'acceptance_rate': str(round(float(school.get('node_accept_rate.name', '0')) * 100, 2)) + '%',
            'link': school.get('node_web.name', ''),
            'telephone': school.get('node_telephone.name', '')
        }
        data.append(obj)
    return JsonResponseResult().ok(data=data)
예제 #6
0
def get_basic_info(request, id='2005'):
    """
    this fun will be revoked when user click the detail page
    :param request:
    :param id: you will receive a school id (str) (required)
    :return: you need to return an obj of basic info of this school
    {
        "title_info": {
            'main_title': "",
            'duration': "",
            'school_type': "",
            'location': "",
            'school_link': ""
        },
         "desc_info": {
            'title': "",
            'location': "",
            'avg_score': {
                'reading': "",
                'math': "",
                'composite': ""
            },
            'expected_salary': "",
            'cost': {
                'net_price': "",
                'national': "",
                'financial_aid': "",
                'avg_aid_award': ""
            },
            'admission': {
                'acceptance_rate': "",
                'application_ddl': ""
            },
            'students': {
                'undergraduate': "",
                'graduate': "",
                'international': ""
            }
         }
    }
    and use JsonResponseResult().ok(data=data) return
    if there is any exception raised,
    use JsonResponseResult().error(data=[], msg="explain your error", code="500") return
    """
    logger.info("func 'get_basic_info' get a param id -> " + id)
    connection = ConnectionPool()
    result = connection.executeQuery("\
        match(n)-[]-(m {name: '" + id + "'})\
        return n.name\
        ")
    name = result[0]['n.name']
    result = connection.executeQuery("\
        match(n)-[]-(m {name: '" + id + "'})\
        match(n)-[]-(c)\
        return labels(c) as c, c.name\
        ")
    detail = {}
    for item in result:
        if item['c'][0] == "school_type_node":
            detail['setting'] = item['c.name'].capitalize()
        if item['c'][0] == "web_node":
            detail['website'] = item['c.name']
        if item['c'][0] == "read_sat_node":
            detail['read_sat'] = item['c.name']
        if item['c'][0] == "math_sat_node":
            detail['math_sat'] = item['c.name']
        if item['c'][0] == "act_node":
            detail['act'] = item['c.name']
        if item['c'][0] == "addr_node":
            detail['address'] = item['c.name']
        if item['c'][0] == "city_node":
            detail['city'] = item['c.name']
        if item['c'][0] == "state_node":
            detail['state'] = item['c.name']
        if item['c'][0] == "zip_node":
            detail['zip'] = item['c.name']
        if item['c'][0] == "med_earn_6_years_node":
            detail['med_earn'] = item['c.name']
        if item['c'][0] == "tuition_node":
            detail['tuition'] = item['c.name']
        if item['c'][0] == "average_aid_node":
            detail['avg_aid'] = item['c.name']
        if item['c'][0] == "accept_rate_node":
            if item['c.name'] != 'N/A':
                detail['accept_rate'] = str(int(
                    float(item['c.name']) * 100)) + '%'
            else:
                detail['accept_rate'] = item['c.name']
        if item['c'][0] == "app_dead_node":
            detail['app_dead'] = item['c.name']
        if item['c'][0] == "app_fee_node":
            detail['app_fee'] = item['c.name']
        if item['c'][0] == "undergrad_pop_node":
            detail['undergrad_pop'] = item['c.name']
        if item['c'][0] == "grad_pop_node":
            detail['grad_pop'] = item['c.name']
        if item['c'][0] == 'grad_rate_node':
            detail['grad_rate'] = item['c.name']
        if item['c'][0] == 'fresh_ret_node':
            detail['fresh_ret_rate'] = item['c.name']
        if item['c'][0] == 'emp_rate_node':
            detail['emp_rate'] = item['c.name']

    data = {
        "title_info": {
            'main_title': name,
            'duration': '4-Years',
            'school_type': detail.get('setting', '') + " University",
            'location':
            detail.get('city', '') + ', ' + detail.get('state', ''),
            'school_link': detail.get('website', '')
        },
        "desc_info": {
            'title':
            name,
            'location':
            detail.get('address', '') + ' ' + detail.get('city', '') + ', ' +
            detail.get('state', '') + ' ' + detail.get('zip', ''),
            'avg_score': {
                'reading': detail.get('read_sat', ''),
                'math': detail.get('math_sat', ''),
                'composite': detail.get('act', '')
            },
            'app_fee':
            detail.get('app_fee', ''),
            'expected_salary':
            detail.get('med_earn', ''),
            'cost': {
                'net_price': detail.get('tuition', ''),
                'avg_aid_award': detail.get('avg_aid', '')
            },
            'admission': {
                'acceptance_rate': detail.get('accept_rate', ''),
                'application_ddl': detail.get('app_dead', '')
            },
            'students': {
                'undergraduate': detail.get('undergrad_pop', ''),
                'graduate': detail.get('grad_pop', ''),
            },
            'stat': {
                'graduation_rate': detail.get('grad_rate', ''),
                'freshman_retention': detail.get('fresh_ret_rate', ''),
                'employment_rate': detail.get('emp_rate', ''),
                'median_salary': detail.get('med_earn', '')
            }
        }
    }

    return JsonResponseResult(data=data, code=200, msg='success')
예제 #7
0
def get_subject_info_data(request, id="asdasdasdsadas"):
    """

       :param request:
       :param id: you will receive a school id (str) (required)
       :return: you need to return an obj of ACT SAT GPA data of this school
       {
            "niche_ranking": [
                {'item': 'Academic', 'score': 4, 'label': 'A'},
                {'item': 'Academic2', 'score': 4, 'label': 'A'},
                {'item': 'Academic3', 'score': 4, 'label': 'A'},
                {'item': 'Academic4', 'score': 4, 'label': 'A'},
                {'item': 'Academic5', 'score': 4, 'label': 'A'},
            ],
            "over_all_ranking": "A+",
            "title_list": [
                {'item': "National University", 'ranking': 24, 'desc': 'ssssssssssssssssssssssssssss'},
                {'item': "Best College for Veterans", 'ranking': 8, 'desc': 'ssssssssssssssssssssssssssss'},
                {'item': "Best Value Schools", 'ranking': 60, 'desc': 'ssssssssssssssssssssssssssss'},
                {'item': "Top Performers on Social Mobility", 'ranking': 161, 'desc': 'ssssssssssssssssssssssssssss'},
            ]
        }
       and use JsonResponseResult().ok(data=data) return
       if there is any exception raised,
       use JsonResponseResult().error(data=[], msg="explain your error", code="500") return
       """
    logger.info("func 'get_subject_info_data' get a param id -> " + id)
    connection = ConnectionPool()
    result = connection.executeQuery("match(node_school)-[:ID]->(n {name: '" +
                                     id + "'})\
        match(node_school)-[p:HAS_GRADE]->(node_n_grade)\
        return node_school.name, node_n_grade.name, p.grade")

    result2 = connection.executeQuery("match(node_school)-[:ID]->(n {name: '" +
                                      id + "'})\
        match(node_school)-[p:HAS_RANK]->(node_usn_rank)\
        return node_school.name, node_usn_rank.name, p.rank")
    grade = {'A+': 5.0, 'A': 5.0, 'A-': 4.7, 'B+': 4.3, 'B': 4.0, 'B-': 3.7, 'C+': 3.3, \
             'C': 3.0, 'C-': 2.7, 'D+': 2.3, 'D': 2.0, 'D-': 1.7, 'F': 1.0, 'NG': 3.5}

    inv_grade = {v: k for k, v in grade.items()}
    niche = []
    overall_grade = 0
    for item in result:
        overall_grade += grade.get(item.get('p.grade', ''), '')
        if item.get('node_n_grade.name', '') in [
                'Academics', 'Athletics', 'Student Life', 'Party Scene',
                'Safety'
        ]:
            niche.append({
                'item': item.get('node_n_grade.name', ''),
                'score': grade.get(item.get('p.grade', ''), ''),
                'label': item.get('p.grade', '')
            })

    overall_grade /= 12
    overall_rank = ""
    overall_grade = round(overall_grade, 2)
    for k, v in inv_grade.items():
        if overall_grade >= k:
            overall_rank = v
            break

    usn_rank = []
    for item in result2:
        usn_rank.append({
            'item': item.get('node_usn_rank.name', ''),
            'ranking': int(item.get('p.rank', '0'))
        })

    data = {
        "niche_ranking": niche,
        "over_all_ranking": overall_rank,
        "title_list": usn_rank
    }
    return JsonResponseResult().ok(data=data)
예제 #8
0
def get_score_data(request, id="asdasdasdsadas"):
    """

       :param request:
       :param id: you will receive a school id (str) (required)
       :return: you need to return an obj of ACT SAT GPA data of this school
       {
        "score_data": [
            {'item': 'SAT_reading', 'niche': 67.5, 'cc': 60.3},  # div 10
            {'item': 'SAT_writing', 'niche': 64.6, 'cc': 50.6},  # div 10
            {'item': 'SAT_math', 'niche': 71.0, 'cc': 70.1},  # div 10
            {'item': 'ACT', 'niche': 64, 'cc': 68},  # * 2
            {'item': 'GPA', 'niche': 76, 'cc': 74}  # * 20
        ],
        "score_desc": {
            'niche': {
                'sat_range': '1390-1540',
                'act_range': '32-35',
            },
            'cc': {
                'sat': {
                    'reading': 731,
                    'writing': 656,
                    'math': 731,
                },
                'act': 32,
                'gpa': 3.72
            }
        }
      }
       and use JsonResponseResult().ok(data=data) return
       if there is any exception raised,
       use JsonResponseResult().error(data=[], msg="explain your error", code="500") return
       """
    logger.info("func 'get_score_data' get a param id -> " + id)
    connection = ConnectionPool()
    result = connection.executeQuery("\
        match(n)-[]-(m {name: '" + id + "'})\
        match(n)-[]-(c)\
        return labels(c) as c, c.name\
        ")

    detail = {}
    for item in result:
        if item['c'][0] == "read_sat_node":
            if item['c.name'] != 'N/A':
                detail['read_sat'] = item['c.name']
                detail['read'] = item['c.name']
            else:
                detail['read_sat'] = '0'
                detail['read'] = 'N/A'

        if item['c'][0] == "math_sat_node":
            if item['c.name'] != 'N/A':
                detail['math_sat'] = item['c.name']
                detail['math'] = item['c.name']
            else:
                detail['math_sat'] = '0'
                detail['math'] = 'N/A'
        if item['c'][0] == "write_sat_node":
            if item['c.name'] != 'N/A':
                detail['write_sat'] = item['c.name']
                detail['write'] = item['c.name']
            else:
                detail['write_sat'] = '0'
                detail['write'] = 'N/A'
        if item['c'][0] == "act_node":
            if item['c.name'] != 'N/A':
                detail['act'] = item['c.name']
                detail['ACT'] = item['c.name']
            else:
                detail['act'] = '0'
                detail['ACT'] = 'N/A'
        if item['c'][0] == "gpa_node":
            if item['c.name'] != 'N/A':
                detail['gpa'] = item['c.name']
                detail['GPA'] = item['c.name']
            else:
                detail['gpa'] = '0'
                detail['GPA'] = 'N/A'

    data = {
        "score_data": [
            {
                'item': 'SAT_reading',
                'score': int(detail['read_sat']) / 10
            },  # div 10
            {
                'item': 'SAT_writing',
                'score': int(detail['write_sat']) / 10
            },  # div 10
            {
                'item': 'SAT_math',
                'score': int(detail['math_sat']) / 10
            },  # div 10
            {
                'item': 'ACT',
                'score': int(detail['act']) * 2
            },  # * 2
            {
                'item': 'GPA',
                'score': int(float(detail['gpa']) * 20)
            }  # * 20
        ],
        "score_desc": {
            'cc': {
                'sat': {
                    'reading': detail.get('read', ''),
                    'writing': detail.get('write', ''),
                    'math': detail.get('math', ''),
                },
                'act': detail.get('ACT', ''),
                'gpa': detail.get('GPA', '')
            }
        }
    }
    return JsonResponseResult().ok(data=data)
예제 #9
0
def get_fame_property(request, id="asdasda"):
    logger.info("func 'get_fame_property' get a param id -> " + id)
    connection = ConnectionPool()
    result = connection.executeQuery("\
        match(n)-[]-(m {name: '" + id + "'})\
        match(n)-[]-(c)\
        return labels(c) as c, c.name\
        ")
    detail = {}
    affil = []
    athle = []
    for item in result:
        if item['c'][0] == "president_node":
            detail['president'] = item['c.name']
        if item['c'][0] == "motto_node":
            detail['motto'] = item['c.name']
        if item['c'][0] == 'affil_node':
            affil.append({
                'name':
                item['c.name'],
                'link':
                "https://www.dbpedia.org/page/" +
                '_'.join(item['c.name'].split())
            })
        if item['c'][0] == 'athletics_node':
            athle.append({
                'name':
                item['c.name'],
                'link':
                "https://www.dbpedia.org/page/" +
                '_'.join(item['c.name'].split())
            })
        if item['c'][0] == 'mascot_node':
            detail['mascot'] = item['c.name']
        if item['c'][0] == 'school_color_node':
            detail['color'] = item['c.name']

    import requests
    from bs4 import BeautifulSoup
    url = 'https://www.colorhexa.com/color.php'
    colors = []
    if detail['color'] != 'N/A':
        col = [detail['color']]
        for color in col:
            item = color.replace('and', ',')
            item = item.replace('&', ',')
            item = item.replace(':', "")
            item = list(map(lambda s: s.strip(), item.split(',')))
            item = [i for i in item if i]
        for color in item:
            query_data = {'c': color, 'h': 'h'}
            html = requests.post(url, query_data).text
            soup = BeautifulSoup(html, 'html.parser')
            rgb = soup.find('title').string.split()[2]
            colors.append({'name': color, 'rgb': rgb})
    data = {
        "affiliations": affil,
        "athletics": athle,
        "president": {
            "name":
            detail.get('president', ''),
            'profile':
            "",
            'link':
            'https://www.dbpedia.org/page/' +
            '_'.join(detail.get('president', 'N/A').split())
        },
        "motto": {
            'words': detail.get('motto', ''),
            'by': ""
        },
        "color": colors,
        "mascot": {
            'name': detail.get('mascot', ''),
            'logo': "",
            'link': ""
        }
    }
    return JsonResponseResult(data=data, code=200, msg='success')
예제 #10
0
def search_by_major(request, major="major_str"):
    """
     user clicked major label.
     :param major: a str
     :param request: Nothing send here.
     :return: no matter what happened you need to return a dict_list (element in list is dict)
     [{
         'id': '1',                      # -> school_id (str)
         'name': 'University of AAAAAA', # -> school name (str)
         'logo': 'school_logo.jpg',      # -> school-name.jpg (str) e.g. university-of-southern-california.jpg
         'desc': '',                     # -> school description (str)
         'rating': {
             'QS': 5,                 # -> niche score  (float)
             'CC': 3,                    # -> college confidential score  (float)
         },
         'review': '3453',               # -> # of review (str)
         'detail': 'detail/1',           # -> its detail link, just combine detail + "/" + school_id
         'address': '1420 22nd W St, Los Angeles, CA, 90007',
         'tuition': '$17,234',           # -> tuition (str)
         'school_type': 'Private School',# -> school type
         'ACT': '1500-1570',             # -> ACT score range
         'acceptance_rate': '7.88%'
     }, {}, ...]
     and use JsonResponseResult().ok(data=data) return
     if there is any exception raised,
     use JsonResponseResult().error(data=[], msg="explain your error", code="500") return
     """
    logger.info(
        "revoked func search/views.py 'search_by_major' func. major -> " +
        major)

    connection = ConnectionPool()
    majors = "match (node_school)-[:HAS_N_POPULAR_MAJORS]->(node_popular_major {name: '" + major + "'})         "

    result = connection.executeQuery(
        "match (node_school)-[:AVG_ACT]->(node_avg_act) \
        " + majors + "\
         match (node_school)-[r:HAS_QS_RANK]->(node_qs_rank) \
         match (node_school)-[:HAS_TUITION_OF]->(node_tuition)\
         match (node_school)-[:HAS_SAT_MAX_OF]->(node_sat_max)\
         match (node_school)-[:HAS_SAT_MIN_OF]->(node_sat_min)\
         match (node_school)-[:ID]->(node_id)\
         match (node_school)-[:IS_TYPE]->(node_school_type)\
         match (node_school)-[:IN_REGION]->(node_region)\
         match (node_school)-[:HAS_LOGO]->(node_logo)\
         match (node_school)-[:HAS_CC_SCORE]->(node_cc_score)\
         match (node_school)-[:HAS_ADDRESS]->(node_address)\
         match (node_school)-[:HAS_STATE]->(node_state)\
         match (node_school)-[:HAS_CITY]->(node_city)\
         match (node_school)-[:HAS_ZIP]->(node_zip)\
         match (node_school)-[:HAS_WEBSITE]->(node_web)\
         match (node_school)-[:IS_TYPE]->(node_type)\
         match (node_school)-[:ACCEPT_RATE]->(node_accept_rate)\
         match (node_school)-[:HAS_STUDENT_FACULTY_RATIO_OF]->(node_s_f_ratio)\
         match (node_school)-[:HAS_SETTING]->(node_school_setting)\
         match (node_school)-[:HAS_SIZE]->(node_size)\
         match (node_school)-[:HAS_TELEPHONE]->(node_telephone)\
         return node_id.name, node_school.name, node_logo.name,\
         node_cc_score.name, node_address.name, node_state.name,\
         node_city.name, node_zip.name, node_tuition.name, node_web.name,\
         node_type.name, node_accept_rate.name, node_sat_max.name,\
         node_sat_min.name, node_telephone.name, node_qs_rank.name, \
         node_s_f_ratio.name,node_school_setting.name, node_size.name,\
         node_avg_act.name LIMIT 90\
         ")

    data = []
    for school in result:
        if school['node_accept_rate.name'] != 'N/A':
            school['node_accept_rate.name'] = str(
                round(float(school['node_accept_rate.name']) * 100, 2)) + '%'

        obj = {
            'id':
            school['node_id.name'],
            'name':
            school['node_school.name'],
            'logo':
            extract_logo_name(school['node_logo.name']),
            'desc':
            school['node_school.name'] + " is a " +
            school.get('node_type.name', 'private') +
            " research university in " +
            school.get('node_city.name', 'somewhere') +
            ". And its campus located in " +
            school.get('node_school_setting.name', 'unknown') + " area. " +
            "And its campus size is " +
            school.get('node_size.name', 'unknown') + ". " +
            "And its student-faculty-ratio is " +
            school.get('node_s_f_ratio.name', 'unknown') + " . ",
            'rating': {
                'QS': format_qs_score(school.get('node_qs_rank.name', '')),
                'CC':
                min(int(float(school['node_cc_score.name']) / 400) + 1, 5)
            },
            'detail':
            'detail/' + school['node_id.name'],
            'address':
            school['node_address.name'] + ' ' + school['node_city.name'] +
            ' ' + school['node_state.name'] + ', ' + school['node_zip.name'],
            'tuition':
            '$' + school['node_tuition.name'],
            'school_type':
            school['node_type.name'].capitalize(),
            'ACT':
            school['node_sat_min.name'] + '-' + school['node_sat_max.name'],
            'acceptance_rate':
            school['node_accept_rate.name'],
            'link':
            school['node_web.name']
        }
        data.append(obj)

    return JsonResponseResult().ok(data=data)
예제 #11
0
def index(request):
    """
    this func only accept post request, which mean all the params wont show in the path (url)

    :param request: all params saved here. there are:
        content: the value in the input box
        school_type: public | private | other
        filter_content: this is an obj
            if user did not use the filter, you will get a "{}"
            or you will receive an obj like this
            {
                'area': 'New England',
                'major': 'Music, theatre, or dance',
                'tuition': '>= $5k',
                'act': [28, 32],
                'sat': [1500, 1600]
            }
            you can convert it into dict and do further process.

            #TODO -> niche
            when you use niche filter
            you will receive this obj
            {
                "academic":4,
                "dorms":3,
                "food":2,
                "location":1,
                "safety":0,
                "value":1
            }
            [0-4], all value will be int number
            4 -> A+, A, A-,
            3 -> B+, B, B-,
            2 -> C+, C, C-,
            1 -> D+, D, D-,
            0 -> NG

    :return:
    """
    if request.method == "POST" and request.POST:
        search_type = request.POST.get('search_type')
        input_content = request.POST.get('content')
        filter_content = request.POST.get('filter_content')
        print("search_type -> ", search_type)
        print("input_content -> ", input_content)
        print("filter_content -> ", filter_content)
        if "{}" == filter_content:
            # user did not use filter
            print("filert is null")
        else:
            # user used filter
            selected_tags = json.loads(filter_content)

    filter_content = eval(filter_content)

    if 'academic' in filter_content:
        universities = get_cluster_schools(filter_content)
        connection = ConnectionPool()
        data = []
        for uni in universities:
            result = connection.executeQuery("\
                match (node_school {name: '" + uni.strip() + "'})\
                match (node_school)-[:AVG_ACT]->(node_avg_act) \
                match (node_school)-[:HAS_TUITION_OF]->(node_tuition)\
                match (node_school)-[:HAS_SAT_MAX_OF]->(node_sat_max)\
                match (node_school)-[:HAS_SAT_MIN_OF]->(node_sat_min)\
                match (node_school)-[r:HAS_QS_RANK]->(node_qs_rank)\
                match (node_school)-[:ID]->(node_id)\
                match (node_school)-[:HAS_LOGO]->(node_logo)\
                match (node_school)-[:HAS_CC_SCORE]->(node_cc_score)\
                match (node_school)-[:HAS_ADDRESS]->(node_address)\
                match (node_school)-[:HAS_STATE]->(node_state)\
                match (node_school)-[:HAS_CITY]->(node_city)\
                match (node_school)-[:HAS_ZIP]->(node_zip)\
                match (node_school)-[:HAS_WEBSITE]->(node_web)\
                match (node_school)-[:IS_TYPE]->(node_type)\
                match (node_school)-[:ACCEPT_RATE]->(node_accept_rate)\
                match (node_school)-[:HAS_TELEPHONE]->(node_telephone)\
                match (node_school)-[:HAS_STUDENT_FACULTY_RATIO_OF]->(node_s_f_ratio)\
                match (node_school)-[:HAS_SETTING]->(node_school_setting)\
                match (node_school)-[:HAS_SIZE]->(node_size)\
                return node_id.name, node_school.name, node_logo.name,\
                node_cc_score.name, node_address.name, node_state.name,\
                node_city.name, node_zip.name, node_tuition.name, node_web.name,\
                node_type.name, node_accept_rate.name, node_sat_max.name,\
                node_sat_min.name, node_telephone.name,  node_qs_rank.name,\
                node_s_f_ratio.name,node_school_setting.name, node_size.name,\
                node_avg_act.name LIMIT 90\
            ")
            for school in result:
                if school['node_accept_rate.name'] != 'N/A':
                    school['node_accept_rate.name'] = str(
                        round(float(school['node_accept_rate.name']) * 100,
                              2)) + '%'

                obj = {
                    'id':
                    school['node_id.name'],
                    'name':
                    school['node_school.name'],
                    'logo':
                    extract_logo_name(school['node_logo.name']),
                    'desc':
                    school['node_school.name'] + " is a " +
                    school.get('node_type.name', 'private') +
                    " research university in " +
                    school.get('node_city.name', 'somewhere') +
                    ". And its campus located in " +
                    school.get('node_school_setting.name', 'unknown') +
                    " area. " + "And its campus size is " +
                    school.get('node_size.name', 'unknown') + ". " +
                    "And its student-faculty-ratio is " +
                    school.get('node_s_f_ratio.name', 'unknown') + " . ",
                    'rating': {
                        'QS':
                        format_qs_score(school.get('node_qs_rank.name', '')),
                        'CC':
                        min(
                            int(float(school['node_cc_score.name']) / 400) + 1,
                            5)
                    },
                    'detail':
                    'detail/' + school.get('node_id.name', ''),
                    'address':
                    school.get('node_address.name', '') + ' ' +
                    school.get('node_city.name', '') + ' ' +
                    school.get('node_state.name', '') + ', ' +
                    school.get('node_zip.name', ''),
                    'tuition':
                    '$' + school.get('node_tuition.name', ''),
                    'school_type':
                    school.get('node_type.name', '').capitalize(),
                    'ACT':
                    school.get('node_sat_min.name', '') + '-' +
                    school.get('node_sat_max.name', ''),
                    'acceptance_rate':
                    school.get('node_accept_rate.name', ''),
                    'link':
                    school.get('node_web.name', '')
                }
                data.append(obj)
                print(obj)

        return JsonResponseResult().ok(data=data)

    connection = ConnectionPool()

    if input_content != '':
        uni = []
        for item in input_content.split():
            if len(item) > 3:
                uni.append(item.capitalize())
            else:
                uni.append(item)

        uni = ' '.join(uni)
        result = connection.executeQuery("\
            match (node_school {name: '" + uni + "'})\
            match (node_school)-[:AVG_ACT]->(node_avg_act) \
            match (node_school)-[:HAS_TUITION_OF]->(node_tuition)\
            match (node_school)-[:HAS_SAT_MAX_OF]->(node_sat_max)\
            match (node_school)-[:HAS_SAT_MIN_OF]->(node_sat_min)\
            match (node_school)-[r:HAS_QS_RANK]->(node_qs_rank)\
            match (node_school)-[:ID]->(node_id)\
            match (node_school)-[:HAS_LOGO]->(node_logo)\
            match (node_school)-[:HAS_CC_SCORE]->(node_cc_score)\
            match (node_school)-[:HAS_ADDRESS]->(node_address)\
            match (node_school)-[:HAS_STATE]->(node_state)\
            match (node_school)-[:HAS_CITY]->(node_city)\
            match (node_school)-[:HAS_ZIP]->(node_zip)\
            match (node_school)-[:HAS_WEBSITE]->(node_web)\
            match (node_school)-[:IS_TYPE]->(node_type)\
            match (node_school)-[:ACCEPT_RATE]->(node_accept_rate)\
            match (node_school)-[:HAS_TELEPHONE]->(node_telephone)\
            match (node_school)-[:HAS_STUDENT_FACULTY_RATIO_OF]->(node_s_f_ratio)\
            match (node_school)-[:HAS_SETTING]->(node_school_setting)\
            match (node_school)-[:HAS_SIZE]->(node_size)\
            return node_id.name, node_school.name, node_logo.name,\
            node_cc_score.name, node_address.name, node_state.name,\
            node_city.name, node_zip.name, node_tuition.name, node_web.name,\
            node_type.name, node_accept_rate.name, node_sat_max.name,\
            node_sat_min.name, node_telephone.name,  node_qs_rank.name,\
            node_s_f_ratio.name,node_school_setting.name, node_size.name,\
            node_avg_act.name LIMIT 90\
        ")
        data = []
        for school in result:
            if school['node_accept_rate.name'] != 'N/A':
                school['node_accept_rate.name'] = str(
                    round(float(school['node_accept_rate.name']) * 100,
                          2)) + '%'

            obj = {
                'id':
                school['node_id.name'],
                'name':
                school['node_school.name'],
                'logo':
                extract_logo_name(school['node_logo.name']),
                'desc':
                school['node_school.name'] + " is a " +
                school.get('node_type.name', 'private') +
                " research university in " +
                school.get('node_city.name', 'somewhere') +
                ". And its campus located in " +
                school.get('node_school_setting.name', 'unknown') + " area. " +
                "And its campus size is " +
                school.get('node_size.name', 'unknown') + ". " +
                "And its student-faculty-ratio is " +
                school.get('node_s_f_ratio.name', 'unknown') + " . ",
                'rating': {
                    'QS':
                    format_qs_score(school.get('node_qs_rank.name', '')),
                    'CC':
                    min(int(float(school['node_cc_score.name']) / 400) + 1, 5)
                },
                'detail':
                'detail/' + school.get('node_id.name', ''),
                'address':
                school.get('node_address.name', '') + ' ' +
                school.get('node_city.name', '') + ' ' +
                school.get('node_state.name', '') + ', ' +
                school.get('node_zip.name', ''),
                'tuition':
                '$' + school.get('node_tuition.name', ''),
                'school_type':
                school.get('node_type.name', '').capitalize(),
                'ACT':
                school.get('node_sat_min.name', '') + '-' +
                school.get('node_sat_max.name', ''),
                'acceptance_rate':
                school.get('node_accept_rate.name', ''),
                'link':
                school.get('node_web.name', '')
            }
            data.append(obj)

        return JsonResponseResult().ok(data=data)

    majors = area = act = s_type = sat_max = sat_min = tuition = ""
    if 'major' in filter_content:
        major = filter_content['major'].split(',')
        if len(major[0]) != 0:
            for item in major:
                majors += "match (node_school)-[:HAS_N_POPULAR_MAJORS]->(node_popular_major {name: '" + str(
                    item) + "'})         "
        else:
            majors = " "

    if search_type != '':
        s_type = "match (node_school)-[:IS_TYPE]->(node_school_type {name:'" + search_type + "'})"

    for key, value in filter_content.items():
        if key == 'area' and value != '':
            area = "match (node_school)-[:IN_REGION]->(node_region {name: '" + value + "'})" + " "
        if key == 'act' and value != '':
            act = "where " + str(
                filter_content['act']
                [0]) + " <= toInteger(node_avg_act.name) <= " + str(
                    filter_content['act'][1]) + " "
        if key == 'sat' and value != '':
            sat_max = "where " + str(
                filter_content['sat']
                [0]) + "<= toInteger(node_sat_max.name) <= " + str(
                    filter_content['sat'][1]) + " "
            sat_min = "where " + str(
                filter_content['sat']
                [0]) + " <= toInteger(node_sat_min.name)<= " + str(
                    filter_content['sat'][1]) + " "

        if key == 'tuition' and value != '':
            tuition = "where toInteger(node_tuition.name) <= " + str(
                int(''.join(
                    [i for i in filter_content['tuition'] if i.isdigit()])) *
                1000) + " "

    result = connection.executeQuery(
        area + \
        s_type + "\
         match (node_school)-[:AVG_ACT]->(node_avg_act) " \
        + act + "\
         match (node_school)-[:HAS_TUITION_OF]->(node_tuition) "                                                                 + \
        tuition + majors + "\
         match (node_school)-[:HAS_SAT_MAX_OF]->(node_sat_max) "                                                                 + \
        sat_max + "\
         match (node_school)-[:HAS_SAT_MIN_OF]->(node_sat_min) "                                                                 + \
        sat_min + "\
         match (node_school)-[r:HAS_QS_RANK]->(node_qs_rank)\
         match (node_school)-[:ID]->(node_id)\
         match (node_school)-[:HAS_LOGO]->(node_logo)\
         match (node_school)-[:HAS_CC_SCORE]->(node_cc_score)\
         match (node_school)-[:HAS_ADDRESS]->(node_address)\
         match (node_school)-[:HAS_STATE]->(node_state)\
         match (node_school)-[:HAS_CITY]->(node_city)\
         match (node_school)-[:HAS_ZIP]->(node_zip)\
         match (node_school)-[:HAS_WEBSITE]->(node_web)\
         match (node_school)-[:IS_TYPE]->(node_type)\
         match (node_school)-[:ACCEPT_RATE]->(node_accept_rate)\
         match (node_school)-[:HAS_TELEPHONE]->(node_telephone)\
         match (node_school)-[:HAS_STUDENT_FACULTY_RATIO_OF]->(node_s_f_ratio)\
         match (node_school)-[:HAS_SETTING]->(node_school_setting)\
         match (node_school)-[:HAS_SIZE]->(node_size)\
         return node_id.name, node_school.name, node_logo.name,\
         node_cc_score.name, node_address.name, node_state.name,\
         node_city.name, node_zip.name, node_tuition.name, node_web.name,\
         node_type.name, node_accept_rate.name, node_sat_max.name,\
         node_sat_min.name, node_telephone.name,  node_qs_rank.name,\
         node_s_f_ratio.name,node_school_setting.name, node_size.name,\
         node_avg_act.name LIMIT 90\
         "          )

    data = []
    for school in result:
        if school['node_accept_rate.name'] != 'N/A':
            school['node_accept_rate.name'] = str(
                round(float(school['node_accept_rate.name']) * 100, 2)) + '%'

        obj = {
            'id':
            school['node_id.name'],
            'name':
            school['node_school.name'],
            'logo':
            extract_logo_name(school['node_logo.name']),
            'desc':
            school['node_school.name'] + " is a " +
            school.get('node_type.name', 'private') +
            " research university in " +
            school.get('node_city.name', 'somewhere') +
            ". And its campus located in " +
            school.get('node_school_setting.name', 'unknown') + " area. " +
            "And its campus size is " +
            school.get('node_size.name', 'unknown') + ". " +
            "And its student-faculty-ratio is " +
            school.get('node_s_f_ratio.name', 'unknown') + " . ",
            'rating': {
                'QS': format_qs_score(school.get('node_qs_rank.name', '')),
                'CC':
                min(int(float(school['node_cc_score.name']) / 400) + 1, 5)
            },
            'detail':
            'detail/' + school.get('node_id.name', ''),
            'address':
            school.get('node_address.name', '') + ' ' +
            school.get('node_city.name', '') + ' ' +
            school.get('node_state.name', '') + ', ' +
            school.get('node_zip.name', ''),
            'tuition':
            '$' + school.get('node_tuition.name', ''),
            'school_type':
            school.get('node_type.name', '').capitalize(),
            'ACT':
            school.get('node_sat_min.name', '') + '-' +
            school.get('node_sat_max.name', ''),
            'acceptance_rate':
            school.get('node_accept_rate.name', ''),
            'link':
            school.get('node_web.name', '')
        }
        data.append(obj)

    return JsonResponseResult().ok(data=data)