)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"74b6c602bc911fd6e1c38d44cc74f3ad05b710d3","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Sync DB models and migrations in keystone.assignment.backends.sql"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch syncs models with migrations for:"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"-Domain"},{"line_number":12,"context_line":"-GroupDomainGrant"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"AAAAQn%2F%2FbuI%3D","line":9,"updated":"2013-07-31 09:31:12.000000000","message":"For clarity (since keystone has now frozen its schema for Havana), it might be good just to state that no actual schema change is taking place, we are just correcting errors in the model definitions.","commit_id":"d49cd363a19a03878694090904453063b97dd2cb"}],"keystone/assignment/backends/sql.py":[{"author":{"_account_id":6507,"name":"Shturm Svetlana","email":"svetlana.v.shturm@gmail.com","username":"sshturm"},"change_message_id":"d48d8c889cd22902e186f44f8f16a9ff61d89220","unresolved":false,"context_lines":[{"line_number":673,"context_line":"    domain_id \u003d sql.Column(sql.String(64), sql.ForeignKey(\u0027domain.id\u0027),"},{"line_number":674,"context_line":"                           nullable\u003dFalse)"},{"line_number":675,"context_line":"    description \u003d sql.Column(sql.Text())"},{"line_number":676,"context_line":"    enabled \u003d sql.Column(sql.Boolean, default\u003dFalse)"},{"line_number":677,"context_line":"    extra \u003d sql.Column(sql.JsonBlob())"},{"line_number":678,"context_line":"    # Unique constraint across two columns to create the separation"},{"line_number":679,"context_line":"    # rather than just only \u0027name\u0027 being unique"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAQn%2F%2FcEs%3D","line":676,"updated":"2013-07-31 07:53:23.000000000","message":"There is no default value in database. Remove please this attribute.","commit_id":"7e5d72d49f5a6c35520c139e3aa956a5fa2801e8"},{"author":{"_account_id":6507,"name":"Shturm Svetlana","email":"svetlana.v.shturm@gmail.com","username":"sshturm"},"change_message_id":"d48d8c889cd22902e186f44f8f16a9ff61d89220","unresolved":false,"context_lines":[{"line_number":729,"context_line":"                            primary_key\u003dTrue)"},{"line_number":730,"context_line":"    data \u003d sql.Column(sql.JsonBlob())"},{"line_number":731,"context_line":"    __table_args__ \u003d ("},{"line_number":732,"context_line":"        Index(\u0027project_id\u0027, \u0027project_id\u0027),"},{"line_number":733,"context_line":"    )"},{"line_number":734,"context_line":""},{"line_number":735,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAQn%2F%2FcCg%3D","line":732,"updated":"2013-07-31 07:53:23.000000000","message":"Delete please this index. It will be created with ForeignKey constraint.","commit_id":"7e5d72d49f5a6c35520c139e3aa956a5fa2801e8"},{"author":{"_account_id":6507,"name":"Shturm Svetlana","email":"svetlana.v.shturm@gmail.com","username":"sshturm"},"change_message_id":"d48d8c889cd22902e186f44f8f16a9ff61d89220","unresolved":false,"context_lines":[{"line_number":740,"context_line":"                           primary_key\u003dTrue)"},{"line_number":741,"context_line":"    data \u003d sql.Column(sql.JsonBlob())"},{"line_number":742,"context_line":"    __table_args__ \u003d ("},{"line_number":743,"context_line":"        Index(\u0027domain_id\u0027, \u0027domain_id\u0027),"},{"line_number":744,"context_line":"    )"},{"line_number":745,"context_line":""},{"line_number":746,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAQn%2F%2FcDU%3D","line":743,"updated":"2013-07-31 07:53:23.000000000","message":"Delete please this index. It will be created with ForeignKey constraint.","commit_id":"7e5d72d49f5a6c35520c139e3aa956a5fa2801e8"},{"author":{"_account_id":6507,"name":"Shturm Svetlana","email":"svetlana.v.shturm@gmail.com","username":"sshturm"},"change_message_id":"d48d8c889cd22902e186f44f8f16a9ff61d89220","unresolved":false,"context_lines":[{"line_number":751,"context_line":"                            primary_key\u003dTrue)"},{"line_number":752,"context_line":"    data \u003d sql.Column(sql.JsonBlob())"},{"line_number":753,"context_line":"    __table_args__ \u003d ("},{"line_number":754,"context_line":"        Index(\u0027group_project_metadata_project_id_fkey\u0027, \u0027project_id\u0027),"},{"line_number":755,"context_line":"    )"},{"line_number":756,"context_line":""},{"line_number":757,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAQn%2F%2FcCE%3D","line":754,"updated":"2013-07-31 07:53:23.000000000","message":"Delete please this index. It will be created with ForeignKey constraint.","commit_id":"7e5d72d49f5a6c35520c139e3aa956a5fa2801e8"},{"author":{"_account_id":6507,"name":"Shturm Svetlana","email":"svetlana.v.shturm@gmail.com","username":"sshturm"},"change_message_id":"041c5aa92c8817c6e31d7cffb86de1fe87165ac8","unresolved":false,"context_lines":[{"line_number":14,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":15,"context_line":"# under the License."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"from sqlalchemy import Index"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from keystone import assignment"},{"line_number":20,"context_line":"from keystone import clean"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAQn%2F%2Fb88%3D","line":17,"updated":"2013-07-31 08:23:43.000000000","message":"Unused import.","commit_id":"36bca37af61cb6493527402b290be3fd0b27c9d4"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"be88eacaf4034bf5a088a45472359b844869701e","unresolved":false,"context_lines":[{"line_number":660,"context_line":"    name \u003d sql.Column(sql.String(64), nullable\u003dFalse)"},{"line_number":661,"context_line":"    enabled \u003d sql.Column(sql.Boolean, default\u003dTrue, nullable\u003dFalse)"},{"line_number":662,"context_line":"    extra \u003d sql.Column(sql.JsonBlob())"},{"line_number":663,"context_line":"    __table_args__ \u003d (sql.UniqueConstraint(\u0027name\u0027), {})"},{"line_number":664,"context_line":""},{"line_number":665,"context_line":""},{"line_number":666,"context_line":"class Project(sql.ModelBase, sql.DictBase):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAQn%2F%2Fb4w%3D","line":663,"updated":"2013-07-31 08:44:22.000000000","message":"Is there a reason for define the unique constraints this way, as opposed to the \"unique\u003dTrue\" on the field itself?","commit_id":"90b2e8bb0a604f89ba5497eaf49887e1df66ce94"},{"author":{"_account_id":6507,"name":"Shturm Svetlana","email":"svetlana.v.shturm@gmail.com","username":"sshturm"},"change_message_id":"20229658eb1e7cb5a751c120fff408462f623f42","unresolved":false,"context_lines":[{"line_number":660,"context_line":"    name \u003d sql.Column(sql.String(64), nullable\u003dFalse)"},{"line_number":661,"context_line":"    enabled \u003d sql.Column(sql.Boolean, default\u003dTrue, nullable\u003dFalse)"},{"line_number":662,"context_line":"    extra \u003d sql.Column(sql.JsonBlob())"},{"line_number":663,"context_line":"    __table_args__ \u003d (sql.UniqueConstraint(\u0027name\u0027), {})"},{"line_number":664,"context_line":""},{"line_number":665,"context_line":""},{"line_number":666,"context_line":"class Project(sql.ModelBase, sql.DictBase):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAQn%2F%2FbyI%3D","line":663,"in_reply_to":"AAAAQn%2F%2Fb4w%3D","updated":"2013-07-31 09:15:08.000000000","message":"Our blueprint covers all mistakes in models, migrations and implies an adding of test for checking models with migrations.\nThese changes needs by this test and also they increase visibility (we can see all constraint in one place).","commit_id":"90b2e8bb0a604f89ba5497eaf49887e1df66ce94"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"dd439337e24374f33e6e671a0cdc50cac571320d","unresolved":false,"context_lines":[{"line_number":660,"context_line":"    name \u003d sql.Column(sql.String(64), nullable\u003dFalse)"},{"line_number":661,"context_line":"    enabled \u003d sql.Column(sql.Boolean, default\u003dTrue, nullable\u003dFalse)"},{"line_number":662,"context_line":"    extra \u003d sql.Column(sql.JsonBlob())"},{"line_number":663,"context_line":"    __table_args__ \u003d (sql.UniqueConstraint(\u0027name\u0027), {})"},{"line_number":664,"context_line":""},{"line_number":665,"context_line":""},{"line_number":666,"context_line":"class Project(sql.ModelBase, sql.DictBase):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAQn%2F%2FbvE%3D","line":663,"in_reply_to":"AAAAQn%2F%2FbyI%3D","updated":"2013-07-31 09:30:07.000000000","message":"Fair enough.","commit_id":"90b2e8bb0a604f89ba5497eaf49887e1df66ce94"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"be88eacaf4034bf5a088a45472359b844869701e","unresolved":false,"context_lines":[{"line_number":682,"context_line":"    __tablename__ \u003d \u0027role\u0027"},{"line_number":683,"context_line":"    attributes \u003d [\u0027id\u0027, \u0027name\u0027]"},{"line_number":684,"context_line":"    id \u003d sql.Column(sql.String(64), primary_key\u003dTrue)"},{"line_number":685,"context_line":"    name \u003d sql.Column(sql.String(255), unique\u003dTrue, nullable\u003dFalse)"},{"line_number":686,"context_line":"    extra \u003d sql.Column(sql.JsonBlob())"},{"line_number":687,"context_line":"    __table_args__ \u003d (sql.UniqueConstraint(\u0027name\u0027), {})"},{"line_number":688,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAQn%2F%2Fb7E%3D","line":685,"updated":"2013-07-31 08:44:22.000000000","message":"I think we want to remove the \"unique\u003dTrue\" term here if we are going to use table_args below","commit_id":"90b2e8bb0a604f89ba5497eaf49887e1df66ce94"},{"author":{"_account_id":6507,"name":"Shturm Svetlana","email":"svetlana.v.shturm@gmail.com","username":"sshturm"},"change_message_id":"20229658eb1e7cb5a751c120fff408462f623f42","unresolved":false,"context_lines":[{"line_number":682,"context_line":"    __tablename__ \u003d \u0027role\u0027"},{"line_number":683,"context_line":"    attributes \u003d [\u0027id\u0027, \u0027name\u0027]"},{"line_number":684,"context_line":"    id \u003d sql.Column(sql.String(64), primary_key\u003dTrue)"},{"line_number":685,"context_line":"    name \u003d sql.Column(sql.String(255), unique\u003dTrue, nullable\u003dFalse)"},{"line_number":686,"context_line":"    extra \u003d sql.Column(sql.JsonBlob())"},{"line_number":687,"context_line":"    __table_args__ \u003d (sql.UniqueConstraint(\u0027name\u0027), {})"},{"line_number":688,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAQn%2F%2Fbx0%3D","line":685,"in_reply_to":"AAAAQn%2F%2Fb7E%3D","updated":"2013-07-31 09:15:08.000000000","message":"Agree.","commit_id":"90b2e8bb0a604f89ba5497eaf49887e1df66ce94"}],"tests/test_backend_sql.py":[{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"be88eacaf4034bf5a088a45472359b844869701e","unresolved":false,"context_lines":[{"line_number":114,"context_line":""},{"line_number":115,"context_line":"    def test_role_model(self):"},{"line_number":116,"context_line":"        cols \u003d ((\u0027id\u0027, sql.String, 64),"},{"line_number":117,"context_line":"                (\u0027name\u0027, sql.String, 255))"},{"line_number":118,"context_line":"        self.assertExpectedSchema(\u0027role\u0027, cols)"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"    def test_user_project_metadata_model(self):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAQn%2F%2Fb4E%3D","line":117,"updated":"2013-07-31 08:44:22.000000000","message":"Out of interest, do other projects also test for uniqueness and FKs ?","commit_id":"90b2e8bb0a604f89ba5497eaf49887e1df66ce94"},{"author":{"_account_id":6507,"name":"Shturm Svetlana","email":"svetlana.v.shturm@gmail.com","username":"sshturm"},"change_message_id":"20229658eb1e7cb5a751c120fff408462f623f42","unresolved":false,"context_lines":[{"line_number":114,"context_line":""},{"line_number":115,"context_line":"    def test_role_model(self):"},{"line_number":116,"context_line":"        cols \u003d ((\u0027id\u0027, sql.String, 64),"},{"line_number":117,"context_line":"                (\u0027name\u0027, sql.String, 255))"},{"line_number":118,"context_line":"        self.assertExpectedSchema(\u0027role\u0027, cols)"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"    def test_user_project_metadata_model(self):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAQn%2F%2FbxA%3D","line":117,"in_reply_to":"AAAAQn%2F%2Fb4E%3D","updated":"2013-07-31 09:15:08.000000000","message":"There are a testing cover in Nova project that check all migrations. There are tests for each migration that check pre-migration and after-migration state. It had done for upgrade and for downgrade modes. Some of migration add/change UniqueConstraint.","commit_id":"90b2e8bb0a604f89ba5497eaf49887e1df66ce94"}]}
