)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7665,"name":"Travis Tripp","email":"os.travis.tripp@gmail.com","username":"travis.tripp"},"change_message_id":"63e5e365836764e37d87385b78fbd516938b6b9c","unresolved":false,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Make the tree logic reusable by extracting it into service."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Closes-Bug: #1394472"},{"line_number":20,"context_line":"Change-Id: I88f4d008f4c814747028585842769aff26ff9936"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"ba7be1f8_52d88153","line":19,"updated":"2015-02-20 03:32:05.000000000","message":"I *think* that is doesn\u0027t need # in front of it.\n\nJust based on example here:\n\nhttps://wiki.openstack.org/wiki/Gerrit_Workflow#Committing_Changes","commit_id":"981ec74a0d83774689d03b055f411278b65a1a69"}],"horizon/static/angular/metadata-tree/metadata-tree-config.js":[{"author":{"_account_id":13805,"name":"Shaoquan Chen","email":"sean.chen2@hp.com","username":"SeanChen"},"change_message_id":"4e013e19c90b3ad9e5a25681efb295d94736c6f5","unresolved":false,"context_lines":[{"line_number":10,"context_line":"          \u0027from the left column to the right column. In the left columns \u0027 +"},{"line_number":11,"context_line":"          \u0027there are metadata definitions from the Glance Metadata Catalog. \u0027 +"},{"line_number":12,"context_line":"          \u0027Use the \"Other\" option to add metadata with the key of your choice.\u0027),"},{"line_number":13,"context_line":"        min: gettext(\u0027Min\u0027),"},{"line_number":14,"context_line":"        max: gettext(\u0027Max\u0027),"},{"line_number":15,"context_line":"        minLength: gettext(\u0027Min length\u0027),"},{"line_number":16,"context_line":"        maxLength: gettext(\u0027Max length\u0027),"}],"source_content_type":"text/javascript","patch_set":12,"id":"ba7be1f8_8204eb18","line":13,"updated":"2015-02-24 15:38:48.000000000","message":"I wonder if inside of gettext() there can be plus sign.","commit_id":"3d60c145dc9965252478731d7b0e10facff702c5"}],"horizon/static/angular/metadata-tree/metadata-tree-item.html":[{"author":{"_account_id":13805,"name":"Shaoquan Chen","email":"sean.chen2@hp.com","username":"SeanChen"},"change_message_id":"a9a4e40b3b7e8d253dd886a0bf198a00ce37ee82","unresolved":false,"context_lines":[{"line_number":3,"context_line":"       ng-switch on\u003d\"item.leaf.type\""},{"line_number":4,"context_line":"       ng-class\u003d\"{\u0027has-error\u0027 : itemForm.property.$invalid \u0026\u0026 itemForm.property.$dirty}\"\u003e"},{"line_number":5,"context_line":"    \u003cspan class\u003d\"input-group-addon\""},{"line_number":6,"context_line":"          title\u003d\"{{ item.leaf.name }}\"\u003e"},{"line_number":7,"context_line":"        {{ item.leaf.name }}"},{"line_number":8,"context_line":"    \u003c/span\u003e"},{"line_number":9,"context_line":"    \u003cinput ng-switch-when\u003d\"string\""}],"source_content_type":"text/html","patch_set":15,"id":"ba7be1f8_fd026808","line":6,"updated":"2015-02-25 18:56:40.000000000","message":"Is this going to change after the first time data-binding? if not, can we considering using one time binding to have better performance?\n\nOne time binding format:\n{{ ::item.leaf.name }}\n\nThis comment applies to other field where it is applicable.","commit_id":"9daeb26a83e3e782bd9671d2f0789a2b07d6995d"},{"author":{"_account_id":12825,"name":"Szymon Wróblewski","email":"szymon.wroblewski@ovhcloud.com","username":"bluex"},"change_message_id":"a8b7d75adf775c37b8103b14c532838f894de5f6","unresolved":false,"context_lines":[{"line_number":3,"context_line":"       ng-switch on\u003d\"item.leaf.type\""},{"line_number":4,"context_line":"       ng-class\u003d\"{\u0027has-error\u0027 : itemForm.property.$invalid \u0026\u0026 itemForm.property.$dirty}\"\u003e"},{"line_number":5,"context_line":"    \u003cspan class\u003d\"input-group-addon\""},{"line_number":6,"context_line":"          title\u003d\"{{ item.leaf.name }}\"\u003e"},{"line_number":7,"context_line":"        {{ item.leaf.name }}"},{"line_number":8,"context_line":"    \u003c/span\u003e"},{"line_number":9,"context_line":"    \u003cinput ng-switch-when\u003d\"string\""}],"source_content_type":"text/html","patch_set":15,"id":"ba7be1f8_250c7e94","line":6,"in_reply_to":"ba7be1f8_fd026808","updated":"2015-02-27 18:26:19.000000000","message":"Done","commit_id":"9daeb26a83e3e782bd9671d2f0789a2b07d6995d"},{"author":{"_account_id":13805,"name":"Shaoquan Chen","email":"sean.chen2@hp.com","username":"SeanChen"},"change_message_id":"a9a4e40b3b7e8d253dd886a0bf198a00ce37ee82","unresolved":false,"context_lines":[{"line_number":4,"context_line":"       ng-class\u003d\"{\u0027has-error\u0027 : itemForm.property.$invalid \u0026\u0026 itemForm.property.$dirty}\"\u003e"},{"line_number":5,"context_line":"    \u003cspan class\u003d\"input-group-addon\""},{"line_number":6,"context_line":"          title\u003d\"{{ item.leaf.name }}\"\u003e"},{"line_number":7,"context_line":"        {{ item.leaf.name }}"},{"line_number":8,"context_line":"    \u003c/span\u003e"},{"line_number":9,"context_line":"    \u003cinput ng-switch-when\u003d\"string\""},{"line_number":10,"context_line":"           ng-if\u003d\"!item.leaf.enum\""}],"source_content_type":"text/html","patch_set":15,"id":"ba7be1f8_5da8d4da","line":7,"updated":"2015-02-25 18:56:40.000000000","message":"I noticed here in this file we use {{ }}, while other html files using {$  $}, i know it doesn\u0027t matter since this is a static file, do you think it is an issue of inconsistency?\n\nnot a blocker.","commit_id":"9daeb26a83e3e782bd9671d2f0789a2b07d6995d"},{"author":{"_account_id":13805,"name":"Shaoquan Chen","email":"sean.chen2@hp.com","username":"SeanChen"},"change_message_id":"a9a4e40b3b7e8d253dd886a0bf198a00ce37ee82","unresolved":false,"context_lines":[{"line_number":54,"context_line":"           min\u003d\"{{ item.leaf.minimum }}\""},{"line_number":55,"context_line":"           max\u003d\"{{ item.leaf.maximum }}\""},{"line_number":56,"context_line":"           tooltip\u003d\"{{ item.description }}\"/\u003e"},{"line_number":57,"context_line":"    \u003cdiv class\u003d\"input-group-addon\" style\u003d\"width: 40%;\""},{"line_number":58,"context_line":"         ng-switch-when\u003d\"boolean\"\u003e"},{"line_number":59,"context_line":"      \u003cinput name\u003d\"property\""},{"line_number":60,"context_line":"             type\u003d\"checkbox\""}],"source_content_type":"text/html","patch_set":15,"id":"ba7be1f8_dd6684ba","line":57,"updated":"2015-02-25 18:56:40.000000000","message":"Is it possible to move this inline style to a css file?","commit_id":"9daeb26a83e3e782bd9671d2f0789a2b07d6995d"},{"author":{"_account_id":12825,"name":"Szymon Wróblewski","email":"szymon.wroblewski@ovhcloud.com","username":"bluex"},"change_message_id":"a8b7d75adf775c37b8103b14c532838f894de5f6","unresolved":false,"context_lines":[{"line_number":54,"context_line":"           min\u003d\"{{ item.leaf.minimum }}\""},{"line_number":55,"context_line":"           max\u003d\"{{ item.leaf.maximum }}\""},{"line_number":56,"context_line":"           tooltip\u003d\"{{ item.description }}\"/\u003e"},{"line_number":57,"context_line":"    \u003cdiv class\u003d\"input-group-addon\" style\u003d\"width: 40%;\""},{"line_number":58,"context_line":"         ng-switch-when\u003d\"boolean\"\u003e"},{"line_number":59,"context_line":"      \u003cinput name\u003d\"property\""},{"line_number":60,"context_line":"             type\u003d\"checkbox\""}],"source_content_type":"text/html","patch_set":15,"id":"ba7be1f8_65259609","line":57,"in_reply_to":"ba7be1f8_dd6684ba","updated":"2015-02-27 18:26:19.000000000","message":"Done","commit_id":"9daeb26a83e3e782bd9671d2f0789a2b07d6995d"}],"horizon/static/angular/metadata-tree/metadata-tree-service.js":[{"author":{"_account_id":13805,"name":"Shaoquan Chen","email":"sean.chen2@hp.com","username":"SeanChen"},"change_message_id":"3b00508adf84543691dd1190e8dcf7e80e47ac93","unresolved":false,"context_lines":[{"line_number":7,"context_line":"   * @ngdoc service"},{"line_number":8,"context_line":"   * @name hz.widget.metadata-tree.metadataTreeService"},{"line_number":9,"context_line":"   */"},{"line_number":10,"context_line":"  .factory(\u0027metadataTreeService\u0027, [function () {"},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"    /**"},{"line_number":13,"context_line":"     * Parse value into boolean"}],"source_content_type":"text/javascript","patch_set":26,"id":"9a80dd14_6f3b8aeb","line":10,"updated":"2015-03-12 06:57:57.000000000","message":"Interesting, this `metadataTreeService` is a bag containing three constructors, it is not a service, the name is misleading.\n\nAnother thing is that there is no dependencies injected, why use `factory` rather than `variable`? Why not just has three constructor function provided via `variable` method?","commit_id":"d2d81ddbb599e9ddf6d4e56478f1fd9e85a21fe7"},{"author":{"_account_id":12825,"name":"Szymon Wróblewski","email":"szymon.wroblewski@ovhcloud.com","username":"bluex"},"change_message_id":"5a583f8342a5594b3746994637eccf3d1e1a9ec3","unresolved":false,"context_lines":[{"line_number":7,"context_line":"   * @ngdoc service"},{"line_number":8,"context_line":"   * @name hz.widget.metadata-tree.metadataTreeService"},{"line_number":9,"context_line":"   */"},{"line_number":10,"context_line":"  .factory(\u0027metadataTreeService\u0027, [function () {"},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"    /**"},{"line_number":13,"context_line":"     * Parse value into boolean"}],"source_content_type":"text/javascript","patch_set":26,"id":"9a80dd14_a3c4b140","line":10,"in_reply_to":"9a80dd14_6f3b8aeb","updated":"2015-03-12 12:52:14.000000000","message":"According to Angular docs something created to organize and share code across app is called service so this name is pretty straightforward and I don\u0027t think there is anything wrong with it.\n\nI didn\u0027t use variable because it\u0027s meant to be used with simple code structures.","commit_id":"d2d81ddbb599e9ddf6d4e56478f1fd9e85a21fe7"}],"horizon/static/angular/metadata-tree/metadata-tree.html":[{"author":{"_account_id":13805,"name":"Shaoquan Chen","email":"sean.chen2@hp.com","username":"SeanChen"},"change_message_id":"3b00508adf84543691dd1190e8dcf7e80e47ac93","unresolved":false,"context_lines":[{"line_number":1,"context_line":"\u003cdiv class\u003d\"metadata-tree\"\u003e"},{"line_number":2,"context_line":"  \u003cdiv class\u003d\"row\"\u003e"},{"line_number":3,"context_line":"    \u003cp class\u003d\"col-md-12\"\u003e"},{"line_number":4,"context_line":"      \u003cspan ng-bind\u003d\"::text.help\"\u003e\u003c/span\u003e"},{"line_number":5,"context_line":"    \u003c/p\u003e"},{"line_number":6,"context_line":"  \u003c/div\u003e"}],"source_content_type":"text/html","patch_set":26,"id":"9a80dd14_0f012e06","line":3,"updated":"2015-03-12 06:57:57.000000000","message":"Why do we need response grid-layout for a line that just has \u003cp\u003e?","commit_id":"d2d81ddbb599e9ddf6d4e56478f1fd9e85a21fe7"},{"author":{"_account_id":12825,"name":"Szymon Wróblewski","email":"szymon.wroblewski@ovhcloud.com","username":"bluex"},"change_message_id":"5a583f8342a5594b3746994637eccf3d1e1a9ec3","unresolved":false,"context_lines":[{"line_number":1,"context_line":"\u003cdiv class\u003d\"metadata-tree\"\u003e"},{"line_number":2,"context_line":"  \u003cdiv class\u003d\"row\"\u003e"},{"line_number":3,"context_line":"    \u003cp class\u003d\"col-md-12\"\u003e"},{"line_number":4,"context_line":"      \u003cspan ng-bind\u003d\"::text.help\"\u003e\u003c/span\u003e"},{"line_number":5,"context_line":"    \u003c/p\u003e"},{"line_number":6,"context_line":"  \u003c/div\u003e"}],"source_content_type":"text/html","patch_set":26,"id":"9a80dd14_4ae78a12","line":3,"in_reply_to":"9a80dd14_0f012e06","updated":"2015-03-12 12:52:14.000000000","message":"I don\u0027t think there is a need for help block here at all (the same text is already displayed at the bottom). IMO it would be best to move all help to help sidebar, but this patch is logic refactor and I tried to keep layout identical to how it was before.\nBut surely layout redesign is a good topic for another patch.","commit_id":"d2d81ddbb599e9ddf6d4e56478f1fd9e85a21fe7"},{"author":{"_account_id":13805,"name":"Shaoquan Chen","email":"sean.chen2@hp.com","username":"SeanChen"},"change_message_id":"3b00508adf84543691dd1190e8dcf7e80e47ac93","unresolved":false,"context_lines":[{"line_number":70,"context_line":"            \u003c/div\u003e"},{"line_number":71,"context_line":"          \u003c/li\u003e"},{"line_number":72,"context_line":"          \u003cli class\u003d\"list-group-item disabled\""},{"line_number":73,"context_line":"              ng-show\u003d\"availableList.length \u003d\u003d 0\"\u003e"},{"line_number":74,"context_line":"            \u003cspan ng-bind\u003d\"::text.noAvailable\"\u003e\u003c/span\u003e"},{"line_number":75,"context_line":"          \u003c/li\u003e"},{"line_number":76,"context_line":"        \u003c/ul\u003e"}],"source_content_type":"text/html","patch_set":26,"id":"9a80dd14_8baa71d0","line":73,"updated":"2015-03-12 06:57:57.000000000","message":"is \u003d\u003d safe enough here?","commit_id":"d2d81ddbb599e9ddf6d4e56478f1fd9e85a21fe7"},{"author":{"_account_id":12825,"name":"Szymon Wróblewski","email":"szymon.wroblewski@ovhcloud.com","username":"bluex"},"change_message_id":"5a583f8342a5594b3746994637eccf3d1e1a9ec3","unresolved":false,"context_lines":[{"line_number":70,"context_line":"            \u003c/div\u003e"},{"line_number":71,"context_line":"          \u003c/li\u003e"},{"line_number":72,"context_line":"          \u003cli class\u003d\"list-group-item disabled\""},{"line_number":73,"context_line":"              ng-show\u003d\"availableList.length \u003d\u003d 0\"\u003e"},{"line_number":74,"context_line":"            \u003cspan ng-bind\u003d\"::text.noAvailable\"\u003e\u003c/span\u003e"},{"line_number":75,"context_line":"          \u003c/li\u003e"},{"line_number":76,"context_line":"        \u003c/ul\u003e"}],"source_content_type":"text/html","patch_set":26,"id":"9a80dd14_aaa80678","line":73,"in_reply_to":"9a80dd14_8baa71d0","updated":"2015-03-12 12:52:14.000000000","message":"Safe? Yes, length is built in variable of built in array type so it\u0027s always integer. But if you were trying to recommend usage of \u003d\u003d\u003d that surely can be done.","commit_id":"d2d81ddbb599e9ddf6d4e56478f1fd9e85a21fe7"}],"horizon/static/angular/metadata-tree/metadata-tree.js":[{"author":{"_account_id":13805,"name":"Shaoquan Chen","email":"sean.chen2@hp.com","username":"SeanChen"},"change_message_id":"a9a4e40b3b7e8d253dd886a0bf198a00ce37ee82","unresolved":false,"context_lines":[{"line_number":52,"context_line":"            $scope.filterText.available.length \u003d\u003d\u003d 0 ? item.visible : true);"},{"line_number":53,"context_line":"      };"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"      $scope.$watch(\u0027customItem.value\u0027, function () {"},{"line_number":56,"context_line":"        $scope.customItem.found \u003d [];"},{"line_number":57,"context_line":"        angular.forEach($scope.tree.flatTree, function(item) {"},{"line_number":58,"context_line":"          if(item.leaf \u0026\u0026 item.leaf.name \u003d\u003d\u003d $scope.customItem.value) {"}],"source_content_type":"text/javascript","patch_set":15,"id":"ba7be1f8_3de7a0e5","line":55,"updated":"2015-02-25 18:56:40.000000000","message":"Do you want to unwatch it just in case somehow memory is leaking?","commit_id":"9daeb26a83e3e782bd9671d2f0789a2b07d6995d"},{"author":{"_account_id":12825,"name":"Szymon Wróblewski","email":"szymon.wroblewski@ovhcloud.com","username":"bluex"},"change_message_id":"a8b7d75adf775c37b8103b14c532838f894de5f6","unresolved":false,"context_lines":[{"line_number":52,"context_line":"            $scope.filterText.available.length \u003d\u003d\u003d 0 ? item.visible : true);"},{"line_number":53,"context_line":"      };"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"      $scope.$watch(\u0027customItem.value\u0027, function () {"},{"line_number":56,"context_line":"        $scope.customItem.found \u003d [];"},{"line_number":57,"context_line":"        angular.forEach($scope.tree.flatTree, function(item) {"},{"line_number":58,"context_line":"          if(item.leaf \u0026\u0026 item.leaf.name \u003d\u003d\u003d $scope.customItem.value) {"}],"source_content_type":"text/javascript","patch_set":15,"id":"ba7be1f8_8569aa27","line":55,"in_reply_to":"ba7be1f8_3de7a0e5","updated":"2015-02-27 18:26:19.000000000","message":"Watch removed entirely","commit_id":"9daeb26a83e3e782bd9671d2f0789a2b07d6995d"},{"author":{"_account_id":13805,"name":"Shaoquan Chen","email":"sean.chen2@hp.com","username":"SeanChen"},"change_message_id":"a9a4e40b3b7e8d253dd886a0bf198a00ce37ee82","unresolved":false,"context_lines":[{"line_number":53,"context_line":"      };"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"      $scope.$watch(\u0027customItem.value\u0027, function () {"},{"line_number":56,"context_line":"        $scope.customItem.found \u003d [];"},{"line_number":57,"context_line":"        angular.forEach($scope.tree.flatTree, function(item) {"},{"line_number":58,"context_line":"          if(item.leaf \u0026\u0026 item.leaf.name \u003d\u003d\u003d $scope.customItem.value) {"},{"line_number":59,"context_line":"            this.push(item);"}],"source_content_type":"text/javascript","patch_set":15,"id":"ba7be1f8_9d75eccc","line":56,"updated":"2015-02-25 18:56:40.000000000","message":"In this faction, we have $scope.customItem repeating many times. consider have a alias to it, like this:\n\nvar customItem \u003d $scope.customItem;\n\nbenefit:\n1. customItem can be compressed, .customItem can not, so the code will be shorter.\n2) saving look-up time.","commit_id":"9daeb26a83e3e782bd9671d2f0789a2b07d6995d"},{"author":{"_account_id":13805,"name":"Shaoquan Chen","email":"sean.chen2@hp.com","username":"SeanChen"},"change_message_id":"a9a4e40b3b7e8d253dd886a0bf198a00ce37ee82","unresolved":false,"context_lines":[{"line_number":66,"context_line":"      $scope.text \u003d angular.extend({}, metadataTreeConfig.text, $scope.text);"},{"line_number":67,"context_line":"      //$scope.tree \u003d new metadataTreeService.Tree($scope.available, $scope.existing);"},{"line_number":68,"context_line":"      $scope.tree \u003d new metadataTreeService.Tree("},{"line_number":69,"context_line":"        $window.available_metadata.namespaces, $window.existing_metadata"},{"line_number":70,"context_line":"      ); // TODO(bluex): use REST endpoint"},{"line_number":71,"context_line":"      $scope.decriptionText \u003d \u0027\u0027;"},{"line_number":72,"context_line":"      $scope.customItem \u003d {"}],"source_content_type":"text/javascript","patch_set":15,"id":"ba7be1f8_7d7f5815","line":69,"updated":"2015-02-25 18:56:40.000000000","message":"$window.available_metadata is scary :) is there a nice way to pass data from python to javascript?","commit_id":"9daeb26a83e3e782bd9671d2f0789a2b07d6995d"},{"author":{"_account_id":7665,"name":"Travis Tripp","email":"os.travis.tripp@gmail.com","username":"travis.tripp"},"change_message_id":"9fbc8cf665b7d4bfa2aebee69802281072ede3f6","unresolved":false,"context_lines":[{"line_number":66,"context_line":"      $scope.text \u003d angular.extend({}, metadataTreeConfig.text, $scope.text);"},{"line_number":67,"context_line":"      //$scope.tree \u003d new metadataTreeService.Tree($scope.available, $scope.existing);"},{"line_number":68,"context_line":"      $scope.tree \u003d new metadataTreeService.Tree("},{"line_number":69,"context_line":"        $window.available_metadata.namespaces, $window.existing_metadata"},{"line_number":70,"context_line":"      ); // TODO(bluex): use REST endpoint"},{"line_number":71,"context_line":"      $scope.decriptionText \u003d \u0027\u0027;"},{"line_number":72,"context_line":"      $scope.customItem \u003d {"}],"source_content_type":"text/javascript","patch_set":15,"id":"ba7be1f8_af4d1dc6","line":69,"updated":"2015-02-25 16:57:17.000000000","message":"I think these should come in via a directive attribute on hz-metadata-tree","commit_id":"9daeb26a83e3e782bd9671d2f0789a2b07d6995d"},{"author":{"_account_id":12825,"name":"Szymon Wróblewski","email":"szymon.wroblewski@ovhcloud.com","username":"bluex"},"change_message_id":"a8b7d75adf775c37b8103b14c532838f894de5f6","unresolved":false,"context_lines":[{"line_number":66,"context_line":"      $scope.text \u003d angular.extend({}, metadataTreeConfig.text, $scope.text);"},{"line_number":67,"context_line":"      //$scope.tree \u003d new metadataTreeService.Tree($scope.available, $scope.existing);"},{"line_number":68,"context_line":"      $scope.tree \u003d new metadataTreeService.Tree("},{"line_number":69,"context_line":"        $window.available_metadata.namespaces, $window.existing_metadata"},{"line_number":70,"context_line":"      ); // TODO(bluex): use REST endpoint"},{"line_number":71,"context_line":"      $scope.decriptionText \u003d \u0027\u0027;"},{"line_number":72,"context_line":"      $scope.customItem \u003d {"}],"source_content_type":"text/javascript","patch_set":15,"id":"ba7be1f8_f025c2ae","line":69,"in_reply_to":"ba7be1f8_7d7f5815","updated":"2015-02-27 18:26:19.000000000","message":"Yeah, it was due to legacy code. Removed it.","commit_id":"9daeb26a83e3e782bd9671d2f0789a2b07d6995d"},{"author":{"_account_id":7665,"name":"Travis Tripp","email":"os.travis.tripp@gmail.com","username":"travis.tripp"},"change_message_id":"9fbc8cf665b7d4bfa2aebee69802281072ede3f6","unresolved":false,"context_lines":[{"line_number":110,"context_line":"    function ($scope, $filter) {"},{"line_number":111,"context_line":"      var filter \u003d $filter(\u0027filter\u0027);"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"      $scope.saveMetadata \u003d function () {"},{"line_number":114,"context_line":"        var metadata \u003d [];"},{"line_number":115,"context_line":"        var added \u003d filter($scope.tree.flatTree, {\u0027added\u0027: true, \u0027leaf\u0027: \u0027!null\u0027});"},{"line_number":116,"context_line":"        angular.forEach(added, function(item) {"}],"source_content_type":"text/javascript","patch_set":15,"id":"ba7be1f8_8f005935","line":113,"updated":"2015-02-25 16:57:17.000000000","message":"should this also be a function passed in via a directive attribute?","commit_id":"9daeb26a83e3e782bd9671d2f0789a2b07d6995d"},{"author":{"_account_id":13805,"name":"Shaoquan Chen","email":"sean.chen2@hp.com","username":"SeanChen"},"change_message_id":"a9a4e40b3b7e8d253dd886a0bf198a00ce37ee82","unresolved":false,"context_lines":[{"line_number":113,"context_line":"      $scope.saveMetadata \u003d function () {"},{"line_number":114,"context_line":"        var metadata \u003d [];"},{"line_number":115,"context_line":"        var added \u003d filter($scope.tree.flatTree, {\u0027added\u0027: true, \u0027leaf\u0027: \u0027!null\u0027});"},{"line_number":116,"context_line":"        angular.forEach(added, function(item) {"},{"line_number":117,"context_line":"          metadata.push({"},{"line_number":118,"context_line":"            key: item.leaf.name,"},{"line_number":119,"context_line":"            value: item.getLeafValue()"}],"source_content_type":"text/javascript","patch_set":15,"id":"ba7be1f8_0003530e","line":116,"updated":"2015-02-25 18:56:40.000000000","message":"Array.prototype has a #map method that can do the samething with better performance.","commit_id":"9daeb26a83e3e782bd9671d2f0789a2b07d6995d"}],"horizon/static/horizon/js/angular/controllers/metadata-widget-controller.js":[{"author":{"_account_id":7665,"name":"Travis Tripp","email":"os.travis.tripp@gmail.com","username":"travis.tripp"},"change_message_id":"423f73d42c7155a90fcfa4dbc4792736089c5a9c","unresolved":false,"context_lines":[{"line_number":1,"context_line":"(function () {"},{"line_number":2,"context_line":"  \u0027use strict\u0027;"},{"line_number":3,"context_line":"  horizonApp.controller(\u0027hzMetadataWidgetCtrl\u0027, [\u0027$scope\u0027, \u0027$window\u0027, \u0027$filter\u0027, function ($scope, $window, $filter) {"},{"line_number":4,"context_line":"    var _ \u003d $window.gettext;"},{"line_number":5,"context_line":""},{"line_number":6,"context_line":"    //// Customizable text for template ////"},{"line_number":7,"context_line":""}],"source_content_type":"text/javascript","patch_set":2,"id":"3a961159_48b77585","line":4,"updated":"2015-01-15 00:08:48.000000000","message":"What is the standard here?  When I look at Thai\u0027s patch he just directly uses gettext everywhere:\n\nhttps://review.openstack.org/#/c/133767/25/horizon/static/horizon/js/angular/dashboards/hz.identity.users.js","commit_id":"82acfe882d7c2002f59e91ec329a189908c46ba8"},{"author":{"_account_id":12825,"name":"Szymon Wróblewski","email":"szymon.wroblewski@ovhcloud.com","username":"bluex"},"change_message_id":"3647698b42d9ca83a3331193c1e7aa9f44686337","unresolved":false,"context_lines":[{"line_number":1,"context_line":"(function () {"},{"line_number":2,"context_line":"  \u0027use strict\u0027;"},{"line_number":3,"context_line":"  horizonApp.controller(\u0027hzMetadataWidgetCtrl\u0027, [\u0027$scope\u0027, \u0027$window\u0027, \u0027$filter\u0027, function ($scope, $window, $filter) {"},{"line_number":4,"context_line":"    var _ \u003d $window.gettext;"},{"line_number":5,"context_line":""},{"line_number":6,"context_line":"    //// Customizable text for template ////"},{"line_number":7,"context_line":""}],"source_content_type":"text/javascript","patch_set":2,"id":"da86d52c_894ad925","line":4,"in_reply_to":"3a961159_3ab081db","updated":"2015-01-30 19:29:35.000000000","message":"Thanks, changed this to gettext.","commit_id":"82acfe882d7c2002f59e91ec329a189908c46ba8"},{"author":{"_account_id":9576,"name":"Thai Tran","email":"tqtran@us.ibm.com","username":"tqtran"},"change_message_id":"7d1aa41132a2d14e6b2e3a7c712a8f4b83ea3e89","unresolved":false,"context_lines":[{"line_number":1,"context_line":"(function () {"},{"line_number":2,"context_line":"  \u0027use strict\u0027;"},{"line_number":3,"context_line":"  horizonApp.controller(\u0027hzMetadataWidgetCtrl\u0027, [\u0027$scope\u0027, \u0027$window\u0027, \u0027$filter\u0027, function ($scope, $window, $filter) {"},{"line_number":4,"context_line":"    var _ \u003d $window.gettext;"},{"line_number":5,"context_line":""},{"line_number":6,"context_line":"    //// Customizable text for template ////"},{"line_number":7,"context_line":""}],"source_content_type":"text/javascript","patch_set":2,"id":"3a961159_f55ab51c","line":4,"in_reply_to":"3a961159_48b77585","updated":"2015-01-15 00:56:50.000000000","message":"I asked Doug to weigh in on this and he gave me some useful feedback. While it\u0027s fine for us to rename the gettext function and get it to work correctly in javascript, the nls parser is looking for something more specific. The parser is basically looking for anything enclose in gettext() in javascript files to generate those PO files. I\u0027m not sure that it will look for _ as well. This is something we\u0027ll have to test first.","commit_id":"82acfe882d7c2002f59e91ec329a189908c46ba8"},{"author":{"_account_id":9981,"name":"Doug Fish","email":"drfish@us.ibm.com","username":"doug-fish"},"change_message_id":"da5943b677bc252029db84d4bebdb1f8a22407a7","unresolved":false,"context_lines":[{"line_number":1,"context_line":"(function () {"},{"line_number":2,"context_line":"  \u0027use strict\u0027;"},{"line_number":3,"context_line":"  horizonApp.controller(\u0027hzMetadataWidgetCtrl\u0027, [\u0027$scope\u0027, \u0027$window\u0027, \u0027$filter\u0027, function ($scope, $window, $filter) {"},{"line_number":4,"context_line":"    var _ \u003d $window.gettext;"},{"line_number":5,"context_line":""},{"line_number":6,"context_line":"    //// Customizable text for template ////"},{"line_number":7,"context_line":""}],"source_content_type":"text/javascript","patch_set":2,"id":"3a961159_3ab081db","line":4,"in_reply_to":"3a961159_f55ab51c","updated":"2015-01-15 22:43:22.000000000","message":"Doing some experiments on this code, it turns out our translation tools don\u0027t understand either\nvar _ \u003d $window.gettext;\n_(\"translatable text\")\nor even\n$window.gettext(\"translatable text\")\nas actually having translatable text.  Only\ngettext(\"translatable text\")\ngets recognized by the tools and included in the po file when\n./run_tests --makemessages is called.\n\nYou can inspect the po file directly, but to me it\u0027s easier to use the pseudo translation tool I have out for review, then just run the code in the fake-translated language.\nhttps://review.openstack.org/#/c/142239/\n\nI understand that Babel (which I assume we are using indirectly) includes some capability to specify which functions should be recognized as translatable, but I\u0027m not familiar with how to do it in Babel, let alone how to specify through Django.","commit_id":"82acfe882d7c2002f59e91ec329a189908c46ba8"}]}
