)]}'
{"murano/api/v1/catalog.py":[{"author":{"_account_id":8127,"name":"Alexander Tivelkov","email":"locher@yandex.ru","username":"ativelkov"},"change_message_id":"6fbc7f6146ce68d316bd2455a3f04ac3c6a98a3d","unresolved":false,"context_lines":[{"line_number":178,"context_line":"        policy.check(\"get_package\", req.context)"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"        filters \u003d _get_filters(req.GET.items())"},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"        limit \u003d _validate_limit(filters.get(\u0027limit\u0027))"},{"line_number":183,"context_line":"        if limit is None:"},{"line_number":184,"context_line":"            limit \u003d CONF.packages_opts.limit_param_default"}],"source_content_type":"text/x-python","patch_set":3,"id":"7ad32947_8ea6efbf","line":181,"updated":"2015-04-28 11:00:13.000000000","message":"nit: extra line break here.","commit_id":"2c6b24a98e07d54d3d3db1ef96c49356ca6c1360"}],"murano/db/catalog/api.py":[{"author":{"_account_id":8127,"name":"Alexander Tivelkov","email":"locher@yandex.ru","username":"ativelkov"},"change_message_id":"6fbc7f6146ce68d316bd2455a3f04ac3c6a98a3d","unresolved":false,"context_lines":[{"line_number":30,"context_line":"SEARCH_MAPPING \u003d {\u0027fqn\u0027: \u0027fully_qualified_name\u0027,"},{"line_number":31,"context_line":"                  \u0027name\u0027: \u0027name\u0027,"},{"line_number":32,"context_line":"                  \u0027created\u0027: \u0027created\u0027,"},{"line_number":33,"context_line":"                  \u0027id\u0027: \u0027id\u0027,"},{"line_number":34,"context_line":"                  }"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"LOG \u003d logging.getLogger(__name__)"}],"source_content_type":"text/x-python","patch_set":3,"id":"7ad32947_c91741ec","line":33,"updated":"2015-04-28 11:00:13.000000000","message":"Do I understand correctly that this is going to be used at line 338 as a sort key if \u0027id\u0027 is passed? What is the meaning in sorting something by quite such a random  thing as UUID-based id?","commit_id":"2c6b24a98e07d54d3d3db1ef96c49356ca6c1360"},{"author":{"_account_id":15168,"name":"Kirill Zaitsev","email":"k.zaitsev@me.com","username":"kzaitsev"},"change_message_id":"68e40fe192172b26b010db032151c41f805e2cd8","unresolved":false,"context_lines":[{"line_number":30,"context_line":"SEARCH_MAPPING \u003d {\u0027fqn\u0027: \u0027fully_qualified_name\u0027,"},{"line_number":31,"context_line":"                  \u0027name\u0027: \u0027name\u0027,"},{"line_number":32,"context_line":"                  \u0027created\u0027: \u0027created\u0027,"},{"line_number":33,"context_line":"                  \u0027id\u0027: \u0027id\u0027,"},{"line_number":34,"context_line":"                  }"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"LOG \u003d logging.getLogger(__name__)"}],"source_content_type":"text/x-python","patch_set":3,"id":"7ad32947_5472a8e6","line":33,"in_reply_to":"7ad32947_c91741ec","updated":"2015-04-28 11:36:13.000000000","message":"This actually is part of refactoring of the pagination, I think I\u0027ll move it to a different commit altogether. The fact is that we PAGINATE over fields mentioned here. And every single field here is not unique. We should actually paginate over [\u0027name\u0027, \u0027id\u0027] pair for example to make it work, but this also requires changing pagination function. So yeah. another commit, another bug.","commit_id":"2c6b24a98e07d54d3d3db1ef96c49356ca6c1360"},{"author":{"_account_id":8127,"name":"Alexander Tivelkov","email":"locher@yandex.ru","username":"ativelkov"},"change_message_id":"6fbc7f6146ce68d316bd2455a3f04ac3c6a98a3d","unresolved":false,"context_lines":[{"line_number":256,"context_line":"    return pkg"},{"line_number":257,"context_line":""},{"line_number":258,"context_line":""},{"line_number":259,"context_line":"def package_search(filters, context, limit\u003dNone):"},{"line_number":260,"context_line":"    \"\"\"Search packages with different filters"},{"line_number":261,"context_line":"      Catalog filter-param controls the base query creation. Catalog queries"},{"line_number":262,"context_line":"      only search packages a user can deploy. Non-catalog queries searches"}],"source_content_type":"text/x-python","patch_set":3,"id":"7ad32947_ee77a300","line":259,"updated":"2015-04-28 11:00:13.000000000","message":"\u0027catalog\u0027 is not actually a filter: it\u0027s a flag which modifies the method behavior.\nSo, I\u0027d prefer it to be a function argument (i.e. `def package_search(catalog, filters, context, limit\u003dNone)`) instead, so the value is explicitly passed from outer call. \nThe REST API layer will be able to extract this flag from the query parameters  and pass to the DB layer.","commit_id":"2c6b24a98e07d54d3d3db1ef96c49356ca6c1360"},{"author":{"_account_id":15168,"name":"Kirill Zaitsev","email":"k.zaitsev@me.com","username":"kzaitsev"},"change_message_id":"68e40fe192172b26b010db032151c41f805e2cd8","unresolved":false,"context_lines":[{"line_number":256,"context_line":"    return pkg"},{"line_number":257,"context_line":""},{"line_number":258,"context_line":""},{"line_number":259,"context_line":"def package_search(filters, context, limit\u003dNone):"},{"line_number":260,"context_line":"    \"\"\"Search packages with different filters"},{"line_number":261,"context_line":"      Catalog filter-param controls the base query creation. Catalog queries"},{"line_number":262,"context_line":"      only search packages a user can deploy. Non-catalog queries searches"}],"source_content_type":"text/x-python","patch_set":3,"id":"7ad32947_3403ac44","line":259,"in_reply_to":"7ad32947_ee77a300","updated":"2015-04-28 11:36:13.000000000","message":"agreed, this was my original intention btw, but I changed it later for the commit to be more compact.","commit_id":"2c6b24a98e07d54d3d3db1ef96c49356ca6c1360"},{"author":{"_account_id":8127,"name":"Alexander Tivelkov","email":"locher@yandex.ru","username":"ativelkov"},"change_message_id":"6fbc7f6146ce68d316bd2455a3f04ac3c6a98a3d","unresolved":false,"context_lines":[{"line_number":276,"context_line":""},{"line_number":277,"context_line":"    query \u003d session.query(pkg)"},{"line_number":278,"context_line":""},{"line_number":279,"context_line":"    catalog \u003d filters.get(\u0027catalog\u0027, \u0027\u0027).lower() \u003d\u003d \u0027true\u0027"},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"    if catalog:"},{"line_number":282,"context_line":"        # Only show packages, one can deploy, i.e. own + public"}],"source_content_type":"text/x-python","patch_set":3,"id":"7ad32947_0e52df67","line":279,"updated":"2015-04-28 11:00:13.000000000","message":"converting input from string to boolean value definitely should be part of DB API. If you implement my suggestion above, this code will move to the request deserializer of REST API.","commit_id":"2c6b24a98e07d54d3d3db1ef96c49356ca6c1360"},{"author":{"_account_id":15168,"name":"Kirill Zaitsev","email":"k.zaitsev@me.com","username":"kzaitsev"},"change_message_id":"68e40fe192172b26b010db032151c41f805e2cd8","unresolved":false,"context_lines":[{"line_number":276,"context_line":""},{"line_number":277,"context_line":"    query \u003d session.query(pkg)"},{"line_number":278,"context_line":""},{"line_number":279,"context_line":"    catalog \u003d filters.get(\u0027catalog\u0027, \u0027\u0027).lower() \u003d\u003d \u0027true\u0027"},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"    if catalog:"},{"line_number":282,"context_line":"        # Only show packages, one can deploy, i.e. own + public"}],"source_content_type":"text/x-python","patch_set":3,"id":"7ad32947_74d124cd","line":279,"in_reply_to":"7ad32947_0e52df67","updated":"2015-04-28 11:36:13.000000000","message":"Done","commit_id":"2c6b24a98e07d54d3d3db1ef96c49356ca6c1360"},{"author":{"_account_id":8127,"name":"Alexander Tivelkov","email":"locher@yandex.ru","username":"ativelkov"},"change_message_id":"6fbc7f6146ce68d316bd2455a3f04ac3c6a98a3d","unresolved":false,"context_lines":[{"line_number":279,"context_line":"    catalog \u003d filters.get(\u0027catalog\u0027, \u0027\u0027).lower() \u003d\u003d \u0027true\u0027"},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"    if catalog:"},{"line_number":282,"context_line":"        # Only show packages, one can deploy, i.e. own + public"},{"line_number":283,"context_line":"        query \u003d query.filter(or_("},{"line_number":284,"context_line":"            pkg.owner_id \u003d\u003d context.tenant, pkg.is_public)"},{"line_number":285,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":3,"id":"7ad32947_2edc7be3","line":282,"updated":"2015-04-28 11:00:13.000000000","message":"nit: no comma needed between \u0027packages\u0027 and \u0027one\u0027","commit_id":"2c6b24a98e07d54d3d3db1ef96c49356ca6c1360"},{"author":{"_account_id":15168,"name":"Kirill Zaitsev","email":"k.zaitsev@me.com","username":"kzaitsev"},"change_message_id":"68e40fe192172b26b010db032151c41f805e2cd8","unresolved":false,"context_lines":[{"line_number":279,"context_line":"    catalog \u003d filters.get(\u0027catalog\u0027, \u0027\u0027).lower() \u003d\u003d \u0027true\u0027"},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"    if catalog:"},{"line_number":282,"context_line":"        # Only show packages, one can deploy, i.e. own + public"},{"line_number":283,"context_line":"        query \u003d query.filter(or_("},{"line_number":284,"context_line":"            pkg.owner_id \u003d\u003d context.tenant, pkg.is_public)"},{"line_number":285,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":3,"id":"7ad32947_b4c7bc11","line":282,"in_reply_to":"7ad32947_2edc7be3","updated":"2015-04-28 11:36:13.000000000","message":"Done","commit_id":"2c6b24a98e07d54d3d3db1ef96c49356ca6c1360"},{"author":{"_account_id":8127,"name":"Alexander Tivelkov","email":"locher@yandex.ru","username":"ativelkov"},"change_message_id":"6fbc7f6146ce68d316bd2455a3f04ac3c6a98a3d","unresolved":false,"context_lines":[{"line_number":284,"context_line":"            pkg.owner_id \u003d\u003d context.tenant, pkg.is_public)"},{"line_number":285,"context_line":"        )"},{"line_number":286,"context_line":"    else:"},{"line_number":287,"context_line":"        # Show packages, one can edit."},{"line_number":288,"context_line":"        if not context.is_admin:"},{"line_number":289,"context_line":"            query \u003d query.filter(pkg.owner_id \u003d\u003d context.tenant)"},{"line_number":290,"context_line":"        # No else here, admin can edit everything."}],"source_content_type":"text/x-python","patch_set":3,"id":"7ad32947_8e9a6f13","line":287,"updated":"2015-04-28 11:00:13.000000000","message":"nit: no comma needed between \u0027packages\u0027 and \u0027one\u0027","commit_id":"2c6b24a98e07d54d3d3db1ef96c49356ca6c1360"},{"author":{"_account_id":15168,"name":"Kirill Zaitsev","email":"k.zaitsev@me.com","username":"kzaitsev"},"change_message_id":"68e40fe192172b26b010db032151c41f805e2cd8","unresolved":false,"context_lines":[{"line_number":284,"context_line":"            pkg.owner_id \u003d\u003d context.tenant, pkg.is_public)"},{"line_number":285,"context_line":"        )"},{"line_number":286,"context_line":"    else:"},{"line_number":287,"context_line":"        # Show packages, one can edit."},{"line_number":288,"context_line":"        if not context.is_admin:"},{"line_number":289,"context_line":"            query \u003d query.filter(pkg.owner_id \u003d\u003d context.tenant)"},{"line_number":290,"context_line":"        # No else here, admin can edit everything."}],"source_content_type":"text/x-python","patch_set":3,"id":"7ad32947_f44e54c0","line":287,"in_reply_to":"7ad32947_8e9a6f13","updated":"2015-04-28 11:36:13.000000000","message":"Done","commit_id":"2c6b24a98e07d54d3d3db1ef96c49356ca6c1360"},{"author":{"_account_id":8127,"name":"Alexander Tivelkov","email":"locher@yandex.ru","username":"ativelkov"},"change_message_id":"6fbc7f6146ce68d316bd2455a3f04ac3c6a98a3d","unresolved":false,"context_lines":[{"line_number":338,"context_line":"    sort_keys \u003d [SEARCH_MAPPING[sort_key] for sort_key in"},{"line_number":339,"context_line":"                 filters.get(\u0027order_by\u0027, [\u0027name\u0027])]"},{"line_number":340,"context_line":""},{"line_number":341,"context_line":"    marker \u003d filters.get(\u0027marker\u0027)"},{"line_number":342,"context_line":"    sort_dir \u003d filters.get(\u0027sort_dir\u0027)"},{"line_number":343,"context_line":""},{"line_number":344,"context_line":"    if marker is not None:  # set marker to real object instead of its id"}],"source_content_type":"text/x-python","patch_set":3,"id":"7ad32947_e9555dc6","line":341,"updated":"2015-04-28 11:00:13.000000000","message":"This is not actually part of this commit, but since you are refactoring this anyway, could you please look at this as well? \nFor some reason we have pagination primitives (sort_dir, marker, order_by) passed here as filters, while they are definitely not. \nThis looks like an abstraction leak: \"filters\" dict turns out to be a full set of HTTP query parameters. They should not be passed here in this form but be pre-processed at the API layer side. \n\nIf you don\u0027t have time for this in this commit, let\u0027s report a new bug on this so we do not forget to refactor this in future.","commit_id":"2c6b24a98e07d54d3d3db1ef96c49356ca6c1360"},{"author":{"_account_id":15168,"name":"Kirill Zaitsev","email":"k.zaitsev@me.com","username":"kzaitsev"},"change_message_id":"68e40fe192172b26b010db032151c41f805e2cd8","unresolved":false,"context_lines":[{"line_number":338,"context_line":"    sort_keys \u003d [SEARCH_MAPPING[sort_key] for sort_key in"},{"line_number":339,"context_line":"                 filters.get(\u0027order_by\u0027, [\u0027name\u0027])]"},{"line_number":340,"context_line":""},{"line_number":341,"context_line":"    marker \u003d filters.get(\u0027marker\u0027)"},{"line_number":342,"context_line":"    sort_dir \u003d filters.get(\u0027sort_dir\u0027)"},{"line_number":343,"context_line":""},{"line_number":344,"context_line":"    if marker is not None:  # set marker to real object instead of its id"}],"source_content_type":"text/x-python","patch_set":3,"id":"7ad32947_545f4872","line":341,"in_reply_to":"7ad32947_e9555dc6","updated":"2015-04-28 11:36:13.000000000","message":"I have a bug reported for pagination, actually. I wanted to add it in the same commit, but decided to postpone.","commit_id":"2c6b24a98e07d54d3d3db1ef96c49356ca6c1360"}]}
