)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"559990c379b2bc17775eedfe76eed1505d8a0cd9","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Cédric Savignan \u003ccedric.savignan@orange.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2018-03-15 10:57:16 +0100"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add bgpvpns in detail network panel"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch add a BGPVPN tab in the detail networks panels"},{"line_number":10,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"df7087c5_ee1995d6","line":7,"updated":"2018-03-15 12:55:24.000000000","message":"\"Add a BGPVPNs tab in network details panel\" ?","commit_id":"7659f48854c3e7f440c0b3ba61ba71cf451aab41"},{"author":{"_account_id":21800,"name":"Cedric Savignan","email":"cedric.savignan@orange.com","username":"csavignan"},"change_message_id":"0801a1e03a3acd5ef6e6105120bf0c7cd07762c9","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Cédric Savignan \u003ccedric.savignan@orange.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2018-03-15 10:57:16 +0100"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add bgpvpns in detail network panel"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch add a BGPVPN tab in the detail networks panels"},{"line_number":10,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"df7087c5_c85a8481","line":7,"in_reply_to":"df7087c5_5943ad42","updated":"2018-03-15 14:21:26.000000000","message":"Done","commit_id":"7659f48854c3e7f440c0b3ba61ba71cf451aab41"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"fd0906601340f957d9ef870b0fde3809b42c6e74","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Cédric Savignan \u003ccedric.savignan@orange.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2018-03-15 10:57:16 +0100"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add bgpvpns in detail network panel"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch add a BGPVPN tab in the detail networks panels"},{"line_number":10,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"df7087c5_5943ad42","line":7,"in_reply_to":"df7087c5_ee1995d6","updated":"2018-03-15 13:30:20.000000000","message":"+1","commit_id":"7659f48854c3e7f440c0b3ba61ba71cf451aab41"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"559990c379b2bc17775eedfe76eed1505d8a0cd9","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add bgpvpns in detail network panel"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch add a BGPVPN tab in the detail networks panels"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Change-Id: I233fda50d2898228a4c76d45680503e8c37b3d8b"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"df7087c5_ee30b558","line":9,"range":{"start_line":9,"start_character":11,"end_line":9,"end_character":14},"updated":"2018-03-15 12:55:24.000000000","message":"adds","commit_id":"7659f48854c3e7f440c0b3ba61ba71cf451aab41"},{"author":{"_account_id":21800,"name":"Cedric Savignan","email":"cedric.savignan@orange.com","username":"csavignan"},"change_message_id":"0801a1e03a3acd5ef6e6105120bf0c7cd07762c9","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add bgpvpns in detail network panel"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch add a BGPVPN tab in the detail networks panels"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Change-Id: I233fda50d2898228a4c76d45680503e8c37b3d8b"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"df7087c5_e85d0879","line":9,"range":{"start_line":9,"start_character":11,"end_line":9,"end_character":14},"in_reply_to":"df7087c5_ee30b558","updated":"2018-03-15 14:21:26.000000000","message":"Done","commit_id":"7659f48854c3e7f440c0b3ba61ba71cf451aab41"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"e213761ebc16e61d13718f24486461dbb4a5e840","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Cédric Savignan \u003ccedric.savignan@orange.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2018-03-15 16:50:27 +0100"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add a BGPVPNs tab in network details panel"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch adds a BGPVPN tab in the detail networks panels"},{"line_number":10,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"df7087c5_6e7b1c8b","line":7,"updated":"2018-03-16 17:19:44.000000000","message":"suggestion: adding simply \u0027horizon:\u0027 or \u0027dashboard:\u0027 is a light way of visually grouping changes that relate to the GUI","commit_id":"353c0fe34cecb08976619e3cc8d066472151d8c1"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"e6a26e2dd3db66b218d2f4d5629261bc075a2fe5","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Cédric Savignan \u003ccedric.savignan@orange.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2018-03-15 16:50:27 +0100"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add a BGPVPNs tab in network details panel"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch adds a BGPVPN tab in the detail networks panels"},{"line_number":10,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"df7087c5_8c99cad1","line":7,"in_reply_to":"df7087c5_6e7b1c8b","updated":"2018-08-25 16:24:06.000000000","message":"+1","commit_id":"353c0fe34cecb08976619e3cc8d066472151d8c1"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"8575a9b9bd34195964f31010551bd3c4010d04cd","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Cédric Savignan \u003ccedric.savignan@orange.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2018-03-19 14:51:53 +0100"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"[dashboard]Add a BGPVPNs tab in network details panel"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch adds a BGPVPN tab in the detail networks panels"},{"line_number":10,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"df7087c5_e412c809","line":7,"range":{"start_line":7,"start_character":10,"end_line":7,"end_character":12},"updated":"2018-03-19 16:23:47.000000000","message":"space ?","commit_id":"acfb5ee103ae3a7219da4d74095a4d87086545b9"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"e04ece4ee7463ea09d95465eb5ebeb647e8adfce","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Cédric Savignan \u003ccedric.savignan@orange.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2018-04-05 12:09:09 +0200"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"[dashboard]Add a BGPVPNs tab in network details panel"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch adds a BGPVPN tab in the detail networks panels"},{"line_number":10,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"bf659307_73b450f3","line":7,"range":{"start_line":7,"start_character":10,"end_line":7,"end_character":12},"updated":"2018-04-05 10:15:33.000000000","message":"removed space ?","commit_id":"5e5c011c52b697fdb1ff8513207b4e331214578e"}],"bgpvpn_dashboard/dashboards/admin/bgpvpn/tabs.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"31302cf20b68f9893e4fa8c076a05b02763083ec","unresolved":false,"context_lines":[{"line_number":42,"context_line":"            bgpvpns \u003d bgpvpn_api.bgpvpns_list(self.request,"},{"line_number":43,"context_line":"                                              networks\u003dnetwork_id)"},{"line_number":44,"context_line":"            for bgpvpn in bgpvpns:"},{"line_number":45,"context_line":"                bgpvpn.networks \u003d [api.neutron.network_get("},{"line_number":46,"context_line":"                    self.request, id, expand_subnet\u003dFalse)"},{"line_number":47,"context_line":"                    for id in bgpvpn.networks]"},{"line_number":48,"context_line":"                bgpvpn.routers \u003d [api.neutron.router_get(self.request, id)"},{"line_number":49,"context_line":"                                  for id in bgpvpn.routers]"},{"line_number":50,"context_line":"                bgpvpn.tenant_name \u003d self._get_tenant_name(bgpvpn.tenant_id)"}],"source_content_type":"text/x-python","patch_set":2,"id":"df7087c5_0b4c1240","line":47,"range":{"start_line":45,"start_character":16,"end_line":47,"end_character":46},"updated":"2018-03-14 18:31:15.000000000","message":"Same question as for project.bgpvpn.tabs","commit_id":"953068284f078a9a531c1e1b507ad7fc67c2f3c2"},{"author":{"_account_id":21800,"name":"Cedric Savignan","email":"cedric.savignan@orange.com","username":"csavignan"},"change_message_id":"570761247fb3a5d8e89cca8ded6ec719957fbbcd","unresolved":false,"context_lines":[{"line_number":42,"context_line":"            bgpvpns \u003d bgpvpn_api.bgpvpns_list(self.request,"},{"line_number":43,"context_line":"                                              networks\u003dnetwork_id)"},{"line_number":44,"context_line":"            for bgpvpn in bgpvpns:"},{"line_number":45,"context_line":"                bgpvpn.networks \u003d [api.neutron.network_get("},{"line_number":46,"context_line":"                    self.request, id, expand_subnet\u003dFalse)"},{"line_number":47,"context_line":"                    for id in bgpvpn.networks]"},{"line_number":48,"context_line":"                bgpvpn.routers \u003d [api.neutron.router_get(self.request, id)"},{"line_number":49,"context_line":"                                  for id in bgpvpn.routers]"},{"line_number":50,"context_line":"                bgpvpn.tenant_name \u003d self._get_tenant_name(bgpvpn.tenant_id)"}],"source_content_type":"text/x-python","patch_set":2,"id":"df7087c5_ff6b8aed","line":47,"range":{"start_line":45,"start_character":16,"end_line":47,"end_character":46},"in_reply_to":"df7087c5_0b4c1240","updated":"2018-03-15 09:57:55.000000000","message":"Done","commit_id":"953068284f078a9a531c1e1b507ad7fc67c2f3c2"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"559990c379b2bc17775eedfe76eed1505d8a0cd9","unresolved":false,"context_lines":[{"line_number":35,"context_line":"                    \"tenant %s\") % id"},{"line_number":36,"context_line":"            exceptions.handle(self.request, msg)"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    @memoized.memoized_method"},{"line_number":39,"context_line":"    def get_bgpvpns_data(self):"},{"line_number":40,"context_line":"        try:"},{"line_number":41,"context_line":"            network_id \u003d self.tab_group.kwargs[\u0027network_id\u0027]"}],"source_content_type":"text/x-python","patch_set":3,"id":"df7087c5_ee943539","line":38,"range":{"start_line":38,"start_character":0,"end_line":38,"end_character":29},"updated":"2018-03-15 12:55:24.000000000","message":"What is the scope of this memoize ?\nie. if the bgpvpns associated with a network are changed, will the cached data be properly invalidated or do we risk seeing stale data in the GUI ?","commit_id":"7659f48854c3e7f440c0b3ba61ba71cf451aab41"},{"author":{"_account_id":21800,"name":"Cedric Savignan","email":"cedric.savignan@orange.com","username":"csavignan"},"change_message_id":"0801a1e03a3acd5ef6e6105120bf0c7cd07762c9","unresolved":false,"context_lines":[{"line_number":35,"context_line":"                    \"tenant %s\") % id"},{"line_number":36,"context_line":"            exceptions.handle(self.request, msg)"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    @memoized.memoized_method"},{"line_number":39,"context_line":"    def get_bgpvpns_data(self):"},{"line_number":40,"context_line":"        try:"},{"line_number":41,"context_line":"            network_id \u003d self.tab_group.kwargs[\u0027network_id\u0027]"}],"source_content_type":"text/x-python","patch_set":3,"id":"df7087c5_34eda0b6","line":38,"range":{"start_line":38,"start_character":0,"end_line":38,"end_character":29},"in_reply_to":"df7087c5_997ce572","updated":"2018-03-15 14:21:26.000000000","message":"Done","commit_id":"7659f48854c3e7f440c0b3ba61ba71cf451aab41"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"fd0906601340f957d9ef870b0fde3809b42c6e74","unresolved":false,"context_lines":[{"line_number":35,"context_line":"                    \"tenant %s\") % id"},{"line_number":36,"context_line":"            exceptions.handle(self.request, msg)"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    @memoized.memoized_method"},{"line_number":39,"context_line":"    def get_bgpvpns_data(self):"},{"line_number":40,"context_line":"        try:"},{"line_number":41,"context_line":"            network_id \u003d self.tab_group.kwargs[\u0027network_id\u0027]"}],"source_content_type":"text/x-python","patch_set":3,"id":"df7087c5_997ce572","line":38,"range":{"start_line":38,"start_character":0,"end_line":38,"end_character":29},"in_reply_to":"df7087c5_ee943539","updated":"2018-03-15 13:30:20.000000000","message":"First of all, get_bgpvpmns_data() is called only once per request, so there is no need to use the memoized decorator.\n\n\"memoize\" is based on arguments of methods. In this case, this method has no argument other than \u0027self\u0027, so there is no need to use @memoized.","commit_id":"7659f48854c3e7f440c0b3ba61ba71cf451aab41"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"e6a26e2dd3db66b218d2f4d5629261bc075a2fe5","unresolved":false,"context_lines":[{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def _get_tenant_name(self, id):"},{"line_number":44,"context_line":"        try:"},{"line_number":45,"context_line":"            return api.keystone.tenant_get(self.request, id).name"},{"line_number":46,"context_line":"        except Exception:"},{"line_number":47,"context_line":"            msg \u003d _(\"Unable to retrieve information about the \""},{"line_number":48,"context_line":"                    \"tenant %s\") % id"}],"source_content_type":"text/x-python","patch_set":13,"id":"3f79a3b5_f203b60b","line":45,"updated":"2018-08-25 16:24:06.000000000","message":"This leads to multiple tenant_get() API calls. It would be nice if you use tenant_list.","commit_id":"dc229ef050631ebde5b3acc062dc27b11e4aa5d3"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"d764fcafa481da113cb191fd209b4952a397bdf0","unresolved":false,"context_lines":[{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def _get_tenant_name(self, id):"},{"line_number":44,"context_line":"        try:"},{"line_number":45,"context_line":"            return api.keystone.tenant_get(self.request, id).name"},{"line_number":46,"context_line":"        except Exception:"},{"line_number":47,"context_line":"            msg \u003d _(\"Unable to retrieve information about the \""},{"line_number":48,"context_line":"                    \"tenant %s\") % id"}],"source_content_type":"text/x-python","patch_set":13,"id":"1f769fc5_a59aa0c2","line":45,"in_reply_to":"3f79a3b5_17f6195f","updated":"2018-12-25 02:18:29.000000000","message":"I think get_tenant_list would be better.\n\nProject name can be updated.\n\nmemoized decorator just stored information inside a single request, so it does not help much in this case.","commit_id":"dc229ef050631ebde5b3acc062dc27b11e4aa5d3"},{"author":{"_account_id":21800,"name":"Cedric Savignan","email":"cedric.savignan@orange.com","username":"csavignan"},"change_message_id":"d8136038fa226df310bcd09b8cad182d5b0b2d0f","unresolved":false,"context_lines":[{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def _get_tenant_name(self, id):"},{"line_number":44,"context_line":"        try:"},{"line_number":45,"context_line":"            return api.keystone.tenant_get(self.request, id).name"},{"line_number":46,"context_line":"        except Exception:"},{"line_number":47,"context_line":"            msg \u003d _(\"Unable to retrieve information about the \""},{"line_number":48,"context_line":"                    \"tenant %s\") % id"}],"source_content_type":"text/x-python","patch_set":13,"id":"3f79a3b5_8a9694a0","line":45,"in_reply_to":"3f79a3b5_5466b32b","updated":"2018-09-23 19:35:57.000000000","message":"Perhaps a cache can be a solution?","commit_id":"dc229ef050631ebde5b3acc062dc27b11e4aa5d3"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"22c98d2334d5b9deccc6ca623aa1ec57ac742ec4","unresolved":false,"context_lines":[{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def _get_tenant_name(self, id):"},{"line_number":44,"context_line":"        try:"},{"line_number":45,"context_line":"            return api.keystone.tenant_get(self.request, id).name"},{"line_number":46,"context_line":"        except Exception:"},{"line_number":47,"context_line":"            msg \u003d _(\"Unable to retrieve information about the \""},{"line_number":48,"context_line":"                    \"tenant %s\") % id"}],"source_content_type":"text/x-python","patch_set":13,"id":"3f79a3b5_17f6195f","line":45,"in_reply_to":"3f79a3b5_8a9694a0","updated":"2018-09-24 18:55:48.000000000","message":"I don\u0027t remember if a tenant name can be updated. If it can be then a plain memoize is a bad practice.\n\nPerhaps memoized_with_request [1] would be the solution ?\n\nAkihiro, I\u0027m sure you are experienced to guide us; what would be your suggestion ?\n\nDo you think a get_tenant_list would be better ?\n\n[1] https://docs.openstack.org/horizon/10.0.2/_modules/horizon/utils/memoized.html#memoized_with_request","commit_id":"dc229ef050631ebde5b3acc062dc27b11e4aa5d3"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"4b15027e1b1d31e0306bb51735f75122b357c35a","unresolved":false,"context_lines":[{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def _get_tenant_name(self, id):"},{"line_number":44,"context_line":"        try:"},{"line_number":45,"context_line":"            return api.keystone.tenant_get(self.request, id).name"},{"line_number":46,"context_line":"        except Exception:"},{"line_number":47,"context_line":"            msg \u003d _(\"Unable to retrieve information about the \""},{"line_number":48,"context_line":"                    \"tenant %s\") % id"}],"source_content_type":"text/x-python","patch_set":13,"id":"3f79a3b5_5466b32b","line":45,"in_reply_to":"3f79a3b5_f203b60b","updated":"2018-08-30 13:01:18.000000000","message":"I understand the problem you are pointing out.\n\nWould you suggest retrieving the list of relevant tenant_ids around lines 56-57, and then using this list in a api.keystone.tenant_list() call with a filter to retrieve all the needed tenants ? \n\nOr do you have something else in mind ?\n\nIsn\u0027t retrieving all the tenants seems perhaps a bit heavy?","commit_id":"dc229ef050631ebde5b3acc062dc27b11e4aa5d3"}],"bgpvpn_dashboard/dashboards/project/bgpvpn/tables.py":[{"author":{"_account_id":21800,"name":"Cedric Savignan","email":"cedric.savignan@orange.com","username":"csavignan"},"change_message_id":"1c86273cc580d76afa1b9bed78bf2b48c5730ea7","unresolved":false,"context_lines":[{"line_number":47,"context_line":"    def delete(self, request, bgpvpn_id):"},{"line_number":48,"context_line":"        network_id \u003d self.table.kwargs[\u0027network_id\u0027]"},{"line_number":49,"context_line":"        try:"},{"line_number":50,"context_line":"            assos_list \u003d bgpvpn_api.network_association_list(request,"},{"line_number":51,"context_line":"                                                             bgpvpn_id)"},{"line_number":52,"context_line":"            for asso in assos_list:"},{"line_number":53,"context_line":"                if network_id \u003d\u003d asso.network_id:"},{"line_number":54,"context_line":"                    break"},{"line_number":55,"context_line":"            bgpvpn_api.network_association_delete("},{"line_number":56,"context_line":"                request, asso.id, bgpvpn_id)"},{"line_number":57,"context_line":"        except Exception:"}],"source_content_type":"text/x-python","patch_set":9,"id":"bf659307_84eafca9","line":54,"range":{"start_line":50,"start_character":12,"end_line":54,"end_character":25},"updated":"2018-04-05 12:48:14.000000000","message":"I\u0027m not sure if it\u0027s the best way to find a asso_id from a network_id and a bgpvpn_id","commit_id":"8948baac4c721b034d20041bd8d6b30050274a9e"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"5c4ce2a88113a1cf5945cc7c7c8bc6f4ed6d71b0","unresolved":false,"context_lines":[{"line_number":47,"context_line":"    def delete(self, request, bgpvpn_id):"},{"line_number":48,"context_line":"        network_id \u003d self.table.kwargs[\u0027network_id\u0027]"},{"line_number":49,"context_line":"        try:"},{"line_number":50,"context_line":"            assos_list \u003d bgpvpn_api.network_association_list(request,"},{"line_number":51,"context_line":"                                                             bgpvpn_id)"},{"line_number":52,"context_line":"            for asso in assos_list:"},{"line_number":53,"context_line":"                if network_id \u003d\u003d asso.network_id:"},{"line_number":54,"context_line":"                    break"},{"line_number":55,"context_line":"            bgpvpn_api.network_association_delete("},{"line_number":56,"context_line":"                request, asso.id, bgpvpn_id)"},{"line_number":57,"context_line":"        except Exception:"}],"source_content_type":"text/x-python","patch_set":9,"id":"bf659307_3fc1b981","line":54,"range":{"start_line":50,"start_character":12,"end_line":54,"end_character":25},"in_reply_to":"bf659307_84eafca9","updated":"2018-04-05 13:27:42.000000000","message":"The right way of deleting an association would be to have the (bgpvpn_id, association_id) passed as an action to the table.\n\nThe code above finds the association from the network_id. This is working today because we do not allow to have multiple associations for a given (bgpvpn, network), but will it be true forever and for all objects ?\n\n(the loop above could be avoided by doing a list request with a filter on the network_id attribute, but this is not, I think, the right solution)","commit_id":"8948baac4c721b034d20041bd8d6b30050274a9e"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"b2f3a4a371be4b85b01b954d01633f24546229b1","unresolved":false,"context_lines":[{"line_number":140,"context_line":"        name \u003d \"bgpvpns\""},{"line_number":141,"context_line":"        verbose_name \u003d _(\"BGPVPN\")"},{"line_number":142,"context_line":"        table_actions \u003d (DeleteNetworkAssociation,)"},{"line_number":143,"context_line":"        row_actions \u003d (EditInfoBgpVpn,"},{"line_number":144,"context_line":"                       DeleteNetworkAssociation,"},{"line_number":145,"context_line":"                       UpdateNetworkAssociations,"},{"line_number":146,"context_line":"                       UpdateRouterAssociations)"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"class BgpvpnTableWithNetworksAndRouters(BgpvpnTable):"}],"source_content_type":"text/x-python","patch_set":9,"id":"bf659307_1f54f553","line":146,"range":{"start_line":143,"start_character":22,"end_line":146,"end_character":48},"updated":"2018-04-05 13:42:54.000000000","message":"Only a \"DeleteNetworkAssociation\" is relevant here.\n(for the corresponding panel in \"Routers\", we would also have an EditRouterAssociation)","commit_id":"8948baac4c721b034d20041bd8d6b30050274a9e"}],"bgpvpn_dashboard/dashboards/project/bgpvpn/tabs.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"31302cf20b68f9893e4fa8c076a05b02763083ec","unresolved":false,"context_lines":[{"line_number":38,"context_line":"            bgpvpns \u003d bgpvpn_api.bgpvpns_list(self.request,"},{"line_number":39,"context_line":"                                              networks\u003dnetwork_id)"},{"line_number":40,"context_line":"            for bgpvpn in bgpvpns:"},{"line_number":41,"context_line":"                bgpvpn.networks \u003d [api.neutron.network_get("},{"line_number":42,"context_line":"                    self.request, id, expand_subnet\u003dFalse)"},{"line_number":43,"context_line":"                    for id in bgpvpn.networks]"},{"line_number":44,"context_line":"                bgpvpn.routers \u003d [api.neutron.router_get(self.request, id)"},{"line_number":45,"context_line":"                                  for id in bgpvpn.routers]"},{"line_number":46,"context_line":"        except Exception:"}],"source_content_type":"text/x-python","patch_set":2,"id":"df7087c5_ebb99e14","line":43,"range":{"start_line":41,"start_character":16,"end_line":43,"end_character":46},"updated":"2018-03-14 18:31:15.000000000","message":"I am a bit confused. This is a part of a network detail, so why do we need to show networks?","commit_id":"953068284f078a9a531c1e1b507ad7fc67c2f3c2"},{"author":{"_account_id":21800,"name":"Cedric Savignan","email":"cedric.savignan@orange.com","username":"csavignan"},"change_message_id":"0801a1e03a3acd5ef6e6105120bf0c7cd07762c9","unresolved":false,"context_lines":[{"line_number":38,"context_line":"            bgpvpns \u003d bgpvpn_api.bgpvpns_list(self.request,"},{"line_number":39,"context_line":"                                              networks\u003dnetwork_id)"},{"line_number":40,"context_line":"            for bgpvpn in bgpvpns:"},{"line_number":41,"context_line":"                bgpvpn.networks \u003d [api.neutron.network_get("},{"line_number":42,"context_line":"                    self.request, id, expand_subnet\u003dFalse)"},{"line_number":43,"context_line":"                    for id in bgpvpn.networks]"},{"line_number":44,"context_line":"                bgpvpn.routers \u003d [api.neutron.router_get(self.request, id)"},{"line_number":45,"context_line":"                                  for id in bgpvpn.routers]"},{"line_number":46,"context_line":"        except Exception:"}],"source_content_type":"text/x-python","patch_set":2,"id":"df7087c5_484754bd","line":43,"range":{"start_line":41,"start_character":16,"end_line":43,"end_character":46},"in_reply_to":"df7087c5_39f7d95b","updated":"2018-03-15 14:21:26.000000000","message":"I\u0027ve tried to inherit BgpvpnTable and specify colums without routers and networks in Meta but it call always the get_network_url in tables.py and fail.\nI tried a different way.","commit_id":"953068284f078a9a531c1e1b507ad7fc67c2f3c2"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"559990c379b2bc17775eedfe76eed1505d8a0cd9","unresolved":false,"context_lines":[{"line_number":38,"context_line":"            bgpvpns \u003d bgpvpn_api.bgpvpns_list(self.request,"},{"line_number":39,"context_line":"                                              networks\u003dnetwork_id)"},{"line_number":40,"context_line":"            for bgpvpn in bgpvpns:"},{"line_number":41,"context_line":"                bgpvpn.networks \u003d [api.neutron.network_get("},{"line_number":42,"context_line":"                    self.request, id, expand_subnet\u003dFalse)"},{"line_number":43,"context_line":"                    for id in bgpvpn.networks]"},{"line_number":44,"context_line":"                bgpvpn.routers \u003d [api.neutron.router_get(self.request, id)"},{"line_number":45,"context_line":"                                  for id in bgpvpn.routers]"},{"line_number":46,"context_line":"        except Exception:"}],"source_content_type":"text/x-python","patch_set":2,"id":"df7087c5_ee67554c","line":43,"range":{"start_line":41,"start_character":16,"end_line":43,"end_character":46},"in_reply_to":"df7087c5_89fc9c3e","updated":"2018-03-15 12:55:24.000000000","message":"Since clicking on the bgpvpn name will bring the user to a page where all associated networks and routers are indicated, I think it is best to remove both the lists of networks and list of routers from here.","commit_id":"953068284f078a9a531c1e1b507ad7fc67c2f3c2"},{"author":{"_account_id":21800,"name":"Cedric Savignan","email":"cedric.savignan@orange.com","username":"csavignan"},"change_message_id":"570761247fb3a5d8e89cca8ded6ec719957fbbcd","unresolved":false,"context_lines":[{"line_number":38,"context_line":"            bgpvpns \u003d bgpvpn_api.bgpvpns_list(self.request,"},{"line_number":39,"context_line":"                                              networks\u003dnetwork_id)"},{"line_number":40,"context_line":"            for bgpvpn in bgpvpns:"},{"line_number":41,"context_line":"                bgpvpn.networks \u003d [api.neutron.network_get("},{"line_number":42,"context_line":"                    self.request, id, expand_subnet\u003dFalse)"},{"line_number":43,"context_line":"                    for id in bgpvpn.networks]"},{"line_number":44,"context_line":"                bgpvpn.routers \u003d [api.neutron.router_get(self.request, id)"},{"line_number":45,"context_line":"                                  for id in bgpvpn.routers]"},{"line_number":46,"context_line":"        except Exception:"}],"source_content_type":"text/x-python","patch_set":2,"id":"df7087c5_89fc9c3e","line":43,"range":{"start_line":41,"start_character":16,"end_line":43,"end_character":46},"in_reply_to":"df7087c5_ebb99e14","updated":"2018-03-15 09:57:55.000000000","message":"You\u0027re correct. It\u0027s probably useless when the bgpvpn has only one network associated.\nBut if the bgpvpn has several networks associated it can be useful.\nConclusion I don\u0027t know what is the best solution.","commit_id":"953068284f078a9a531c1e1b507ad7fc67c2f3c2"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"fd0906601340f957d9ef870b0fde3809b42c6e74","unresolved":false,"context_lines":[{"line_number":38,"context_line":"            bgpvpns \u003d bgpvpn_api.bgpvpns_list(self.request,"},{"line_number":39,"context_line":"                                              networks\u003dnetwork_id)"},{"line_number":40,"context_line":"            for bgpvpn in bgpvpns:"},{"line_number":41,"context_line":"                bgpvpn.networks \u003d [api.neutron.network_get("},{"line_number":42,"context_line":"                    self.request, id, expand_subnet\u003dFalse)"},{"line_number":43,"context_line":"                    for id in bgpvpn.networks]"},{"line_number":44,"context_line":"                bgpvpn.routers \u003d [api.neutron.router_get(self.request, id)"},{"line_number":45,"context_line":"                                  for id in bgpvpn.routers]"},{"line_number":46,"context_line":"        except Exception:"}],"source_content_type":"text/x-python","patch_set":2,"id":"df7087c5_39f7d95b","line":43,"range":{"start_line":41,"start_character":16,"end_line":43,"end_character":46},"in_reply_to":"df7087c5_ee67554c","updated":"2018-03-15 13:30:20.000000000","message":"I agree with Thomas.\n\nIf we drop both, we can inherit BgpvpnTable and specify \u0027columns\u0027 in the Meta class.","commit_id":"953068284f078a9a531c1e1b507ad7fc67c2f3c2"}],"bgpvpn_dashboard/enabled/_1495_project_bgpvpn_panel.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"31302cf20b68f9893e4fa8c076a05b02763083ec","unresolved":false,"context_lines":[{"line_number":26,"context_line":"             \u0027dashboards.project.bgpvpn.panel.BGPVPNInterconnections\u0027)"},{"line_number":27,"context_line":"EXTRA_TABS \u003d {\u0027openstack_dashboard.dashboards.project.\u0027"},{"line_number":28,"context_line":"              \u0027networks.tabs.NetworkDetailsTabs\u0027:"},{"line_number":29,"context_line":"                  (\u0027bgpvpn_dashboard.dashboards.project.\u0027"},{"line_number":30,"context_line":"                   \u0027bgpvpn.tabs.BgpvpnsTab\u0027,"},{"line_number":31,"context_line":"                   )}"}],"source_content_type":"text/x-python","patch_set":2,"id":"df7087c5_4bf0cafd","line":31,"range":{"start_line":29,"start_character":18,"end_line":31,"end_character":21},"updated":"2018-03-14 18:31:15.000000000","message":"I think this fits into one line.\n\n EXTRA_TABS \u003d { \n     \u0027openstack_dashboard.dashboards.project.networks.tabs.NetworkDetailsTabs\u0027:\n         \u0027bgpvpn_dashboard.dashboards.project.bgpvpn.tabs.BgpvpnsTab\u0027\n }","commit_id":"953068284f078a9a531c1e1b507ad7fc67c2f3c2"},{"author":{"_account_id":21800,"name":"Cedric Savignan","email":"cedric.savignan@orange.com","username":"csavignan"},"change_message_id":"570761247fb3a5d8e89cca8ded6ec719957fbbcd","unresolved":false,"context_lines":[{"line_number":26,"context_line":"             \u0027dashboards.project.bgpvpn.panel.BGPVPNInterconnections\u0027)"},{"line_number":27,"context_line":"EXTRA_TABS \u003d {\u0027openstack_dashboard.dashboards.project.\u0027"},{"line_number":28,"context_line":"              \u0027networks.tabs.NetworkDetailsTabs\u0027:"},{"line_number":29,"context_line":"                  (\u0027bgpvpn_dashboard.dashboards.project.\u0027"},{"line_number":30,"context_line":"                   \u0027bgpvpn.tabs.BgpvpnsTab\u0027,"},{"line_number":31,"context_line":"                   )}"}],"source_content_type":"text/x-python","patch_set":2,"id":"df7087c5_c98b74c0","line":31,"range":{"start_line":29,"start_character":18,"end_line":31,"end_character":21},"in_reply_to":"df7087c5_4bf0cafd","updated":"2018-03-15 09:57:55.000000000","message":"Ok to reduce.\nBut you put a string instead a tuple in your proposition.","commit_id":"953068284f078a9a531c1e1b507ad7fc67c2f3c2"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"e6a26e2dd3db66b218d2f4d5629261bc075a2fe5","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"3f79a3b5_923e0289","updated":"2018-08-25 16:24:06.000000000","message":"If your company does not require it, it would be nice not to have it as this is the existing file.","commit_id":"dc229ef050631ebde5b3acc062dc27b11e4aa5d3"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"4b15027e1b1d31e0306bb51735f75122b357c35a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"3f79a3b5_74572f28","in_reply_to":"3f79a3b5_923e0289","updated":"2018-08-30 13:01:18.000000000","message":"The initial file and all its revisions where contributed by Orange, so I think the change is ok.  (see https://github.com/openstack/networking-bgpvpn/commits/master/bgpvpn_dashboard/enabled )","commit_id":"dc229ef050631ebde5b3acc062dc27b11e4aa5d3"}],"bgpvpn_dashboard/enabled/_2360_admin_bgpvpn_panel.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"31302cf20b68f9893e4fa8c076a05b02763083ec","unresolved":false,"context_lines":[{"line_number":26,"context_line":"             \u0027dashboards.admin.bgpvpn.panel.BGPVPNInterconnections\u0027)"},{"line_number":27,"context_line":"EXTRA_TABS \u003d {\u0027openstack_dashboard.dashboards.admin.\u0027"},{"line_number":28,"context_line":"              \u0027networks.views.NetworkDetailsTabs\u0027:"},{"line_number":29,"context_line":"                  (\u0027bgpvpn_dashboard.dashboards.admin.\u0027"},{"line_number":30,"context_line":"                   \u0027bgpvpn.tabs.BgpvpnsTab\u0027,"},{"line_number":31,"context_line":"                   )}"}],"source_content_type":"text/x-python","patch_set":2,"id":"df7087c5_ebb2fe48","line":31,"range":{"start_line":29,"start_character":18,"end_line":31,"end_character":21},"updated":"2018-03-14 18:31:15.000000000","message":"I think this fits into one line.\n\n EXTRA_TABS \u003d { \n     \u0027openstack_dashboard.dashboards.admin.networks.views.NetworkDetailsTabs\u0027:\n         \u0027bgpvpn_dashboard.dashboards.admin.bgpvpn.tabs.BgpvpnsTab\u0027\n }","commit_id":"953068284f078a9a531c1e1b507ad7fc67c2f3c2"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"e6a26e2dd3db66b218d2f4d5629261bc075a2fe5","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2017 Orange."},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":5,"context_line":"#    not use this file except in compliance with the License. You may obtain"},{"line_number":6,"context_line":"#    a copy of the License at"}],"source_content_type":"text/x-python","patch_set":13,"id":"3f79a3b5_f23bb698","line":3,"range":{"start_line":1,"start_character":0,"end_line":3,"end_character":1},"updated":"2018-08-25 16:24:06.000000000","message":"If your company does not require it, it would be nice not to have it as this is the existing file.","commit_id":"dc229ef050631ebde5b3acc062dc27b11e4aa5d3"}]}
