)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"bc3fb3f97449fca473cce9460ed940436f3a4a34","unresolved":false,"context_lines":[{"line_number":14,"context_line":"should let the database do the matching to speed up the query."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Closes-Bug:#1881865"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Change-Id: I283e78c9e7c2dd626d94cf6c1b01d4e2f9ae8097"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"9f560f44_afa8b177","line":17,"range":{"start_line":17,"start_character":0,"end_line":17,"end_character":0},"updated":"2020-09-24 04:23:48.000000000","message":"Partial-Bug: #1831094\n\nbecause you\u0027re moving the pagination params (limit, offset, sorting) to the database layer for snapshot list..","commit_id":"f1a1363f1f0dbc18762cd466791add9c25fd7af7"}],"manila/api/v1/share_snapshots.py":[{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"a44d3ade6b34a6fed8a6a53c304785a9c8d97ef4","unresolved":false,"context_lines":[{"line_number":92,"context_line":"        search_opts \u003d {}"},{"line_number":93,"context_line":"        search_opts.update(req.GET)"},{"line_number":94,"context_line":"        params \u003d common.get_pagination_params(req)"},{"line_number":95,"context_line":"        limit, offset \u003d [params.get(\u0027limit\u0027), params.get(\u0027offset\u0027)]"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"        # Remove keys that are not related to share attrs"},{"line_number":98,"context_line":"        search_opts.pop(\u0027limit\u0027, None)"},{"line_number":99,"context_line":"        search_opts.pop(\u0027offset\u0027, None)"},{"line_number":100,"context_line":"        sort_key, sort_dir \u003d common.get_sort_params(search_opts)"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"        # NOTE(vponomaryov): Manila stores in DB key \u0027display_name\u0027, but"}],"source_content_type":"text/x-python","patch_set":8,"id":"9f560f44_4f675552","line":99,"range":{"start_line":95,"start_character":0,"end_line":99,"end_character":39},"updated":"2020-09-24 04:37:23.000000000","message":"minor optimization:\n\n limit \u003d search_opts.pop(\u0027limit\u0027, None)\n offset \u003d search_opts.pop(\u0027offset\u0027, None)","commit_id":"f1a1363f1f0dbc18762cd466791add9c25fd7af7"},{"author":{"_account_id":30407,"name":"haixin","email":"haixin_haixin@qq.com","username":"haixin"},"change_message_id":"b1e3f99b3dfc3eca58670fa5331e6aeb4f80e1fa","unresolved":false,"context_lines":[{"line_number":92,"context_line":"        search_opts \u003d {}"},{"line_number":93,"context_line":"        search_opts.update(req.GET)"},{"line_number":94,"context_line":"        params \u003d common.get_pagination_params(req)"},{"line_number":95,"context_line":"        limit, offset \u003d [params.get(\u0027limit\u0027), params.get(\u0027offset\u0027)]"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"        # Remove keys that are not related to share attrs"},{"line_number":98,"context_line":"        search_opts.pop(\u0027limit\u0027, None)"},{"line_number":99,"context_line":"        search_opts.pop(\u0027offset\u0027, None)"},{"line_number":100,"context_line":"        sort_key, sort_dir \u003d common.get_sort_params(search_opts)"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"        # NOTE(vponomaryov): Manila stores in DB key \u0027display_name\u0027, but"}],"source_content_type":"text/x-python","patch_set":8,"id":"9f560f44_f219ee87","line":99,"range":{"start_line":95,"start_character":0,"end_line":99,"end_character":39},"in_reply_to":"9f560f44_4f675552","updated":"2020-09-24 07:17:34.000000000","message":"in function common.get_pagination_params(), We can check the type and numeric range of the limit parameter value, and also offset parameter. so it is better to use get_pagination_params than extract directly from the search_opts.","commit_id":"f1a1363f1f0dbc18762cd466791add9c25fd7af7"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"a44d3ade6b34a6fed8a6a53c304785a9c8d97ef4","unresolved":false,"context_lines":[{"line_number":109,"context_line":"                \u0027description\u0027)"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"        # like filter"},{"line_number":112,"context_line":"        for key, db_key in ((\u0027name~\u0027, \u0027display_name~\u0027),"},{"line_number":113,"context_line":"                            (\u0027description~\u0027, \u0027display_description~\u0027)):"},{"line_number":114,"context_line":"            if key in search_opts:"},{"line_number":115,"context_line":"                search_opts[db_key] \u003d search_opts.pop(key)"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"        common.remove_invalid_options(context, search_opts,"},{"line_number":118,"context_line":"                                      self._get_snapshots_search_options())"}],"source_content_type":"text/x-python","patch_set":8,"id":"9f560f44_2f582188","line":115,"range":{"start_line":112,"start_character":0,"end_line":115,"end_character":58},"updated":"2020-09-24 04:37:23.000000000","message":"I don\u0027t understand why we\u0027re doing this - it seems unnecessary...","commit_id":"f1a1363f1f0dbc18762cd466791add9c25fd7af7"},{"author":{"_account_id":30407,"name":"haixin","email":"haixin_haixin@qq.com","username":"haixin"},"change_message_id":"b1e3f99b3dfc3eca58670fa5331e6aeb4f80e1fa","unresolved":false,"context_lines":[{"line_number":109,"context_line":"                \u0027description\u0027)"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"        # like filter"},{"line_number":112,"context_line":"        for key, db_key in ((\u0027name~\u0027, \u0027display_name~\u0027),"},{"line_number":113,"context_line":"                            (\u0027description~\u0027, \u0027display_description~\u0027)):"},{"line_number":114,"context_line":"            if key in search_opts:"},{"line_number":115,"context_line":"                search_opts[db_key] \u003d search_opts.pop(key)"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"        common.remove_invalid_options(context, search_opts,"},{"line_number":118,"context_line":"                                      self._get_snapshots_search_options())"}],"source_content_type":"text/x-python","patch_set":8,"id":"9f560f44_35051011","line":115,"range":{"start_line":112,"start_character":0,"end_line":115,"end_character":58},"in_reply_to":"9f560f44_2f582188","updated":"2020-09-24 07:17:34.000000000","message":"this means we can use name~ in rest api to implement a fuzzy query for display name, rather than requiring the user to enter a display name, After all, using a name is more consistent with user habits than display name.","commit_id":"f1a1363f1f0dbc18762cd466791add9c25fd7af7"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"51165995b03fcc52289c8c756ca97221101d67d1","unresolved":true,"context_lines":[{"line_number":99,"context_line":"        search_opts.pop(\u0027offset\u0027, None)"},{"line_number":100,"context_line":"        sort_key, sort_dir \u003d common.get_sort_params(search_opts)"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"        # NOTE(vponomaryov): Manila stores in DB key \u0027display_name\u0027, but"},{"line_number":103,"context_line":"        # allows to use both keys \u0027name\u0027 and \u0027display_name\u0027. It is leftover"},{"line_number":104,"context_line":"        # from Cinder v1 and v2 APIs."},{"line_number":105,"context_line":"        if \u0027name\u0027 in search_opts:"},{"line_number":106,"context_line":"            search_opts[\u0027display_name\u0027] \u003d search_opts.pop(\u0027name\u0027)"},{"line_number":107,"context_line":"        if \u0027description\u0027 in search_opts:"},{"line_number":108,"context_line":"            search_opts[\u0027display_description\u0027] \u003d search_opts.pop("},{"line_number":109,"context_line":"                \u0027description\u0027)"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"        # like filter"},{"line_number":112,"context_line":"        for key, db_key in ((\u0027name~\u0027, \u0027display_name~\u0027),"},{"line_number":113,"context_line":"                            (\u0027description~\u0027, \u0027display_description~\u0027)):"},{"line_number":114,"context_line":"            if key in search_opts:"},{"line_number":115,"context_line":"                search_opts[db_key] \u003d search_opts.pop(key)"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"        common.remove_invalid_options(context, search_opts,"},{"line_number":118,"context_line":"                                      self._get_snapshots_search_options())"}],"source_content_type":"text/x-python","patch_set":14,"id":"a098eb3e_7f19392b","line":115,"range":{"start_line":102,"start_character":8,"end_line":115,"end_character":58},"updated":"2021-07-29 05:46:17.000000000","message":"You\u0027ll need to handle sort_key in the same fashion...\n\nIf sort_key \u003d name, it needs to be set to display_name\nif sort_key \u003d description, it needs to be set to display_description\n\n\nI attempted this request:\n\n\n  curl -i -X GET http://shared_file_systems.com/share/v2/snapshots/detail?name~\u003dtest-something\u0026sort_key\u003dname -H \"X-Auth-Token: $TOKEN\" -H \"X-Openstack-Manila-Api-Version: 2.63\" -H \"User-Agent: python-manilaclient\" -H \"Accept: application/json\"\n\n\nAnd I got a HTTP500, the API error log had this: https://paste.opendev.org/show/807781/\n\n\"name\" is a property and can\u0027t be used as a sort_key when using db methods; however, this was possible in the python based pagination we used to do.","commit_id":"be920c2425c91318cf0367b38c81ddae4131f177"},{"author":{"_account_id":30407,"name":"haixin","email":"haixin_haixin@qq.com","username":"haixin"},"change_message_id":"ae7469250cd1360218d9afe8d8cbff5cd583ab8f","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        search_opts.pop(\u0027offset\u0027, None)"},{"line_number":100,"context_line":"        sort_key, sort_dir \u003d common.get_sort_params(search_opts)"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"        # NOTE(vponomaryov): Manila stores in DB key \u0027display_name\u0027, but"},{"line_number":103,"context_line":"        # allows to use both keys \u0027name\u0027 and \u0027display_name\u0027. It is leftover"},{"line_number":104,"context_line":"        # from Cinder v1 and v2 APIs."},{"line_number":105,"context_line":"        if \u0027name\u0027 in search_opts:"},{"line_number":106,"context_line":"            search_opts[\u0027display_name\u0027] \u003d search_opts.pop(\u0027name\u0027)"},{"line_number":107,"context_line":"        if \u0027description\u0027 in search_opts:"},{"line_number":108,"context_line":"            search_opts[\u0027display_description\u0027] \u003d search_opts.pop("},{"line_number":109,"context_line":"                \u0027description\u0027)"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"        # like filter"},{"line_number":112,"context_line":"        for key, db_key in ((\u0027name~\u0027, \u0027display_name~\u0027),"},{"line_number":113,"context_line":"                            (\u0027description~\u0027, \u0027display_description~\u0027)):"},{"line_number":114,"context_line":"            if key in search_opts:"},{"line_number":115,"context_line":"                search_opts[db_key] \u003d search_opts.pop(key)"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"        common.remove_invalid_options(context, search_opts,"},{"line_number":118,"context_line":"                                      self._get_snapshots_search_options())"}],"source_content_type":"text/x-python","patch_set":14,"id":"9f10bdcb_9743305c","line":115,"range":{"start_line":102,"start_character":8,"end_line":115,"end_character":58},"in_reply_to":"a098eb3e_7f19392b","updated":"2021-07-29 07:12:05.000000000","message":"Done","commit_id":"be920c2425c91318cf0367b38c81ddae4131f177"}],"manila/db/sqlalchemy/api.py":[{"author":{"_account_id":29632,"name":"Carlos Eduardo","email":"ces.eduardo98@gmail.com","username":"silvacarlos"},"change_message_id":"7d6c60df7235f8b895471ef3d6c3d724c1a46dd8","unresolved":false,"context_lines":[{"line_number":250,"context_line":"        model\u003dmodel, session\u003dsession, args\u003dargs, **kwargs)"},{"line_number":251,"context_line":""},{"line_number":252,"context_line":""},{"line_number":253,"context_line":"def _process_model_like_filter(model, query, filters):"},{"line_number":254,"context_line":"    \"\"\"Applies regex expression filtering to a query."},{"line_number":255,"context_line":""},{"line_number":256,"context_line":"    :param model: model to apply filters to"}],"source_content_type":"text/x-python","patch_set":7,"id":"9f560f44_4a0b082a","line":253,"updated":"2020-09-21 12:23:55.000000000","message":"This both functions are kind of going to overlap with the one introduced in [1]. I mean, we will have two code fragments almost doing the same thing. So I think we could think about keeping only one and reusing it. What do you think?\n[1] https://review.opendev.org/#/c/703025/28/manila/db/sqlalchemy/api.py@1817","commit_id":"3ab66d31eff5952215724316d7ac5b72d2b17aa7"},{"author":{"_account_id":29632,"name":"Carlos Eduardo","email":"ces.eduardo98@gmail.com","username":"silvacarlos"},"change_message_id":"fb2dde627ce804ce34ec141e44fd2c6a03edbe42","unresolved":false,"context_lines":[{"line_number":250,"context_line":"        model\u003dmodel, session\u003dsession, args\u003dargs, **kwargs)"},{"line_number":251,"context_line":""},{"line_number":252,"context_line":""},{"line_number":253,"context_line":"def _process_model_like_filter(model, query, filters):"},{"line_number":254,"context_line":"    \"\"\"Applies regex expression filtering to a query."},{"line_number":255,"context_line":""},{"line_number":256,"context_line":"    :param model: model to apply filters to"}],"source_content_type":"text/x-python","patch_set":7,"id":"9f560f44_a28ab6b8","line":253,"in_reply_to":"9f560f44_04b297e5","updated":"2020-09-22 21:08:55.000000000","message":"Let\u0027s see the order that it is going to get merged. I do not have that kind of preference but I\u0027d say that it should be the most simple and performative one :)","commit_id":"3ab66d31eff5952215724316d7ac5b72d2b17aa7"},{"author":{"_account_id":30407,"name":"haixin","email":"haixin_haixin@qq.com","username":"haixin"},"change_message_id":"2b09601544d42a98fe3c971442b9dd0a38bb8670","unresolved":false,"context_lines":[{"line_number":250,"context_line":"        model\u003dmodel, session\u003dsession, args\u003dargs, **kwargs)"},{"line_number":251,"context_line":""},{"line_number":252,"context_line":""},{"line_number":253,"context_line":"def _process_model_like_filter(model, query, filters):"},{"line_number":254,"context_line":"    \"\"\"Applies regex expression filtering to a query."},{"line_number":255,"context_line":""},{"line_number":256,"context_line":"    :param model: model to apply filters to"}],"source_content_type":"text/x-python","patch_set":7,"id":"9f560f44_04b297e5","line":253,"in_reply_to":"9f560f44_4a0b082a","updated":"2020-09-22 08:45:52.000000000","message":"if that patch merged first, this function of fuzzy match will no need to merge, because they do the same thing,then I\u0027ll call that method to implement the fuzzy matching of the share snapshot.\n\nOr, which fuzzy matching method do you think is better?","commit_id":"3ab66d31eff5952215724316d7ac5b72d2b17aa7"},{"author":{"_account_id":29632,"name":"Carlos Eduardo","email":"ces.eduardo98@gmail.com","username":"silvacarlos"},"change_message_id":"7d6c60df7235f8b895471ef3d6c3d724c1a46dd8","unresolved":false,"context_lines":[{"line_number":274,"context_line":"    return query"},{"line_number":275,"context_line":""},{"line_number":276,"context_line":""},{"line_number":277,"context_line":"def apply_like_filters(process_exact_filters):"},{"line_number":278,"context_line":"    def _decorator(query, model, filters, legal_keys):"},{"line_number":279,"context_line":"        exact_filters \u003d filters.copy()"},{"line_number":280,"context_line":"        regex_filters \u003d {}"}],"source_content_type":"text/x-python","patch_set":7,"id":"9f560f44_05a3c301","line":277,"range":{"start_line":277,"start_character":0,"end_line":277,"end_character":46},"updated":"2020-09-21 12:23:55.000000000","message":"this and the above method are not being covered by unit tests and it would be really nice to have to increase our coverage and so on. Could you please add some more unit tests?","commit_id":"3ab66d31eff5952215724316d7ac5b72d2b17aa7"},{"author":{"_account_id":30407,"name":"haixin","email":"haixin_haixin@qq.com","username":"haixin"},"change_message_id":"2b09601544d42a98fe3c971442b9dd0a38bb8670","unresolved":false,"context_lines":[{"line_number":274,"context_line":"    return query"},{"line_number":275,"context_line":""},{"line_number":276,"context_line":""},{"line_number":277,"context_line":"def apply_like_filters(process_exact_filters):"},{"line_number":278,"context_line":"    def _decorator(query, model, filters, legal_keys):"},{"line_number":279,"context_line":"        exact_filters \u003d filters.copy()"},{"line_number":280,"context_line":"        regex_filters \u003d {}"}],"source_content_type":"text/x-python","patch_set":7,"id":"9f560f44_e404c380","line":277,"range":{"start_line":277,"start_character":0,"end_line":277,"end_character":46},"in_reply_to":"9f560f44_05a3c301","updated":"2020-09-22 08:45:52.000000000","message":"If another patch about fuzzy match will merged, then i will delete this function in this patch, and call that fuzzy match function,","commit_id":"3ab66d31eff5952215724316d7ac5b72d2b17aa7"},{"author":{"_account_id":29632,"name":"Carlos Eduardo","email":"ces.eduardo98@gmail.com","username":"silvacarlos"},"change_message_id":"7d6c60df7235f8b895471ef3d6c3d724c1a46dd8","unresolved":false,"context_lines":[{"line_number":2795,"context_line":"                        \u0027ek\u0027: six.text_type(usage_filter_keys)}"},{"line_number":2796,"context_line":"            raise exception.InvalidInput(reason\u003dmsg)"},{"line_number":2797,"context_line":"        filters.pop(\u0027usage\u0027)"},{"line_number":2798,"context_line":"    if \u0027status\u0027 in filters:"},{"line_number":2799,"context_line":"        query \u003d query.filter(or_(models.ShareSnapshotInstance.status \u003d\u003d ("},{"line_number":2800,"context_line":"            filters[\u0027status\u0027])))"},{"line_number":2801,"context_line":"        filters.pop(\u0027status\u0027)"},{"line_number":2802,"context_line":""},{"line_number":2803,"context_line":"    legal_filter_keys \u003d (\u0027display_name\u0027, \u0027display_name~\u0027,"},{"line_number":2804,"context_line":"                         \u0027display_description\u0027, \u0027display_description~\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"9f560f44_a584975e","line":2801,"range":{"start_line":2798,"start_character":4,"end_line":2801,"end_character":29},"updated":"2020-09-21 12:23:55.000000000","message":"coverage reports are not detecting unit tests to this code fragment. Could you please add some? :)","commit_id":"3ab66d31eff5952215724316d7ac5b72d2b17aa7"},{"author":{"_account_id":29632,"name":"Carlos Eduardo","email":"ces.eduardo98@gmail.com","username":"silvacarlos"},"change_message_id":"fb2dde627ce804ce34ec141e44fd2c6a03edbe42","unresolved":false,"context_lines":[{"line_number":2795,"context_line":"                        \u0027ek\u0027: six.text_type(usage_filter_keys)}"},{"line_number":2796,"context_line":"            raise exception.InvalidInput(reason\u003dmsg)"},{"line_number":2797,"context_line":"        filters.pop(\u0027usage\u0027)"},{"line_number":2798,"context_line":"    if \u0027status\u0027 in filters:"},{"line_number":2799,"context_line":"        query \u003d query.filter(or_(models.ShareSnapshotInstance.status \u003d\u003d ("},{"line_number":2800,"context_line":"            filters[\u0027status\u0027])))"},{"line_number":2801,"context_line":"        filters.pop(\u0027status\u0027)"},{"line_number":2802,"context_line":""},{"line_number":2803,"context_line":"    legal_filter_keys \u003d (\u0027display_name\u0027, \u0027display_name~\u0027,"},{"line_number":2804,"context_line":"                         \u0027display_description\u0027, \u0027display_description~\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"9f560f44_e21dce73","line":2801,"range":{"start_line":2798,"start_character":4,"end_line":2801,"end_character":29},"in_reply_to":"9f560f44_0400d765","updated":"2020-09-22 21:08:55.000000000","message":"+1 :)","commit_id":"3ab66d31eff5952215724316d7ac5b72d2b17aa7"},{"author":{"_account_id":30407,"name":"haixin","email":"haixin_haixin@qq.com","username":"haixin"},"change_message_id":"2b09601544d42a98fe3c971442b9dd0a38bb8670","unresolved":false,"context_lines":[{"line_number":2795,"context_line":"                        \u0027ek\u0027: six.text_type(usage_filter_keys)}"},{"line_number":2796,"context_line":"            raise exception.InvalidInput(reason\u003dmsg)"},{"line_number":2797,"context_line":"        filters.pop(\u0027usage\u0027)"},{"line_number":2798,"context_line":"    if \u0027status\u0027 in filters:"},{"line_number":2799,"context_line":"        query \u003d query.filter(or_(models.ShareSnapshotInstance.status \u003d\u003d ("},{"line_number":2800,"context_line":"            filters[\u0027status\u0027])))"},{"line_number":2801,"context_line":"        filters.pop(\u0027status\u0027)"},{"line_number":2802,"context_line":""},{"line_number":2803,"context_line":"    legal_filter_keys \u003d (\u0027display_name\u0027, \u0027display_name~\u0027,"},{"line_number":2804,"context_line":"                         \u0027display_description\u0027, \u0027display_description~\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"9f560f44_0400d765","line":2801,"range":{"start_line":2798,"start_character":4,"end_line":2801,"end_character":29},"in_reply_to":"9f560f44_a584975e","updated":"2020-09-22 08:45:52.000000000","message":"yes, i will try to add some.","commit_id":"3ab66d31eff5952215724316d7ac5b72d2b17aa7"},{"author":{"_account_id":29632,"name":"Carlos Eduardo","email":"ces.eduardo98@gmail.com","username":"silvacarlos"},"change_message_id":"7d6c60df7235f8b895471ef3d6c3d724c1a46dd8","unresolved":false,"context_lines":[{"line_number":2800,"context_line":"            filters[\u0027status\u0027])))"},{"line_number":2801,"context_line":"        filters.pop(\u0027status\u0027)"},{"line_number":2802,"context_line":""},{"line_number":2803,"context_line":"    legal_filter_keys \u003d (\u0027display_name\u0027, \u0027display_name~\u0027,"},{"line_number":2804,"context_line":"                         \u0027display_description\u0027, \u0027display_description~\u0027,"},{"line_number":2805,"context_line":"                         \u0027id\u0027, \u0027user_id\u0027, \u0027share_proto\u0027, \u0027size\u0027, \u0027share_size\u0027)"},{"line_number":2806,"context_line":"    query \u003d exact_filter(query, models.ShareSnapshot,"},{"line_number":2807,"context_line":"                         filters, legal_filter_keys)"},{"line_number":2808,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"9f560f44_eae77ce2","line":2805,"range":{"start_line":2803,"start_character":4,"end_line":2805,"end_character":78},"updated":"2020-09-21 12:23:55.000000000","message":"These fields are already being validated in the API level to keep a prevention. So in the API, this code statement [1] is calling a function that returns all the valid filter parameters and another that deletes the ones that can not be parameters to filter snapshots.\nSo I think we could move the method that returns the valid keys [2] to a common/utils file. In this way we\u0027d have a centralized place to have all of our filters in an unique place and if these fields change someday, we\u0027d not need to search all the places because it is centralized.\nWhat do you think?\n\n[1] https://github.com/openstack/manila/blob/master/manila/api/v1/share_snapshots.py#L116\n[2] https://github.com/openstack/manila/blob/master/manila/api/v1/share_snapshots.py#L137","commit_id":"3ab66d31eff5952215724316d7ac5b72d2b17aa7"},{"author":{"_account_id":29632,"name":"Carlos Eduardo","email":"ces.eduardo98@gmail.com","username":"silvacarlos"},"change_message_id":"fb2dde627ce804ce34ec141e44fd2c6a03edbe42","unresolved":false,"context_lines":[{"line_number":2800,"context_line":"            filters[\u0027status\u0027])))"},{"line_number":2801,"context_line":"        filters.pop(\u0027status\u0027)"},{"line_number":2802,"context_line":""},{"line_number":2803,"context_line":"    legal_filter_keys \u003d (\u0027display_name\u0027, \u0027display_name~\u0027,"},{"line_number":2804,"context_line":"                         \u0027display_description\u0027, \u0027display_description~\u0027,"},{"line_number":2805,"context_line":"                         \u0027id\u0027, \u0027user_id\u0027, \u0027share_proto\u0027, \u0027size\u0027, \u0027share_size\u0027)"},{"line_number":2806,"context_line":"    query \u003d exact_filter(query, models.ShareSnapshot,"},{"line_number":2807,"context_line":"                         filters, legal_filter_keys)"},{"line_number":2808,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"9f560f44_c229aa9c","line":2805,"range":{"start_line":2803,"start_character":4,"end_line":2805,"end_character":78},"in_reply_to":"9f560f44_04357745","updated":"2020-09-22 21:08:55.000000000","message":"I agree with you. I missed the part that the other function is removing non administrator attributes from the query. Thanks for clarifying, Haixin!","commit_id":"3ab66d31eff5952215724316d7ac5b72d2b17aa7"},{"author":{"_account_id":30407,"name":"haixin","email":"haixin_haixin@qq.com","username":"haixin"},"change_message_id":"2b09601544d42a98fe3c971442b9dd0a38bb8670","unresolved":false,"context_lines":[{"line_number":2800,"context_line":"            filters[\u0027status\u0027])))"},{"line_number":2801,"context_line":"        filters.pop(\u0027status\u0027)"},{"line_number":2802,"context_line":""},{"line_number":2803,"context_line":"    legal_filter_keys \u003d (\u0027display_name\u0027, \u0027display_name~\u0027,"},{"line_number":2804,"context_line":"                         \u0027display_description\u0027, \u0027display_description~\u0027,"},{"line_number":2805,"context_line":"                         \u0027id\u0027, \u0027user_id\u0027, \u0027share_proto\u0027, \u0027size\u0027, \u0027share_size\u0027)"},{"line_number":2806,"context_line":"    query \u003d exact_filter(query, models.ShareSnapshot,"},{"line_number":2807,"context_line":"                         filters, legal_filter_keys)"},{"line_number":2808,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"9f560f44_04357745","line":2805,"range":{"start_line":2803,"start_character":4,"end_line":2805,"end_character":78},"in_reply_to":"9f560f44_eae77ce2","updated":"2020-09-22 08:45:52.000000000","message":"I don\u0027t think the two parts can be combined, Because the API layer filters the illegal parameters of non-administrative users,But at the database level, the administrator user comes directly to the query,In general, administrators have a wider range of queries than non-administrators.The valid query field definition at the database level is for the administrator user,Therefore, these two limitations should be defined separately, and the status quo should be maintained.\nwhat do you think?","commit_id":"3ab66d31eff5952215724316d7ac5b72d2b17aa7"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"bc3fb3f97449fca473cce9460ed940436f3a4a34","unresolved":false,"context_lines":[{"line_number":268,"context_line":"                continue"},{"line_number":269,"context_line":"            value \u003d filters[key]"},{"line_number":270,"context_line":"            if not (isinstance(value, (six.string_types, int))):"},{"line_number":271,"context_line":"                continue"},{"line_number":272,"context_line":"            query \u003d query.filter("},{"line_number":273,"context_line":"                column_attr.op(\u0027LIKE\u0027)(u\u0027%%%s%%\u0027 % value))"},{"line_number":274,"context_line":"    return query"}],"source_content_type":"text/x-python","patch_set":8,"id":"9f560f44_adc6fe9a","line":271,"range":{"start_line":271,"start_character":16,"end_line":271,"end_character":24},"updated":"2020-09-24 04:23:48.000000000","message":"?\ndon\u0027t you want to convert it into a string here?","commit_id":"f1a1363f1f0dbc18762cd466791add9c25fd7af7"},{"author":{"_account_id":30407,"name":"haixin","email":"haixin_haixin@qq.com","username":"haixin"},"change_message_id":"b1e3f99b3dfc3eca58670fa5331e6aeb4f80e1fa","unresolved":false,"context_lines":[{"line_number":268,"context_line":"                continue"},{"line_number":269,"context_line":"            value \u003d filters[key]"},{"line_number":270,"context_line":"            if not (isinstance(value, (six.string_types, int))):"},{"line_number":271,"context_line":"                continue"},{"line_number":272,"context_line":"            query \u003d query.filter("},{"line_number":273,"context_line":"                column_attr.op(\u0027LIKE\u0027)(u\u0027%%%s%%\u0027 % value))"},{"line_number":274,"context_line":"    return query"}],"source_content_type":"text/x-python","patch_set":8,"id":"9f560f44_15e60ce8","line":271,"range":{"start_line":271,"start_character":16,"end_line":271,"end_character":24},"in_reply_to":"9f560f44_adc6fe9a","updated":"2020-09-24 07:17:34.000000000","message":"As far as I know, the numeric types in the database are mostly numeric, string, and timestamp.Fuzzy matching time is of little practical significance.\nand The valid query fields are defined before the fuzzy query,\nsuch as legal_filter_keys.The parameters defined here that require fuzzy matching(end with ~) are either strings or int.\n\nso i think there is no need to consider other parameter types","commit_id":"f1a1363f1f0dbc18762cd466791add9c25fd7af7"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"bc3fb3f97449fca473cce9460ed940436f3a4a34","unresolved":false,"context_lines":[{"line_number":2795,"context_line":"    # Init data"},{"line_number":2796,"context_line":"    sort_key \u003d sort_key or \u0027created_at\u0027"},{"line_number":2797,"context_line":"    sort_dir \u003d sort_dir or \u0027desc\u0027"},{"line_number":2798,"context_line":"    filters \u003d filters.copy() if filters else {}"},{"line_number":2799,"context_line":"    query \u003d model_query(context, models.ShareSnapshot)"},{"line_number":2800,"context_line":""},{"line_number":2801,"context_line":"    if project_id:"}],"source_content_type":"text/x-python","patch_set":8,"id":"9f560f44_ed5d9648","line":2798,"range":{"start_line":2798,"start_character":14,"end_line":2798,"end_character":47},"updated":"2020-09-24 04:23:48.000000000","message":"copy.deepcopy(filters) if filters else {}","commit_id":"f1a1363f1f0dbc18762cd466791add9c25fd7af7"},{"author":{"_account_id":30407,"name":"haixin","email":"haixin_haixin@qq.com","username":"haixin"},"change_message_id":"b1e3f99b3dfc3eca58670fa5331e6aeb4f80e1fa","unresolved":false,"context_lines":[{"line_number":2795,"context_line":"    # Init data"},{"line_number":2796,"context_line":"    sort_key \u003d sort_key or \u0027created_at\u0027"},{"line_number":2797,"context_line":"    sort_dir \u003d sort_dir or \u0027desc\u0027"},{"line_number":2798,"context_line":"    filters \u003d filters.copy() if filters else {}"},{"line_number":2799,"context_line":"    query \u003d model_query(context, models.ShareSnapshot)"},{"line_number":2800,"context_line":""},{"line_number":2801,"context_line":"    if project_id:"}],"source_content_type":"text/x-python","patch_set":8,"id":"9f560f44_b51da0bf","line":2798,"range":{"start_line":2798,"start_character":14,"end_line":2798,"end_character":47},"in_reply_to":"9f560f44_ed5d9648","updated":"2020-09-24 07:17:34.000000000","message":"Done","commit_id":"f1a1363f1f0dbc18762cd466791add9c25fd7af7"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"3ba8f0671e0494c536f1f0e37afc5318fbcd76d1","unresolved":true,"context_lines":[{"line_number":2938,"context_line":"    query \u003d query.options(joinedload(\u0027instances\u0027))"},{"line_number":2939,"context_line":""},{"line_number":2940,"context_line":"    # Snapshots with no instances are filtered out."},{"line_number":2941,"context_line":"    query \u003d query.filter(or_("},{"line_number":2942,"context_line":"        models.ShareSnapshot.id \u003d\u003d models.ShareSnapshotInstance.snapshot_id))"},{"line_number":2943,"context_line":""},{"line_number":2944,"context_line":"    # Apply filters"},{"line_number":2945,"context_line":"    if \u0027usage\u0027 in filters:"}],"source_content_type":"text/x-python","patch_set":13,"id":"53e65d3d_c1bc80d4","line":2942,"range":{"start_line":2941,"start_character":25,"end_line":2942,"end_character":76},"updated":"2021-07-14 06:37:31.000000000","message":"or_ is applied against two or more conditions, there\u0027s only one in this list.","commit_id":"7790fbbc0d1aaba31fead60e4dc7ece10d0bb5da"},{"author":{"_account_id":30407,"name":"haixin","email":"haixin_haixin@qq.com","username":"haixin"},"change_message_id":"e48d9a934e02e4aa2cc79ef7ae9e83675e42f99b","unresolved":false,"context_lines":[{"line_number":2938,"context_line":"    query \u003d query.options(joinedload(\u0027instances\u0027))"},{"line_number":2939,"context_line":""},{"line_number":2940,"context_line":"    # Snapshots with no instances are filtered out."},{"line_number":2941,"context_line":"    query \u003d query.filter(or_("},{"line_number":2942,"context_line":"        models.ShareSnapshot.id \u003d\u003d models.ShareSnapshotInstance.snapshot_id))"},{"line_number":2943,"context_line":""},{"line_number":2944,"context_line":"    # Apply filters"},{"line_number":2945,"context_line":"    if \u0027usage\u0027 in filters:"}],"source_content_type":"text/x-python","patch_set":13,"id":"2e8a6523_6bfc206b","line":2942,"range":{"start_line":2941,"start_character":25,"end_line":2942,"end_character":76},"in_reply_to":"53e65d3d_c1bc80d4","updated":"2021-07-14 09:35:58.000000000","message":"Done","commit_id":"7790fbbc0d1aaba31fead60e4dc7ece10d0bb5da"},{"author":{"_account_id":30407,"name":"haixin","email":"haixin_haixin@qq.com","username":"haixin"},"change_message_id":"e48d9a934e02e4aa2cc79ef7ae9e83675e42f99b","unresolved":true,"context_lines":[{"line_number":2947,"context_line":"        if filters[\u0027usage\u0027] \u003d\u003d \u0027any\u0027:"},{"line_number":2948,"context_line":"            pass"},{"line_number":2949,"context_line":"        elif filters[\u0027usage\u0027] \u003d\u003d \u0027used\u0027:"},{"line_number":2950,"context_line":"            query \u003d query.filter(or_(models.Share.snapshot_id \u003d\u003d ("},{"line_number":2951,"context_line":"                models.ShareSnapshot.id)))"},{"line_number":2952,"context_line":"        elif filters[\u0027usage\u0027] \u003d\u003d \u0027unused\u0027:"},{"line_number":2953,"context_line":"            query \u003d query.filter(or_(models.Share.snapshot_id !\u003d ("}],"source_content_type":"text/x-python","patch_set":13,"id":"866f2498_3d579ae6","line":2950,"range":{"start_line":2950,"start_character":33,"end_line":2950,"end_character":37},"updated":"2021-07-14 09:35:58.000000000","message":"i will remove too.","commit_id":"7790fbbc0d1aaba31fead60e4dc7ece10d0bb5da"},{"author":{"_account_id":30407,"name":"haixin","email":"haixin_haixin@qq.com","username":"haixin"},"change_message_id":"e48d9a934e02e4aa2cc79ef7ae9e83675e42f99b","unresolved":true,"context_lines":[{"line_number":2950,"context_line":"            query \u003d query.filter(or_(models.Share.snapshot_id \u003d\u003d ("},{"line_number":2951,"context_line":"                models.ShareSnapshot.id)))"},{"line_number":2952,"context_line":"        elif filters[\u0027usage\u0027] \u003d\u003d \u0027unused\u0027:"},{"line_number":2953,"context_line":"            query \u003d query.filter(or_(models.Share.snapshot_id !\u003d ("},{"line_number":2954,"context_line":"                models.ShareSnapshot.id)))"},{"line_number":2955,"context_line":"        else:"},{"line_number":2956,"context_line":"            msg \u003d _(\"Wrong \u0027usage\u0027 key provided - \u0027%(key)s\u0027. \""}],"source_content_type":"text/x-python","patch_set":13,"id":"1681d290_b9334a57","line":2953,"range":{"start_line":2953,"start_character":33,"end_line":2953,"end_character":37},"updated":"2021-07-14 09:35:58.000000000","message":"i will remove too.","commit_id":"7790fbbc0d1aaba31fead60e4dc7ece10d0bb5da"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"3ba8f0671e0494c536f1f0e37afc5318fbcd76d1","unresolved":true,"context_lines":[{"line_number":2960,"context_line":"            raise exception.InvalidInput(reason\u003dmsg)"},{"line_number":2961,"context_line":"        filters.pop(\u0027usage\u0027)"},{"line_number":2962,"context_line":"    if \u0027status\u0027 in filters:"},{"line_number":2963,"context_line":"        query \u003d query.filter(or_(models.ShareSnapshotInstance.status \u003d\u003d ("},{"line_number":2964,"context_line":"            filters[\u0027status\u0027])))"},{"line_number":2965,"context_line":"        filters.pop(\u0027status\u0027)"},{"line_number":2966,"context_line":""},{"line_number":2967,"context_line":"    legal_filter_keys \u003d (\u0027display_name\u0027, \u0027display_name~\u0027,"}],"source_content_type":"text/x-python","patch_set":13,"id":"c1077541_e3cb6906","line":2964,"range":{"start_line":2963,"start_character":29,"end_line":2964,"end_character":32},"updated":"2021-07-14 06:37:31.000000000","message":"same comment as above. There\u0027s no use of the or_ construct here when there\u0027s only one expression to evaluate","commit_id":"7790fbbc0d1aaba31fead60e4dc7ece10d0bb5da"},{"author":{"_account_id":30407,"name":"haixin","email":"haixin_haixin@qq.com","username":"haixin"},"change_message_id":"e48d9a934e02e4aa2cc79ef7ae9e83675e42f99b","unresolved":false,"context_lines":[{"line_number":2960,"context_line":"            raise exception.InvalidInput(reason\u003dmsg)"},{"line_number":2961,"context_line":"        filters.pop(\u0027usage\u0027)"},{"line_number":2962,"context_line":"    if \u0027status\u0027 in filters:"},{"line_number":2963,"context_line":"        query \u003d query.filter(or_(models.ShareSnapshotInstance.status \u003d\u003d ("},{"line_number":2964,"context_line":"            filters[\u0027status\u0027])))"},{"line_number":2965,"context_line":"        filters.pop(\u0027status\u0027)"},{"line_number":2966,"context_line":""},{"line_number":2967,"context_line":"    legal_filter_keys \u003d (\u0027display_name\u0027, \u0027display_name~\u0027,"}],"source_content_type":"text/x-python","patch_set":13,"id":"b13a9ab1_ca66b2ed","line":2964,"range":{"start_line":2963,"start_character":29,"end_line":2964,"end_character":32},"in_reply_to":"c1077541_e3cb6906","updated":"2021-07-14 09:35:58.000000000","message":"Done","commit_id":"7790fbbc0d1aaba31fead60e4dc7ece10d0bb5da"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"3ba8f0671e0494c536f1f0e37afc5318fbcd76d1","unresolved":true,"context_lines":[{"line_number":2966,"context_line":""},{"line_number":2967,"context_line":"    legal_filter_keys \u003d (\u0027display_name\u0027, \u0027display_name~\u0027,"},{"line_number":2968,"context_line":"                         \u0027display_description\u0027, \u0027display_description~\u0027,"},{"line_number":2969,"context_line":"                         \u0027id\u0027, \u0027id~\u0027, \u0027user_id\u0027, \u0027user_id~\u0027,"},{"line_number":2970,"context_line":"                         \u0027project_id\u0027, \u0027project_id~\u0027,"},{"line_number":2971,"context_line":"                         \u0027share_id\u0027, \u0027share_id~\u0027,"},{"line_number":2972,"context_line":"                         \u0027share_proto\u0027,"}],"source_content_type":"text/x-python","patch_set":13,"id":"bde20fdc_c09bbd0d","line":2969,"range":{"start_line":2969,"start_character":32,"end_line":2969,"end_character":35},"updated":"2021-07-14 06:37:31.000000000","message":"only \"name~\" and \"description~\" are like operators, none of the other attributes are: https://specs.openstack.org/openstack/manila-specs/specs/pike/like-filter.html#proposed-change","commit_id":"7790fbbc0d1aaba31fead60e4dc7ece10d0bb5da"},{"author":{"_account_id":30407,"name":"haixin","email":"haixin_haixin@qq.com","username":"haixin"},"change_message_id":"e48d9a934e02e4aa2cc79ef7ae9e83675e42f99b","unresolved":false,"context_lines":[{"line_number":2966,"context_line":""},{"line_number":2967,"context_line":"    legal_filter_keys \u003d (\u0027display_name\u0027, \u0027display_name~\u0027,"},{"line_number":2968,"context_line":"                         \u0027display_description\u0027, \u0027display_description~\u0027,"},{"line_number":2969,"context_line":"                         \u0027id\u0027, \u0027id~\u0027, \u0027user_id\u0027, \u0027user_id~\u0027,"},{"line_number":2970,"context_line":"                         \u0027project_id\u0027, \u0027project_id~\u0027,"},{"line_number":2971,"context_line":"                         \u0027share_id\u0027, \u0027share_id~\u0027,"},{"line_number":2972,"context_line":"                         \u0027share_proto\u0027,"}],"source_content_type":"text/x-python","patch_set":13,"id":"ac513e22_76b56b3f","line":2969,"range":{"start_line":2969,"start_character":32,"end_line":2969,"end_character":35},"in_reply_to":"bde20fdc_c09bbd0d","updated":"2021-07-14 09:35:58.000000000","message":"Done","commit_id":"7790fbbc0d1aaba31fead60e4dc7ece10d0bb5da"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"3ba8f0671e0494c536f1f0e37afc5318fbcd76d1","unresolved":true,"context_lines":[{"line_number":2967,"context_line":"    legal_filter_keys \u003d (\u0027display_name\u0027, \u0027display_name~\u0027,"},{"line_number":2968,"context_line":"                         \u0027display_description\u0027, \u0027display_description~\u0027,"},{"line_number":2969,"context_line":"                         \u0027id\u0027, \u0027id~\u0027, \u0027user_id\u0027, \u0027user_id~\u0027,"},{"line_number":2970,"context_line":"                         \u0027project_id\u0027, \u0027project_id~\u0027,"},{"line_number":2971,"context_line":"                         \u0027share_id\u0027, \u0027share_id~\u0027,"},{"line_number":2972,"context_line":"                         \u0027share_proto\u0027,"},{"line_number":2973,"context_line":"                         \u0027size\u0027, \u0027share_size\u0027)"}],"source_content_type":"text/x-python","patch_set":13,"id":"18bd23e2_f3f096ad","line":2970,"range":{"start_line":2970,"start_character":41,"end_line":2970,"end_character":52},"updated":"2021-07-14 06:37:31.000000000","message":"remove","commit_id":"7790fbbc0d1aaba31fead60e4dc7ece10d0bb5da"},{"author":{"_account_id":30407,"name":"haixin","email":"haixin_haixin@qq.com","username":"haixin"},"change_message_id":"e48d9a934e02e4aa2cc79ef7ae9e83675e42f99b","unresolved":false,"context_lines":[{"line_number":2967,"context_line":"    legal_filter_keys \u003d (\u0027display_name\u0027, \u0027display_name~\u0027,"},{"line_number":2968,"context_line":"                         \u0027display_description\u0027, \u0027display_description~\u0027,"},{"line_number":2969,"context_line":"                         \u0027id\u0027, \u0027id~\u0027, \u0027user_id\u0027, \u0027user_id~\u0027,"},{"line_number":2970,"context_line":"                         \u0027project_id\u0027, \u0027project_id~\u0027,"},{"line_number":2971,"context_line":"                         \u0027share_id\u0027, \u0027share_id~\u0027,"},{"line_number":2972,"context_line":"                         \u0027share_proto\u0027,"},{"line_number":2973,"context_line":"                         \u0027size\u0027, \u0027share_size\u0027)"}],"source_content_type":"text/x-python","patch_set":13,"id":"a9d16795_369f6e59","line":2970,"range":{"start_line":2970,"start_character":41,"end_line":2970,"end_character":52},"in_reply_to":"18bd23e2_f3f096ad","updated":"2021-07-14 09:35:58.000000000","message":"Done","commit_id":"7790fbbc0d1aaba31fead60e4dc7ece10d0bb5da"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"3ba8f0671e0494c536f1f0e37afc5318fbcd76d1","unresolved":true,"context_lines":[{"line_number":2968,"context_line":"                         \u0027display_description\u0027, \u0027display_description~\u0027,"},{"line_number":2969,"context_line":"                         \u0027id\u0027, \u0027id~\u0027, \u0027user_id\u0027, \u0027user_id~\u0027,"},{"line_number":2970,"context_line":"                         \u0027project_id\u0027, \u0027project_id~\u0027,"},{"line_number":2971,"context_line":"                         \u0027share_id\u0027, \u0027share_id~\u0027,"},{"line_number":2972,"context_line":"                         \u0027share_proto\u0027,"},{"line_number":2973,"context_line":"                         \u0027size\u0027, \u0027share_size\u0027)"},{"line_number":2974,"context_line":"    query \u003d exact_filter(query, models.ShareSnapshot,"}],"source_content_type":"text/x-python","patch_set":13,"id":"64100699_0f1c17b2","line":2971,"range":{"start_line":2971,"start_character":38,"end_line":2971,"end_character":47},"updated":"2021-07-14 06:37:31.000000000","message":"remove","commit_id":"7790fbbc0d1aaba31fead60e4dc7ece10d0bb5da"},{"author":{"_account_id":30407,"name":"haixin","email":"haixin_haixin@qq.com","username":"haixin"},"change_message_id":"e48d9a934e02e4aa2cc79ef7ae9e83675e42f99b","unresolved":false,"context_lines":[{"line_number":2968,"context_line":"                         \u0027display_description\u0027, \u0027display_description~\u0027,"},{"line_number":2969,"context_line":"                         \u0027id\u0027, \u0027id~\u0027, \u0027user_id\u0027, \u0027user_id~\u0027,"},{"line_number":2970,"context_line":"                         \u0027project_id\u0027, \u0027project_id~\u0027,"},{"line_number":2971,"context_line":"                         \u0027share_id\u0027, \u0027share_id~\u0027,"},{"line_number":2972,"context_line":"                         \u0027share_proto\u0027,"},{"line_number":2973,"context_line":"                         \u0027size\u0027, \u0027share_size\u0027)"},{"line_number":2974,"context_line":"    query \u003d exact_filter(query, models.ShareSnapshot,"}],"source_content_type":"text/x-python","patch_set":13,"id":"317900f5_ac0ad4e6","line":2971,"range":{"start_line":2971,"start_character":38,"end_line":2971,"end_character":47},"in_reply_to":"64100699_0f1c17b2","updated":"2021-07-14 09:35:58.000000000","message":"Done","commit_id":"7790fbbc0d1aaba31fead60e4dc7ece10d0bb5da"}]}
