)]}'
{"keystone/assignment/controllers.py":[{"author":{"_account_id":8533,"name":"Marcos Fermín Lobo","email":"lobo@lukos.org","username":"mlobo"},"change_message_id":"40fc6f5041c515f1e412066d587d75bc09074776","unresolved":false,"context_lines":[{"line_number":92,"context_line":"        # TODO(termie): this stuff should probably be moved to middleware"},{"line_number":93,"context_line":"        self.assert_admin(context)"},{"line_number":94,"context_line":"        ref \u003d self.resource_api.get_project(tenant_id)"},{"line_number":95,"context_line":"        ref \u003d self.timestamp2isotime(ref)"},{"line_number":96,"context_line":"        return {\u0027tenant\u0027: self.filter_domain_id(ref)}"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    @controller.v2_deprecated"}],"source_content_type":"text/x-python","patch_set":5,"id":"da86d52c_b0384bd4","line":95,"updated":"2015-02-11 10:38:09.000000000","message":"Why we can not change the timestamp in get_project function?","commit_id":"e8a6d5b342f7c51504610177333e61a2e1b1d607"},{"author":{"_account_id":9101,"name":"wanghong","email":"reviewwanghong@126.com","username":"wanghong"},"change_message_id":"e300c29c0a34f14cc10e533846b5c13f71e7bb35","unresolved":false,"context_lines":[{"line_number":92,"context_line":"        # TODO(termie): this stuff should probably be moved to middleware"},{"line_number":93,"context_line":"        self.assert_admin(context)"},{"line_number":94,"context_line":"        ref \u003d self.resource_api.get_project(tenant_id)"},{"line_number":95,"context_line":"        ref \u003d self.timestamp2isotime(ref)"},{"line_number":96,"context_line":"        return {\u0027tenant\u0027: self.filter_domain_id(ref)}"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    @controller.v2_deprecated"}],"source_content_type":"text/x-python","patch_set":5,"id":"da86d52c_21b3060b","line":95,"in_reply_to":"da86d52c_b0384bd4","updated":"2015-02-12 01:57:44.000000000","message":"Maybe in driver is better? I will move this into driver.","commit_id":"e8a6d5b342f7c51504610177333e61a2e1b1d607"}],"keystone/assignment/role_backends/sql.py":[{"author":{"_account_id":220,"name":"Haneef Ali","email":"haneef.ali@hp.com","username":"haneef"},"change_message_id":"0996e72f37ff6ed3047f8a161a442a8cc358a86e","unresolved":false,"context_lines":[{"line_number":71,"context_line":"            session.delete(ref)"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"class RoleTable(sql.ModelBase, sql.TimestampModelDictMixin,"},{"line_number":75,"context_line":"                sql.models.TimestampMixin):"},{"line_number":76,"context_line":"    __tablename__ \u003d \u0027role\u0027"},{"line_number":77,"context_line":"    attributes \u003d [\u0027id\u0027, \u0027name\u0027, \u0027created_at\u0027, \u0027updated_at\u0027]"}],"source_content_type":"text/x-python","patch_set":8,"id":"da86d52c_f446d7be","line":74,"updated":"2015-02-13 03:47:53.000000000","message":"Why do you want updated time stamp is role table?  Any usecase you can think of?","commit_id":"ac19cb85759dc411c38c65612da5aece486129c5"},{"author":{"_account_id":9101,"name":"wanghong","email":"reviewwanghong@126.com","username":"wanghong"},"change_message_id":"0b7a3d0dcf3d89e1806ef728b8ae85acedf07e34","unresolved":false,"context_lines":[{"line_number":71,"context_line":"            session.delete(ref)"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"class RoleTable(sql.ModelBase, sql.TimestampModelDictMixin,"},{"line_number":75,"context_line":"                sql.models.TimestampMixin):"},{"line_number":76,"context_line":"    __tablename__ \u003d \u0027role\u0027"},{"line_number":77,"context_line":"    attributes \u003d [\u0027id\u0027, \u0027name\u0027, \u0027created_at\u0027, \u0027updated_at\u0027]"}],"source_content_type":"text/x-python","patch_set":8,"id":"da86d52c_686be4f0","line":74,"in_reply_to":"da86d52c_e8c1942f","updated":"2015-02-13 06:28:59.000000000","message":"This provides a way to track and audit resources. And the reason that convert timestamp to isotime is making them consistent with other timestamps.","commit_id":"ac19cb85759dc411c38c65612da5aece486129c5"},{"author":{"_account_id":9101,"name":"wanghong","email":"reviewwanghong@126.com","username":"wanghong"},"change_message_id":"11b226cb02d859bc2609956800f65bb276617335","unresolved":false,"context_lines":[{"line_number":71,"context_line":"            session.delete(ref)"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"class RoleTable(sql.ModelBase, sql.TimestampModelDictMixin,"},{"line_number":75,"context_line":"                sql.models.TimestampMixin):"},{"line_number":76,"context_line":"    __tablename__ \u003d \u0027role\u0027"},{"line_number":77,"context_line":"    attributes \u003d [\u0027id\u0027, \u0027name\u0027, \u0027created_at\u0027, \u0027updated_at\u0027]"}],"source_content_type":"text/x-python","patch_set":8,"id":"da86d52c_e8c1942f","line":74,"in_reply_to":"da86d52c_f446d7be","updated":"2015-02-13 06:17:47.000000000","message":"I am not sure what updated time stamp means: add timestamp to Role or convert timestamp to isotime?","commit_id":"ac19cb85759dc411c38c65612da5aece486129c5"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"78495c7acaf998e8c904b154304baa1e1dfb6727","unresolved":false,"context_lines":[{"line_number":22,"context_line":"        with sql.transaction() as session:"},{"line_number":23,"context_line":"            ref \u003d RoleTable.from_dict(role)"},{"line_number":24,"context_line":"            session.add(ref)"},{"line_number":25,"context_line":"        return ref.to_dict()"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    @sql.truncated"},{"line_number":28,"context_line":"    def list_roles(self, hints):"}],"source_content_type":"text/x-python","patch_set":10,"id":"da86d52c_a1f77758","line":25,"updated":"2015-02-16 09:55:58.000000000","message":"this seems an unrelated change","commit_id":"b5c95e491c808848aff52f6c511e436bc2bd9040"},{"author":{"_account_id":9101,"name":"wanghong","email":"reviewwanghong@126.com","username":"wanghong"},"change_message_id":"bd5bfd93556942cf852ac18c2747d704f9de39b0","unresolved":false,"context_lines":[{"line_number":22,"context_line":"        with sql.transaction() as session:"},{"line_number":23,"context_line":"            ref \u003d RoleTable.from_dict(role)"},{"line_number":24,"context_line":"            session.add(ref)"},{"line_number":25,"context_line":"        return ref.to_dict()"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    @sql.truncated"},{"line_number":28,"context_line":"    def list_roles(self, hints):"}],"source_content_type":"text/x-python","patch_set":10,"id":"da86d52c_10922e4b","line":25,"in_reply_to":"da86d52c_a1f77758","updated":"2015-02-17 01:31:24.000000000","message":"No, actually, we do need this. Because ref may be changed when exit with: if we return inside with the updated_at is None otherwise we can get updated_at. And all other sql modes return outside with except assignment modes.","commit_id":"b5c95e491c808848aff52f6c511e436bc2bd9040"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"78495c7acaf998e8c904b154304baa1e1dfb6727","unresolved":false,"context_lines":[{"line_number":63,"context_line":"                if attr !\u003d \u0027id\u0027:"},{"line_number":64,"context_line":"                    setattr(ref, attr, getattr(new_role, attr))"},{"line_number":65,"context_line":"            ref.extra \u003d new_role.extra"},{"line_number":66,"context_line":"        return ref.to_dict()"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    def delete_role(self, role_id):"},{"line_number":69,"context_line":"        with sql.transaction() as session:"}],"source_content_type":"text/x-python","patch_set":10,"id":"da86d52c_c1938bfe","line":66,"updated":"2015-02-16 09:55:58.000000000","message":"ditto","commit_id":"b5c95e491c808848aff52f6c511e436bc2bd9040"},{"author":{"_account_id":9101,"name":"wanghong","email":"reviewwanghong@126.com","username":"wanghong"},"change_message_id":"bd5bfd93556942cf852ac18c2747d704f9de39b0","unresolved":false,"context_lines":[{"line_number":63,"context_line":"                if attr !\u003d \u0027id\u0027:"},{"line_number":64,"context_line":"                    setattr(ref, attr, getattr(new_role, attr))"},{"line_number":65,"context_line":"            ref.extra \u003d new_role.extra"},{"line_number":66,"context_line":"        return ref.to_dict()"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    def delete_role(self, role_id):"},{"line_number":69,"context_line":"        with sql.transaction() as session:"}],"source_content_type":"text/x-python","patch_set":10,"id":"da86d52c_70c9aa59","line":66,"in_reply_to":"da86d52c_c1938bfe","updated":"2015-02-17 01:31:24.000000000","message":"See the comment of create_role.","commit_id":"b5c95e491c808848aff52f6c511e436bc2bd9040"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"78495c7acaf998e8c904b154304baa1e1dfb6727","unresolved":false,"context_lines":[{"line_number":74,"context_line":"class RoleTable(sql.ModelBase, sql.TimestampModelDictMixin,"},{"line_number":75,"context_line":"                sql.models.TimestampMixin):"},{"line_number":76,"context_line":"    __tablename__ \u003d \u0027role\u0027"},{"line_number":77,"context_line":"    attributes \u003d [\u0027id\u0027, \u0027name\u0027, \u0027created_at\u0027, \u0027updated_at\u0027]"},{"line_number":78,"context_line":"    id \u003d sql.Column(sql.String(64), primary_key\u003dTrue)"},{"line_number":79,"context_line":"    name \u003d sql.Column(sql.String(255), unique\u003dTrue, nullable\u003dFalse)"},{"line_number":80,"context_line":"    extra \u003d sql.Column(sql.JsonBlob())"}],"source_content_type":"text/x-python","patch_set":10,"id":"da86d52c_54259aac","line":77,"updated":"2015-02-16 09:55:58.000000000","message":"so at first glance it seems odd that these do not appear in the attributes below....it might be worth a comment (I assume there in sql.models.TimeStampMixin)","commit_id":"b5c95e491c808848aff52f6c511e436bc2bd9040"},{"author":{"_account_id":9101,"name":"wanghong","email":"reviewwanghong@126.com","username":"wanghong"},"change_message_id":"bd5bfd93556942cf852ac18c2747d704f9de39b0","unresolved":false,"context_lines":[{"line_number":74,"context_line":"class RoleTable(sql.ModelBase, sql.TimestampModelDictMixin,"},{"line_number":75,"context_line":"                sql.models.TimestampMixin):"},{"line_number":76,"context_line":"    __tablename__ \u003d \u0027role\u0027"},{"line_number":77,"context_line":"    attributes \u003d [\u0027id\u0027, \u0027name\u0027, \u0027created_at\u0027, \u0027updated_at\u0027]"},{"line_number":78,"context_line":"    id \u003d sql.Column(sql.String(64), primary_key\u003dTrue)"},{"line_number":79,"context_line":"    name \u003d sql.Column(sql.String(255), unique\u003dTrue, nullable\u003dFalse)"},{"line_number":80,"context_line":"    extra \u003d sql.Column(sql.JsonBlob())"}],"source_content_type":"text/x-python","patch_set":10,"id":"da86d52c_909d3e5a","line":77,"in_reply_to":"da86d52c_54259aac","updated":"2015-02-17 01:31:24.000000000","message":"Aha, yes!","commit_id":"b5c95e491c808848aff52f6c511e436bc2bd9040"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"3052877ca7cf27a69e098dedd19b67cd847ef1fb","unresolved":false,"context_lines":[{"line_number":22,"context_line":"        with sql.transaction() as session:"},{"line_number":23,"context_line":"            ref \u003d RoleTable.from_dict(role)"},{"line_number":24,"context_line":"            session.add(ref)"},{"line_number":25,"context_line":"            return ref.to_dict()"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    @sql.truncated"},{"line_number":28,"context_line":"    def list_roles(self, hints):"}],"source_content_type":"text/x-python","patch_set":15,"id":"9a80dd14_ba2430c7","side":"PARENT","line":25,"updated":"2015-03-04 13:31:40.000000000","message":"Why is this changing?","commit_id":"fb9954caede1e9b2896739ff95ed38b7ec49ad98"},{"author":{"_account_id":9101,"name":"wanghong","email":"reviewwanghong@126.com","username":"wanghong"},"change_message_id":"cb8f327d9d4ac3ed068a553b1d9c3765f0a3d1d8","unresolved":false,"context_lines":[{"line_number":22,"context_line":"        with sql.transaction() as session:"},{"line_number":23,"context_line":"            ref \u003d RoleTable.from_dict(role)"},{"line_number":24,"context_line":"            session.add(ref)"},{"line_number":25,"context_line":"            return ref.to_dict()"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    @sql.truncated"},{"line_number":28,"context_line":"    def list_roles(self, hints):"}],"source_content_type":"text/x-python","patch_set":15,"id":"9a80dd14_d1128b61","side":"PARENT","line":25,"in_reply_to":"9a80dd14_ba2430c7","updated":"2015-03-05 01:08:41.000000000","message":"Because ref may be changed when exit \u0027with\u0027. An example: if we return inside \u0027with\u0027 the updated_at is None, otherwise we can get updated_at. And all other sql modes return outside \u0027with\u0027 except assignment modes.","commit_id":"fb9954caede1e9b2896739ff95ed38b7ec49ad98"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"3052877ca7cf27a69e098dedd19b67cd847ef1fb","unresolved":false,"context_lines":[{"line_number":63,"context_line":"                if attr !\u003d \u0027id\u0027:"},{"line_number":64,"context_line":"                    setattr(ref, attr, getattr(new_role, attr))"},{"line_number":65,"context_line":"            ref.extra \u003d new_role.extra"},{"line_number":66,"context_line":"            return ref.to_dict()"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    def delete_role(self, role_id):"},{"line_number":69,"context_line":"        with sql.transaction() as session:"}],"source_content_type":"text/x-python","patch_set":15,"id":"9a80dd14_da21e4b5","side":"PARENT","line":66,"updated":"2015-03-04 13:31:40.000000000","message":"or this?","commit_id":"fb9954caede1e9b2896739ff95ed38b7ec49ad98"},{"author":{"_account_id":9101,"name":"wanghong","email":"reviewwanghong@126.com","username":"wanghong"},"change_message_id":"cb8f327d9d4ac3ed068a553b1d9c3765f0a3d1d8","unresolved":false,"context_lines":[{"line_number":63,"context_line":"                if attr !\u003d \u0027id\u0027:"},{"line_number":64,"context_line":"                    setattr(ref, attr, getattr(new_role, attr))"},{"line_number":65,"context_line":"            ref.extra \u003d new_role.extra"},{"line_number":66,"context_line":"            return ref.to_dict()"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    def delete_role(self, role_id):"},{"line_number":69,"context_line":"        with sql.transaction() as session:"}],"source_content_type":"text/x-python","patch_set":15,"id":"9a80dd14_31092732","side":"PARENT","line":66,"in_reply_to":"9a80dd14_da21e4b5","updated":"2015-03-05 01:08:41.000000000","message":"See comment in role.create_role.","commit_id":"fb9954caede1e9b2896739ff95ed38b7ec49ad98"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"382e34a8c44fb6b5a4c02e24d92144aa605856a4","unresolved":false,"context_lines":[{"line_number":22,"context_line":"        with sql.transaction() as session:"},{"line_number":23,"context_line":"            ref \u003d RoleTable.from_dict(role)"},{"line_number":24,"context_line":"            session.add(ref)"},{"line_number":25,"context_line":"        return ref.to_dict()"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    @sql.truncated"},{"line_number":28,"context_line":"    def list_roles(self, hints):"}],"source_content_type":"text/x-python","patch_set":19,"id":"3acd31a7_8c0a3020","line":25,"updated":"2015-05-04 11:22:03.000000000","message":"Please revert unrelated change.","commit_id":"353f9ffba28e7c8148a5cdbb550477731f3d666f"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"92e57fcd7689646fb321dfa296c4a9caf571e7a2","unresolved":false,"context_lines":[{"line_number":22,"context_line":"        with sql.transaction() as session:"},{"line_number":23,"context_line":"            ref \u003d RoleTable.from_dict(role)"},{"line_number":24,"context_line":"            session.add(ref)"},{"line_number":25,"context_line":"        return ref.to_dict()"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    @sql.truncated"},{"line_number":28,"context_line":"    def list_roles(self, hints):"}],"source_content_type":"text/x-python","patch_set":19,"id":"7a016987_986cdb09","line":25,"in_reply_to":"3acd31a7_8c0a3020","updated":"2015-05-26 23:28:47.000000000","message":"++","commit_id":"353f9ffba28e7c8148a5cdbb550477731f3d666f"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"92e57fcd7689646fb321dfa296c4a9caf571e7a2","unresolved":false,"context_lines":[{"line_number":63,"context_line":"                if attr !\u003d \u0027id\u0027:"},{"line_number":64,"context_line":"                    setattr(ref, attr, getattr(new_role, attr))"},{"line_number":65,"context_line":"            ref.extra \u003d new_role.extra"},{"line_number":66,"context_line":"        return ref.to_dict()"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    def delete_role(self, role_id):"},{"line_number":69,"context_line":"        with sql.transaction() as session:"}],"source_content_type":"text/x-python","patch_set":19,"id":"7a016987_b84e7794","line":66,"updated":"2015-05-26 23:28:47.000000000","message":"revert this too","commit_id":"353f9ffba28e7c8148a5cdbb550477731f3d666f"}],"keystone/common/controller.py":[{"author":{"_account_id":8533,"name":"Marcos Fermín Lobo","email":"lobo@lukos.org","username":"mlobo"},"change_message_id":"40fc6f5041c515f1e412066d587d75bc09074776","unresolved":false,"context_lines":[{"line_number":365,"context_line":"        return val"},{"line_number":366,"context_line":""},{"line_number":367,"context_line":"    @staticmethod"},{"line_number":368,"context_line":"    def timestamp2isotime(ref):"},{"line_number":369,"context_line":"        if ref.get(\u0027created_at\u0027) is not None:"},{"line_number":370,"context_line":"            ref[\u0027created_at\u0027] \u003d timeutils.isotime(ref[\u0027created_at\u0027],"},{"line_number":371,"context_line":"                                                  subsecond\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":5,"id":"da86d52c_1cfcd371","line":368,"updated":"2015-02-11 10:38:09.000000000","message":"I don\u0027t like this code duplicated here. I suggest create a new parent class (i.e. ControllerTimestamp) for V2Controller and V3Controller classes.\n\nclass ControllerTimestamp(wsgi.Application):\n# Here put timestamp2isotime function\n\nand change:\n\nclass V3Controller(wsgi.Application): -\u003e class V3Controller(ControllerTimestamp):\n\nclass V2Controller(wsgi.Application): -\u003e class V2Controller(ControllerTimestamp):\n\nI admit that \"ControllerTimestamp\" is not the best name for this proposal.","commit_id":"e8a6d5b342f7c51504610177333e61a2e1b1d607"}],"keystone/common/sql/core.py":[{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"9dd181b019d5e1bd096dbc8871327c4c2b78ddc1","unresolved":false,"context_lines":[{"line_number":163,"context_line":"            return d"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"        if d.get(\u0027created_at\u0027) is not None:"},{"line_number":166,"context_line":"            d[\u0027created_at\u0027] \u003d timeutils.isotime(d[\u0027created_at\u0027])"},{"line_number":167,"context_line":"        if d.get(\u0027updated_at\u0027) is not None:"},{"line_number":168,"context_line":"            d[\u0027updated_at\u0027] \u003d timeutils.isotime(d[\u0027updated_at\u0027])"},{"line_number":169,"context_line":"        return d"}],"source_content_type":"text/x-python","patch_set":9,"id":"da86d52c_73ae4631","line":166,"updated":"2015-02-15 04:28:50.000000000","message":"Where are these values set or updated? Or will that be in a follow on patch?","commit_id":"e6a7abb1d79e879f52f1fff4e93c41b9c8de1570"},{"author":{"_account_id":9101,"name":"wanghong","email":"reviewwanghong@126.com","username":"wanghong"},"change_message_id":"3e52074551f9ea009634599e9856cf6d60ad6f29","unresolved":false,"context_lines":[{"line_number":163,"context_line":"            return d"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"        if d.get(\u0027created_at\u0027) is not None:"},{"line_number":166,"context_line":"            d[\u0027created_at\u0027] \u003d timeutils.isotime(d[\u0027created_at\u0027])"},{"line_number":167,"context_line":"        if d.get(\u0027updated_at\u0027) is not None:"},{"line_number":168,"context_line":"            d[\u0027updated_at\u0027] \u003d timeutils.isotime(d[\u0027updated_at\u0027])"},{"line_number":169,"context_line":"        return d"}],"source_content_type":"text/x-python","patch_set":9,"id":"da86d52c_96cc8863","line":166,"in_reply_to":"da86d52c_73ae4631","updated":"2015-02-15 06:49:08.000000000","message":"Now we let Project and Role inherited from TimestampMixin: https://github.com/openstack/oslo.db/blob/master/oslo_db/sqlalchemy/models.py#L115 So, created_at and updated_at would auto added when creating or updating.","commit_id":"e6a7abb1d79e879f52f1fff4e93c41b9c8de1570"}],"keystone/common/sql/migrate_repo/versions/064_add_timestamp_to_project_and_role.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"d4fa5da4f231e910740f3974563cdd9f8f6cf07f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"da86d52c_501026a8","updated":"2015-02-10 08:26:42.000000000","message":"Are these reversed?","commit_id":"66c41530a7d0e1984b84d5c34235254164a06931"},{"author":{"_account_id":9101,"name":"wanghong","email":"reviewwanghong@126.com","username":"wanghong"},"change_message_id":"111699de3af97f6180ceaa9f723d83af3c7cfeff","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"da86d52c_76ce0285","in_reply_to":"da86d52c_501026a8","updated":"2015-02-10 09:12:26.000000000","message":"Yes... But, I don\u0027t know why tests such as test_sql_upgrade, test_v3_assignment, test_backend_sql passed in local. I will find the reason.","commit_id":"66c41530a7d0e1984b84d5c34235254164a06931"},{"author":{"_account_id":9101,"name":"wanghong","email":"reviewwanghong@126.com","username":"wanghong"},"change_message_id":"46635ae16da594195d0dfe3a487e7325b734a1a5","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"da86d52c_f639aea4","in_reply_to":"da86d52c_56227aa3","updated":"2015-02-12 07:51:46.000000000","message":"And I think the reason of test_v3_assignment, test_backend_sql passed is that although Project and Role don\u0027t have created_at and updated_at columns, created_at and updated_at can be saved in extra column...","commit_id":"66c41530a7d0e1984b84d5c34235254164a06931"},{"author":{"_account_id":9101,"name":"wanghong","email":"reviewwanghong@126.com","username":"wanghong"},"change_message_id":"4a0ed9b5a3610344a9d8cfd1a67b51cb26f5481d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"da86d52c_56227aa3","in_reply_to":"da86d52c_76ce0285","updated":"2015-02-12 07:46:49.000000000","message":"I have found one... https://bugs.launchpad.net/keystone/+bug/1421092","commit_id":"66c41530a7d0e1984b84d5c34235254164a06931"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"78495c7acaf998e8c904b154304baa1e1dfb6727","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    project_table \u003d sql.Table(_PROJECT_TABLE_NAME, meta, autoload\u003dTrue)"},{"line_number":41,"context_line":"    project_table.drop_column(\u0027created_at\u0027)"},{"line_number":42,"context_line":"    project_table.drop_column(\u0027updated_at\u0027)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    role_table \u003d sql.Table(_ROLE_TABLE_NAME, meta, autoload\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":10,"id":"da86d52c_b146e879","line":41,"updated":"2015-02-16 09:55:58.000000000","message":"will this really work with sqlite?  I don\u0027t think it supports drop column...(at least not really...it appears to work but hasn\u0027t really dropped the column).  Earlier migrations had to use the \"create a new table without the columns you want to drop, copy the data and then rename the table\" approach.","commit_id":"b5c95e491c808848aff52f6c511e436bc2bd9040"},{"author":{"_account_id":9101,"name":"wanghong","email":"reviewwanghong@126.com","username":"wanghong"},"change_message_id":"bd5bfd93556942cf852ac18c2747d704f9de39b0","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    project_table \u003d sql.Table(_PROJECT_TABLE_NAME, meta, autoload\u003dTrue)"},{"line_number":41,"context_line":"    project_table.drop_column(\u0027created_at\u0027)"},{"line_number":42,"context_line":"    project_table.drop_column(\u0027updated_at\u0027)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    role_table \u003d sql.Table(_ROLE_TABLE_NAME, meta, autoload\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":10,"id":"da86d52c_309f3205","line":41,"in_reply_to":"da86d52c_b146e879","updated":"2015-02-17 01:31:24.000000000","message":"Could you give me an example? A lot of migrations use this method to drop column...","commit_id":"b5c95e491c808848aff52f6c511e436bc2bd9040"}],"keystone/common/sql/migrate_repo/versions/066_add_timestamp_to_project_and_role.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"3052877ca7cf27a69e098dedd19b67cd847ef1fb","unresolved":false,"context_lines":[{"line_number":11,"context_line":"# under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"import sqlalchemy as sql"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"_PROJECT_TABLE_NAME \u003d \u0027project\u0027"},{"line_number":16,"context_line":"_ROLE_TABLE_NAME \u003d \u0027role\u0027"},{"line_number":17,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"9a80dd14_da080430","line":14,"updated":"2015-03-04 13:31:40.000000000","message":"needs newline","commit_id":"c279cce6e20a4cfa8ba8f23fe277fb0935ca773b"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"3052877ca7cf27a69e098dedd19b67cd847ef1fb","unresolved":false,"context_lines":[{"line_number":20,"context_line":"    meta \u003d sql.MetaData()"},{"line_number":21,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    project_create_at_column \u003d sql.Column(\u0027created_at\u0027, sql.DateTime())"},{"line_number":24,"context_line":"    project_udpate_at_column \u003d sql.Column(\u0027updated_at\u0027, sql.DateTime())"},{"line_number":25,"context_line":"    project_table \u003d sql.Table(_PROJECT_TABLE_NAME, meta, autoload\u003dTrue)"},{"line_number":26,"context_line":"    project_table.create_column(project_create_at_column)"}],"source_content_type":"text/x-python","patch_set":15,"id":"9a80dd14_552b0782","line":23,"updated":"2015-03-04 13:31:40.000000000","message":"(nit) I think this extra verbosity is harder to read than just:\n\n    role_table.create_column(sql.Column(\u0027created_at\u0027, sql.DateTime()))","commit_id":"c279cce6e20a4cfa8ba8f23fe277fb0935ca773b"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"382e34a8c44fb6b5a4c02e24d92144aa605856a4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":19,"id":"3acd31a7_ac2a8c7c","updated":"2015-05-04 11:22:03.000000000","message":"We already have a migration 066, the next one should be 073.","commit_id":"353f9ffba28e7c8148a5cdbb550477731f3d666f"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"156e4f6a92269198bc382cba7af63dd111cf6b2f","unresolved":false,"context_lines":[{"line_number":30,"context_line":"    role_table.create_column(sql.Column(\u0027updated_at\u0027, sql.DateTime()))"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"def downgrade(migrate_engine):"},{"line_number":34,"context_line":"    meta \u003d sql.MetaData()"},{"line_number":35,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":36,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"3acd31a7_0e2755b7","line":33,"updated":"2015-05-01 16:04:11.000000000","message":"We don\u0027t support downgrades anymore do we?","commit_id":"353f9ffba28e7c8148a5cdbb550477731f3d666f"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"382e34a8c44fb6b5a4c02e24d92144aa605856a4","unresolved":false,"context_lines":[{"line_number":30,"context_line":"    role_table.create_column(sql.Column(\u0027updated_at\u0027, sql.DateTime()))"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"def downgrade(migrate_engine):"},{"line_number":34,"context_line":"    meta \u003d sql.MetaData()"},{"line_number":35,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":36,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"3acd31a7_b11c2378","line":33,"in_reply_to":"3acd31a7_0e2755b7","updated":"2015-05-04 11:22:03.000000000","message":"No we don\u0027t, please remove this.","commit_id":"353f9ffba28e7c8148a5cdbb550477731f3d666f"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"92e57fcd7689646fb321dfa296c4a9caf571e7a2","unresolved":false,"context_lines":[{"line_number":30,"context_line":"    role_table.create_column(sql.Column(\u0027updated_at\u0027, sql.DateTime()))"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"def downgrade(migrate_engine):"},{"line_number":34,"context_line":"    meta \u003d sql.MetaData()"},{"line_number":35,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":36,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"7a016987_182fcba2","line":33,"in_reply_to":"3acd31a7_b11c2378","updated":"2015-05-26 23:28:47.000000000","message":"++","commit_id":"353f9ffba28e7c8148a5cdbb550477731f3d666f"}],"keystone/resource/backends/sql.py":[{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"c9775b13e4c0c115f07e1c4dbc225c63a7e977c0","unresolved":false,"context_lines":[{"line_number":142,"context_line":"        with sql.transaction() as session:"},{"line_number":143,"context_line":"            tenant_ref \u003d Project.from_dict(tenant)"},{"line_number":144,"context_line":"            session.add(tenant_ref)"},{"line_number":145,"context_line":"        with sql.transaction() as session:"},{"line_number":146,"context_line":"            tenant_ref \u003d self._get_project(session, tenant_id)"},{"line_number":147,"context_line":"            return tenant_ref.to_dict()"},{"line_number":148,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"da86d52c_cedf9c0b","line":145,"updated":"2015-02-12 15:28:04.000000000","message":"i don\u0027t understand why you are adding another transaction here, and why actually reading data from the db since you seem to have it available in memory.","commit_id":"2e9f4fe8f52c4ff2de2a38ffd5d770fbddccf708"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"78495c7acaf998e8c904b154304baa1e1dfb6727","unresolved":false,"context_lines":[{"line_number":142,"context_line":"        with sql.transaction() as session:"},{"line_number":143,"context_line":"            tenant_ref \u003d Project.from_dict(tenant)"},{"line_number":144,"context_line":"            session.add(tenant_ref)"},{"line_number":145,"context_line":"        return tenant_ref.to_dict()"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"    @sql.handle_conflicts(conflict_type\u003d\u0027project\u0027)"},{"line_number":148,"context_line":"    def update_project(self, tenant_id, tenant):"}],"source_content_type":"text/x-python","patch_set":10,"id":"da86d52c_c148eb8c","line":145,"updated":"2015-02-16 09:55:58.000000000","message":"unrelated?","commit_id":"b5c95e491c808848aff52f6c511e436bc2bd9040"},{"author":{"_account_id":9101,"name":"wanghong","email":"reviewwanghong@126.com","username":"wanghong"},"change_message_id":"bd5bfd93556942cf852ac18c2747d704f9de39b0","unresolved":false,"context_lines":[{"line_number":142,"context_line":"        with sql.transaction() as session:"},{"line_number":143,"context_line":"            tenant_ref \u003d Project.from_dict(tenant)"},{"line_number":144,"context_line":"            session.add(tenant_ref)"},{"line_number":145,"context_line":"        return tenant_ref.to_dict()"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"    @sql.handle_conflicts(conflict_type\u003d\u0027project\u0027)"},{"line_number":148,"context_line":"    def update_project(self, tenant_id, tenant):"}],"source_content_type":"text/x-python","patch_set":10,"id":"da86d52c_f0dcba1a","line":145,"in_reply_to":"da86d52c_c148eb8c","updated":"2015-02-17 01:31:24.000000000","message":"See the comment of create_role.","commit_id":"b5c95e491c808848aff52f6c511e436bc2bd9040"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"78495c7acaf998e8c904b154304baa1e1dfb6727","unresolved":false,"context_lines":[{"line_number":159,"context_line":"                if attr !\u003d \u0027id\u0027:"},{"line_number":160,"context_line":"                    setattr(tenant_ref, attr, getattr(new_project, attr))"},{"line_number":161,"context_line":"            tenant_ref.extra \u003d new_project.extra"},{"line_number":162,"context_line":"        return tenant_ref.to_dict(include_extra_dict\u003dTrue)"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"    @sql.handle_conflicts(conflict_type\u003d\u0027project\u0027)"},{"line_number":165,"context_line":"    def delete_project(self, tenant_id):"}],"source_content_type":"text/x-python","patch_set":10,"id":"da86d52c_0143e36c","line":162,"updated":"2015-02-16 09:55:58.000000000","message":"unrelated?","commit_id":"b5c95e491c808848aff52f6c511e436bc2bd9040"},{"author":{"_account_id":9101,"name":"wanghong","email":"reviewwanghong@126.com","username":"wanghong"},"change_message_id":"bd5bfd93556942cf852ac18c2747d704f9de39b0","unresolved":false,"context_lines":[{"line_number":159,"context_line":"                if attr !\u003d \u0027id\u0027:"},{"line_number":160,"context_line":"                    setattr(tenant_ref, attr, getattr(new_project, attr))"},{"line_number":161,"context_line":"            tenant_ref.extra \u003d new_project.extra"},{"line_number":162,"context_line":"        return tenant_ref.to_dict(include_extra_dict\u003dTrue)"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"    @sql.handle_conflicts(conflict_type\u003d\u0027project\u0027)"},{"line_number":165,"context_line":"    def delete_project(self, tenant_id):"}],"source_content_type":"text/x-python","patch_set":10,"id":"da86d52c_b0c32237","line":162,"in_reply_to":"da86d52c_0143e36c","updated":"2015-02-17 01:31:24.000000000","message":"See the comment of create_role.","commit_id":"b5c95e491c808848aff52f6c511e436bc2bd9040"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"3052877ca7cf27a69e098dedd19b67cd847ef1fb","unresolved":false,"context_lines":[{"line_number":143,"context_line":"        with sql.transaction() as session:"},{"line_number":144,"context_line":"            tenant_ref \u003d Project.from_dict(tenant)"},{"line_number":145,"context_line":"            session.add(tenant_ref)"},{"line_number":146,"context_line":"            return tenant_ref.to_dict()"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"    @sql.handle_conflicts(conflict_type\u003d\u0027project\u0027)"},{"line_number":149,"context_line":"    def update_project(self, tenant_id, tenant):"}],"source_content_type":"text/x-python","patch_set":15,"id":"9a80dd14_d53617e7","side":"PARENT","line":146,"updated":"2015-03-04 13:31:40.000000000","message":"Why is this changed?","commit_id":"fb9954caede1e9b2896739ff95ed38b7ec49ad98"},{"author":{"_account_id":9101,"name":"wanghong","email":"reviewwanghong@126.com","username":"wanghong"},"change_message_id":"cb8f327d9d4ac3ed068a553b1d9c3765f0a3d1d8","unresolved":false,"context_lines":[{"line_number":143,"context_line":"        with sql.transaction() as session:"},{"line_number":144,"context_line":"            tenant_ref \u003d Project.from_dict(tenant)"},{"line_number":145,"context_line":"            session.add(tenant_ref)"},{"line_number":146,"context_line":"            return tenant_ref.to_dict()"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"    @sql.handle_conflicts(conflict_type\u003d\u0027project\u0027)"},{"line_number":149,"context_line":"    def update_project(self, tenant_id, tenant):"}],"source_content_type":"text/x-python","patch_set":15,"id":"9a80dd14_f5ff7aff","side":"PARENT","line":146,"in_reply_to":"9a80dd14_d53617e7","updated":"2015-03-05 01:08:41.000000000","message":"See comment in role.create_role.","commit_id":"fb9954caede1e9b2896739ff95ed38b7ec49ad98"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"3052877ca7cf27a69e098dedd19b67cd847ef1fb","unresolved":false,"context_lines":[{"line_number":160,"context_line":"                if attr !\u003d \u0027id\u0027:"},{"line_number":161,"context_line":"                    setattr(tenant_ref, attr, getattr(new_project, attr))"},{"line_number":162,"context_line":"            tenant_ref.extra \u003d new_project.extra"},{"line_number":163,"context_line":"        return tenant_ref.to_dict(include_extra_dict\u003dTrue)"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"    @sql.handle_conflicts(conflict_type\u003d\u0027project\u0027)"},{"line_number":166,"context_line":"    def delete_project(self, tenant_id):"}],"source_content_type":"text/x-python","patch_set":15,"id":"9a80dd14_15318fec","line":163,"updated":"2015-03-04 13:31:40.000000000","message":"or this?","commit_id":"c279cce6e20a4cfa8ba8f23fe277fb0935ca773b"},{"author":{"_account_id":9101,"name":"wanghong","email":"reviewwanghong@126.com","username":"wanghong"},"change_message_id":"cb8f327d9d4ac3ed068a553b1d9c3765f0a3d1d8","unresolved":false,"context_lines":[{"line_number":160,"context_line":"                if attr !\u003d \u0027id\u0027:"},{"line_number":161,"context_line":"                    setattr(tenant_ref, attr, getattr(new_project, attr))"},{"line_number":162,"context_line":"            tenant_ref.extra \u003d new_project.extra"},{"line_number":163,"context_line":"        return tenant_ref.to_dict(include_extra_dict\u003dTrue)"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"    @sql.handle_conflicts(conflict_type\u003d\u0027project\u0027)"},{"line_number":166,"context_line":"    def delete_project(self, tenant_id):"}],"source_content_type":"text/x-python","patch_set":15,"id":"9a80dd14_1505ee10","line":163,"in_reply_to":"9a80dd14_15318fec","updated":"2015-03-05 01:08:41.000000000","message":"See comment in role.create_role.","commit_id":"c279cce6e20a4cfa8ba8f23fe277fb0935ca773b"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"382e34a8c44fb6b5a4c02e24d92144aa605856a4","unresolved":false,"context_lines":[{"line_number":143,"context_line":"        with sql.transaction() as session:"},{"line_number":144,"context_line":"            tenant_ref \u003d Project.from_dict(tenant)"},{"line_number":145,"context_line":"            session.add(tenant_ref)"},{"line_number":146,"context_line":"        return tenant_ref.to_dict()"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"    @sql.handle_conflicts(conflict_type\u003d\u0027project\u0027)"},{"line_number":149,"context_line":"    def update_project(self, tenant_id, tenant):"}],"source_content_type":"text/x-python","patch_set":19,"id":"3acd31a7_8c2110a2","line":146,"updated":"2015-05-04 11:22:03.000000000","message":"Please revert unrelated change.","commit_id":"353f9ffba28e7c8148a5cdbb550477731f3d666f"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"92e57fcd7689646fb321dfa296c4a9caf571e7a2","unresolved":false,"context_lines":[{"line_number":143,"context_line":"        with sql.transaction() as session:"},{"line_number":144,"context_line":"            tenant_ref \u003d Project.from_dict(tenant)"},{"line_number":145,"context_line":"            session.add(tenant_ref)"},{"line_number":146,"context_line":"        return tenant_ref.to_dict()"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"    @sql.handle_conflicts(conflict_type\u003d\u0027project\u0027)"},{"line_number":149,"context_line":"    def update_project(self, tenant_id, tenant):"}],"source_content_type":"text/x-python","patch_set":19,"id":"7a016987_f82bcf92","line":146,"in_reply_to":"3acd31a7_8c2110a2","updated":"2015-05-26 23:28:47.000000000","message":"++","commit_id":"353f9ffba28e7c8148a5cdbb550477731f3d666f"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"382e34a8c44fb6b5a4c02e24d92144aa605856a4","unresolved":false,"context_lines":[{"line_number":160,"context_line":"                if attr !\u003d \u0027id\u0027:"},{"line_number":161,"context_line":"                    setattr(tenant_ref, attr, getattr(new_project, attr))"},{"line_number":162,"context_line":"            tenant_ref.extra \u003d new_project.extra"},{"line_number":163,"context_line":"        return tenant_ref.to_dict(include_extra_dict\u003dTrue)"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"    @sql.handle_conflicts(conflict_type\u003d\u0027project\u0027)"},{"line_number":166,"context_line":"    def delete_project(self, tenant_id):"}],"source_content_type":"text/x-python","patch_set":19,"id":"3acd31a7_6c2474ae","line":163,"updated":"2015-05-04 11:22:03.000000000","message":"Please revert unrelated change.","commit_id":"353f9ffba28e7c8148a5cdbb550477731f3d666f"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"92e57fcd7689646fb321dfa296c4a9caf571e7a2","unresolved":false,"context_lines":[{"line_number":160,"context_line":"                if attr !\u003d \u0027id\u0027:"},{"line_number":161,"context_line":"                    setattr(tenant_ref, attr, getattr(new_project, attr))"},{"line_number":162,"context_line":"            tenant_ref.extra \u003d new_project.extra"},{"line_number":163,"context_line":"        return tenant_ref.to_dict(include_extra_dict\u003dTrue)"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"    @sql.handle_conflicts(conflict_type\u003d\u0027project\u0027)"},{"line_number":166,"context_line":"    def delete_project(self, tenant_id):"}],"source_content_type":"text/x-python","patch_set":19,"id":"7a016987_b81c3778","line":163,"in_reply_to":"3acd31a7_6c2474ae","updated":"2015-05-26 23:28:47.000000000","message":"++","commit_id":"353f9ffba28e7c8148a5cdbb550477731f3d666f"}],"keystone/tests/test_backend.py":[{"author":{"_account_id":8533,"name":"Marcos Fermín Lobo","email":"lobo@lukos.org","username":"mlobo"},"change_message_id":"40fc6f5041c515f1e412066d587d75bc09074776","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":"class IdentityTests(object):"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    _timestamp_enabled \u003d True"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def _get_domain_fixture(self):"},{"line_number":47,"context_line":"        domain \u003d {\u0027id\u0027: uuid.uuid4().hex, \u0027name\u0027: uuid.uuid4().hex}"}],"source_content_type":"text/x-python","patch_set":5,"id":"da86d52c_bc43c7ad","line":44,"updated":"2015-02-11 10:38:09.000000000","message":"Could we get that \u0027True\u0027 from default_fixtures file?. I don\u0027t know if my point is a good idea...","commit_id":"e8a6d5b342f7c51504610177333e61a2e1b1d607"},{"author":{"_account_id":9101,"name":"wanghong","email":"reviewwanghong@126.com","username":"wanghong"},"change_message_id":"e300c29c0a34f14cc10e533846b5c13f71e7bb35","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":"class IdentityTests(object):"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    _timestamp_enabled \u003d True"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def _get_domain_fixture(self):"},{"line_number":47,"context_line":"        domain \u003d {\u0027id\u0027: uuid.uuid4().hex, \u0027name\u0027: uuid.uuid4().hex}"}],"source_content_type":"text/x-python","patch_set":5,"id":"da86d52c_f109c131","line":44,"in_reply_to":"da86d52c_bc43c7ad","updated":"2015-02-12 01:57:44.000000000","message":"I don\u0027t think this is a good idea too:) I just want to treat this parameter as a class member variable.","commit_id":"e8a6d5b342f7c51504610177333e61a2e1b1d607"}],"keystone/tests/unit/backend/role/core.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"92e57fcd7689646fb321dfa296c4a9caf571e7a2","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from keystone.tests.unit import default_fixtures"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"class RoleTests(tests.ModelBase):"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    def test_get_role_404(self):"},{"line_number":26,"context_line":"        self.assertRaises(exception.RoleNotFound,"}],"source_content_type":"text/x-python","patch_set":19,"id":"7a016987_9b08552a","line":23,"updated":"2015-05-26 23:28:47.000000000","message":"This is wrong. If you are doing this just to use assert* methods then they should be moved out of the ModelBase class and maybe into functions.","commit_id":"353f9ffba28e7c8148a5cdbb550477731f3d666f"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"473c94baa9f9b25ddf29b620f1d3b9c8f1294c22","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        role_ref \u003d self.role_api.get_role(role[\u0027id\u0027])"},{"line_number":67,"context_line":"        role_ref_dict \u003d {x: role_ref[x] for x in role_ref}"},{"line_number":68,"context_line":"        self.assertRoleEqual(role_ref_dict, role)"},{"line_number":69,"context_line":"        self.assertDictEqual(updated_role_ref, role_ref_dict)"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"        self.role_api.delete_role(role[\u0027id\u0027])"},{"line_number":72,"context_line":"        self.assertRaises(exception.RoleNotFound,"}],"source_content_type":"text/x-python","patch_set":19,"id":"9a0c5dc1_4786aeba","line":69,"updated":"2015-05-12 01:13:22.000000000","message":"Why you need to invert the parameters order?\n\nthis comment repeat in all the class.","commit_id":"353f9ffba28e7c8148a5cdbb550477731f3d666f"}],"keystone/tests/unit/test_backend.py":[{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"78495c7acaf998e8c904b154304baa1e1dfb6727","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":"class IdentityTests(object):"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    _timestamp_enabled \u003d True"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def _get_domain_fixture(self):"},{"line_number":47,"context_line":"        domain \u003d {\u0027id\u0027: uuid.uuid4().hex, \u0027name\u0027: uuid.uuid4().hex}"}],"source_content_type":"text/x-python","patch_set":10,"id":"da86d52c_b100a867","line":44,"updated":"2015-02-16 09:55:58.000000000","message":"I don\u0027t think we ever unset this, do we?  Looks a bit like old test code....","commit_id":"b5c95e491c808848aff52f6c511e436bc2bd9040"},{"author":{"_account_id":9101,"name":"wanghong","email":"reviewwanghong@126.com","username":"wanghong"},"change_message_id":"bd5bfd93556942cf852ac18c2747d704f9de39b0","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":"class IdentityTests(object):"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    _timestamp_enabled \u003d True"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def _get_domain_fixture(self):"},{"line_number":47,"context_line":"        domain \u003d {\u0027id\u0027: uuid.uuid4().hex, \u0027name\u0027: uuid.uuid4().hex}"}],"source_content_type":"text/x-python","patch_set":10,"id":"da86d52c_9020def9","line":44,"in_reply_to":"da86d52c_b100a867","updated":"2015-02-17 01:31:24.000000000","message":"We will unset it in BaseLDAPIdentity object. I think we can remove this when we remove ldap assignment.","commit_id":"b5c95e491c808848aff52f6c511e436bc2bd9040"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"78495c7acaf998e8c904b154304baa1e1dfb6727","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        if CONF.identity.domain_specific_drivers_enabled:"},{"line_number":54,"context_line":"            return domain_id"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    def _clean_up_timestamp(self, ref):"},{"line_number":57,"context_line":"        if self._timestamp_enabled:"},{"line_number":58,"context_line":"            del ref[\u0027created_at\u0027]"},{"line_number":59,"context_line":"            del ref[\u0027updated_at\u0027]"}],"source_content_type":"text/x-python","patch_set":10,"id":"da86d52c_f138603d","line":56,"updated":"2015-02-16 09:55:58.000000000","message":"strip_off?","commit_id":"b5c95e491c808848aff52f6c511e436bc2bd9040"},{"author":{"_account_id":9101,"name":"wanghong","email":"reviewwanghong@126.com","username":"wanghong"},"change_message_id":"bd5bfd93556942cf852ac18c2747d704f9de39b0","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        if CONF.identity.domain_specific_drivers_enabled:"},{"line_number":54,"context_line":"            return domain_id"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    def _clean_up_timestamp(self, ref):"},{"line_number":57,"context_line":"        if self._timestamp_enabled:"},{"line_number":58,"context_line":"            del ref[\u0027created_at\u0027]"},{"line_number":59,"context_line":"            del ref[\u0027updated_at\u0027]"}],"source_content_type":"text/x-python","patch_set":10,"id":"da86d52c_d01a56c5","line":56,"in_reply_to":"da86d52c_f138603d","updated":"2015-02-17 01:31:24.000000000","message":"Sounds good!","commit_id":"b5c95e491c808848aff52f6c511e436bc2bd9040"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"78495c7acaf998e8c904b154304baa1e1dfb6727","unresolved":false,"context_lines":[{"line_number":54,"context_line":"            return domain_id"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    def _clean_up_timestamp(self, ref):"},{"line_number":57,"context_line":"        if self._timestamp_enabled:"},{"line_number":58,"context_line":"            del ref[\u0027created_at\u0027]"},{"line_number":59,"context_line":"            del ref[\u0027updated_at\u0027]"},{"line_number":60,"context_line":"        return ref"}],"source_content_type":"text/x-python","patch_set":10,"id":"da86d52c_11f17495","line":57,"updated":"2015-02-16 09:55:58.000000000","message":"will this ever be false?  You could del these fields only if they exist?","commit_id":"b5c95e491c808848aff52f6c511e436bc2bd9040"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"92e57fcd7689646fb321dfa296c4a9caf571e7a2","unresolved":false,"context_lines":[{"line_number":39,"context_line":"NULL_OBJECT \u003d object()"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"class IdentityTests(tests.ModelBase):"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def _get_domain_fixture(self):"},{"line_number":45,"context_line":"        domain \u003d {\u0027id\u0027: uuid.uuid4().hex, \u0027name\u0027: uuid.uuid4().hex}"}],"source_content_type":"text/x-python","patch_set":19,"id":"7a016987_db25adae","line":42,"updated":"2015-05-26 23:28:47.000000000","message":"Same thing here","commit_id":"353f9ffba28e7c8148a5cdbb550477731f3d666f"}],"keystone/tests/unit/test_sql_upgrade.py":[{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"699edf8d6411510ddd5cd8bbf977f260febc4e1c","unresolved":false,"context_lines":[{"line_number":1474,"context_line":"        self.assertTableColumns(\u0027project\u0027,"},{"line_number":1475,"context_line":"                                [\u0027id\u0027, \u0027name\u0027, \u0027extra\u0027, \u0027description\u0027,"},{"line_number":1476,"context_line":"                                 \u0027enabled\u0027, \u0027domain_id\u0027])"},{"line_number":1477,"context_line":""},{"line_number":1478,"context_line":"    def test_project_parent_id_cleanup(self):"},{"line_number":1479,"context_line":"        # make sure that the parent_id field is dropped in the downgrade"},{"line_number":1480,"context_line":"        self.upgrade(61)"}],"source_content_type":"text/x-python","patch_set":15,"id":"9a80dd14_511dcdbc","line":1477,"updated":"2015-03-04 17:52:56.000000000","message":"cleanup test example","commit_id":"c279cce6e20a4cfa8ba8f23fe277fb0935ca773b"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"699edf8d6411510ddd5cd8bbf977f260febc4e1c","unresolved":false,"context_lines":[{"line_number":1585,"context_line":"                                [\u0027id\u0027, \u0027name\u0027, \u0027domain_id\u0027, \u0027description\u0027,"},{"line_number":1586,"context_line":"                                 \u0027enabled\u0027, \u0027parent_id\u0027, \u0027extra\u0027])"},{"line_number":1587,"context_line":"        self.assertTableColumns(\u0027role\u0027,"},{"line_number":1588,"context_line":"                                [\u0027id\u0027, \u0027name\u0027, \u0027extra\u0027])"},{"line_number":1589,"context_line":""},{"line_number":1590,"context_line":"    def populate_user_table(self, with_pass_enab\u003dFalse,"},{"line_number":1591,"context_line":"                            with_pass_enab_domain\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":15,"id":"9a80dd14_5146adc0","line":1588,"updated":"2015-03-04 17:52:56.000000000","message":"could you add a cleanup test? Like the one marked above.","commit_id":"c279cce6e20a4cfa8ba8f23fe277fb0935ca773b"},{"author":{"_account_id":9101,"name":"wanghong","email":"reviewwanghong@126.com","username":"wanghong"},"change_message_id":"cb8f327d9d4ac3ed068a553b1d9c3765f0a3d1d8","unresolved":false,"context_lines":[{"line_number":1585,"context_line":"                                [\u0027id\u0027, \u0027name\u0027, \u0027domain_id\u0027, \u0027description\u0027,"},{"line_number":1586,"context_line":"                                 \u0027enabled\u0027, \u0027parent_id\u0027, \u0027extra\u0027])"},{"line_number":1587,"context_line":"        self.assertTableColumns(\u0027role\u0027,"},{"line_number":1588,"context_line":"                                [\u0027id\u0027, \u0027name\u0027, \u0027extra\u0027])"},{"line_number":1589,"context_line":""},{"line_number":1590,"context_line":"    def populate_user_table(self, with_pass_enab\u003dFalse,"},{"line_number":1591,"context_line":"                            with_pass_enab_domain\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":15,"id":"9a80dd14_753aaace","line":1588,"in_reply_to":"9a80dd14_5146adc0","updated":"2015-03-05 01:08:41.000000000","message":"Sure.","commit_id":"c279cce6e20a4cfa8ba8f23fe277fb0935ca773b"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"156e4f6a92269198bc382cba7af63dd111cf6b2f","unresolved":false,"context_lines":[{"line_number":698,"context_line":"                                [\u0027id\u0027, \u0027name\u0027, \u0027extra\u0027])"},{"line_number":699,"context_line":""},{"line_number":700,"context_line":"    def test_project_and_role_timestamp_cleanup(self):"},{"line_number":701,"context_line":"        # make sure that the timestamp fields are dropped in the downgrade"},{"line_number":702,"context_line":"        self.upgrade(66)"},{"line_number":703,"context_line":"        session \u003d self.Session()"},{"line_number":704,"context_line":"        project \u003d {"}],"source_content_type":"text/x-python","patch_set":19,"id":"3acd31a7_0e5f55e6","line":701,"updated":"2015-05-01 16:04:11.000000000","message":"do we test downgrades anymore?","commit_id":"353f9ffba28e7c8148a5cdbb550477731f3d666f"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"382e34a8c44fb6b5a4c02e24d92144aa605856a4","unresolved":false,"context_lines":[{"line_number":698,"context_line":"                                [\u0027id\u0027, \u0027name\u0027, \u0027extra\u0027])"},{"line_number":699,"context_line":""},{"line_number":700,"context_line":"    def test_project_and_role_timestamp_cleanup(self):"},{"line_number":701,"context_line":"        # make sure that the timestamp fields are dropped in the downgrade"},{"line_number":702,"context_line":"        self.upgrade(66)"},{"line_number":703,"context_line":"        session \u003d self.Session()"},{"line_number":704,"context_line":"        project \u003d {"}],"source_content_type":"text/x-python","patch_set":19,"id":"3acd31a7_1108772b","line":701,"in_reply_to":"3acd31a7_0e5f55e6","updated":"2015-05-04 11:22:03.000000000","message":"No, this test should be removed as well.","commit_id":"353f9ffba28e7c8148a5cdbb550477731f3d666f"}],"keystone/tests/unit/test_v2_controller.py":[{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"9dd181b019d5e1bd096dbc8871327c4c2b78ddc1","unresolved":false,"context_lines":[{"line_number":89,"context_line":"        # default domain."},{"line_number":90,"context_line":"        refs \u003d self.tenant_controller.get_all_projects(_ADMIN_CONTEXT)"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"        def _clean_up_timestamp(ref):"},{"line_number":93,"context_line":"            del ref[\u0027created_at\u0027]"},{"line_number":94,"context_line":"            del ref[\u0027updated_at\u0027]"},{"line_number":95,"context_line":"            return ref"}],"source_content_type":"text/x-python","patch_set":9,"id":"da86d52c_33e76eae","line":92,"updated":"2015-02-15 04:28:50.000000000","message":"why is this extra cleanup necesary?","commit_id":"e6a7abb1d79e879f52f1fff4e93c41b9c8de1570"},{"author":{"_account_id":9101,"name":"wanghong","email":"reviewwanghong@126.com","username":"wanghong"},"change_message_id":"3e52074551f9ea009634599e9856cf6d60ad6f29","unresolved":false,"context_lines":[{"line_number":89,"context_line":"        # default domain."},{"line_number":90,"context_line":"        refs \u003d self.tenant_controller.get_all_projects(_ADMIN_CONTEXT)"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"        def _clean_up_timestamp(ref):"},{"line_number":93,"context_line":"            del ref[\u0027created_at\u0027]"},{"line_number":94,"context_line":"            del ref[\u0027updated_at\u0027]"},{"line_number":95,"context_line":"            return ref"}],"source_content_type":"text/x-python","patch_set":9,"id":"da86d52c_36af5c7f","line":92,"in_reply_to":"da86d52c_33e76eae","updated":"2015-02-15 06:49:08.000000000","message":"We can\u0027t know the value of created_at and updated_at. Because they are auto added when creating or updating.","commit_id":"e6a7abb1d79e879f52f1fff4e93c41b9c8de1570"}],"keystone/tests/unit/test_v3_assignment.py":[{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"78495c7acaf998e8c904b154304baa1e1dfb6727","unresolved":false,"context_lines":[{"line_number":738,"context_line":"        self.patch("},{"line_number":739,"context_line":"            \u0027/projects/%(project_id)s\u0027 % {"},{"line_number":740,"context_line":"                \u0027project_id\u0027: leaf_project[\u0027id\u0027]},"},{"line_number":741,"context_line":"            body\u003d{\u0027project\u0027: {\u0027parent_id\u0027: None}},"},{"line_number":742,"context_line":"            expected_status\u003d403)"},{"line_number":743,"context_line":""},{"line_number":744,"context_line":"    def test_disable_leaf_project(self):"}],"source_content_type":"text/x-python","patch_set":10,"id":"da86d52c_31f6785e","line":741,"updated":"2015-02-16 09:55:58.000000000","message":"are these changes related to this patch?","commit_id":"b5c95e491c808848aff52f6c511e436bc2bd9040"},{"author":{"_account_id":9101,"name":"wanghong","email":"reviewwanghong@126.com","username":"wanghong"},"change_message_id":"bd5bfd93556942cf852ac18c2747d704f9de39b0","unresolved":false,"context_lines":[{"line_number":738,"context_line":"        self.patch("},{"line_number":739,"context_line":"            \u0027/projects/%(project_id)s\u0027 % {"},{"line_number":740,"context_line":"                \u0027project_id\u0027: leaf_project[\u0027id\u0027]},"},{"line_number":741,"context_line":"            body\u003d{\u0027project\u0027: {\u0027parent_id\u0027: None}},"},{"line_number":742,"context_line":"            expected_status\u003d403)"},{"line_number":743,"context_line":""},{"line_number":744,"context_line":"    def test_disable_leaf_project(self):"}],"source_content_type":"text/x-python","patch_set":10,"id":"da86d52c_d0ec16be","line":741,"in_reply_to":"da86d52c_31f6785e","updated":"2015-02-17 01:31:24.000000000","message":"No, if we don\u0027t change this we would get a 400, because leaf_project contains created_at field and created_at can\u0027t be changed.","commit_id":"b5c95e491c808848aff52f6c511e436bc2bd9040"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"3052877ca7cf27a69e098dedd19b67cd847ef1fb","unresolved":false,"context_lines":[{"line_number":343,"context_line":"        r \u003d self.resource_api.get_domain(self.domain[\u0027id\u0027])"},{"line_number":344,"context_line":"        self.assertDictEqual(r, self.domain)"},{"line_number":345,"context_line":"        r \u003d self.resource_api.get_project(self.project[\u0027id\u0027])"},{"line_number":346,"context_line":"        del r[\u0027created_at\u0027]"},{"line_number":347,"context_line":"        del r[\u0027updated_at\u0027]"},{"line_number":348,"context_line":"        self.assertDictEqual(r, self.project)"},{"line_number":349,"context_line":"        r \u003d self.identity_api.get_group(self.group[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":15,"id":"9a80dd14_79a005f5","line":346,"updated":"2015-03-04 13:31:40.000000000","message":"Why do these have to be deleted?","commit_id":"c279cce6e20a4cfa8ba8f23fe277fb0935ca773b"},{"author":{"_account_id":9101,"name":"wanghong","email":"reviewwanghong@126.com","username":"wanghong"},"change_message_id":"cb8f327d9d4ac3ed068a553b1d9c3765f0a3d1d8","unresolved":false,"context_lines":[{"line_number":343,"context_line":"        r \u003d self.resource_api.get_domain(self.domain[\u0027id\u0027])"},{"line_number":344,"context_line":"        self.assertDictEqual(r, self.domain)"},{"line_number":345,"context_line":"        r \u003d self.resource_api.get_project(self.project[\u0027id\u0027])"},{"line_number":346,"context_line":"        del r[\u0027created_at\u0027]"},{"line_number":347,"context_line":"        del r[\u0027updated_at\u0027]"},{"line_number":348,"context_line":"        self.assertDictEqual(r, self.project)"},{"line_number":349,"context_line":"        r \u003d self.identity_api.get_group(self.group[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":15,"id":"9a80dd14_15532e18","line":346,"in_reply_to":"9a80dd14_79a005f5","updated":"2015-03-05 01:08:41.000000000","message":"I will add a comment.","commit_id":"c279cce6e20a4cfa8ba8f23fe277fb0935ca773b"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"3052877ca7cf27a69e098dedd19b67cd847ef1fb","unresolved":false,"context_lines":[{"line_number":834,"context_line":"                \u0027project_id\u0027: self.project_id},"},{"line_number":835,"context_line":"            body\u003d{\u0027project\u0027: ref})"},{"line_number":836,"context_line":"        self.assertValidProjectResponse(r, ref)"},{"line_number":837,"context_line":"        # Here we don\u0027t need assert because parse_isotime will raise exception"},{"line_number":838,"context_line":"        # if updated_at is not isotime"},{"line_number":839,"context_line":"        timeutils.parse_isotime(r.result[\u0027project\u0027][\u0027updated_at\u0027])"},{"line_number":840,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"9a80dd14_f964f5e6","line":837,"updated":"2015-03-04 13:31:40.000000000","message":"Doesn\u0027t assertValidProject already do this?","commit_id":"c279cce6e20a4cfa8ba8f23fe277fb0935ca773b"},{"author":{"_account_id":9101,"name":"wanghong","email":"reviewwanghong@126.com","username":"wanghong"},"change_message_id":"cb8f327d9d4ac3ed068a553b1d9c3765f0a3d1d8","unresolved":false,"context_lines":[{"line_number":834,"context_line":"                \u0027project_id\u0027: self.project_id},"},{"line_number":835,"context_line":"            body\u003d{\u0027project\u0027: ref})"},{"line_number":836,"context_line":"        self.assertValidProjectResponse(r, ref)"},{"line_number":837,"context_line":"        # Here we don\u0027t need assert because parse_isotime will raise exception"},{"line_number":838,"context_line":"        # if updated_at is not isotime"},{"line_number":839,"context_line":"        timeutils.parse_isotime(r.result[\u0027project\u0027][\u0027updated_at\u0027])"},{"line_number":840,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"9a80dd14_7541ca38","line":837,"in_reply_to":"9a80dd14_f964f5e6","updated":"2015-03-05 01:08:41.000000000","message":"Currently, I do\u0027t, but I think this is a good idea.","commit_id":"c279cce6e20a4cfa8ba8f23fe277fb0935ca773b"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"382e34a8c44fb6b5a4c02e24d92144aa605856a4","unresolved":false,"context_lines":[{"line_number":346,"context_line":"        # self.project doesn\u0027t contain created_at and updated_at. And we have"},{"line_number":347,"context_line":"        # no idea to know created_at and updated_at so we just remove them"},{"line_number":348,"context_line":"        del r[\u0027created_at\u0027]"},{"line_number":349,"context_line":"        del r[\u0027updated_at\u0027]"},{"line_number":350,"context_line":"        self.assertDictEqual(r, self.project)"},{"line_number":351,"context_line":"        r \u003d self.identity_api.get_group(self.group[\u0027id\u0027])"},{"line_number":352,"context_line":"        self.assertDictEqual(r, self.group)"}],"source_content_type":"text/x-python","patch_set":19,"id":"3acd31a7_ec688489","line":349,"updated":"2015-05-04 11:22:03.000000000","message":"You could at least assert \u0027created_at\u0027 and \u0027updated_at\u0027 contain valid content.","commit_id":"353f9ffba28e7c8148a5cdbb550477731f3d666f"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"473c94baa9f9b25ddf29b620f1d3b9c8f1294c22","unresolved":false,"context_lines":[{"line_number":860,"context_line":"        self.patch("},{"line_number":861,"context_line":"            \u0027/projects/%(project_id)s\u0027 % {"},{"line_number":862,"context_line":"                \u0027project_id\u0027: leaf_project[\u0027id\u0027]},"},{"line_number":863,"context_line":"            body\u003d{\u0027project\u0027: {\u0027parent_id\u0027: None}},"},{"line_number":864,"context_line":"            expected_status\u003d403)"},{"line_number":865,"context_line":""},{"line_number":866,"context_line":"    def test_disable_leaf_project(self):"}],"source_content_type":"text/x-python","patch_set":19,"id":"9a0c5dc1_87eca690","line":863,"updated":"2015-05-12 01:13:22.000000000","message":"I totally agree with this changes, but this is a related change or maybe this can be done in a different patch?","commit_id":"353f9ffba28e7c8148a5cdbb550477731f3d666f"}],"keystone/tests/unit/test_v3_auth.py":[{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"9dd181b019d5e1bd096dbc8871327c4c2b78ddc1","unresolved":false,"context_lines":[{"line_number":1929,"context_line":""},{"line_number":1930,"context_line":"    def test_project_id_scoped_token_with_user_id_401(self):"},{"line_number":1931,"context_line":"        project \u003d self.new_project_ref(domain_id\u003dself.domain_id)"},{"line_number":1932,"context_line":"        self.resource_api.create_project(project[\u0027id\u0027], project)"},{"line_number":1933,"context_line":""},{"line_number":1934,"context_line":"        auth_data \u003d self.build_authentication_request("},{"line_number":1935,"context_line":"            user_id\u003dself.user[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":9,"id":"da86d52c_33820ec9","line":1932,"updated":"2015-02-15 04:28:50.000000000","message":"Why did this need to change?","commit_id":"e6a7abb1d79e879f52f1fff4e93c41b9c8de1570"},{"author":{"_account_id":9101,"name":"wanghong","email":"reviewwanghong@126.com","username":"wanghong"},"change_message_id":"3e52074551f9ea009634599e9856cf6d60ad6f29","unresolved":false,"context_lines":[{"line_number":1929,"context_line":""},{"line_number":1930,"context_line":"    def test_project_id_scoped_token_with_user_id_401(self):"},{"line_number":1931,"context_line":"        project \u003d self.new_project_ref(domain_id\u003dself.domain_id)"},{"line_number":1932,"context_line":"        self.resource_api.create_project(project[\u0027id\u0027], project)"},{"line_number":1933,"context_line":""},{"line_number":1934,"context_line":"        auth_data \u003d self.build_authentication_request("},{"line_number":1935,"context_line":"            user_id\u003dself.user[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":9,"id":"da86d52c_f68dc42b","line":1932,"in_reply_to":"da86d52c_33820ec9","updated":"2015-02-15 06:49:08.000000000","message":"It seems this is an unrelated change... But, I think this code does need be improved: the project_id wouldn\u0027t be used when creating project. I will give a new patch.","commit_id":"e6a7abb1d79e879f52f1fff4e93c41b9c8de1570"}]}
