)]}'
{"openstack_dashboard/test/integration_tests/horizon.conf":[{"author":{"_account_id":17887,"name":"Doug Schveninger","email":"ds6901@att.com","username":"Doug.Schveninger"},"change_message_id":"32948a0900f3d2da5ff681c65c77b3e01bcf8d69","unresolved":false,"context_lines":[{"line_number":67,"context_line":"admin_home_project\u003dadmin"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"# Name of default role every user gets in his new project"},{"line_number":70,"context_line":"default_keystone_role\u003dmember"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"# Name of the role that grants admin rights to a user in his project"},{"line_number":73,"context_line":"default_keystone_admin_role\u003dadmin"}],"source_content_type":"text/plain","patch_set":1,"id":"3fa7e38b_8cb8a4e5","line":70,"range":{"start_line":70,"start_character":22,"end_line":70,"end_character":28},"updated":"2019-10-05 12:11:44.000000000","message":"confirmed https://github.com/openstack/devstack/blob/1f6bea1768c2066f3dd5604aee569ad633f45fbc/lib/keystone#L319","commit_id":"c45e65782ac4780b2abf57fef902c055b61feb2d"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"e7384112ab5f0008916c35c4d81c8019dfcced67","unresolved":false,"context_lines":[{"line_number":67,"context_line":"admin_home_project\u003dadmin"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"# Name of default role every user gets in his new project"},{"line_number":70,"context_line":"default_keystone_role\u003dmember"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"# Name of the role that grants admin rights to a user in his project"},{"line_number":73,"context_line":"default_keystone_admin_role\u003dadmin"}],"source_content_type":"text/plain","patch_set":3,"id":"3fa7e38b_6550c00b","line":70,"updated":"2019-10-08 08:19:23.000000000","message":"The corresponding config in openstack_dashboard/test/integration_tests/config.py needs to be updated.","commit_id":"ff89ec4641932e701fc4bd446390f6d78816f7c1"},{"author":{"_account_id":23467,"name":"Pallav Gupta","email":"pallavgupta84@gmail.com","username":"pallav"},"change_message_id":"1ac9395d87af668bd648f3a7aaef808352bc1ee1","unresolved":false,"context_lines":[{"line_number":67,"context_line":"admin_home_project\u003dadmin"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"# Name of default role every user gets in his new project"},{"line_number":70,"context_line":"default_keystone_role\u003dmember"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"# Name of the role that grants admin rights to a user in his project"},{"line_number":73,"context_line":"default_keystone_admin_role\u003dadmin"}],"source_content_type":"text/plain","patch_set":3,"id":"3fa7e38b_86c4df60","line":70,"in_reply_to":"3fa7e38b_6550c00b","updated":"2019-10-08 16:04:57.000000000","message":"Done","commit_id":"ff89ec4641932e701fc4bd446390f6d78816f7c1"}],"openstack_dashboard/test/integration_tests/pages/identity/projectspage.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"2ecef2c4111edd6293f1db339dbbe3132e9b6dfb","unresolved":false,"context_lines":[{"line_number":18,"context_line":""},{"line_number":19,"context_line":"class ProjectForm(forms.TabbedFormRegion):"},{"line_number":20,"context_line":"    FIELDS \u003d ((\"name\", \"description\", \"enabled\"),"},{"line_number":21,"context_line":"              ({\u0027members\u0027: menus.MembershipMenuRegion}))"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    def __init__(self, driver, conf, tab\u003d0):"},{"line_number":24,"context_line":"        super(ProjectForm, self).__init__("}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_e1935a5b","line":21,"updated":"2019-10-07 05:37:35.000000000","message":"Question:\n\nLooking at the definition of _prepare_mappings() [0], each element of FIELDS (field_mappings) will be passed to _prepare_mappings of the parent class FormRegion [1].\n[1] expects a tuple or a dict.\n\nYou changed the second element from a dict to a tuple.\nI am confused with this change. If a tuple is passed, a dict entry whose key and value are same will be created, but what does it mean if a key and a value are both a dict {\"members\": ...}?\n\n[0] https://github.com/openstack/horizon/blob/5c3a402b7b8c62fd838ed8373b06ff0532584d5c/openstack_dashboard/test/integration_tests/regions/forms.py#L434-L438\n[1] https://github.com/openstack/horizon/blob/5c3a402b7b8c62fd838ed8373b06ff0532584d5c/openstack_dashboard/test/integration_tests/regions/forms.py#L434-L437\n[2] https://github.com/openstack/horizon/blob/5c3a402b7b8c62fd838ed8373b06ff0532584d5c/openstack_dashboard/test/integration_tests/regions/forms.py#L341","commit_id":"c45e65782ac4780b2abf57fef902c055b61feb2d"},{"author":{"_account_id":23467,"name":"Pallav Gupta","email":"pallavgupta84@gmail.com","username":"pallav"},"change_message_id":"064cfea3b8c5bebf8766c741dacba38123db76c7","unresolved":false,"context_lines":[{"line_number":18,"context_line":""},{"line_number":19,"context_line":"class ProjectForm(forms.TabbedFormRegion):"},{"line_number":20,"context_line":"    FIELDS \u003d ((\"name\", \"description\", \"enabled\"),"},{"line_number":21,"context_line":"              ({\u0027members\u0027: menus.MembershipMenuRegion}))"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    def __init__(self, driver, conf, tab\u003d0):"},{"line_number":24,"context_line":"        super(ProjectForm, self).__init__("}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_193b82c8","line":21,"in_reply_to":"3fa7e38b_a7d9f222","updated":"2019-10-07 18:04:17.000000000","message":"@Akihiro, there was an issue with fields mapping which was not supporting field with class type and that field was getting skipped. It\u0027s now corrected so no change is required here.","commit_id":"c45e65782ac4780b2abf57fef902c055b61feb2d"},{"author":{"_account_id":8648,"name":"Radomir Dopieralski","email":"openstack@dopieralski.pl","username":"thesheep"},"change_message_id":"437a9c8d25784d005cb3ad98dd5083fef59106ac","unresolved":false,"context_lines":[{"line_number":18,"context_line":""},{"line_number":19,"context_line":"class ProjectForm(forms.TabbedFormRegion):"},{"line_number":20,"context_line":"    FIELDS \u003d ((\"name\", \"description\", \"enabled\"),"},{"line_number":21,"context_line":"              ({\u0027members\u0027: menus.MembershipMenuRegion}))"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    def __init__(self, driver, conf, tab\u003d0):"},{"line_number":24,"context_line":"        super(ProjectForm, self).__init__("}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_a7d9f222","line":21,"in_reply_to":"3fa7e38b_e1935a5b","updated":"2019-10-07 10:14:24.000000000","message":"Parentheses don\u0027t create a tuple, the comma does. This change does nothing.","commit_id":"c45e65782ac4780b2abf57fef902c055b61feb2d"}],"openstack_dashboard/test/integration_tests/regions/forms.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"e7384112ab5f0008916c35c4d81c8019dfcced67","unresolved":false,"context_lines":[{"line_number":348,"context_line":"        self.fields_src_elem \u003d self._get_element(*self._fields_locator)"},{"line_number":349,"context_line":"        fields \u003d self._get_form_fields()"},{"line_number":350,"context_line":"        for accessor_name, accessor_expr in self.field_mappings.items():"},{"line_number":351,"context_line":"            if accessor_expr not in fields and not inspect.isclass("},{"line_number":352,"context_line":"                    accessor_expr):"},{"line_number":353,"context_line":"                continue"},{"line_number":354,"context_line":"            if isinstance(accessor_expr, six.string_types):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_65d6802a","line":351,"updated":"2019-10-08 08:19:23.000000000","message":"I am confused with this change.\n\nIn case of [1], self.field_mappings would be:\n\n  [\n     {\n       \u0027name\u0027: \u0027name\u0027,\n       \u0027description\u0027: \u0027description\u0027,\n       \u0027enabled\u0027: \u0027enabled\u0027\n     },\n     {\n       \u0027members\u0027: menus.MembershipMenuRegion\n     }\n  ]\n\nL.357 instantiate a class specified in accessor_expr.\nA problem looks like that menus.MembershipMenuRegion does not work properly, doesn\u0027t it?","commit_id":"ff89ec4641932e701fc4bd446390f6d78816f7c1"},{"author":{"_account_id":23467,"name":"Pallav Gupta","email":"pallavgupta84@gmail.com","username":"pallav"},"change_message_id":"f441eb0b7cb24dcb75ec25a0020e798224b6c132","unresolved":false,"context_lines":[{"line_number":348,"context_line":"        self.fields_src_elem \u003d self._get_element(*self._fields_locator)"},{"line_number":349,"context_line":"        fields \u003d self._get_form_fields()"},{"line_number":350,"context_line":"        for accessor_name, accessor_expr in self.field_mappings.items():"},{"line_number":351,"context_line":"            if accessor_expr not in fields and not inspect.isclass("},{"line_number":352,"context_line":"                    accessor_expr):"},{"line_number":353,"context_line":"                continue"},{"line_number":354,"context_line":"            if isinstance(accessor_expr, six.string_types):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_25315ea3","line":351,"in_reply_to":"3fa7e38b_65d6802a","updated":"2019-10-08 16:09:27.000000000","message":"It works perfectly now. Earlier, It was skipping as we don\u0027t define classes as fields but by condition we can pass through class field to field mapping (_dynamic_properties).","commit_id":"ff89ec4641932e701fc4bd446390f6d78816f7c1"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"e7384112ab5f0008916c35c4d81c8019dfcced67","unresolved":false,"context_lines":[{"line_number":349,"context_line":"        fields \u003d self._get_form_fields()"},{"line_number":350,"context_line":"        for accessor_name, accessor_expr in self.field_mappings.items():"},{"line_number":351,"context_line":"            if accessor_expr not in fields and not inspect.isclass("},{"line_number":352,"context_line":"                    accessor_expr):"},{"line_number":353,"context_line":"                continue"},{"line_number":354,"context_line":"            if isinstance(accessor_expr, six.string_types):"},{"line_number":355,"context_line":"                self._dynamic_properties[accessor_name] \u003d fields[accessor_expr]"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_4584a45e","line":352,"updated":"2019-10-08 08:19:23.000000000","message":"From the readability, the following looks better:\n\n   if (accessor_expr not in fields and\n       not inspect.isclass(accessor_expr)):","commit_id":"ff89ec4641932e701fc4bd446390f6d78816f7c1"},{"author":{"_account_id":23467,"name":"Pallav Gupta","email":"pallavgupta84@gmail.com","username":"pallav"},"change_message_id":"1ac9395d87af668bd648f3a7aaef808352bc1ee1","unresolved":false,"context_lines":[{"line_number":349,"context_line":"        fields \u003d self._get_form_fields()"},{"line_number":350,"context_line":"        for accessor_name, accessor_expr in self.field_mappings.items():"},{"line_number":351,"context_line":"            if accessor_expr not in fields and not inspect.isclass("},{"line_number":352,"context_line":"                    accessor_expr):"},{"line_number":353,"context_line":"                continue"},{"line_number":354,"context_line":"            if isinstance(accessor_expr, six.string_types):"},{"line_number":355,"context_line":"                self._dynamic_properties[accessor_name] \u003d fields[accessor_expr]"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_06b9cfe7","line":352,"in_reply_to":"3fa7e38b_4584a45e","updated":"2019-10-08 16:04:57.000000000","message":"Done","commit_id":"ff89ec4641932e701fc4bd446390f6d78816f7c1"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"e7384112ab5f0008916c35c4d81c8019dfcced67","unresolved":false,"context_lines":[{"line_number":449,"context_line":"        current_tab_mappings \u003d self.field_mappings[tab_index]"},{"line_number":450,"context_line":"        for accessor_name, accessor_expr in current_tab_mappings.items():"},{"line_number":451,"context_line":"            if accessor_expr not in fields and not inspect.isclass("},{"line_number":452,"context_line":"                    accessor_expr):"},{"line_number":453,"context_line":"                continue"},{"line_number":454,"context_line":"            if isinstance(accessor_expr, six.string_types):"},{"line_number":455,"context_line":"                self._dynamic_properties[accessor_name] \u003d fields[accessor_expr]"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_057eac6a","line":452,"updated":"2019-10-08 08:19:23.000000000","message":"ditto","commit_id":"ff89ec4641932e701fc4bd446390f6d78816f7c1"},{"author":{"_account_id":23467,"name":"Pallav Gupta","email":"pallavgupta84@gmail.com","username":"pallav"},"change_message_id":"1ac9395d87af668bd648f3a7aaef808352bc1ee1","unresolved":false,"context_lines":[{"line_number":449,"context_line":"        current_tab_mappings \u003d self.field_mappings[tab_index]"},{"line_number":450,"context_line":"        for accessor_name, accessor_expr in current_tab_mappings.items():"},{"line_number":451,"context_line":"            if accessor_expr not in fields and not inspect.isclass("},{"line_number":452,"context_line":"                    accessor_expr):"},{"line_number":453,"context_line":"                continue"},{"line_number":454,"context_line":"            if isinstance(accessor_expr, six.string_types):"},{"line_number":455,"context_line":"                self._dynamic_properties[accessor_name] \u003d fields[accessor_expr]"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_a6cf9b7d","line":452,"in_reply_to":"3fa7e38b_057eac6a","updated":"2019-10-08 16:04:57.000000000","message":"Done","commit_id":"ff89ec4641932e701fc4bd446390f6d78816f7c1"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"6d5d78261a4b9326655f251e4e3aaa015210c66c","unresolved":false,"context_lines":[{"line_number":349,"context_line":"        fields \u003d self._get_form_fields()"},{"line_number":350,"context_line":"        for accessor_name, accessor_expr in self.field_mappings.items():"},{"line_number":351,"context_line":"            if (accessor_expr not in fields and"},{"line_number":352,"context_line":"                    not inspect.isclass(accessor_expr)):"},{"line_number":353,"context_line":"                continue"},{"line_number":354,"context_line":"            if isinstance(accessor_expr, six.string_types):"},{"line_number":355,"context_line":"                self._dynamic_properties[accessor_name] \u003d fields[accessor_expr]"}],"source_content_type":"text/x-python","patch_set":6,"id":"3fa7e38b_9d565e06","line":352,"updated":"2019-10-09 06:53:16.000000000","message":"My comment in patch set 5 [1] is not answered yet.\n\nIf accessor_expr is a class, more processing will be skipped by this patch. Then, what does L.356-358 mean? I think L.356-358 covers a case where a accesor_expr is a class.\n\n[1] https://review.opendev.org/#/c/686018/3/openstack_dashboard/test/integration_tests/regions/forms.py@351","commit_id":"396386730495f23bdea9bb4dc8e200c419e4bb24"},{"author":{"_account_id":23467,"name":"Pallav Gupta","email":"pallavgupta84@gmail.com","username":"pallav"},"change_message_id":"92b9a36c9bceeff28605e035e71adefd1c10a513","unresolved":false,"context_lines":[{"line_number":349,"context_line":"        fields \u003d self._get_form_fields()"},{"line_number":350,"context_line":"        for accessor_name, accessor_expr in self.field_mappings.items():"},{"line_number":351,"context_line":"            if (accessor_expr not in fields and"},{"line_number":352,"context_line":"                    not inspect.isclass(accessor_expr)):"},{"line_number":353,"context_line":"                continue"},{"line_number":354,"context_line":"            if isinstance(accessor_expr, six.string_types):"},{"line_number":355,"context_line":"                self._dynamic_properties[accessor_name] \u003d fields[accessor_expr]"}],"source_content_type":"text/x-python","patch_set":6,"id":"3fa7e38b_1d9eee62","line":352,"in_reply_to":"3fa7e38b_9d565e06","updated":"2019-10-09 07:32:25.000000000","message":"The aim of this condition is to skip fields which are not present in web form for backward compatibility. Lets say in Ocata, network field \"az_hints\" was not available so we can skip that field here and continue with other fields. I made it generic so if we don\u0027t have specified field, field mapping should work as usual. This condition doesn\u0027t skip if accessor_expr is a class. That is why members field which maps to a class works properly. It does map web fields and class type both.","commit_id":"396386730495f23bdea9bb4dc8e200c419e4bb24"}]}
