def get(self):
        params = {}
        pparams = {}
        fields = self.request.params.get('opt_fields', '')
        if fields:
            params['opt_fields'] = fields
            pparams['opt_fields'] = fields
            fields = fields.split(',')
            view_fields = fields + ['dateModified', 'id']
        limit = self.request.params.get('limit', '')
        if limit:
            params['limit'] = limit
            pparams['limit'] = limit
        limit = int(limit) if limit.isdigit() and (100 if fields else 1000) >= int(limit) > 0 else 100
        descending = bool(self.request.params.get('descending'))
        offset = self.request.params.get('offset', '')
        if descending:
            params['descending'] = 1
        else:
            pparams['descending'] = 1
        feed = self.request.params.get('feed', '')
        view_map = FEED.get(feed, VIEW_MAP)
        changes = view_map is CHANGES_VIEW_MAP
        if feed and feed in FEED:
            params['feed'] = feed
            pparams['feed'] = feed
        mode = self.request.params.get('mode', '')
        if mode and mode in view_map:
            params['mode'] = mode
            pparams['mode'] = mode
        view_limit = limit + 1 if offset else limit
        if changes:
            if offset:
                view_offset = decrypt(self.server.uuid, self.db.name, offset)
                if view_offset and view_offset.isdigit():
                    view_offset = int(view_offset)
                else:
                    self.request.errors.add('params', 'offset',
                                            'Offset expired/invalid')
                    self.request.errors.status = 404
                    return
            if not offset:
                view_offset = 'now' if descending else 0
        else:
            if offset:
                view_offset = offset
            else:
                view_offset = '9' if descending else ''
        list_view = view_map.get(mode, view_map[u''])
        if fields:
            if not changes and set(fields).issubset(set(FIELDS)):
                results = [
                    (dict([(i, j) for i, j in x.value.items() + [('id', x.id), ('dateModified', x.key)] if i in view_fields]), x.key)
                    for x in list_view(self.db, limit=view_limit, startkey=view_offset, descending=descending)
                ]
            elif changes and set(fields).issubset(set(FIELDS)):
                results = [
                    (dict([(i, j) for i, j in x.value.items() + [('id', x.id)] if i in view_fields]), x.key)
                    for x in list_view(self.db, limit=view_limit, startkey=view_offset, descending=descending)
                ]
            elif fields:
                self.LOGGER.info('Used custom fields for tenders list: {}'.format(','.join(sorted(fields))),
                            extra=context_unpack(self.request, {'MESSAGE_ID': 'tender_list_custom'}))

                results = [
                    (contract_serialize(self.request, i[u'doc'], view_fields), i.key)
                    for i in list_view(self.db, limit=view_limit, startkey=view_offset, descending=descending, include_docs=True)
                ]
        else:
            results = [
                ({'id': i.id, 'dateModified': i.value['dateModified']} if changes else {'id': i.id, 'dateModified': i.key}, i.key)
                for i in list_view(self.db, limit=view_limit, startkey=view_offset, descending=descending)
            ]
        if results:
            params['offset'], pparams['offset'] = results[-1][1], results[0][1]
            if offset and view_offset == results[0][1]:
                results = results[1:]
            elif offset and view_offset != results[0][1]:
                results = results[:limit]
                params['offset'], pparams['offset'] = results[-1][1], view_offset
            results = [i[0] for i in results]
            if changes:
                params['offset'] = encrypt(self.server.uuid, self.db.name, params['offset'])
                pparams['offset'] = encrypt(self.server.uuid, self.db.name, pparams['offset'])
        else:
            params['offset'] = offset
            pparams['offset'] = offset
        data = {
            'data': results,
            'next_page': {
                "offset": params['offset'],
                "path": self.request.route_path('Contracts', _query=params),
                "uri": self.request.route_url('Contracts', _query=params)
            }
        }
        if descending or offset:
            data['prev_page'] = {
                "offset": pparams['offset'],
                "path": self.request.route_path('Contracts', _query=pparams),
                "uri": self.request.route_url('Contracts', _query=pparams)
            }
        return data
