コード例 #1
0
class EventLookupApiController(RESTControllerSkeleton):
    """
    RESTful Controller for ``/api/eventlookup`` endpoint
    """
    def __init__(self, *args, **kwargs):
        RESTControllerSkeleton.__init__(self, *args, **kwargs)
        self.ec_instance = EventsController()

    def render_GET(self, request):
        """
        HTTP GET implementation.

        .. seealso::

            * *querytype* Parameter – :ref:`event_lookup_parameters-label`
            * *flags* Parameter – :ref:`event_format-label`

        Args:
            request (twisted.web.server.Request): HTTP request object
        Returns:
            HTTP response with headers

        .. http:get:: /api/eventlookup

            :query basestring service_reference: service_reference
            :query int begin: (optional) timestamp
            :query int minutes: (optional) time range in minutes or event ID
            :query int querytype: (optional) query type
            :query basestring flags: (optional) fields to be returned
            :query int max_rows: (optional) maximum number of result rows

            :statuscode 200: no error

        """
        request.setHeader('Access-Control-Allow-Origin',
                          CORS_DEFAULT_ALLOW_ORIGIN)

        mangled_parameters = dict(
            flags=None,
            service_reference=None  # '1:0:19:7C:6:85:FFFF0000:0:0:0:'
        )

        for key in ("flags", "service_reference"):
            if key in request.args:
                mangled_parameters[key] = request.args[key][0]

        for key in ("querytype", "max_rows", "begin", "minutes"):
            try:
                value = int(request.args[key][0])
            except (KeyError, TypeError, ValueError):
                value = None
            mangled_parameters[key] = value

        data = {
            "errors": [],
            "result": False,
            "mangled_parameters": mangled_parameters,
            "len": 0
        }

        if mangled_parameters["service_reference"]:
            try:
                data['events'] = self.ec_instance.lookup(**mangled_parameters)
                data['result'] = True
                data['len'] = len(data['events'])
            except Exception as exc:
                data['errors'].append(repr(exc))

        return json_response(request, data)
class RESTCurrentEventController(TwoFaceApiController):
    """
    RESTful Controller for ``/current_event`` endpoint.

    .. http:get:: /current_event

        :statuscode 200: no error
        :statuscode 503: no currently playing service

    .. http:get:: /current_event/{basestring:service_reference}/

        :statuscode 200: no error
        :statuscode 503: no data
    """
    def __init__(self, *args, **kwargs):
        TwoFaceApiController.__init__(self, *args, **kwargs)
        self.log = logging.getLogger(__name__)
        self.session = kwargs.get("session")
        self.ec = EventsController()
        self.mc = RecordingsController()

    def render_list_all(self, request):
        """
        Return event data for currently playing service.

        Args:
            request (twisted.web.server.Request): HTTP request object
        Returns:
            HTTP response with headers
        """
        try:
            sr_obj = self.session.nav.getCurrentlyPlayingServiceReference()
            servicereference = sr_obj.toString()
            item = mangle_servicereference(servicereference)
            # self.log.debug("sr item: {!r}".format(item))
            # self.log.debug("sr obj: {!r}".format(sr_obj.toString()))

            if item.get("path"):
                raw_data = self.mc.mangle_servicereference_information(sr_obj)
                data = raw_data  # do something if no event data is available?

                if raw_data.get("event"):
                    data = raw_data.get("event")
                    data[KEY_SERVICE_REFERENCE] = raw_data['meta'].get(
                        "Serviceref")
                    data[KEY_SERVICE_NAME] = get_servicereference_name(
                        data[KEY_SERVICE_REFERENCE])
                else:
                    data = NoneEventDict(item.get("path").split('/')[-1])

                item.update(data)
                for key in ('kind', 'flags'):
                    try:
                        del item[key]
                    except KeyError:
                        pass

                return json_response(request, item)
            return self.render_list_subset(request, sr_obj.toString())
        except Exception as exc:
            self.log.error(exc)
            self._cache(request, expires=False)
            return self.error_response(request,
                                       response_code=http.SERVICE_UNAVAILABLE)

    def render_list_subset(self, request, service_reference):
        """
        Return event data for specific service (if available).

        Args:
            request (twisted.web.server.Request): HTTP request object
            service_reference (basestring): Service reference string
        Returns:
            HTTP response with headers
        """
        items = self.ec.lookup(service_reference,
                               querytype=QUERYTYPE_LOOKUP__WHILE,
                               begin=QUERY_TIMESTAMP_CURRENT_TIME,
                               minutes=0)

        self._cache(request, expires=False)

        try:
            data = items[0]
            data['path'] = None
        except IndexError:
            data = dict(service_reference=service_reference)
            request.setResponseCode(http.SERVICE_UNAVAILABLE)

        return json_response(request, data)

    def render_list_item(self, request, service_reference, item_id):
        """
        Currently not supported.

        Args:
            request (twisted.web.server.Request): HTTP request object
        Returns:
            HTTP response with headers
        """
        return self.error_response(request, response_code=http.NOT_FOUND)