)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":10526,"name":"Catherine Diep","email":"cdiep@us.ibm.com","username":"cdiep"},"change_message_id":"82cc9fe1104230c734f750981d18eb51d011cc0e","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"added: migrations, models, simple db api, tests for db api"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Addresses-Spec: https://review.openstack.org/#/c/268922/"},{"line_number":12,"context_line":"Change-Id: Ie02c2f160db195fb0e793b6bd9284f2bb006ecbd"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"7a5de9d1_21ff67ab","line":11,"range":{"start_line":11,"start_character":16,"end_line":11,"end_character":56},"updated":"2016-01-29 20:32:00.000000000","message":"Thank you!","commit_id":"ba470eee679e2b42ec5e113c2c8300de18ff2f01"}],"refstack/api/constants.py":[{"author":{"_account_id":10526,"name":"Catherine Diep","email":"cdiep@us.ibm.com","username":"cdiep"},"change_message_id":"a708eb762c730eaaf8ff30795a4ec9b526cf4b86","unresolved":false,"context_lines":[{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    FOUNDATION \u003d 0"},{"line_number":57,"context_line":"    PRIVATE_VENDOR \u003d 1"},{"line_number":58,"context_line":"    PENDING_VENDOR \u003d 2"},{"line_number":59,"context_line":"    OFFICIAL_VENDOR \u003d 3"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"7a5de9d1_b33838d4","line":58,"range":{"start_line":58,"start_character":2,"end_line":58,"end_character":22},"updated":"2016-02-02 00:30:55.000000000","message":"We also need to check with DefCore on this.","commit_id":"30a354a2f54b2c8e61445394c1d4b733a633be7e"},{"author":{"_account_id":10526,"name":"Catherine Diep","email":"cdiep@us.ibm.com","username":"cdiep"},"change_message_id":"a708eb762c730eaaf8ff30795a4ec9b526cf4b86","unresolved":false,"context_lines":[{"line_number":63,"context_line":"class ProductType(object):"},{"line_number":64,"context_line":"    \"\"\"Product Type enum.\"\"\""},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    CLOUD \u003d 0"},{"line_number":67,"context_line":"    SOFTWARE \u003d 1"}],"source_content_type":"text/x-python","patch_set":18,"id":"7a5de9d1_33052810","line":67,"range":{"start_line":66,"start_character":0,"end_line":67,"end_character":16},"updated":"2016-02-02 00:30:55.000000000","message":"As discussed in the IRC meeting, we will need to check with DefCore whether other types such as distro etc needed to be defined here.","commit_id":"30a354a2f54b2c8e61445394c1d4b733a633be7e"},{"author":{"_account_id":10526,"name":"Catherine Diep","email":"cdiep@us.ibm.com","username":"cdiep"},"change_message_id":"ef2ca4e9da8dd1751dea42daf6bc843c6575696e","unresolved":false,"context_lines":[{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    FOUNDATION \u003d 0"},{"line_number":57,"context_line":"    PRIVATE_VENDOR \u003d 1"},{"line_number":58,"context_line":"    PENDING_VENDOR \u003d 2"},{"line_number":59,"context_line":"    OFFICIAL_VENDOR \u003d 3"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"5a5ae5dd_ce734514","line":58,"range":{"start_line":58,"start_character":4,"end_line":58,"end_character":22},"updated":"2016-02-04 20:31:27.000000000","message":"Per DefCore guidance (requirement) made on 2016-02-03 (http://eavesdrop.openstack.org/meetings/defcore/2016/defcore.2016-02-03-15.59.txt )\n\nRefStack should use self-registration for vendors with     verification performed by the Foundation.\n\nAs such, I agree that PENDING_VENDOR should be included here.","commit_id":"e607cdd9e2b1842ed5f67b9c2d007bf76e1e7ed7"},{"author":{"_account_id":10526,"name":"Catherine Diep","email":"cdiep@us.ibm.com","username":"cdiep"},"change_message_id":"5a6c9dc99395280c5beab3b964cd964998e75331","unresolved":false,"context_lines":[{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    FOUNDATION \u003d 0"},{"line_number":57,"context_line":"    PRIVATE_VENDOR \u003d 1"},{"line_number":58,"context_line":"    PENDING_VENDOR \u003d 2"},{"line_number":59,"context_line":"    OFFICIAL_VENDOR \u003d 3"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"5a5ae5dd_97823d93","line":58,"range":{"start_line":58,"start_character":4,"end_line":58,"end_character":22},"in_reply_to":"5a5ae5dd_ce734514","updated":"2016-02-06 00:30:27.000000000","message":"Please add comments to describe what is a PRIVATE_VENDOR. How is it different from a PENDING_VENDOR?","commit_id":"e607cdd9e2b1842ed5f67b9c2d007bf76e1e7ed7"},{"author":{"_account_id":10526,"name":"Catherine Diep","email":"cdiep@us.ibm.com","username":"cdiep"},"change_message_id":"ef2ca4e9da8dd1751dea42daf6bc843c6575696e","unresolved":false,"context_lines":[{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    PUBLIC_CLOUD \u003d 0"},{"line_number":67,"context_line":"    PRIVATE_CLOUD \u003d 1"},{"line_number":68,"context_line":"    SOFTWARE \u003d 2"}],"source_content_type":"text/x-python","patch_set":22,"id":"5a5ae5dd_cee34532","line":68,"range":{"start_line":68,"start_character":15,"end_line":68,"end_character":16},"updated":"2016-02-04 20:31:27.000000000","message":"Per DefCore guidance (requirement) made on 2016-02-03 (http://eavesdrop.openstack.org/meetings/defcore/2016/defcore.2016-02-03-15.59.txt )\n\nProduct product type should include the products defined in the OpenStack Marketplace.  The product types defined in the marketplace are:\n\n- public_cloud\n- hosted_private_cloud\n- distro","commit_id":"e607cdd9e2b1842ed5f67b9c2d007bf76e1e7ed7"},{"author":{"_account_id":9312,"name":"Alexandre Levine","email":"alexandrelevine@gmail.com","username":"alevine"},"change_message_id":"b3d2a046ee2f5f6fe8a85458c005ac2ff66053ce","unresolved":false,"context_lines":[{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    PUBLIC_CLOUD \u003d 0"},{"line_number":67,"context_line":"    PRIVATE_CLOUD \u003d 1"},{"line_number":68,"context_line":"    SOFTWARE \u003d 2"}],"source_content_type":"text/x-python","patch_set":22,"id":"5a5ae5dd_f0e49fe0","line":68,"range":{"start_line":68,"start_character":15,"end_line":68,"end_character":16},"in_reply_to":"5a5ae5dd_05d7c94b","updated":"2016-02-06 07:08:16.000000000","message":"Great suggestions.\nMaybe we should differentiate distro and appliance, though, what do you think? I guess those might be considered two different types in the Marketplace, they just happen to be in one tab now. Shouldn\u0027t we ask DefCore for exact list of types they want us to provide?\nIn any case, distro_and_appliance seems a little cumbersome and non-modifiable if in the future we\u0027d still want to differentiate. So let\u0027s stick with distro if DefCore doesn\u0027t care about separate appliances now.","commit_id":"e607cdd9e2b1842ed5f67b9c2d007bf76e1e7ed7"},{"author":{"_account_id":9312,"name":"Alexandre Levine","email":"alexandrelevine@gmail.com","username":"alevine"},"change_message_id":"beb16098155cc98e634b8f18d08b96ad1f43dcfd","unresolved":false,"context_lines":[{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    PUBLIC_CLOUD \u003d 0"},{"line_number":67,"context_line":"    PRIVATE_CLOUD \u003d 1"},{"line_number":68,"context_line":"    SOFTWARE \u003d 2"}],"source_content_type":"text/x-python","patch_set":22,"id":"5a5ae5dd_fb8837c7","line":68,"range":{"start_line":68,"start_character":15,"end_line":68,"end_character":16},"in_reply_to":"5a5ae5dd_cee34532","updated":"2016-02-05 02:37:49.000000000","message":"In the Market place there is no just \"distro\"s. There is \"Distros \u0026 Appliances\".\n\nI updated the use-cases 18 and 21 in the doc accordingly.\nHowever, I have a question - now that we allow external Vendors to test their software would that be limited to \u0027distros \u0026 appliances\u0027? As I understand these terms are limited to particular meaning in OpenStack. Namely, they mean OpenStack based software or hardware solution. However we\u0027ll be allowing to test also OpenStack-related software, the one which is working on top of the OpenStack. And not necessarily is \u0027distro\u0027. Moreover, it means that we\u0027re not limited by OpenStack marketplace only.\n\nMy second thinking is that this particular \u0027type\u0027 reflects the Object Model, not the Marketplace potential and expandable multitude of types. In the object model there are two kinds of the Products: Software and Cloud.\nThose are two major classes of products which rules very different patterns of handling in all of our UI and engine logic and interfaces.\nThe difference between hosted_private_cloud and public_cloud in turn is cosmetic for us. We just store customer\u0027s choice and display it as a checkbox or radiobutton - that\u0027s all.\nIt means that if we do select of all clouds to show in our cloud tab, we do not have to use complext \u0027and\u0027 or \u0027in\u0027 clauses in the \u0027select\u0027. We can do \u0027not software\u0027 (or not distro) however it\u0027s not modifiable because if we add any other kind of software later the code\u0027ll break. \n\nAs such I suggest to differentiate storage of Object Model types which are primary for our logic and information about external marketplace types which are secondary in terms of the code.\n\nPlease advise naming for those different fields in the DB and placement? I suggest to use \u0027type\u0027 the same way we use it in the other tables - to store type in the Object Model, i.e. \u0027software\u0027 and \u0027cloud\u0027. And use marketplace_type to store \u0027distro\u0027, \u0027hosted_private_cloud\u0027, \u0027public_cloud\u0027 and whatever appears later.","commit_id":"e607cdd9e2b1842ed5f67b9c2d007bf76e1e7ed7"},{"author":{"_account_id":10526,"name":"Catherine Diep","email":"cdiep@us.ibm.com","username":"cdiep"},"change_message_id":"5a6c9dc99395280c5beab3b964cd964998e75331","unresolved":false,"context_lines":[{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    PUBLIC_CLOUD \u003d 0"},{"line_number":67,"context_line":"    PRIVATE_CLOUD \u003d 1"},{"line_number":68,"context_line":"    SOFTWARE \u003d 2"}],"source_content_type":"text/x-python","patch_set":22,"id":"5a5ae5dd_05d7c94b","line":68,"range":{"start_line":68,"start_character":15,"end_line":68,"end_character":16},"in_reply_to":"5a5ae5dd_fb8837c7","updated":"2016-02-06 00:30:27.000000000","message":"No problem.  We can use distro_and_appliance as one of the type.\n\nI disagree that the difference between hosted_private_cloud and public_cloud in turn is cosmetic for us.  The major difference is public_cloud has a public accessible URL while a hosted_private_cloud may not.\n\nIf we are going to add a field to separate the types, we have the following options:\n\nOption 1:\n  * type \u003d [software, cloud]\n  * product_type \u003d [public_cloud, hosted_public_cloud, ...]\n\nOption 2:\n  * object_type \u003d [software, cloud]\n  * type \u003d [public_cloud, hosted_public_cloud, ...]\n\nOption 3:\n  * object_type \u003d [software, cloud]\n  * product_type \u003d [public_cloud, hosted_public_cloud, ...]\n\nI will put this on Monday IRC meeting agenda for discussion.","commit_id":"e607cdd9e2b1842ed5f67b9c2d007bf76e1e7ed7"},{"author":{"_account_id":9377,"name":"Sergey Slipushenko","email":"slipushenko@gmail.com","username":"sslypushenko"},"change_message_id":"46315f20da201c400aa84834984a4fe446e95a03","unresolved":false,"context_lines":[{"line_number":49,"context_line":"ROLE_OWNER \u003d \u0027owner\u0027"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"class OrganizationType(object):"},{"line_number":53,"context_line":"    \"\"\"Organization Type enum.\"\"\""},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    # OpenStack Foundation"}],"source_content_type":"text/x-python","patch_set":27,"id":"3a57f1b5_1cf51782","line":52,"range":{"start_line":52,"start_character":6,"end_line":52,"end_character":22},"updated":"2016-02-11 14:26:50.000000000","message":"Please be consistent with existed code. I don\u0027t get a point why we need such kind of grouping. Just \nFOUNDATION \u003d 0\nwill work for me. Lets left grouping for future refactoring whole constants.py","commit_id":"49a43d237ce29470299bf825a089a0d71a7ce7cc"}],"refstack/db/api.py":[{"author":{"_account_id":17700,"name":"David Liu","email":"david.liu@cn.ibm.com","username":"lzbj"},"change_message_id":"c8500bb87b952c78736c60d0ed3caebbb66996d9","unresolved":false,"context_lines":[{"line_number":203,"context_line":""},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"def delete_product(product_id):"},{"line_number":206,"context_line":"    \"\"\"delete product.\"\"\""},{"line_number":207,"context_line":"    return IMPL.delete_product(product_id)"}],"source_content_type":"text/x-python","patch_set":13,"id":"9a68dd71_de024eb4","line":206,"updated":"2016-01-27 02:38:41.000000000","message":"For the comments, can we give a little more info here?\nLike the comments above, the param description, exceptions\nthrown etc?","commit_id":"80437992c10ad52a6845539360ad84f3f1409490"}],"refstack/db/migrations/alembic/versions/19fded785b8c_create_organization_table.py":[{"author":{"_account_id":10526,"name":"Catherine Diep","email":"cdiep@us.ibm.com","username":"cdiep"},"change_message_id":"76dbba6adc06f1f02f9d70c37c26a70b7200a3bd","unresolved":false,"context_lines":[{"line_number":29,"context_line":"        sa.Column(\u0027description\u0027, sa.Text()),"},{"line_number":30,"context_line":"        sa.Column(\u0027group_id\u0027, sa.Integer(), nullable\u003dFalse),"},{"line_number":31,"context_line":"        sa.Column(\u0027creator_id\u0027, sa.Integer(), nullable\u003dFalse),"},{"line_number":32,"context_line":"        sa.Column(\u0027approved\u0027, sa.Boolean(), nullable\u003dFalse),"},{"line_number":33,"context_line":"        sa.PrimaryKeyConstraint(\u0027id\u0027),"},{"line_number":34,"context_line":"        sa.ForeignKeyConstraint([\u0027group_id\u0027], [\u0027group.id\u0027], ),"},{"line_number":35,"context_line":"        sa.ForeignKeyConstraint([\u0027creator_id\u0027], [\u0027user._id\u0027], ),"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba63e191_62c41a92","line":32,"range":{"start_line":32,"start_character":58,"end_line":32,"end_character":60},"updated":"2016-01-18 18:42:07.000000000","message":"What is the \u0027approved\u0027 column used for?","commit_id":"97296347cb8756a0996059e2ee70cb52c7e3133f"},{"author":{"_account_id":10526,"name":"Catherine Diep","email":"cdiep@us.ibm.com","username":"cdiep"},"change_message_id":"c2cf8067507339af8ab94ab9ae0906dc9237020e","unresolved":false,"context_lines":[{"line_number":29,"context_line":"        sa.Column(\u0027description\u0027, sa.Text()),"},{"line_number":30,"context_line":"        sa.Column(\u0027group_id\u0027, sa.Integer(), nullable\u003dFalse),"},{"line_number":31,"context_line":"        sa.Column(\u0027creator_id\u0027, sa.Integer(), nullable\u003dFalse),"},{"line_number":32,"context_line":"        sa.Column(\u0027approved\u0027, sa.Boolean(), nullable\u003dFalse),"},{"line_number":33,"context_line":"        sa.PrimaryKeyConstraint(\u0027id\u0027),"},{"line_number":34,"context_line":"        sa.ForeignKeyConstraint([\u0027group_id\u0027], [\u0027group.id\u0027], ),"},{"line_number":35,"context_line":"        sa.ForeignKeyConstraint([\u0027creator_id\u0027], [\u0027user._id\u0027], ),"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba63e191_4aed2f24","line":32,"range":{"start_line":32,"start_character":58,"end_line":32,"end_character":60},"in_reply_to":"ba63e191_22aaa21a","updated":"2016-01-19 17:46:00.000000000","message":"We do not allow creation of vendor (organization)by users. The only vendors that will be created are the hidden_vendor when a user creates a product without vendor association.  I do not see that we need this column.","commit_id":"97296347cb8756a0996059e2ee70cb52c7e3133f"},{"author":{"_account_id":10234,"name":"Andrey Pavlov","email":"andrey.mp@gmail.com","username":"andrey-mp"},"change_message_id":"351e2bba001be5531ac4345c50f2780db0b259b6","unresolved":false,"context_lines":[{"line_number":29,"context_line":"        sa.Column(\u0027description\u0027, sa.Text()),"},{"line_number":30,"context_line":"        sa.Column(\u0027group_id\u0027, sa.Integer(), nullable\u003dFalse),"},{"line_number":31,"context_line":"        sa.Column(\u0027creator_id\u0027, sa.Integer(), nullable\u003dFalse),"},{"line_number":32,"context_line":"        sa.Column(\u0027approved\u0027, sa.Boolean(), nullable\u003dFalse),"},{"line_number":33,"context_line":"        sa.PrimaryKeyConstraint(\u0027id\u0027),"},{"line_number":34,"context_line":"        sa.ForeignKeyConstraint([\u0027group_id\u0027], [\u0027group.id\u0027], ),"},{"line_number":35,"context_line":"        sa.ForeignKeyConstraint([\u0027creator_id\u0027], [\u0027user._id\u0027], ),"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba63e191_a5de5c6b","line":32,"range":{"start_line":32,"start_character":58,"end_line":32,"end_character":60},"in_reply_to":"ba63e191_4aed2f24","updated":"2016-01-19 18:00:13.000000000","message":"But who will create vendors?\nI though that user will create vendor and submit application (scenario 10).\nAlso, I thought that user can create product only with link to product - own or not, approved or not...","commit_id":"97296347cb8756a0996059e2ee70cb52c7e3133f"},{"author":{"_account_id":9312,"name":"Alexandre Levine","email":"alexandrelevine@gmail.com","username":"alevine"},"change_message_id":"fa1c8b6b988340708018e56441388e335a59ee98","unresolved":false,"context_lines":[{"line_number":29,"context_line":"        sa.Column(\u0027description\u0027, sa.Text()),"},{"line_number":30,"context_line":"        sa.Column(\u0027group_id\u0027, sa.Integer(), nullable\u003dFalse),"},{"line_number":31,"context_line":"        sa.Column(\u0027creator_id\u0027, sa.Integer(), nullable\u003dFalse),"},{"line_number":32,"context_line":"        sa.Column(\u0027approved\u0027, sa.Boolean(), nullable\u003dFalse),"},{"line_number":33,"context_line":"        sa.PrimaryKeyConstraint(\u0027id\u0027),"},{"line_number":34,"context_line":"        sa.ForeignKeyConstraint([\u0027group_id\u0027], [\u0027group.id\u0027], ),"},{"line_number":35,"context_line":"        sa.ForeignKeyConstraint([\u0027creator_id\u0027], [\u0027user._id\u0027], ),"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba63e191_6a4fd3bd","line":32,"range":{"start_line":32,"start_character":58,"end_line":32,"end_character":60},"in_reply_to":"ba63e191_4aed2f24","updated":"2016-01-19 18:01:33.000000000","message":"That\u0027s exactly the hidden vendor flag but vice versa - official vendors will marked as approved\u003dTrue.\n\nI guess we can name it \"type\" and use enum in Business Logic in whichever way we want.","commit_id":"97296347cb8756a0996059e2ee70cb52c7e3133f"},{"author":{"_account_id":10234,"name":"Andrey Pavlov","email":"andrey.mp@gmail.com","username":"andrey-mp"},"change_message_id":"0012d1622a1de30fedabc31e6c7aaf1e58320545","unresolved":false,"context_lines":[{"line_number":29,"context_line":"        sa.Column(\u0027description\u0027, sa.Text()),"},{"line_number":30,"context_line":"        sa.Column(\u0027group_id\u0027, sa.Integer(), nullable\u003dFalse),"},{"line_number":31,"context_line":"        sa.Column(\u0027creator_id\u0027, sa.Integer(), nullable\u003dFalse),"},{"line_number":32,"context_line":"        sa.Column(\u0027approved\u0027, sa.Boolean(), nullable\u003dFalse),"},{"line_number":33,"context_line":"        sa.PrimaryKeyConstraint(\u0027id\u0027),"},{"line_number":34,"context_line":"        sa.ForeignKeyConstraint([\u0027group_id\u0027], [\u0027group.id\u0027], ),"},{"line_number":35,"context_line":"        sa.ForeignKeyConstraint([\u0027creator_id\u0027], [\u0027user._id\u0027], ),"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba63e191_22aaa21a","line":32,"range":{"start_line":32,"start_character":58,"end_line":32,"end_character":60},"in_reply_to":"ba63e191_62c41a92","updated":"2016-01-18 18:57:06.000000000","message":"initially user can create vendor/cloud operator but they don\u0027t approved by foundation as official. and behavior of such organization is different.","commit_id":"97296347cb8756a0996059e2ee70cb52c7e3133f"},{"author":{"_account_id":10526,"name":"Catherine Diep","email":"cdiep@us.ibm.com","username":"cdiep"},"change_message_id":"82cc9fe1104230c734f750981d18eb51d011cc0e","unresolved":false,"context_lines":[{"line_number":31,"context_line":"        sa.Column(\u0027created_by_user\u0027, sa.String(128), nullable\u003dFalse),"},{"line_number":32,"context_line":"        sa.PrimaryKeyConstraint(\u0027id\u0027),"},{"line_number":33,"context_line":"        sa.ForeignKeyConstraint([\u0027group_id\u0027], [\u0027group.id\u0027], ),"},{"line_number":34,"context_line":"        sa.ForeignKeyConstraint([\u0027created_by_user\u0027], [\u0027user.openid\u0027], ),"},{"line_number":35,"context_line":"        mysql_charset\u003dMYSQL_CHARSET"},{"line_number":36,"context_line":"    )"},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"7a5de9d1_e1d70f49","line":34,"range":{"start_line":34,"start_character":11,"end_line":34,"end_character":30},"updated":"2016-01-29 20:32:00.000000000","message":"In general, a foreign key would be created to support:\n1) Data integrity 2) Index (optimize for join table performance).\n\nIn our case, the created_by_user field is mostly for auditing purpose.\n\nThe admins for the organization are the users in the group.  So from the data integrity aspect, it is not really important for the organization record to be constraint by whether the user referenced in the created_by_user field is deleted or this user should not be deleted in the users table if it is referenced in the organization table.\n\nFrom the index point of view, we would rarely search for all the organizations created by a particular user.  So the case for joining tables for this field is minimum.\n\nSince we do not expect our database to be high volume, the impact would be minimum whether the created_by_user is FK or not.\n\nAs said, I do not mind that this field being set as FK in this table.","commit_id":"ba470eee679e2b42ec5e113c2c8300de18ff2f01"},{"author":{"_account_id":10526,"name":"Catherine Diep","email":"cdiep@us.ibm.com","username":"cdiep"},"change_message_id":"ef2ca4e9da8dd1751dea42daf6bc843c6575696e","unresolved":false,"context_lines":[{"line_number":29,"context_line":"        sa.Column(\u0027description\u0027, sa.Text()),"},{"line_number":30,"context_line":"        sa.Column(\u0027group_id\u0027, sa.String(36), nullable\u003dFalse),"},{"line_number":31,"context_line":"        sa.Column(\u0027created_by_user\u0027, sa.String(128), nullable\u003dFalse),"},{"line_number":32,"context_line":"        sa.Column(\u0027properties\u0027, sa.Text()),"},{"line_number":33,"context_line":"        sa.PrimaryKeyConstraint(\u0027id\u0027),"},{"line_number":34,"context_line":"        sa.ForeignKeyConstraint([\u0027group_id\u0027], [\u0027group.id\u0027], ),"},{"line_number":35,"context_line":"        sa.ForeignKeyConstraint([\u0027created_by_user\u0027], [\u0027user.openid\u0027], ),"}],"source_content_type":"text/x-python","patch_set":22,"id":"5a5ae5dd_d98c7181","line":32,"range":{"start_line":32,"start_character":39,"end_line":32,"end_character":43},"updated":"2016-02-04 20:31:27.000000000","message":"what will be saved in this column?  The data model does not include this column.","commit_id":"e607cdd9e2b1842ed5f67b9c2d007bf76e1e7ed7"},{"author":{"_account_id":9312,"name":"Alexandre Levine","email":"alexandrelevine@gmail.com","username":"alevine"},"change_message_id":"beb16098155cc98e634b8f18d08b96ad1f43dcfd","unresolved":false,"context_lines":[{"line_number":29,"context_line":"        sa.Column(\u0027description\u0027, sa.Text()),"},{"line_number":30,"context_line":"        sa.Column(\u0027group_id\u0027, sa.String(36), nullable\u003dFalse),"},{"line_number":31,"context_line":"        sa.Column(\u0027created_by_user\u0027, sa.String(128), nullable\u003dFalse),"},{"line_number":32,"context_line":"        sa.Column(\u0027properties\u0027, sa.Text()),"},{"line_number":33,"context_line":"        sa.PrimaryKeyConstraint(\u0027id\u0027),"},{"line_number":34,"context_line":"        sa.ForeignKeyConstraint([\u0027group_id\u0027], [\u0027group.id\u0027], ),"},{"line_number":35,"context_line":"        sa.ForeignKeyConstraint([\u0027created_by_user\u0027], [\u0027user.openid\u0027], ),"}],"source_content_type":"text/x-python","patch_set":22,"id":"5a5ae5dd_3b5b2ff8","line":32,"range":{"start_line":32,"start_character":39,"end_line":32,"end_character":43},"in_reply_to":"5a5ae5dd_d98c7181","updated":"2016-02-05 02:37:49.000000000","message":"During Vendor self-registration and later during Foundation admin approval some of the info about the Vendor would be entered - you can take a look in the Marketplace. It\u0027ll include \"About\", \"Commitment\", \"Details\" and whatever other stuff. We\u0027ll need to figure out exactly the set of such information to create corresponding UI fields.\nThis will be stored in the properties.","commit_id":"e607cdd9e2b1842ed5f67b9c2d007bf76e1e7ed7"}],"refstack/db/migrations/alembic/versions/7092392cbb8e_create_product_table.py":[{"author":{"_account_id":10526,"name":"Catherine Diep","email":"cdiep@us.ibm.com","username":"cdiep"},"change_message_id":"76dbba6adc06f1f02f9d70c37c26a70b7200a3bd","unresolved":false,"context_lines":[{"line_number":26,"context_line":"        # internal DB id"},{"line_number":27,"context_line":"        sa.Column(\u0027id\u0027, sa.Integer(), nullable\u003dFalse),"},{"line_number":28,"context_line":"        # external id: cloud id or software id"},{"line_number":29,"context_line":"        sa.Column(\u0027product_id\u0027, sa.String(length\u003d512), nullable\u003dFalse),"},{"line_number":30,"context_line":"        sa.Column(\u0027name\u0027, sa.String(length\u003d80), nullable\u003dFalse),"},{"line_number":31,"context_line":"        sa.Column(\u0027description\u0027, sa.Text()),"},{"line_number":32,"context_line":"        sa.Column(\u0027organization_id\u0027, sa.Integer(), nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba63e191_229f0261","line":29,"range":{"start_line":29,"start_character":69,"end_line":29,"end_character":71},"updated":"2016-01-18 18:42:07.000000000","message":"What is \u0027product_id\u0027?  How is it different from \u0027id\u0027?","commit_id":"97296347cb8756a0996059e2ee70cb52c7e3133f"},{"author":{"_account_id":10234,"name":"Andrey Pavlov","email":"andrey.mp@gmail.com","username":"andrey-mp"},"change_message_id":"0012d1622a1de30fedabc31e6c7aaf1e58320545","unresolved":false,"context_lines":[{"line_number":26,"context_line":"        # internal DB id"},{"line_number":27,"context_line":"        sa.Column(\u0027id\u0027, sa.Integer(), nullable\u003dFalse),"},{"line_number":28,"context_line":"        # external id: cloud id or software id"},{"line_number":29,"context_line":"        sa.Column(\u0027product_id\u0027, sa.String(length\u003d512), nullable\u003dFalse),"},{"line_number":30,"context_line":"        sa.Column(\u0027name\u0027, sa.String(length\u003d80), nullable\u003dFalse),"},{"line_number":31,"context_line":"        sa.Column(\u0027description\u0027, sa.Text()),"},{"line_number":32,"context_line":"        sa.Column(\u0027organization_id\u0027, sa.Integer(), nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba63e191_3d8de37b","line":29,"range":{"start_line":29,"start_character":69,"end_line":29,"end_character":71},"in_reply_to":"ba63e191_229f0261","updated":"2016-01-18 18:57:06.000000000","message":"\u0027id\u0027 is a internal DB primary key (or it can be \u0027_id\u0027)\n\u0027product_id\u0027 is a field that contains real identifier of the product - \u0027cloud id\u0027 for example.","commit_id":"97296347cb8756a0996059e2ee70cb52c7e3133f"},{"author":{"_account_id":10526,"name":"Catherine Diep","email":"cdiep@us.ibm.com","username":"cdiep"},"change_message_id":"c2cf8067507339af8ab94ab9ae0906dc9237020e","unresolved":false,"context_lines":[{"line_number":26,"context_line":"        # internal DB id"},{"line_number":27,"context_line":"        sa.Column(\u0027id\u0027, sa.Integer(), nullable\u003dFalse),"},{"line_number":28,"context_line":"        # external id: cloud id or software id"},{"line_number":29,"context_line":"        sa.Column(\u0027product_id\u0027, sa.String(length\u003d512), nullable\u003dFalse),"},{"line_number":30,"context_line":"        sa.Column(\u0027name\u0027, sa.String(length\u003d80), nullable\u003dFalse),"},{"line_number":31,"context_line":"        sa.Column(\u0027description\u0027, sa.Text()),"},{"line_number":32,"context_line":"        sa.Column(\u0027organization_id\u0027, sa.Integer(), nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba63e191_3f935b51","line":29,"range":{"start_line":29,"start_character":69,"end_line":29,"end_character":71},"in_reply_to":"ba63e191_3d8de37b","updated":"2016-01-19 17:46:00.000000000","message":"Product can be a Software product.  In that case, it may not have \u0027cloud id\u0027 to begin with.  Since this is must filled column (nullable \u003d False), what would we use for software product?","commit_id":"97296347cb8756a0996059e2ee70cb52c7e3133f"},{"author":{"_account_id":9312,"name":"Alexandre Levine","email":"alexandrelevine@gmail.com","username":"alevine"},"change_message_id":"fa1c8b6b988340708018e56441388e335a59ee98","unresolved":false,"context_lines":[{"line_number":26,"context_line":"        # internal DB id"},{"line_number":27,"context_line":"        sa.Column(\u0027id\u0027, sa.Integer(), nullable\u003dFalse),"},{"line_number":28,"context_line":"        # external id: cloud id or software id"},{"line_number":29,"context_line":"        sa.Column(\u0027product_id\u0027, sa.String(length\u003d512), nullable\u003dFalse),"},{"line_number":30,"context_line":"        sa.Column(\u0027name\u0027, sa.String(length\u003d80), nullable\u003dFalse),"},{"line_number":31,"context_line":"        sa.Column(\u0027description\u0027, sa.Text()),"},{"line_number":32,"context_line":"        sa.Column(\u0027organization_id\u0027, sa.Integer(), nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba63e191_ea442375","line":29,"range":{"start_line":29,"start_character":69,"end_line":29,"end_character":71},"in_reply_to":"ba63e191_3f935b51","updated":"2016-01-19 18:01:33.000000000","message":"We need some unique identifier for the Software. Display name isn\u0027t quite a such thing. So I suggested to use some GUID here created when a Software is registered. However, if we can guarantee that name is also unique we\u0027ll just copy it into this field. In any case Product ID should be a globally unique identifier.","commit_id":"97296347cb8756a0996059e2ee70cb52c7e3133f"},{"author":{"_account_id":10526,"name":"Catherine Diep","email":"cdiep@us.ibm.com","username":"cdiep"},"change_message_id":"c2cf8067507339af8ab94ab9ae0906dc9237020e","unresolved":false,"context_lines":[{"line_number":33,"context_line":"        sa.Column(\u0027creator_id\u0027, sa.Integer(), nullable\u003dFalse),"},{"line_number":34,"context_line":"        sa.Column(\u0027public\u0027, sa.Boolean(), nullable\u003dFalse),"},{"line_number":35,"context_line":"        # additional properties as a serialized dictionary"},{"line_number":36,"context_line":"        sa.Column(\u0027properties\u0027, sa.Text()),"},{"line_number":37,"context_line":"        sa.PrimaryKeyConstraint(\u0027id\u0027),"},{"line_number":38,"context_line":"        sa.ForeignKeyConstraint([\u0027organization_id\u0027], [\u0027organization.id\u0027], ),"},{"line_number":39,"context_line":"        sa.ForeignKeyConstraint([\u0027creator_id\u0027], [\u0027user._id\u0027], ),"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba63e191_ff01436b","line":36,"range":{"start_line":36,"start_character":0,"end_line":36,"end_character":43},"updated":"2016-01-19 17:46:00.000000000","message":"Would it be better to add a product_meta table for product properties/meta data?","commit_id":"97296347cb8756a0996059e2ee70cb52c7e3133f"},{"author":{"_account_id":9312,"name":"Alexandre Levine","email":"alexandrelevine@gmail.com","username":"alevine"},"change_message_id":"fa1c8b6b988340708018e56441388e335a59ee98","unresolved":false,"context_lines":[{"line_number":33,"context_line":"        sa.Column(\u0027creator_id\u0027, sa.Integer(), nullable\u003dFalse),"},{"line_number":34,"context_line":"        sa.Column(\u0027public\u0027, sa.Boolean(), nullable\u003dFalse),"},{"line_number":35,"context_line":"        # additional properties as a serialized dictionary"},{"line_number":36,"context_line":"        sa.Column(\u0027properties\u0027, sa.Text()),"},{"line_number":37,"context_line":"        sa.PrimaryKeyConstraint(\u0027id\u0027),"},{"line_number":38,"context_line":"        sa.ForeignKeyConstraint([\u0027organization_id\u0027], [\u0027organization.id\u0027], ),"},{"line_number":39,"context_line":"        sa.ForeignKeyConstraint([\u0027creator_id\u0027], [\u0027user._id\u0027], ),"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba63e191_e5a53404","line":36,"range":{"start_line":36,"start_character":0,"end_line":36,"end_character":43},"in_reply_to":"ba63e191_ff01436b","updated":"2016-01-19 18:01:33.000000000","message":"Doesn\u0027t matter much.\nHowever in our experience we used this approach to minimize number of tables and entities.","commit_id":"97296347cb8756a0996059e2ee70cb52c7e3133f"},{"author":{"_account_id":10526,"name":"Catherine Diep","email":"cdiep@us.ibm.com","username":"cdiep"},"change_message_id":"7fa850780980ce2665ce90158946ece392574071","unresolved":false,"context_lines":[{"line_number":32,"context_line":"        sa.Column(\u0027description\u0027, sa.Text()),"},{"line_number":33,"context_line":"        sa.Column(\u0027organization_id\u0027, sa.Integer(), nullable\u003dFalse),"},{"line_number":34,"context_line":"        sa.Column(\u0027creator_openid\u0027, sa.String(128), nullable\u003dFalse),"},{"line_number":35,"context_line":"        sa.Column(\u0027public\u0027, sa.Boolean(), nullable\u003dFalse),"},{"line_number":36,"context_line":"        # additional properties as a serialized dictionary"},{"line_number":37,"context_line":"        sa.Column(\u0027properties\u0027, sa.Text()),"},{"line_number":38,"context_line":"        sa.PrimaryKeyConstraint(\u0027_id\u0027),"}],"source_content_type":"text/x-python","patch_set":10,"id":"9a68dd71_40de4640","line":35,"range":{"start_line":35,"start_character":56,"end_line":35,"end_character":58},"updated":"2016-01-22 05:59:40.000000000","message":"Should the public (share or not share) be set at the test results level? When a test run result is associated to a product, and if the test result is shared, then the test result and its product name will be visible.\n\nWhat would be the usecase for setting a product to public?","commit_id":"716754489e9ce7f3302b73fd2af035e1ecf59b80"},{"author":{"_account_id":10526,"name":"Catherine Diep","email":"cdiep@us.ibm.com","username":"cdiep"},"change_message_id":"a708eb762c730eaaf8ff30795a4ec9b526cf4b86","unresolved":false,"context_lines":[{"line_number":27,"context_line":"        sa.Column(\u0027id\u0027, sa.String(36), nullable\u003dFalse),"},{"line_number":28,"context_line":"        sa.Column(\u0027name\u0027, sa.String(length\u003d80), nullable\u003dFalse),"},{"line_number":29,"context_line":"        sa.Column(\u0027description\u0027, sa.Text()),"},{"line_number":30,"context_line":"        sa.Column(\u0027product_id\u0027, sa.String(36), nullable\u003dFalse),"},{"line_number":31,"context_line":"        sa.Column(\u0027type\u0027, sa.Integer(), nullable\u003dFalse),"},{"line_number":32,"context_line":"        sa.Column(\u0027public\u0027, sa.Boolean(), nullable\u003dFalse),"},{"line_number":33,"context_line":"        sa.Column(\u0027organization_id\u0027, sa.String(36), nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":18,"id":"7a5de9d1_ae0f7035","line":30,"range":{"start_line":30,"start_character":0,"end_line":30,"end_character":63},"updated":"2016-02-02 00:30:55.000000000","message":"product_id can be null now.","commit_id":"30a354a2f54b2c8e61445394c1d4b733a633be7e"},{"author":{"_account_id":10526,"name":"Catherine Diep","email":"cdiep@us.ibm.com","username":"cdiep"},"change_message_id":"2c8ce3e6b14a6790dd3664b5940190ee71fd3734","unresolved":false,"context_lines":[{"line_number":27,"context_line":"        sa.Column(\u0027id\u0027, sa.String(36), nullable\u003dFalse),"},{"line_number":28,"context_line":"        sa.Column(\u0027name\u0027, sa.String(length\u003d80), nullable\u003dFalse),"},{"line_number":29,"context_line":"        sa.Column(\u0027description\u0027, sa.Text()),"},{"line_number":30,"context_line":"        sa.Column(\u0027product_id\u0027, sa.String(36), nullable\u003dFalse),"},{"line_number":31,"context_line":"        sa.Column(\u0027type\u0027, sa.Integer(), nullable\u003dFalse),"},{"line_number":32,"context_line":"        sa.Column(\u0027public\u0027, sa.Boolean(), nullable\u003dFalse),"},{"line_number":33,"context_line":"        sa.Column(\u0027organization_id\u0027, sa.String(36), nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":18,"id":"5a5ae5dd_f9960d4b","line":30,"range":{"start_line":30,"start_character":0,"end_line":30,"end_character":63},"in_reply_to":"5a5ae5dd_5acea184","updated":"2016-02-04 20:29:31.000000000","message":"3) You are right.  The data model spec does not specified whether the product_id field to be nullable. My mistake.\n\nIf initialized it would help code efficiency down the road, I agree to initialize the non public_cloud products with the values of the ID field knowing that these values would be duplicated.","commit_id":"30a354a2f54b2c8e61445394c1d4b733a633be7e"},{"author":{"_account_id":9312,"name":"Alexandre Levine","email":"alexandrelevine@gmail.com","username":"alevine"},"change_message_id":"e2013fc4d56233dd5eda5e2b70c47d95820f3379","unresolved":false,"context_lines":[{"line_number":27,"context_line":"        sa.Column(\u0027id\u0027, sa.String(36), nullable\u003dFalse),"},{"line_number":28,"context_line":"        sa.Column(\u0027name\u0027, sa.String(length\u003d80), nullable\u003dFalse),"},{"line_number":29,"context_line":"        sa.Column(\u0027description\u0027, sa.Text()),"},{"line_number":30,"context_line":"        sa.Column(\u0027product_id\u0027, sa.String(36), nullable\u003dFalse),"},{"line_number":31,"context_line":"        sa.Column(\u0027type\u0027, sa.Integer(), nullable\u003dFalse),"},{"line_number":32,"context_line":"        sa.Column(\u0027public\u0027, sa.Boolean(), nullable\u003dFalse),"},{"line_number":33,"context_line":"        sa.Column(\u0027organization_id\u0027, sa.String(36), nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":18,"id":"5a5ae5dd_5acea184","line":30,"range":{"start_line":30,"start_character":0,"end_line":30,"end_character":63},"in_reply_to":"7a5de9d1_8a302fa0","updated":"2016-02-03 03:25:16.000000000","message":"3) I\u0027m sorry I can\u0027t find anything in the data model spec that prescribes product_id to be nullable.\n1) It\u0027s not unique in DB, correct, which doesn\u0027t exactly mean it\u0027s nullable - those are different things.\n2) I agree with you here, yet I\u0027d preferred it to be uniformly initialized for each product so that the code used it doesn\u0027t have any \"ifs\" working with it, like counting a number of unique products in our DB (not unique records about product, but products). I can\u0027t right now come up with all of the situations it\u0027s helpful. But it\u0027s definitely doesn\u0027t do anything bad, right?\n\nI suggest we initialize it for software with the uuid, as long as it doesn\u0027t contradict any specs.\n\nBesides, some time later we might want to allow regular user to create his own replicas to official Software products for him to play better with his own Guidelines and other things. The same way we decided to do for Clouds.","commit_id":"30a354a2f54b2c8e61445394c1d4b733a633be7e"},{"author":{"_account_id":9312,"name":"Alexandre Levine","email":"alexandrelevine@gmail.com","username":"alevine"},"change_message_id":"ec54fb4941d99dce5b4e323d35825338685e2d87","unresolved":false,"context_lines":[{"line_number":27,"context_line":"        sa.Column(\u0027id\u0027, sa.String(36), nullable\u003dFalse),"},{"line_number":28,"context_line":"        sa.Column(\u0027name\u0027, sa.String(length\u003d80), nullable\u003dFalse),"},{"line_number":29,"context_line":"        sa.Column(\u0027description\u0027, sa.Text()),"},{"line_number":30,"context_line":"        sa.Column(\u0027product_id\u0027, sa.String(36), nullable\u003dFalse),"},{"line_number":31,"context_line":"        sa.Column(\u0027type\u0027, sa.Integer(), nullable\u003dFalse),"},{"line_number":32,"context_line":"        sa.Column(\u0027public\u0027, sa.Boolean(), nullable\u003dFalse),"},{"line_number":33,"context_line":"        sa.Column(\u0027organization_id\u0027, sa.String(36), nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":18,"id":"7a5de9d1_d5db4620","line":30,"range":{"start_line":30,"start_character":0,"end_line":30,"end_character":63},"in_reply_to":"7a5de9d1_ae0f7035","updated":"2016-02-02 10:35:34.000000000","message":"No it can\u0027t. Why?","commit_id":"30a354a2f54b2c8e61445394c1d4b733a633be7e"},{"author":{"_account_id":10526,"name":"Catherine Diep","email":"cdiep@us.ibm.com","username":"cdiep"},"change_message_id":"ed2a866514a5109288b6eca0d3039ae1ded499a6","unresolved":false,"context_lines":[{"line_number":27,"context_line":"        sa.Column(\u0027id\u0027, sa.String(36), nullable\u003dFalse),"},{"line_number":28,"context_line":"        sa.Column(\u0027name\u0027, sa.String(length\u003d80), nullable\u003dFalse),"},{"line_number":29,"context_line":"        sa.Column(\u0027description\u0027, sa.Text()),"},{"line_number":30,"context_line":"        sa.Column(\u0027product_id\u0027, sa.String(36), nullable\u003dFalse),"},{"line_number":31,"context_line":"        sa.Column(\u0027type\u0027, sa.Integer(), nullable\u003dFalse),"},{"line_number":32,"context_line":"        sa.Column(\u0027public\u0027, sa.Boolean(), nullable\u003dFalse),"},{"line_number":33,"context_line":"        sa.Column(\u0027organization_id\u0027, sa.String(36), nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":18,"id":"7a5de9d1_8a302fa0","line":30,"range":{"start_line":30,"start_character":0,"end_line":30,"end_character":63},"in_reply_to":"7a5de9d1_d5db4620","updated":"2016-02-03 00:37:20.000000000","message":"product_id can be null because 1) it can not be used for uniqueness 2) It is only needed for cloud, it is not needed for the other types 3) The data model spec ( https://review.openstack.org/#/c/268922/ that was merged) defined so, we should implemented per the spec or change the spec.  \n\nYou can check to enforce that if product_type is cloud then set this field.  This field is useless for all the other types apart from cloud.","commit_id":"30a354a2f54b2c8e61445394c1d4b733a633be7e"}],"refstack/db/sqlalchemy/api.py":[{"author":{"_account_id":9377,"name":"Sergey Slipushenko","email":"slipushenko@gmail.com","username":"sslypushenko"},"change_message_id":"11c3b3c72bbd7b7ad957549b1a55d0c8f12cf0f8","unresolved":false,"context_lines":[{"line_number":396,"context_line":"        raise NotFound(\u0027Organization with id %s not found\u0027 % _id)"},{"line_number":397,"context_line":""},{"line_number":398,"context_line":"    with session.begin():"},{"line_number":399,"context_line":"        if \u0027type\u0027 in organization_info:"},{"line_number":400,"context_line":"            organization.type \u003d organization_info[\u0027type\u0027]"},{"line_number":401,"context_line":"        if \u0027name\u0027 in organization_info:"},{"line_number":402,"context_line":"            organization.name \u003d organization_info[\u0027name\u0027]"},{"line_number":403,"context_line":"        if \u0027description\u0027 in organization_info:"},{"line_number":404,"context_line":"            organization.description \u003d organization_info[\u0027description\u0027]"},{"line_number":405,"context_line":"        organization.save(session\u003dsession)"},{"line_number":406,"context_line":""},{"line_number":407,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"7a5de9d1_911a3b7c","line":404,"range":{"start_line":399,"start_character":0,"end_line":404,"end_character":71},"updated":"2016-01-29 15:16:56.000000000","message":"It will be to rewrite it as for loop\n\nfor field in upd_fields:\n...","commit_id":"ba470eee679e2b42ec5e113c2c8300de18ff2f01"},{"author":{"_account_id":10234,"name":"Andrey Pavlov","email":"andrey.mp@gmail.com","username":"andrey-mp"},"change_message_id":"1f936e80ca0eed6267076bba39c8340fb04e66f0","unresolved":false,"context_lines":[{"line_number":396,"context_line":"        raise NotFound(\u0027Organization with id %s not found\u0027 % _id)"},{"line_number":397,"context_line":""},{"line_number":398,"context_line":"    with session.begin():"},{"line_number":399,"context_line":"        if \u0027type\u0027 in organization_info:"},{"line_number":400,"context_line":"            organization.type \u003d organization_info[\u0027type\u0027]"},{"line_number":401,"context_line":"        if \u0027name\u0027 in organization_info:"},{"line_number":402,"context_line":"            organization.name \u003d organization_info[\u0027name\u0027]"},{"line_number":403,"context_line":"        if \u0027description\u0027 in organization_info:"},{"line_number":404,"context_line":"            organization.description \u003d organization_info[\u0027description\u0027]"},{"line_number":405,"context_line":"        organization.save(session\u003dsession)"},{"line_number":406,"context_line":""},{"line_number":407,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"7a5de9d1_194e693b","line":404,"range":{"start_line":399,"start_character":0,"end_line":404,"end_character":71},"in_reply_to":"7a5de9d1_911a3b7c","updated":"2016-01-29 18:36:53.000000000","message":"it\u0027s not good way and this way has bad modifiability because organization object can have attributes with different names.","commit_id":"ba470eee679e2b42ec5e113c2c8300de18ff2f01"},{"author":{"_account_id":9377,"name":"Sergey Slipushenko","email":"slipushenko@gmail.com","username":"sslypushenko"},"change_message_id":"11c3b3c72bbd7b7ad957549b1a55d0c8f12cf0f8","unresolved":false,"context_lines":[{"line_number":443,"context_line":"    if product is None:"},{"line_number":444,"context_line":"        raise NotFound(\u0027Product with product_id %s not found\u0027 % _id)"},{"line_number":445,"context_line":""},{"line_number":446,"context_line":"    if \u0027name\u0027 in product_info:"},{"line_number":447,"context_line":"        product.name \u003d product_info[\u0027name\u0027]"},{"line_number":448,"context_line":"    if \u0027description\u0027 in product_info:"},{"line_number":449,"context_line":"        product.description \u003d product_info[\u0027description\u0027]"},{"line_number":450,"context_line":"    if \u0027public\u0027 in product_info:"},{"line_number":451,"context_line":"        product.public \u003d product_info[\u0027public\u0027]"},{"line_number":452,"context_line":"    if \u0027properties\u0027 in product_info:"},{"line_number":453,"context_line":"        product.properties \u003d product_info[\u0027properties\u0027]"},{"line_number":454,"context_line":"    if \u0027type\u0027 in product_info:"},{"line_number":455,"context_line":"        product.type \u003d product_info[\u0027type\u0027]"},{"line_number":456,"context_line":""},{"line_number":457,"context_line":"    with session.begin():"},{"line_number":458,"context_line":"        product.save(session\u003dsession)"}],"source_content_type":"text/x-python","patch_set":16,"id":"7a5de9d1_6c0c843b","line":455,"range":{"start_line":446,"start_character":0,"end_line":455,"end_character":43},"updated":"2016-01-29 15:16:56.000000000","message":"ditto","commit_id":"ba470eee679e2b42ec5e113c2c8300de18ff2f01"},{"author":{"_account_id":10526,"name":"Catherine Diep","email":"cdiep@us.ibm.com","username":"cdiep"},"change_message_id":"a708eb762c730eaaf8ff30795a4ec9b526cf4b86","unresolved":false,"context_lines":[{"line_number":421,"context_line":"    _id \u003d six.text_type(uuid.uuid4())"},{"line_number":422,"context_line":"    product.id \u003d _id"},{"line_number":423,"context_line":"    product.type \u003d product_info[\u0027type\u0027]"},{"line_number":424,"context_line":"    if product.type \u003d\u003d api_const.ProductType.SOFTWARE:"},{"line_number":425,"context_line":"        product.product_id \u003d product_info.get(\u0027product_id\u0027, _id)"},{"line_number":426,"context_line":"    product.name \u003d product_info[\u0027name\u0027]"},{"line_number":427,"context_line":"    if \u0027description\u0027 in product_info:"},{"line_number":428,"context_line":"        product.description \u003d product_info[\u0027description\u0027]"}],"source_content_type":"text/x-python","patch_set":18,"id":"7a5de9d1_ce750ccb","line":425,"range":{"start_line":424,"start_character":0,"end_line":425,"end_character":64},"updated":"2016-02-02 00:30:55.000000000","message":"This section of code is not needed because product_id can be null.","commit_id":"30a354a2f54b2c8e61445394c1d4b733a633be7e"},{"author":{"_account_id":9377,"name":"Sergey Slipushenko","email":"slipushenko@gmail.com","username":"sslypushenko"},"change_message_id":"46315f20da201c400aa84834984a4fe446e95a03","unresolved":false,"context_lines":[{"line_number":377,"context_line":"        organization.type \u003d organization_info.get("},{"line_number":378,"context_line":"            \u0027type\u0027, api_const.OrganizationType.PRIVATE_VENDOR)"},{"line_number":379,"context_line":"        organization.name \u003d organization_info[\u0027name\u0027]"},{"line_number":380,"context_line":"        if \u0027description\u0027 in organization_info:"},{"line_number":381,"context_line":"            organization.description \u003d organization_info[\u0027description\u0027]"},{"line_number":382,"context_line":"        organization.group_id \u003d group_id"},{"line_number":383,"context_line":"        organization.created_by_user \u003d creator"}],"source_content_type":"text/x-python","patch_set":27,"id":"3a57f1b5_f196244b","line":380,"range":{"start_line":380,"start_character":28,"end_line":380,"end_character":45},"updated":"2016-02-11 14:26:50.000000000","message":"Please rewrite it in Python way:\n\norganization.description \u003d organization_info.get(\u0027description\u0027)","commit_id":"49a43d237ce29470299bf825a089a0d71a7ce7cc"},{"author":{"_account_id":9377,"name":"Sergey Slipushenko","email":"slipushenko@gmail.com","username":"sslypushenko"},"change_message_id":"46315f20da201c400aa84834984a4fe446e95a03","unresolved":false,"context_lines":[{"line_number":381,"context_line":"            organization.description \u003d organization_info[\u0027description\u0027]"},{"line_number":382,"context_line":"        organization.group_id \u003d group_id"},{"line_number":383,"context_line":"        organization.created_by_user \u003d creator"},{"line_number":384,"context_line":"        if \u0027properties\u0027 in organization_info:"},{"line_number":385,"context_line":"            organization.properties \u003d organization_info[\u0027properties\u0027]"},{"line_number":386,"context_line":"        organization.save(session\u003dsession)"},{"line_number":387,"context_line":""}],"source_content_type":"text/x-python","patch_set":27,"id":"3a57f1b5_51861814","line":384,"range":{"start_line":384,"start_character":27,"end_line":384,"end_character":44},"updated":"2016-02-11 14:26:50.000000000","message":"same","commit_id":"49a43d237ce29470299bf825a089a0d71a7ce7cc"},{"author":{"_account_id":9377,"name":"Sergey Slipushenko","email":"slipushenko@gmail.com","username":"sslypushenko"},"change_message_id":"46315f20da201c400aa84834984a4fe446e95a03","unresolved":false,"context_lines":[{"line_number":398,"context_line":"        raise NotFound(\u0027Organization with id %s not found\u0027 % _id)"},{"line_number":399,"context_line":""},{"line_number":400,"context_line":"    with session.begin():"},{"line_number":401,"context_line":"        if \u0027type\u0027 in organization_info:"},{"line_number":402,"context_line":"            organization.type \u003d organization_info[\u0027type\u0027]"},{"line_number":403,"context_line":"        if \u0027name\u0027 in organization_info:"},{"line_number":404,"context_line":"            organization.name \u003d organization_info[\u0027name\u0027]"}],"source_content_type":"text/x-python","patch_set":27,"id":"3a57f1b5_f1cb8451","line":401,"range":{"start_line":401,"start_character":21,"end_line":401,"end_character":38},"updated":"2016-02-11 14:26:50.000000000","message":"same","commit_id":"49a43d237ce29470299bf825a089a0d71a7ce7cc"},{"author":{"_account_id":9377,"name":"Sergey Slipushenko","email":"slipushenko@gmail.com","username":"sslypushenko"},"change_message_id":"d336de5871b8287f9c5909606fe02477afa63987","unresolved":false,"context_lines":[{"line_number":398,"context_line":"        raise NotFound(\u0027Organization with id %s not found\u0027 % _id)"},{"line_number":399,"context_line":""},{"line_number":400,"context_line":"    with session.begin():"},{"line_number":401,"context_line":"        if \u0027type\u0027 in organization_info:"},{"line_number":402,"context_line":"            organization.type \u003d organization_info[\u0027type\u0027]"},{"line_number":403,"context_line":"        if \u0027name\u0027 in organization_info:"},{"line_number":404,"context_line":"            organization.name \u003d organization_info[\u0027name\u0027]"}],"source_content_type":"text/x-python","patch_set":27,"id":"3a57f1b5_ce96de4b","line":401,"range":{"start_line":401,"start_character":21,"end_line":401,"end_character":38},"in_reply_to":"3a57f1b5_023ccd2d","updated":"2016-02-11 16:25:50.000000000","message":"I\u0027m ok with two options - replace \u0027if\u0027 with get or replace bunch of these line on for loop.","commit_id":"49a43d237ce29470299bf825a089a0d71a7ce7cc"},{"author":{"_account_id":10234,"name":"Andrey Pavlov","email":"andrey.mp@gmail.com","username":"andrey-mp"},"change_message_id":"9dd43fdca281db6ce4e2f645e90d0253f6f2f52c","unresolved":false,"context_lines":[{"line_number":398,"context_line":"        raise NotFound(\u0027Organization with id %s not found\u0027 % _id)"},{"line_number":399,"context_line":""},{"line_number":400,"context_line":"    with session.begin():"},{"line_number":401,"context_line":"        if \u0027type\u0027 in organization_info:"},{"line_number":402,"context_line":"            organization.type \u003d organization_info[\u0027type\u0027]"},{"line_number":403,"context_line":"        if \u0027name\u0027 in organization_info:"},{"line_number":404,"context_line":"            organization.name \u003d organization_info[\u0027name\u0027]"}],"source_content_type":"text/x-python","patch_set":27,"id":"3a57f1b5_023ccd2d","line":401,"range":{"start_line":401,"start_character":21,"end_line":401,"end_character":38},"in_reply_to":"3a57f1b5_3f5c82ec","updated":"2016-02-11 15:25:54.000000000","message":"but I can rework this too if you want.","commit_id":"49a43d237ce29470299bf825a089a0d71a7ce7cc"},{"author":{"_account_id":10234,"name":"Andrey Pavlov","email":"andrey.mp@gmail.com","username":"andrey-mp"},"change_message_id":"0f45017c7257862e7cf993d0c5477cb758640dc7","unresolved":false,"context_lines":[{"line_number":398,"context_line":"        raise NotFound(\u0027Organization with id %s not found\u0027 % _id)"},{"line_number":399,"context_line":""},{"line_number":400,"context_line":"    with session.begin():"},{"line_number":401,"context_line":"        if \u0027type\u0027 in organization_info:"},{"line_number":402,"context_line":"            organization.type \u003d organization_info[\u0027type\u0027]"},{"line_number":403,"context_line":"        if \u0027name\u0027 in organization_info:"},{"line_number":404,"context_line":"            organization.name \u003d organization_info[\u0027name\u0027]"}],"source_content_type":"text/x-python","patch_set":27,"id":"3a57f1b5_3f5c82ec","line":401,"range":{"start_line":401,"start_character":21,"end_line":401,"end_character":38},"in_reply_to":"3a57f1b5_7f9f5ab4","updated":"2016-02-11 15:07:54.000000000","message":"is it really more readable? )","commit_id":"49a43d237ce29470299bf825a089a0d71a7ce7cc"},{"author":{"_account_id":9377,"name":"Sergey Slipushenko","email":"slipushenko@gmail.com","username":"sslypushenko"},"change_message_id":"f2a8116fbf88539116afb255e61f98f5fa78a323","unresolved":false,"context_lines":[{"line_number":398,"context_line":"        raise NotFound(\u0027Organization with id %s not found\u0027 % _id)"},{"line_number":399,"context_line":""},{"line_number":400,"context_line":"    with session.begin():"},{"line_number":401,"context_line":"        if \u0027type\u0027 in organization_info:"},{"line_number":402,"context_line":"            organization.type \u003d organization_info[\u0027type\u0027]"},{"line_number":403,"context_line":"        if \u0027name\u0027 in organization_info:"},{"line_number":404,"context_line":"            organization.name \u003d organization_info[\u0027name\u0027]"}],"source_content_type":"text/x-python","patch_set":27,"id":"3a57f1b5_7f9f5ab4","line":401,"range":{"start_line":401,"start_character":21,"end_line":401,"end_character":38},"in_reply_to":"3a57f1b5_acab721c","updated":"2016-02-11 15:05:27.000000000","message":"If you want to save default you can do\n\norganization.type \u003d organization_info.get(\u0027type\u0027, organization.type)","commit_id":"49a43d237ce29470299bf825a089a0d71a7ce7cc"},{"author":{"_account_id":10234,"name":"Andrey Pavlov","email":"andrey.mp@gmail.com","username":"andrey-mp"},"change_message_id":"6ec53197361973651a8c6ffc313d1713a4d4cef8","unresolved":false,"context_lines":[{"line_number":398,"context_line":"        raise NotFound(\u0027Organization with id %s not found\u0027 % _id)"},{"line_number":399,"context_line":""},{"line_number":400,"context_line":"    with session.begin():"},{"line_number":401,"context_line":"        if \u0027type\u0027 in organization_info:"},{"line_number":402,"context_line":"            organization.type \u003d organization_info[\u0027type\u0027]"},{"line_number":403,"context_line":"        if \u0027name\u0027 in organization_info:"},{"line_number":404,"context_line":"            organization.name \u003d organization_info[\u0027name\u0027]"}],"source_content_type":"text/x-python","patch_set":27,"id":"3a57f1b5_acab721c","line":401,"range":{"start_line":401,"start_character":21,"end_line":401,"end_character":38},"in_reply_to":"3a57f1b5_f1cb8451","updated":"2016-02-11 15:01:47.000000000","message":"here it will have another meaning. such notation will rewrite field with \u0027None\u0027 if it absent in organization_info. but not all fields are present in organization_info.","commit_id":"49a43d237ce29470299bf825a089a0d71a7ce7cc"},{"author":{"_account_id":9377,"name":"Sergey Slipushenko","email":"slipushenko@gmail.com","username":"sslypushenko"},"change_message_id":"46315f20da201c400aa84834984a4fe446e95a03","unresolved":false,"context_lines":[{"line_number":400,"context_line":"    with session.begin():"},{"line_number":401,"context_line":"        if \u0027type\u0027 in organization_info:"},{"line_number":402,"context_line":"            organization.type \u003d organization_info[\u0027type\u0027]"},{"line_number":403,"context_line":"        if \u0027name\u0027 in organization_info:"},{"line_number":404,"context_line":"            organization.name \u003d organization_info[\u0027name\u0027]"},{"line_number":405,"context_line":"        if \u0027description\u0027 in organization_info:"},{"line_number":406,"context_line":"            organization.description \u003d organization_info[\u0027description\u0027]"}],"source_content_type":"text/x-python","patch_set":27,"id":"3a57f1b5_d1c0c82c","line":403,"range":{"start_line":403,"start_character":21,"end_line":403,"end_character":39},"updated":"2016-02-11 14:26:50.000000000","message":"same","commit_id":"49a43d237ce29470299bf825a089a0d71a7ce7cc"},{"author":{"_account_id":9377,"name":"Sergey Slipushenko","email":"slipushenko@gmail.com","username":"sslypushenko"},"change_message_id":"46315f20da201c400aa84834984a4fe446e95a03","unresolved":false,"context_lines":[{"line_number":402,"context_line":"            organization.type \u003d organization_info[\u0027type\u0027]"},{"line_number":403,"context_line":"        if \u0027name\u0027 in organization_info:"},{"line_number":404,"context_line":"            organization.name \u003d organization_info[\u0027name\u0027]"},{"line_number":405,"context_line":"        if \u0027description\u0027 in organization_info:"},{"line_number":406,"context_line":"            organization.description \u003d organization_info[\u0027description\u0027]"},{"line_number":407,"context_line":"        if \u0027properties\u0027 in organization_info:"},{"line_number":408,"context_line":"            organization.properties \u003d organization_info[\u0027properties\u0027]"}],"source_content_type":"text/x-python","patch_set":27,"id":"3a57f1b5_71055478","line":405,"range":{"start_line":405,"start_character":28,"end_line":405,"end_character":45},"updated":"2016-02-11 14:26:50.000000000","message":"same","commit_id":"49a43d237ce29470299bf825a089a0d71a7ce7cc"},{"author":{"_account_id":9377,"name":"Sergey Slipushenko","email":"slipushenko@gmail.com","username":"sslypushenko"},"change_message_id":"46315f20da201c400aa84834984a4fe446e95a03","unresolved":false,"context_lines":[{"line_number":404,"context_line":"            organization.name \u003d organization_info[\u0027name\u0027]"},{"line_number":405,"context_line":"        if \u0027description\u0027 in organization_info:"},{"line_number":406,"context_line":"            organization.description \u003d organization_info[\u0027description\u0027]"},{"line_number":407,"context_line":"        if \u0027properties\u0027 in organization_info:"},{"line_number":408,"context_line":"            organization.properties \u003d organization_info[\u0027properties\u0027]"},{"line_number":409,"context_line":"        organization.save(session\u003dsession)"},{"line_number":410,"context_line":""}],"source_content_type":"text/x-python","patch_set":27,"id":"3a57f1b5_51029870","line":407,"range":{"start_line":407,"start_character":27,"end_line":407,"end_character":44},"updated":"2016-02-11 14:26:50.000000000","message":"same","commit_id":"49a43d237ce29470299bf825a089a0d71a7ce7cc"},{"author":{"_account_id":10526,"name":"Catherine Diep","email":"cdiep@us.ibm.com","username":"cdiep"},"change_message_id":"00250b6a9341fc76befc7a8b46dae798d5a58762","unresolved":false,"context_lines":[{"line_number":438,"context_line":"    product.id \u003d _id"},{"line_number":439,"context_line":"    product.type \u003d product_info[\u0027type\u0027]"},{"line_number":440,"context_line":"    product.product_type \u003d product_info[\u0027product_type\u0027]"},{"line_number":441,"context_line":"    product.product_id \u003d product_info[\u0027product_id\u0027]"},{"line_number":442,"context_line":"    product.name \u003d product_info[\u0027name\u0027]"},{"line_number":443,"context_line":"    if \u0027description\u0027 in product_info:"},{"line_number":444,"context_line":"        product.description \u003d product_info[\u0027description\u0027]"}],"source_content_type":"text/x-python","patch_set":27,"id":"3a57f1b5_6aa07391","line":441,"range":{"start_line":441,"start_character":4,"end_line":441,"end_character":51},"updated":"2016-02-09 18:10:40.000000000","message":"For the case of type\u003dsoftware, the product_id may not be passed in by the user.  May need to check whether it exists.\n\nif \u0027product_id\u0027 in product_info:\n   product.product_id \u003d product_info[\u0027product_id\u0027]\nelse:\n   product.product_id \u003d product.id","commit_id":"49a43d237ce29470299bf825a089a0d71a7ce7cc"},{"author":{"_account_id":10234,"name":"Andrey Pavlov","email":"andrey.mp@gmail.com","username":"andrey-mp"},"change_message_id":"8a24c3a5ace1ea6ccfe43304ae95652eb18bd74e","unresolved":false,"context_lines":[{"line_number":438,"context_line":"    product.id \u003d _id"},{"line_number":439,"context_line":"    product.type \u003d product_info[\u0027type\u0027]"},{"line_number":440,"context_line":"    product.product_type \u003d product_info[\u0027product_type\u0027]"},{"line_number":441,"context_line":"    product.product_id \u003d product_info[\u0027product_id\u0027]"},{"line_number":442,"context_line":"    product.name \u003d product_info[\u0027name\u0027]"},{"line_number":443,"context_line":"    if \u0027description\u0027 in product_info:"},{"line_number":444,"context_line":"        product.description \u003d product_info[\u0027description\u0027]"}],"source_content_type":"text/x-python","patch_set":27,"id":"3a57f1b5_6b6872bb","line":441,"range":{"start_line":441,"start_character":4,"end_line":441,"end_character":51},"in_reply_to":"3a57f1b5_6aa07391","updated":"2016-02-09 19:42:21.000000000","message":"yes. it can be implemented in such way\n(or in none line - \"product.product_id \u003d product_info.get(\u0027product_id\u0027, product.id\")\n\nbut it leads to problems with product_id for clouds. with such implementation controller layer can do not pass product_id for cloud but it must do it.\nIf we will require product_id for cloud from controller we can run into problem with detecting product_id for some clouds.\nSo I think that contoller can have (or should have) this logic and pass product_id to DB.\n\n(contoller layer \u003d\u003d business logic layer)\n\nWhat do you think about it?","commit_id":"49a43d237ce29470299bf825a089a0d71a7ce7cc"},{"author":{"_account_id":10526,"name":"Catherine Diep","email":"cdiep@us.ibm.com","username":"cdiep"},"change_message_id":"9e3ff0c305f4ad8cd4a52ac9c6d5e3b27ed1c4be","unresolved":false,"context_lines":[{"line_number":438,"context_line":"    product.id \u003d _id"},{"line_number":439,"context_line":"    product.type \u003d product_info[\u0027type\u0027]"},{"line_number":440,"context_line":"    product.product_type \u003d product_info[\u0027product_type\u0027]"},{"line_number":441,"context_line":"    product.product_id \u003d product_info[\u0027product_id\u0027]"},{"line_number":442,"context_line":"    product.name \u003d product_info[\u0027name\u0027]"},{"line_number":443,"context_line":"    if \u0027description\u0027 in product_info:"},{"line_number":444,"context_line":"        product.description \u003d product_info[\u0027description\u0027]"}],"source_content_type":"text/x-python","patch_set":27,"id":"3a57f1b5_daa36a4e","line":441,"range":{"start_line":441,"start_character":4,"end_line":441,"end_character":51},"in_reply_to":"3a57f1b5_6b6872bb","updated":"2016-02-09 21:56:51.000000000","message":"Since this field is not required to be unique, it does not matter what its value is.  I am OK to require the controller to pass the product_id to the method.","commit_id":"49a43d237ce29470299bf825a089a0d71a7ce7cc"},{"author":{"_account_id":9377,"name":"Sergey Slipushenko","email":"slipushenko@gmail.com","username":"sslypushenko"},"change_message_id":"46315f20da201c400aa84834984a4fe446e95a03","unresolved":false,"context_lines":[{"line_number":440,"context_line":"    product.product_type \u003d product_info[\u0027product_type\u0027]"},{"line_number":441,"context_line":"    product.product_id \u003d product_info[\u0027product_id\u0027]"},{"line_number":442,"context_line":"    product.name \u003d product_info[\u0027name\u0027]"},{"line_number":443,"context_line":"    if \u0027description\u0027 in product_info:"},{"line_number":444,"context_line":"        product.description \u003d product_info[\u0027description\u0027]"},{"line_number":445,"context_line":"    product.organization_id \u003d product_info[\u0027organization_id\u0027]"},{"line_number":446,"context_line":"    product.created_by_user \u003d creator"}],"source_content_type":"text/x-python","patch_set":27,"id":"3a57f1b5_912fb0f5","line":443,"range":{"start_line":443,"start_character":24,"end_line":443,"end_character":36},"updated":"2016-02-11 14:26:50.000000000","message":"same","commit_id":"49a43d237ce29470299bf825a089a0d71a7ce7cc"},{"author":{"_account_id":9377,"name":"Sergey Slipushenko","email":"slipushenko@gmail.com","username":"sslypushenko"},"change_message_id":"46315f20da201c400aa84834984a4fe446e95a03","unresolved":false,"context_lines":[{"line_number":445,"context_line":"    product.organization_id \u003d product_info[\u0027organization_id\u0027]"},{"line_number":446,"context_line":"    product.created_by_user \u003d creator"},{"line_number":447,"context_line":"    product.public \u003d product_info.get(\u0027public\u0027, False)"},{"line_number":448,"context_line":"    if \u0027properties\u0027 in product_info:"},{"line_number":449,"context_line":"        product.properties \u003d product_info[\u0027properties\u0027]"},{"line_number":450,"context_line":""},{"line_number":451,"context_line":"    session \u003d get_session()"}],"source_content_type":"text/x-python","patch_set":27,"id":"3a57f1b5_113c202e","line":448,"range":{"start_line":448,"start_character":23,"end_line":448,"end_character":35},"updated":"2016-02-11 14:26:50.000000000","message":"same","commit_id":"49a43d237ce29470299bf825a089a0d71a7ce7cc"},{"author":{"_account_id":9377,"name":"Sergey Slipushenko","email":"slipushenko@gmail.com","username":"sslypushenko"},"change_message_id":"46315f20da201c400aa84834984a4fe446e95a03","unresolved":false,"context_lines":[{"line_number":462,"context_line":"    if product is None:"},{"line_number":463,"context_line":"        raise NotFound(\u0027Product with product_id %s not found\u0027 % _id)"},{"line_number":464,"context_line":""},{"line_number":465,"context_line":"    if \u0027name\u0027 in product_info:"},{"line_number":466,"context_line":"        product.name \u003d product_info[\u0027name\u0027]"},{"line_number":467,"context_line":"    if \u0027description\u0027 in product_info:"},{"line_number":468,"context_line":"        product.description \u003d product_info[\u0027description\u0027]"}],"source_content_type":"text/x-python","patch_set":27,"id":"3a57f1b5_b178acf3","line":465,"range":{"start_line":465,"start_character":17,"end_line":465,"end_character":29},"updated":"2016-02-11 14:26:50.000000000","message":"same","commit_id":"49a43d237ce29470299bf825a089a0d71a7ce7cc"},{"author":{"_account_id":9377,"name":"Sergey Slipushenko","email":"slipushenko@gmail.com","username":"sslypushenko"},"change_message_id":"46315f20da201c400aa84834984a4fe446e95a03","unresolved":false,"context_lines":[{"line_number":464,"context_line":""},{"line_number":465,"context_line":"    if \u0027name\u0027 in product_info:"},{"line_number":466,"context_line":"        product.name \u003d product_info[\u0027name\u0027]"},{"line_number":467,"context_line":"    if \u0027description\u0027 in product_info:"},{"line_number":468,"context_line":"        product.description \u003d product_info[\u0027description\u0027]"},{"line_number":469,"context_line":"    if \u0027public\u0027 in product_info:"},{"line_number":470,"context_line":"        product.public \u003d product_info[\u0027public\u0027]"}],"source_content_type":"text/x-python","patch_set":27,"id":"3a57f1b5_515e1877","line":467,"range":{"start_line":467,"start_character":24,"end_line":467,"end_character":36},"updated":"2016-02-11 14:26:50.000000000","message":"same","commit_id":"49a43d237ce29470299bf825a089a0d71a7ce7cc"},{"author":{"_account_id":9377,"name":"Sergey Slipushenko","email":"slipushenko@gmail.com","username":"sslypushenko"},"change_message_id":"46315f20da201c400aa84834984a4fe446e95a03","unresolved":false,"context_lines":[{"line_number":466,"context_line":"        product.name \u003d product_info[\u0027name\u0027]"},{"line_number":467,"context_line":"    if \u0027description\u0027 in product_info:"},{"line_number":468,"context_line":"        product.description \u003d product_info[\u0027description\u0027]"},{"line_number":469,"context_line":"    if \u0027public\u0027 in product_info:"},{"line_number":470,"context_line":"        product.public \u003d product_info[\u0027public\u0027]"},{"line_number":471,"context_line":"    if \u0027properties\u0027 in product_info:"},{"line_number":472,"context_line":"        product.properties \u003d product_info[\u0027properties\u0027]"}],"source_content_type":"text/x-python","patch_set":27,"id":"3a57f1b5_11518062","line":469,"range":{"start_line":469,"start_character":19,"end_line":469,"end_character":31},"updated":"2016-02-11 14:26:50.000000000","message":"same","commit_id":"49a43d237ce29470299bf825a089a0d71a7ce7cc"},{"author":{"_account_id":9377,"name":"Sergey Slipushenko","email":"slipushenko@gmail.com","username":"sslypushenko"},"change_message_id":"46315f20da201c400aa84834984a4fe446e95a03","unresolved":false,"context_lines":[{"line_number":468,"context_line":"        product.description \u003d product_info[\u0027description\u0027]"},{"line_number":469,"context_line":"    if \u0027public\u0027 in product_info:"},{"line_number":470,"context_line":"        product.public \u003d product_info[\u0027public\u0027]"},{"line_number":471,"context_line":"    if \u0027properties\u0027 in product_info:"},{"line_number":472,"context_line":"        product.properties \u003d product_info[\u0027properties\u0027]"},{"line_number":473,"context_line":""},{"line_number":474,"context_line":"    with session.begin():"}],"source_content_type":"text/x-python","patch_set":27,"id":"3a57f1b5_d14a08ac","line":471,"range":{"start_line":471,"start_character":23,"end_line":471,"end_character":35},"updated":"2016-02-11 14:26:50.000000000","message":"same","commit_id":"49a43d237ce29470299bf825a089a0d71a7ce7cc"}]}
