示例#1
0
class CoursesV2Handler(basic.BaseHandler):
    course_pgquery = lib.pg.PGQuery(courses, courses_functions)
    section_pgquery = lib.pg.PGQuery(sections, sections_functions)

    config = {
        'GET': {
            'params':
            basic.pg_function_params(
                courses_functions, {
                    'limit': {
                        'type': 'int',
                        'default': None
                    },
                    'page': {
                        'type': 'int',
                        'default': 0
                    },
                    'pretty': {
                        'type': 'bool',
                        'default': None
                    },
                    'jsonp': {
                        'type': 'string',
                        'default': None
                    },
                }),
            'function':
            'process_get'
        }
    }

    @tornado.web.asynchronous
    @basic.format_api_errors
    @basic.validate_token
    def process_get(self, params):
        recognized_arguments = self.valid_query_arguments(courses_functions)

        limit = params['limit']
        page = params['page']
        pretty = params['pretty']
        jsonp = params['jsonp']

        queries = {
            query: params[query]
            for query in recognized_arguments if params[query]
        }

        if not queries:
            return self.error(status_code=400,
                              status_txt="MISSING_QUERY_ARGUMENTS",
                              pretty=pretty,
                              jsonp=jsonp)
        internal_callback = functools.partial(self._course_finish,
                                              pretty=pretty,
                                              jsonp=jsonp)
        self.course_pgquery.execute(queries,
                                    page=page,
                                    limit=limit,
                                    callback=internal_callback)

    def _match_associated_sections(self, courses, sections):
        # put the responses associated with the courses in the courses
        print 'COR', courses
        print 'SEC', sections
        for course, sections in zip(courses, sections):
            course['Sections'] = sections
        return courses

    def _course_finish(self, response, pretty=None, jsonp=None):
        if response:
            queries = []
            for course in response:
                queries.append({'course': course['Course']})
            internal_callback = functools.partial(self._section_finish,
                                                  courses=response,
                                                  pretty=pretty,
                                                  jsonp=jsonp)
            self.section_pgquery.execute_many(queries,
                                              callback=internal_callback,
                                              unlimited=True)
        else:
            return self.error(status_code=204,
                              status_txt="NO_CONTENT_FOR_REQUEST",
                              pretty=pretty,
                              jsonp=jsonp)

    def _section_finish(self, response, courses=None, pretty=None, jsonp=None):
        if response:
            response = self._match_associated_sections(courses, response)
            return self.api_response(response, pretty=pretty, jsonp=jsonp)
        else:
            return self.error(status_code=204,
                              status_txt="NO_CONTENT_FOR_REQUEST",
                              pretty=pretty,
                              jsonp=jsonp)
示例#2
0
class SectionsV2Handler(basic.BaseHandler):
    pgquery = lib.pg.PGQuery(sections, sections_functions)

    config = {
        'GET': {
            'params':
            basic.pg_function_params(
                sections_functions, {
                    'limit': {
                        'type': 'int',
                        'default': None
                    },
                    'page': {
                        'type': 'int',
                        'default': 0
                    },
                    'pretty': {
                        'type': 'bool',
                        'default': None
                    },
                    'jsonp': {
                        'type': 'string',
                        'default': None
                    },
                }),
            'function':
            'process_get'
        }
    }

    @tornado.web.asynchronous
    @basic.format_api_errors
    @basic.validate_token
    def process_get(self, params):
        recognized_arguments = self.valid_query_arguments(sections_functions)

        limit = params['limit']
        page = params['page']
        pretty = params['pretty']
        jsonp = params['jsonp']

        queries = {
            query: params[query]
            for query in recognized_arguments if params[query]
        }

        if not queries:
            return self.error(status_code=400,
                              status_txt="MISSING_QUERY_ARGUMENTS",
                              pretty=pretty,
                              jsonp=jsonp)
        internal_callback = functools.partial(self._finish,
                                              pretty=pretty,
                                              jsonp=jsonp)
        self.pgquery.execute(queries,
                             page=page,
                             limit=limit,
                             callback=internal_callback)

    def _finish(self, response, pretty=None, jsonp=None):
        if response:
            return self.api_response(response, pretty=pretty, jsonp=jsonp)
        else:
            return self.error(status_code=204,
                              status_txt="NO_CONTENT_FOR_REQUEST",
                              pretty=pretty,
                              jsonp=jsonp)