)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"26907d770b88c60e5158d93a96610dfe1cd48f62","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"1a95cdbc_d8ecda2b","line":14,"updated":"2016-10-06 09:13:35.000000000","message":"If this fixes the bugs listed above, you need to add the following lines after Change-Id, not just list them above:\n\nCloses-Bug: #1596628\nCloses-Bug: #1596625","commit_id":"1a747a925f0a641bcb335e93bbeb8457acbbe198"}],"devstack/plugin.sh":[{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"953359d3ba5b4d23c05366b847f63d917b03ce8f","unresolved":false,"context_lines":[{"line_number":44,"context_line":"function create_octavia_accounts {"},{"line_number":45,"context_line":"    create_service_user \"octavia\""},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    local octavia_service\u003d$(get_or_create_service \"octavia\" \\"},{"line_number":48,"context_line":"        \"octavia\" \"Octavia Service\")"},{"line_number":49,"context_line":"    get_or_create_endpoint $octavia_service \\"},{"line_number":50,"context_line":"        \"$REGION_NAME\" \\"}],"source_content_type":"text/x-sh","patch_set":9,"id":"1a6eadb0_4dd85df0","line":47,"updated":"2016-12-12 16:52:07.000000000","message":"looks ok to remove that check since we only run on sql...","commit_id":"673759ee4021491a2c3a63a3c6cfc8cfd36fff3d"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"0f98464c84196c3fa15b7a628057a68dbeca1b51","unresolved":false,"context_lines":[{"line_number":44,"context_line":"function create_octavia_accounts {"},{"line_number":45,"context_line":"    create_service_user \"octavia\""},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    local octavia_service\u003d$(get_or_create_service \"octavia\" \\"},{"line_number":48,"context_line":"        \"octavia\" \"Octavia Service\")"},{"line_number":49,"context_line":"    get_or_create_endpoint $octavia_service \\"},{"line_number":50,"context_line":"        \"$REGION_NAME\" \\"}],"source_content_type":"text/x-sh","patch_set":9,"id":"1a6eadb0_3202993f","line":47,"in_reply_to":"1a6eadb0_4dd85df0","updated":"2016-12-12 18:17:55.000000000","message":"That came in through a rebase","commit_id":"673759ee4021491a2c3a63a3c6cfc8cfd36fff3d"}],"octavia/api/common/pagination.py":[{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"c0f77e653c53609181935d6e4d869fc71f9c9f87","unresolved":false,"context_lines":[{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    @staticmethod"},{"line_number":52,"context_line":"    def _parse_limit(params):"},{"line_number":53,"context_line":"        limit \u003d params.get(\u0027limit\u0027, constants.MAX_PAGE_SIZE)"},{"line_number":54,"context_line":"        try:"},{"line_number":55,"context_line":"            limit \u003d int(limit)"},{"line_number":56,"context_line":"        except ValueError:"}],"source_content_type":"text/x-python","patch_set":37,"id":"5ff73747_2f04ba49","line":53,"updated":"2017-04-25 22:40:19.000000000","message":"This should be from the config file \"pagination_max_limit\": https://docs.openstack.org/developer/octavia/main/configref.html#DEFAULT.pagination_max_limit","commit_id":"d4b919b3c16fe91b196773c7fe6bf4c7936ab3fc"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"a0b7e9aa778c6d1ff627ba3a1852528bb293028e","unresolved":false,"context_lines":[{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    @staticmethod"},{"line_number":52,"context_line":"    def _parse_limit(params):"},{"line_number":53,"context_line":"        limit \u003d params.get(\u0027limit\u0027, constants.MAX_PAGE_SIZE)"},{"line_number":54,"context_line":"        try:"},{"line_number":55,"context_line":"            limit \u003d int(limit)"},{"line_number":56,"context_line":"        except ValueError:"}],"source_content_type":"text/x-python","patch_set":37,"id":"5ff73747_2595fb40","line":53,"in_reply_to":"5ff73747_2f04ba49","updated":"2017-04-25 23:47:07.000000000","message":"Done","commit_id":"d4b919b3c16fe91b196773c7fe6bf4c7936ab3fc"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"c0f77e653c53609181935d6e4d869fc71f9c9f87","unresolved":false,"context_lines":[{"line_number":52,"context_line":"    def _parse_limit(params):"},{"line_number":53,"context_line":"        limit \u003d params.get(\u0027limit\u0027, constants.MAX_PAGE_SIZE)"},{"line_number":54,"context_line":"        try:"},{"line_number":55,"context_line":"            limit \u003d int(limit)"},{"line_number":56,"context_line":"        except ValueError:"},{"line_number":57,"context_line":"            raise exceptions.InvalidLimit(key\u003dlimit)"},{"line_number":58,"context_line":"        return limit"}],"source_content_type":"text/x-python","patch_set":37,"id":"5ff73747_0fad7e30","line":55,"range":{"start_line":55,"start_character":12,"end_line":55,"end_character":30},"updated":"2017-04-25 22:40:19.000000000","message":"If this is -1 it should be converted to None right?  It looks like None means no limit below.","commit_id":"d4b919b3c16fe91b196773c7fe6bf4c7936ab3fc"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"a0b7e9aa778c6d1ff627ba3a1852528bb293028e","unresolved":false,"context_lines":[{"line_number":52,"context_line":"    def _parse_limit(params):"},{"line_number":53,"context_line":"        limit \u003d params.get(\u0027limit\u0027, constants.MAX_PAGE_SIZE)"},{"line_number":54,"context_line":"        try:"},{"line_number":55,"context_line":"            limit \u003d int(limit)"},{"line_number":56,"context_line":"        except ValueError:"},{"line_number":57,"context_line":"            raise exceptions.InvalidLimit(key\u003dlimit)"},{"line_number":58,"context_line":"        return limit"}],"source_content_type":"text/x-python","patch_set":37,"id":"5ff73747_45aec798","line":55,"range":{"start_line":55,"start_character":12,"end_line":55,"end_character":30},"in_reply_to":"5ff73747_0fad7e30","updated":"2017-04-25 23:47:07.000000000","message":"Opting to convert to None if zero or less, as those values are nonsensical. Thoughts?","commit_id":"d4b919b3c16fe91b196773c7fe6bf4c7936ab3fc"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"32bc1ebf85cab07a546136fc605343a2537cb9b9","unresolved":false,"context_lines":[{"line_number":52,"context_line":"    def _parse_limit(params):"},{"line_number":53,"context_line":"        limit \u003d params.get(\u0027limit\u0027, constants.MAX_PAGE_SIZE)"},{"line_number":54,"context_line":"        try:"},{"line_number":55,"context_line":"            limit \u003d int(limit)"},{"line_number":56,"context_line":"        except ValueError:"},{"line_number":57,"context_line":"            raise exceptions.InvalidLimit(key\u003dlimit)"},{"line_number":58,"context_line":"        return limit"}],"source_content_type":"text/x-python","patch_set":37,"id":"5ff73747_05cc3f5f","line":55,"range":{"start_line":55,"start_character":12,"end_line":55,"end_character":30},"in_reply_to":"5ff73747_45aec798","updated":"2017-04-25 23:57:39.000000000","message":"Works for me","commit_id":"d4b919b3c16fe91b196773c7fe6bf4c7936ab3fc"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"c0f77e653c53609181935d6e4d869fc71f9c9f87","unresolved":false,"context_lines":[{"line_number":140,"context_line":"                        params\u003d\"\u0026\".join(prev_attr))"},{"line_number":141,"context_line":"                }"},{"line_number":142,"context_line":"                links.append(prev_link)"},{"line_number":143,"context_line":"            # TODO(rm_work) Do we need to know when there are more vs exact?"},{"line_number":144,"context_line":"            # We safely know if we have a full page, but it might include the"},{"line_number":145,"context_line":"            # last element or it might not, it is unclear"},{"line_number":146,"context_line":"            if len(model_list) \u003e\u003d self.limit:"}],"source_content_type":"text/x-python","patch_set":37,"id":"5ff73747_6ff3e20b","line":143,"updated":"2017-04-25 22:40:19.000000000","message":"Yeah, the spec isn\u0027t clear: https://review.openstack.org/#/c/446716/\n\nI personally would prefer to not add \"next\" on the last page, but I\u0027m not willing to block this patch for it.","commit_id":"d4b919b3c16fe91b196773c7fe6bf4c7936ab3fc"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"a0b7e9aa778c6d1ff627ba3a1852528bb293028e","unresolved":false,"context_lines":[{"line_number":140,"context_line":"                        params\u003d\"\u0026\".join(prev_attr))"},{"line_number":141,"context_line":"                }"},{"line_number":142,"context_line":"                links.append(prev_link)"},{"line_number":143,"context_line":"            # TODO(rm_work) Do we need to know when there are more vs exact?"},{"line_number":144,"context_line":"            # We safely know if we have a full page, but it might include the"},{"line_number":145,"context_line":"            # last element or it might not, it is unclear"},{"line_number":146,"context_line":"            if len(model_list) \u003e\u003d self.limit:"}],"source_content_type":"text/x-python","patch_set":37,"id":"5ff73747_858def32","line":143,"in_reply_to":"5ff73747_6ff3e20b","updated":"2017-04-25 23:47:07.000000000","message":"Yeah it\u0027s a LOT more work to fix this I think, so let\u0027s move forward like this and file a bug maybe?","commit_id":"d4b919b3c16fe91b196773c7fe6bf4c7936ab3fc"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"32bc1ebf85cab07a546136fc605343a2537cb9b9","unresolved":false,"context_lines":[{"line_number":140,"context_line":"                        params\u003d\"\u0026\".join(prev_attr))"},{"line_number":141,"context_line":"                }"},{"line_number":142,"context_line":"                links.append(prev_link)"},{"line_number":143,"context_line":"            # TODO(rm_work) Do we need to know when there are more vs exact?"},{"line_number":144,"context_line":"            # We safely know if we have a full page, but it might include the"},{"line_number":145,"context_line":"            # last element or it might not, it is unclear"},{"line_number":146,"context_line":"            if len(model_list) \u003e\u003d self.limit:"}],"source_content_type":"text/x-python","patch_set":37,"id":"5ff73747_c5d537e7","line":143,"in_reply_to":"5ff73747_858def32","updated":"2017-04-25 23:57:39.000000000","message":"+1","commit_id":"d4b919b3c16fe91b196773c7fe6bf4c7936ab3fc"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"c0f77e653c53609181935d6e4d869fc71f9c9f87","unresolved":false,"context_lines":[{"line_number":155,"context_line":"        links \u003d [types.PageType(**link) for link in links]"},{"line_number":156,"context_line":"        return links"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"    def apply(self, query, model):"},{"line_number":159,"context_line":"        \"\"\"Returns a query with sorting / pagination criteria added."},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"        Pagination works by requiring a unique sort_key specified by sort_keys."}],"source_content_type":"text/x-python","patch_set":37,"id":"5ff73747_af1a0a7a","line":158,"range":{"start_line":158,"start_character":4,"end_line":158,"end_character":34},"updated":"2017-04-25 22:40:19.000000000","message":"This should honor the config settings \"allow_pagination\" and \"allow_sorting\" that let an operator disable this feature.  These are coming into the default config block already:https://docs.openstack.org/developer/octavia/main/configref.html#DEFAULT.allow_pagination","commit_id":"d4b919b3c16fe91b196773c7fe6bf4c7936ab3fc"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"a0b7e9aa778c6d1ff627ba3a1852528bb293028e","unresolved":false,"context_lines":[{"line_number":155,"context_line":"        links \u003d [types.PageType(**link) for link in links]"},{"line_number":156,"context_line":"        return links"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"    def apply(self, query, model):"},{"line_number":159,"context_line":"        \"\"\"Returns a query with sorting / pagination criteria added."},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"        Pagination works by requiring a unique sort_key specified by sort_keys."}],"source_content_type":"text/x-python","patch_set":37,"id":"5ff73747_6584230d","line":158,"range":{"start_line":158,"start_character":4,"end_line":158,"end_character":34},"in_reply_to":"5ff73747_af1a0a7a","updated":"2017-04-25 23:47:07.000000000","message":"Done","commit_id":"d4b919b3c16fe91b196773c7fe6bf4c7936ab3fc"}],"octavia/api/hooks/query_parameters.py":[{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"41a9e7dae4a0a24aec491c4493df858df85d16b6","unresolved":false,"context_lines":[{"line_number":92,"context_line":"                    sort_attr \u003d getattr(model_class, key_name)"},{"line_number":93,"context_line":"                except AttributeError:"},{"line_number":94,"context_line":"                    raise exceptions.InvalidSortKey()"},{"line_number":95,"context_line":"                if key_dir.lower() \u003d\u003d \"asc\":"},{"line_number":96,"context_line":"                    query \u003d query.order_by(sqlalchemy.asc(sort_attr))"},{"line_number":97,"context_line":"                elif key_dir.lower() \u003d\u003d \"desc\":"},{"line_number":98,"context_line":"                    query \u003d query.order_by(sqlalchemy.desc(sort_attr))"}],"source_content_type":"text/x-python","patch_set":8,"id":"1a6eadb0_56f2b29b","line":95,"updated":"2016-12-12 15:37:13.000000000","message":"consider constant","commit_id":"1547af70496eba5335920b8fb311897e356dc64c"},{"author":{"_account_id":14591,"name":"Lubosz Kosnik (diltram)","email":"lubosz.kosnik@intel.com","username":"diltram"},"change_message_id":"692f090fb1559efc9f8c34bab4c9d315be5d2249","unresolved":false,"context_lines":[{"line_number":92,"context_line":"                    sort_attr \u003d getattr(model_class, key_name)"},{"line_number":93,"context_line":"                except AttributeError:"},{"line_number":94,"context_line":"                    raise exceptions.InvalidSortKey()"},{"line_number":95,"context_line":"                if key_dir.lower() \u003d\u003d \"asc\":"},{"line_number":96,"context_line":"                    query \u003d query.order_by(sqlalchemy.asc(sort_attr))"},{"line_number":97,"context_line":"                elif key_dir.lower() \u003d\u003d \"desc\":"},{"line_number":98,"context_line":"                    query \u003d query.order_by(sqlalchemy.desc(sort_attr))"}],"source_content_type":"text/x-python","patch_set":8,"id":"1a6eadb0_078806e7","line":95,"in_reply_to":"1a6eadb0_56f2b29b","updated":"2016-12-12 16:36:42.000000000","message":"Done","commit_id":"1547af70496eba5335920b8fb311897e356dc64c"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"41a9e7dae4a0a24aec491c4493df858df85d16b6","unresolved":false,"context_lines":[{"line_number":94,"context_line":"                    raise exceptions.InvalidSortKey()"},{"line_number":95,"context_line":"                if key_dir.lower() \u003d\u003d \"asc\":"},{"line_number":96,"context_line":"                    query \u003d query.order_by(sqlalchemy.asc(sort_attr))"},{"line_number":97,"context_line":"                elif key_dir.lower() \u003d\u003d \"desc\":"},{"line_number":98,"context_line":"                    query \u003d query.order_by(sqlalchemy.desc(sort_attr))"},{"line_number":99,"context_line":"                else:"},{"line_number":100,"context_line":"                    raise exceptions.InvalidSortDirection()"}],"source_content_type":"text/x-python","patch_set":8,"id":"1a6eadb0_d634024c","line":97,"updated":"2016-12-12 15:37:13.000000000","message":"same","commit_id":"1547af70496eba5335920b8fb311897e356dc64c"},{"author":{"_account_id":14591,"name":"Lubosz Kosnik (diltram)","email":"lubosz.kosnik@intel.com","username":"diltram"},"change_message_id":"692f090fb1559efc9f8c34bab4c9d315be5d2249","unresolved":false,"context_lines":[{"line_number":94,"context_line":"                    raise exceptions.InvalidSortKey()"},{"line_number":95,"context_line":"                if key_dir.lower() \u003d\u003d \"asc\":"},{"line_number":96,"context_line":"                    query \u003d query.order_by(sqlalchemy.asc(sort_attr))"},{"line_number":97,"context_line":"                elif key_dir.lower() \u003d\u003d \"desc\":"},{"line_number":98,"context_line":"                    query \u003d query.order_by(sqlalchemy.desc(sort_attr))"},{"line_number":99,"context_line":"                else:"},{"line_number":100,"context_line":"                    raise exceptions.InvalidSortDirection()"}],"source_content_type":"text/x-python","patch_set":8,"id":"1a6eadb0_276d0233","line":97,"in_reply_to":"1a6eadb0_d634024c","updated":"2016-12-12 16:36:42.000000000","message":"Done","commit_id":"1547af70496eba5335920b8fb311897e356dc64c"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"41a9e7dae4a0a24aec491c4493df858df85d16b6","unresolved":false,"context_lines":[{"line_number":110,"context_line":""},{"line_number":111,"context_line":"    def __init__(self, params):"},{"line_number":112,"context_line":"        self.marker \u003d None"},{"line_number":113,"context_line":"        self.limit \u003d None"},{"line_number":114,"context_line":"        self._parse_params(params)"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"    def _parse_params(self, params):"}],"source_content_type":"text/x-python","patch_set":8,"id":"1a6eadb0_d68242c8","line":113,"updated":"2016-12-12 15:37:13.000000000","message":"there should be a default limit to prevent DoS","commit_id":"1547af70496eba5335920b8fb311897e356dc64c"},{"author":{"_account_id":14591,"name":"Lubosz Kosnik (diltram)","email":"lubosz.kosnik@intel.com","username":"diltram"},"change_message_id":"692f090fb1559efc9f8c34bab4c9d315be5d2249","unresolved":false,"context_lines":[{"line_number":110,"context_line":""},{"line_number":111,"context_line":"    def __init__(self, params):"},{"line_number":112,"context_line":"        self.marker \u003d None"},{"line_number":113,"context_line":"        self.limit \u003d None"},{"line_number":114,"context_line":"        self._parse_params(params)"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"    def _parse_params(self, params):"}],"source_content_type":"text/x-python","patch_set":8,"id":"1a6eadb0_877416fe","line":113,"in_reply_to":"1a6eadb0_d68242c8","updated":"2016-12-12 16:36:42.000000000","message":"Done","commit_id":"1547af70496eba5335920b8fb311897e356dc64c"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"953359d3ba5b4d23c05366b847f63d917b03ce8f","unresolved":false,"context_lines":[{"line_number":111,"context_line":""},{"line_number":112,"context_line":"    def __init__(self, params):"},{"line_number":113,"context_line":"        self.marker \u003d None"},{"line_number":114,"context_line":"        self.limit \u003d 1000"},{"line_number":115,"context_line":"        self._parse_params(params)"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    def _parse_params(self, params):"}],"source_content_type":"text/x-python","patch_set":9,"id":"1a6eadb0_ad9491e8","line":114,"updated":"2016-12-12 16:52:07.000000000","message":"Nit: constant or configurable","commit_id":"673759ee4021491a2c3a63a3c6cfc8cfd36fff3d"},{"author":{"_account_id":6579,"name":"Nir Magnezi","email":"nmagnezi@redhat.com","username":"nmagnezi"},"change_message_id":"f5edd493bc30d8dac879e0f895ee0bca6be8b0bf","unresolved":false,"context_lines":[{"line_number":32,"context_line":"            state.request.params.mixed())"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"class SortingHelper:"},{"line_number":36,"context_line":"    \"\"\"Class helping to interact with sorting functionaly."},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    It\u0027s intended to pass that class to `db.repositories` to apply it on query"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a6eadb0_e3775900","line":35,"range":{"start_line":35,"start_character":6,"end_line":35,"end_character":19},"updated":"2016-12-13 10:36:26.000000000","message":"This class should inherit from \u0027object\u0027","commit_id":"dfa3bc9aeda26c0cd5efb2db5811088db4c8a92c"},{"author":{"_account_id":14591,"name":"Lubosz Kosnik (diltram)","email":"lubosz.kosnik@intel.com","username":"diltram"},"change_message_id":"c012ebf5144654cfc3b5640f2c6272419c622a02","unresolved":false,"context_lines":[{"line_number":32,"context_line":"            state.request.params.mixed())"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"class SortingHelper:"},{"line_number":36,"context_line":"    \"\"\"Class helping to interact with sorting functionaly."},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    It\u0027s intended to pass that class to `db.repositories` to apply it on query"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a6eadb0_5db61d3e","line":35,"range":{"start_line":35,"start_character":6,"end_line":35,"end_character":19},"in_reply_to":"1a6eadb0_e3775900","updated":"2016-12-19 18:13:10.000000000","message":"It\u0027s a new way of defining classes in python (new, added into python in v 2.2 and finally approved in 2.5). It\u0027s equivalent to SortingHelper(object).","commit_id":"dfa3bc9aeda26c0cd5efb2db5811088db4c8a92c"},{"author":{"_account_id":6579,"name":"Nir Magnezi","email":"nmagnezi@redhat.com","username":"nmagnezi"},"change_message_id":"f5edd493bc30d8dac879e0f895ee0bca6be8b0bf","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        return query"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"class PaginationHelper:"},{"line_number":107,"context_line":"    \"\"\"Class helping to interact with pagination functionaly."},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    It\u0027s intended to pass that class to `db.repositories` to apply it on query"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a6eadb0_a3548154","line":106,"range":{"start_line":106,"start_character":6,"end_line":106,"end_character":22},"updated":"2016-12-13 10:36:26.000000000","message":"ditto","commit_id":"dfa3bc9aeda26c0cd5efb2db5811088db4c8a92c"},{"author":{"_account_id":14591,"name":"Lubosz Kosnik (diltram)","email":"lubosz.kosnik@intel.com","username":"diltram"},"change_message_id":"c012ebf5144654cfc3b5640f2c6272419c622a02","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        return query"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"class PaginationHelper:"},{"line_number":107,"context_line":"    \"\"\"Class helping to interact with pagination functionaly."},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    It\u0027s intended to pass that class to `db.repositories` to apply it on query"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a6eadb0_7de83917","line":106,"range":{"start_line":106,"start_character":6,"end_line":106,"end_character":22},"in_reply_to":"1a6eadb0_a3548154","updated":"2016-12-19 18:13:10.000000000","message":"^^","commit_id":"dfa3bc9aeda26c0cd5efb2db5811088db4c8a92c"},{"author":{"_account_id":6579,"name":"Nir Magnezi","email":"nmagnezi@redhat.com","username":"nmagnezi"},"change_message_id":"f5edd493bc30d8dac879e0f895ee0bca6be8b0bf","unresolved":false,"context_lines":[{"line_number":146,"context_line":"        the db and passed to us as \u0027marker\u0027."},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"        :param query: SQLAlchemy Query object that needs paging/sorting added."},{"line_number":149,"context_line":"        :param model_class: Maximum number of items to return."},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"        :rtype: sqlalchemy.orm.query.Query"},{"line_number":152,"context_line":"        :returns: Query object with paging/sorting added."},{"line_number":153,"context_line":"        \"\"\""},{"line_number":154,"context_line":"        if self.marker:"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a6eadb0_960c2144","line":151,"range":{"start_line":149,"start_character":0,"end_line":151,"end_character":42},"updated":"2016-12-13 10:36:26.000000000","message":"Those are absent from the function signature.","commit_id":"dfa3bc9aeda26c0cd5efb2db5811088db4c8a92c"},{"author":{"_account_id":14591,"name":"Lubosz Kosnik (diltram)","email":"lubosz.kosnik@intel.com","username":"diltram"},"change_message_id":"c012ebf5144654cfc3b5640f2c6272419c622a02","unresolved":false,"context_lines":[{"line_number":146,"context_line":"        the db and passed to us as \u0027marker\u0027."},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"        :param query: SQLAlchemy Query object that needs paging/sorting added."},{"line_number":149,"context_line":"        :param model_class: Maximum number of items to return."},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"        :rtype: sqlalchemy.orm.query.Query"},{"line_number":152,"context_line":"        :returns: Query object with paging/sorting added."},{"line_number":153,"context_line":"        \"\"\""},{"line_number":154,"context_line":"        if self.marker:"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a6eadb0_1d6f4593","line":151,"range":{"start_line":149,"start_character":0,"end_line":151,"end_character":42},"in_reply_to":"1a6eadb0_960c2144","updated":"2016-12-19 18:13:10.000000000","message":"rtype specify what object will be returned. model_class removed.","commit_id":"dfa3bc9aeda26c0cd5efb2db5811088db4c8a92c"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"2aafde7a51eed2ace4da00d835b643042d80bd75","unresolved":false,"context_lines":[{"line_number":32,"context_line":"            state.request.params.mixed())"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"class SortingHelper:"},{"line_number":36,"context_line":"    \"\"\"Class helping to interact with sorting functionaly."},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    It\u0027s intended to pass that class to `db.repositories` to apply it on query"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a6eadb0_572cfe49","line":35,"updated":"2016-12-20 19:09:10.000000000","message":"I believe Nir was right -- while this WORKS still, there is subtly different behavior in Py2 between this and SortingHelper(object). We should use the latter.","commit_id":"cf6bf028dbed3f37a2a57ddef6544e3c19cd2630"},{"author":{"_account_id":14591,"name":"Lubosz Kosnik (diltram)","email":"lubosz.kosnik@intel.com","username":"diltram"},"change_message_id":"7d8cec9bff649a6e5e2c13cbd8c180ca00fa1aae","unresolved":false,"context_lines":[{"line_number":32,"context_line":"            state.request.params.mixed())"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"class SortingHelper:"},{"line_number":36,"context_line":"    \"\"\"Class helping to interact with sorting functionaly."},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    It\u0027s intended to pass that class to `db.repositories` to apply it on query"}],"source_content_type":"text/x-python","patch_set":11,"id":"ba5201f7_5e453215","line":35,"in_reply_to":"1a6eadb0_572cfe49","updated":"2017-01-03 16:31:24.000000000","message":"True, my mistake.","commit_id":"cf6bf028dbed3f37a2a57ddef6544e3c19cd2630"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"2aafde7a51eed2ace4da00d835b643042d80bd75","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        return query"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"class PaginationHelper:"},{"line_number":107,"context_line":"    \"\"\"Class helping to interact with pagination functionaly."},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    It\u0027s intended to pass that class to `db.repositories` to apply it on query"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a6eadb0_97269666","line":106,"updated":"2016-12-20 19:09:10.000000000","message":"Same.","commit_id":"cf6bf028dbed3f37a2a57ddef6544e3c19cd2630"},{"author":{"_account_id":14591,"name":"Lubosz Kosnik (diltram)","email":"lubosz.kosnik@intel.com","username":"diltram"},"change_message_id":"7d8cec9bff649a6e5e2c13cbd8c180ca00fa1aae","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        return query"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"class PaginationHelper:"},{"line_number":107,"context_line":"    \"\"\"Class helping to interact with pagination functionaly."},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    It\u0027s intended to pass that class to `db.repositories` to apply it on query"}],"source_content_type":"text/x-python","patch_set":11,"id":"ba5201f7_7e4cb642","line":106,"in_reply_to":"1a6eadb0_97269666","updated":"2017-01-03 16:31:24.000000000","message":"Done","commit_id":"cf6bf028dbed3f37a2a57ddef6544e3c19cd2630"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"e5418774fe435541c32dfcf42bfb1d65a311f264","unresolved":false,"context_lines":[{"line_number":91,"context_line":"            for(key_name, key_dir) in self.params:"},{"line_number":92,"context_line":"                try:"},{"line_number":93,"context_line":"                    sort_attr \u003d getattr(model_class, key_name)"},{"line_number":94,"context_line":"                except AttributeError:"},{"line_number":95,"context_line":"                    raise exceptions.InvalidSortKey()"},{"line_number":96,"context_line":"                if key_dir.lower() \u003d\u003d constants.ASC:"},{"line_number":97,"context_line":"                    query \u003d query.order_by(sqlalchemy.asc(sort_attr))"}],"source_content_type":"text/x-python","patch_set":13,"id":"ba5201f7_33940ee1","line":94,"updated":"2017-01-11 05:08:51.000000000","message":"Unit tests are missing for these exception paths.","commit_id":"cd9be4e56c6208205459066d5db7dad95e8ca951"}],"octavia/api/v1/controllers/base.py":[{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"26907d770b88c60e5158d93a96610dfe1cd48f62","unresolved":false,"context_lines":[{"line_number":67,"context_line":"        return db_obj"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    @staticmethod"},{"line_number":70,"context_line":"    def get_sort_params(sort_dirkeys):"},{"line_number":71,"context_line":"        sorts \u003d []"},{"line_number":72,"context_line":"        if sort_dirkeys is None:"},{"line_number":73,"context_line":"            return sorts"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a95cdbc_f8ca76a0","line":70,"updated":"2016-10-06 09:13:35.000000000","message":"Should this be an underscore-method _get_sort_params like the other stuff here? My guess is yes.","commit_id":"1a747a925f0a641bcb335e93bbeb8457acbbe198"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"850cb02cd5b44a03f90d9e62cfd4fde8990caf7d","unresolved":false,"context_lines":[{"line_number":67,"context_line":"        return db_obj"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    @staticmethod"},{"line_number":70,"context_line":"    def get_sort_params(sort_dirkeys):"},{"line_number":71,"context_line":"        sorts \u003d []"},{"line_number":72,"context_line":"        if sort_dirkeys is None:"},{"line_number":73,"context_line":"            return sorts"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa6399be_4ed685c6","line":70,"in_reply_to":"1a95cdbc_f8ca76a0","updated":"2016-10-11 07:48:56.000000000","message":"Done","commit_id":"1a747a925f0a641bcb335e93bbeb8457acbbe198"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"26907d770b88c60e5158d93a96610dfe1cd48f62","unresolved":false,"context_lines":[{"line_number":83,"context_line":"        return sorts"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    @staticmethod"},{"line_number":86,"context_line":"    def _validate_sort_dir(sort_dir):"},{"line_number":87,"context_line":"        if sort_dir not in (\u0027asc\u0027, \u0027desc\u0027):"},{"line_number":88,"context_line":"            raise exceptions.InvalidSortDirection()"},{"line_number":89,"context_line":"        return sort_dir  # Yes its valid :)"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a95cdbc_d8085adc","line":86,"updated":"2016-10-06 09:13:35.000000000","message":"Maybe normalize sort_dir to lowercase here? It only matters if it\u0027s possible to get \"ASC\"/\"DESC\" through to this point, but I\u0027d guess you can, given the need to validate.\n\nsort_dir \u003d sort_dir.lower()\n\nThen it\u0027ll pass the test and return the correct lowercase version for handling later.","commit_id":"1a747a925f0a641bcb335e93bbeb8457acbbe198"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"850cb02cd5b44a03f90d9e62cfd4fde8990caf7d","unresolved":false,"context_lines":[{"line_number":83,"context_line":"        return sorts"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    @staticmethod"},{"line_number":86,"context_line":"    def _validate_sort_dir(sort_dir):"},{"line_number":87,"context_line":"        if sort_dir not in (\u0027asc\u0027, \u0027desc\u0027):"},{"line_number":88,"context_line":"            raise exceptions.InvalidSortDirection()"},{"line_number":89,"context_line":"        return sort_dir  # Yes its valid :)"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa6399be_6edb49ee","line":86,"in_reply_to":"1a95cdbc_d8085adc","updated":"2016-10-11 07:48:56.000000000","message":"Done","commit_id":"1a747a925f0a641bcb335e93bbeb8457acbbe198"}],"octavia/api/v1/controllers/load_balancer.py":[{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"41a9e7dae4a0a24aec491c4493df858df85d16b6","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        project_id \u003d context.project_id or project_id or tenant_id"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"        load_balancers \u003d self.repositories.load_balancer.get_all("},{"line_number":67,"context_line":"            context.session, sorting_helper\u003dpcontext.get(\u0027sorting_helper\u0027),"},{"line_number":68,"context_line":"            pagination_helper\u003dpcontext.get(\u0027pagination_helper\u0027),"},{"line_number":69,"context_line":"            project_id\u003dproject_id)"},{"line_number":70,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"1a6eadb0_1602fa3e","line":67,"updated":"2016-12-12 15:37:13.000000000","message":"I think we use that often enough to make it a constant","commit_id":"1547af70496eba5335920b8fb311897e356dc64c"},{"author":{"_account_id":14591,"name":"Lubosz Kosnik (diltram)","email":"lubosz.kosnik@intel.com","username":"diltram"},"change_message_id":"692f090fb1559efc9f8c34bab4c9d315be5d2249","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        project_id \u003d context.project_id or project_id or tenant_id"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"        load_balancers \u003d self.repositories.load_balancer.get_all("},{"line_number":67,"context_line":"            context.session, sorting_helper\u003dpcontext.get(\u0027sorting_helper\u0027),"},{"line_number":68,"context_line":"            pagination_helper\u003dpcontext.get(\u0027pagination_helper\u0027),"},{"line_number":69,"context_line":"            project_id\u003dproject_id)"},{"line_number":70,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"1a6eadb0_e7594a90","line":67,"in_reply_to":"1a6eadb0_1602fa3e","updated":"2016-12-12 16:36:42.000000000","message":"Done","commit_id":"1547af70496eba5335920b8fb311897e356dc64c"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"41a9e7dae4a0a24aec491c4493df858df85d16b6","unresolved":false,"context_lines":[{"line_number":65,"context_line":""},{"line_number":66,"context_line":"        load_balancers \u003d self.repositories.load_balancer.get_all("},{"line_number":67,"context_line":"            context.session, sorting_helper\u003dpcontext.get(\u0027sorting_helper\u0027),"},{"line_number":68,"context_line":"            pagination_helper\u003dpcontext.get(\u0027pagination_helper\u0027),"},{"line_number":69,"context_line":"            project_id\u003dproject_id)"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"        return self._convert_db_to_type(load_balancers,"}],"source_content_type":"text/x-python","patch_set":8,"id":"1a6eadb0_f6a3be4d","line":68,"updated":"2016-12-12 15:37:13.000000000","message":"same","commit_id":"1547af70496eba5335920b8fb311897e356dc64c"},{"author":{"_account_id":14591,"name":"Lubosz Kosnik (diltram)","email":"lubosz.kosnik@intel.com","username":"diltram"},"change_message_id":"692f090fb1559efc9f8c34bab4c9d315be5d2249","unresolved":false,"context_lines":[{"line_number":65,"context_line":""},{"line_number":66,"context_line":"        load_balancers \u003d self.repositories.load_balancer.get_all("},{"line_number":67,"context_line":"            context.session, sorting_helper\u003dpcontext.get(\u0027sorting_helper\u0027),"},{"line_number":68,"context_line":"            pagination_helper\u003dpcontext.get(\u0027pagination_helper\u0027),"},{"line_number":69,"context_line":"            project_id\u003dproject_id)"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"        return self._convert_db_to_type(load_balancers,"}],"source_content_type":"text/x-python","patch_set":8,"id":"1a6eadb0_075f2673","line":68,"in_reply_to":"1a6eadb0_f6a3be4d","updated":"2016-12-12 16:36:42.000000000","message":"Done","commit_id":"1547af70496eba5335920b8fb311897e356dc64c"}],"octavia/api/v1/controllers/member.py":[{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"26907d770b88c60e5158d93a96610dfe1cd48f62","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        \"\"\"Lists all pool members of a pool.\"\"\""},{"line_number":56,"context_line":"        context \u003d pecan.request.context.get(\u0027octavia_context\u0027)"},{"line_number":57,"context_line":"        db_members \u003d self.repositories.member.get_all("},{"line_number":58,"context_line":"            context.session, pool_id\u003dself.pool_id, sort\u003dNone, limit\u003dNone,"},{"line_number":59,"context_line":"            marker\u003dNone)"},{"line_number":60,"context_line":"        return self._convert_db_to_type(db_members,"},{"line_number":61,"context_line":"                                        [member_types.MemberResponse])"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a95cdbc_38e85ee2","line":58,"updated":"2016-10-06 09:13:35.000000000","message":"Wait, why can\u0027t we sort or limit pool members? I\u0027m guessing this isn\u0027t supported in neutron-lbaas so we\u0027re not supporting it here?","commit_id":"1a747a925f0a641bcb335e93bbeb8457acbbe198"}],"octavia/api/v1/controllers/pool.py":[{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"26907d770b88c60e5158d93a96610dfe1cd48f62","unresolved":false,"context_lines":[{"line_number":62,"context_line":"                                          self.listener_id).pools"},{"line_number":63,"context_line":"        else:"},{"line_number":64,"context_line":"            pools \u003d self.repositories.pool.get_all("},{"line_number":65,"context_line":"                context.session, load_balancer_id\u003dself.load_balancer_id)"},{"line_number":66,"context_line":"        return self._convert_db_to_type(pools, [pool_types.PoolResponse])"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    def _get_affected_listener_ids(self, session, pool\u003dNone):"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a95cdbc_38cf7e80","line":65,"updated":"2016-10-06 09:13:35.000000000","message":"Same as members, are we not allowing for sorting/limits on pools?","commit_id":"1a747a925f0a641bcb335e93bbeb8457acbbe198"}],"octavia/common/config.py":[{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"2050bdb717342b9d6a1be0a88b423d545f778a16","unresolved":false,"context_lines":[{"line_number":46,"context_line":"                help\u003d_(\"Allow the usage of the pagination\")),"},{"line_number":47,"context_line":"    cfg.BoolOpt(\u0027allow_sorting\u0027, default\u003dTrue,"},{"line_number":48,"context_line":"                help\u003d_(\"Allow the usage of the sorting\")),"},{"line_number":49,"context_line":"    cfg.StrOpt(\u0027pagination_max_limit\u0027, default\u003dconstants.DEFAULT_PAGE_SIZE,"},{"line_number":50,"context_line":"               help\u003d_(\"The maximum number of items returned in a single \""},{"line_number":51,"context_line":"                      \"response. The string \u0027infinite\u0027 or a negative \""},{"line_number":52,"context_line":"                      \"integer value means \u0027no limit\u0027\")),"}],"source_content_type":"text/x-python","patch_set":38,"id":"5ff73747_81237a56","line":49,"range":{"start_line":49,"start_character":4,"end_line":49,"end_character":75},"updated":"2017-04-26 22:43:05.000000000","message":"There is a type mismatch here with a string option and an integer constant.  The automatic configuration docs generate is failing due to this.","commit_id":"74d325feb85924d642ba5281c2e62da696ce1429"}],"octavia/common/constants.py":[{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"2aafde7a51eed2ace4da00d835b643042d80bd75","unresolved":false,"context_lines":[{"line_number":364,"context_line":"NOAUTH \u003d \u0027noauth\u0027"},{"line_number":365,"context_line":""},{"line_number":366,"context_line":"# Pagination, sorting, filtering values"},{"line_number":367,"context_line":"APPLICATION_JSON \u003d \"application/json\""},{"line_number":368,"context_line":"SORTING_HELPER \u003d \u0027sorting_helper\u0027"},{"line_number":369,"context_line":"PAGINATION_HELPER \u003d \u0027pagination_helper\u0027"},{"line_number":370,"context_line":"ASC \u003d \u0027asc\u0027"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a6eadb0_77d65a28","line":367,"updated":"2016-12-20 19:09:10.000000000","message":"My OCD is tingling... If there\u0027s another patch, those quotes...","commit_id":"cf6bf028dbed3f37a2a57ddef6544e3c19cd2630"},{"author":{"_account_id":14591,"name":"Lubosz Kosnik (diltram)","email":"lubosz.kosnik@intel.com","username":"diltram"},"change_message_id":"7d8cec9bff649a6e5e2c13cbd8c180ca00fa1aae","unresolved":false,"context_lines":[{"line_number":364,"context_line":"NOAUTH \u003d \u0027noauth\u0027"},{"line_number":365,"context_line":""},{"line_number":366,"context_line":"# Pagination, sorting, filtering values"},{"line_number":367,"context_line":"APPLICATION_JSON \u003d \"application/json\""},{"line_number":368,"context_line":"SORTING_HELPER \u003d \u0027sorting_helper\u0027"},{"line_number":369,"context_line":"PAGINATION_HELPER \u003d \u0027pagination_helper\u0027"},{"line_number":370,"context_line":"ASC \u003d \u0027asc\u0027"}],"source_content_type":"text/x-python","patch_set":11,"id":"ba5201f7_1e62caad","line":367,"in_reply_to":"1a6eadb0_77d65a28","updated":"2017-01-03 16:31:24.000000000","message":"I don\u0027t understand","commit_id":"cf6bf028dbed3f37a2a57ddef6544e3c19cd2630"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"feb8fe69080092eac02a037967212b4f2aea4331","unresolved":false,"context_lines":[{"line_number":364,"context_line":"NOAUTH \u003d \u0027noauth\u0027"},{"line_number":365,"context_line":""},{"line_number":366,"context_line":"# Pagination, sorting, filtering values"},{"line_number":367,"context_line":"APPLICATION_JSON \u003d \"application/json\""},{"line_number":368,"context_line":"SORTING_HELPER \u003d \u0027sorting_helper\u0027"},{"line_number":369,"context_line":"PAGINATION_HELPER \u003d \u0027pagination_helper\u0027"},{"line_number":370,"context_line":"ASC \u003d \u0027asc\u0027"}],"source_content_type":"text/x-python","patch_set":11,"id":"ba5201f7_e660d803","line":367,"in_reply_to":"ba5201f7_1e62caad","updated":"2017-01-05 06:16:59.000000000","message":"It\u0027s the only string in this file that uses double quotes, EVERYTHING else is single quotes. :P","commit_id":"cf6bf028dbed3f37a2a57ddef6544e3c19cd2630"},{"author":{"_account_id":14591,"name":"Lubosz Kosnik (diltram)","email":"lubosz.kosnik@intel.com","username":"diltram"},"change_message_id":"44d540a96b1ba5d4bb6a73f4daec744ef5f69c16","unresolved":false,"context_lines":[{"line_number":364,"context_line":"NOAUTH \u003d \u0027noauth\u0027"},{"line_number":365,"context_line":""},{"line_number":366,"context_line":"# Pagination, sorting, filtering values"},{"line_number":367,"context_line":"APPLICATION_JSON \u003d \"application/json\""},{"line_number":368,"context_line":"SORTING_HELPER \u003d \u0027sorting_helper\u0027"},{"line_number":369,"context_line":"PAGINATION_HELPER \u003d \u0027pagination_helper\u0027"},{"line_number":370,"context_line":"ASC \u003d \u0027asc\u0027"}],"source_content_type":"text/x-python","patch_set":11,"id":"ba5201f7_a475a864","line":367,"in_reply_to":"ba5201f7_e660d803","updated":"2017-01-06 17:14:27.000000000","message":"It\u0027s your fault. You wrote that line if I\u0027m right :P\nDone.","commit_id":"cf6bf028dbed3f37a2a57ddef6544e3c19cd2630"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"c0f77e653c53609181935d6e4d869fc71f9c9f87","unresolved":false,"context_lines":[{"line_number":417,"context_line":"ALLOWED_SORT_DIR \u003d (ASC, DESC)"},{"line_number":418,"context_line":"DEFAULT_SORT_DIR \u003d ASC"},{"line_number":419,"context_line":"DEFAULT_SORT_KEYS \u003d [\u0027created_at\u0027, \u0027id\u0027]"},{"line_number":420,"context_line":"MAX_PAGE_SIZE \u003d 1000"}],"source_content_type":"text/x-python","patch_set":37,"id":"5ff73747_ef2132fd","line":420,"updated":"2017-04-25 22:40:19.000000000","message":"This should be from the configuration file setting: \"pagination_max_limit\" as listed here:\nhttps://docs.openstack.org/developer/octavia/main/configref.html#DEFAULT.pagination_max_limit","commit_id":"d4b919b3c16fe91b196773c7fe6bf4c7936ab3fc"}],"octavia/common/exceptions.py":[{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"26907d770b88c60e5158d93a96610dfe1cd48f62","unresolved":false,"context_lines":[{"line_number":240,"context_line":""},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"class InvalidSortKey(OctaviaException):"},{"line_number":243,"context_line":"    message \u003d _LE(\"Sort key supplied was not valid.\")"},{"line_number":244,"context_line":""},{"line_number":245,"context_line":""},{"line_number":246,"context_line":"class InvalidSortDirection(OctaviaException):"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a95cdbc_f8b0b6df","line":243,"updated":"2016-10-06 09:13:35.000000000","message":"A nit on ALL of these messages:\nI think \"Supplied \u003cx\u003e was not valid.\" is more correct word ordering, but I don\u0027t know if anyone besides me cares.","commit_id":"1a747a925f0a641bcb335e93bbeb8457acbbe198"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"850cb02cd5b44a03f90d9e62cfd4fde8990caf7d","unresolved":false,"context_lines":[{"line_number":240,"context_line":""},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"class InvalidSortKey(OctaviaException):"},{"line_number":243,"context_line":"    message \u003d _LE(\"Sort key supplied was not valid.\")"},{"line_number":244,"context_line":""},{"line_number":245,"context_line":""},{"line_number":246,"context_line":"class InvalidSortDirection(OctaviaException):"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa6399be_8effbd33","line":243,"in_reply_to":"1a95cdbc_f8b0b6df","updated":"2016-10-11 07:48:56.000000000","message":"Done","commit_id":"1a747a925f0a641bcb335e93bbeb8457acbbe198"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"26907d770b88c60e5158d93a96610dfe1cd48f62","unresolved":false,"context_lines":[{"line_number":248,"context_line":""},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"class InvalidMarker(OctaviaException):"},{"line_number":251,"context_line":"    message \u003d _LE(\"Pagenation marker supplied was not valid.\")"},{"line_number":252,"context_line":""},{"line_number":253,"context_line":""},{"line_number":254,"context_line":"class InvalidLimit(OctaviaException):"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a95cdbc_989b3272","line":251,"updated":"2016-10-06 09:13:35.000000000","message":"nit: Pagination","commit_id":"1a747a925f0a641bcb335e93bbeb8457acbbe198"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"850cb02cd5b44a03f90d9e62cfd4fde8990caf7d","unresolved":false,"context_lines":[{"line_number":248,"context_line":""},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"class InvalidMarker(OctaviaException):"},{"line_number":251,"context_line":"    message \u003d _LE(\"Pagenation marker supplied was not valid.\")"},{"line_number":252,"context_line":""},{"line_number":253,"context_line":""},{"line_number":254,"context_line":"class InvalidLimit(OctaviaException):"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa6399be_aefc813f","line":251,"in_reply_to":"1a95cdbc_989b3272","updated":"2016-10-11 07:48:56.000000000","message":"Done","commit_id":"1a747a925f0a641bcb335e93bbeb8457acbbe198"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"26907d770b88c60e5158d93a96610dfe1cd48f62","unresolved":false,"context_lines":[{"line_number":252,"context_line":""},{"line_number":253,"context_line":""},{"line_number":254,"context_line":"class InvalidLimit(OctaviaException):"},{"line_number":255,"context_line":"    message \u003d _LE(\"Pagenation limit supplied was not valid.\")"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a95cdbc_b888ee23","line":255,"updated":"2016-10-06 09:13:35.000000000","message":"nit: Pagination","commit_id":"1a747a925f0a641bcb335e93bbeb8457acbbe198"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"850cb02cd5b44a03f90d9e62cfd4fde8990caf7d","unresolved":false,"context_lines":[{"line_number":252,"context_line":""},{"line_number":253,"context_line":""},{"line_number":254,"context_line":"class InvalidLimit(OctaviaException):"},{"line_number":255,"context_line":"    message \u003d _LE(\"Pagenation limit supplied was not valid.\")"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa6399be_cef9b54f","line":255,"in_reply_to":"1a95cdbc_b888ee23","updated":"2016-10-11 07:48:56.000000000","message":"Done","commit_id":"1a747a925f0a641bcb335e93bbeb8457acbbe198"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"41a9e7dae4a0a24aec491c4493df858df85d16b6","unresolved":false,"context_lines":[{"line_number":239,"context_line":"    message \u003d _LE(\u0027Failed to delete server group object.\u0027)"},{"line_number":240,"context_line":""},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"class InvalidSortKey(OctaviaException):"},{"line_number":243,"context_line":"    message \u003d _LE(\"Supplied sort key is not valid.\")"},{"line_number":244,"context_line":""},{"line_number":245,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"1a6eadb0_f671fee1","line":242,"updated":"2016-12-12 15:37:13.000000000","message":"might be better to also print the offending key for logging","commit_id":"1547af70496eba5335920b8fb311897e356dc64c"},{"author":{"_account_id":14591,"name":"Lubosz Kosnik (diltram)","email":"lubosz.kosnik@intel.com","username":"diltram"},"change_message_id":"692f090fb1559efc9f8c34bab4c9d315be5d2249","unresolved":false,"context_lines":[{"line_number":239,"context_line":"    message \u003d _LE(\u0027Failed to delete server group object.\u0027)"},{"line_number":240,"context_line":""},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"class InvalidSortKey(OctaviaException):"},{"line_number":243,"context_line":"    message \u003d _LE(\"Supplied sort key is not valid.\")"},{"line_number":244,"context_line":""},{"line_number":245,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"1a6eadb0_e243f86a","line":242,"in_reply_to":"1a6eadb0_f671fee1","updated":"2016-12-12 16:36:42.000000000","message":"Done","commit_id":"1547af70496eba5335920b8fb311897e356dc64c"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"41a9e7dae4a0a24aec491c4493df858df85d16b6","unresolved":false,"context_lines":[{"line_number":244,"context_line":""},{"line_number":245,"context_line":""},{"line_number":246,"context_line":"class InvalidSortDirection(OctaviaException):"},{"line_number":247,"context_line":"    message \u003d _LE(\"Supplied sort direction is not valid.\")"},{"line_number":248,"context_line":""},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"class InvalidMarker(OctaviaException):"}],"source_content_type":"text/x-python","patch_set":8,"id":"1a6eadb0_9649aa91","line":247,"updated":"2016-12-12 15:37:13.000000000","message":"same with direction","commit_id":"1547af70496eba5335920b8fb311897e356dc64c"},{"author":{"_account_id":14591,"name":"Lubosz Kosnik (diltram)","email":"lubosz.kosnik@intel.com","username":"diltram"},"change_message_id":"692f090fb1559efc9f8c34bab4c9d315be5d2249","unresolved":false,"context_lines":[{"line_number":244,"context_line":""},{"line_number":245,"context_line":""},{"line_number":246,"context_line":"class InvalidSortDirection(OctaviaException):"},{"line_number":247,"context_line":"    message \u003d _LE(\"Supplied sort direction is not valid.\")"},{"line_number":248,"context_line":""},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"class InvalidMarker(OctaviaException):"}],"source_content_type":"text/x-python","patch_set":8,"id":"1a6eadb0_0249d48b","line":247,"in_reply_to":"1a6eadb0_9649aa91","updated":"2016-12-12 16:36:42.000000000","message":"Done","commit_id":"1547af70496eba5335920b8fb311897e356dc64c"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"41a9e7dae4a0a24aec491c4493df858df85d16b6","unresolved":false,"context_lines":[{"line_number":248,"context_line":""},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"class InvalidMarker(OctaviaException):"},{"line_number":251,"context_line":"    message \u003d _LE(\"Supplied pagination marker is not valid.\")"},{"line_number":252,"context_line":""},{"line_number":253,"context_line":""},{"line_number":254,"context_line":"class InvalidLimit(OctaviaException):"}],"source_content_type":"text/x-python","patch_set":8,"id":"1a6eadb0_5658f256","line":251,"updated":"2016-12-12 15:37:13.000000000","message":"same with marker","commit_id":"1547af70496eba5335920b8fb311897e356dc64c"},{"author":{"_account_id":14591,"name":"Lubosz Kosnik (diltram)","email":"lubosz.kosnik@intel.com","username":"diltram"},"change_message_id":"692f090fb1559efc9f8c34bab4c9d315be5d2249","unresolved":false,"context_lines":[{"line_number":248,"context_line":""},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"class InvalidMarker(OctaviaException):"},{"line_number":251,"context_line":"    message \u003d _LE(\"Supplied pagination marker is not valid.\")"},{"line_number":252,"context_line":""},{"line_number":253,"context_line":""},{"line_number":254,"context_line":"class InvalidLimit(OctaviaException):"}],"source_content_type":"text/x-python","patch_set":8,"id":"1a6eadb0_425bcc54","line":251,"in_reply_to":"1a6eadb0_5658f256","updated":"2016-12-12 16:36:42.000000000","message":"Done","commit_id":"1547af70496eba5335920b8fb311897e356dc64c"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"41a9e7dae4a0a24aec491c4493df858df85d16b6","unresolved":false,"context_lines":[{"line_number":252,"context_line":""},{"line_number":253,"context_line":""},{"line_number":254,"context_line":"class InvalidLimit(OctaviaException):"},{"line_number":255,"context_line":"    message \u003d _LE(\"Supplied pagination limit is not valid.\")"}],"source_content_type":"text/x-python","patch_set":8,"id":"1a6eadb0_b635c6f8","line":255,"updated":"2016-12-12 15:37:13.000000000","message":"same with limit","commit_id":"1547af70496eba5335920b8fb311897e356dc64c"},{"author":{"_account_id":14591,"name":"Lubosz Kosnik (diltram)","email":"lubosz.kosnik@intel.com","username":"diltram"},"change_message_id":"692f090fb1559efc9f8c34bab4c9d315be5d2249","unresolved":false,"context_lines":[{"line_number":252,"context_line":""},{"line_number":253,"context_line":""},{"line_number":254,"context_line":"class InvalidLimit(OctaviaException):"},{"line_number":255,"context_line":"    message \u003d _LE(\"Supplied pagination limit is not valid.\")"}],"source_content_type":"text/x-python","patch_set":8,"id":"1a6eadb0_8255e41e","line":255,"in_reply_to":"1a6eadb0_b635c6f8","updated":"2016-12-12 16:36:42.000000000","message":"Done","commit_id":"1547af70496eba5335920b8fb311897e356dc64c"}],"octavia/db/api.py":[{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"26907d770b88c60e5158d93a96610dfe1cd48f62","unresolved":false,"context_lines":[{"line_number":20,"context_line":"_FACADE \u003d None"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"def _create_facade_lazily():"},{"line_number":26,"context_line":"    global _FACADE"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a95cdbc_1839e241","line":23,"updated":"2016-10-06 09:13:35.000000000","message":"You imported the logger but aren\u0027t actually using it?","commit_id":"1a747a925f0a641bcb335e93bbeb8457acbbe198"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"850cb02cd5b44a03f90d9e62cfd4fde8990caf7d","unresolved":false,"context_lines":[{"line_number":20,"context_line":"_FACADE \u003d None"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"def _create_facade_lazily():"},{"line_number":26,"context_line":"    global _FACADE"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa6399be_2eb6b18a","line":23,"in_reply_to":"1a95cdbc_1839e241","updated":"2016-10-11 07:48:56.000000000","message":"Done","commit_id":"1a747a925f0a641bcb335e93bbeb8457acbbe198"}],"octavia/db/repositories.py":[{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"26907d770b88c60e5158d93a96610dfe1cd48f62","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        \"\"\"Retrieves a count of entities from the database."},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"        :param session: A Sql Alchemy database session."},{"line_number":45,"context_line":"        :param filters: filters to decide which entities should be retrieved."},{"line_number":46,"context_line":"        :returns: int"},{"line_number":47,"context_line":"        \"\"\""},{"line_number":48,"context_line":"        return session.query(self.model_class).filter_by(**filters).count()"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a95cdbc_f80c3696","line":45,"updated":"2016-10-06 09:13:35.000000000","message":"nit: Not sure why you lowercased this.","commit_id":"1a747a925f0a641bcb335e93bbeb8457acbbe198"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"26907d770b88c60e5158d93a96610dfe1cd48f62","unresolved":false,"context_lines":[{"line_number":109,"context_line":"        :param filters: Filters to decide which entities should be retrieved."},{"line_number":110,"context_line":"        :param limit: At most how many entries should be retrieved"},{"line_number":111,"context_line":"        :param marker: start returing rows at this offset"},{"line_number":112,"context_line":"        :param sort: sorting keys and directions"},{"line_number":113,"context_line":"        :returns: [octavia.common.data_model]"},{"line_number":114,"context_line":"        \"\"\""},{"line_number":115,"context_line":"        query \u003d session.query(self.model_class).filter_by(**filters)"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a95cdbc_f89fd600","line":112,"updated":"2016-10-06 09:13:35.000000000","message":"From reading the rest of the code, I *think* this is a string input that looks like \"name:asc,other1:desc,other2\" but I\u0027m not sure -- it might be useful to provide an example.","commit_id":"1a747a925f0a641bcb335e93bbeb8457acbbe198"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"850cb02cd5b44a03f90d9e62cfd4fde8990caf7d","unresolved":false,"context_lines":[{"line_number":109,"context_line":"        :param filters: Filters to decide which entities should be retrieved."},{"line_number":110,"context_line":"        :param limit: At most how many entries should be retrieved"},{"line_number":111,"context_line":"        :param marker: start returing rows at this offset"},{"line_number":112,"context_line":"        :param sort: sorting keys and directions"},{"line_number":113,"context_line":"        :returns: [octavia.common.data_model]"},{"line_number":114,"context_line":"        \"\"\""},{"line_number":115,"context_line":"        query \u003d session.query(self.model_class).filter_by(**filters)"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa6399be_d1bb180d","line":112,"in_reply_to":"1a95cdbc_f89fd600","updated":"2016-10-11 07:48:56.000000000","message":"I was wrong, but it is specified below. Updated.","commit_id":"1a747a925f0a641bcb335e93bbeb8457acbbe198"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"26907d770b88c60e5158d93a96610dfe1cd48f62","unresolved":false,"context_lines":[{"line_number":128,"context_line":"        \"\"\""},{"line_number":129,"context_line":"        return bool(session.query(self.model_class).filter_by(id\u003did).first())"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"    def paginate_sorter(self, query, limit\u003dNone, marker\u003dNone, sorts\u003dNone):"},{"line_number":132,"context_line":"        \"\"\"Returns a query with sorting / pagination criteria added."},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"        Pagination works by requiring a unique sort_key, with a direction"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a95cdbc_7882e695","line":131,"updated":"2016-10-06 09:13:35.000000000","message":"Is this meant to be used externally? I have a hunch this is supposed to be an underscore-method?","commit_id":"1a747a925f0a641bcb335e93bbeb8457acbbe198"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"850cb02cd5b44a03f90d9e62cfd4fde8990caf7d","unresolved":false,"context_lines":[{"line_number":128,"context_line":"        \"\"\""},{"line_number":129,"context_line":"        return bool(session.query(self.model_class).filter_by(id\u003did).first())"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"    def paginate_sorter(self, query, limit\u003dNone, marker\u003dNone, sorts\u003dNone):"},{"line_number":132,"context_line":"        \"\"\"Returns a query with sorting / pagination criteria added."},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"        Pagination works by requiring a unique sort_key, with a direction"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa6399be_51cf08b0","line":131,"in_reply_to":"1a95cdbc_7882e695","updated":"2016-10-11 07:48:56.000000000","message":"Done","commit_id":"1a747a925f0a641bcb335e93bbeb8457acbbe198"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"26907d770b88c60e5158d93a96610dfe1cd48f62","unresolved":false,"context_lines":[{"line_number":132,"context_line":"        \"\"\"Returns a query with sorting / pagination criteria added."},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"        Pagination works by requiring a unique sort_key, with a direction"},{"line_number":135,"context_line":"        specified by list set of 2-tuples in the sorts parameter,"},{"line_number":136,"context_line":"        (If sort_keys is not unique, then we risk looping through values.)"},{"line_number":137,"context_line":"        We use the last row in the previous page as the \u0027marker\u0027 for"},{"line_number":138,"context_line":"        pagination. So we must return values that follow the passed marker in"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a95cdbc_f309b92d","line":135,"updated":"2016-10-06 09:13:35.000000000","message":"nit: I think this is supposed to end with a period, not a comma.","commit_id":"1a747a925f0a641bcb335e93bbeb8457acbbe198"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"850cb02cd5b44a03f90d9e62cfd4fde8990caf7d","unresolved":false,"context_lines":[{"line_number":132,"context_line":"        \"\"\"Returns a query with sorting / pagination criteria added."},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"        Pagination works by requiring a unique sort_key, with a direction"},{"line_number":135,"context_line":"        specified by list set of 2-tuples in the sorts parameter,"},{"line_number":136,"context_line":"        (If sort_keys is not unique, then we risk looping through values.)"},{"line_number":137,"context_line":"        We use the last row in the previous page as the \u0027marker\u0027 for"},{"line_number":138,"context_line":"        pagination. So we must return values that follow the passed marker in"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa6399be_71c40c92","line":135,"in_reply_to":"1a95cdbc_f309b92d","updated":"2016-10-11 07:48:56.000000000","message":"Done","commit_id":"1a747a925f0a641bcb335e93bbeb8457acbbe198"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"26907d770b88c60e5158d93a96610dfe1cd48f62","unresolved":false,"context_lines":[{"line_number":143,"context_line":"        (k1 \u003e X1) or (k1 \u003d\u003d X1 \u0026\u0026 k2 \u003e X2) or (k1 \u003d\u003d X1 \u0026\u0026 k2 \u003d\u003d X2 \u0026\u0026 k3 \u003e X3)"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"        We also have to cope with different sort_directions. (\u0027asc\u0027,\u0027desc\u0027)"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"        Typically, the id of the last row is used as the client-facing"},{"line_number":149,"context_line":"        pagination marker, then the actual marker object must be fetched from"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a95cdbc_d3775d9d","line":146,"updated":"2016-10-06 09:13:35.000000000","message":"nit: double blank line","commit_id":"1a747a925f0a641bcb335e93bbeb8457acbbe198"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"850cb02cd5b44a03f90d9e62cfd4fde8990caf7d","unresolved":false,"context_lines":[{"line_number":143,"context_line":"        (k1 \u003e X1) or (k1 \u003d\u003d X1 \u0026\u0026 k2 \u003e X2) or (k1 \u003d\u003d X1 \u0026\u0026 k2 \u003d\u003d X2 \u0026\u0026 k3 \u003e X3)"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"        We also have to cope with different sort_directions. (\u0027asc\u0027,\u0027desc\u0027)"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"        Typically, the id of the last row is used as the client-facing"},{"line_number":149,"context_line":"        pagination marker, then the actual marker object must be fetched from"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa6399be_310ff4e2","line":146,"in_reply_to":"1a95cdbc_d3775d9d","updated":"2016-10-11 07:48:56.000000000","message":"Done","commit_id":"1a747a925f0a641bcb335e93bbeb8457acbbe198"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"26907d770b88c60e5158d93a96610dfe1cd48f62","unresolved":false,"context_lines":[{"line_number":147,"context_line":""},{"line_number":148,"context_line":"        Typically, the id of the last row is used as the client-facing"},{"line_number":149,"context_line":"        pagination marker, then the actual marker object must be fetched from"},{"line_number":150,"context_line":"        the db and"},{"line_number":151,"context_line":"        passed in to us as marker."},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"        :param session: the api session usd to get the model class for the"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a95cdbc_13a9c5df","line":150,"updated":"2016-10-06 09:13:35.000000000","message":"nit: I am guessing this line-break was accidental","commit_id":"1a747a925f0a641bcb335e93bbeb8457acbbe198"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"850cb02cd5b44a03f90d9e62cfd4fde8990caf7d","unresolved":false,"context_lines":[{"line_number":147,"context_line":""},{"line_number":148,"context_line":"        Typically, the id of the last row is used as the client-facing"},{"line_number":149,"context_line":"        pagination marker, then the actual marker object must be fetched from"},{"line_number":150,"context_line":"        the db and"},{"line_number":151,"context_line":"        passed in to us as marker."},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"        :param session: the api session usd to get the model class for the"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa6399be_110af0d2","line":150,"in_reply_to":"1a95cdbc_13a9c5df","updated":"2016-10-11 07:48:56.000000000","message":"Done","commit_id":"1a747a925f0a641bcb335e93bbeb8457acbbe198"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"26907d770b88c60e5158d93a96610dfe1cd48f62","unresolved":false,"context_lines":[{"line_number":150,"context_line":"        the db and"},{"line_number":151,"context_line":"        passed in to us as marker."},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"        :param session: the api session usd to get the model class for the"},{"line_number":154,"context_line":"                         query."},{"line_number":155,"context_line":"        :param query: the query object to which we should add paging/sorting"},{"line_number":156,"context_line":"        :param limit: maximum number of items to return"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a95cdbc_d3d3dd5d","line":153,"updated":"2016-10-06 09:13:35.000000000","message":"nit: used","commit_id":"1a747a925f0a641bcb335e93bbeb8457acbbe198"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"850cb02cd5b44a03f90d9e62cfd4fde8990caf7d","unresolved":false,"context_lines":[{"line_number":150,"context_line":"        the db and"},{"line_number":151,"context_line":"        passed in to us as marker."},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"        :param session: the api session usd to get the model class for the"},{"line_number":154,"context_line":"                         query."},{"line_number":155,"context_line":"        :param query: the query object to which we should add paging/sorting"},{"line_number":156,"context_line":"        :param limit: maximum number of items to return"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa6399be_31ca94a2","line":153,"in_reply_to":"1a95cdbc_d3d3dd5d","updated":"2016-10-11 07:48:56.000000000","message":"Should have noticed that session isn\u0027t even a parameter...\nRemoved.","commit_id":"1a747a925f0a641bcb335e93bbeb8457acbbe198"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"26907d770b88c60e5158d93a96610dfe1cd48f62","unresolved":false,"context_lines":[{"line_number":164,"context_line":"        :returns: The query with sorting/pagination added."},{"line_number":165,"context_line":"        \"\"\""},{"line_number":166,"context_line":"        if limit is None and marker is None and sorts is None:"},{"line_number":167,"context_line":"            return query   # nothing to do so just return the query"},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"        if sorts:"},{"line_number":170,"context_line":"            for(key_name, key_dir) in sorts:"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a95cdbc_736da997","line":167,"updated":"2016-10-06 09:13:35.000000000","message":"Doing this check here is redundant, it\u0027ll do the same number of checks below and return query just the same without these two lines.","commit_id":"1a747a925f0a641bcb335e93bbeb8457acbbe198"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"850cb02cd5b44a03f90d9e62cfd4fde8990caf7d","unresolved":false,"context_lines":[{"line_number":164,"context_line":"        :returns: The query with sorting/pagination added."},{"line_number":165,"context_line":"        \"\"\""},{"line_number":166,"context_line":"        if limit is None and marker is None and sorts is None:"},{"line_number":167,"context_line":"            return query   # nothing to do so just return the query"},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"        if sorts:"},{"line_number":170,"context_line":"            for(key_name, key_dir) in sorts:"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa6399be_f1049cc7","line":167,"in_reply_to":"1a95cdbc_736da997","updated":"2016-10-11 07:48:56.000000000","message":"Done","commit_id":"1a747a925f0a641bcb335e93bbeb8457acbbe198"}],"octavia/tests/functional/api/v1/test_api_sort.py":[{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"4e917dba4d3dfe138b5750938b96569b67af5bc1","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2012 Your Mom"},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa6399be_d9462c7a","line":1,"range":{"start_line":1,"start_character":2,"end_line":1,"end_character":25},"updated":"2016-10-14 15:54:16.000000000","message":"Classic carlos...fix please","commit_id":"82d13435977976cfc2731d31232af9335d63917d"},{"author":{"_account_id":14591,"name":"Lubosz Kosnik (diltram)","email":"lubosz.kosnik@intel.com","username":"diltram"},"change_message_id":"874c950780894020aaefb900f65fe412d693261c","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2012 Your Mom"},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa6399be_19c98459","line":1,"range":{"start_line":1,"start_character":12,"end_line":1,"end_character":25},"updated":"2016-10-14 16:02:15.000000000","message":"My mom didn\u0027t code in 2012 - we need to change that :P","commit_id":"82d13435977976cfc2731d31232af9335d63917d"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"cb6e18f6138ab3c58bbee3032b76819be7e0fe7e","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2012 Your Mom"},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa6399be_0362e909","line":1,"range":{"start_line":1,"start_character":12,"end_line":1,"end_character":25},"in_reply_to":"fa6399be_19c98459","updated":"2016-10-14 18:33:44.000000000","message":"Done","commit_id":"82d13435977976cfc2731d31232af9335d63917d"},{"author":{"_account_id":14591,"name":"Lubosz Kosnik (diltram)","email":"lubosz.kosnik@intel.com","username":"diltram"},"change_message_id":"874c950780894020aaefb900f65fe412d693261c","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        fnd_name_descs \u003d [(lb[\u0027name\u0027], lb[\u0027description\u0027]) for lb in lbs]"},{"line_number":104,"context_line":"        self.assertEqual(exp_order[8:24], fnd_name_descs)"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"        # Test the remaing [32:56] slice which is limit\u003d32 marker\u003d32"},{"line_number":107,"context_line":"        params \u003d params_fmt % (32, 24)"},{"line_number":108,"context_line":"        resp \u003d self.get(\u0027/loadbalancers\u0027, headers\u003dself.headers, params\u003dparams)"},{"line_number":109,"context_line":"        lbs \u003d json.loads(resp.body)"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa6399be_394e48c1","line":106,"range":{"start_line":106,"start_character":66,"end_line":106,"end_character":68},"updated":"2016-10-14 16:02:15.000000000","message":"24 not 32","commit_id":"82d13435977976cfc2731d31232af9335d63917d"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"cb6e18f6138ab3c58bbee3032b76819be7e0fe7e","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        fnd_name_descs \u003d [(lb[\u0027name\u0027], lb[\u0027description\u0027]) for lb in lbs]"},{"line_number":104,"context_line":"        self.assertEqual(exp_order[8:24], fnd_name_descs)"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"        # Test the remaing [32:56] slice which is limit\u003d32 marker\u003d32"},{"line_number":107,"context_line":"        params \u003d params_fmt % (32, 24)"},{"line_number":108,"context_line":"        resp \u003d self.get(\u0027/loadbalancers\u0027, headers\u003dself.headers, params\u003dparams)"},{"line_number":109,"context_line":"        lbs \u003d json.loads(resp.body)"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa6399be_6353a539","line":106,"range":{"start_line":106,"start_character":66,"end_line":106,"end_character":68},"in_reply_to":"fa6399be_394e48c1","updated":"2016-10-14 18:33:44.000000000","message":"Done","commit_id":"82d13435977976cfc2731d31232af9335d63917d"},{"author":{"_account_id":14591,"name":"Lubosz Kosnik (diltram)","email":"lubosz.kosnik@intel.com","username":"diltram"},"change_message_id":"874c950780894020aaefb900f65fe412d693261c","unresolved":false,"context_lines":[{"line_number":110,"context_line":"        fnd_name_descs \u003d [(lb[\u0027name\u0027], lb[\u0027description\u0027]) for lb in lbs]"},{"line_number":111,"context_line":"        self.assertEqual(exp_order[32:56], fnd_name_descs)"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"        # Test the last 4 entries which is slive[54:64] marker\u003d54 limit\u003d8"},{"line_number":114,"context_line":"        params \u003d params_fmt % (56, 8)"},{"line_number":115,"context_line":"        resp \u003d self.get(\u0027/loadbalancers\u0027, headers\u003dself.headers, params\u003dparams)"},{"line_number":116,"context_line":"        lbs \u003d json.loads(resp.body)"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa6399be_dc0b7a22","line":113,"range":{"start_line":113,"start_character":49,"end_line":113,"end_character":51},"updated":"2016-10-14 16:02:15.000000000","message":"56","commit_id":"82d13435977976cfc2731d31232af9335d63917d"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"cb6e18f6138ab3c58bbee3032b76819be7e0fe7e","unresolved":false,"context_lines":[{"line_number":110,"context_line":"        fnd_name_descs \u003d [(lb[\u0027name\u0027], lb[\u0027description\u0027]) for lb in lbs]"},{"line_number":111,"context_line":"        self.assertEqual(exp_order[32:56], fnd_name_descs)"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"        # Test the last 4 entries which is slive[54:64] marker\u003d54 limit\u003d8"},{"line_number":114,"context_line":"        params \u003d params_fmt % (56, 8)"},{"line_number":115,"context_line":"        resp \u003d self.get(\u0027/loadbalancers\u0027, headers\u003dself.headers, params\u003dparams)"},{"line_number":116,"context_line":"        lbs \u003d json.loads(resp.body)"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa6399be_833439fc","line":113,"range":{"start_line":113,"start_character":49,"end_line":113,"end_character":51},"in_reply_to":"fa6399be_dc0b7a22","updated":"2016-10-14 18:33:44.000000000","message":"Done","commit_id":"82d13435977976cfc2731d31232af9335d63917d"}],"octavia/tests/unit/api/hooks/test_query_parameters.py":[{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"62511987a758bad5e3d9d8ea8991f9d831d298ae","unresolved":false,"context_lines":[{"line_number":82,"context_line":""},{"line_number":83,"context_line":"        self.assertEqual(marker, helper.marker)"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    def test_limit(self):"},{"line_number":86,"context_line":"        limit \u003d 100"},{"line_number":87,"context_line":"        params \u003d {\u0027limit\u0027: limit}"},{"line_number":88,"context_line":"        helper \u003d pagination.PaginationHelper(params)"}],"source_content_type":"text/x-python","patch_set":37,"id":"5ff73747_c25e4d11","line":85,"updated":"2017-04-25 22:44:45.000000000","message":"Doesn\u0027t test over limit or -1","commit_id":"d4b919b3c16fe91b196773c7fe6bf4c7936ab3fc"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"32bc1ebf85cab07a546136fc605343a2537cb9b9","unresolved":false,"context_lines":[{"line_number":82,"context_line":""},{"line_number":83,"context_line":"        self.assertEqual(marker, helper.marker)"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    def test_limit(self):"},{"line_number":86,"context_line":"        limit \u003d 100"},{"line_number":87,"context_line":"        params \u003d {\u0027limit\u0027: limit}"},{"line_number":88,"context_line":"        helper \u003d pagination.PaginationHelper(params)"}],"source_content_type":"text/x-python","patch_set":37,"id":"5ff73747_e52153fd","line":85,"in_reply_to":"5ff73747_4587e710","updated":"2017-04-25 23:57:39.000000000","message":"I already covered that in my docs (score): If the client requests a limit beyond the maximum limit configured by the deployment, the server returns the maximum limit number of items.","commit_id":"d4b919b3c16fe91b196773c7fe6bf4c7936ab3fc"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"a0b7e9aa778c6d1ff627ba3a1852528bb293028e","unresolved":false,"context_lines":[{"line_number":82,"context_line":""},{"line_number":83,"context_line":"        self.assertEqual(marker, helper.marker)"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    def test_limit(self):"},{"line_number":86,"context_line":"        limit \u003d 100"},{"line_number":87,"context_line":"        params \u003d {\u0027limit\u0027: limit}"},{"line_number":88,"context_line":"        helper \u003d pagination.PaginationHelper(params)"}],"source_content_type":"text/x-python","patch_set":37,"id":"5ff73747_4587e710","line":85,"in_reply_to":"5ff73747_c25e4d11","updated":"2017-04-25 23:47:07.000000000","message":"OK I\u0027ll add a test for this... But, what is the behavior supposed to be? If the user asks for a page size over the limit, do we just reduce to the limit, or do we error? I assume just reduce?","commit_id":"d4b919b3c16fe91b196773c7fe6bf4c7936ab3fc"}]}
