)]}'
{"keystone/assignment/controllers.py":[{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"a31af295b7c6f42f86d9b3950e6f256a8c890a47","unresolved":false,"context_lines":[{"line_number":903,"context_line":"            else:"},{"line_number":904,"context_line":"                inherited \u003d None"},{"line_number":905,"context_line":""},{"line_number":906,"context_line":"        self._require_single_arg(allow_none\u003dTrue,"},{"line_number":907,"context_line":"                                 domain\u003dparams.get(\u0027scope.domain.id\u0027),"},{"line_number":908,"context_line":"                                 project\u003dparams.get(\u0027scope.project.id\u0027))"},{"line_number":909,"context_line":"        self._require_single_arg(allow_none\u003dTrue,"}],"source_content_type":"text/x-python","patch_set":7,"id":"3a961159_60eec8b6","line":906,"updated":"2015-01-16 13:28:14.000000000","message":"for me, having a method called \"require_single_arg()\" that can accept no arguments is kind of confusing. Maybe have:\n\nassert_zero_or_one_arg()\nasset_exactly_one_arg()","commit_id":"e35521e6ed257a8090c257f5b021fe94ede855d4"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"89d36e39cfa9344987a5fd55507fed033188d0c5","unresolved":false,"context_lines":[{"line_number":903,"context_line":"            else:"},{"line_number":904,"context_line":"                inherited \u003d None"},{"line_number":905,"context_line":""},{"line_number":906,"context_line":"        self._require_single_arg(allow_none\u003dTrue,"},{"line_number":907,"context_line":"                                 domain\u003dparams.get(\u0027scope.domain.id\u0027),"},{"line_number":908,"context_line":"                                 project\u003dparams.get(\u0027scope.project.id\u0027))"},{"line_number":909,"context_line":"        self._require_single_arg(allow_none\u003dTrue,"}],"source_content_type":"text/x-python","patch_set":7,"id":"3a961159_7e881d22","line":906,"in_reply_to":"3a961159_60eec8b6","updated":"2015-01-16 18:34:36.000000000","message":"Agreed","commit_id":"e35521e6ed257a8090c257f5b021fe94ede855d4"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"f8ba4322191459e9dc3604aa2db9e7206123f145","unresolved":false,"context_lines":[{"line_number":897,"context_line":""},{"line_number":898,"context_line":"        if inherited and domain:"},{"line_number":899,"context_line":"            msg \u003d _(\u0027Combining effective, domain and inherited filters will \u0027"},{"line_number":900,"context_line":"                    \u0027always result in an empty list.\u0027)"},{"line_number":901,"context_line":"            raise exception.ValidationError(msg)"},{"line_number":902,"context_line":""},{"line_number":903,"context_line":"    @controller.filterprotected(\u0027group.id\u0027, \u0027role.id\u0027,"}],"source_content_type":"text/x-python","patch_set":19,"id":"da86d52c_21d44246","line":900,"updated":"2015-02-10 09:33:25.000000000","message":"won\u0027t non-effective, domain and inherited also always return an empty list?","commit_id":"16c15cf1ee0457915d92919854792c661f4e0df4"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"c60d019d6967e382f05591e67e7a7629fdddc0b1","unresolved":false,"context_lines":[{"line_number":897,"context_line":""},{"line_number":898,"context_line":"        if inherited and domain:"},{"line_number":899,"context_line":"            msg \u003d _(\u0027Combining effective, domain and inherited filters will \u0027"},{"line_number":900,"context_line":"                    \u0027always result in an empty list.\u0027)"},{"line_number":901,"context_line":"            raise exception.ValidationError(msg)"},{"line_number":902,"context_line":""},{"line_number":903,"context_line":"    @controller.filterprotected(\u0027group.id\u0027, \u0027role.id\u0027,"}],"source_content_type":"text/x-python","patch_set":19,"id":"da86d52c_3391e19a","line":900,"in_reply_to":"da86d52c_21d44246","updated":"2015-02-10 18:55:33.000000000","message":"No, it should return inherited assignments (to be inherited) that were assigned on that domain.","commit_id":"16c15cf1ee0457915d92919854792c661f4e0df4"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"f28fd59df7049445c5ef254138e41a1cdd09adb4","unresolved":false,"context_lines":[{"line_number":897,"context_line":""},{"line_number":898,"context_line":"        if inherited and domain:"},{"line_number":899,"context_line":"            msg \u003d _(\u0027Combining effective, domain and inherited filters will \u0027"},{"line_number":900,"context_line":"                    \u0027always result in an empty list.\u0027)"},{"line_number":901,"context_line":"            raise exception.ValidationError(msg)"},{"line_number":902,"context_line":""},{"line_number":903,"context_line":"    @controller.filterprotected(\u0027group.id\u0027, \u0027role.id\u0027,"}],"source_content_type":"text/x-python","patch_set":19,"id":"da86d52c_f344a91c","line":900,"in_reply_to":"da86d52c_21d44246","updated":"2015-02-10 18:56:59.000000000","message":"Ok, ignore the comment - I agree that non-effective, domain+inherited is not guaranteed to be an empty list...","commit_id":"16c15cf1ee0457915d92919854792c661f4e0df4"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"c429b5b4abd2568c3ceb83ddf1622bba11aece48","unresolved":false,"context_lines":[{"line_number":906,"context_line":"        returned in effective mode."},{"line_number":907,"context_line":""},{"line_number":908,"context_line":"        \"\"\""},{"line_number":909,"context_line":"        if group:"},{"line_number":910,"context_line":"            msg \u003d _(\u0027Combining effective and group filter will always \u0027"},{"line_number":911,"context_line":"                    \u0027result in an empty list.\u0027)"},{"line_number":912,"context_line":"            raise exception.ValidationError(msg)"}],"source_content_type":"text/x-python","patch_set":21,"id":"da86d52c_b5049018","line":909,"updated":"2015-02-12 06:14:59.000000000","message":"inherited and group?","commit_id":"b04894418b52f9f4798dbc7dc130a95f58f6a242"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"0ededee4744308d38476d7019ad3f76ba142fa68","unresolved":false,"context_lines":[{"line_number":906,"context_line":"        returned in effective mode."},{"line_number":907,"context_line":""},{"line_number":908,"context_line":"        \"\"\""},{"line_number":909,"context_line":"        if group:"},{"line_number":910,"context_line":"            msg \u003d _(\u0027Combining effective and group filter will always \u0027"},{"line_number":911,"context_line":"                    \u0027result in an empty list.\u0027)"},{"line_number":912,"context_line":"            raise exception.ValidationError(msg)"}],"source_content_type":"text/x-python","patch_set":21,"id":"da86d52c_54598d8c","line":909,"in_reply_to":"da86d52c_b5049018","updated":"2015-02-12 11:23:45.000000000","message":"No. In effective mode, all the group assignments are expanded, so filtering by group, independently of inherited filter being provided or not, would result in an empty list.\n\nSo what makes this different from the next check (line 914)?\nAsking for effective + domain_id is valid, since it would return non-inherited assignments on the specified domain. That said, effective + domain_id + inherited is invalid, as we are checking.","commit_id":"b04894418b52f9f4798dbc7dc130a95f58f6a242"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"c429b5b4abd2568c3ceb83ddf1622bba11aece48","unresolved":false,"context_lines":[{"line_number":916,"context_line":"                    \u0027always result in an empty list.\u0027)"},{"line_number":917,"context_line":"            raise exception.ValidationError(msg)"},{"line_number":918,"context_line":""},{"line_number":919,"context_line":"    def _assert_domain_nand_project(self, domain_id, project_id):"},{"line_number":920,"context_line":"        if domain_id and project_id:"},{"line_number":921,"context_line":"            msg \u003d _(\u0027Specify a domain or project, not both\u0027)"},{"line_number":922,"context_line":"            raise exception.ValidationError(msg)"}],"source_content_type":"text/x-python","patch_set":21,"id":"da86d52c_95222cb7","line":919,"updated":"2015-02-12 06:14:59.000000000","message":"what happen to _require_domain_xor_project?","commit_id":"b04894418b52f9f4798dbc7dc130a95f58f6a242"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"0ededee4744308d38476d7019ad3f76ba142fa68","unresolved":false,"context_lines":[{"line_number":916,"context_line":"                    \u0027always result in an empty list.\u0027)"},{"line_number":917,"context_line":"            raise exception.ValidationError(msg)"},{"line_number":918,"context_line":""},{"line_number":919,"context_line":"    def _assert_domain_nand_project(self, domain_id, project_id):"},{"line_number":920,"context_line":"        if domain_id and project_id:"},{"line_number":921,"context_line":"            msg \u003d _(\u0027Specify a domain or project, not both\u0027)"},{"line_number":922,"context_line":"            raise exception.ValidationError(msg)"}],"source_content_type":"text/x-python","patch_set":21,"id":"da86d52c_2f53e017","line":919,"in_reply_to":"da86d52c_95222cb7","updated":"2015-02-12 11:23:45.000000000","message":"Ok, so ....\n_required_domain_xor_project and _assert_domain_nand_project were just sharing a little piece of code at common/controller.py (see https://review.openstack.org/#/c/144703/20/keystone/common/controller.py).\n\nAs discussed with dstanek, they shouldn\u0027t be there since they aren\u0027t used by other controllers than those in assigment/controllers.py.\n\nSo they should be turned into validation methods in this file. I didn\u0027t adopt this approach since there is just a little piece of code to be shared, and they will probably be removed in favor of json schema validations, as Lance pointed out in a previous review.\n\nSo the idea is: let\u0027s make them simple and working, instead of doing some (maybe not worth it) little code sharing that will be changed soon.","commit_id":"b04894418b52f9f4798dbc7dc130a95f58f6a242"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"c429b5b4abd2568c3ceb83ddf1622bba11aece48","unresolved":false,"context_lines":[{"line_number":921,"context_line":"            msg \u003d _(\u0027Specify a domain or project, not both\u0027)"},{"line_number":922,"context_line":"            raise exception.ValidationError(msg)"},{"line_number":923,"context_line":""},{"line_number":924,"context_line":"    def _assert_user_nand_group(self, user_id, group_id):"},{"line_number":925,"context_line":"        if user_id and group_id:"},{"line_number":926,"context_line":"            msg \u003d _(\u0027Specify a user or group, not both\u0027)"},{"line_number":927,"context_line":"            raise exception.ValidationError(msg)"}],"source_content_type":"text/x-python","patch_set":21,"id":"da86d52c_f51a887b","line":924,"updated":"2015-02-12 06:14:59.000000000","message":"what happen to _require_user_xor_group?","commit_id":"b04894418b52f9f4798dbc7dc130a95f58f6a242"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"c429b5b4abd2568c3ceb83ddf1622bba11aece48","unresolved":false,"context_lines":[{"line_number":941,"context_line":"        effective \u003d \u0027effective\u0027 in params and ("},{"line_number":942,"context_line":"            self.query_filter_is_true(params[\u0027effective\u0027]))"},{"line_number":943,"context_line":""},{"line_number":944,"context_line":"        if \u0027scope.OS-INHERIT:inherited_to\u0027 in params:"},{"line_number":945,"context_line":"            inherited \u003d ("},{"line_number":946,"context_line":"                params[\u0027scope.OS-INHERIT:inherited_to\u0027] \u003d\u003d \u0027projects\u0027)"},{"line_number":947,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":21,"id":"da86d52c_55a19444","line":944,"updated":"2015-02-12 06:14:59.000000000","message":"I thought we are getting rid of extension namespaces, no? Morgan?","commit_id":"b04894418b52f9f4798dbc7dc130a95f58f6a242"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"0ededee4744308d38476d7019ad3f76ba142fa68","unresolved":false,"context_lines":[{"line_number":941,"context_line":"        effective \u003d \u0027effective\u0027 in params and ("},{"line_number":942,"context_line":"            self.query_filter_is_true(params[\u0027effective\u0027]))"},{"line_number":943,"context_line":""},{"line_number":944,"context_line":"        if \u0027scope.OS-INHERIT:inherited_to\u0027 in params:"},{"line_number":945,"context_line":"            inherited \u003d ("},{"line_number":946,"context_line":"                params[\u0027scope.OS-INHERIT:inherited_to\u0027] \u003d\u003d \u0027projects\u0027)"},{"line_number":947,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":21,"id":"da86d52c_af9350a1","line":944,"in_reply_to":"da86d52c_55a19444","updated":"2015-02-12 11:23:45.000000000","message":"Yes, I think we are :)\n\nI talked to Henry Nash specifically about this one and he told me that getting rid of OS-INHERIT as extension is in his TODO list  :-)","commit_id":"b04894418b52f9f4798dbc7dc130a95f58f6a242"}],"keystone/common/controller.py":[{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"f41233ed6ea3e09aaf595aa12c853d2b087376fc","unresolved":false,"context_lines":[{"line_number":568,"context_line":"        provided_params \u003d [name for name, value in kwargs.iteritems() if value]"},{"line_number":569,"context_line":""},{"line_number":570,"context_line":"        if len(provided_params) \u003e 1:"},{"line_number":571,"context_line":"            msg \u003d _(\u0027Specify none or %s\u0027) % \u0027 xor \u0027.join(provided_params)"},{"line_number":572,"context_line":"            raise exception.ValidationError(msg)"},{"line_number":573,"context_line":""},{"line_number":574,"context_line":"    def _require_matching_id(self, value, ref):"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_b83b4e38","line":571,"updated":"2015-01-09 23:26:14.000000000","message":"copy/paste: xor","commit_id":"ef6860ad915274e9b3ec65ff22ec4d6ca4233b57"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"169692a40d6becd648a27a316c634cb78e2bf0c5","unresolved":false,"context_lines":[{"line_number":568,"context_line":"        provided_params \u003d [name for name, value in kwargs.iteritems() if value]"},{"line_number":569,"context_line":""},{"line_number":570,"context_line":"        if len(provided_params) \u003e 1:"},{"line_number":571,"context_line":"            msg \u003d _(\u0027Specify none or %s\u0027) % \u0027 xor \u0027.join(provided_params)"},{"line_number":572,"context_line":"            raise exception.ValidationError(msg)"},{"line_number":573,"context_line":""},{"line_number":574,"context_line":"    def _require_matching_id(self, value, ref):"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_5dd86ef0","line":571,"in_reply_to":"3a961159_b83b4e38","updated":"2015-01-12 21:31:07.000000000","message":"That\u0027s not true. NOT(A) AND NOT(B) OR XOR(A, B) \u003d NAND(A, B)\n\nI\u0027m changing this method in a new patchset. The message is improved as well.","commit_id":"ef6860ad915274e9b3ec65ff22ec4d6ca4233b57"}]}