Example #2
0
    def get(self):
        """Tenders List

        Get Tenders List
        ----------------

        Example request to get tenders list:

        .. sourcecode:: http

            GET /tenders HTTP/1.1
            Host: example.com
            Accept: application/json

        This is what one should expect in response:

        .. sourcecode:: http

            HTTP/1.1 200 OK
            Content-Type: application/json

            {
                "data": [
                    {
                        "id": "64e93250be76435397e8c992ed4214d1",
                        "dateModified": "2014-10-27T08:06:58.158Z"
                    }
                ]
            }

        """
        # http://wiki.apache.org/couchdb/HTTP_view_API#Querying_Options
        params = {}
        pparams = {}
        fields = self.request.params.get('opt_fields', '')
        if fields:
            params['opt_fields'] = fields
            pparams['opt_fields'] = fields
            fields = fields.split(',')
            view_fields = fields + ['dateModified', 'id']
        limit = self.request.params.get('limit', '')
        if limit:
            params['limit'] = limit
            pparams['limit'] = limit
        limit = int(limit) if limit.isdigit() and (
            100 if fields else 1000) >= int(limit) > 0 else 100
        descending = bool(self.request.params.get('descending'))
        offset = self.request.params.get('offset', '')
        if descending:
            params['descending'] = 1
        else:
            pparams['descending'] = 1
        feed = self.request.params.get('feed', '')
        view_map = FEED.get(feed, VIEW_MAP)
        changes = view_map is CHANGES_VIEW_MAP
        if feed and feed in FEED:
            params['feed'] = feed
            pparams['feed'] = feed
        mode = self.request.params.get('mode', '')
        if mode and mode in view_map:
            params['mode'] = mode
            pparams['mode'] = mode
        view_limit = limit + 1 if offset else limit
        if changes:
            if offset:
                view_offset = decrypt(self.server.uuid, self.db.name, offset)
                if view_offset and view_offset.isdigit():
                    view_offset = int(view_offset)
                else:
                    self.request.errors.add('params', 'offset',
                                            'Offset expired/invalid')
                    self.request.errors.status = 404
                    return
            if not offset:
                view_offset = 'now' if descending else 0
        else:
            if offset:
                view_offset = offset
            else:
                view_offset = '9' if descending else ''
        list_view = view_map.get(mode, view_map[u''])
        if fields:
            if not changes and set(fields).issubset(set(FIELDS)):
                results = [(dict([(i, j) for i, j in x.value.items() +
                                  [('id', x.id), ('dateModified', x.key)]
                                  if i in view_fields]), x.key)
                           for x in list_view(self.db,
                                              limit=view_limit,
                                              startkey=view_offset,
                                              descending=descending,
                                              stale='update_after')]
            elif changes and set(fields).issubset(set(FIELDS)):
                results = [(dict([(i, j)
                                  for i, j in x.value.items() + [('id', x.id)]
                                  if i in view_fields]), x.key)
                           for x in list_view(self.db,
                                              limit=view_limit,
                                              startkey=view_offset,
                                              descending=descending,
                                              stale='update_after')]
            elif fields:
                self.LOGGER.info(
                    'Used custom fields for tenders list: {}'.format(','.join(
                        sorted(fields))),
                    extra=context_unpack(self.request,
                                         {'MESSAGE_ID': 'tender_list_custom'}))

                results = [(tender_serialize(self.request, i[u'doc'],
                                             view_fields), i.key)
                           for i in list_view(self.db,
                                              limit=view_limit,
                                              startkey=view_offset,
                                              descending=descending,
                                              stale='update_after',
                                              include_docs=True)]
        else:
            results = [({
                'id': i.id,
                'dateModified': i.value['dateModified']
            } if changes else {
                'id': i.id,
                'dateModified': i.key
            }, i.key) for i in list_view(self.db,
                                         limit=view_limit,
                                         startkey=view_offset,
                                         descending=descending,
                                         stale='update_after')]
        if results:
            params['offset'], pparams['offset'] = results[-1][1], results[0][1]
            if offset and view_offset == results[0][1]:
                results = results[1:]
            elif offset and view_offset != results[0][1]:
                results = results[:limit]
                params['offset'], pparams['offset'] = results[-1][
                    1], view_offset
            results = [i[0] for i in results]
            if changes:
                params['offset'] = encrypt(self.server.uuid, self.db.name,
                                           params['offset'])
                pparams['offset'] = encrypt(self.server.uuid, self.db.name,
                                            pparams['offset'])
        else:
            params['offset'] = offset
            pparams['offset'] = offset
        data = {
            'data': results,
            'next_page': {
                "offset": params['offset'],
                "path": self.request.route_path('Tenders', _query=params),
                "uri": self.request.route_url('Tenders', _query=params)
            }
        }
        if descending or offset:
            data['prev_page'] = {
                "offset": pparams['offset'],
                "path": self.request.route_path('Tenders', _query=pparams),
                "uri": self.request.route_url('Tenders', _query=pparams)
            }
        return data
    def get(self):
        """Tenders List

        Get Tenders List
        ----------------

        Example request to get tenders list:

        .. sourcecode:: http

            GET /tenders HTTP/1.1
            Host: example.com
            Accept: application/json

        This is what one should expect in response:

        .. sourcecode:: http

            HTTP/1.1 200 OK
            Content-Type: application/json

            {
                "data": [
                    {
                        "id": "64e93250be76435397e8c992ed4214d1",
                        "dateModified": "2014-10-27T08:06:58.158Z"
                    }
                ]
            }

        """
        # http://wiki.apache.org/couchdb/HTTP_view_API#Querying_Options
        params = {}
        pparams = {}
        fields = self.request.params.get('opt_fields', '')
        if fields:
            params['opt_fields'] = fields
            pparams['opt_fields'] = fields
            fields = fields.split(',')
            view_fields = fields + ['dateModified', 'id']
        limit = self.request.params.get('limit', '')
        if limit:
            params['limit'] = limit
            pparams['limit'] = limit
        limit = int(limit) if limit.isdigit() and (100 if fields else 1000) >= int(limit) > 0 else 100
        descending = bool(self.request.params.get('descending'))
        offset = self.request.params.get('offset', '')
        if descending:
            params['descending'] = 1
        else:
            pparams['descending'] = 1
        feed = self.request.params.get('feed', '')
        view_map = FEED.get(feed, VIEW_MAP)
        changes = view_map is CHANGES_VIEW_MAP
        if feed and feed in FEED:
            params['feed'] = feed
            pparams['feed'] = feed
        mode = self.request.params.get('mode', '')
        if mode and mode in view_map:
            params['mode'] = mode
            pparams['mode'] = mode
        view_limit = limit + 1 if offset else limit
        if changes:
            if offset:
                view_offset = decrypt(self.server.uuid, self.db.name, offset)
                if view_offset and view_offset.isdigit():
                    view_offset = int(view_offset)
                else:
                    self.request.errors.add('params', 'offset', 'Offset expired/invalid')
                    self.request.errors.status = 404
                    return
            if not offset:
                view_offset = 'now' if descending else 0
        else:
            if offset:
                view_offset = offset
            else:
                view_offset = '9' if descending else ''
        list_view = view_map.get(mode, view_map[u''])
        if self.update_after:
            view = partial(list_view, self.db, limit=view_limit, startkey=view_offset, descending=descending, stale='update_after')
        else:
            view = partial(list_view, self.db, limit=view_limit, startkey=view_offset, descending=descending)
        if fields:
            if not changes and set(fields).issubset(set(FIELDS)):
                results = [
                    (dict([(i, j) for i, j in x.value.items() + [('id', x.id), ('dateModified', x.key)] if i in view_fields]), x.key)
                    for x in view()
                ]
            elif changes and set(fields).issubset(set(FIELDS)):
                results = [
                    (dict([(i, j) for i, j in x.value.items() + [('id', x.id)] if i in view_fields]), x.key)
                    for x in view()
                ]
            elif fields:
                self.LOGGER.info('Used custom fields for tenders list: {}'.format(','.join(sorted(fields))),
                            extra=context_unpack(self.request, {'MESSAGE_ID': 'tender_list_custom'}))

                results = [
                    (dict([(k, j) for k, j in i[u'doc'].items() if k in view_fields]), i.key)
                    for i in view(include_docs=True)
                ]
        else:
            results = [
                ({'id': i.id, 'dateModified': i.value['dateModified']} if changes else {'id': i.id, 'dateModified': i.key}, i.key)
                for i in view()
            ]
        if results:
            params['offset'], pparams['offset'] = results[-1][1], results[0][1]
            if offset and view_offset == results[0][1]:
                results = results[1:]
            elif offset and view_offset != results[0][1]:
                results = results[:limit]
                params['offset'], pparams['offset'] = results[-1][1], view_offset
            results = [i[0] for i in results]
            if changes:
                params['offset'] = encrypt(self.server.uuid, self.db.name, params['offset'])
                pparams['offset'] = encrypt(self.server.uuid, self.db.name, pparams['offset'])
        else:
            params['offset'] = offset
            pparams['offset'] = offset
        data = {
            'data': results,
            'next_page': {
                "offset": params['offset'],
                "path": self.request.route_path('Tenders', _query=params),
                "uri": self.request.route_url('Tenders', _query=params)
            }
        }
        if descending or offset:
            data['prev_page'] = {
                "offset": pparams['offset'],
                "path": self.request.route_path('Tenders', _query=pparams),
                "uri": self.request.route_url('Tenders', _query=pparams)
            }
        return data
    def get(self):
        params = {}
        pparams = {}
        fields = self.request.params.get('opt_fields', '')
        if fields:
            params['opt_fields'] = fields
            pparams['opt_fields'] = fields
            fields = fields.split(',')
            view_fields = fields + ['dateModified', 'id']
        limit = self.request.params.get('limit', '')
        if limit:
            params['limit'] = limit
            pparams['limit'] = limit
        limit = int(limit) if limit.isdigit() and (
            100 if fields else 1000) >= int(limit) > 0 else 100
        descending = bool(self.request.params.get('descending'))
        offset = self.request.params.get('offset', '')
        if descending:
            params['descending'] = 1
        else:
            pparams['descending'] = 1
        feed = self.request.params.get('feed', '')
        view_map = FEED.get(feed, VIEW_MAP)
        changes = view_map is CHANGES_VIEW_MAP
        if feed and feed in FEED:
            params['feed'] = feed
            pparams['feed'] = feed
        mode = self.request.params.get('mode', '')
        if mode and mode in view_map:
            params['mode'] = mode
            pparams['mode'] = mode
        view_limit = limit + 1 if offset else limit
        if changes:
            if offset:
                view_offset = decrypt(self.server.uuid, self.db.name, offset)
                if view_offset and view_offset.isdigit():
                    view_offset = int(view_offset)
                else:
                    self.request.errors.add('params', 'offset',
                                            'Offset expired/invalid')
                    self.request.errors.status = 404
                    return
            if not offset:
                view_offset = 'now' if descending else 0
        else:
            if offset:
                view_offset = offset
            else:
                view_offset = '9' if descending else ''
        list_view = view_map.get(mode, view_map[u''])
        if self.update_after:
            view = partial(list_view,
                           self.db,
                           limit=view_limit,
                           startkey=view_offset,
                           descending=descending,
                           stale='update_after')
        else:
            view = partial(list_view,
                           self.db,
                           limit=view_limit,
                           startkey=view_offset,
                           descending=descending)
        if fields:
            if not changes and set(fields).issubset(set(FIELDS)):
                results = [(dict([(i, j) for i, j in x.value.items() +
                                  [('id', x.id), ('dateModified', x.key)]
                                  if i in view_fields]), x.key)
                           for x in view()]
            elif changes and set(fields).issubset(set(FIELDS)):
                results = [(dict([(i, j)
                                  for i, j in x.value.items() + [('id', x.id)]
                                  if i in view_fields]), x.key)
                           for x in view()]
            elif fields:
                self.LOGGER.info(
                    'Used custom fields for tenders list: {}'.format(','.join(
                        sorted(fields))),
                    extra=context_unpack(self.request,
                                         {'MESSAGE_ID': 'tender_list_custom'}))

                results = [(contract_serialize(self.request, i[u'doc'],
                                               view_fields), i.key)
                           for i in view(include_docs=True)]
        else:
            results = [({
                'id': i.id,
                'dateModified': i.value['dateModified']
            } if changes else {
                'id': i.id,
                'dateModified': i.key
            }, i.key) for i in view()]
        if results:
            params['offset'], pparams['offset'] = results[-1][1], results[0][1]
            if offset and view_offset == results[0][1]:
                results = results[1:]
            elif offset and view_offset != results[0][1]:
                results = results[:limit]
                params['offset'], pparams['offset'] = results[-1][
                    1], view_offset
            results = [i[0] for i in results]
            if changes:
                params['offset'] = encrypt(self.server.uuid, self.db.name,
                                           params['offset'])
                pparams['offset'] = encrypt(self.server.uuid, self.db.name,
                                            pparams['offset'])
        else:
            params['offset'] = offset
            pparams['offset'] = offset
        data = {
            'data': results,
            'next_page': {
                "offset": params['offset'],
                "path": self.request.route_path('Contracts', _query=params),
                "uri": self.request.route_url('Contracts', _query=params)
            }
        }
        if descending or offset:
            data['prev_page'] = {
                "offset": pparams['offset'],
                "path": self.request.route_path('Contracts', _query=pparams),
                "uri": self.request.route_url('Contracts', _query=pparams)
            }
        return data
    def get(self):
        """Plans List

        Get Plans List
        ----------------

        Example request to get plans list:

        .. sourcecode:: http

            GET /plans HTTP/1.1
            Host: example.com
            Accept: application/json

        This is what one should expect in response:

        .. sourcecode:: http

            HTTP/1.1 200 OK
            Content-Type: application/json

            {
                "data": [
                    {
                        "id": "64e93250be76435397e8c992ed4214d1",
                        "dateModified": "2014-10-27T08:06:58.158Z"
                    }
                ]
            }

        """
        # http://wiki.apache.org/couchdb/HTTP_view_API#Querying_Options
        params = {}
        pparams = {}
        fields = self.request.params.get("opt_fields", "")
        if fields:
            params["opt_fields"] = fields
            pparams["opt_fields"] = fields
            fields = fields.split(",")
            view_fields = fields + ["dateModified", "id"]
        limit = self.request.params.get("limit", "")
        if limit:
            params["limit"] = limit
            pparams["limit"] = limit
        limit = int(limit) if limit.isdigit() and int(limit) > 0 else 100
        descending = bool(self.request.params.get("descending"))
        offset = self.request.params.get("offset", "")
        if descending:
            params["descending"] = 1
        else:
            pparams["descending"] = 1
        feed = self.request.params.get("feed", "")
        view_map = FEED.get(feed, VIEW_MAP)
        changes = view_map is CHANGES_VIEW_MAP
        if feed and feed in FEED:
            params["feed"] = feed
            pparams["feed"] = feed
        mode = self.request.params.get("mode", "")
        if mode and mode in view_map:
            params["mode"] = mode
            pparams["mode"] = mode
        view_limit = limit + 1 if offset else limit
        if changes:
            if offset:
                view_offset = decrypt(self.server.uuid, self.db.name, offset)
                if view_offset and view_offset.isdigit():
                    view_offset = int(view_offset)
                else:
                    self.request.errors.add("params", "offset", "Offset expired/invalid")
                    self.request.errors.status = 404
                    return
            if not offset:
                view_offset = "now" if descending else 0
        else:
            if offset:
                view_offset = offset
            else:
                view_offset = "9" if descending else ""
        list_view = view_map.get(mode, view_map[u""])
        if fields:
            if not changes and set(fields).issubset(set(FIELDS)):
                results = [
                    (
                        dict(
                            [
                                (i, j)
                                for i, j in x.value.items() + [("id", x.id), ("dateModified", x.key)]
                                if i in view_fields
                            ]
                        ),
                        x.key,
                    )
                    for x in list_view(self.db, limit=view_limit, startkey=view_offset, descending=descending)
                ]
            elif changes and set(fields).issubset(set(FIELDS)):
                results = [
                    (dict([(i, j) for i, j in x.value.items() + [("id", x.id)] if i in view_fields]), x.key)
                    for x in list_view(self.db, limit=view_limit, startkey=view_offset, descending=descending)
                ]
            elif fields:
                LOGGER.info(
                    "Used custom fields for planss list: {}".format(",".join(sorted(fields))),
                    extra=context_unpack(self.request, {"MESSAGE_ID": "plan_list_custom"}),
                )

                results = [
                    (plan_serialize(self.request, i[u"doc"], view_fields), i.key)
                    for i in list_view(
                        self.db, limit=view_limit, startkey=view_offset, descending=descending, include_docs=True
                    )
                ]
        else:
            results = [
                (
                    {"id": i.id, "dateModified": i.value["dateModified"]}
                    if changes
                    else {"id": i.id, "dateModified": i.key},
                    i.key,
                )
                for i in list_view(self.db, limit=view_limit, startkey=view_offset, descending=descending)
            ]
        if results:
            params["offset"], pparams["offset"] = results[-1][1], results[0][1]
            if offset and view_offset == results[0][1]:
                results = results[1:]
            elif offset and view_offset != results[0][1]:
                results = results[:limit]
                params["offset"], pparams["offset"] = results[-1][1], view_offset
            results = [i[0] for i in results]
            if changes:
                params["offset"] = encrypt(self.server.uuid, self.db.name, params["offset"])
                pparams["offset"] = encrypt(self.server.uuid, self.db.name, pparams["offset"])
        else:
            params["offset"] = offset
            pparams["offset"] = offset
        data = {
            "data": results,
            "next_page": {
                "offset": params["offset"],
                "path": self.request.route_path("Plans", _query=params),
                "uri": self.request.route_url("Plans", _query=params),
            },
        }
        if descending or offset:
            data["prev_page"] = {
                "offset": pparams["offset"],
                "path": self.request.route_path("Plans", _query=pparams),
                "uri": self.request.route_url("Plans", _query=pparams),
            }
        return data