예제 #1
0
파일: apis.py 프로젝트: qbx2/opencampus
def lecture_create(campus_id):
    try:
        request_data = request.get_json()
        year = request_data.get('year')
        term = Lecture.term_str_to_int(request_data.get('term'))
        code = request_data.get('code')
        if not (year and term and code):
            raise ValueError
    except TypeError or ValueError:
        return jsonify({'error': {'code': 'invalid_request'}})

    lecture = Lecture(
        campus_id=campus_id,
        year=year,
        term=term,
        code=code
    )
    try:
        lecture.save()
    except NotUniqueError:
        return jsonify({'error': {'code': 'lecture_exist'}}), 400
    return jsonify({
        'id': str(lecture.id),
        'year': year,
        'term': Lecture.term_int_to_str(lecture.term),
        'code': lecture.code
    })
예제 #2
0
def search(campus_id, query, page, size=24, year=None, term=None):
    from opencampus.module.lecture.models import Lecture
    results = []

    page -= 1

    if query == '':
        if not year or not term:
            query = Lecture.objects(campus_id=campus_id)
        else:
            query = Lecture.objects(campus_id=campus_id, year=year, term=term)

        for lecture in query.skip(page*size).limit(size):
            results.append({
                'year': lecture.year,
                'term_code': lecture.term,
                'term': lecture.get_term_text(),
                'code': lecture.code,
                'type': lecture.type,
                'subject_code': lecture.subject_code,
                'subject_name': lecture.subject_name,
                'credit': lecture.credit,
                'grade': lecture.grade,
                'departments': lecture.departments,
                'professors': lecture.professors,
                'tags': lecture.tags if lecture.tags else [],
                'term_str': Lecture.term_int_to_str(lecture.term)
            })
    else:
        es = Elasticsearch(hosts=app.config.get('ELASTICSEARCH_HOSTS'))

        search_body = {
            'from': page*size,
            'size': size,
            'sort': ['_score', {'year': 'desc'}, {'term_code': 'desc'}],
            'query': {
                'bool': {
                    'must': [
                        {
                            'query_string': {
                                'default_field': '_all',
                                'query': query
                            }
                        }
                    ]
                }
            }
        }

        if year and term:
            search_body['query']['bool']['must'] += [
                {
                    'term': {
                        'lecture.year': year
                    }
                },
                {
                    'term': {
                        'lecture.term_code': term
                    }
                }
            ]

        res = es.search(index=_get_index_name(campus_id), body=search_body)

        for lecture in res.get('hits').get('hits'):
            lecture = lecture.get('_source')
            lecture['term_str'] = Lecture.term_int_to_str(lecture['term_code'])
            results.append(lecture)

    return results