)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"15913b88896932ede3be1f85d7520a0627a30195","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"devref: docs about how to use NeutronDbObject."},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: If25060feb77f35873a2b6a4ecfe639a284e7f677"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"1aa78d24_7455191c","line":9,"updated":"2016-07-02 08:42:32.000000000","message":"Let\u0027s use the adopt... bp to track the patch.","commit_id":"d22dde9659ce55f426ddd65642e6587feecc9381"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"456b77705eb546f2e205c826674ee080efe051af","unresolved":false,"context_lines":[{"line_number":5,"context_line":"CommitDate: 2016-08-05 11:27:44 +0200"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"devref: docs about how to use NeutronDbObject."},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: If25060feb77f35873a2b6a4ecfe639a284e7f677"},{"line_number":10,"context_line":"Partially-Implements: blueprint adopt-oslo-versioned-objects-for-db"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"bacf61ea_60610fd3","line":8,"updated":"2016-08-05 17:23:32.000000000","message":"consider adding brief intro why this devref has been added.","commit_id":"6e05c6451144f4331c63b1b4bf4fbf96b0b6d523"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"66c257be05e33736d7f2d1af5d63efb410c610ff","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"To introduce to every neutron developer the concept of using objects,"},{"line_number":10,"context_line":"this dev ref is describing the ecosystem of Oslo VersionedObjects"},{"line_number":11,"context_line":"and its modification for neutron project, how to create or use the objects."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Change-Id: If25060feb77f35873a2b6a4ecfe639a284e7f677"},{"line_number":14,"context_line":"Partially-Implements: blueprint adopt-oslo-versioned-objects-for-db"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"9ad45d7e_316486b7","line":11,"range":{"start_line":11,"start_character":72,"end_line":11,"end_character":75},"updated":"2016-08-11 21:15:47.000000000","message":"nit: these characters exceeds the limit of the description","commit_id":"a0fb181d4824668d3e18dbf2bb964343dd1c77ca"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"daeeaf791cab75927813de371bdb872e7f2f6d4a","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"To introduce to every neutron developer the concept of using objects,"},{"line_number":10,"context_line":"this dev ref is describing the ecosystem of Oslo VersionedObjects"},{"line_number":11,"context_line":"and its modification for neutron project, how to create or use the objects."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Change-Id: If25060feb77f35873a2b6a4ecfe639a284e7f677"},{"line_number":14,"context_line":"Partially-Implements: blueprint adopt-oslo-versioned-objects-for-db"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"1ac06dbe_857ec767","line":11,"range":{"start_line":11,"start_character":72,"end_line":11,"end_character":75},"updated":"2016-08-23 21:58:21.000000000","message":"nit: https://review.openstack.org/#/c/336518/7//COMMIT_MSG@11","commit_id":"b81e890535b29fa2868327ec149bbda3e8ac7665"},{"author":{"_account_id":22220,"name":"Anindita Das","email":"anindita.das@utexas.edu","username":"anudas"},"change_message_id":"79206f64fe6e94f87f17310843dacca083c61c88","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"To introduce to every neutron developer the concept of using objects,"},{"line_number":10,"context_line":"this dev ref is describing the ecosystem of Oslo VersionedObjects"},{"line_number":11,"context_line":"and its modification for neutron project, how to create or use the objects."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Change-Id: If25060feb77f35873a2b6a4ecfe639a284e7f677"},{"line_number":14,"context_line":"Partially-Implements: blueprint adopt-oslo-versioned-objects-for-db"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"fa7ab95a_3554b41f","line":11,"updated":"2016-08-29 17:50:58.000000000","message":"nit: line exceeds 72 characters","commit_id":"c9fe8e2a25a03bc39d7a2df299576bcbf2a0bcc0"},{"author":{"_account_id":19591,"name":"Saisrikiran Mudigonda","email":"saisrikiran.mudigonda@intel.com","username":"saisrikiran"},"change_message_id":"8f973dfb411631fc98f86b203baac09f90ea8d3c","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"devref: docs about how to use NeutronDbObject."},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"To introduce to every neutron developer the concept of using objects,"},{"line_number":10,"context_line":"this dev ref is describing the ecosystem of Oslo VersionedObjects"},{"line_number":11,"context_line":"and its modification for neutron project, how to create or use the objects."},{"line_number":12,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"1a6eadb0_27cba654","line":9,"range":{"start_line":9,"start_character":0,"end_line":9,"end_character":55},"updated":"2016-12-21 17:16:23.000000000","message":"nit: To introduce every neutron developer to the concept of","commit_id":"8faae2be03b1785a4161271d7aaef8ec5d828f6d"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"4b65f4e4e0208553b0fea8884c3e7e7b809eb32a","unresolved":false,"context_lines":[{"line_number":11,"context_line":"and its modification for neutron project, how to create or use the objects."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Co-Authored-By: Dariusz Smigiel \u003csmigiel.dariusz@gmail.com\u003e"},{"line_number":14,"context_line":"Co-Authored-By: Ihar Hrachyshka \u003cihrachys@redhat.com\u003e"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Change-Id: If25060feb77f35873a2b6a4ecfe639a284e7f677"},{"line_number":17,"context_line":"Partially-Implements: blueprint adopt-oslo-versioned-objects-for-db"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"ba2be162_6d9da3bb","line":14,"updated":"2017-03-02 22:36:46.000000000","message":"nope","commit_id":"e2591db71681a8d60fae6cb541ed663ae5729874"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"41efa7a91b41748b6cdc65114e1f92f387a51e88","unresolved":false,"context_lines":[{"line_number":11,"context_line":"and its modification for neutron project, how to create or use the objects."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Co-Authored-By: Dariusz Smigiel \u003csmigiel.dariusz@gmail.com\u003e"},{"line_number":14,"context_line":"Co-Authored-By: Ihar Hrachyshka \u003cihrachys@redhat.com\u003e"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Change-Id: If25060feb77f35873a2b6a4ecfe639a284e7f677"},{"line_number":17,"context_line":"Partially-Implements: blueprint adopt-oslo-versioned-objects-for-db"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"ba2be162_9a3907da","line":14,"in_reply_to":"ba2be162_6d9da3bb","updated":"2017-03-03 16:52:07.000000000","message":"I used a lot of your words as exact comments.","commit_id":"e2591db71681a8d60fae6cb541ed663ae5729874"}],"doc/source/devref/objects_usage.rst":[{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"15913b88896932ede3be1f85d7520a0627a30195","unresolved":false,"context_lines":[{"line_number":23,"context_line":"Objects in Neutron"},{"line_number":24,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"In order to add new object in Neutron, you have to:"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"#. Create object derived from NeutronDbObject (aka base object)"},{"line_number":29,"context_line":"#. Add/reuse db model"}],"source_content_type":"text/x-rst","patch_set":1,"id":"1aa78d24_f4162954","line":26,"updated":"2016-07-02 08:42:32.000000000","message":"I think we may want to make the document less of a walk-through and more of a reference to concepts. I would think we will lay out the general idea of objects, how we see them to help the community, then proceed to describing relation between ovo library base class and or base classes (both db and db-less one).\n\nIn the end, we can just link to the directory for examples.","commit_id":"d22dde9659ce55f426ddd65642e6587feecc9381"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"15913b88896932ede3be1f85d7520a0627a30195","unresolved":false,"context_lines":[{"line_number":29,"context_line":"#. Add/reuse db model"},{"line_number":30,"context_line":"#. Define fields"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"Object example"},{"line_number":33,"context_line":"--------------"},{"line_number":34,"context_line":"Please take a look at simplified example objects: Subnet, DNSNameServer and"},{"line_number":35,"context_line":"IPAllocationPool"}],"source_content_type":"text/x-rst","patch_set":1,"id":"1aa78d24_9406c51e","line":32,"updated":"2016-07-02 08:42:32.000000000","message":"I don\u0027t think we should do that at all. We should instead link to the code. Otherwise, this example is doomed to become obsolete in two years from now.","commit_id":"d22dde9659ce55f426ddd65642e6587feecc9381"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"ee80bcbb2feb5cc67d432dc77dc68843193ede49","unresolved":false,"context_lines":[{"line_number":34,"context_line":"Please take a look at simplified example objects: Subnet, DNSNameServer and"},{"line_number":35,"context_line":"IPAllocationPool"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":".. code-block:: Python"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    @obj_base.VersionedObjectRegistry.register"},{"line_number":40,"context_line":"    class Subnet(base.NeutronDbObject):"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3aaa91ec_8c607cd1","line":37,"range":{"start_line":37,"start_character":0,"end_line":37,"end_character":22},"updated":"2016-07-01 16:39:13.000000000","message":"Below you have incorrect Python code. Classes do not have indentation.","commit_id":"d22dde9659ce55f426ddd65642e6587feecc9381"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"ee80bcbb2feb5cc67d432dc77dc68843193ede49","unresolved":false,"context_lines":[{"line_number":136,"context_line":""},{"line_number":137,"context_line":"VERSION"},{"line_number":138,"context_line":"~~~~~~~"},{"line_number":139,"context_line":"Very important field defining version of the object. Initialy version should be"},{"line_number":140,"context_line":"set to 1.0."},{"line_number":141,"context_line":"Version need to be changed if fields or their types are modified."},{"line_number":142,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"3aaa91ec_c99276fc","line":139,"range":{"start_line":139,"start_character":53,"end_line":139,"end_character":61},"updated":"2016-07-01 16:39:13.000000000","message":"typo: Initially","commit_id":"d22dde9659ce55f426ddd65642e6587feecc9381"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"ee80bcbb2feb5cc67d432dc77dc68843193ede49","unresolved":false,"context_lines":[{"line_number":138,"context_line":"~~~~~~~"},{"line_number":139,"context_line":"Very important field defining version of the object. Initialy version should be"},{"line_number":140,"context_line":"set to 1.0."},{"line_number":141,"context_line":"Version need to be changed if fields or their types are modified."},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"fields"},{"line_number":144,"context_line":"~~~~~~"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3aaa91ec_8cb7dc39","line":141,"range":{"start_line":141,"start_character":8,"end_line":141,"end_character":12},"updated":"2016-07-01 16:39:13.000000000","message":"typo: needs","commit_id":"d22dde9659ce55f426ddd65642e6587feecc9381"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"15913b88896932ede3be1f85d7520a0627a30195","unresolved":false,"context_lines":[{"line_number":142,"context_line":""},{"line_number":143,"context_line":"fields"},{"line_number":144,"context_line":"~~~~~~"},{"line_number":145,"context_line":"Attributes of the object, their names and types from oslo library or defined"},{"line_number":146,"context_line":"locally in neutron/objects/common_types.py"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"Example of DB model::"},{"line_number":149,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"1aa78d24_1709372d","line":146,"range":{"start_line":145,"start_character":0,"end_line":146,"end_character":42},"updated":"2016-07-02 08:42:32.000000000","message":"I am not sure what it means. I think you wanted to say that Neutron implements custom types for some Neutron specific fields in addition to using typing system from the ovo library.","commit_id":"d22dde9659ce55f426ddd65642e6587feecc9381"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"ee80bcbb2feb5cc67d432dc77dc68843193ede49","unresolved":false,"context_lines":[{"line_number":147,"context_line":""},{"line_number":148,"context_line":"Example of DB model::"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"    class DNSNameServer(model_base.BASEV2):"},{"line_number":151,"context_line":"    \"\"\"Internal representation of a DNS nameserver.\"\"\""},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"    address \u003d sa.Column(sa.String(128), nullable\u003dFalse, primary_key\u003dTrue)"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3aaa91ec_4cc21488","line":150,"updated":"2016-07-01 16:39:13.000000000","message":"Could you add Python formatting to this block of code?\nPlus, indentation is incorrect.","commit_id":"d22dde9659ce55f426ddd65642e6587feecc9381"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"15913b88896932ede3be1f85d7520a0627a30195","unresolved":false,"context_lines":[{"line_number":147,"context_line":""},{"line_number":148,"context_line":"Example of DB model::"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"    class DNSNameServer(model_base.BASEV2):"},{"line_number":151,"context_line":"    \"\"\"Internal representation of a DNS nameserver.\"\"\""},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"    address \u003d sa.Column(sa.String(128), nullable\u003dFalse, primary_key\u003dTrue)"}],"source_content_type":"text/x-rst","patch_set":1,"id":"1aa78d24_b703030d","line":150,"in_reply_to":"3aaa91ec_4cc21488","updated":"2016-07-02 08:42:32.000000000","message":"Again, I would prefer if we don\u0027t duplicate code in docs. If we really need an example, let\u0027s come up with a fake one, just to give an idea of the concept.","commit_id":"d22dde9659ce55f426ddd65642e6587feecc9381"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"ee80bcbb2feb5cc67d432dc77dc68843193ede49","unresolved":false,"context_lines":[{"line_number":159,"context_line":""},{"line_number":160,"context_line":"And its corresponding representation in fields::"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":"    fields \u003d {"},{"line_number":163,"context_line":"        \u0027address\u0027: obj_fields.StringField(),"},{"line_number":164,"context_line":"        \u0027subnet_id\u0027: obj_fields.UUIDField(),"},{"line_number":165,"context_line":"        \u0027order\u0027: obj_fields.IntegerField()"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3aaa91ec_8cbcfc07","line":162,"range":{"start_line":162,"start_character":4,"end_line":162,"end_character":10},"updated":"2016-07-01 16:39:13.000000000","message":"Missing Python formatting.","commit_id":"d22dde9659ce55f426ddd65642e6587feecc9381"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"ee80bcbb2feb5cc67d432dc77dc68843193ede49","unresolved":false,"context_lines":[{"line_number":165,"context_line":"        \u0027order\u0027: obj_fields.IntegerField()"},{"line_number":166,"context_line":"    }"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"It is important to remenber about nullable parameter. In SQLAlchemy model,"},{"line_number":169,"context_line":"the nullable parameter is by default True, while in oslo fields nullable is set"},{"line_number":170,"context_line":"to False."},{"line_number":171,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"3aaa91ec_c9b9d67e","line":168,"range":{"start_line":168,"start_character":19,"end_line":168,"end_character":27},"updated":"2016-07-01 16:39:13.000000000","message":"typo: remember","commit_id":"d22dde9659ce55f426ddd65642e6587feecc9381"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"ee80bcbb2feb5cc67d432dc77dc68843193ede49","unresolved":false,"context_lines":[{"line_number":166,"context_line":"    }"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"It is important to remenber about nullable parameter. In SQLAlchemy model,"},{"line_number":169,"context_line":"the nullable parameter is by default True, while in oslo fields nullable is set"},{"line_number":170,"context_line":"to False."},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"db_model"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3aaa91ec_0c564cce","line":169,"range":{"start_line":169,"start_character":43,"end_line":169,"end_character":72},"updated":"2016-07-01 16:39:13.000000000","message":"Probably better would be to write like: \"while in oslo nullable fields are\"","commit_id":"d22dde9659ce55f426ddd65642e6587feecc9381"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"ee80bcbb2feb5cc67d432dc77dc68843193ede49","unresolved":false,"context_lines":[{"line_number":166,"context_line":"    }"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"It is important to remenber about nullable parameter. In SQLAlchemy model,"},{"line_number":169,"context_line":"the nullable parameter is by default True, while in oslo fields nullable is set"},{"line_number":170,"context_line":"to False."},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"db_model"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3aaa91ec_e9b81278","line":169,"range":{"start_line":169,"start_character":73,"end_line":169,"end_character":75},"updated":"2016-07-01 16:39:13.000000000","message":"s/is/are","commit_id":"d22dde9659ce55f426ddd65642e6587feecc9381"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"15913b88896932ede3be1f85d7520a0627a30195","unresolved":false,"context_lines":[{"line_number":169,"context_line":"the nullable parameter is by default True, while in oslo fields nullable is set"},{"line_number":170,"context_line":"to False."},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"db_model"},{"line_number":173,"context_line":"~~~~~~~~"},{"line_number":174,"context_line":"Database model connected to defined object"},{"line_number":175,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"1aa78d24_3710b34e","line":172,"updated":"2016-07-02 08:42:32.000000000","message":"I actually think that per field description belongs to the code itself, where it\u0027s not yet documented in enough details. I suggest we work on comments in the base class too.\n\nThe way I see it, this document should cover concepts, not specific features. Another thing that it may cover better than the code itself is FAQ style tips, like:\n\nQ: how do I pick types for my fields?\nA: ...\n\nQ: how do I implement fields that are not part of db model?\nA: ...\n\netc.","commit_id":"d22dde9659ce55f426ddd65642e6587feecc9381"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"ee80bcbb2feb5cc67d432dc77dc68843193ede49","unresolved":false,"context_lines":[{"line_number":179,"context_line":""},{"line_number":180,"context_line":"synthetic_fields"},{"line_number":181,"context_line":"~~~~~~~~~~~~~~~~"},{"line_number":182,"context_line":"it is list of fields that are not directly defined in DB"},{"line_number":183,"context_line":"model, but those fields are loading in relationship or computed in runtime"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"foreign_keys"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3aaa91ec_69a54246","line":182,"range":{"start_line":182,"start_character":0,"end_line":182,"end_character":2},"updated":"2016-07-01 16:39:13.000000000","message":"upper case","commit_id":"d22dde9659ce55f426ddd65642e6587feecc9381"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"ee80bcbb2feb5cc67d432dc77dc68843193ede49","unresolved":false,"context_lines":[{"line_number":184,"context_line":""},{"line_number":185,"context_line":"foreign_keys"},{"line_number":186,"context_line":"~~~~~~~~~~~~"},{"line_number":187,"context_line":"this is a dict to store the association between the foreign"},{"line_number":188,"context_line":"key and the corresponding key in the main table, i.e. DNS name server has"},{"line_number":189,"context_line":"subnet_id with is foreigh key in Subnet object defined as id."},{"line_number":190,"context_line":"So the foreign_keys would look like this: foreign_keys \u003d {\u0027subnet_id\u0027: \u0027id\u0027}"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3aaa91ec_c960b610","line":187,"range":{"start_line":187,"start_character":0,"end_line":187,"end_character":4},"updated":"2016-07-01 16:39:13.000000000","message":"ditto","commit_id":"d22dde9659ce55f426ddd65642e6587feecc9381"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"ee80bcbb2feb5cc67d432dc77dc68843193ede49","unresolved":false,"context_lines":[{"line_number":186,"context_line":"~~~~~~~~~~~~"},{"line_number":187,"context_line":"this is a dict to store the association between the foreign"},{"line_number":188,"context_line":"key and the corresponding key in the main table, i.e. DNS name server has"},{"line_number":189,"context_line":"subnet_id with is foreigh key in Subnet object defined as id."},{"line_number":190,"context_line":"So the foreign_keys would look like this: foreign_keys \u003d {\u0027subnet_id\u0027: \u0027id\u0027}"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"fields_no_update"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3aaa91ec_0c0dace8","line":189,"range":{"start_line":189,"start_character":18,"end_line":189,"end_character":25},"updated":"2016-07-01 16:39:13.000000000","message":"typo: foreign","commit_id":"d22dde9659ce55f426ddd65642e6587feecc9381"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"ee80bcbb2feb5cc67d432dc77dc68843193ede49","unresolved":false,"context_lines":[{"line_number":187,"context_line":"this is a dict to store the association between the foreign"},{"line_number":188,"context_line":"key and the corresponding key in the main table, i.e. DNS name server has"},{"line_number":189,"context_line":"subnet_id with is foreigh key in Subnet object defined as id."},{"line_number":190,"context_line":"So the foreign_keys would look like this: foreign_keys \u003d {\u0027subnet_id\u0027: \u0027id\u0027}"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"fields_no_update"},{"line_number":193,"context_line":"~~~~~~~~~~~~~~~~"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3aaa91ec_ac2e1840","line":190,"range":{"start_line":190,"start_character":42,"end_line":190,"end_character":76},"updated":"2016-07-01 16:39:13.000000000","message":"Missing code block.","commit_id":"d22dde9659ce55f426ddd65642e6587feecc9381"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"ee80bcbb2feb5cc67d432dc77dc68843193ede49","unresolved":false,"context_lines":[{"line_number":191,"context_line":""},{"line_number":192,"context_line":"fields_no_update"},{"line_number":193,"context_line":"~~~~~~~~~~~~~~~~"},{"line_number":194,"context_line":"list of fields that cannot by update by object user."},{"line_number":195,"context_line":"This means that changing the field during object manipulation will cause in"},{"line_number":196,"context_line":"data inconsistency or break the get/create/update/delete methods."},{"line_number":197,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"3aaa91ec_0c248c5e","line":194,"range":{"start_line":194,"start_character":0,"end_line":194,"end_character":4},"updated":"2016-07-01 16:39:13.000000000","message":"Upper case","commit_id":"d22dde9659ce55f426ddd65642e6587feecc9381"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"ee80bcbb2feb5cc67d432dc77dc68843193ede49","unresolved":false,"context_lines":[{"line_number":191,"context_line":""},{"line_number":192,"context_line":"fields_no_update"},{"line_number":193,"context_line":"~~~~~~~~~~~~~~~~"},{"line_number":194,"context_line":"list of fields that cannot by update by object user."},{"line_number":195,"context_line":"This means that changing the field during object manipulation will cause in"},{"line_number":196,"context_line":"data inconsistency or break the get/create/update/delete methods."},{"line_number":197,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"3aaa91ec_acd5781c","line":194,"range":{"start_line":194,"start_character":30,"end_line":194,"end_character":36},"updated":"2016-07-01 16:39:13.000000000","message":"typo: updated","commit_id":"d22dde9659ce55f426ddd65642e6587feecc9381"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"ee80bcbb2feb5cc67d432dc77dc68843193ede49","unresolved":false,"context_lines":[{"line_number":202,"context_line":"manipulate the database representation to object definition."},{"line_number":203,"context_line":"For example in IP allocation pools::"},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"    fields_need_translation \u003d {"},{"line_number":206,"context_line":"         \u0027start\u0027: \u0027first_ip\u0027,"},{"line_number":207,"context_line":"        \u0027end\u0027: \u0027last_ip\u0027"},{"line_number":208,"context_line":"    }"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3aaa91ec_ccb724f7","line":205,"updated":"2016-07-01 16:39:13.000000000","message":"Python code block?","commit_id":"d22dde9659ce55f426ddd65642e6587feecc9381"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"ee80bcbb2feb5cc67d432dc77dc68843193ede49","unresolved":false,"context_lines":[{"line_number":208,"context_line":"    }"},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"this dict is used in modify_fields_(from|to)_db methods, where the fields"},{"line_number":211,"context_line":"are automatically translated for all derived classes from NeutronDbObject"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"If database model has standard attributes in its definition, it will be"},{"line_number":214,"context_line":"automatically included in object by NeutronDbObject base class."}],"source_content_type":"text/x-rst","patch_set":1,"id":"3aaa91ec_8cc6bc66","line":211,"updated":"2016-07-01 16:39:13.000000000","message":"Missing \u0027.\u0027","commit_id":"d22dde9659ce55f426ddd65642e6587feecc9381"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"ee80bcbb2feb5cc67d432dc77dc68843193ede49","unresolved":false,"context_lines":[{"line_number":218,"context_line":""},{"line_number":219,"context_line":"get_object"},{"line_number":220,"context_line":"~~~~~~~~~~"},{"line_number":221,"context_line":"method to fetch one object, it can return None if object was not found."},{"line_number":222,"context_line":"The invocation should look like::"},{"line_number":223,"context_line":""},{"line_number":224,"context_line":"    subnet.DNSNameServer.get_object(context, address\u003d\u0027asd\u0027, subnet_id\u003d\u0027xxx\u0027)"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3aaa91ec_ec84a00c","line":221,"range":{"start_line":221,"start_character":0,"end_line":221,"end_character":6},"updated":"2016-07-01 16:39:13.000000000","message":"Upper case","commit_id":"d22dde9659ce55f426ddd65642e6587feecc9381"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"15913b88896932ede3be1f85d7520a0627a30195","unresolved":false,"context_lines":[{"line_number":230,"context_line":""},{"line_number":231,"context_line":"in kwargs, you have to pass only the primary keys. If some other key is"},{"line_number":232,"context_line":"passed or not all primary keys are passed, then exception NeutronPrimaryKeyMissing"},{"line_number":233,"context_line":"will be raised."},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"get_objects"},{"line_number":236,"context_line":"~~~~~~~~~~~"}],"source_content_type":"text/x-rst","patch_set":1,"id":"1aa78d24_971d2769","line":233,"updated":"2016-07-02 08:42:32.000000000","message":"A lot of those details, like the exception, or what is allowed as args, is better placed in the code.","commit_id":"d22dde9659ce55f426ddd65642e6587feecc9381"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"ee80bcbb2feb5cc67d432dc77dc68843193ede49","unresolved":false,"context_lines":[{"line_number":234,"context_line":""},{"line_number":235,"context_line":"get_objects"},{"line_number":236,"context_line":"~~~~~~~~~~~"},{"line_number":237,"context_line":"method to fetch collection of objects, the invocation::"},{"line_number":238,"context_line":""},{"line_number":239,"context_line":"    subnet.DNSNameServer.get_objects(context) - will return list of all entities."},{"line_number":240,"context_line":"    subnet.DNSNameServer.get_objects(context, subnet_id\u003d\u0027xxx\u0027) -"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3aaa91ec_ec9b0065","line":237,"range":{"start_line":237,"start_character":0,"end_line":237,"end_character":6},"updated":"2016-07-01 16:39:13.000000000","message":"Upper case","commit_id":"d22dde9659ce55f426ddd65642e6587feecc9381"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"ee80bcbb2feb5cc67d432dc77dc68843193ede49","unresolved":false,"context_lines":[{"line_number":249,"context_line":""},{"line_number":250,"context_line":"create"},{"line_number":251,"context_line":"~~~~~~"},{"line_number":252,"context_line":"insert object into DB."},{"line_number":253,"context_line":"Example usage::"},{"line_number":254,"context_line":""},{"line_number":255,"context_line":"    dns \u003d subnet.DNSNameServer(context, address\u003d\u0027asd\u0027, subnet_id\u003d\u0027xxx\u0027, order\u003d1)"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3aaa91ec_ac9738ea","line":252,"range":{"start_line":252,"start_character":0,"end_line":252,"end_character":6},"updated":"2016-07-01 16:39:13.000000000","message":"Uppercase","commit_id":"d22dde9659ce55f426ddd65642e6587feecc9381"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"ee80bcbb2feb5cc67d432dc77dc68843193ede49","unresolved":false,"context_lines":[{"line_number":260,"context_line":"inserted automatically. Synthetic fields should be handled by dedicated object"},{"line_number":261,"context_line":"and created separately. Example::"},{"line_number":262,"context_line":""},{"line_number":263,"context_line":"    subnet_data \u003d {"},{"line_number":264,"context_line":"        \u0027id\u0027: \u0027aaa\u0027,"},{"line_number":265,"context_line":"        \u0027allocation_pools\u0027: ["},{"line_number":266,"context_line":"            {"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3aaa91ec_acbe1862","line":263,"range":{"start_line":263,"start_character":4,"end_line":263,"end_character":15},"updated":"2016-07-01 16:39:13.000000000","message":"python code block?","commit_id":"d22dde9659ce55f426ddd65642e6587feecc9381"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"15913b88896932ede3be1f85d7520a0627a30195","unresolved":false,"context_lines":[{"line_number":321,"context_line":"~~~~~~~~~~~~~~"},{"line_number":322,"context_line":"This method is filling the object with database values."},{"line_number":323,"context_line":""},{"line_number":324,"context_line":"Standard attributes"},{"line_number":325,"context_line":"-------------------"},{"line_number":326,"context_line":"The standard attributes are added automatically in metaclass"},{"line_number":327,"context_line":"DeclarativeObject. If adding standard attribute, it has to be added in"}],"source_content_type":"text/x-rst","patch_set":1,"id":"1aa78d24_1720179b","line":324,"updated":"2016-07-02 08:42:32.000000000","message":"Another thing to cover is how we handle RBAC.","commit_id":"d22dde9659ce55f426ddd65642e6587feecc9381"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"ed845d7ccd90bfb0847d8ce8640b91cdce03cae5","unresolved":false,"context_lines":[{"line_number":165,"context_line":"Specific for neutron usage, concept of synthetic fields was introduced. It is"},{"line_number":166,"context_line":"list of fields, that are not directly defined in data model, but should be"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"Usage of objects"},{"line_number":169,"context_line":"----------------"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"sorting, filtering"}],"source_content_type":"text/x-rst","patch_set":2,"id":"dada55a8_9a1c476b","line":168,"range":{"start_line":168,"start_character":0,"end_line":168,"end_character":16},"updated":"2016-07-21 22:53:56.000000000","message":"To make things more simple it would be good to have example for doing get_object and very brief explanation how queries can also be replaced with methods obj/db/api. even thouh some method used in api have comment for decomposition, still it would help developers to have a example if api is going to be same.","commit_id":"208f649cf907d8410e993e12cf402a573b022266"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"ed845d7ccd90bfb0847d8ce8640b91cdce03cae5","unresolved":false,"context_lines":[{"line_number":179,"context_line":"neutron/objects/extensions/standardattributes.py. It will be added to all relevant"},{"line_number":180,"context_line":"objects that is using the standardattributes model."},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"RBAC handling in objects"},{"line_number":183,"context_line":"------------------------"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"Extensions to neutron resources"},{"line_number":186,"context_line":"-------------------------------"},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"tenant_id backward compatibility"},{"line_number":189,"context_line":"--------------------------------"}],"source_content_type":"text/x-rst","patch_set":2,"id":"dada55a8_bf365d00","line":189,"range":{"start_line":182,"start_character":0,"end_line":189,"end_character":32},"updated":"2016-07-21 22:53:56.000000000","message":"will these also be explained ? or it will be done in another patch ?","commit_id":"208f649cf907d8410e993e12cf402a573b022266"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"c8c75265c68010a93d6a87e97e1745d830cabb2e","unresolved":false,"context_lines":[{"line_number":23,"context_line":"Objects in neutron"},{"line_number":24,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"\u0027Versioned object\u0027 is a key concept to reach zero-downtime upgrade scenario."},{"line_number":27,"context_line":"Initially implemented by nova community, it was pushed to oslo library, so that"},{"line_number":28,"context_line":"other projects can benefit from it."},{"line_number":29,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"bacf61ea_70915d52","line":26,"range":{"start_line":26,"start_character":36,"end_line":26,"end_character":75},"updated":"2016-07-28 17:45:21.000000000","message":"Nit, might read a little smoother if we use something like: \"... key concept to achieve zero-downtime upgrades.\"","commit_id":"1f0e63b1454a15db392bc3d7b6d13d83b9c92c20"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"9c577b960c3806bf013f7f08c3635de2547877f0","unresolved":false,"context_lines":[{"line_number":23,"context_line":"Objects in neutron"},{"line_number":24,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"\u0027Versioned object\u0027 is a key concept to reach zero-downtime upgrade scenario."},{"line_number":27,"context_line":"Initially implemented by nova community, it was pushed to oslo library, so that"},{"line_number":28,"context_line":"other projects can benefit from it."},{"line_number":29,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"bacf61ea_a9e82fe3","line":26,"range":{"start_line":26,"start_character":36,"end_line":26,"end_character":75},"in_reply_to":"bacf61ea_70915d52","updated":"2016-08-05 09:31:40.000000000","message":"Done","commit_id":"1f0e63b1454a15db392bc3d7b6d13d83b9c92c20"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"c8c75265c68010a93d6a87e97e1745d830cabb2e","unresolved":false,"context_lines":[{"line_number":24,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"\u0027Versioned object\u0027 is a key concept to reach zero-downtime upgrade scenario."},{"line_number":27,"context_line":"Initially implemented by nova community, it was pushed to oslo library, so that"},{"line_number":28,"context_line":"other projects can benefit from it."},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"\u0027Oslo VersionedObjects\u0027 (aka OVO) is a database facade, where you define the"}],"source_content_type":"text/x-rst","patch_set":3,"id":"bacf61ea_d0776938","line":27,"range":{"start_line":27,"start_character":24,"end_line":27,"end_character":25},"updated":"2016-07-28 17:45:21.000000000","message":"Nit: \"by the nova\"","commit_id":"1f0e63b1454a15db392bc3d7b6d13d83b9c92c20"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"9c577b960c3806bf013f7f08c3635de2547877f0","unresolved":false,"context_lines":[{"line_number":24,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"\u0027Versioned object\u0027 is a key concept to reach zero-downtime upgrade scenario."},{"line_number":27,"context_line":"Initially implemented by nova community, it was pushed to oslo library, so that"},{"line_number":28,"context_line":"other projects can benefit from it."},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"\u0027Oslo VersionedObjects\u0027 (aka OVO) is a database facade, where you define the"}],"source_content_type":"text/x-rst","patch_set":3,"id":"bacf61ea_89e56b0a","line":27,"range":{"start_line":27,"start_character":24,"end_line":27,"end_character":25},"in_reply_to":"bacf61ea_d0776938","updated":"2016-08-05 09:31:40.000000000","message":"Done","commit_id":"1f0e63b1454a15db392bc3d7b6d13d83b9c92c20"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"c8c75265c68010a93d6a87e97e1745d830cabb2e","unresolved":false,"context_lines":[{"line_number":27,"context_line":"Initially implemented by nova community, it was pushed to oslo library, so that"},{"line_number":28,"context_line":"other projects can benefit from it."},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"\u0027Oslo VersionedObjects\u0027 (aka OVO) is a database facade, where you define the"},{"line_number":31,"context_line":"middle layer between software and database schema. The layer is about creating"},{"line_number":32,"context_line":"object per database resource, and make them versioned, meaning save their"},{"line_number":33,"context_line":"definition in particular time. When you change the database schema, you change"}],"source_content_type":"text/x-rst","patch_set":3,"id":"bacf61ea_e6ae3784","line":30,"range":{"start_line":30,"start_character":1,"end_line":30,"end_character":22},"updated":"2016-07-28 17:45:21.000000000","message":"Consider making this a ref to the actual OVO docs, or put a ref to them somewhere else.","commit_id":"1f0e63b1454a15db392bc3d7b6d13d83b9c92c20"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"9c577b960c3806bf013f7f08c3635de2547877f0","unresolved":false,"context_lines":[{"line_number":27,"context_line":"Initially implemented by nova community, it was pushed to oslo library, so that"},{"line_number":28,"context_line":"other projects can benefit from it."},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"\u0027Oslo VersionedObjects\u0027 (aka OVO) is a database facade, where you define the"},{"line_number":31,"context_line":"middle layer between software and database schema. The layer is about creating"},{"line_number":32,"context_line":"object per database resource, and make them versioned, meaning save their"},{"line_number":33,"context_line":"definition in particular time. When you change the database schema, you change"}],"source_content_type":"text/x-rst","patch_set":3,"id":"bacf61ea_c9ebe3da","line":30,"range":{"start_line":30,"start_character":1,"end_line":30,"end_character":22},"in_reply_to":"bacf61ea_e6ae3784","updated":"2016-08-05 09:31:40.000000000","message":"Done","commit_id":"1f0e63b1454a15db392bc3d7b6d13d83b9c92c20"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"7c9d63103afd5c0a9aa7a869fef1e9719aff1614","unresolved":false,"context_lines":[{"line_number":30,"context_line":"\u0027Oslo VersionedObjects\u0027 (aka OVO) is a database facade, where you define the"},{"line_number":31,"context_line":"middle layer between software and database schema. The layer is about creating"},{"line_number":32,"context_line":"object per database resource, and make them versioned, meaning save their"},{"line_number":33,"context_line":"definition in particular time. When you change the database schema, you change"},{"line_number":34,"context_line":"the version of an object and provide backward compatible translation method."},{"line_number":35,"context_line":"Different version of software can communicate with each other, allowing"},{"line_number":36,"context_line":"to communicate different version of software (via RPC i.e.)."}],"source_content_type":"text/x-rst","patch_set":3,"id":"dada55a8_79bc8e6c","line":33,"range":{"start_line":33,"start_character":67,"end_line":33,"end_character":68},"updated":"2016-07-25 18:24:17.000000000","message":"as consequence?","commit_id":"1f0e63b1454a15db392bc3d7b6d13d83b9c92c20"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"c8c75265c68010a93d6a87e97e1745d830cabb2e","unresolved":false,"context_lines":[{"line_number":32,"context_line":"object per database resource, and make them versioned, meaning save their"},{"line_number":33,"context_line":"definition in particular time. When you change the database schema, you change"},{"line_number":34,"context_line":"the version of an object and provide backward compatible translation method."},{"line_number":35,"context_line":"Different version of software can communicate with each other, allowing"},{"line_number":36,"context_line":"to communicate different version of software (via RPC i.e.)."},{"line_number":37,"context_line":""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"OVO is also commonly used for RPC payload versioning. It is used for versioning"}],"source_content_type":"text/x-rst","patch_set":3,"id":"bacf61ea_904051a7","line":36,"range":{"start_line":35,"start_character":63,"end_line":36,"end_character":32},"updated":"2016-07-28 17:45:21.000000000","message":"Nit: \"allowing communication between different versions of the software\".","commit_id":"1f0e63b1454a15db392bc3d7b6d13d83b9c92c20"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"9c577b960c3806bf013f7f08c3635de2547877f0","unresolved":false,"context_lines":[{"line_number":32,"context_line":"object per database resource, and make them versioned, meaning save their"},{"line_number":33,"context_line":"definition in particular time. When you change the database schema, you change"},{"line_number":34,"context_line":"the version of an object and provide backward compatible translation method."},{"line_number":35,"context_line":"Different version of software can communicate with each other, allowing"},{"line_number":36,"context_line":"to communicate different version of software (via RPC i.e.)."},{"line_number":37,"context_line":""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"OVO is also commonly used for RPC payload versioning. It is used for versioning"}],"source_content_type":"text/x-rst","patch_set":3,"id":"bacf61ea_09d97b57","line":36,"range":{"start_line":35,"start_character":63,"end_line":36,"end_character":32},"in_reply_to":"bacf61ea_904051a7","updated":"2016-08-05 09:31:40.000000000","message":"Done","commit_id":"1f0e63b1454a15db392bc3d7b6d13d83b9c92c20"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"7c9d63103afd5c0a9aa7a869fef1e9719aff1614","unresolved":false,"context_lines":[{"line_number":35,"context_line":"Different version of software can communicate with each other, allowing"},{"line_number":36,"context_line":"to communicate different version of software (via RPC i.e.)."},{"line_number":37,"context_line":""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"OVO is also commonly used for RPC payload versioning. It is used for versioning"},{"line_number":40,"context_line":"dictionary messages, define strict structure of it and keep the strong typing."},{"line_number":41,"context_line":"Because of it, you can be sure what is send and how to use the data on"}],"source_content_type":"text/x-rst","patch_set":3,"id":"dada55a8_591b8a80","line":38,"updated":"2016-07-25 18:24:17.000000000","message":"extra line break","commit_id":"1f0e63b1454a15db392bc3d7b6d13d83b9c92c20"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"9c577b960c3806bf013f7f08c3635de2547877f0","unresolved":false,"context_lines":[{"line_number":35,"context_line":"Different version of software can communicate with each other, allowing"},{"line_number":36,"context_line":"to communicate different version of software (via RPC i.e.)."},{"line_number":37,"context_line":""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"OVO is also commonly used for RPC payload versioning. It is used for versioning"},{"line_number":40,"context_line":"dictionary messages, define strict structure of it and keep the strong typing."},{"line_number":41,"context_line":"Because of it, you can be sure what is send and how to use the data on"}],"source_content_type":"text/x-rst","patch_set":3,"id":"bacf61ea_49dff339","line":38,"in_reply_to":"dada55a8_591b8a80","updated":"2016-08-05 09:31:40.000000000","message":"Done","commit_id":"1f0e63b1454a15db392bc3d7b6d13d83b9c92c20"},{"author":{"_account_id":22218,"name":"Sindhu Devale","email":"sindhu.devale@intel.com","username":"sindhudevale"},"change_message_id":"4a66adb27ef9b5f82e5b74546a71252ecf81e145","unresolved":false,"context_lines":[{"line_number":38,"context_line":""},{"line_number":39,"context_line":"OVO is also commonly used for RPC payload versioning. It is used for versioning"},{"line_number":40,"context_line":"dictionary messages, define strict structure of it and keep the strong typing."},{"line_number":41,"context_line":"Because of it, you can be sure what is send and how to use the data on"},{"line_number":42,"context_line":"receiving end."},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"In order to meet complex neutron requirements, we have introduced multiple"}],"source_content_type":"text/x-rst","patch_set":3,"id":"dada55a8_fe6ae4b3","line":41,"range":{"start_line":41,"start_character":39,"end_line":41,"end_character":43},"updated":"2016-07-26 18:14:19.000000000","message":"typo: sent","commit_id":"1f0e63b1454a15db392bc3d7b6d13d83b9c92c20"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"9c577b960c3806bf013f7f08c3635de2547877f0","unresolved":false,"context_lines":[{"line_number":38,"context_line":""},{"line_number":39,"context_line":"OVO is also commonly used for RPC payload versioning. It is used for versioning"},{"line_number":40,"context_line":"dictionary messages, define strict structure of it and keep the strong typing."},{"line_number":41,"context_line":"Because of it, you can be sure what is send and how to use the data on"},{"line_number":42,"context_line":"receiving end."},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"In order to meet complex neutron requirements, we have introduced multiple"}],"source_content_type":"text/x-rst","patch_set":3,"id":"bacf61ea_29d43f1e","line":41,"range":{"start_line":41,"start_character":39,"end_line":41,"end_character":43},"in_reply_to":"dada55a8_fe6ae4b3","updated":"2016-08-05 09:31:40.000000000","message":"Done","commit_id":"1f0e63b1454a15db392bc3d7b6d13d83b9c92c20"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"c8c75265c68010a93d6a87e97e1745d830cabb2e","unresolved":false,"context_lines":[{"line_number":60,"context_line":""},{"line_number":61,"context_line":"In order to add new object in Neutron, you have to:"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"#. Create object derived from NeutronDbObject (aka base object)"},{"line_number":64,"context_line":"#. Add/reuse data model"},{"line_number":65,"context_line":"#. Define fields"},{"line_number":66,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"bacf61ea_503c19e2","line":63,"range":{"start_line":63,"start_character":30,"end_line":63,"end_character":45},"updated":"2016-07-28 17:45:21.000000000","message":"Nit: consider formatting as \u0027code\u0027.","commit_id":"1f0e63b1454a15db392bc3d7b6d13d83b9c92c20"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"9c577b960c3806bf013f7f08c3635de2547877f0","unresolved":false,"context_lines":[{"line_number":60,"context_line":""},{"line_number":61,"context_line":"In order to add new object in Neutron, you have to:"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"#. Create object derived from NeutronDbObject (aka base object)"},{"line_number":64,"context_line":"#. Add/reuse data model"},{"line_number":65,"context_line":"#. Define fields"},{"line_number":66,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"bacf61ea_e917c7eb","line":63,"range":{"start_line":63,"start_character":30,"end_line":63,"end_character":45},"in_reply_to":"bacf61ea_503c19e2","updated":"2016-08-05 09:31:40.000000000","message":"Done","commit_id":"1f0e63b1454a15db392bc3d7b6d13d83b9c92c20"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"c8c75265c68010a93d6a87e97e1745d830cabb2e","unresolved":false,"context_lines":[{"line_number":64,"context_line":"#. Add/reuse data model"},{"line_number":65,"context_line":"#. Define fields"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"It is mandatory to define data model using db_model property from"},{"line_number":68,"context_line":"NeutronDbObject."},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"Fields should be defined using :code:`oslo_versionobjects.fields` exposed types."}],"source_content_type":"text/x-rst","patch_set":3,"id":"bacf61ea_4b246eae","line":67,"range":{"start_line":67,"start_character":43,"end_line":67,"end_character":51},"updated":"2016-07-28 17:45:21.000000000","message":"Nit: consider formatting as \u0027code\u0027.","commit_id":"1f0e63b1454a15db392bc3d7b6d13d83b9c92c20"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"9c577b960c3806bf013f7f08c3635de2547877f0","unresolved":false,"context_lines":[{"line_number":64,"context_line":"#. Add/reuse data model"},{"line_number":65,"context_line":"#. Define fields"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"It is mandatory to define data model using db_model property from"},{"line_number":68,"context_line":"NeutronDbObject."},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"Fields should be defined using :code:`oslo_versionobjects.fields` exposed types."}],"source_content_type":"text/x-rst","patch_set":3,"id":"bacf61ea_891e0b0a","line":67,"range":{"start_line":67,"start_character":43,"end_line":67,"end_character":51},"in_reply_to":"bacf61ea_4b246eae","updated":"2016-08-05 09:31:40.000000000","message":"Done","commit_id":"1f0e63b1454a15db392bc3d7b6d13d83b9c92c20"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"c8c75265c68010a93d6a87e97e1745d830cabb2e","unresolved":false,"context_lines":[{"line_number":65,"context_line":"#. Define fields"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"It is mandatory to define data model using db_model property from"},{"line_number":68,"context_line":"NeutronDbObject."},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"Fields should be defined using :code:`oslo_versionobjects.fields` exposed types."},{"line_number":71,"context_line":"If there is a special need to create a new type of field, we have created"}],"source_content_type":"text/x-rst","patch_set":3,"id":"bacf61ea_ab3b6ad0","line":68,"range":{"start_line":68,"start_character":0,"end_line":68,"end_character":15},"updated":"2016-07-28 17:45:21.000000000","message":"Nit: consider formatting as \u0027code\u0027.","commit_id":"1f0e63b1454a15db392bc3d7b6d13d83b9c92c20"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"9c577b960c3806bf013f7f08c3635de2547877f0","unresolved":false,"context_lines":[{"line_number":65,"context_line":"#. Define fields"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"It is mandatory to define data model using db_model property from"},{"line_number":68,"context_line":"NeutronDbObject."},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"Fields should be defined using :code:`oslo_versionobjects.fields` exposed types."},{"line_number":71,"context_line":"If there is a special need to create a new type of field, we have created"}],"source_content_type":"text/x-rst","patch_set":3,"id":"bacf61ea_a9214f4f","line":68,"range":{"start_line":68,"start_character":0,"end_line":68,"end_character":15},"in_reply_to":"bacf61ea_ab3b6ad0","updated":"2016-08-05 09:31:40.000000000","message":"Done","commit_id":"1f0e63b1454a15db392bc3d7b6d13d83b9c92c20"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"c8c75265c68010a93d6a87e97e1745d830cabb2e","unresolved":false,"context_lines":[{"line_number":79,"context_line":"        \u0027ip_version\u0027: common_types.IPVersionEnumField()"},{"line_number":80,"context_line":"    }"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"VERSION is very important field defining version of the object. Initially"},{"line_number":83,"context_line":"version should be set to 1.0."},{"line_number":84,"context_line":"Version needs to be changed if fields or their types are modified. When you"},{"line_number":85,"context_line":"change the version of objects being exposed via RPC, you need to add method"}],"source_content_type":"text/x-rst","patch_set":3,"id":"bacf61ea_0bd71624","line":82,"range":{"start_line":82,"start_character":8,"end_line":82,"end_character":15},"updated":"2016-07-28 17:45:21.000000000","message":"Nit: \u0027is a very...\u0027","commit_id":"1f0e63b1454a15db392bc3d7b6d13d83b9c92c20"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"9c577b960c3806bf013f7f08c3635de2547877f0","unresolved":false,"context_lines":[{"line_number":79,"context_line":"        \u0027ip_version\u0027: common_types.IPVersionEnumField()"},{"line_number":80,"context_line":"    }"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"VERSION is very important field defining version of the object. Initially"},{"line_number":83,"context_line":"version should be set to 1.0."},{"line_number":84,"context_line":"Version needs to be changed if fields or their types are modified. When you"},{"line_number":85,"context_line":"change the version of objects being exposed via RPC, you need to add method"}],"source_content_type":"text/x-rst","patch_set":3,"id":"bacf61ea_49289333","line":82,"range":{"start_line":82,"start_character":8,"end_line":82,"end_character":15},"in_reply_to":"bacf61ea_0bd71624","updated":"2016-08-05 09:31:40.000000000","message":"Done","commit_id":"1f0e63b1454a15db392bc3d7b6d13d83b9c92c20"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"7c9d63103afd5c0a9aa7a869fef1e9719aff1614","unresolved":false,"context_lines":[{"line_number":85,"context_line":"change the version of objects being exposed via RPC, you need to add method"},{"line_number":86,"context_line":":code:`obj_make_compatible(self, primitive, target_version)`."},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"You are able to define multiple primary keys connected to the object."},{"line_number":89,"context_line":":code:`primary_keys \u003d [\u0027id\u0027]`. We have defined :code:`fields_no_update` list,"},{"line_number":90,"context_line":"which is containing primary keys and as well can be extended by any field that"},{"line_number":91,"context_line":"is defined in object, and should not be changed during operating on object."}],"source_content_type":"text/x-rst","patch_set":3,"id":"dada55a8_409427e1","line":88,"updated":"2016-07-25 18:24:17.000000000","message":"Can you mention which is the default value of the primary keys field?","commit_id":"1f0e63b1454a15db392bc3d7b6d13d83b9c92c20"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"9c577b960c3806bf013f7f08c3635de2547877f0","unresolved":false,"context_lines":[{"line_number":85,"context_line":"change the version of objects being exposed via RPC, you need to add method"},{"line_number":86,"context_line":":code:`obj_make_compatible(self, primitive, target_version)`."},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"You are able to define multiple primary keys connected to the object."},{"line_number":89,"context_line":":code:`primary_keys \u003d [\u0027id\u0027]`. We have defined :code:`fields_no_update` list,"},{"line_number":90,"context_line":"which is containing primary keys and as well can be extended by any field that"},{"line_number":91,"context_line":"is defined in object, and should not be changed during operating on object."}],"source_content_type":"text/x-rst","patch_set":3,"id":"bacf61ea_6923d758","line":88,"in_reply_to":"dada55a8_409427e1","updated":"2016-08-05 09:31:40.000000000","message":"Done","commit_id":"1f0e63b1454a15db392bc3d7b6d13d83b9c92c20"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"c8c75265c68010a93d6a87e97e1745d830cabb2e","unresolved":false,"context_lines":[{"line_number":86,"context_line":":code:`obj_make_compatible(self, primitive, target_version)`."},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"You are able to define multiple primary keys connected to the object."},{"line_number":89,"context_line":":code:`primary_keys \u003d [\u0027id\u0027]`. We have defined :code:`fields_no_update` list,"},{"line_number":90,"context_line":"which is containing primary keys and as well can be extended by any field that"},{"line_number":91,"context_line":"is defined in object, and should not be changed during operating on object."},{"line_number":92,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"bacf61ea_8b9f864f","line":89,"range":{"start_line":89,"start_character":0,"end_line":89,"end_character":29},"updated":"2016-07-28 17:45:21.000000000","message":"This seems a little out of place. Maybe it should read something like:\n\n\n\"connected to the object using the `primary_keys` field that references the OVO\u0027s key fields. For example: `primary_keys \u003d [\u0027id\u0027]`\"","commit_id":"1f0e63b1454a15db392bc3d7b6d13d83b9c92c20"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"c8c75265c68010a93d6a87e97e1745d830cabb2e","unresolved":false,"context_lines":[{"line_number":87,"context_line":""},{"line_number":88,"context_line":"You are able to define multiple primary keys connected to the object."},{"line_number":89,"context_line":":code:`primary_keys \u003d [\u0027id\u0027]`. We have defined :code:`fields_no_update` list,"},{"line_number":90,"context_line":"which is containing primary keys and as well can be extended by any field that"},{"line_number":91,"context_line":"is defined in object, and should not be changed during operating on object."},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"If there is situation, that field should be named differently in object"},{"line_number":94,"context_line":"than in database schema, you can use :code:`fields_need_translation`."}],"source_content_type":"text/x-rst","patch_set":3,"id":"bacf61ea_8b694628","line":91,"range":{"start_line":90,"start_character":0,"end_line":91,"end_character":73},"updated":"2016-07-28 17:45:21.000000000","message":"Perhaps this can be reworded a little to something like:\n\n\"For immutable primary keys that cannot be changed, the `fields_no_update` attribute can be defined as a list of field names that do not allow update.\"","commit_id":"1f0e63b1454a15db392bc3d7b6d13d83b9c92c20"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"9c577b960c3806bf013f7f08c3635de2547877f0","unresolved":false,"context_lines":[{"line_number":87,"context_line":""},{"line_number":88,"context_line":"You are able to define multiple primary keys connected to the object."},{"line_number":89,"context_line":":code:`primary_keys \u003d [\u0027id\u0027]`. We have defined :code:`fields_no_update` list,"},{"line_number":90,"context_line":"which is containing primary keys and as well can be extended by any field that"},{"line_number":91,"context_line":"is defined in object, and should not be changed during operating on object."},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"If there is situation, that field should be named differently in object"},{"line_number":94,"context_line":"than in database schema, you can use :code:`fields_need_translation`."}],"source_content_type":"text/x-rst","patch_set":3,"id":"bacf61ea_89f72bd2","line":91,"range":{"start_line":90,"start_character":0,"end_line":91,"end_character":73},"in_reply_to":"bacf61ea_8b694628","updated":"2016-08-05 09:31:40.000000000","message":"Done","commit_id":"1f0e63b1454a15db392bc3d7b6d13d83b9c92c20"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"c8c75265c68010a93d6a87e97e1745d830cabb2e","unresolved":false,"context_lines":[{"line_number":98,"context_line":"For example in IP allocation pools::"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    fields_need_translation \u003d {"},{"line_number":101,"context_line":"         \u0027start\u0027: \u0027first_ip\u0027,"},{"line_number":102,"context_line":"        \u0027end\u0027: \u0027last_ip\u0027"},{"line_number":103,"context_line":"    }"},{"line_number":104,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"bacf61ea_4bd58eb7","line":101,"range":{"start_line":101,"start_character":8,"end_line":101,"end_character":9},"updated":"2016-07-28 17:45:21.000000000","message":"Nit: this is a 5 space tab. Consider aligning with the \u0027end\u0027 below.","commit_id":"1f0e63b1454a15db392bc3d7b6d13d83b9c92c20"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"9c577b960c3806bf013f7f08c3635de2547877f0","unresolved":false,"context_lines":[{"line_number":98,"context_line":"For example in IP allocation pools::"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    fields_need_translation \u003d {"},{"line_number":101,"context_line":"         \u0027start\u0027: \u0027first_ip\u0027,"},{"line_number":102,"context_line":"        \u0027end\u0027: \u0027last_ip\u0027"},{"line_number":103,"context_line":"    }"},{"line_number":104,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"bacf61ea_4911b303","line":101,"range":{"start_line":101,"start_character":8,"end_line":101,"end_character":9},"in_reply_to":"bacf61ea_4bd58eb7","updated":"2016-08-05 09:31:40.000000000","message":"Done","commit_id":"1f0e63b1454a15db392bc3d7b6d13d83b9c92c20"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"80da04eb157b93b5e7b59bcea98537bd81b7db1f","unresolved":false,"context_lines":[{"line_number":124,"context_line":"    class DNSNameServer(model_base.BASEV2):"},{"line_number":125,"context_line":"    \"\"\"Internal representation of a DNS nameserver.\"\"\""},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"    address \u003d sa.Column(sa.String(128), nullable\u003dFalse, primary_key\u003dTrue)"},{"line_number":128,"context_line":"    subnet_id \u003d sa.Column(sa.String(36),"},{"line_number":129,"context_line":"                          sa.ForeignKey(\u0027subnets.id\u0027,"},{"line_number":130,"context_line":"                                        ondelete\u003d\"CASCADE\"),"},{"line_number":131,"context_line":"                          primary_key\u003dTrue)"},{"line_number":132,"context_line":"    order \u003d sa.Column(sa.Integer, server_default\u003d\u00270\u0027)"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"Here we have multiple primary keys, foreign key referencing Subnet entity and"},{"line_number":135,"context_line":"third field, which can be nullable. To create oslo versionedobject, we should"}],"source_content_type":"text/x-rst","patch_set":3,"id":"dada55a8_793b259d","line":132,"range":{"start_line":127,"start_character":4,"end_line":132,"end_character":53},"updated":"2016-07-23 00:07:27.000000000","message":"identation with class needed. otherwise it seems out of class","commit_id":"1f0e63b1454a15db392bc3d7b6d13d83b9c92c20"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"9c577b960c3806bf013f7f08c3635de2547877f0","unresolved":false,"context_lines":[{"line_number":124,"context_line":"    class DNSNameServer(model_base.BASEV2):"},{"line_number":125,"context_line":"    \"\"\"Internal representation of a DNS nameserver.\"\"\""},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"    address \u003d sa.Column(sa.String(128), nullable\u003dFalse, primary_key\u003dTrue)"},{"line_number":128,"context_line":"    subnet_id \u003d sa.Column(sa.String(36),"},{"line_number":129,"context_line":"                          sa.ForeignKey(\u0027subnets.id\u0027,"},{"line_number":130,"context_line":"                                        ondelete\u003d\"CASCADE\"),"},{"line_number":131,"context_line":"                          primary_key\u003dTrue)"},{"line_number":132,"context_line":"    order \u003d sa.Column(sa.Integer, server_default\u003d\u00270\u0027)"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"Here we have multiple primary keys, foreign key referencing Subnet entity and"},{"line_number":135,"context_line":"third field, which can be nullable. To create oslo versionedobject, we should"}],"source_content_type":"text/x-rst","patch_set":3,"id":"bacf61ea_690c77ec","line":132,"range":{"start_line":127,"start_character":4,"end_line":132,"end_character":53},"in_reply_to":"dada55a8_793b259d","updated":"2016-08-05 09:31:40.000000000","message":"Done","commit_id":"1f0e63b1454a15db392bc3d7b6d13d83b9c92c20"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"c8c75265c68010a93d6a87e97e1745d830cabb2e","unresolved":false,"context_lines":[{"line_number":146,"context_line":""},{"line_number":147,"context_line":"        primary_keys \u003d [\u0027address\u0027, \u0027subnet_id\u0027]"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"        foreign_keys \u003d {\u0027subnet_id\u0027: \u0027id\u0027}"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"        fields \u003d {"},{"line_number":152,"context_line":"            \u0027address\u0027: obj_fields.StringField(),"}],"source_content_type":"text/x-rst","patch_set":3,"id":"bacf61ea_4b710ee0","line":149,"range":{"start_line":149,"start_character":8,"end_line":149,"end_character":20},"updated":"2016-07-28 17:45:21.000000000","message":"I didn\u0027t see \u0027foreign_keys\u0027 discussed above, but maybe it\u0027s obvious and not needed?","commit_id":"1f0e63b1454a15db392bc3d7b6d13d83b9c92c20"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"9c577b960c3806bf013f7f08c3635de2547877f0","unresolved":false,"context_lines":[{"line_number":146,"context_line":""},{"line_number":147,"context_line":"        primary_keys \u003d [\u0027address\u0027, \u0027subnet_id\u0027]"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"        foreign_keys \u003d {\u0027subnet_id\u0027: \u0027id\u0027}"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"        fields \u003d {"},{"line_number":152,"context_line":"            \u0027address\u0027: obj_fields.StringField(),"}],"source_content_type":"text/x-rst","patch_set":3,"id":"bacf61ea_090b3bd7","line":149,"range":{"start_line":149,"start_character":8,"end_line":149,"end_character":20},"in_reply_to":"bacf61ea_4b710ee0","updated":"2016-08-05 09:31:40.000000000","message":"Done","commit_id":"1f0e63b1454a15db392bc3d7b6d13d83b9c92c20"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"80da04eb157b93b5e7b59bcea98537bd81b7db1f","unresolved":false,"context_lines":[{"line_number":138,"context_line":".. code-block:: Python"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"    @obj_base.VersionedObjectRegistry.register"},{"line_number":141,"context_line":"    class DNSNameServer(base.NeutronDbObject):"},{"line_number":142,"context_line":"        # Version 1.0: Initial version"},{"line_number":143,"context_line":"        VERSION \u003d \u00271.0\u0027"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"        db_model \u003d models_v2.DNSNameServer"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"        primary_keys \u003d [\u0027address\u0027, \u0027subnet_id\u0027]"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"        foreign_keys \u003d {\u0027subnet_id\u0027: \u0027id\u0027}"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"        fields \u003d {"},{"line_number":152,"context_line":"            \u0027address\u0027: obj_fields.StringField(),"},{"line_number":153,"context_line":"            \u0027subnet_id\u0027: obj_fields.UUIDField(),"},{"line_number":154,"context_line":"            \u0027order\u0027: obj_fields.IntegerField(nullable\u003dTrue)"},{"line_number":155,"context_line":"        }"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"We are defining VERSION as 1.0, primary_keys as address and subnet_id pair,"},{"line_number":158,"context_line":"foreign_keys as subnet_id referencing id from foreign class that will call"}],"source_content_type":"text/x-rst","patch_set":3,"id":"dada55a8_591aa118","line":155,"range":{"start_line":141,"start_character":4,"end_line":155,"end_character":9},"updated":"2016-07-23 00:07:27.000000000","message":"to make one complete example I\u0027ll suggest to example of fields_need_translation in upper portion and would pick a object that make used of it, in fact object that make use of most and have one complete example. probably example little down when things like synthetic fields have been introduced.","commit_id":"1f0e63b1454a15db392bc3d7b6d13d83b9c92c20"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"9c577b960c3806bf013f7f08c3635de2547877f0","unresolved":false,"context_lines":[{"line_number":138,"context_line":".. code-block:: Python"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"    @obj_base.VersionedObjectRegistry.register"},{"line_number":141,"context_line":"    class DNSNameServer(base.NeutronDbObject):"},{"line_number":142,"context_line":"        # Version 1.0: Initial version"},{"line_number":143,"context_line":"        VERSION \u003d \u00271.0\u0027"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"        db_model \u003d models_v2.DNSNameServer"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"        primary_keys \u003d [\u0027address\u0027, \u0027subnet_id\u0027]"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"        foreign_keys \u003d {\u0027subnet_id\u0027: \u0027id\u0027}"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"        fields \u003d {"},{"line_number":152,"context_line":"            \u0027address\u0027: obj_fields.StringField(),"},{"line_number":153,"context_line":"            \u0027subnet_id\u0027: obj_fields.UUIDField(),"},{"line_number":154,"context_line":"            \u0027order\u0027: obj_fields.IntegerField(nullable\u003dTrue)"},{"line_number":155,"context_line":"        }"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"We are defining VERSION as 1.0, primary_keys as address and subnet_id pair,"},{"line_number":158,"context_line":"foreign_keys as subnet_id referencing id from foreign class that will call"}],"source_content_type":"text/x-rst","patch_set":3,"id":"bacf61ea_e969878d","line":155,"range":{"start_line":141,"start_character":4,"end_line":155,"end_character":9},"in_reply_to":"bacf61ea_0b5e0b45","updated":"2016-08-05 09:31:40.000000000","message":"Done","commit_id":"1f0e63b1454a15db392bc3d7b6d13d83b9c92c20"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"9c577b960c3806bf013f7f08c3635de2547877f0","unresolved":false,"context_lines":[{"line_number":138,"context_line":".. code-block:: Python"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"    @obj_base.VersionedObjectRegistry.register"},{"line_number":141,"context_line":"    class DNSNameServer(base.NeutronDbObject):"},{"line_number":142,"context_line":"        # Version 1.0: Initial version"},{"line_number":143,"context_line":"        VERSION \u003d \u00271.0\u0027"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"        db_model \u003d models_v2.DNSNameServer"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"        primary_keys \u003d [\u0027address\u0027, \u0027subnet_id\u0027]"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"        foreign_keys \u003d {\u0027subnet_id\u0027: \u0027id\u0027}"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"        fields \u003d {"},{"line_number":152,"context_line":"            \u0027address\u0027: obj_fields.StringField(),"},{"line_number":153,"context_line":"            \u0027subnet_id\u0027: obj_fields.UUIDField(),"},{"line_number":154,"context_line":"            \u0027order\u0027: obj_fields.IntegerField(nullable\u003dTrue)"},{"line_number":155,"context_line":"        }"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"We are defining VERSION as 1.0, primary_keys as address and subnet_id pair,"},{"line_number":158,"context_line":"foreign_keys as subnet_id referencing id from foreign class that will call"}],"source_content_type":"text/x-rst","patch_set":3,"id":"bacf61ea_c96643ba","line":155,"range":{"start_line":141,"start_character":4,"end_line":155,"end_character":9},"in_reply_to":"dada55a8_591aa118","updated":"2016-08-05 09:31:40.000000000","message":"Done","commit_id":"1f0e63b1454a15db392bc3d7b6d13d83b9c92c20"},{"author":{"_account_id":12175,"name":"Eli Qiao","email":"qiaoliyong@gmail.com","username":"Eli"},"change_message_id":"f68a485d622466b0042881cbbfab027f08299190","unresolved":false,"context_lines":[{"line_number":138,"context_line":".. code-block:: Python"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"    @obj_base.VersionedObjectRegistry.register"},{"line_number":141,"context_line":"    class DNSNameServer(base.NeutronDbObject):"},{"line_number":142,"context_line":"        # Version 1.0: Initial version"},{"line_number":143,"context_line":"        VERSION \u003d \u00271.0\u0027"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"        db_model \u003d models_v2.DNSNameServer"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"        primary_keys \u003d [\u0027address\u0027, \u0027subnet_id\u0027]"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"        foreign_keys \u003d {\u0027subnet_id\u0027: \u0027id\u0027}"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"        fields \u003d {"},{"line_number":152,"context_line":"            \u0027address\u0027: obj_fields.StringField(),"},{"line_number":153,"context_line":"            \u0027subnet_id\u0027: obj_fields.UUIDField(),"},{"line_number":154,"context_line":"            \u0027order\u0027: obj_fields.IntegerField(nullable\u003dTrue)"},{"line_number":155,"context_line":"        }"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"We are defining VERSION as 1.0, primary_keys as address and subnet_id pair,"},{"line_number":158,"context_line":"foreign_keys as subnet_id referencing id from foreign class that will call"}],"source_content_type":"text/x-rst","patch_set":3,"id":"bacf61ea_0b5e0b45","line":155,"range":{"start_line":141,"start_character":4,"end_line":155,"end_character":9},"in_reply_to":"dada55a8_591aa118","updated":"2016-08-03 09:44:43.000000000","message":"also a relationship member example.","commit_id":"1f0e63b1454a15db392bc3d7b6d13d83b9c92c20"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"c8c75265c68010a93d6a87e97e1745d830cabb2e","unresolved":false,"context_lines":[{"line_number":154,"context_line":"            \u0027order\u0027: obj_fields.IntegerField(nullable\u003dTrue)"},{"line_number":155,"context_line":"        }"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"We are defining VERSION as 1.0, primary_keys as address and subnet_id pair,"},{"line_number":158,"context_line":"foreign_keys as subnet_id referencing id from foreign class that will call"},{"line_number":159,"context_line":"get_objects in DNSNameServer. Also fields are defined using oslo versionedobjects"},{"line_number":160,"context_line":"provided types. Please note the :code:`nullable\u003dTrue` for :code:`order` param."}],"source_content_type":"text/x-rst","patch_set":3,"id":"bacf61ea_eb59e25b","line":157,"range":{"start_line":157,"start_character":32,"end_line":157,"end_character":44},"updated":"2016-07-28 17:45:21.000000000","message":"Consider formatting these as \u0027code\u0027 in this paragraph.","commit_id":"1f0e63b1454a15db392bc3d7b6d13d83b9c92c20"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"9c577b960c3806bf013f7f08c3635de2547877f0","unresolved":false,"context_lines":[{"line_number":154,"context_line":"            \u0027order\u0027: obj_fields.IntegerField(nullable\u003dTrue)"},{"line_number":155,"context_line":"        }"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"We are defining VERSION as 1.0, primary_keys as address and subnet_id pair,"},{"line_number":158,"context_line":"foreign_keys as subnet_id referencing id from foreign class that will call"},{"line_number":159,"context_line":"get_objects in DNSNameServer. Also fields are defined using oslo versionedobjects"},{"line_number":160,"context_line":"provided types. Please note the :code:`nullable\u003dTrue` for :code:`order` param."}],"source_content_type":"text/x-rst","patch_set":3,"id":"bacf61ea_8970cb73","line":157,"range":{"start_line":157,"start_character":32,"end_line":157,"end_character":44},"in_reply_to":"bacf61ea_eb59e25b","updated":"2016-08-05 09:31:40.000000000","message":"Done","commit_id":"1f0e63b1454a15db392bc3d7b6d13d83b9c92c20"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"7c9d63103afd5c0a9aa7a869fef1e9719aff1614","unresolved":false,"context_lines":[{"line_number":158,"context_line":"foreign_keys as subnet_id referencing id from foreign class that will call"},{"line_number":159,"context_line":"get_objects in DNSNameServer. Also fields are defined using oslo versionedobjects"},{"line_number":160,"context_line":"provided types. Please note the :code:`nullable\u003dTrue` for :code:`order` param."},{"line_number":161,"context_line":""},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"Synthetic fields"},{"line_number":164,"context_line":"----------------"}],"source_content_type":"text/x-rst","patch_set":3,"id":"dada55a8_000d0f3e","line":161,"updated":"2016-07-25 18:24:17.000000000","message":"Extra break line","commit_id":"1f0e63b1454a15db392bc3d7b6d13d83b9c92c20"},{"author":{"_account_id":22218,"name":"Sindhu Devale","email":"sindhu.devale@intel.com","username":"sindhudevale"},"change_message_id":"ea41d6d3d7d06b7526d9d9685c35e5b33fcfd827","unresolved":false,"context_lines":[{"line_number":165,"context_line":"Specific for neutron usage, concept of synthetic fields was introduced. It is"},{"line_number":166,"context_line":"list of fields, that are not directly defined in data model, but should be"},{"line_number":167,"context_line":"filled from other database entities or compute at runtime."},{"line_number":168,"context_line":"The synthetic fields can be of different type, it can be build-it types (bool,"},{"line_number":169,"context_line":"int) as well as object type. For example::"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"    fields \u003d {"}],"source_content_type":"text/x-rst","patch_set":3,"id":"bacf61ea_dc0bfb22","line":168,"range":{"start_line":168,"start_character":63,"end_line":168,"end_character":65},"updated":"2016-08-03 19:35:33.000000000","message":"nit: in","commit_id":"1f0e63b1454a15db392bc3d7b6d13d83b9c92c20"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"9c577b960c3806bf013f7f08c3635de2547877f0","unresolved":false,"context_lines":[{"line_number":165,"context_line":"Specific for neutron usage, concept of synthetic fields was introduced. It is"},{"line_number":166,"context_line":"list of fields, that are not directly defined in data model, but should be"},{"line_number":167,"context_line":"filled from other database entities or compute at runtime."},{"line_number":168,"context_line":"The synthetic fields can be of different type, it can be build-it types (bool,"},{"line_number":169,"context_line":"int) as well as object type. For example::"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"    fields \u003d {"}],"source_content_type":"text/x-rst","patch_set":3,"id":"bacf61ea_8993ab5a","line":168,"range":{"start_line":168,"start_character":63,"end_line":168,"end_character":65},"in_reply_to":"bacf61ea_dc0bfb22","updated":"2016-08-05 09:31:40.000000000","message":"Done","commit_id":"1f0e63b1454a15db392bc3d7b6d13d83b9c92c20"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"c8c75265c68010a93d6a87e97e1745d830cabb2e","unresolved":false,"context_lines":[{"line_number":177,"context_line":""},{"line_number":178,"context_line":"    synthetic_fields \u003d [\u0027dhcp_agents\u0027, \u0027shared\u0027, \u0027subnets\u0027]"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"ObjectField and ListOfObjectsField takes as an argument name of object class."},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"For example, ORM relationships can be modeled by synthetic fields."},{"line_number":183,"context_line":"Synthetic fields can have other OVO class defined for access."}],"source_content_type":"text/x-rst","patch_set":3,"id":"bacf61ea_0b1c3676","line":180,"range":{"start_line":180,"start_character":0,"end_line":180,"end_character":11},"updated":"2016-07-28 17:45:21.000000000","message":"Consider formatting these as \u0027code\u0027.","commit_id":"1f0e63b1454a15db392bc3d7b6d13d83b9c92c20"},{"author":{"_account_id":22218,"name":"Sindhu Devale","email":"sindhu.devale@intel.com","username":"sindhudevale"},"change_message_id":"ea41d6d3d7d06b7526d9d9685c35e5b33fcfd827","unresolved":false,"context_lines":[{"line_number":177,"context_line":""},{"line_number":178,"context_line":"    synthetic_fields \u003d [\u0027dhcp_agents\u0027, \u0027shared\u0027, \u0027subnets\u0027]"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"ObjectField and ListOfObjectsField takes as an argument name of object class."},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"For example, ORM relationships can be modeled by synthetic fields."},{"line_number":183,"context_line":"Synthetic fields can have other OVO class defined for access."}],"source_content_type":"text/x-rst","patch_set":3,"id":"bacf61ea_fcdcff47","line":180,"range":{"start_line":180,"start_character":0,"end_line":180,"end_character":77},"updated":"2016-08-03 19:35:33.000000000","message":"This can be reworded as:\nObjectField and ListOfObjectsField takes name of object class as an argument.","commit_id":"1f0e63b1454a15db392bc3d7b6d13d83b9c92c20"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"9c577b960c3806bf013f7f08c3635de2547877f0","unresolved":false,"context_lines":[{"line_number":177,"context_line":""},{"line_number":178,"context_line":"    synthetic_fields \u003d [\u0027dhcp_agents\u0027, \u0027shared\u0027, \u0027subnets\u0027]"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"ObjectField and ListOfObjectsField takes as an argument name of object class."},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"For example, ORM relationships can be modeled by synthetic fields."},{"line_number":183,"context_line":"Synthetic fields can have other OVO class defined for access."}],"source_content_type":"text/x-rst","patch_set":3,"id":"bacf61ea_0964dbb6","line":180,"range":{"start_line":180,"start_character":0,"end_line":180,"end_character":11},"in_reply_to":"bacf61ea_0b1c3676","updated":"2016-08-05 09:31:40.000000000","message":"Done","commit_id":"1f0e63b1454a15db392bc3d7b6d13d83b9c92c20"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"9c577b960c3806bf013f7f08c3635de2547877f0","unresolved":false,"context_lines":[{"line_number":177,"context_line":""},{"line_number":178,"context_line":"    synthetic_fields \u003d [\u0027dhcp_agents\u0027, \u0027shared\u0027, \u0027subnets\u0027]"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"ObjectField and ListOfObjectsField takes as an argument name of object class."},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"For example, ORM relationships can be modeled by synthetic fields."},{"line_number":183,"context_line":"Synthetic fields can have other OVO class defined for access."}],"source_content_type":"text/x-rst","patch_set":3,"id":"bacf61ea_8949eb33","line":180,"range":{"start_line":180,"start_character":0,"end_line":180,"end_character":77},"in_reply_to":"bacf61ea_fcdcff47","updated":"2016-08-05 09:31:40.000000000","message":"Done","commit_id":"1f0e63b1454a15db392bc3d7b6d13d83b9c92c20"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"c8c75265c68010a93d6a87e97e1745d830cabb2e","unresolved":false,"context_lines":[{"line_number":203,"context_line":"        # Version 1.0: Initial version"},{"line_number":204,"context_line":"        VERSION \u003d \u00271.0\u0027"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"        fields - {"},{"line_number":207,"context_line":"            \u0027shared\u0027: obj_fields.BooleanField(nullable\u003dTrue),"},{"line_number":208,"context_line":"        }"},{"line_number":209,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"bacf61ea_465bc32e","line":206,"range":{"start_line":206,"start_character":15,"end_line":206,"end_character":16},"updated":"2016-07-28 17:45:21.000000000","message":"Should be an \u0027\u003d\u0027 here.","commit_id":"1f0e63b1454a15db392bc3d7b6d13d83b9c92c20"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"9c577b960c3806bf013f7f08c3635de2547877f0","unresolved":false,"context_lines":[{"line_number":203,"context_line":"        # Version 1.0: Initial version"},{"line_number":204,"context_line":"        VERSION \u003d \u00271.0\u0027"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"        fields - {"},{"line_number":207,"context_line":"            \u0027shared\u0027: obj_fields.BooleanField(nullable\u003dTrue),"},{"line_number":208,"context_line":"        }"},{"line_number":209,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"bacf61ea_a94caf42","line":206,"range":{"start_line":206,"start_character":15,"end_line":206,"end_character":16},"in_reply_to":"bacf61ea_465bc32e","updated":"2016-08-05 09:31:40.000000000","message":"Done","commit_id":"1f0e63b1454a15db392bc3d7b6d13d83b9c92c20"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"c8c75265c68010a93d6a87e97e1745d830cabb2e","unresolved":false,"context_lines":[{"line_number":279,"context_line":"-------------------"},{"line_number":280,"context_line":"The standard attributes are added automatically in metaclass"},{"line_number":281,"context_line":"DeclarativeObject. If adding standard attribute, it has to be added in"},{"line_number":282,"context_line":"neutron/objects/extensions/standardattributes.py. It will be added to all relevant"},{"line_number":283,"context_line":"objects that is using the standardattributes model."},{"line_number":284,"context_line":""},{"line_number":285,"context_line":"RBAC handling in objects"}],"source_content_type":"text/x-rst","patch_set":3,"id":"bacf61ea_06d42b45","line":282,"range":{"start_line":282,"start_character":0,"end_line":282,"end_character":48},"updated":"2016-07-28 17:45:21.000000000","message":"Consider formatting this as code and perhaps using the py package format rather than file path format.","commit_id":"1f0e63b1454a15db392bc3d7b6d13d83b9c92c20"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"9c577b960c3806bf013f7f08c3635de2547877f0","unresolved":false,"context_lines":[{"line_number":279,"context_line":"-------------------"},{"line_number":280,"context_line":"The standard attributes are added automatically in metaclass"},{"line_number":281,"context_line":"DeclarativeObject. If adding standard attribute, it has to be added in"},{"line_number":282,"context_line":"neutron/objects/extensions/standardattributes.py. It will be added to all relevant"},{"line_number":283,"context_line":"objects that is using the standardattributes model."},{"line_number":284,"context_line":""},{"line_number":285,"context_line":"RBAC handling in objects"}],"source_content_type":"text/x-rst","patch_set":3,"id":"bacf61ea_89244b0d","line":282,"range":{"start_line":282,"start_character":0,"end_line":282,"end_character":48},"in_reply_to":"bacf61ea_06d42b45","updated":"2016-08-05 09:31:40.000000000","message":"Done","commit_id":"1f0e63b1454a15db392bc3d7b6d13d83b9c92c20"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"c8c75265c68010a93d6a87e97e1745d830cabb2e","unresolved":false,"context_lines":[{"line_number":312,"context_line":""},{"line_number":313,"context_line":"    @oslo_obj_base.VersionedObjectRegistry.register_if(False)"},{"line_number":314,"context_line":"    class TestSubnetExtensionObject(obj_base.NeutronDbObject):"},{"line_number":315,"context_line":"    # Version 1.0: Initial version"},{"line_number":316,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":317,"context_line":""},{"line_number":318,"context_line":"    db_model \u003d TestSubnetExtension"}],"source_content_type":"text/x-rst","patch_set":3,"id":"bacf61ea_c6edf3f0","line":315,"range":{"start_line":315,"start_character":0,"end_line":315,"end_character":4},"updated":"2016-07-28 17:45:21.000000000","message":"Tab all this over (4 spaces) for the class defn.","commit_id":"1f0e63b1454a15db392bc3d7b6d13d83b9c92c20"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"9c577b960c3806bf013f7f08c3635de2547877f0","unresolved":false,"context_lines":[{"line_number":312,"context_line":""},{"line_number":313,"context_line":"    @oslo_obj_base.VersionedObjectRegistry.register_if(False)"},{"line_number":314,"context_line":"    class TestSubnetExtensionObject(obj_base.NeutronDbObject):"},{"line_number":315,"context_line":"    # Version 1.0: Initial version"},{"line_number":316,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":317,"context_line":""},{"line_number":318,"context_line":"    db_model \u003d TestSubnetExtension"}],"source_content_type":"text/x-rst","patch_set":3,"id":"bacf61ea_297a7ff1","line":315,"range":{"start_line":315,"start_character":0,"end_line":315,"end_character":4},"in_reply_to":"bacf61ea_c6edf3f0","updated":"2016-08-05 09:31:40.000000000","message":"Done","commit_id":"1f0e63b1454a15db392bc3d7b6d13d83b9c92c20"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"456b77705eb546f2e205c826674ee080efe051af","unresolved":false,"context_lines":[{"line_number":11,"context_line":"      License for the specific language governing permissions and limitations"},{"line_number":12,"context_line":"      under the License."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"      Convention for heading levels in Neutron devref:"},{"line_number":16,"context_line":"      \u003d\u003d\u003d\u003d\u003d\u003d\u003d  Heading 0 (reserved for the title in a document)"},{"line_number":17,"context_line":"      -------  Heading 1"},{"line_number":18,"context_line":"      ~~~~~~~  Heading 2"},{"line_number":19,"context_line":"      +++++++  Heading 3"},{"line_number":20,"context_line":"      \u0027\u0027\u0027\u0027\u0027\u0027\u0027  Heading 4"},{"line_number":21,"context_line":"      (Avoid deeper levels because they do not render well.)"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"Objects in neutron"}],"source_content_type":"text/x-rst","patch_set":5,"id":"bacf61ea_20ea77db","line":20,"range":{"start_line":14,"start_character":0,"end_line":20,"end_character":24},"updated":"2016-08-05 17:23:32.000000000","message":"I guess these guidelines aren\u0027t mandatory","commit_id":"6e05c6451144f4331c63b1b4bf4fbf96b0b6d523"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"8330ee7c9c53398919b1105df155ecec240f6fe5","unresolved":false,"context_lines":[{"line_number":11,"context_line":"      License for the specific language governing permissions and limitations"},{"line_number":12,"context_line":"      under the License."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"      Convention for heading levels in Neutron devref:"},{"line_number":16,"context_line":"      \u003d\u003d\u003d\u003d\u003d\u003d\u003d  Heading 0 (reserved for the title in a document)"},{"line_number":17,"context_line":"      -------  Heading 1"},{"line_number":18,"context_line":"      ~~~~~~~  Heading 2"},{"line_number":19,"context_line":"      +++++++  Heading 3"},{"line_number":20,"context_line":"      \u0027\u0027\u0027\u0027\u0027\u0027\u0027  Heading 4"},{"line_number":21,"context_line":"      (Avoid deeper levels because they do not render well.)"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"Objects in neutron"}],"source_content_type":"text/x-rst","patch_set":5,"id":"9ad45d7e_df17b652","line":20,"range":{"start_line":14,"start_character":0,"end_line":20,"end_character":24},"in_reply_to":"bacf61ea_20ea77db","updated":"2016-08-08 12:59:32.000000000","message":"It is included in every dev ref so I will not remove it.","commit_id":"6e05c6451144f4331c63b1b4bf4fbf96b0b6d523"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"456b77705eb546f2e205c826674ee080efe051af","unresolved":false,"context_lines":[{"line_number":196,"context_line":""},{"line_number":197,"context_line":"        primary_keys \u003d [\u0027address\u0027, \u0027subnet_id\u0027]"},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"        foreign_keys \u003d {\u0027subnet_id\u0027: \u0027id\u0027}"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"        fields \u003d {"},{"line_number":202,"context_line":"            \u0027address\u0027: obj_fields.StringField(),"}],"source_content_type":"text/x-rst","patch_set":5,"id":"bacf61ea_9b3114a5","line":199,"range":{"start_line":199,"start_character":8,"end_line":199,"end_character":42},"updated":"2016-08-05 17:23:32.000000000","message":"How about adding little intro why mapping to id is needed for foreign keys ?","commit_id":"6e05c6451144f4331c63b1b4bf4fbf96b0b6d523"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"8330ee7c9c53398919b1105df155ecec240f6fe5","unresolved":false,"context_lines":[{"line_number":196,"context_line":""},{"line_number":197,"context_line":"        primary_keys \u003d [\u0027address\u0027, \u0027subnet_id\u0027]"},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"        foreign_keys \u003d {\u0027subnet_id\u0027: \u0027id\u0027}"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"        fields \u003d {"},{"line_number":202,"context_line":"            \u0027address\u0027: obj_fields.StringField(),"}],"source_content_type":"text/x-rst","patch_set":5,"id":"9ad45d7e_d0c68d15","line":199,"range":{"start_line":199,"start_character":8,"end_line":199,"end_character":42},"in_reply_to":"bacf61ea_9b3114a5","updated":"2016-08-08 12:59:32.000000000","message":"A little introduction is done in line 120. But I have added more descriptive example in PS6.","commit_id":"6e05c6451144f4331c63b1b4bf4fbf96b0b6d523"},{"author":{"_account_id":12175,"name":"Eli Qiao","email":"qiaoliyong@gmail.com","username":"Eli"},"change_message_id":"e9e3472ae418fd4e80625e2b0019bae27ec620bc","unresolved":false,"context_lines":[{"line_number":309,"context_line":"    # for fetching multiple objects"},{"line_number":310,"context_line":"    dnses \u003d DNSNameServer.get_objects(context)"},{"line_number":311,"context_line":"    # will return list of all dns name servers from DB"},{"line_number":312,"context_line":""},{"line_number":313,"context_line":"sorting, filtering"},{"line_number":314,"context_line":"~~~~~~~~~~~~~~~~~~"},{"line_number":315,"context_line":"You can register extra filter names using :code:`register_filter_hook_on_model`."}],"source_content_type":"text/x-rst","patch_set":5,"id":"bacf61ea_826500b0","line":312,"updated":"2016-08-08 02:37:06.000000000","message":"These is still cases for overwrite get_objects method, see https://github.com/openstack/neutron/blob/9.0.0.0b2/neutron/db/metering/metering_db.py#L259","commit_id":"6e05c6451144f4331c63b1b4bf4fbf96b0b6d523"},{"author":{"_account_id":12175,"name":"Eli Qiao","email":"qiaoliyong@gmail.com","username":"Eli"},"change_message_id":"e9e3472ae418fd4e80625e2b0019bae27ec620bc","unresolved":false,"context_lines":[{"line_number":309,"context_line":"    # for fetching multiple objects"},{"line_number":310,"context_line":"    dnses \u003d DNSNameServer.get_objects(context)"},{"line_number":311,"context_line":"    # will return list of all dns name servers from DB"},{"line_number":312,"context_line":""},{"line_number":313,"context_line":"sorting, filtering"},{"line_number":314,"context_line":"~~~~~~~~~~~~~~~~~~"},{"line_number":315,"context_line":"You can register extra filter names using :code:`register_filter_hook_on_model`."}],"source_content_type":"text/x-rst","patch_set":5,"id":"bacf61ea_e2067ccc","line":312,"updated":"2016-08-08 02:37:06.000000000","message":"These is still cases for overwrite get_objects method, see https://github.com/openstack/neutron/blob/9.0.0.0b2/neutron/db/metering/metering_db.py#L259","commit_id":"6e05c6451144f4331c63b1b4bf4fbf96b0b6d523"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"8386753d677a7978b091fa36bc568cc6a62daae4","unresolved":false,"context_lines":[{"line_number":309,"context_line":"    # for fetching multiple objects"},{"line_number":310,"context_line":"    dnses \u003d DNSNameServer.get_objects(context)"},{"line_number":311,"context_line":"    # will return list of all dns name servers from DB"},{"line_number":312,"context_line":""},{"line_number":313,"context_line":"sorting, filtering"},{"line_number":314,"context_line":"~~~~~~~~~~~~~~~~~~"},{"line_number":315,"context_line":"You can register extra filter names using :code:`register_filter_hook_on_model`."}],"source_content_type":"text/x-rst","patch_set":5,"id":"9ad45d7e_b9201df9","line":312,"in_reply_to":"bacf61ea_826500b0","updated":"2016-08-08 13:38:58.000000000","message":"It is not yet covered by objects API (joins).","commit_id":"6e05c6451144f4331c63b1b4bf4fbf96b0b6d523"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"456b77705eb546f2e205c826674ee080efe051af","unresolved":false,"context_lines":[{"line_number":310,"context_line":"    dnses \u003d DNSNameServer.get_objects(context)"},{"line_number":311,"context_line":"    # will return list of all dns name servers from DB"},{"line_number":312,"context_line":""},{"line_number":313,"context_line":"sorting, filtering"},{"line_number":314,"context_line":"~~~~~~~~~~~~~~~~~~"},{"line_number":315,"context_line":"You can register extra filter names using :code:`register_filter_hook_on_model`."},{"line_number":316,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"bacf61ea_bbc97828","line":313,"range":{"start_line":313,"start_character":0,"end_line":313,"end_character":18},"updated":"2016-08-05 17:23:32.000000000","message":"Sorting and Filtering ? or Sorting, Filtering ? I rendered this look odd with all other headings having first letter capitalized.\n\nhow it looks http://rst.ninjs.org/?n\u003d9487b526d1aa93a114efa524ab1b196f\u0026theme\u003dbasic","commit_id":"6e05c6451144f4331c63b1b4bf4fbf96b0b6d523"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"8386753d677a7978b091fa36bc568cc6a62daae4","unresolved":false,"context_lines":[{"line_number":310,"context_line":"    dnses \u003d DNSNameServer.get_objects(context)"},{"line_number":311,"context_line":"    # will return list of all dns name servers from DB"},{"line_number":312,"context_line":""},{"line_number":313,"context_line":"sorting, filtering"},{"line_number":314,"context_line":"~~~~~~~~~~~~~~~~~~"},{"line_number":315,"context_line":"You can register extra filter names using :code:`register_filter_hook_on_model`."},{"line_number":316,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"9ad45d7e_793fc525","line":313,"range":{"start_line":313,"start_character":0,"end_line":313,"end_character":18},"in_reply_to":"bacf61ea_bbc97828","updated":"2016-08-08 13:38:58.000000000","message":"Sorting and filtering.","commit_id":"6e05c6451144f4331c63b1b4bf4fbf96b0b6d523"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"456b77705eb546f2e205c826674ee080efe051af","unresolved":false,"context_lines":[{"line_number":408,"context_line":"methods for backward compatibility and supprot for out-of-tree neutron drivers"},{"line_number":409,"context_line":"and plugins."},{"line_number":410,"context_line":""},{"line_number":411,"context_line":"tenant_id backward compatibility"},{"line_number":412,"context_line":"--------------------------------"},{"line_number":413,"context_line":"The base :code:`NeutronDbObject` class has support for exposing :code:`tenant_id`"},{"line_number":414,"context_line":"in dictionary access to the object fields (:code:`subnet[\u0027tenant_id\u0027]`) and in"}],"source_content_type":"text/x-rst","patch_set":5,"id":"bacf61ea_fbb49082","line":411,"range":{"start_line":411,"start_character":0,"end_line":411,"end_character":32},"updated":"2016-08-05 17:23:32.000000000","message":"Backward Compatibility for tenant_id. \n un capitalized first character look odd as compared to other headings.","commit_id":"6e05c6451144f4331c63b1b4bf4fbf96b0b6d523"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"8386753d677a7978b091fa36bc568cc6a62daae4","unresolved":false,"context_lines":[{"line_number":408,"context_line":"methods for backward compatibility and supprot for out-of-tree neutron drivers"},{"line_number":409,"context_line":"and plugins."},{"line_number":410,"context_line":""},{"line_number":411,"context_line":"tenant_id backward compatibility"},{"line_number":412,"context_line":"--------------------------------"},{"line_number":413,"context_line":"The base :code:`NeutronDbObject` class has support for exposing :code:`tenant_id`"},{"line_number":414,"context_line":"in dictionary access to the object fields (:code:`subnet[\u0027tenant_id\u0027]`) and in"}],"source_content_type":"text/x-rst","patch_set":5,"id":"9ad45d7e_198849e7","line":411,"range":{"start_line":411,"start_character":0,"end_line":411,"end_character":32},"in_reply_to":"bacf61ea_fbb49082","updated":"2016-08-08 13:38:58.000000000","message":"Done","commit_id":"6e05c6451144f4331c63b1b4bf4fbf96b0b6d523"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"44b3c5aee28d4c8b795a54cbf44cef1aa0fc467e","unresolved":false,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":"`Oslo VersionedObjects`_ (aka OVO) is a database facade, where you define the"},{"line_number":32,"context_line":"middle layer between software and database schema. The layer is about creating"},{"line_number":33,"context_line":"object per database resource, and make them versioned, meaning save their"},{"line_number":34,"context_line":"definition in particular time. When you change the database schema, you change"},{"line_number":35,"context_line":"the version of an object and provide backward compatible translation method."},{"line_number":36,"context_line":"Different version of software can communicate with each other, allowing"},{"line_number":37,"context_line":"communication between different versions of the software (via RPC i.e.)."}],"source_content_type":"text/x-rst","patch_set":7,"id":"3ac371cc_a2d1eecf","line":34,"range":{"start_line":33,"start_character":55,"end_line":34,"end_character":29},"updated":"2016-08-15 14:22:28.000000000","message":"This sentence doesn\u0027t make sense.","commit_id":"a0fb181d4824668d3e18dbf2bb964343dd1c77ca"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"2f19d06348f36369e7189af642ae0ee78268b7f6","unresolved":false,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":"`Oslo VersionedObjects`_ (aka OVO) is a database facade, where you define the"},{"line_number":32,"context_line":"middle layer between software and database schema. The layer is about creating"},{"line_number":33,"context_line":"object per database resource, and make them versioned, meaning save their"},{"line_number":34,"context_line":"definition in particular time. When you change the database schema, you change"},{"line_number":35,"context_line":"the version of an object and provide backward compatible translation method."},{"line_number":36,"context_line":"Different version of software can communicate with each other, allowing"},{"line_number":37,"context_line":"communication between different versions of the software (via RPC i.e.)."}],"source_content_type":"text/x-rst","patch_set":7,"id":"3ac371cc_129f6db5","line":34,"range":{"start_line":33,"start_character":55,"end_line":34,"end_character":29},"in_reply_to":"3ac371cc_a2d1eecf","updated":"2016-08-19 11:14:40.000000000","message":"Done","commit_id":"a0fb181d4824668d3e18dbf2bb964343dd1c77ca"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"66c257be05e33736d7f2d1af5d63efb410c610ff","unresolved":false,"context_lines":[{"line_number":91,"context_line":"There is defined :code:`fields_no_update` list, for immutable object fields"},{"line_number":92,"context_line":"that cannot be changed. The :code:`fields_no_update` attribute is a list of"},{"line_number":93,"context_line":"field names that do not allow update, and it is containing :code:`primary_keys`"},{"line_number":94,"context_line":"by default."},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"which is containing primary keys and as well can be extended by any field that"},{"line_number":97,"context_line":"is defined in object, and should not be changed during operating on object."}],"source_content_type":"text/x-rst","patch_set":7,"id":"9ad45d7e_910bb27c","line":94,"range":{"start_line":94,"start_character":10,"end_line":94,"end_character":11},"updated":"2016-08-11 21:15:47.000000000","message":"s/./,","commit_id":"a0fb181d4824668d3e18dbf2bb964343dd1c77ca"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"2f19d06348f36369e7189af642ae0ee78268b7f6","unresolved":false,"context_lines":[{"line_number":91,"context_line":"There is defined :code:`fields_no_update` list, for immutable object fields"},{"line_number":92,"context_line":"that cannot be changed. The :code:`fields_no_update` attribute is a list of"},{"line_number":93,"context_line":"field names that do not allow update, and it is containing :code:`primary_keys`"},{"line_number":94,"context_line":"by default."},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"which is containing primary keys and as well can be extended by any field that"},{"line_number":97,"context_line":"is defined in object, and should not be changed during operating on object."}],"source_content_type":"text/x-rst","patch_set":7,"id":"3ac371cc_b2dc9975","line":94,"range":{"start_line":94,"start_character":10,"end_line":94,"end_character":11},"in_reply_to":"9ad45d7e_910bb27c","updated":"2016-08-19 11:14:40.000000000","message":"Done","commit_id":"a0fb181d4824668d3e18dbf2bb964343dd1c77ca"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"44b3c5aee28d4c8b795a54cbf44cef1aa0fc467e","unresolved":false,"context_lines":[{"line_number":93,"context_line":"field names that do not allow update, and it is containing :code:`primary_keys`"},{"line_number":94,"context_line":"by default."},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"which is containing primary keys and as well can be extended by any field that"},{"line_number":97,"context_line":"is defined in object, and should not be changed during operating on object."},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"If there is situation, that field should be named differently in object"}],"source_content_type":"text/x-rst","patch_set":7,"id":"3ac371cc_3deebf22","line":96,"range":{"start_line":96,"start_character":0,"end_line":96,"end_character":19},"updated":"2016-08-15 14:22:28.000000000","message":"Even if replacing the above \u0027,\u0027 to \u0027.\u0027, this sentence doesn\u0027t make sense.","commit_id":"a0fb181d4824668d3e18dbf2bb964343dd1c77ca"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"2f19d06348f36369e7189af642ae0ee78268b7f6","unresolved":false,"context_lines":[{"line_number":93,"context_line":"field names that do not allow update, and it is containing :code:`primary_keys`"},{"line_number":94,"context_line":"by default."},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"which is containing primary keys and as well can be extended by any field that"},{"line_number":97,"context_line":"is defined in object, and should not be changed during operating on object."},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"If there is situation, that field should be named differently in object"}],"source_content_type":"text/x-rst","patch_set":7,"id":"3ac371cc_32e8a916","line":96,"range":{"start_line":96,"start_character":0,"end_line":96,"end_character":19},"in_reply_to":"3ac371cc_3deebf22","updated":"2016-08-19 11:14:40.000000000","message":"Sorry, I guess it was some leftovers from previous version. Fixed.","commit_id":"a0fb181d4824668d3e18dbf2bb964343dd1c77ca"},{"author":{"_account_id":12175,"name":"Eli Qiao","email":"qiaoliyong@gmail.com","username":"Eli"},"change_message_id":"be867cff5548c085df439d4e67bfa87013158869","unresolved":false,"context_lines":[{"line_number":139,"context_line":"            \u0027id\u0027: obj_fields.UUIDField()"},{"line_number":140,"context_line":"            \u0027allocation_pools\u0027: obj_fields.ListOfObjectsField(\u0027IPAllocationPool\u0027,"},{"line_number":141,"context_line":"                                                              nullable\u003dTrue)"},{"line_number":142,"context_line":"        }"},{"line_number":143,"context_line":"        synthetic_fields \u003d [\u0027allocation_pools\u0027]"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"    class IPAllocationPoolOVO(NeutronDbObject):"}],"source_content_type":"text/x-rst","patch_set":7,"id":"9ad45d7e_3027b3b7","line":142,"updated":"2016-08-10 09:07:36.000000000","message":"primary_keys \u003d [\u0027id\u0027]","commit_id":"a0fb181d4824668d3e18dbf2bb964343dd1c77ca"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"2f19d06348f36369e7189af642ae0ee78268b7f6","unresolved":false,"context_lines":[{"line_number":139,"context_line":"            \u0027id\u0027: obj_fields.UUIDField()"},{"line_number":140,"context_line":"            \u0027allocation_pools\u0027: obj_fields.ListOfObjectsField(\u0027IPAllocationPool\u0027,"},{"line_number":141,"context_line":"                                                              nullable\u003dTrue)"},{"line_number":142,"context_line":"        }"},{"line_number":143,"context_line":"        synthetic_fields \u003d [\u0027allocation_pools\u0027]"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"    class IPAllocationPoolOVO(NeutronDbObject):"}],"source_content_type":"text/x-rst","patch_set":7,"id":"3ac371cc_d2baf509","line":142,"in_reply_to":"9ad45d7e_3027b3b7","updated":"2016-08-19 11:14:40.000000000","message":"Done","commit_id":"a0fb181d4824668d3e18dbf2bb964343dd1c77ca"},{"author":{"_account_id":12175,"name":"Eli Qiao","email":"qiaoliyong@gmail.com","username":"Eli"},"change_message_id":"be867cff5548c085df439d4e67bfa87013158869","unresolved":false,"context_lines":[{"line_number":146,"context_line":"        fields \u003d {"},{"line_number":147,"context_line":"            \u0027id\u0027: obj_fields.UUIDField(),"},{"line_number":148,"context_line":"            \u0027subnet_id: obj_fields.UUIDField()"},{"line_number":149,"context_line":"        }"},{"line_number":150,"context_line":"        foreign_keys \u003d {\u0027subnet_id\u0027: \u0027id\u0027}"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"The :code:`foreign_keys` is used in :code:`SubnetOVO` to fetch the"}],"source_content_type":"text/x-rst","patch_set":7,"id":"9ad45d7e_d019f77a","line":149,"updated":"2016-08-10 09:07:36.000000000","message":"You may need to add \nprimary_keys \u003d [\u0027id\u0027] for a complete example","commit_id":"a0fb181d4824668d3e18dbf2bb964343dd1c77ca"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"2f19d06348f36369e7189af642ae0ee78268b7f6","unresolved":false,"context_lines":[{"line_number":146,"context_line":"        fields \u003d {"},{"line_number":147,"context_line":"            \u0027id\u0027: obj_fields.UUIDField(),"},{"line_number":148,"context_line":"            \u0027subnet_id: obj_fields.UUIDField()"},{"line_number":149,"context_line":"        }"},{"line_number":150,"context_line":"        foreign_keys \u003d {\u0027subnet_id\u0027: \u0027id\u0027}"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"The :code:`foreign_keys` is used in :code:`SubnetOVO` to fetch the"}],"source_content_type":"text/x-rst","patch_set":7,"id":"3ac371cc_3236e9b4","line":149,"in_reply_to":"9ad45d7e_d019f77a","updated":"2016-08-19 11:14:40.000000000","message":"Done","commit_id":"a0fb181d4824668d3e18dbf2bb964343dd1c77ca"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"44b3c5aee28d4c8b795a54cbf44cef1aa0fc467e","unresolved":false,"context_lines":[{"line_number":187,"context_line":"        order \u003d sa.Column(sa.Integer, server_default\u003d\u00270\u0027)"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"In Subnet object we have default :code:`id` field, which is primary key,"},{"line_number":190,"context_line":":code:`project id` and :code:`name` fields. We have the :code:`dns_nameservers`"},{"line_number":191,"context_line":"relationship, which is side-loading the :code:`DNSNameServer` resource"},{"line_number":192,"context_line":"with the same SQL query (:code:`lazy\u003d\u0027joined\u0027`). Lets say, we would like"},{"line_number":193,"context_line":"to rename the :code:`name` to :code:`subnet_name` field in Subnet object."}],"source_content_type":"text/x-rst","patch_set":7,"id":"3ac371cc_bd92af55","line":190,"range":{"start_line":190,"start_character":14,"end_line":190,"end_character":15},"updated":"2016-08-15 14:22:28.000000000","message":"s/ /_/","commit_id":"a0fb181d4824668d3e18dbf2bb964343dd1c77ca"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"2f19d06348f36369e7189af642ae0ee78268b7f6","unresolved":false,"context_lines":[{"line_number":187,"context_line":"        order \u003d sa.Column(sa.Integer, server_default\u003d\u00270\u0027)"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"In Subnet object we have default :code:`id` field, which is primary key,"},{"line_number":190,"context_line":":code:`project id` and :code:`name` fields. We have the :code:`dns_nameservers`"},{"line_number":191,"context_line":"relationship, which is side-loading the :code:`DNSNameServer` resource"},{"line_number":192,"context_line":"with the same SQL query (:code:`lazy\u003d\u0027joined\u0027`). Lets say, we would like"},{"line_number":193,"context_line":"to rename the :code:`name` to :code:`subnet_name` field in Subnet object."}],"source_content_type":"text/x-rst","patch_set":7,"id":"3ac371cc_f25451cb","line":190,"range":{"start_line":190,"start_character":14,"end_line":190,"end_character":15},"in_reply_to":"3ac371cc_bd92af55","updated":"2016-08-19 11:14:40.000000000","message":"Done","commit_id":"a0fb181d4824668d3e18dbf2bb964343dd1c77ca"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"66c257be05e33736d7f2d1af5d63efb410c610ff","unresolved":false,"context_lines":[{"line_number":243,"context_line":"subnet_id pair, :code:`foreign_keys` as :code:`subnet_id` referencing :code:`id`"},{"line_number":244,"context_line":"from foreign class that will call get_objects in DNSNameServer. Also fields"},{"line_number":245,"context_line":"are defined using oslo versionedobjects provided types."},{"line_number":246,"context_line":"Please note the :code:`nullable\u003dTrue` for :code:`order` param."},{"line_number":247,"context_line":""},{"line_number":248,"context_line":""},{"line_number":249,"context_line":"Synthetic fields"}],"source_content_type":"text/x-rst","patch_set":7,"id":"9ad45d7e_5492c84c","line":246,"range":{"start_line":246,"start_character":0,"end_line":246,"end_character":6},"updated":"2016-08-11 21:15:47.000000000","message":"s/Please//","commit_id":"a0fb181d4824668d3e18dbf2bb964343dd1c77ca"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"66c257be05e33736d7f2d1af5d63efb410c610ff","unresolved":false,"context_lines":[{"line_number":243,"context_line":"subnet_id pair, :code:`foreign_keys` as :code:`subnet_id` referencing :code:`id`"},{"line_number":244,"context_line":"from foreign class that will call get_objects in DNSNameServer. Also fields"},{"line_number":245,"context_line":"are defined using oslo versionedobjects provided types."},{"line_number":246,"context_line":"Please note the :code:`nullable\u003dTrue` for :code:`order` param."},{"line_number":247,"context_line":""},{"line_number":248,"context_line":""},{"line_number":249,"context_line":"Synthetic fields"}],"source_content_type":"text/x-rst","patch_set":7,"id":"9ad45d7e_348e342e","line":246,"range":{"start_line":246,"start_character":56,"end_line":246,"end_character":61},"updated":"2016-08-11 21:15:47.000000000","message":"s/param/field","commit_id":"a0fb181d4824668d3e18dbf2bb964343dd1c77ca"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"2f19d06348f36369e7189af642ae0ee78268b7f6","unresolved":false,"context_lines":[{"line_number":243,"context_line":"subnet_id pair, :code:`foreign_keys` as :code:`subnet_id` referencing :code:`id`"},{"line_number":244,"context_line":"from foreign class that will call get_objects in DNSNameServer. Also fields"},{"line_number":245,"context_line":"are defined using oslo versionedobjects provided types."},{"line_number":246,"context_line":"Please note the :code:`nullable\u003dTrue` for :code:`order` param."},{"line_number":247,"context_line":""},{"line_number":248,"context_line":""},{"line_number":249,"context_line":"Synthetic fields"}],"source_content_type":"text/x-rst","patch_set":7,"id":"3ac371cc_05860965","line":246,"range":{"start_line":246,"start_character":56,"end_line":246,"end_character":61},"in_reply_to":"9ad45d7e_348e342e","updated":"2016-08-19 11:14:40.000000000","message":"Done","commit_id":"a0fb181d4824668d3e18dbf2bb964343dd1c77ca"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"2f19d06348f36369e7189af642ae0ee78268b7f6","unresolved":false,"context_lines":[{"line_number":243,"context_line":"subnet_id pair, :code:`foreign_keys` as :code:`subnet_id` referencing :code:`id`"},{"line_number":244,"context_line":"from foreign class that will call get_objects in DNSNameServer. Also fields"},{"line_number":245,"context_line":"are defined using oslo versionedobjects provided types."},{"line_number":246,"context_line":"Please note the :code:`nullable\u003dTrue` for :code:`order` param."},{"line_number":247,"context_line":""},{"line_number":248,"context_line":""},{"line_number":249,"context_line":"Synthetic fields"}],"source_content_type":"text/x-rst","patch_set":7,"id":"3ac371cc_45800147","line":246,"range":{"start_line":246,"start_character":0,"end_line":246,"end_character":6},"in_reply_to":"9ad45d7e_5492c84c","updated":"2016-08-19 11:14:40.000000000","message":"Done","commit_id":"a0fb181d4824668d3e18dbf2bb964343dd1c77ca"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"44b3c5aee28d4c8b795a54cbf44cef1aa0fc467e","unresolved":false,"context_lines":[{"line_number":246,"context_line":"Please note the :code:`nullable\u003dTrue` for :code:`order` param."},{"line_number":247,"context_line":""},{"line_number":248,"context_line":""},{"line_number":249,"context_line":"Synthetic fields"},{"line_number":250,"context_line":"----------------"},{"line_number":251,"context_line":"Specific for neutron usage, concept of synthetic fields was introduced. It is"},{"line_number":252,"context_line":"list of fields, that are not directly defined in data model, but should be"}],"source_content_type":"text/x-rst","patch_set":7,"id":"3ac371cc_3de23fd6","line":249,"range":{"start_line":249,"start_character":0,"end_line":249,"end_character":16},"updated":"2016-08-15 14:22:28.000000000","message":"This was already discussed in line 117 and onward.","commit_id":"a0fb181d4824668d3e18dbf2bb964343dd1c77ca"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"2f19d06348f36369e7189af642ae0ee78268b7f6","unresolved":false,"context_lines":[{"line_number":246,"context_line":"Please note the :code:`nullable\u003dTrue` for :code:`order` param."},{"line_number":247,"context_line":""},{"line_number":248,"context_line":""},{"line_number":249,"context_line":"Synthetic fields"},{"line_number":250,"context_line":"----------------"},{"line_number":251,"context_line":"Specific for neutron usage, concept of synthetic fields was introduced. It is"},{"line_number":252,"context_line":"list of fields, that are not directly defined in data model, but should be"}],"source_content_type":"text/x-rst","patch_set":7,"id":"3ac371cc_32b549d0","line":249,"range":{"start_line":249,"start_character":0,"end_line":249,"end_character":16},"in_reply_to":"3ac371cc_3de23fd6","updated":"2016-08-19 11:14:40.000000000","message":"Yes, I have introduced the concept to have it used in example. But I feel we need more explanation of Synthetic fields to devs, so I am also describing it second time.","commit_id":"a0fb181d4824668d3e18dbf2bb964343dd1c77ca"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"66c257be05e33736d7f2d1af5d63efb410c610ff","unresolved":false,"context_lines":[{"line_number":248,"context_line":""},{"line_number":249,"context_line":"Synthetic fields"},{"line_number":250,"context_line":"----------------"},{"line_number":251,"context_line":"Specific for neutron usage, concept of synthetic fields was introduced. It is"},{"line_number":252,"context_line":"list of fields, that are not directly defined in data model, but should be"},{"line_number":253,"context_line":"filled from other database entities or compute at runtime."},{"line_number":254,"context_line":"The synthetic fields can be of different type, it can be build-in types (bool,"}],"source_content_type":"text/x-rst","patch_set":7,"id":"9ad45d7e_14f2109a","line":251,"range":{"start_line":251,"start_character":72,"end_line":251,"end_character":77},"updated":"2016-08-11 21:15:47.000000000","message":"Those fields are list of fields, that are...","commit_id":"a0fb181d4824668d3e18dbf2bb964343dd1c77ca"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"2f19d06348f36369e7189af642ae0ee78268b7f6","unresolved":false,"context_lines":[{"line_number":248,"context_line":""},{"line_number":249,"context_line":"Synthetic fields"},{"line_number":250,"context_line":"----------------"},{"line_number":251,"context_line":"Specific for neutron usage, concept of synthetic fields was introduced. It is"},{"line_number":252,"context_line":"list of fields, that are not directly defined in data model, but should be"},{"line_number":253,"context_line":"filled from other database entities or compute at runtime."},{"line_number":254,"context_line":"The synthetic fields can be of different type, it can be build-in types (bool,"}],"source_content_type":"text/x-rst","patch_set":7,"id":"3ac371cc_52b8c5e5","line":251,"range":{"start_line":251,"start_character":72,"end_line":251,"end_character":77},"in_reply_to":"9ad45d7e_14f2109a","updated":"2016-08-19 11:14:40.000000000","message":"Done","commit_id":"a0fb181d4824668d3e18dbf2bb964343dd1c77ca"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"66c257be05e33736d7f2d1af5d63efb410c610ff","unresolved":false,"context_lines":[{"line_number":263,"context_line":""},{"line_number":264,"context_line":"    synthetic_fields \u003d [\u0027dhcp_agents\u0027, \u0027shared\u0027, \u0027subnets\u0027]"},{"line_number":265,"context_line":""},{"line_number":266,"context_line":":code:`ObjectField` and :code:`ListOfObjectsField`  takes name of object class"},{"line_number":267,"context_line":"as an argument."},{"line_number":268,"context_line":""},{"line_number":269,"context_line":"For example, ORM relationships can be modeled by synthetic fields."}],"source_content_type":"text/x-rst","patch_set":7,"id":"9ad45d7e_b46b441d","line":266,"range":{"start_line":266,"start_character":52,"end_line":266,"end_character":57},"updated":"2016-08-11 21:15:47.000000000","message":"take the name of object class as an argument","commit_id":"a0fb181d4824668d3e18dbf2bb964343dd1c77ca"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"2f19d06348f36369e7189af642ae0ee78268b7f6","unresolved":false,"context_lines":[{"line_number":263,"context_line":""},{"line_number":264,"context_line":"    synthetic_fields \u003d [\u0027dhcp_agents\u0027, \u0027shared\u0027, \u0027subnets\u0027]"},{"line_number":265,"context_line":""},{"line_number":266,"context_line":":code:`ObjectField` and :code:`ListOfObjectsField`  takes name of object class"},{"line_number":267,"context_line":"as an argument."},{"line_number":268,"context_line":""},{"line_number":269,"context_line":"For example, ORM relationships can be modeled by synthetic fields."}],"source_content_type":"text/x-rst","patch_set":7,"id":"3ac371cc_c58cf181","line":266,"range":{"start_line":266,"start_character":52,"end_line":266,"end_character":57},"in_reply_to":"9ad45d7e_b46b441d","updated":"2016-08-19 11:14:40.000000000","message":"Done","commit_id":"a0fb181d4824668d3e18dbf2bb964343dd1c77ca"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"66c257be05e33736d7f2d1af5d63efb410c610ff","unresolved":false,"context_lines":[{"line_number":297,"context_line":""},{"line_number":298,"context_line":"        synthetic_fields \u003d [\u0027shared\u0027]"},{"line_number":299,"context_line":""},{"line_number":300,"context_line":"        # It is important to add field to filtering list, if object should"},{"line_number":301,"context_line":"        # support filtering by it. It is required since synthetic fields"},{"line_number":302,"context_line":"        # are not supported to be filterable by default."},{"line_number":303,"context_line":"        def __init__(self, context\u003dNone, **kwargs):"}],"source_content_type":"text/x-rst","patch_set":7,"id":"9ad45d7e_b7a18696","line":300,"range":{"start_line":300,"start_character":39,"end_line":300,"end_character":41},"updated":"2016-08-11 21:15:47.000000000","message":"s/to/for","commit_id":"a0fb181d4824668d3e18dbf2bb964343dd1c77ca"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"2f19d06348f36369e7189af642ae0ee78268b7f6","unresolved":false,"context_lines":[{"line_number":297,"context_line":""},{"line_number":298,"context_line":"        synthetic_fields \u003d [\u0027shared\u0027]"},{"line_number":299,"context_line":""},{"line_number":300,"context_line":"        # It is important to add field to filtering list, if object should"},{"line_number":301,"context_line":"        # support filtering by it. It is required since synthetic fields"},{"line_number":302,"context_line":"        # are not supported to be filterable by default."},{"line_number":303,"context_line":"        def __init__(self, context\u003dNone, **kwargs):"}],"source_content_type":"text/x-rst","patch_set":7,"id":"3ac371cc_e54acd54","line":300,"range":{"start_line":300,"start_character":39,"end_line":300,"end_character":41},"in_reply_to":"9ad45d7e_b7a18696","updated":"2016-08-19 11:14:40.000000000","message":"Done","commit_id":"a0fb181d4824668d3e18dbf2bb964343dd1c77ca"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"44b3c5aee28d4c8b795a54cbf44cef1aa0fc467e","unresolved":false,"context_lines":[{"line_number":328,"context_line":"Usage of objects"},{"line_number":329,"context_line":"----------------"},{"line_number":330,"context_line":""},{"line_number":331,"context_line":"CRUD operations"},{"line_number":332,"context_line":"~~~~~~~~~~~~~~~"},{"line_number":333,"context_line":"Please take a look at simple object usage scenarios using above example:"},{"line_number":334,"context_line":""}],"source_content_type":"text/x-rst","patch_set":7,"id":"3ac371cc_9db6d388","line":331,"range":{"start_line":331,"start_character":0,"end_line":331,"end_character":4},"updated":"2016-08-15 14:22:28.000000000","message":"Can this also show examples for updates, deletes and creations?","commit_id":"a0fb181d4824668d3e18dbf2bb964343dd1c77ca"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"2f19d06348f36369e7189af642ae0ee78268b7f6","unresolved":false,"context_lines":[{"line_number":328,"context_line":"Usage of objects"},{"line_number":329,"context_line":"----------------"},{"line_number":330,"context_line":""},{"line_number":331,"context_line":"CRUD operations"},{"line_number":332,"context_line":"~~~~~~~~~~~~~~~"},{"line_number":333,"context_line":"Please take a look at simple object usage scenarios using above example:"},{"line_number":334,"context_line":""}],"source_content_type":"text/x-rst","patch_set":7,"id":"3ac371cc_c547d149","line":331,"range":{"start_line":331,"start_character":0,"end_line":331,"end_character":4},"in_reply_to":"3ac371cc_9db6d388","updated":"2016-08-19 11:14:40.000000000","message":"Done","commit_id":"a0fb181d4824668d3e18dbf2bb964343dd1c77ca"},{"author":{"_account_id":18332,"name":"Ankur","email":"ankur.gupta@intel.com","username":"ankur-gupta-f"},"change_message_id":"86ca53131222e4f3163c4caa3eb20b2d5d542783","unresolved":false,"context_lines":[{"line_number":425,"context_line":"        }"},{"line_number":426,"context_line":""},{"line_number":427,"context_line":"        primary_keys \u003d [\u0027subnet_id\u0027]"},{"line_number":428,"context_line":"        foreign_keys \u003d {\u0027subnet_id\u0027: \u0027id\u0027}"},{"line_number":429,"context_line":""},{"line_number":430,"context_line":""},{"line_number":431,"context_line":"    @obj_base.VersionedObjectRegistry.register"}],"source_content_type":"text/x-rst","patch_set":8,"id":"1ac06dbe_e3abae87","line":428,"updated":"2016-08-25 15:52:50.000000000","message":"Wasn\u0027t there a change to how to declare foreign_keys","commit_id":"b81e890535b29fa2868327ec149bbda3e8ac7665"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"bf027a8db616444a53bf5a6fefe46dec8b523df3","unresolved":false,"context_lines":[{"line_number":425,"context_line":"        }"},{"line_number":426,"context_line":""},{"line_number":427,"context_line":"        primary_keys \u003d [\u0027subnet_id\u0027]"},{"line_number":428,"context_line":"        foreign_keys \u003d {\u0027subnet_id\u0027: \u0027id\u0027}"},{"line_number":429,"context_line":""},{"line_number":430,"context_line":""},{"line_number":431,"context_line":"    @obj_base.VersionedObjectRegistry.register"}],"source_content_type":"text/x-rst","patch_set":8,"id":"fa7ab95a_f2f654d6","line":428,"in_reply_to":"1ac06dbe_e3abae87","updated":"2016-08-26 10:54:21.000000000","message":"Done","commit_id":"b81e890535b29fa2868327ec149bbda3e8ac7665"},{"author":{"_account_id":22220,"name":"Anindita Das","email":"anindita.das@utexas.edu","username":"anudas"},"change_message_id":"79206f64fe6e94f87f17310843dacca083c61c88","unresolved":false,"context_lines":[{"line_number":42,"context_line":"receiving end."},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"In order to meet complex neutron requirements, we have introduced multiple"},{"line_number":45,"context_line":"improvements. Please take a look at NeutronDBObject and on below devref."},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"Key concepts we will cover in this devref:"},{"line_number":48,"context_line":""}],"source_content_type":"text/x-rst","patch_set":9,"id":"fa7ab95a_87eb9312","line":45,"range":{"start_line":45,"start_character":36,"end_line":45,"end_character":51},"updated":"2016-08-29 17:50:58.000000000","message":"nit: NeutronDbObject","commit_id":"c9fe8e2a25a03bc39d7a2df299576bcbf2a0bcc0"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"89857f46dec43f63bcd8f1beb4dc9ef1f35ac7a9","unresolved":false,"context_lines":[{"line_number":42,"context_line":"receiving end."},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"In order to meet complex neutron requirements, we have introduced multiple"},{"line_number":45,"context_line":"improvements. Please take a look at NeutronDBObject and on below devref."},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"Key concepts we will cover in this devref:"},{"line_number":48,"context_line":""}],"source_content_type":"text/x-rst","patch_set":9,"id":"7a8ec9b2_edda6a4a","line":45,"range":{"start_line":45,"start_character":36,"end_line":45,"end_character":51},"in_reply_to":"fa7ab95a_87eb9312","updated":"2016-09-16 13:17:17.000000000","message":"Done","commit_id":"c9fe8e2a25a03bc39d7a2df299576bcbf2a0bcc0"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"c285b490a0cf22896b33305f59b0e745c663b7d8","unresolved":false,"context_lines":[{"line_number":56,"context_line":""},{"line_number":57,"context_line":".. _Oslo VersionedObjects: http://docs.openstack.org/developer/oslo.versionedobjects/"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"Defining your object"},{"line_number":60,"context_line":"--------------------"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"In order to add new object in Neutron, you have to:"}],"source_content_type":"text/x-rst","patch_set":9,"id":"fa7ab95a_bd65b11e","line":59,"range":{"start_line":59,"start_character":0,"end_line":59,"end_character":20},"updated":"2016-08-30 18:50:27.000000000","message":"It would be also worth to mention, that Standard Attributes don\u0027t need to be explicitly added to OVO definition, because it\u0027s automatically done[1]. (Thanks Carl).\n\n[1] https://github.com/openstack/neutron/blob/7f89ec1640e25fa8fb31864eb9c70ecd227e237b/neutron/objects/base.py#L252-L256","commit_id":"c9fe8e2a25a03bc39d7a2df299576bcbf2a0bcc0"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"89857f46dec43f63bcd8f1beb4dc9ef1f35ac7a9","unresolved":false,"context_lines":[{"line_number":56,"context_line":""},{"line_number":57,"context_line":".. _Oslo VersionedObjects: http://docs.openstack.org/developer/oslo.versionedobjects/"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"Defining your object"},{"line_number":60,"context_line":"--------------------"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"In order to add new object in Neutron, you have to:"}],"source_content_type":"text/x-rst","patch_set":9,"id":"7a8ec9b2_c8959c33","line":59,"range":{"start_line":59,"start_character":0,"end_line":59,"end_character":20},"in_reply_to":"fa7ab95a_bd65b11e","updated":"2016-09-16 13:17:17.000000000","message":"Done","commit_id":"c9fe8e2a25a03bc39d7a2df299576bcbf2a0bcc0"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"bbdc8c7bbc13298d55180dd6439c8081877df219","unresolved":false,"context_lines":[{"line_number":94,"context_line":""},{"line_number":95,"context_line":"If there is situation, that field should be named differently in object"},{"line_number":96,"context_line":"than in database schema, you can use :code:`fields_need_translation`."},{"line_number":97,"context_line":"This dictionary is containing the name of field in the"},{"line_number":98,"context_line":"object definition and name of field in db. It was created to easily"},{"line_number":99,"context_line":"manipulate the database representation to object definition."},{"line_number":100,"context_line":"For example in IP allocation pools::"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    fields_need_translation \u003d {"}],"source_content_type":"text/x-rst","patch_set":9,"id":"fa7ab95a_b7619e3b","line":99,"range":{"start_line":97,"start_character":0,"end_line":99,"end_character":60},"updated":"2016-08-29 18:54:17.000000000","message":"Does it mean, that keys are object definitions, and dict values are db representations?","commit_id":"c9fe8e2a25a03bc39d7a2df299576bcbf2a0bcc0"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"89857f46dec43f63bcd8f1beb4dc9ef1f35ac7a9","unresolved":false,"context_lines":[{"line_number":94,"context_line":""},{"line_number":95,"context_line":"If there is situation, that field should be named differently in object"},{"line_number":96,"context_line":"than in database schema, you can use :code:`fields_need_translation`."},{"line_number":97,"context_line":"This dictionary is containing the name of field in the"},{"line_number":98,"context_line":"object definition and name of field in db. It was created to easily"},{"line_number":99,"context_line":"manipulate the database representation to object definition."},{"line_number":100,"context_line":"For example in IP allocation pools::"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    fields_need_translation \u003d {"}],"source_content_type":"text/x-rst","patch_set":9,"id":"7a8ec9b2_cd64ceba","line":99,"range":{"start_line":97,"start_character":0,"end_line":99,"end_character":60},"in_reply_to":"fa7ab95a_b7619e3b","updated":"2016-09-16 13:17:17.000000000","message":"Yes.","commit_id":"c9fe8e2a25a03bc39d7a2df299576bcbf2a0bcc0"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"bbdc8c7bbc13298d55180dd6439c8081877df219","unresolved":false,"context_lines":[{"line_number":111,"context_line":"mapping, when relationship is named different in DB model than in object model."},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"When talking about relationship, for :code:`NeutronDbObject` there is defined"},{"line_number":114,"context_line":":code:`synthetic_fields` property, which is a new concept introduced for neutron."},{"line_number":115,"context_line":"It is a list of fields that are not directly defined in DB model, but are referenced"},{"line_number":116,"context_line":"as :code:`orm.relationship` or computed at runtime in neutron code."},{"line_number":117,"context_line":""}],"source_content_type":"text/x-rst","patch_set":9,"id":"fa7ab95a_8260d6d0","line":114,"range":{"start_line":114,"start_character":73,"end_line":114,"end_character":80},"updated":"2016-08-29 18:54:17.000000000","message":"nit: Neutron","commit_id":"c9fe8e2a25a03bc39d7a2df299576bcbf2a0bcc0"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"89857f46dec43f63bcd8f1beb4dc9ef1f35ac7a9","unresolved":false,"context_lines":[{"line_number":111,"context_line":"mapping, when relationship is named different in DB model than in object model."},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"When talking about relationship, for :code:`NeutronDbObject` there is defined"},{"line_number":114,"context_line":":code:`synthetic_fields` property, which is a new concept introduced for neutron."},{"line_number":115,"context_line":"It is a list of fields that are not directly defined in DB model, but are referenced"},{"line_number":116,"context_line":"as :code:`orm.relationship` or computed at runtime in neutron code."},{"line_number":117,"context_line":""}],"source_content_type":"text/x-rst","patch_set":9,"id":"7a8ec9b2_cd0beed4","line":114,"range":{"start_line":114,"start_character":73,"end_line":114,"end_character":80},"in_reply_to":"fa7ab95a_8260d6d0","updated":"2016-09-16 13:17:17.000000000","message":"Shouldn\u0027t we write project names lowercase? nova, cinder, neutron?","commit_id":"c9fe8e2a25a03bc39d7a2df299576bcbf2a0bcc0"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"bbdc8c7bbc13298d55180dd6439c8081877df219","unresolved":false,"context_lines":[{"line_number":113,"context_line":"When talking about relationship, for :code:`NeutronDbObject` there is defined"},{"line_number":114,"context_line":":code:`synthetic_fields` property, which is a new concept introduced for neutron."},{"line_number":115,"context_line":"It is a list of fields that are not directly defined in DB model, but are referenced"},{"line_number":116,"context_line":"as :code:`orm.relationship` or computed at runtime in neutron code."},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"In order to automatically fetch the :code:`synthetic_fields`, the :code:`foreign_keys`"},{"line_number":119,"context_line":"property is introduced. :code:`load_synthetic_fields` [#]_ method from NeutronDbObject"}],"source_content_type":"text/x-rst","patch_set":9,"id":"fa7ab95a_e288c273","line":116,"range":{"start_line":116,"start_character":54,"end_line":116,"end_character":61},"updated":"2016-08-29 18:54:17.000000000","message":"ditto","commit_id":"c9fe8e2a25a03bc39d7a2df299576bcbf2a0bcc0"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"bbdc8c7bbc13298d55180dd6439c8081877df219","unresolved":false,"context_lines":[{"line_number":154,"context_line":"keys for many related object, you should declare the name of the related object"},{"line_number":155,"context_line":"(:code:`Subnet` i.e.) as key and as value declare which field from local object"},{"line_number":156,"context_line":"(:code:`subnet_id` i.e.) is referring to which field in related object (:code:`id`"},{"line_number":157,"context_line":"i.e.).Note that the multiple primary keys related to one parent object is not"},{"line_number":158,"context_line":"permitted"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"It is important to remember about nullable parameter. In SQLAlchemy model,"}],"source_content_type":"text/x-rst","patch_set":9,"id":"fa7ab95a_a244fab6","line":157,"updated":"2016-08-29 18:54:17.000000000","message":"nit: missing whitespace","commit_id":"c9fe8e2a25a03bc39d7a2df299576bcbf2a0bcc0"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"89857f46dec43f63bcd8f1beb4dc9ef1f35ac7a9","unresolved":false,"context_lines":[{"line_number":154,"context_line":"keys for many related object, you should declare the name of the related object"},{"line_number":155,"context_line":"(:code:`Subnet` i.e.) as key and as value declare which field from local object"},{"line_number":156,"context_line":"(:code:`subnet_id` i.e.) is referring to which field in related object (:code:`id`"},{"line_number":157,"context_line":"i.e.).Note that the multiple primary keys related to one parent object is not"},{"line_number":158,"context_line":"permitted"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"It is important to remember about nullable parameter. In SQLAlchemy model,"}],"source_content_type":"text/x-rst","patch_set":9,"id":"7a8ec9b2_a8b770d6","line":157,"in_reply_to":"fa7ab95a_a244fab6","updated":"2016-09-16 13:17:17.000000000","message":"Done","commit_id":"c9fe8e2a25a03bc39d7a2df299576bcbf2a0bcc0"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"bbdc8c7bbc13298d55180dd6439c8081877df219","unresolved":false,"context_lines":[{"line_number":251,"context_line":""},{"line_number":252,"context_line":"Synthetic fields"},{"line_number":253,"context_line":"----------------"},{"line_number":254,"context_line":"Specific for neutron usage, concept of synthetic fields was introduced. Those"},{"line_number":255,"context_line":"fields are list of fields, that are not directly defined in data model,"},{"line_number":256,"context_line":"but should be filled from other database entities or compute at runtime."},{"line_number":257,"context_line":"The synthetic fields can be of different type, it can be build-in types (bool,"}],"source_content_type":"text/x-rst","patch_set":9,"id":"fa7ab95a_82fa9641","line":254,"range":{"start_line":254,"start_character":13,"end_line":254,"end_character":20},"updated":"2016-08-29 18:54:17.000000000","message":"nit: Neutron","commit_id":"c9fe8e2a25a03bc39d7a2df299576bcbf2a0bcc0"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"bbdc8c7bbc13298d55180dd6439c8081877df219","unresolved":false,"context_lines":[{"line_number":272,"context_line":"For example, ORM relationships can be modeled by synthetic fields."},{"line_number":273,"context_line":"Synthetic fields can have other OVO class defined for access."},{"line_number":274,"context_line":"In base class, :code:`load_synthetic_db_fields` method is searching for OVO"},{"line_number":275,"context_line":"classes to load needed data."},{"line_number":276,"context_line":""},{"line_number":277,"context_line":""},{"line_number":278,"context_line":"Custom synthetic fields loading method"}],"source_content_type":"text/x-rst","patch_set":9,"id":"fa7ab95a_82a8d621","line":275,"range":{"start_line":275,"start_character":16,"end_line":275,"end_character":22},"updated":"2016-08-29 18:54:17.000000000","message":"s/needed/required","commit_id":"c9fe8e2a25a03bc39d7a2df299576bcbf2a0bcc0"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"89857f46dec43f63bcd8f1beb4dc9ef1f35ac7a9","unresolved":false,"context_lines":[{"line_number":272,"context_line":"For example, ORM relationships can be modeled by synthetic fields."},{"line_number":273,"context_line":"Synthetic fields can have other OVO class defined for access."},{"line_number":274,"context_line":"In base class, :code:`load_synthetic_db_fields` method is searching for OVO"},{"line_number":275,"context_line":"classes to load needed data."},{"line_number":276,"context_line":""},{"line_number":277,"context_line":""},{"line_number":278,"context_line":"Custom synthetic fields loading method"}],"source_content_type":"text/x-rst","patch_set":9,"id":"7a8ec9b2_08b304ea","line":275,"range":{"start_line":275,"start_character":16,"end_line":275,"end_character":22},"in_reply_to":"fa7ab95a_82a8d621","updated":"2016-09-16 13:17:17.000000000","message":"Done","commit_id":"c9fe8e2a25a03bc39d7a2df299576bcbf2a0bcc0"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"bbdc8c7bbc13298d55180dd6439c8081877df219","unresolved":false,"context_lines":[{"line_number":333,"context_line":""},{"line_number":334,"context_line":"CRUD operations"},{"line_number":335,"context_line":"~~~~~~~~~~~~~~~"},{"line_number":336,"context_line":"Please take a look at simple object usage scenarios using above example:"},{"line_number":337,"context_line":""},{"line_number":338,"context_line":".. code-block:: Python"},{"line_number":339,"context_line":""}],"source_content_type":"text/x-rst","patch_set":9,"id":"fa7ab95a_3d3c8fc7","line":336,"range":{"start_line":336,"start_character":51,"end_line":336,"end_character":71},"updated":"2016-08-29 18:54:17.000000000","message":"You can remove this part of sentence, or if you\u0027re planning to leave it, please change above/below","commit_id":"c9fe8e2a25a03bc39d7a2df299576bcbf2a0bcc0"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"89857f46dec43f63bcd8f1beb4dc9ef1f35ac7a9","unresolved":false,"context_lines":[{"line_number":333,"context_line":""},{"line_number":334,"context_line":"CRUD operations"},{"line_number":335,"context_line":"~~~~~~~~~~~~~~~"},{"line_number":336,"context_line":"Please take a look at simple object usage scenarios using above example:"},{"line_number":337,"context_line":""},{"line_number":338,"context_line":".. code-block:: Python"},{"line_number":339,"context_line":""}],"source_content_type":"text/x-rst","patch_set":9,"id":"7a8ec9b2_a65ddc48","line":336,"range":{"start_line":336,"start_character":51,"end_line":336,"end_character":71},"in_reply_to":"fa7ab95a_3d3c8fc7","updated":"2016-09-16 13:17:17.000000000","message":"Done","commit_id":"c9fe8e2a25a03bc39d7a2df299576bcbf2a0bcc0"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"bbdc8c7bbc13298d55180dd6439c8081877df219","unresolved":false,"context_lines":[{"line_number":356,"context_line":""},{"line_number":357,"context_line":"    # for fetching multiple objects"},{"line_number":358,"context_line":"    dnses \u003d DNSNameServer.get_objects(context)"},{"line_number":359,"context_line":"    # will return list of all dns name servers from DB"},{"line_number":360,"context_line":""},{"line_number":361,"context_line":"    # if you want to remove the object, you need to fetch it first:"},{"line_number":362,"context_line":"    dns \u003d DNSNameServer.get_object(context, address\u003d\u0027asd\u0027, subnet_id\u003d\u0027xxx\u0027)"}],"source_content_type":"text/x-rst","patch_set":9,"id":"fa7ab95a_9db4bb35","line":359,"range":{"start_line":359,"start_character":6,"end_line":359,"end_character":54},"updated":"2016-08-29 18:54:17.000000000","message":"Is it possible to return list of some entries? For example, passing some kwargs?","commit_id":"c9fe8e2a25a03bc39d7a2df299576bcbf2a0bcc0"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"cf1e48fa464153173940c7bfd22ece1be7e38110","unresolved":false,"context_lines":[{"line_number":356,"context_line":""},{"line_number":357,"context_line":"    # for fetching multiple objects"},{"line_number":358,"context_line":"    dnses \u003d DNSNameServer.get_objects(context)"},{"line_number":359,"context_line":"    # will return list of all dns name servers from DB"},{"line_number":360,"context_line":""},{"line_number":361,"context_line":"    # if you want to remove the object, you need to fetch it first:"},{"line_number":362,"context_line":"    dns \u003d DNSNameServer.get_object(context, address\u003d\u0027asd\u0027, subnet_id\u003d\u0027xxx\u0027)"}],"source_content_type":"text/x-rst","patch_set":9,"id":"7a8ec9b2_093943a4","line":359,"range":{"start_line":359,"start_character":6,"end_line":359,"end_character":54},"in_reply_to":"7a8ec9b2_a3d4f11f","updated":"2016-09-16 13:18:40.000000000","message":"OK, see it. Thanks.","commit_id":"c9fe8e2a25a03bc39d7a2df299576bcbf2a0bcc0"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"89857f46dec43f63bcd8f1beb4dc9ef1f35ac7a9","unresolved":false,"context_lines":[{"line_number":356,"context_line":""},{"line_number":357,"context_line":"    # for fetching multiple objects"},{"line_number":358,"context_line":"    dnses \u003d DNSNameServer.get_objects(context)"},{"line_number":359,"context_line":"    # will return list of all dns name servers from DB"},{"line_number":360,"context_line":""},{"line_number":361,"context_line":"    # if you want to remove the object, you need to fetch it first:"},{"line_number":362,"context_line":"    dns \u003d DNSNameServer.get_object(context, address\u003d\u0027asd\u0027, subnet_id\u003d\u0027xxx\u0027)"}],"source_content_type":"text/x-rst","patch_set":9,"id":"7a8ec9b2_a3d4f11f","line":359,"range":{"start_line":359,"start_character":6,"end_line":359,"end_character":54},"in_reply_to":"fa7ab95a_9db4bb35","updated":"2016-09-16 13:17:17.000000000","message":"you mean like return all dnses that belong to certain subnet?\nsubnet_dnses \u003d DNSNameServer.get_objects(context, subnet_id\u003d\u0027xxx\u0027)\n?\nit is written down in line 381.","commit_id":"c9fe8e2a25a03bc39d7a2df299576bcbf2a0bcc0"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"bbdc8c7bbc13298d55180dd6439c8081877df219","unresolved":false,"context_lines":[{"line_number":365,"context_line":""},{"line_number":366,"context_line":"Sorting and filtering"},{"line_number":367,"context_line":"~~~~~~~~~~~~~~~~~~~~~"},{"line_number":368,"context_line":"You can register extra filter names using :code:`register_filter_hook_on_model`."},{"line_number":369,"context_line":""},{"line_number":370,"context_line":".. code-block:: Python"},{"line_number":371,"context_line":""}],"source_content_type":"text/x-rst","patch_set":9,"id":"fa7ab95a_ddef231c","line":368,"range":{"start_line":368,"start_character":0,"end_line":368,"end_character":80},"updated":"2016-08-29 18:54:17.000000000","message":"Could you provide usage example for this hook?","commit_id":"c9fe8e2a25a03bc39d7a2df299576bcbf2a0bcc0"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"89857f46dec43f63bcd8f1beb4dc9ef1f35ac7a9","unresolved":false,"context_lines":[{"line_number":365,"context_line":""},{"line_number":366,"context_line":"Sorting and filtering"},{"line_number":367,"context_line":"~~~~~~~~~~~~~~~~~~~~~"},{"line_number":368,"context_line":"You can register extra filter names using :code:`register_filter_hook_on_model`."},{"line_number":369,"context_line":""},{"line_number":370,"context_line":".. code-block:: Python"},{"line_number":371,"context_line":""}],"source_content_type":"text/x-rst","patch_set":9,"id":"7a8ec9b2_8660e002","line":368,"range":{"start_line":368,"start_character":0,"end_line":368,"end_character":80},"in_reply_to":"fa7ab95a_ddef231c","updated":"2016-09-16 13:17:17.000000000","message":"Done","commit_id":"c9fe8e2a25a03bc39d7a2df299576bcbf2a0bcc0"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"bbdc8c7bbc13298d55180dd6439c8081877df219","unresolved":false,"context_lines":[{"line_number":392,"context_line":"------------------------"},{"line_number":393,"context_line":"(TBD)"},{"line_number":394,"context_line":""},{"line_number":395,"context_line":"Extensions to neutron resources"},{"line_number":396,"context_line":"-------------------------------"},{"line_number":397,"context_line":"Previous method to extend neutron resources was to add an arbitrary values to"},{"line_number":398,"context_line":"dictionary representing the data by providing extend_(subnet|port|network)_dict"}],"source_content_type":"text/x-rst","patch_set":9,"id":"fa7ab95a_1dcd0bb7","line":395,"range":{"start_line":395,"start_character":14,"end_line":395,"end_character":21},"updated":"2016-08-29 18:54:17.000000000","message":"nit: Neutron","commit_id":"c9fe8e2a25a03bc39d7a2df299576bcbf2a0bcc0"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"bbdc8c7bbc13298d55180dd6439c8081877df219","unresolved":false,"context_lines":[{"line_number":394,"context_line":""},{"line_number":395,"context_line":"Extensions to neutron resources"},{"line_number":396,"context_line":"-------------------------------"},{"line_number":397,"context_line":"Previous method to extend neutron resources was to add an arbitrary values to"},{"line_number":398,"context_line":"dictionary representing the data by providing extend_(subnet|port|network)_dict"},{"line_number":399,"context_line":"function and defining loading method. When using objects, we cannot add custom"},{"line_number":400,"context_line":"extensions at plugin side. All values have to be exposed in object class that is"}],"source_content_type":"text/x-rst","patch_set":9,"id":"fa7ab95a_5d4a3327","line":397,"range":{"start_line":397,"start_character":26,"end_line":397,"end_character":33},"updated":"2016-08-29 18:54:17.000000000","message":"ditto","commit_id":"c9fe8e2a25a03bc39d7a2df299576bcbf2a0bcc0"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"bbdc8c7bbc13298d55180dd6439c8081877df219","unresolved":false,"context_lines":[{"line_number":458,"context_line":""},{"line_number":459,"context_line":"For Newton release, we would need to pass the database object into"},{"line_number":460,"context_line":":code:`_make_(subnet|port|network)_dict` and :code:`_apply_dict_extend_functions`"},{"line_number":461,"context_line":"methods for backward compatibility and supprot for out-of-tree neutron drivers"},{"line_number":462,"context_line":"and plugins."},{"line_number":463,"context_line":""},{"line_number":464,"context_line":"Backward compatibility for tenant_id."}],"source_content_type":"text/x-rst","patch_set":9,"id":"fa7ab95a_5d94f341","line":461,"range":{"start_line":461,"start_character":39,"end_line":461,"end_character":46},"updated":"2016-08-29 18:54:17.000000000","message":"typo: support","commit_id":"c9fe8e2a25a03bc39d7a2df299576bcbf2a0bcc0"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"89857f46dec43f63bcd8f1beb4dc9ef1f35ac7a9","unresolved":false,"context_lines":[{"line_number":458,"context_line":""},{"line_number":459,"context_line":"For Newton release, we would need to pass the database object into"},{"line_number":460,"context_line":":code:`_make_(subnet|port|network)_dict` and :code:`_apply_dict_extend_functions`"},{"line_number":461,"context_line":"methods for backward compatibility and supprot for out-of-tree neutron drivers"},{"line_number":462,"context_line":"and plugins."},{"line_number":463,"context_line":""},{"line_number":464,"context_line":"Backward compatibility for tenant_id."}],"source_content_type":"text/x-rst","patch_set":9,"id":"7a8ec9b2_3ec39a8a","line":461,"range":{"start_line":461,"start_character":39,"end_line":461,"end_character":46},"in_reply_to":"fa7ab95a_5d94f341","updated":"2016-09-16 13:17:17.000000000","message":"Done","commit_id":"c9fe8e2a25a03bc39d7a2df299576bcbf2a0bcc0"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"bbdc8c7bbc13298d55180dd6439c8081877df219","unresolved":false,"context_lines":[{"line_number":471,"context_line":"be sent over RPC callback wire. When talking about filtering/sorting by"},{"line_number":472,"context_line":":code:`tenant_id`, the filters should be converted to expose :code:`project_id`"},{"line_number":473,"context_line":"field. This means that for the long run, the API layer should translate it, but"},{"line_number":474,"context_line":"as temporary workaround it can be done at DB layer before passing filters"},{"line_number":475,"context_line":"to object\u0027s :code:`get_objects` method."},{"line_number":476,"context_line":""},{"line_number":477,"context_line":"References"}],"source_content_type":"text/x-rst","patch_set":9,"id":"fa7ab95a_3d7e4f19","line":474,"range":{"start_line":474,"start_character":24,"end_line":474,"end_character":50},"updated":"2016-08-29 18:54:17.000000000","message":"Could you give an example?","commit_id":"c9fe8e2a25a03bc39d7a2df299576bcbf2a0bcc0"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"89857f46dec43f63bcd8f1beb4dc9ef1f35ac7a9","unresolved":false,"context_lines":[{"line_number":471,"context_line":"be sent over RPC callback wire. When talking about filtering/sorting by"},{"line_number":472,"context_line":":code:`tenant_id`, the filters should be converted to expose :code:`project_id`"},{"line_number":473,"context_line":"field. This means that for the long run, the API layer should translate it, but"},{"line_number":474,"context_line":"as temporary workaround it can be done at DB layer before passing filters"},{"line_number":475,"context_line":"to object\u0027s :code:`get_objects` method."},{"line_number":476,"context_line":""},{"line_number":477,"context_line":"References"}],"source_content_type":"text/x-rst","patch_set":9,"id":"7a8ec9b2_c69108f3","line":474,"range":{"start_line":474,"start_character":24,"end_line":474,"end_character":50},"in_reply_to":"fa7ab95a_3d7e4f19","updated":"2016-09-16 13:17:17.000000000","message":"Done","commit_id":"c9fe8e2a25a03bc39d7a2df299576bcbf2a0bcc0"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"81cd4e567bce98b3a14f29a7b1545c0f88c80542","unresolved":false,"context_lines":[{"line_number":33,"context_line":"object per database resource, and make them versioned, so it creates strict data"},{"line_number":34,"context_line":"definition with reference number. When you change the database schema, you change"},{"line_number":35,"context_line":"the version of an object and provide backward compatible translation method."},{"line_number":36,"context_line":"Different version of software can communicate with each other, allowing"},{"line_number":37,"context_line":"communication between different versions of the software (via RPC i.e.)."},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"OVO is also commonly used for RPC payload versioning. It is used for versioning"}],"source_content_type":"text/x-rst","patch_set":10,"id":"fa6399be_2cbadd0a","line":36,"range":{"start_line":36,"start_character":10,"end_line":36,"end_character":17},"updated":"2016-10-19 18:01:09.000000000","message":"s/version/versions","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"da2afa0678a7d214e8e94917f7e2ea4db40aa717","unresolved":false,"context_lines":[{"line_number":33,"context_line":"object per database resource, and make them versioned, so it creates strict data"},{"line_number":34,"context_line":"definition with reference number. When you change the database schema, you change"},{"line_number":35,"context_line":"the version of an object and provide backward compatible translation method."},{"line_number":36,"context_line":"Different version of software can communicate with each other, allowing"},{"line_number":37,"context_line":"communication between different versions of the software (via RPC i.e.)."},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"OVO is also commonly used for RPC payload versioning. It is used for versioning"}],"source_content_type":"text/x-rst","patch_set":10,"id":"5a74a57a_2c19ec88","line":36,"range":{"start_line":36,"start_character":10,"end_line":36,"end_character":17},"in_reply_to":"fa6399be_2cbadd0a","updated":"2016-11-29 13:10:45.000000000","message":"Done","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":19591,"name":"Saisrikiran Mudigonda","email":"saisrikiran.mudigonda@intel.com","username":"saisrikiran"},"change_message_id":"1b3ca0d4971cfd2da44ca56b930575580d103221","unresolved":false,"context_lines":[{"line_number":87,"context_line":":code:`obj_make_compatible(self, primitive, target_version)`."},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"Note, that Standard Attributes are automatically added to OVO fields in base class."},{"line_number":90,"context_line":"Attributes [#]_ like :code:`description`, :code:`create_at` and :code:`updated_at`"},{"line_number":91,"context_line":"are added in [#]_."},{"line_number":92,"context_line":""},{"line_number":93,"context_line":""}],"source_content_type":"text/x-rst","patch_set":10,"id":"7a77a97e_a181aa4f","line":90,"range":{"start_line":90,"start_character":43,"end_line":90,"end_character":59},"updated":"2016-11-22 18:10:05.000000000","message":"s/code:`create_at`/code:`created_at`","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"da2afa0678a7d214e8e94917f7e2ea4db40aa717","unresolved":false,"context_lines":[{"line_number":87,"context_line":":code:`obj_make_compatible(self, primitive, target_version)`."},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"Note, that Standard Attributes are automatically added to OVO fields in base class."},{"line_number":90,"context_line":"Attributes [#]_ like :code:`description`, :code:`create_at` and :code:`updated_at`"},{"line_number":91,"context_line":"are added in [#]_."},{"line_number":92,"context_line":""},{"line_number":93,"context_line":""}],"source_content_type":"text/x-rst","patch_set":10,"id":"5a74a57a_ec07f419","line":90,"range":{"start_line":90,"start_character":43,"end_line":90,"end_character":59},"in_reply_to":"7a77a97e_a181aa4f","updated":"2016-11-29 13:10:45.000000000","message":"Done","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"81cd4e567bce98b3a14f29a7b1545c0f88c80542","unresolved":false,"context_lines":[{"line_number":90,"context_line":"Attributes [#]_ like :code:`description`, :code:`create_at` and :code:`updated_at`"},{"line_number":91,"context_line":"are added in [#]_."},{"line_number":92,"context_line":""},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"You are able to define multiple primary keys connected to the object using"},{"line_number":95,"context_line":":code:`primary_keys` property. The default is :code:`primary_keys \u003d [\u0027id\u0027]`."},{"line_number":96,"context_line":"For immutable object fields that cannot be changed, there is defined"}],"source_content_type":"text/x-rst","patch_set":10,"id":"fa6399be_0c1b591c","line":93,"updated":"2016-10-19 18:01:09.000000000","message":"nit: Extra break line","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"da2afa0678a7d214e8e94917f7e2ea4db40aa717","unresolved":false,"context_lines":[{"line_number":90,"context_line":"Attributes [#]_ like :code:`description`, :code:`create_at` and :code:`updated_at`"},{"line_number":91,"context_line":"are added in [#]_."},{"line_number":92,"context_line":""},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"You are able to define multiple primary keys connected to the object using"},{"line_number":95,"context_line":":code:`primary_keys` property. The default is :code:`primary_keys \u003d [\u0027id\u0027]`."},{"line_number":96,"context_line":"For immutable object fields that cannot be changed, there is defined"}],"source_content_type":"text/x-rst","patch_set":10,"id":"5a74a57a_27002701","line":93,"in_reply_to":"fa6399be_0c1b591c","updated":"2016-11-29 13:10:45.000000000","message":"Done","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"a901c4350e388a23a2c583407be6c67052f949ac","unresolved":false,"context_lines":[{"line_number":91,"context_line":"are added in [#]_."},{"line_number":92,"context_line":""},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"You are able to define multiple primary keys connected to the object using"},{"line_number":95,"context_line":":code:`primary_keys` property. The default is :code:`primary_keys \u003d [\u0027id\u0027]`."},{"line_number":96,"context_line":"For immutable object fields that cannot be changed, there is defined"},{"line_number":97,"context_line":":code:`fields_no_update` list, and it is containing :code:`primary_keys`"},{"line_number":98,"context_line":"by default."}],"source_content_type":"text/x-rst","patch_set":10,"id":"7a77a97e_d62bcb31","line":95,"range":{"start_line":94,"start_character":0,"end_line":95,"end_character":30},"updated":"2016-11-22 18:52:19.000000000","message":"The way we use the term \u0027primary keys\u0027 is OVO is a misnomer. In an SQL table (and an OVO object), you only have one primary key. That primary key can include one or several table columns (OVO fields). So, to not confuse a new comer to OVO, I would restate this sentence as: \n\n\"You are able to define an object\u0027s primary key using the :code:`primary_keys` property, where one or several fields can be listed.\"\n\nThis way, since the start, we warn the reader that we have our own way to use the term \u0027primary_keys\u0027","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"da2afa0678a7d214e8e94917f7e2ea4db40aa717","unresolved":false,"context_lines":[{"line_number":91,"context_line":"are added in [#]_."},{"line_number":92,"context_line":""},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"You are able to define multiple primary keys connected to the object using"},{"line_number":95,"context_line":":code:`primary_keys` property. The default is :code:`primary_keys \u003d [\u0027id\u0027]`."},{"line_number":96,"context_line":"For immutable object fields that cannot be changed, there is defined"},{"line_number":97,"context_line":":code:`fields_no_update` list, and it is containing :code:`primary_keys`"},{"line_number":98,"context_line":"by default."}],"source_content_type":"text/x-rst","patch_set":10,"id":"5a74a57a_87a9fbe1","line":95,"range":{"start_line":94,"start_character":0,"end_line":95,"end_character":30},"in_reply_to":"7a77a97e_d62bcb31","updated":"2016-11-29 13:10:45.000000000","message":"Done","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"a901c4350e388a23a2c583407be6c67052f949ac","unresolved":false,"context_lines":[{"line_number":93,"context_line":""},{"line_number":94,"context_line":"You are able to define multiple primary keys connected to the object using"},{"line_number":95,"context_line":":code:`primary_keys` property. The default is :code:`primary_keys \u003d [\u0027id\u0027]`."},{"line_number":96,"context_line":"For immutable object fields that cannot be changed, there is defined"},{"line_number":97,"context_line":":code:`fields_no_update` list, and it is containing :code:`primary_keys`"},{"line_number":98,"context_line":"by default."},{"line_number":99,"context_line":""}],"source_content_type":"text/x-rst","patch_set":10,"id":"7a77a97e_13b6358a","line":96,"range":{"start_line":96,"start_character":52,"end_line":96,"end_character":68},"updated":"2016-11-22 18:52:19.000000000","message":"there is a","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"da2afa0678a7d214e8e94917f7e2ea4db40aa717","unresolved":false,"context_lines":[{"line_number":93,"context_line":""},{"line_number":94,"context_line":"You are able to define multiple primary keys connected to the object using"},{"line_number":95,"context_line":":code:`primary_keys` property. The default is :code:`primary_keys \u003d [\u0027id\u0027]`."},{"line_number":96,"context_line":"For immutable object fields that cannot be changed, there is defined"},{"line_number":97,"context_line":":code:`fields_no_update` list, and it is containing :code:`primary_keys`"},{"line_number":98,"context_line":"by default."},{"line_number":99,"context_line":""}],"source_content_type":"text/x-rst","patch_set":10,"id":"5a74a57a_e7baaf22","line":96,"range":{"start_line":96,"start_character":52,"end_line":96,"end_character":68},"in_reply_to":"7a77a97e_13b6358a","updated":"2016-11-29 13:10:45.000000000","message":"Done","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"a901c4350e388a23a2c583407be6c67052f949ac","unresolved":false,"context_lines":[{"line_number":94,"context_line":"You are able to define multiple primary keys connected to the object using"},{"line_number":95,"context_line":":code:`primary_keys` property. The default is :code:`primary_keys \u003d [\u0027id\u0027]`."},{"line_number":96,"context_line":"For immutable object fields that cannot be changed, there is defined"},{"line_number":97,"context_line":":code:`fields_no_update` list, and it is containing :code:`primary_keys`"},{"line_number":98,"context_line":"by default."},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"If there is situation, that field should be named differently in object"}],"source_content_type":"text/x-rst","patch_set":10,"id":"7a77a97e_f365391d","line":97,"range":{"start_line":97,"start_character":38,"end_line":97,"end_character":51},"updated":"2016-11-22 18:52:19.000000000","message":"contains","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"da2afa0678a7d214e8e94917f7e2ea4db40aa717","unresolved":false,"context_lines":[{"line_number":94,"context_line":"You are able to define multiple primary keys connected to the object using"},{"line_number":95,"context_line":":code:`primary_keys` property. The default is :code:`primary_keys \u003d [\u0027id\u0027]`."},{"line_number":96,"context_line":"For immutable object fields that cannot be changed, there is defined"},{"line_number":97,"context_line":":code:`fields_no_update` list, and it is containing :code:`primary_keys`"},{"line_number":98,"context_line":"by default."},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"If there is situation, that field should be named differently in object"}],"source_content_type":"text/x-rst","patch_set":10,"id":"5a74a57a_c792139f","line":97,"range":{"start_line":97,"start_character":38,"end_line":97,"end_character":51},"in_reply_to":"7a77a97e_f365391d","updated":"2016-11-29 13:10:45.000000000","message":"Done","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"81cd4e567bce98b3a14f29a7b1545c0f88c80542","unresolved":false,"context_lines":[{"line_number":97,"context_line":":code:`fields_no_update` list, and it is containing :code:`primary_keys`"},{"line_number":98,"context_line":"by default."},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"If there is situation, that field should be named differently in object"},{"line_number":101,"context_line":"than in database schema, you can use :code:`fields_need_translation`."},{"line_number":102,"context_line":"This dictionary is containing the name of field in the"},{"line_number":103,"context_line":"object definition and name of field in db. It was created to easily"}],"source_content_type":"text/x-rst","patch_set":10,"id":"fa6399be_2cc49d5d","line":100,"range":{"start_line":100,"start_character":0,"end_line":100,"end_character":61},"updated":"2016-10-19 18:01:09.000000000","message":"If there is situation where a field needs to be named differently","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"da2afa0678a7d214e8e94917f7e2ea4db40aa717","unresolved":false,"context_lines":[{"line_number":97,"context_line":":code:`fields_no_update` list, and it is containing :code:`primary_keys`"},{"line_number":98,"context_line":"by default."},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"If there is situation, that field should be named differently in object"},{"line_number":101,"context_line":"than in database schema, you can use :code:`fields_need_translation`."},{"line_number":102,"context_line":"This dictionary is containing the name of field in the"},{"line_number":103,"context_line":"object definition and name of field in db. It was created to easily"}],"source_content_type":"text/x-rst","patch_set":10,"id":"5a74a57a_a76ef72c","line":100,"range":{"start_line":100,"start_character":0,"end_line":100,"end_character":61},"in_reply_to":"fa6399be_2cc49d5d","updated":"2016-11-29 13:10:45.000000000","message":"Done","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"81cd4e567bce98b3a14f29a7b1545c0f88c80542","unresolved":false,"context_lines":[{"line_number":99,"context_line":""},{"line_number":100,"context_line":"If there is situation, that field should be named differently in object"},{"line_number":101,"context_line":"than in database schema, you can use :code:`fields_need_translation`."},{"line_number":102,"context_line":"This dictionary is containing the name of field in the"},{"line_number":103,"context_line":"object definition and name of field in db. It was created to easily"},{"line_number":104,"context_line":"manipulate the database representation to object definition."},{"line_number":105,"context_line":"For example in IP allocation pools::"}],"source_content_type":"text/x-rst","patch_set":10,"id":"fa6399be_0cf279d2","line":102,"range":{"start_line":102,"start_character":16,"end_line":102,"end_character":29},"updated":"2016-10-19 18:01:09.000000000","message":"s/is containing/contains","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"da2afa0678a7d214e8e94917f7e2ea4db40aa717","unresolved":false,"context_lines":[{"line_number":99,"context_line":""},{"line_number":100,"context_line":"If there is situation, that field should be named differently in object"},{"line_number":101,"context_line":"than in database schema, you can use :code:`fields_need_translation`."},{"line_number":102,"context_line":"This dictionary is containing the name of field in the"},{"line_number":103,"context_line":"object definition and name of field in db. It was created to easily"},{"line_number":104,"context_line":"manipulate the database representation to object definition."},{"line_number":105,"context_line":"For example in IP allocation pools::"}],"source_content_type":"text/x-rst","patch_set":10,"id":"5a74a57a_2761073a","line":102,"range":{"start_line":102,"start_character":16,"end_line":102,"end_character":29},"in_reply_to":"fa6399be_0cf279d2","updated":"2016-11-29 13:10:45.000000000","message":"Done","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"81cd4e567bce98b3a14f29a7b1545c0f88c80542","unresolved":false,"context_lines":[{"line_number":113,"context_line":"Above dict is used in :code:`modify_fields_from_db` and in :code:`modify_fields_to_db`"},{"line_number":114,"context_line":"methods which are implemented in base class and will translate the software layer"},{"line_number":115,"context_line":"to database schema naming. It can be also used in :code:`orm.relationship` names"},{"line_number":116,"context_line":"mapping, when relationship is named different in DB model than in object model."},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"When talking about relationship, for :code:`NeutronDbObject` there is defined"},{"line_number":119,"context_line":":code:`synthetic_fields` property, which is a new concept introduced for neutron."}],"source_content_type":"text/x-rst","patch_set":10,"id":"fa6399be_8cfe8969","line":116,"range":{"start_line":116,"start_character":9,"end_line":116,"end_character":78},"updated":"2016-10-19 18:01:09.000000000","message":"when relationship in DB model is named differently than in object model","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"da2afa0678a7d214e8e94917f7e2ea4db40aa717","unresolved":false,"context_lines":[{"line_number":113,"context_line":"Above dict is used in :code:`modify_fields_from_db` and in :code:`modify_fields_to_db`"},{"line_number":114,"context_line":"methods which are implemented in base class and will translate the software layer"},{"line_number":115,"context_line":"to database schema naming. It can be also used in :code:`orm.relationship` names"},{"line_number":116,"context_line":"mapping, when relationship is named different in DB model than in object model."},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"When talking about relationship, for :code:`NeutronDbObject` there is defined"},{"line_number":119,"context_line":":code:`synthetic_fields` property, which is a new concept introduced for neutron."}],"source_content_type":"text/x-rst","patch_set":10,"id":"5a74a57a_07e24b9f","line":116,"range":{"start_line":116,"start_character":9,"end_line":116,"end_character":78},"in_reply_to":"fa6399be_8cfe8969","updated":"2016-11-29 13:10:45.000000000","message":"Done","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"81cd4e567bce98b3a14f29a7b1545c0f88c80542","unresolved":false,"context_lines":[{"line_number":120,"context_line":"It is a list of fields that are not directly defined in DB model, but are referenced"},{"line_number":121,"context_line":"as :code:`orm.relationship` or computed at runtime in neutron code."},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"In order to automatically fetch the :code:`synthetic_fields`, the :code:`foreign_keys`"},{"line_number":124,"context_line":"property is introduced. :code:`load_synthetic_fields` [#]_ method from NeutronDbObject"},{"line_number":125,"context_line":"is using :code:`foreign_keys` to match the foreign key in related object and local"},{"line_number":126,"context_line":"field that the foreign key is referring to. For example:"}],"source_content_type":"text/x-rst","patch_set":10,"id":"fa6399be_ccb0818e","line":123,"range":{"start_line":123,"start_character":73,"end_line":123,"end_character":85},"updated":"2016-10-19 18:01:09.000000000","message":"We were discussing about the misunderstanding of using foreign keys causes, and the possibility to use other name, e.g. synthetic_key.","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"81cd4e567bce98b3a14f29a7b1545c0f88c80542","unresolved":false,"context_lines":[{"line_number":120,"context_line":"It is a list of fields that are not directly defined in DB model, but are referenced"},{"line_number":121,"context_line":"as :code:`orm.relationship` or computed at runtime in neutron code."},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"In order to automatically fetch the :code:`synthetic_fields`, the :code:`foreign_keys`"},{"line_number":124,"context_line":"property is introduced. :code:`load_synthetic_fields` [#]_ method from NeutronDbObject"},{"line_number":125,"context_line":"is using :code:`foreign_keys` to match the foreign key in related object and local"},{"line_number":126,"context_line":"field that the foreign key is referring to. For example:"}],"source_content_type":"text/x-rst","patch_set":10,"id":"fa6399be_ec4f05bc","line":123,"range":{"start_line":123,"start_character":26,"end_line":123,"end_character":31},"updated":"2016-10-19 18:01:09.000000000","message":"what about to use \"populate\" instead of \"fetch\"?","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"da2afa0678a7d214e8e94917f7e2ea4db40aa717","unresolved":false,"context_lines":[{"line_number":120,"context_line":"It is a list of fields that are not directly defined in DB model, but are referenced"},{"line_number":121,"context_line":"as :code:`orm.relationship` or computed at runtime in neutron code."},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"In order to automatically fetch the :code:`synthetic_fields`, the :code:`foreign_keys`"},{"line_number":124,"context_line":"property is introduced. :code:`load_synthetic_fields` [#]_ method from NeutronDbObject"},{"line_number":125,"context_line":"is using :code:`foreign_keys` to match the foreign key in related object and local"},{"line_number":126,"context_line":"field that the foreign key is referring to. For example:"}],"source_content_type":"text/x-rst","patch_set":10,"id":"5a74a57a_e291bd9a","line":123,"range":{"start_line":123,"start_character":73,"end_line":123,"end_character":85},"in_reply_to":"fa6399be_ccb0818e","updated":"2016-11-29 13:10:45.000000000","message":"It was named \u0027foreign keys\u0027 after SQL naming convention. I\u0027m seeing the confusion about where to put the foreign keys, in which class, but the below explanation (lines 155-163) seems to clarify it.","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"da2afa0678a7d214e8e94917f7e2ea4db40aa717","unresolved":false,"context_lines":[{"line_number":120,"context_line":"It is a list of fields that are not directly defined in DB model, but are referenced"},{"line_number":121,"context_line":"as :code:`orm.relationship` or computed at runtime in neutron code."},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"In order to automatically fetch the :code:`synthetic_fields`, the :code:`foreign_keys`"},{"line_number":124,"context_line":"property is introduced. :code:`load_synthetic_fields` [#]_ method from NeutronDbObject"},{"line_number":125,"context_line":"is using :code:`foreign_keys` to match the foreign key in related object and local"},{"line_number":126,"context_line":"field that the foreign key is referring to. For example:"}],"source_content_type":"text/x-rst","patch_set":10,"id":"5a74a57a_e7ab8f1b","line":123,"range":{"start_line":123,"start_character":26,"end_line":123,"end_character":31},"in_reply_to":"fa6399be_ec4f05bc","updated":"2016-11-29 13:10:45.000000000","message":"Done","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":19591,"name":"Saisrikiran Mudigonda","email":"saisrikiran.mudigonda@intel.com","username":"saisrikiran"},"change_message_id":"1b3ca0d4971cfd2da44ca56b930575580d103221","unresolved":false,"context_lines":[{"line_number":121,"context_line":"as :code:`orm.relationship` or computed at runtime in neutron code."},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"In order to automatically fetch the :code:`synthetic_fields`, the :code:`foreign_keys`"},{"line_number":124,"context_line":"property is introduced. :code:`load_synthetic_fields` [#]_ method from NeutronDbObject"},{"line_number":125,"context_line":"is using :code:`foreign_keys` to match the foreign key in related object and local"},{"line_number":126,"context_line":"field that the foreign key is referring to. For example:"},{"line_number":127,"context_line":""}],"source_content_type":"text/x-rst","patch_set":10,"id":"7a77a97e_33a891db","line":124,"range":{"start_line":124,"start_character":24,"end_line":124,"end_character":53},"updated":"2016-11-22 18:10:05.000000000","message":"s/code:`load_synthetic_fields`/code:`load_synthetic_db_fields`","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"da2afa0678a7d214e8e94917f7e2ea4db40aa717","unresolved":false,"context_lines":[{"line_number":121,"context_line":"as :code:`orm.relationship` or computed at runtime in neutron code."},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"In order to automatically fetch the :code:`synthetic_fields`, the :code:`foreign_keys`"},{"line_number":124,"context_line":"property is introduced. :code:`load_synthetic_fields` [#]_ method from NeutronDbObject"},{"line_number":125,"context_line":"is using :code:`foreign_keys` to match the foreign key in related object and local"},{"line_number":126,"context_line":"field that the foreign key is referring to. For example:"},{"line_number":127,"context_line":""}],"source_content_type":"text/x-rst","patch_set":10,"id":"5a74a57a_c2d92185","line":124,"range":{"start_line":124,"start_character":24,"end_line":124,"end_character":53},"in_reply_to":"7a77a97e_33a891db","updated":"2016-11-29 13:10:45.000000000","message":"Done","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"a901c4350e388a23a2c583407be6c67052f949ac","unresolved":false,"context_lines":[{"line_number":122,"context_line":""},{"line_number":123,"context_line":"In order to automatically fetch the :code:`synthetic_fields`, the :code:`foreign_keys`"},{"line_number":124,"context_line":"property is introduced. :code:`load_synthetic_fields` [#]_ method from NeutronDbObject"},{"line_number":125,"context_line":"is using :code:`foreign_keys` to match the foreign key in related object and local"},{"line_number":126,"context_line":"field that the foreign key is referring to. For example:"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":".. code-block:: Python"}],"source_content_type":"text/x-rst","patch_set":10,"id":"7a77a97e_b3b90118","line":125,"range":{"start_line":125,"start_character":0,"end_line":125,"end_character":8},"updated":"2016-11-22 18:52:19.000000000","message":"uses","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"da2afa0678a7d214e8e94917f7e2ea4db40aa717","unresolved":false,"context_lines":[{"line_number":122,"context_line":""},{"line_number":123,"context_line":"In order to automatically fetch the :code:`synthetic_fields`, the :code:`foreign_keys`"},{"line_number":124,"context_line":"property is introduced. :code:`load_synthetic_fields` [#]_ method from NeutronDbObject"},{"line_number":125,"context_line":"is using :code:`foreign_keys` to match the foreign key in related object and local"},{"line_number":126,"context_line":"field that the foreign key is referring to. For example:"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":".. code-block:: Python"}],"source_content_type":"text/x-rst","patch_set":10,"id":"5a74a57a_021a396e","line":125,"range":{"start_line":125,"start_character":0,"end_line":125,"end_character":8},"in_reply_to":"7a77a97e_b3b90118","updated":"2016-11-29 13:10:45.000000000","message":"Done","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"81cd4e567bce98b3a14f29a7b1545c0f88c80542","unresolved":false,"context_lines":[{"line_number":152,"context_line":"        primary_keys \u003d [\u0027id\u0027]"},{"line_number":153,"context_line":"        foreign_keys \u003d {\u0027Subnet\u0027: {\u0027subnet_id\u0027: \u0027id\u0027}}"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"The :code:`foreign_keys` is used in :code:`SubnetOVO` to fetch the"},{"line_number":156,"context_line":":code:`allocation_pools` [#]_ using the :code:`IPAllocationPoolOVO` class."},{"line_number":157,"context_line":"Note that the foreign_keys are declared in related object, where :code:`subnet_id`"},{"line_number":158,"context_line":"is declared, similarly like it is done in SQL model. In order to support foreign"}],"source_content_type":"text/x-rst","patch_set":10,"id":"fa6399be_4c18f184","line":155,"range":{"start_line":155,"start_character":57,"end_line":155,"end_character":62},"updated":"2016-10-19 18:01:09.000000000","message":"s/fetch/populate","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"da2afa0678a7d214e8e94917f7e2ea4db40aa717","unresolved":false,"context_lines":[{"line_number":152,"context_line":"        primary_keys \u003d [\u0027id\u0027]"},{"line_number":153,"context_line":"        foreign_keys \u003d {\u0027Subnet\u0027: {\u0027subnet_id\u0027: \u0027id\u0027}}"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"The :code:`foreign_keys` is used in :code:`SubnetOVO` to fetch the"},{"line_number":156,"context_line":":code:`allocation_pools` [#]_ using the :code:`IPAllocationPoolOVO` class."},{"line_number":157,"context_line":"Note that the foreign_keys are declared in related object, where :code:`subnet_id`"},{"line_number":158,"context_line":"is declared, similarly like it is done in SQL model. In order to support foreign"}],"source_content_type":"text/x-rst","patch_set":10,"id":"5a74a57a_e2561dd1","line":155,"range":{"start_line":155,"start_character":57,"end_line":155,"end_character":62},"in_reply_to":"fa6399be_4c18f184","updated":"2016-11-29 13:10:45.000000000","message":"Done","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"81cd4e567bce98b3a14f29a7b1545c0f88c80542","unresolved":false,"context_lines":[{"line_number":153,"context_line":"        foreign_keys \u003d {\u0027Subnet\u0027: {\u0027subnet_id\u0027: \u0027id\u0027}}"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"The :code:`foreign_keys` is used in :code:`SubnetOVO` to fetch the"},{"line_number":156,"context_line":":code:`allocation_pools` [#]_ using the :code:`IPAllocationPoolOVO` class."},{"line_number":157,"context_line":"Note that the foreign_keys are declared in related object, where :code:`subnet_id`"},{"line_number":158,"context_line":"is declared, similarly like it is done in SQL model. In order to support foreign"},{"line_number":159,"context_line":"keys for many related object, you should declare the name of the related object"}],"source_content_type":"text/x-rst","patch_set":10,"id":"fa6399be_0c07d91c","line":156,"range":{"start_line":156,"start_character":29,"end_line":156,"end_character":30},"updated":"2016-10-19 18:01:09.000000000","message":"synthetic field","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"da2afa0678a7d214e8e94917f7e2ea4db40aa717","unresolved":false,"context_lines":[{"line_number":153,"context_line":"        foreign_keys \u003d {\u0027Subnet\u0027: {\u0027subnet_id\u0027: \u0027id\u0027}}"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"The :code:`foreign_keys` is used in :code:`SubnetOVO` to fetch the"},{"line_number":156,"context_line":":code:`allocation_pools` [#]_ using the :code:`IPAllocationPoolOVO` class."},{"line_number":157,"context_line":"Note that the foreign_keys are declared in related object, where :code:`subnet_id`"},{"line_number":158,"context_line":"is declared, similarly like it is done in SQL model. In order to support foreign"},{"line_number":159,"context_line":"keys for many related object, you should declare the name of the related object"}],"source_content_type":"text/x-rst","patch_set":10,"id":"5a74a57a_82e1e900","line":156,"range":{"start_line":156,"start_character":29,"end_line":156,"end_character":30},"in_reply_to":"fa6399be_0c07d91c","updated":"2016-11-29 13:10:45.000000000","message":"Done","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"81cd4e567bce98b3a14f29a7b1545c0f88c80542","unresolved":false,"context_lines":[{"line_number":154,"context_line":""},{"line_number":155,"context_line":"The :code:`foreign_keys` is used in :code:`SubnetOVO` to fetch the"},{"line_number":156,"context_line":":code:`allocation_pools` [#]_ using the :code:`IPAllocationPoolOVO` class."},{"line_number":157,"context_line":"Note that the foreign_keys are declared in related object, where :code:`subnet_id`"},{"line_number":158,"context_line":"is declared, similarly like it is done in SQL model. In order to support foreign"},{"line_number":159,"context_line":"keys for many related object, you should declare the name of the related object"},{"line_number":160,"context_line":"(:code:`Subnet` i.e.) as key and as value declare which field from local object"}],"source_content_type":"text/x-rst","patch_set":10,"id":"fa6399be_2f472f4c","line":157,"updated":"2016-10-19 18:01:09.000000000","message":"It would be valuable to mention that the necessity to define foreign keys depends on the existence of synthetic fields and not on the DB model definition","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"da2afa0678a7d214e8e94917f7e2ea4db40aa717","unresolved":false,"context_lines":[{"line_number":154,"context_line":""},{"line_number":155,"context_line":"The :code:`foreign_keys` is used in :code:`SubnetOVO` to fetch the"},{"line_number":156,"context_line":":code:`allocation_pools` [#]_ using the :code:`IPAllocationPoolOVO` class."},{"line_number":157,"context_line":"Note that the foreign_keys are declared in related object, where :code:`subnet_id`"},{"line_number":158,"context_line":"is declared, similarly like it is done in SQL model. In order to support foreign"},{"line_number":159,"context_line":"keys for many related object, you should declare the name of the related object"},{"line_number":160,"context_line":"(:code:`Subnet` i.e.) as key and as value declare which field from local object"}],"source_content_type":"text/x-rst","patch_set":10,"id":"5a74a57a_5df414f1","line":157,"in_reply_to":"fa6399be_2f472f4c","updated":"2016-11-29 13:10:45.000000000","message":"I do not get what exactly should be written down?","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"a901c4350e388a23a2c583407be6c67052f949ac","unresolved":false,"context_lines":[{"line_number":155,"context_line":"The :code:`foreign_keys` is used in :code:`SubnetOVO` to fetch the"},{"line_number":156,"context_line":":code:`allocation_pools` [#]_ using the :code:`IPAllocationPoolOVO` class."},{"line_number":157,"context_line":"Note that the foreign_keys are declared in related object, where :code:`subnet_id`"},{"line_number":158,"context_line":"is declared, similarly like it is done in SQL model. In order to support foreign"},{"line_number":159,"context_line":"keys for many related object, you should declare the name of the related object"},{"line_number":160,"context_line":"(:code:`Subnet` i.e.) as key and as value declare which field from local object"},{"line_number":161,"context_line":"(:code:`subnet_id` i.e.) is referring to which field in related object (:code:`id`"}],"source_content_type":"text/x-rst","patch_set":10,"id":"7a77a97e_93e7a53f","line":158,"range":{"start_line":158,"start_character":13,"end_line":158,"end_character":51},"updated":"2016-11-22 18:52:19.000000000","message":"\u0027just like it is done in the SQL model\u0027 or \u0027the same way it is done in the SQL model\u0027","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"da2afa0678a7d214e8e94917f7e2ea4db40aa717","unresolved":false,"context_lines":[{"line_number":155,"context_line":"The :code:`foreign_keys` is used in :code:`SubnetOVO` to fetch the"},{"line_number":156,"context_line":":code:`allocation_pools` [#]_ using the :code:`IPAllocationPoolOVO` class."},{"line_number":157,"context_line":"Note that the foreign_keys are declared in related object, where :code:`subnet_id`"},{"line_number":158,"context_line":"is declared, similarly like it is done in SQL model. In order to support foreign"},{"line_number":159,"context_line":"keys for many related object, you should declare the name of the related object"},{"line_number":160,"context_line":"(:code:`Subnet` i.e.) as key and as value declare which field from local object"},{"line_number":161,"context_line":"(:code:`subnet_id` i.e.) is referring to which field in related object (:code:`id`"}],"source_content_type":"text/x-rst","patch_set":10,"id":"5a74a57a_a2085c29","line":158,"range":{"start_line":158,"start_character":13,"end_line":158,"end_character":51},"in_reply_to":"7a77a97e_93e7a53f","updated":"2016-11-29 13:10:45.000000000","message":"Done","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"a901c4350e388a23a2c583407be6c67052f949ac","unresolved":false,"context_lines":[{"line_number":156,"context_line":":code:`allocation_pools` [#]_ using the :code:`IPAllocationPoolOVO` class."},{"line_number":157,"context_line":"Note that the foreign_keys are declared in related object, where :code:`subnet_id`"},{"line_number":158,"context_line":"is declared, similarly like it is done in SQL model. In order to support foreign"},{"line_number":159,"context_line":"keys for many related object, you should declare the name of the related object"},{"line_number":160,"context_line":"(:code:`Subnet` i.e.) as key and as value declare which field from local object"},{"line_number":161,"context_line":"(:code:`subnet_id` i.e.) is referring to which field in related object (:code:`id`"},{"line_number":162,"context_line":"i.e.). Note that the multiple primary keys related to one parent object is not"}],"source_content_type":"text/x-rst","patch_set":10,"id":"7a77a97e_f360d9a6","line":159,"range":{"start_line":159,"start_character":22,"end_line":159,"end_character":28},"updated":"2016-11-22 18:52:19.000000000","message":"objects","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"a901c4350e388a23a2c583407be6c67052f949ac","unresolved":false,"context_lines":[{"line_number":156,"context_line":":code:`allocation_pools` [#]_ using the :code:`IPAllocationPoolOVO` class."},{"line_number":157,"context_line":"Note that the foreign_keys are declared in related object, where :code:`subnet_id`"},{"line_number":158,"context_line":"is declared, similarly like it is done in SQL model. In order to support foreign"},{"line_number":159,"context_line":"keys for many related object, you should declare the name of the related object"},{"line_number":160,"context_line":"(:code:`Subnet` i.e.) as key and as value declare which field from local object"},{"line_number":161,"context_line":"(:code:`subnet_id` i.e.) is referring to which field in related object (:code:`id`"},{"line_number":162,"context_line":"i.e.). Note that the multiple primary keys related to one parent object is not"}],"source_content_type":"text/x-rst","patch_set":10,"id":"7a77a97e_f3d5391b","line":159,"range":{"start_line":159,"start_character":73,"end_line":159,"end_character":79},"updated":"2016-11-22 18:52:19.000000000","message":"objects","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"da2afa0678a7d214e8e94917f7e2ea4db40aa717","unresolved":false,"context_lines":[{"line_number":156,"context_line":":code:`allocation_pools` [#]_ using the :code:`IPAllocationPoolOVO` class."},{"line_number":157,"context_line":"Note that the foreign_keys are declared in related object, where :code:`subnet_id`"},{"line_number":158,"context_line":"is declared, similarly like it is done in SQL model. In order to support foreign"},{"line_number":159,"context_line":"keys for many related object, you should declare the name of the related object"},{"line_number":160,"context_line":"(:code:`Subnet` i.e.) as key and as value declare which field from local object"},{"line_number":161,"context_line":"(:code:`subnet_id` i.e.) is referring to which field in related object (:code:`id`"},{"line_number":162,"context_line":"i.e.). Note that the multiple primary keys related to one parent object is not"}],"source_content_type":"text/x-rst","patch_set":10,"id":"5a74a57a_3d3bd89d","line":159,"range":{"start_line":159,"start_character":22,"end_line":159,"end_character":28},"in_reply_to":"7a77a97e_f360d9a6","updated":"2016-11-29 13:10:45.000000000","message":"Done","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"da2afa0678a7d214e8e94917f7e2ea4db40aa717","unresolved":false,"context_lines":[{"line_number":156,"context_line":":code:`allocation_pools` [#]_ using the :code:`IPAllocationPoolOVO` class."},{"line_number":157,"context_line":"Note that the foreign_keys are declared in related object, where :code:`subnet_id`"},{"line_number":158,"context_line":"is declared, similarly like it is done in SQL model. In order to support foreign"},{"line_number":159,"context_line":"keys for many related object, you should declare the name of the related object"},{"line_number":160,"context_line":"(:code:`Subnet` i.e.) as key and as value declare which field from local object"},{"line_number":161,"context_line":"(:code:`subnet_id` i.e.) is referring to which field in related object (:code:`id`"},{"line_number":162,"context_line":"i.e.). Note that the multiple primary keys related to one parent object is not"}],"source_content_type":"text/x-rst","patch_set":10,"id":"5a74a57a_fdede0ef","line":159,"range":{"start_line":159,"start_character":73,"end_line":159,"end_character":79},"in_reply_to":"7a77a97e_f3d5391b","updated":"2016-11-29 13:10:45.000000000","message":"For me, singular should stay. \u0027declare the name of related object\u0027","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"69256092ecfc47f93c54f07bad91a823f9ef6d26","unresolved":false,"context_lines":[{"line_number":159,"context_line":"keys for many related object, you should declare the name of the related object"},{"line_number":160,"context_line":"(:code:`Subnet` i.e.) as key and as value declare which field from local object"},{"line_number":161,"context_line":"(:code:`subnet_id` i.e.) is referring to which field in related object (:code:`id`"},{"line_number":162,"context_line":"i.e.). Note that the multiple primary keys related to one parent object is not"},{"line_number":163,"context_line":"permitted"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"It is important to remember about nullable parameter. In SQLAlchemy model,"}],"source_content_type":"text/x-rst","patch_set":10,"id":"7a8ec9b2_c49e12b8","line":162,"range":{"start_line":162,"start_character":72,"end_line":162,"end_character":74},"updated":"2016-09-19 15:57:00.000000000","message":"are","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"da2afa0678a7d214e8e94917f7e2ea4db40aa717","unresolved":false,"context_lines":[{"line_number":159,"context_line":"keys for many related object, you should declare the name of the related object"},{"line_number":160,"context_line":"(:code:`Subnet` i.e.) as key and as value declare which field from local object"},{"line_number":161,"context_line":"(:code:`subnet_id` i.e.) is referring to which field in related object (:code:`id`"},{"line_number":162,"context_line":"i.e.). Note that the multiple primary keys related to one parent object is not"},{"line_number":163,"context_line":"permitted"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"It is important to remember about nullable parameter. In SQLAlchemy model,"}],"source_content_type":"text/x-rst","patch_set":10,"id":"5a74a57a_dd63c4da","line":162,"range":{"start_line":162,"start_character":72,"end_line":162,"end_character":74},"in_reply_to":"7a8ec9b2_c49e12b8","updated":"2016-11-29 13:10:45.000000000","message":"Done","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"69256092ecfc47f93c54f07bad91a823f9ef6d26","unresolved":false,"context_lines":[{"line_number":160,"context_line":"(:code:`Subnet` i.e.) as key and as value declare which field from local object"},{"line_number":161,"context_line":"(:code:`subnet_id` i.e.) is referring to which field in related object (:code:`id`"},{"line_number":162,"context_line":"i.e.). Note that the multiple primary keys related to one parent object is not"},{"line_number":163,"context_line":"permitted"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"It is important to remember about nullable parameter. In SQLAlchemy model,"},{"line_number":166,"context_line":"the nullable parameter is by default True, while in oslo fields nullable is set"}],"source_content_type":"text/x-rst","patch_set":10,"id":"7a8ec9b2_44abe2d6","line":163,"updated":"2016-09-19 15:57:00.000000000","message":"missing period.","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"da2afa0678a7d214e8e94917f7e2ea4db40aa717","unresolved":false,"context_lines":[{"line_number":160,"context_line":"(:code:`Subnet` i.e.) as key and as value declare which field from local object"},{"line_number":161,"context_line":"(:code:`subnet_id` i.e.) is referring to which field in related object (:code:`id`"},{"line_number":162,"context_line":"i.e.). Note that the multiple primary keys related to one parent object is not"},{"line_number":163,"context_line":"permitted"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"It is important to remember about nullable parameter. In SQLAlchemy model,"},{"line_number":166,"context_line":"the nullable parameter is by default True, while in oslo fields nullable is set"}],"source_content_type":"text/x-rst","patch_set":10,"id":"5a74a57a_1d9c5cbf","line":163,"in_reply_to":"7a8ec9b2_44abe2d6","updated":"2016-11-29 13:10:45.000000000","message":"Done","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"81cd4e567bce98b3a14f29a7b1545c0f88c80542","unresolved":false,"context_lines":[{"line_number":169,"context_line":""},{"line_number":170,"context_line":"Example"},{"line_number":171,"context_line":"~~~~~~~"},{"line_number":172,"context_line":"Let\u0027s take a look at simple example."},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"We are starting from database model:"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":".. code-block:: Python"},{"line_number":177,"context_line":""}],"source_content_type":"text/x-rst","patch_set":10,"id":"fa6399be_2fb56f30","line":174,"range":{"start_line":172,"start_character":0,"end_line":174,"end_character":36},"updated":"2016-10-19 18:01:09.000000000","message":"This is an example for the creation of the Subnet OVO class.","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"da2afa0678a7d214e8e94917f7e2ea4db40aa717","unresolved":false,"context_lines":[{"line_number":169,"context_line":""},{"line_number":170,"context_line":"Example"},{"line_number":171,"context_line":"~~~~~~~"},{"line_number":172,"context_line":"Let\u0027s take a look at simple example."},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"We are starting from database model:"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":".. code-block:: Python"},{"line_number":177,"context_line":""}],"source_content_type":"text/x-rst","patch_set":10,"id":"5a74a57a_3d93d850","line":174,"range":{"start_line":172,"start_character":0,"end_line":174,"end_character":36},"in_reply_to":"fa6399be_2fb56f30","updated":"2016-11-29 13:10:45.000000000","message":"Done","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"a901c4350e388a23a2c583407be6c67052f949ac","unresolved":false,"context_lines":[{"line_number":223,"context_line":"            \u0027name\u0027: \u0027subnet_name\u0027"},{"line_number":224,"context_line":"        }"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"For DNS, we have multiple primary keys, foreign key referencing Subnet entity and"},{"line_number":227,"context_line":"third field, which can be nullable. To create oslo versionedobject, we should"},{"line_number":228,"context_line":"define:"},{"line_number":229,"context_line":""}],"source_content_type":"text/x-rst","patch_set":10,"id":"7a77a97e_d6782bfb","line":226,"range":{"start_line":226,"start_character":17,"end_line":226,"end_character":38},"updated":"2016-11-22 18:52:19.000000000","message":"multiple fields in the primary key","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"da2afa0678a7d214e8e94917f7e2ea4db40aa717","unresolved":false,"context_lines":[{"line_number":223,"context_line":"            \u0027name\u0027: \u0027subnet_name\u0027"},{"line_number":224,"context_line":"        }"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"For DNS, we have multiple primary keys, foreign key referencing Subnet entity and"},{"line_number":227,"context_line":"third field, which can be nullable. To create oslo versionedobject, we should"},{"line_number":228,"context_line":"define:"},{"line_number":229,"context_line":""}],"source_content_type":"text/x-rst","patch_set":10,"id":"5a74a57a_7deb90b0","line":226,"range":{"start_line":226,"start_character":17,"end_line":226,"end_character":38},"in_reply_to":"7a77a97e_d6782bfb","updated":"2016-11-29 13:10:45.000000000","message":"Done","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"81cd4e567bce98b3a14f29a7b1545c0f88c80542","unresolved":false,"context_lines":[{"line_number":256,"context_line":""},{"line_number":257,"context_line":"Synthetic fields"},{"line_number":258,"context_line":"----------------"},{"line_number":259,"context_line":"Specific for neutron usage, concept of synthetic fields was introduced. Those"},{"line_number":260,"context_line":"fields are list of fields, that are not directly defined in data model,"},{"line_number":261,"context_line":"but should be filled from other database entities or compute at runtime."},{"line_number":262,"context_line":"The synthetic fields can be of different type, it can be build-in types (bool,"}],"source_content_type":"text/x-rst","patch_set":10,"id":"fa6399be_afcdffb8","line":259,"range":{"start_line":259,"start_character":0,"end_line":259,"end_character":70},"updated":"2016-10-19 18:01:09.000000000","message":"NOTE: This concept was introduced to neutron for a specific usage.","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"da2afa0678a7d214e8e94917f7e2ea4db40aa717","unresolved":false,"context_lines":[{"line_number":256,"context_line":""},{"line_number":257,"context_line":"Synthetic fields"},{"line_number":258,"context_line":"----------------"},{"line_number":259,"context_line":"Specific for neutron usage, concept of synthetic fields was introduced. Those"},{"line_number":260,"context_line":"fields are list of fields, that are not directly defined in data model,"},{"line_number":261,"context_line":"but should be filled from other database entities or compute at runtime."},{"line_number":262,"context_line":"The synthetic fields can be of different type, it can be build-in types (bool,"}],"source_content_type":"text/x-rst","patch_set":10,"id":"5a74a57a_bd3b6837","line":259,"range":{"start_line":259,"start_character":0,"end_line":259,"end_character":70},"in_reply_to":"fa6399be_afcdffb8","updated":"2016-11-29 13:10:45.000000000","message":"Done","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"a901c4350e388a23a2c583407be6c67052f949ac","unresolved":false,"context_lines":[{"line_number":258,"context_line":"----------------"},{"line_number":259,"context_line":"Specific for neutron usage, concept of synthetic fields was introduced. Those"},{"line_number":260,"context_line":"fields are list of fields, that are not directly defined in data model,"},{"line_number":261,"context_line":"but should be filled from other database entities or compute at runtime."},{"line_number":262,"context_line":"The synthetic fields can be of different type, it can be build-in types (bool,"},{"line_number":263,"context_line":"int) as well as object type. For example::"},{"line_number":264,"context_line":""}],"source_content_type":"text/x-rst","patch_set":10,"id":"7a77a97e_f64c479f","line":261,"range":{"start_line":261,"start_character":53,"end_line":261,"end_character":60},"updated":"2016-11-22 18:52:19.000000000","message":"computed","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"da2afa0678a7d214e8e94917f7e2ea4db40aa717","unresolved":false,"context_lines":[{"line_number":258,"context_line":"----------------"},{"line_number":259,"context_line":"Specific for neutron usage, concept of synthetic fields was introduced. Those"},{"line_number":260,"context_line":"fields are list of fields, that are not directly defined in data model,"},{"line_number":261,"context_line":"but should be filled from other database entities or compute at runtime."},{"line_number":262,"context_line":"The synthetic fields can be of different type, it can be build-in types (bool,"},{"line_number":263,"context_line":"int) as well as object type. For example::"},{"line_number":264,"context_line":""}],"source_content_type":"text/x-rst","patch_set":10,"id":"5a74a57a_1d137cb9","line":261,"range":{"start_line":261,"start_character":53,"end_line":261,"end_character":60},"in_reply_to":"7a77a97e_f64c479f","updated":"2016-11-29 13:10:45.000000000","message":"Done","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"a901c4350e388a23a2c583407be6c67052f949ac","unresolved":false,"context_lines":[{"line_number":259,"context_line":"Specific for neutron usage, concept of synthetic fields was introduced. Those"},{"line_number":260,"context_line":"fields are list of fields, that are not directly defined in data model,"},{"line_number":261,"context_line":"but should be filled from other database entities or compute at runtime."},{"line_number":262,"context_line":"The synthetic fields can be of different type, it can be build-in types (bool,"},{"line_number":263,"context_line":"int) as well as object type. For example::"},{"line_number":264,"context_line":""},{"line_number":265,"context_line":"    fields \u003d {"},{"line_number":266,"context_line":"        \u0027dhcp_agents\u0027: obj_fields.ObjectField(\u0027NetworkDhcpAgentBinding\u0027,"}],"source_content_type":"text/x-rst","patch_set":10,"id":"7a77a97e_09a52403","line":263,"range":{"start_line":262,"start_character":0,"end_line":263,"end_character":27},"updated":"2016-11-22 18:52:19.000000000","message":"The built in types (bool, int, etc.) as well as the object type are valid for synthetic fields.","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"da2afa0678a7d214e8e94917f7e2ea4db40aa717","unresolved":false,"context_lines":[{"line_number":259,"context_line":"Specific for neutron usage, concept of synthetic fields was introduced. Those"},{"line_number":260,"context_line":"fields are list of fields, that are not directly defined in data model,"},{"line_number":261,"context_line":"but should be filled from other database entities or compute at runtime."},{"line_number":262,"context_line":"The synthetic fields can be of different type, it can be build-in types (bool,"},{"line_number":263,"context_line":"int) as well as object type. For example::"},{"line_number":264,"context_line":""},{"line_number":265,"context_line":"    fields \u003d {"},{"line_number":266,"context_line":"        \u0027dhcp_agents\u0027: obj_fields.ObjectField(\u0027NetworkDhcpAgentBinding\u0027,"}],"source_content_type":"text/x-rst","patch_set":10,"id":"5a74a57a_3d64b847","line":263,"range":{"start_line":262,"start_character":0,"end_line":263,"end_character":27},"in_reply_to":"7a77a97e_09a52403","updated":"2016-11-29 13:10:45.000000000","message":"Done","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"a901c4350e388a23a2c583407be6c67052f949ac","unresolved":false,"context_lines":[{"line_number":276,"context_line":""},{"line_number":277,"context_line":"For example, ORM relationships can be modeled by synthetic fields."},{"line_number":278,"context_line":"Synthetic fields can have other OVO class defined for access."},{"line_number":279,"context_line":"In base class, :code:`load_synthetic_db_fields` method is searching for OVO"},{"line_number":280,"context_line":"classes to load required data."},{"line_number":281,"context_line":""},{"line_number":282,"context_line":""}],"source_content_type":"text/x-rst","patch_set":10,"id":"7a77a97e_891a1416","line":279,"range":{"start_line":279,"start_character":55,"end_line":279,"end_character":67},"updated":"2016-11-22 18:52:19.000000000","message":"searches","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"da2afa0678a7d214e8e94917f7e2ea4db40aa717","unresolved":false,"context_lines":[{"line_number":276,"context_line":""},{"line_number":277,"context_line":"For example, ORM relationships can be modeled by synthetic fields."},{"line_number":278,"context_line":"Synthetic fields can have other OVO class defined for access."},{"line_number":279,"context_line":"In base class, :code:`load_synthetic_db_fields` method is searching for OVO"},{"line_number":280,"context_line":"classes to load required data."},{"line_number":281,"context_line":""},{"line_number":282,"context_line":""}],"source_content_type":"text/x-rst","patch_set":10,"id":"5a74a57a_9d55cc51","line":279,"range":{"start_line":279,"start_character":55,"end_line":279,"end_character":67},"in_reply_to":"7a77a97e_891a1416","updated":"2016-11-29 13:10:45.000000000","message":"Done","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"69256092ecfc47f93c54f07bad91a823f9ef6d26","unresolved":false,"context_lines":[{"line_number":321,"context_line":""},{"line_number":322,"context_line":"        def _load_shared(self, db_obj\u003dNone):"},{"line_number":323,"context_line":"            # do the loading here"},{"line_number":324,"context_line":"            shared \u003d True/False"},{"line_number":325,"context_line":"            # it is important to set the attribute and call obj_reset_changes"},{"line_number":326,"context_line":"            setattr(self, \u0027shared\u0027, shared)"},{"line_number":327,"context_line":"            self.obj_reset_changes([\u0027shared\u0027])"}],"source_content_type":"text/x-rst","patch_set":10,"id":"7a8ec9b2_4f713277","line":324,"range":{"start_line":324,"start_character":12,"end_line":324,"end_character":31},"updated":"2016-09-19 15:57:00.000000000","message":"Please write correct code here.","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"da2afa0678a7d214e8e94917f7e2ea4db40aa717","unresolved":false,"context_lines":[{"line_number":321,"context_line":""},{"line_number":322,"context_line":"        def _load_shared(self, db_obj\u003dNone):"},{"line_number":323,"context_line":"            # do the loading here"},{"line_number":324,"context_line":"            shared \u003d True/False"},{"line_number":325,"context_line":"            # it is important to set the attribute and call obj_reset_changes"},{"line_number":326,"context_line":"            setattr(self, \u0027shared\u0027, shared)"},{"line_number":327,"context_line":"            self.obj_reset_changes([\u0027shared\u0027])"}],"source_content_type":"text/x-rst","patch_set":10,"id":"5a74a57a_65ae9699","line":324,"range":{"start_line":324,"start_character":12,"end_line":324,"end_character":31},"in_reply_to":"7a8ec9b2_4f713277","updated":"2016-11-29 13:10:45.000000000","message":"Done","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"69256092ecfc47f93c54f07bad91a823f9ef6d26","unresolved":false,"context_lines":[{"line_number":322,"context_line":"        def _load_shared(self, db_obj\u003dNone):"},{"line_number":323,"context_line":"            # do the loading here"},{"line_number":324,"context_line":"            shared \u003d True/False"},{"line_number":325,"context_line":"            # it is important to set the attribute and call obj_reset_changes"},{"line_number":326,"context_line":"            setattr(self, \u0027shared\u0027, shared)"},{"line_number":327,"context_line":"            self.obj_reset_changes([\u0027shared\u0027])"},{"line_number":328,"context_line":""}],"source_content_type":"text/x-rst","patch_set":10,"id":"7a8ec9b2_0a81d8fb","line":325,"range":{"start_line":325,"start_character":12,"end_line":325,"end_character":77},"updated":"2016-09-19 15:57:00.000000000","message":"Why it is done? Especially obj_reset_changes part?\nThis \u0027shared\u0027 field is changed. Why this needs to be reset? Could you add extra info about this?\n\nIf I see it correctly, Subnet is special case. Does it mean, all the time, when \u0027shared\u0027 field is modified, obj_reset_changes should be called? Or does it mean, if any kind of field is modified?","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"da2afa0678a7d214e8e94917f7e2ea4db40aa717","unresolved":false,"context_lines":[{"line_number":322,"context_line":"        def _load_shared(self, db_obj\u003dNone):"},{"line_number":323,"context_line":"            # do the loading here"},{"line_number":324,"context_line":"            shared \u003d True/False"},{"line_number":325,"context_line":"            # it is important to set the attribute and call obj_reset_changes"},{"line_number":326,"context_line":"            setattr(self, \u0027shared\u0027, shared)"},{"line_number":327,"context_line":"            self.obj_reset_changes([\u0027shared\u0027])"},{"line_number":328,"context_line":""}],"source_content_type":"text/x-rst","patch_set":10,"id":"5a74a57a_c0a56147","line":325,"range":{"start_line":325,"start_character":12,"end_line":325,"end_character":77},"in_reply_to":"5a8bc5a2_cfce005a","updated":"2016-11-29 13:10:45.000000000","message":"Added my explanation in the devref text.","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"b13ca84674215df5e9f867bc9b13c5d7e8806540","unresolved":false,"context_lines":[{"line_number":322,"context_line":"        def _load_shared(self, db_obj\u003dNone):"},{"line_number":323,"context_line":"            # do the loading here"},{"line_number":324,"context_line":"            shared \u003d True/False"},{"line_number":325,"context_line":"            # it is important to set the attribute and call obj_reset_changes"},{"line_number":326,"context_line":"            setattr(self, \u0027shared\u0027, shared)"},{"line_number":327,"context_line":"            self.obj_reset_changes([\u0027shared\u0027])"},{"line_number":328,"context_line":""}],"source_content_type":"text/x-rst","patch_set":10,"id":"7a8ec9b2_8371e7aa","line":325,"range":{"start_line":325,"start_character":12,"end_line":325,"end_character":77},"in_reply_to":"7a8ec9b2_0a81d8fb","updated":"2016-09-21 09:16:52.000000000","message":"First of all, \u0027shared\u0027 field was used as an example, it can be named differently. Secondly, for all classes that implements the RBAC entries directly (Network and QoS Policy currently), the \u0027shared\u0027 attribute is handled in neutron/objects/rbac_db.py. \n\nAbout obj_reset_changes, it belongs to oslo versionedobjects lib. The nature of OVO is when you set some field, OVO is tacking its changes. When calling save/create or update, OVO is scanning for changed fields and save them in DB. When you set some field (regular or synthetic one), and you know that you do not need to set this field in DB, you are calling obj_reset_changes to tell OVO lib, that this field do not need to be saved in DB. I guess that is how I understand OVO lib.","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"634e69981f6000c9e014f17ef6c0cd133bff3fcc","unresolved":false,"context_lines":[{"line_number":322,"context_line":"        def _load_shared(self, db_obj\u003dNone):"},{"line_number":323,"context_line":"            # do the loading here"},{"line_number":324,"context_line":"            shared \u003d True/False"},{"line_number":325,"context_line":"            # it is important to set the attribute and call obj_reset_changes"},{"line_number":326,"context_line":"            setattr(self, \u0027shared\u0027, shared)"},{"line_number":327,"context_line":"            self.obj_reset_changes([\u0027shared\u0027])"},{"line_number":328,"context_line":""}],"source_content_type":"text/x-rst","patch_set":10,"id":"5a8bc5a2_cfce005a","line":325,"range":{"start_line":325,"start_character":12,"end_line":325,"end_character":77},"in_reply_to":"7a8ec9b2_8371e7aa","updated":"2016-09-22 18:45:19.000000000","message":"ACK, thanks for this explanation.\nDo you think, it would be worth to add this also to this doc, or just leave it in OVO?","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"b13ca84674215df5e9f867bc9b13c5d7e8806540","unresolved":false,"context_lines":[{"line_number":328,"context_line":""},{"line_number":329,"context_line":"        # this is defined in NeutronDbObject and is invoked during get_object(s)"},{"line_number":330,"context_line":"        # and create/update."},{"line_number":331,"context_line":"        def from_db_object(self, *objs):"},{"line_number":332,"context_line":"            super(Subnet, self).from_db_object(*objs)"},{"line_number":333,"context_line":"            for obj in objs:"},{"line_number":334,"context_line":"                self._load_shared(obj)"},{"line_number":335,"context_line":""},{"line_number":336,"context_line":"Usage of objects"},{"line_number":337,"context_line":"----------------"}],"source_content_type":"text/x-rst","patch_set":10,"id":"7a8ec9b2_e5c8f376","line":334,"range":{"start_line":331,"start_character":7,"end_line":334,"end_character":38},"updated":"2016-09-21 09:16:52.000000000","message":"I need to change this snippet, since it is not only one obj passed into from_db_object.","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"da2afa0678a7d214e8e94917f7e2ea4db40aa717","unresolved":false,"context_lines":[{"line_number":328,"context_line":""},{"line_number":329,"context_line":"        # this is defined in NeutronDbObject and is invoked during get_object(s)"},{"line_number":330,"context_line":"        # and create/update."},{"line_number":331,"context_line":"        def from_db_object(self, *objs):"},{"line_number":332,"context_line":"            super(Subnet, self).from_db_object(*objs)"},{"line_number":333,"context_line":"            for obj in objs:"},{"line_number":334,"context_line":"                self._load_shared(obj)"},{"line_number":335,"context_line":""},{"line_number":336,"context_line":"Usage of objects"},{"line_number":337,"context_line":"----------------"}],"source_content_type":"text/x-rst","patch_set":10,"id":"5a74a57a_c5320af2","line":334,"range":{"start_line":331,"start_character":7,"end_line":334,"end_character":38},"in_reply_to":"7a8ec9b2_e5c8f376","updated":"2016-11-29 13:10:45.000000000","message":"Done","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"69256092ecfc47f93c54f07bad91a823f9ef6d26","unresolved":false,"context_lines":[{"line_number":342,"context_line":""},{"line_number":343,"context_line":".. code-block:: Python"},{"line_number":344,"context_line":""},{"line_number":345,"context_line":"    # to create and object, you can pass the attributes in constructor:"},{"line_number":346,"context_line":"    dns \u003d subnet.DNSNameServer(context, address\u003d\u0027asd\u0027, subnet_id\u003d\u0027xxx\u0027, order\u003d1)"},{"line_number":347,"context_line":"    dns.create()"},{"line_number":348,"context_line":""}],"source_content_type":"text/x-rst","patch_set":10,"id":"7a8ec9b2_ea92ec4a","line":345,"range":{"start_line":345,"start_character":16,"end_line":345,"end_character":19},"updated":"2016-09-19 15:57:00.000000000","message":"typo: an","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"da2afa0678a7d214e8e94917f7e2ea4db40aa717","unresolved":false,"context_lines":[{"line_number":342,"context_line":""},{"line_number":343,"context_line":".. code-block:: Python"},{"line_number":344,"context_line":""},{"line_number":345,"context_line":"    # to create and object, you can pass the attributes in constructor:"},{"line_number":346,"context_line":"    dns \u003d subnet.DNSNameServer(context, address\u003d\u0027asd\u0027, subnet_id\u003d\u0027xxx\u0027, order\u003d1)"},{"line_number":347,"context_line":"    dns.create()"},{"line_number":348,"context_line":""}],"source_content_type":"text/x-rst","patch_set":10,"id":"5a74a57a_8541f2ab","line":345,"range":{"start_line":345,"start_character":16,"end_line":345,"end_character":19},"in_reply_to":"7a8ec9b2_ea92ec4a","updated":"2016-11-29 13:10:45.000000000","message":"Done","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":19591,"name":"Saisrikiran Mudigonda","email":"saisrikiran.mudigonda@intel.com","username":"saisrikiran"},"change_message_id":"1b3ca0d4971cfd2da44ca56b930575580d103221","unresolved":false,"context_lines":[{"line_number":348,"context_line":""},{"line_number":349,"context_line":"    # or you can create a dict and pass it as kwargs:"},{"line_number":350,"context_line":"    dns_data \u003d {\u0027address\u0027: \u0027asd\u0027, \u0027subnet_id\u0027: \u0027xxx\u0027, \u0027order\u0027: 1}"},{"line_number":351,"context_line":"    dns \u003d subnet.DNSNameServer(context, **dsn_data)"},{"line_number":352,"context_line":"    dns.create()"},{"line_number":353,"context_line":""},{"line_number":354,"context_line":"    # to fetch the object:"}],"source_content_type":"text/x-rst","patch_set":10,"id":"7a77a97e_5696db94","line":351,"range":{"start_line":351,"start_character":40,"end_line":351,"end_character":51},"updated":"2016-11-22 18:10:05.000000000","message":"s/**dsn_data/**dns_data","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"da2afa0678a7d214e8e94917f7e2ea4db40aa717","unresolved":false,"context_lines":[{"line_number":348,"context_line":""},{"line_number":349,"context_line":"    # or you can create a dict and pass it as kwargs:"},{"line_number":350,"context_line":"    dns_data \u003d {\u0027address\u0027: \u0027asd\u0027, \u0027subnet_id\u0027: \u0027xxx\u0027, \u0027order\u0027: 1}"},{"line_number":351,"context_line":"    dns \u003d subnet.DNSNameServer(context, **dsn_data)"},{"line_number":352,"context_line":"    dns.create()"},{"line_number":353,"context_line":""},{"line_number":354,"context_line":"    # to fetch the object:"}],"source_content_type":"text/x-rst","patch_set":10,"id":"5a74a57a_e54466b8","line":351,"range":{"start_line":351,"start_character":40,"end_line":351,"end_character":51},"in_reply_to":"7a77a97e_5696db94","updated":"2016-11-29 13:10:45.000000000","message":"Done","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"81cd4e567bce98b3a14f29a7b1545c0f88c80542","unresolved":false,"context_lines":[{"line_number":370,"context_line":""},{"line_number":371,"context_line":"Sorting and filtering"},{"line_number":372,"context_line":"~~~~~~~~~~~~~~~~~~~~~"},{"line_number":373,"context_line":"You can register extra filter names using :code:`register_filter_hook_on_model`."},{"line_number":374,"context_line":""},{"line_number":375,"context_line":".. code-block:: Python"},{"line_number":376,"context_line":""}],"source_content_type":"text/x-rst","patch_set":10,"id":"fa6399be_0fa0ab9e","line":373,"updated":"2016-10-19 18:01:09.000000000","message":"Could you consider to add something that refers to the possibility to make optional the validation of filters?","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":19591,"name":"Saisrikiran Mudigonda","email":"saisrikiran.mudigonda@intel.com","username":"saisrikiran"},"change_message_id":"1b3ca0d4971cfd2da44ca56b930575580d103221","unresolved":false,"context_lines":[{"line_number":370,"context_line":""},{"line_number":371,"context_line":"Sorting and filtering"},{"line_number":372,"context_line":"~~~~~~~~~~~~~~~~~~~~~"},{"line_number":373,"context_line":"You can register extra filter names using :code:`register_filter_hook_on_model`."},{"line_number":374,"context_line":""},{"line_number":375,"context_line":".. code-block:: Python"},{"line_number":376,"context_line":""}],"source_content_type":"text/x-rst","patch_set":10,"id":"7a77a97e_7690374f","line":373,"range":{"start_line":373,"start_character":42,"end_line":373,"end_character":79},"updated":"2016-11-22 18:10:05.000000000","message":"Is there any difference between `register_filter_hook_on_model` and `register_model_query_hook` which is a TODO? Are they both optional? What are the other impacts?","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"da2afa0678a7d214e8e94917f7e2ea4db40aa717","unresolved":false,"context_lines":[{"line_number":370,"context_line":""},{"line_number":371,"context_line":"Sorting and filtering"},{"line_number":372,"context_line":"~~~~~~~~~~~~~~~~~~~~~"},{"line_number":373,"context_line":"You can register extra filter names using :code:`register_filter_hook_on_model`."},{"line_number":374,"context_line":""},{"line_number":375,"context_line":".. code-block:: Python"},{"line_number":376,"context_line":""}],"source_content_type":"text/x-rst","patch_set":10,"id":"5a74a57a_e04b3d85","line":373,"range":{"start_line":373,"start_character":42,"end_line":373,"end_character":79},"in_reply_to":"7a77a97e_7690374f","updated":"2016-11-29 13:10:45.000000000","message":"Explanation added to devref text.","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"da2afa0678a7d214e8e94917f7e2ea4db40aa717","unresolved":false,"context_lines":[{"line_number":370,"context_line":""},{"line_number":371,"context_line":"Sorting and filtering"},{"line_number":372,"context_line":"~~~~~~~~~~~~~~~~~~~~~"},{"line_number":373,"context_line":"You can register extra filter names using :code:`register_filter_hook_on_model`."},{"line_number":374,"context_line":""},{"line_number":375,"context_line":".. code-block:: Python"},{"line_number":376,"context_line":""}],"source_content_type":"text/x-rst","patch_set":10,"id":"5a74a57a_807609d5","line":373,"in_reply_to":"fa6399be_0fa0ab9e","updated":"2016-11-29 13:10:45.000000000","message":"Done","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":19591,"name":"Saisrikiran Mudigonda","email":"saisrikiran.mudigonda@intel.com","username":"saisrikiran"},"change_message_id":"1b3ca0d4971cfd2da44ca56b930575580d103221","unresolved":false,"context_lines":[{"line_number":385,"context_line":"    pager \u003d obj_base.Pager(sorts\u003d[(\u0027order\u0027, False)])"},{"line_number":386,"context_line":"    dnses \u003d DNSNameServer.get_objects(context, _pager\u003dpager, subnet_id\u003d\u0027xxx\u0027)"},{"line_number":387,"context_line":""},{"line_number":388,"context_line":"    # register extra filter name"},{"line_number":389,"context_line":"    base_obj.register_filter_hook_on_model(models_v2.DNSNameServer, CHANGED_SINCE)"},{"line_number":390,"context_line":"    # You have to pass the database model, and it will register the filter name"},{"line_number":391,"context_line":"    # in OVO object class"},{"line_number":392,"context_line":""},{"line_number":393,"context_line":""},{"line_number":394,"context_line":"Standard attributes"}],"source_content_type":"text/x-rst","patch_set":10,"id":"7a77a97e_964eb3bf","line":391,"range":{"start_line":388,"start_character":4,"end_line":391,"end_character":25},"updated":"2016-11-22 18:10:05.000000000","message":"Do you need to call obj_reset_changes for extra filters?","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"da2afa0678a7d214e8e94917f7e2ea4db40aa717","unresolved":false,"context_lines":[{"line_number":385,"context_line":"    pager \u003d obj_base.Pager(sorts\u003d[(\u0027order\u0027, False)])"},{"line_number":386,"context_line":"    dnses \u003d DNSNameServer.get_objects(context, _pager\u003dpager, subnet_id\u003d\u0027xxx\u0027)"},{"line_number":387,"context_line":""},{"line_number":388,"context_line":"    # register extra filter name"},{"line_number":389,"context_line":"    base_obj.register_filter_hook_on_model(models_v2.DNSNameServer, CHANGED_SINCE)"},{"line_number":390,"context_line":"    # You have to pass the database model, and it will register the filter name"},{"line_number":391,"context_line":"    # in OVO object class"},{"line_number":392,"context_line":""},{"line_number":393,"context_line":""},{"line_number":394,"context_line":"Standard attributes"}],"source_content_type":"text/x-rst","patch_set":10,"id":"5a74a57a_c7464a7a","line":391,"range":{"start_line":388,"start_character":4,"end_line":391,"end_character":25},"in_reply_to":"7a77a97e_964eb3bf","updated":"2016-11-29 13:10:45.000000000","message":"No.","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"60500f9ed9f09ab29bf245508f823c25e530e8b4","unresolved":false,"context_lines":[{"line_number":391,"context_line":"    # in OVO object class"},{"line_number":392,"context_line":""},{"line_number":393,"context_line":""},{"line_number":394,"context_line":"Standard attributes"},{"line_number":395,"context_line":"-------------------"},{"line_number":396,"context_line":"The standard attributes are added automatically in metaclass"},{"line_number":397,"context_line":"DeclarativeObject. If adding standard attribute, it has to be added in"}],"source_content_type":"text/x-rst","patch_set":10,"id":"1a95cdbc_b076c203","line":394,"range":{"start_line":394,"start_character":0,"end_line":394,"end_character":19},"updated":"2016-10-10 12:04:36.000000000","message":"Maybe I would need to add more description how standard attributes work in Neutron DB access code.","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"a901c4350e388a23a2c583407be6c67052f949ac","unresolved":false,"context_lines":[{"line_number":391,"context_line":"    # in OVO object class"},{"line_number":392,"context_line":""},{"line_number":393,"context_line":""},{"line_number":394,"context_line":"Standard attributes"},{"line_number":395,"context_line":"-------------------"},{"line_number":396,"context_line":"The standard attributes are added automatically in metaclass"},{"line_number":397,"context_line":"DeclarativeObject. If adding standard attribute, it has to be added in"}],"source_content_type":"text/x-rst","patch_set":10,"id":"7a77a97e_8734bbde","line":394,"range":{"start_line":394,"start_character":0,"end_line":394,"end_character":19},"in_reply_to":"1a95cdbc_b076c203","updated":"2016-11-22 18:52:19.000000000","message":"How about pointing to this: http://docs.openstack.org/developer/neutron/devref/db_layer.html#the-standard-attribute-table","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"da2afa0678a7d214e8e94917f7e2ea4db40aa717","unresolved":false,"context_lines":[{"line_number":391,"context_line":"    # in OVO object class"},{"line_number":392,"context_line":""},{"line_number":393,"context_line":""},{"line_number":394,"context_line":"Standard attributes"},{"line_number":395,"context_line":"-------------------"},{"line_number":396,"context_line":"The standard attributes are added automatically in metaclass"},{"line_number":397,"context_line":"DeclarativeObject. If adding standard attribute, it has to be added in"}],"source_content_type":"text/x-rst","patch_set":10,"id":"5a74a57a_e31347b6","line":394,"range":{"start_line":394,"start_character":0,"end_line":394,"end_character":19},"in_reply_to":"7a77a97e_8734bbde","updated":"2016-11-29 13:10:45.000000000","message":"Done","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"69256092ecfc47f93c54f07bad91a823f9ef6d26","unresolved":false,"context_lines":[{"line_number":400,"context_line":""},{"line_number":401,"context_line":"RBAC handling in objects"},{"line_number":402,"context_line":"------------------------"},{"line_number":403,"context_line":"(TBD)"},{"line_number":404,"context_line":""},{"line_number":405,"context_line":"Extensions to neutron resources"},{"line_number":406,"context_line":"-------------------------------"}],"source_content_type":"text/x-rst","patch_set":10,"id":"7a8ec9b2_2a393442","line":403,"range":{"start_line":403,"start_character":1,"end_line":403,"end_character":4},"updated":"2016-09-19 15:57:00.000000000","message":"Are you planning to add this info before it\u0027s merged? Or in next iterations?","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"da2afa0678a7d214e8e94917f7e2ea4db40aa717","unresolved":false,"context_lines":[{"line_number":400,"context_line":""},{"line_number":401,"context_line":"RBAC handling in objects"},{"line_number":402,"context_line":"------------------------"},{"line_number":403,"context_line":"(TBD)"},{"line_number":404,"context_line":""},{"line_number":405,"context_line":"Extensions to neutron resources"},{"line_number":406,"context_line":"-------------------------------"}],"source_content_type":"text/x-rst","patch_set":10,"id":"5a74a57a_99b80913","line":403,"range":{"start_line":403,"start_character":1,"end_line":403,"end_character":4},"in_reply_to":"5a8bc5a2_eff2dc99","updated":"2016-11-29 13:10:45.000000000","message":"Added new info about RBAC.","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"b13ca84674215df5e9f867bc9b13c5d7e8806540","unresolved":false,"context_lines":[{"line_number":400,"context_line":""},{"line_number":401,"context_line":"RBAC handling in objects"},{"line_number":402,"context_line":"------------------------"},{"line_number":403,"context_line":"(TBD)"},{"line_number":404,"context_line":""},{"line_number":405,"context_line":"Extensions to neutron resources"},{"line_number":406,"context_line":"-------------------------------"}],"source_content_type":"text/x-rst","patch_set":10,"id":"7a8ec9b2_c8914e9c","line":403,"range":{"start_line":403,"start_character":1,"end_line":403,"end_character":4},"in_reply_to":"7a8ec9b2_2a393442","updated":"2016-09-21 09:16:52.000000000","message":"Initial plans were to address it with next iteration.","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"634e69981f6000c9e014f17ef6c0cd133bff3fcc","unresolved":false,"context_lines":[{"line_number":400,"context_line":""},{"line_number":401,"context_line":"RBAC handling in objects"},{"line_number":402,"context_line":"------------------------"},{"line_number":403,"context_line":"(TBD)"},{"line_number":404,"context_line":""},{"line_number":405,"context_line":"Extensions to neutron resources"},{"line_number":406,"context_line":"-------------------------------"}],"source_content_type":"text/x-rst","patch_set":10,"id":"5a8bc5a2_eff2dc99","line":403,"range":{"start_line":403,"start_character":1,"end_line":403,"end_character":4},"in_reply_to":"7a8ec9b2_c8914e9c","updated":"2016-09-22 18:45:19.000000000","message":"Ack","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":19591,"name":"Saisrikiran Mudigonda","email":"saisrikiran.mudigonda@intel.com","username":"saisrikiran"},"change_message_id":"1b3ca0d4971cfd2da44ca56b930575580d103221","unresolved":false,"context_lines":[{"line_number":404,"context_line":""},{"line_number":405,"context_line":"Extensions to neutron resources"},{"line_number":406,"context_line":"-------------------------------"},{"line_number":407,"context_line":"Previous method to extend neutron resources was to add an arbitrary values to"},{"line_number":408,"context_line":"dictionary representing the data by providing extend_(subnet|port|network)_dict"},{"line_number":409,"context_line":"function and defining loading method. When using objects, we cannot add custom"},{"line_number":410,"context_line":"extensions at plugin side. All values have to be exposed in object class that is"}],"source_content_type":"text/x-rst","patch_set":10,"id":"7a77a97e_16b6238a","line":407,"range":{"start_line":407,"start_character":51,"end_line":407,"end_character":74},"updated":"2016-11-22 18:10:05.000000000","message":"nit: change \u0027values\u0027 to \u0027value\u0027 if you want to use \u0027an\u0027","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"a901c4350e388a23a2c583407be6c67052f949ac","unresolved":false,"context_lines":[{"line_number":404,"context_line":""},{"line_number":405,"context_line":"Extensions to neutron resources"},{"line_number":406,"context_line":"-------------------------------"},{"line_number":407,"context_line":"Previous method to extend neutron resources was to add an arbitrary values to"},{"line_number":408,"context_line":"dictionary representing the data by providing extend_(subnet|port|network)_dict"},{"line_number":409,"context_line":"function and defining loading method. When using objects, we cannot add custom"},{"line_number":410,"context_line":"extensions at plugin side. All values have to be exposed in object class that is"}],"source_content_type":"text/x-rst","patch_set":10,"id":"7a77a97e_4741c338","line":407,"range":{"start_line":407,"start_character":68,"end_line":407,"end_character":74},"updated":"2016-11-22 18:52:19.000000000","message":"value","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"da2afa0678a7d214e8e94917f7e2ea4db40aa717","unresolved":false,"context_lines":[{"line_number":404,"context_line":""},{"line_number":405,"context_line":"Extensions to neutron resources"},{"line_number":406,"context_line":"-------------------------------"},{"line_number":407,"context_line":"Previous method to extend neutron resources was to add an arbitrary values to"},{"line_number":408,"context_line":"dictionary representing the data by providing extend_(subnet|port|network)_dict"},{"line_number":409,"context_line":"function and defining loading method. When using objects, we cannot add custom"},{"line_number":410,"context_line":"extensions at plugin side. All values have to be exposed in object class that is"}],"source_content_type":"text/x-rst","patch_set":10,"id":"5a74a57a_c76f2afa","line":407,"range":{"start_line":407,"start_character":68,"end_line":407,"end_character":74},"in_reply_to":"7a77a97e_4741c338","updated":"2016-11-29 13:10:45.000000000","message":"Done","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"a901c4350e388a23a2c583407be6c67052f949ac","unresolved":false,"context_lines":[{"line_number":407,"context_line":"Previous method to extend neutron resources was to add an arbitrary values to"},{"line_number":408,"context_line":"dictionary representing the data by providing extend_(subnet|port|network)_dict"},{"line_number":409,"context_line":"function and defining loading method. When using objects, we cannot add custom"},{"line_number":410,"context_line":"extensions at plugin side. All values have to be exposed in object class that is"},{"line_number":411,"context_line":"defining the resource, meaning that even if some extensions can be vendor"},{"line_number":412,"context_line":"specific, it has to be defined in object fields. The extension data itself has"},{"line_number":413,"context_line":"to be defined also with OVO class."},{"line_number":414,"context_line":""}],"source_content_type":"text/x-rst","patch_set":10,"id":"7a77a97e_8762fbd6","line":411,"range":{"start_line":410,"start_character":78,"end_line":411,"end_character":8},"updated":"2016-11-22 18:52:19.000000000","message":"defines","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"da2afa0678a7d214e8e94917f7e2ea4db40aa717","unresolved":false,"context_lines":[{"line_number":407,"context_line":"Previous method to extend neutron resources was to add an arbitrary values to"},{"line_number":408,"context_line":"dictionary representing the data by providing extend_(subnet|port|network)_dict"},{"line_number":409,"context_line":"function and defining loading method. When using objects, we cannot add custom"},{"line_number":410,"context_line":"extensions at plugin side. All values have to be exposed in object class that is"},{"line_number":411,"context_line":"defining the resource, meaning that even if some extensions can be vendor"},{"line_number":412,"context_line":"specific, it has to be defined in object fields. The extension data itself has"},{"line_number":413,"context_line":"to be defined also with OVO class."},{"line_number":414,"context_line":""}],"source_content_type":"text/x-rst","patch_set":10,"id":"5a74a57a_2781be8f","line":411,"range":{"start_line":410,"start_character":78,"end_line":411,"end_character":8},"in_reply_to":"7a77a97e_8762fbd6","updated":"2016-11-29 13:10:45.000000000","message":"Done","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"69256092ecfc47f93c54f07bad91a823f9ef6d26","unresolved":false,"context_lines":[{"line_number":423,"context_line":"        value \u003d sa.Column(sa.String(64))"},{"line_number":424,"context_line":"        subnet \u003d orm.relationship("},{"line_number":425,"context_line":"            models_v2.Subnet,"},{"line_number":426,"context_line":"            # here is the definition of loading the extension with Subnet model:"},{"line_number":427,"context_line":"            backref\u003dorm.backref(\u0027extension\u0027, cascade\u003d\u0027delete\u0027, uselist\u003dFalse))"},{"line_number":428,"context_line":""},{"line_number":429,"context_line":""}],"source_content_type":"text/x-rst","patch_set":10,"id":"7a8ec9b2_eaf10c6c","line":426,"range":{"start_line":426,"start_character":12,"end_line":426,"end_character":80},"updated":"2016-09-19 15:57:00.000000000","message":"What happens, when Extension is not enabled? How to solve this kind of problem?","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"da2afa0678a7d214e8e94917f7e2ea4db40aa717","unresolved":false,"context_lines":[{"line_number":423,"context_line":"        value \u003d sa.Column(sa.String(64))"},{"line_number":424,"context_line":"        subnet \u003d orm.relationship("},{"line_number":425,"context_line":"            models_v2.Subnet,"},{"line_number":426,"context_line":"            # here is the definition of loading the extension with Subnet model:"},{"line_number":427,"context_line":"            backref\u003dorm.backref(\u0027extension\u0027, cascade\u003d\u0027delete\u0027, uselist\u003dFalse))"},{"line_number":428,"context_line":""},{"line_number":429,"context_line":""}],"source_content_type":"text/x-rst","patch_set":10,"id":"5a74a57a_9c0bc97c","line":426,"range":{"start_line":426,"start_character":12,"end_line":426,"end_character":80},"in_reply_to":"5a8bc5a2_ef201cfa","updated":"2016-11-29 13:10:45.000000000","message":"Added.","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"634e69981f6000c9e014f17ef6c0cd133bff3fcc","unresolved":false,"context_lines":[{"line_number":423,"context_line":"        value \u003d sa.Column(sa.String(64))"},{"line_number":424,"context_line":"        subnet \u003d orm.relationship("},{"line_number":425,"context_line":"            models_v2.Subnet,"},{"line_number":426,"context_line":"            # here is the definition of loading the extension with Subnet model:"},{"line_number":427,"context_line":"            backref\u003dorm.backref(\u0027extension\u0027, cascade\u003d\u0027delete\u0027, uselist\u003dFalse))"},{"line_number":428,"context_line":""},{"line_number":429,"context_line":""}],"source_content_type":"text/x-rst","patch_set":10,"id":"5a8bc5a2_ef201cfa","line":426,"range":{"start_line":426,"start_character":12,"end_line":426,"end_character":80},"in_reply_to":"7a8ec9b2_489e1eb9","updated":"2016-09-22 18:45:19.000000000","message":"Could you add info about Extension behavior to doc?","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"b13ca84674215df5e9f867bc9b13c5d7e8806540","unresolved":false,"context_lines":[{"line_number":423,"context_line":"        value \u003d sa.Column(sa.String(64))"},{"line_number":424,"context_line":"        subnet \u003d orm.relationship("},{"line_number":425,"context_line":"            models_v2.Subnet,"},{"line_number":426,"context_line":"            # here is the definition of loading the extension with Subnet model:"},{"line_number":427,"context_line":"            backref\u003dorm.backref(\u0027extension\u0027, cascade\u003d\u0027delete\u0027, uselist\u003dFalse))"},{"line_number":428,"context_line":""},{"line_number":429,"context_line":""}],"source_content_type":"text/x-rst","patch_set":10,"id":"7a8ec9b2_489e1eb9","line":426,"range":{"start_line":426,"start_character":12,"end_line":426,"end_character":80},"in_reply_to":"7a8ec9b2_eaf10c6c","updated":"2016-09-21 09:16:52.000000000","message":"So from DB perspective, you will load all the data from DB, with all declared fields from DB relationships. Current implementation for core resources (Port, Subnet, Network etc.) is that db result is parsed by make_\u003csmth\u003e_dict and extend_\u003csmth\u003e_dict. When extension is enabled, extend_\u003csmth\u003e_dict is taking the db results and declaring new fields in resulting dict. When extension is not enabled, data will be fetch with OVO, but will not be populated into resulting dict, because extend_\u003csmth\u003e_dict will not be called.","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"69256092ecfc47f93c54f07bad91a823f9ef6d26","unresolved":false,"context_lines":[{"line_number":466,"context_line":"leave the :code:`_make_(subnet|port|network)_dict` intact. This means that only the"},{"line_number":467,"context_line":"source of data is changed to OVO, but the output will stay in dict format."},{"line_number":468,"context_line":""},{"line_number":469,"context_line":"For Newton release, we would need to pass the database object into"},{"line_number":470,"context_line":":code:`_make_(subnet|port|network)_dict` and :code:`_apply_dict_extend_functions`"},{"line_number":471,"context_line":"methods for backward compatibility and support for out-of-tree neutron drivers"},{"line_number":472,"context_line":"and plugins."}],"source_content_type":"text/x-rst","patch_set":10,"id":"7a8ec9b2_aa02a409","line":469,"range":{"start_line":469,"start_character":4,"end_line":469,"end_character":10},"updated":"2016-09-19 15:57:00.000000000","message":"Ocata?","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"da2afa0678a7d214e8e94917f7e2ea4db40aa717","unresolved":false,"context_lines":[{"line_number":466,"context_line":"leave the :code:`_make_(subnet|port|network)_dict` intact. This means that only the"},{"line_number":467,"context_line":"source of data is changed to OVO, but the output will stay in dict format."},{"line_number":468,"context_line":""},{"line_number":469,"context_line":"For Newton release, we would need to pass the database object into"},{"line_number":470,"context_line":":code:`_make_(subnet|port|network)_dict` and :code:`_apply_dict_extend_functions`"},{"line_number":471,"context_line":"methods for backward compatibility and support for out-of-tree neutron drivers"},{"line_number":472,"context_line":"and plugins."}],"source_content_type":"text/x-rst","patch_set":10,"id":"5a74a57a_47a5da44","line":469,"range":{"start_line":469,"start_character":4,"end_line":469,"end_character":10},"in_reply_to":"7a8ec9b2_aa02a409","updated":"2016-11-29 13:10:45.000000000","message":"Reworded, without mentioning the release name.","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"a901c4350e388a23a2c583407be6c67052f949ac","unresolved":false,"context_lines":[{"line_number":475,"context_line":"-------------------------------------"},{"line_number":476,"context_line":"The base :code:`NeutronDbObject` class has support for exposing :code:`tenant_id`"},{"line_number":477,"context_line":"in dictionary access to the object fields (:code:`subnet[\u0027tenant_id\u0027]`) and in"},{"line_number":478,"context_line":":code:`to_dict()` method. There is defined :code:`tenant_id` read-only property"},{"line_number":479,"context_line":"for every object that has :code:`project_id` in :code:`fields`. It is not exposed"},{"line_number":480,"context_line":"in :code:`obj_to_primitive` method, so it means that :code:`tenant_id` will not"},{"line_number":481,"context_line":"be sent over RPC callback wire. When talking about filtering/sorting by"}],"source_content_type":"text/x-rst","patch_set":10,"id":"7a77a97e_c7e87319","line":478,"range":{"start_line":478,"start_character":35,"end_line":478,"end_character":42},"updated":"2016-11-22 18:52:19.000000000","message":"a","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"da2afa0678a7d214e8e94917f7e2ea4db40aa717","unresolved":false,"context_lines":[{"line_number":475,"context_line":"-------------------------------------"},{"line_number":476,"context_line":"The base :code:`NeutronDbObject` class has support for exposing :code:`tenant_id`"},{"line_number":477,"context_line":"in dictionary access to the object fields (:code:`subnet[\u0027tenant_id\u0027]`) and in"},{"line_number":478,"context_line":":code:`to_dict()` method. There is defined :code:`tenant_id` read-only property"},{"line_number":479,"context_line":"for every object that has :code:`project_id` in :code:`fields`. It is not exposed"},{"line_number":480,"context_line":"in :code:`obj_to_primitive` method, so it means that :code:`tenant_id` will not"},{"line_number":481,"context_line":"be sent over RPC callback wire. When talking about filtering/sorting by"}],"source_content_type":"text/x-rst","patch_set":10,"id":"5a74a57a_c7b80a78","line":478,"range":{"start_line":478,"start_character":35,"end_line":478,"end_character":42},"in_reply_to":"7a77a97e_c7e87319","updated":"2016-11-29 13:10:45.000000000","message":"Done","commit_id":"6310b5073b70345bd5fbf38b11545cffe63e98fa"},{"author":{"_account_id":19591,"name":"Saisrikiran Mudigonda","email":"saisrikiran.mudigonda@intel.com","username":"saisrikiran"},"change_message_id":"8f973dfb411631fc98f86b203baac09f90ea8d3c","unresolved":false,"context_lines":[{"line_number":42,"context_line":"receiving end."},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"In order to meet complex neutron requirements, we have introduced multiple"},{"line_number":45,"context_line":"improvements. Please take a look at NeutronDbObject and on below devref."},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"Key concepts we will cover in this devref:"},{"line_number":48,"context_line":""}],"source_content_type":"text/x-rst","patch_set":11,"id":"1a6eadb0_4adb477c","line":45,"range":{"start_line":45,"start_character":52,"end_line":45,"end_character":59},"updated":"2016-12-21 17:16:23.000000000","message":"nit: s/and on/and the?","commit_id":"8faae2be03b1785a4161271d7aaef8ec5d828f6d"},{"author":{"_account_id":19591,"name":"Saisrikiran Mudigonda","email":"saisrikiran.mudigonda@intel.com","username":"saisrikiran"},"change_message_id":"8f973dfb411631fc98f86b203baac09f90ea8d3c","unresolved":false,"context_lines":[{"line_number":160,"context_line":"i.e.). Note that the multiple primary keys related to one parent object are not"},{"line_number":161,"context_line":"permitted."},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"It is important to remember about nullable parameter. In SQLAlchemy model,"},{"line_number":164,"context_line":"the nullable parameter is by default True, while in oslo fields nullable is set"},{"line_number":165,"context_line":"to False."},{"line_number":166,"context_line":""},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"Example"}],"source_content_type":"text/x-rst","patch_set":11,"id":"1a6eadb0_8d1499e9","line":165,"range":{"start_line":163,"start_character":54,"end_line":165,"end_character":9},"updated":"2016-12-21 17:16:23.000000000","message":"When the nullable parameter is False in oslo fields, doesn\u0027t the field need to be populated with a default value? \n\nThe default values need to be stated for default types and synthetic fields.","commit_id":"8faae2be03b1785a4161271d7aaef8ec5d828f6d"},{"author":{"_account_id":19591,"name":"Saisrikiran Mudigonda","email":"saisrikiran.mudigonda@intel.com","username":"saisrikiran"},"change_message_id":"8f973dfb411631fc98f86b203baac09f90ea8d3c","unresolved":false,"context_lines":[{"line_number":490,"context_line":"DeclarativeObject. If adding standard attribute, it has to be added in"},{"line_number":491,"context_line":"``neutron/objects/extensions/standardattributes.py``. It will be added"},{"line_number":492,"context_line":"to all relevant objects that is using the standardattributes model."},{"line_number":493,"context_line":"Be carefull then adding something to above, because it could trigger to change"},{"line_number":494,"context_line":"the object\u0027s :code:`VERSION`."},{"line_number":495,"context_line":"More on how standard attributes work, check [#]_."},{"line_number":496,"context_line":""}],"source_content_type":"text/x-rst","patch_set":11,"id":"fa48f94a_32e4700c","line":493,"range":{"start_line":493,"start_character":3,"end_line":493,"end_character":17},"updated":"2016-12-21 17:16:23.000000000","message":"nit: careful when","commit_id":"8faae2be03b1785a4161271d7aaef8ec5d828f6d"},{"author":{"_account_id":23821,"name":"Prince Nana Owusu Boateng","email":"prince.a.owusu.boateng@intel.com","username":"nanaboat"},"change_message_id":"3cdc3de7e71dcac3502f012494778755695906bb","unresolved":false,"context_lines":[{"line_number":504,"context_line":"It defines new base class :code:`NeutronRbacObject`. The new class wraps standard"},{"line_number":505,"context_line":":code:`NeutronDbObject` methods like :code:`create`, :code:`update` and"},{"line_number":506,"context_line":":code:`to_dict`. It checks if \u0027shared\u0027 attribute is defined in :code:`fields`"},{"line_number":507,"context_line":"dictionary and adding it to :code:`syntehtic_fields`. Also :code:`rbac_db_model`"},{"line_number":508,"context_line":"is required to be defined in Network and QosPolicy classes."},{"line_number":509,"context_line":""},{"line_number":510,"context_line":":code:`NeutronRbacObject` is a common place to handle all operations on the RBAC"}],"source_content_type":"text/x-rst","patch_set":11,"id":"1a6eadb0_195dcb48","line":507,"range":{"start_line":507,"start_character":35,"end_line":507,"end_character":51},"updated":"2016-12-18 03:33:36.000000000","message":"Is this `synthetic_fields` ?","commit_id":"8faae2be03b1785a4161271d7aaef8ec5d828f6d"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"dc098d20554c2847e281794b2754ae270250fcac","unresolved":false,"context_lines":[{"line_number":387,"context_line":"because :code:`from_db_object` is taking care of loading the synthetic fields"},{"line_number":388,"context_line":"in custom way."},{"line_number":389,"context_line":""},{"line_number":390,"context_line":"About :code:`obj_reset_changes`, it belongs to oslo versionedobjects lib. The nature"},{"line_number":391,"context_line":"of OVO is when you set some field, OVO is tacking its changes. When calling"},{"line_number":392,"context_line":"save/create or update, OVO is scanning for changed fields and save them in DB."},{"line_number":393,"context_line":"When you set some field (regular or synthetic one), and you know that you do not"},{"line_number":394,"context_line":"need to set this field in DB, you are calling :code:`obj_reset_changes` to tell OVO lib,"}],"source_content_type":"text/x-rst","patch_set":12,"id":"7a3c09a3_1a877ad8","line":391,"range":{"start_line":390,"start_character":74,"end_line":391,"end_character":61},"updated":"2017-01-18 22:40:18.000000000","message":"I didn\u0027t understand this sentence. Specifically, what do you mean by \"tacking\"","commit_id":"09ebe4a2d00546eade280cf08d54f68da65998d2"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"2b6ad15a1cb61554d20c5e7f805d3482110ae22e","unresolved":false,"context_lines":[{"line_number":387,"context_line":"because :code:`from_db_object` is taking care of loading the synthetic fields"},{"line_number":388,"context_line":"in custom way."},{"line_number":389,"context_line":""},{"line_number":390,"context_line":"About :code:`obj_reset_changes`, it belongs to oslo versionedobjects lib. The nature"},{"line_number":391,"context_line":"of OVO is when you set some field, OVO is tacking its changes. When calling"},{"line_number":392,"context_line":"save/create or update, OVO is scanning for changed fields and save them in DB."},{"line_number":393,"context_line":"When you set some field (regular or synthetic one), and you know that you do not"},{"line_number":394,"context_line":"need to set this field in DB, you are calling :code:`obj_reset_changes` to tell OVO lib,"}],"source_content_type":"text/x-rst","patch_set":12,"id":"5a3905b3_1424f5c2","line":391,"range":{"start_line":390,"start_character":74,"end_line":391,"end_character":61},"in_reply_to":"7a3c09a3_1a877ad8","updated":"2017-01-23 20:16:12.000000000","message":"Tracking.","commit_id":"09ebe4a2d00546eade280cf08d54f68da65998d2"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"dc098d20554c2847e281794b2754ae270250fcac","unresolved":false,"context_lines":[{"line_number":438,"context_line":"~~~~~~~~~~~~~~~~~~~~~"},{"line_number":439,"context_line":":code:`NeutronDbObject` class has strict validation on which fields sorting"},{"line_number":440,"context_line":"and filtering can happen. When calling :code:`get_objects` and :code:`count`"},{"line_number":441,"context_line":"methods, :code:`validate_filters` is invoke, to see if passed filters are included"},{"line_number":442,"context_line":"in object\u0027s fields. Additional filters can be defined using"},{"line_number":443,"context_line":":code:`register_filter_hook_on_model`. This will add requested string to valid"},{"line_number":444,"context_line":"filter names in object implementation. It is optional."}],"source_content_type":"text/x-rst","patch_set":12,"id":"7a3c09a3_5aaca235","line":441,"range":{"start_line":441,"start_character":37,"end_line":441,"end_character":43},"updated":"2017-01-18 22:40:18.000000000","message":"invoked","commit_id":"09ebe4a2d00546eade280cf08d54f68da65998d2"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"2b6ad15a1cb61554d20c5e7f805d3482110ae22e","unresolved":false,"context_lines":[{"line_number":438,"context_line":"~~~~~~~~~~~~~~~~~~~~~"},{"line_number":439,"context_line":":code:`NeutronDbObject` class has strict validation on which fields sorting"},{"line_number":440,"context_line":"and filtering can happen. When calling :code:`get_objects` and :code:`count`"},{"line_number":441,"context_line":"methods, :code:`validate_filters` is invoke, to see if passed filters are included"},{"line_number":442,"context_line":"in object\u0027s fields. Additional filters can be defined using"},{"line_number":443,"context_line":":code:`register_filter_hook_on_model`. This will add requested string to valid"},{"line_number":444,"context_line":"filter names in object implementation. It is optional."}],"source_content_type":"text/x-rst","patch_set":12,"id":"5a3905b3_34065120","line":441,"range":{"start_line":441,"start_character":37,"end_line":441,"end_character":43},"in_reply_to":"7a3c09a3_5aaca235","updated":"2017-01-23 20:16:12.000000000","message":"Done","commit_id":"09ebe4a2d00546eade280cf08d54f68da65998d2"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"dc098d20554c2847e281794b2754ae270250fcac","unresolved":false,"context_lines":[{"line_number":443,"context_line":":code:`register_filter_hook_on_model`. This will add requested string to valid"},{"line_number":444,"context_line":"filter names in object implementation. It is optional."},{"line_number":445,"context_line":""},{"line_number":446,"context_line":":code:`register_filter_hook_on_model` is and complementary implementation in"},{"line_number":447,"context_line":"NeutronDbObject layer to DB layer\u0027s :code:`register_model_query_hook`, which is"},{"line_number":448,"context_line":"adding support for extra filtering during constructing SQL query. When extension"},{"line_number":449,"context_line":"defines extra query hook, it needs to be registered using object\u0027s"}],"source_content_type":"text/x-rst","patch_set":12,"id":"7a3c09a3_9a2b6a94","line":446,"range":{"start_line":446,"start_character":41,"end_line":446,"end_character":45},"updated":"2017-01-18 22:40:18.000000000","message":"a","commit_id":"09ebe4a2d00546eade280cf08d54f68da65998d2"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"2b6ad15a1cb61554d20c5e7f805d3482110ae22e","unresolved":false,"context_lines":[{"line_number":443,"context_line":":code:`register_filter_hook_on_model`. This will add requested string to valid"},{"line_number":444,"context_line":"filter names in object implementation. It is optional."},{"line_number":445,"context_line":""},{"line_number":446,"context_line":":code:`register_filter_hook_on_model` is and complementary implementation in"},{"line_number":447,"context_line":"NeutronDbObject layer to DB layer\u0027s :code:`register_model_query_hook`, which is"},{"line_number":448,"context_line":"adding support for extra filtering during constructing SQL query. When extension"},{"line_number":449,"context_line":"defines extra query hook, it needs to be registered using object\u0027s"}],"source_content_type":"text/x-rst","patch_set":12,"id":"5a3905b3_77029b0b","line":446,"range":{"start_line":446,"start_character":41,"end_line":446,"end_character":45},"in_reply_to":"7a3c09a3_9a2b6a94","updated":"2017-01-23 20:16:12.000000000","message":"Done","commit_id":"09ebe4a2d00546eade280cf08d54f68da65998d2"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"dc098d20554c2847e281794b2754ae270250fcac","unresolved":false,"context_lines":[{"line_number":444,"context_line":"filter names in object implementation. It is optional."},{"line_number":445,"context_line":""},{"line_number":446,"context_line":":code:`register_filter_hook_on_model` is and complementary implementation in"},{"line_number":447,"context_line":"NeutronDbObject layer to DB layer\u0027s :code:`register_model_query_hook`, which is"},{"line_number":448,"context_line":"adding support for extra filtering during constructing SQL query. When extension"},{"line_number":449,"context_line":"defines extra query hook, it needs to be registered using object\u0027s"},{"line_number":450,"context_line":":code:`register_filter_hook_on_model`, if it is not already included in object\u0027s"},{"line_number":451,"context_line":":code:`fields`."}],"source_content_type":"text/x-rst","patch_set":12,"id":"7a3c09a3_3a0b562d","line":448,"range":{"start_line":447,"start_character":77,"end_line":448,"end_character":6},"updated":"2017-01-18 22:40:18.000000000","message":"adds","commit_id":"09ebe4a2d00546eade280cf08d54f68da65998d2"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"dc098d20554c2847e281794b2754ae270250fcac","unresolved":false,"context_lines":[{"line_number":445,"context_line":""},{"line_number":446,"context_line":":code:`register_filter_hook_on_model` is and complementary implementation in"},{"line_number":447,"context_line":"NeutronDbObject layer to DB layer\u0027s :code:`register_model_query_hook`, which is"},{"line_number":448,"context_line":"adding support for extra filtering during constructing SQL query. When extension"},{"line_number":449,"context_line":"defines extra query hook, it needs to be registered using object\u0027s"},{"line_number":450,"context_line":":code:`register_filter_hook_on_model`, if it is not already included in object\u0027s"},{"line_number":451,"context_line":":code:`fields`."}],"source_content_type":"text/x-rst","patch_set":12,"id":"7a3c09a3_9a028a0a","line":448,"range":{"start_line":448,"start_character":42,"end_line":448,"end_character":54},"updated":"2017-01-18 22:40:18.000000000","message":"construction of","commit_id":"09ebe4a2d00546eade280cf08d54f68da65998d2"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"2b6ad15a1cb61554d20c5e7f805d3482110ae22e","unresolved":false,"context_lines":[{"line_number":444,"context_line":"filter names in object implementation. It is optional."},{"line_number":445,"context_line":""},{"line_number":446,"context_line":":code:`register_filter_hook_on_model` is and complementary implementation in"},{"line_number":447,"context_line":"NeutronDbObject layer to DB layer\u0027s :code:`register_model_query_hook`, which is"},{"line_number":448,"context_line":"adding support for extra filtering during constructing SQL query. When extension"},{"line_number":449,"context_line":"defines extra query hook, it needs to be registered using object\u0027s"},{"line_number":450,"context_line":":code:`register_filter_hook_on_model`, if it is not already included in object\u0027s"},{"line_number":451,"context_line":":code:`fields`."}],"source_content_type":"text/x-rst","patch_set":12,"id":"5a3905b3_d7226fa2","line":448,"range":{"start_line":447,"start_character":77,"end_line":448,"end_character":6},"in_reply_to":"7a3c09a3_3a0b562d","updated":"2017-01-23 20:16:12.000000000","message":"Done","commit_id":"09ebe4a2d00546eade280cf08d54f68da65998d2"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"2b6ad15a1cb61554d20c5e7f805d3482110ae22e","unresolved":false,"context_lines":[{"line_number":445,"context_line":""},{"line_number":446,"context_line":":code:`register_filter_hook_on_model` is and complementary implementation in"},{"line_number":447,"context_line":"NeutronDbObject layer to DB layer\u0027s :code:`register_model_query_hook`, which is"},{"line_number":448,"context_line":"adding support for extra filtering during constructing SQL query. When extension"},{"line_number":449,"context_line":"defines extra query hook, it needs to be registered using object\u0027s"},{"line_number":450,"context_line":":code:`register_filter_hook_on_model`, if it is not already included in object\u0027s"},{"line_number":451,"context_line":":code:`fields`."}],"source_content_type":"text/x-rst","patch_set":12,"id":"5a3905b3_7729bb89","line":448,"range":{"start_line":448,"start_character":42,"end_line":448,"end_character":54},"in_reply_to":"7a3c09a3_9a028a0a","updated":"2017-01-23 20:16:12.000000000","message":"Done","commit_id":"09ebe4a2d00546eade280cf08d54f68da65998d2"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"dc098d20554c2847e281794b2754ae270250fcac","unresolved":false,"context_lines":[{"line_number":490,"context_line":"DeclarativeObject. If adding standard attribute, it has to be added in"},{"line_number":491,"context_line":"``neutron/objects/extensions/standardattributes.py``. It will be added"},{"line_number":492,"context_line":"to all relevant objects that is using the standardattributes model."},{"line_number":493,"context_line":"Be carefull then adding something to above, because it could trigger to change"},{"line_number":494,"context_line":"the object\u0027s :code:`VERSION`."},{"line_number":495,"context_line":"More on how standard attributes work, check [#]_."},{"line_number":496,"context_line":""},{"line_number":497,"context_line":"RBAC handling in objects"}],"source_content_type":"text/x-rst","patch_set":12,"id":"7a3c09a3_3ca993e0","line":494,"range":{"start_line":493,"start_character":69,"end_line":494,"end_character":3},"updated":"2017-01-18 22:40:18.000000000","message":"change of the","commit_id":"09ebe4a2d00546eade280cf08d54f68da65998d2"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"2b6ad15a1cb61554d20c5e7f805d3482110ae22e","unresolved":false,"context_lines":[{"line_number":490,"context_line":"DeclarativeObject. If adding standard attribute, it has to be added in"},{"line_number":491,"context_line":"``neutron/objects/extensions/standardattributes.py``. It will be added"},{"line_number":492,"context_line":"to all relevant objects that is using the standardattributes model."},{"line_number":493,"context_line":"Be carefull then adding something to above, because it could trigger to change"},{"line_number":494,"context_line":"the object\u0027s :code:`VERSION`."},{"line_number":495,"context_line":"More on how standard attributes work, check [#]_."},{"line_number":496,"context_line":""},{"line_number":497,"context_line":"RBAC handling in objects"}],"source_content_type":"text/x-rst","patch_set":12,"id":"5a3905b3_7750db0b","line":494,"range":{"start_line":493,"start_character":69,"end_line":494,"end_character":3},"in_reply_to":"7a3c09a3_3ca993e0","updated":"2017-01-23 20:16:12.000000000","message":"Done","commit_id":"09ebe4a2d00546eade280cf08d54f68da65998d2"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"dc098d20554c2847e281794b2754ae270250fcac","unresolved":false,"context_lines":[{"line_number":492,"context_line":"to all relevant objects that is using the standardattributes model."},{"line_number":493,"context_line":"Be carefull then adding something to above, because it could trigger to change"},{"line_number":494,"context_line":"the object\u0027s :code:`VERSION`."},{"line_number":495,"context_line":"More on how standard attributes work, check [#]_."},{"line_number":496,"context_line":""},{"line_number":497,"context_line":"RBAC handling in objects"},{"line_number":498,"context_line":"------------------------"}],"source_content_type":"text/x-rst","patch_set":12,"id":"7a3c09a3_3c80b346","line":495,"range":{"start_line":495,"start_character":0,"end_line":495,"end_character":4},"updated":"2017-01-18 22:40:18.000000000","message":"For more","commit_id":"09ebe4a2d00546eade280cf08d54f68da65998d2"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"2b6ad15a1cb61554d20c5e7f805d3482110ae22e","unresolved":false,"context_lines":[{"line_number":492,"context_line":"to all relevant objects that is using the standardattributes model."},{"line_number":493,"context_line":"Be carefull then adding something to above, because it could trigger to change"},{"line_number":494,"context_line":"the object\u0027s :code:`VERSION`."},{"line_number":495,"context_line":"More on how standard attributes work, check [#]_."},{"line_number":496,"context_line":""},{"line_number":497,"context_line":"RBAC handling in objects"},{"line_number":498,"context_line":"------------------------"}],"source_content_type":"text/x-rst","patch_set":12,"id":"5a3905b3_b756c303","line":495,"range":{"start_line":495,"start_character":0,"end_line":495,"end_character":4},"in_reply_to":"7a3c09a3_3c80b346","updated":"2017-01-23 20:16:12.000000000","message":"Done","commit_id":"09ebe4a2d00546eade280cf08d54f68da65998d2"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"dc098d20554c2847e281794b2754ae270250fcac","unresolved":false,"context_lines":[{"line_number":504,"context_line":"It defines new base class :code:`NeutronRbacObject`. The new class wraps standard"},{"line_number":505,"context_line":":code:`NeutronDbObject` methods like :code:`create`, :code:`update` and"},{"line_number":506,"context_line":":code:`to_dict`. It checks if \u0027shared\u0027 attribute is defined in :code:`fields`"},{"line_number":507,"context_line":"dictionary and adding it to :code:`synthetic_fields`. Also :code:`rbac_db_model`"},{"line_number":508,"context_line":"is required to be defined in Network and QosPolicy classes."},{"line_number":509,"context_line":""},{"line_number":510,"context_line":":code:`NeutronRbacObject` is a common place to handle all operations on the RBAC"}],"source_content_type":"text/x-rst","patch_set":12,"id":"7a3c09a3_bce3c332","line":507,"range":{"start_line":507,"start_character":15,"end_line":507,"end_character":21},"updated":"2017-01-18 22:40:18.000000000","message":"adds","commit_id":"09ebe4a2d00546eade280cf08d54f68da65998d2"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"2b6ad15a1cb61554d20c5e7f805d3482110ae22e","unresolved":false,"context_lines":[{"line_number":504,"context_line":"It defines new base class :code:`NeutronRbacObject`. The new class wraps standard"},{"line_number":505,"context_line":":code:`NeutronDbObject` methods like :code:`create`, :code:`update` and"},{"line_number":506,"context_line":":code:`to_dict`. It checks if \u0027shared\u0027 attribute is defined in :code:`fields`"},{"line_number":507,"context_line":"dictionary and adding it to :code:`synthetic_fields`. Also :code:`rbac_db_model`"},{"line_number":508,"context_line":"is required to be defined in Network and QosPolicy classes."},{"line_number":509,"context_line":""},{"line_number":510,"context_line":":code:`NeutronRbacObject` is a common place to handle all operations on the RBAC"}],"source_content_type":"text/x-rst","patch_set":12,"id":"5a3905b3_f744cb4a","line":507,"range":{"start_line":507,"start_character":15,"end_line":507,"end_character":21},"in_reply_to":"7a3c09a3_bce3c332","updated":"2017-01-23 20:16:12.000000000","message":"Done","commit_id":"09ebe4a2d00546eade280cf08d54f68da65998d2"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"dc098d20554c2847e281794b2754ae270250fcac","unresolved":false,"context_lines":[{"line_number":549,"context_line":""},{"line_number":550,"context_line":"Extensions to neutron resources"},{"line_number":551,"context_line":"-------------------------------"},{"line_number":552,"context_line":"One of methods to extend neutron resources is to add an arbitrary value to"},{"line_number":553,"context_line":"dictionary representing the data by providing extend_(subnet|port|network)_dict"},{"line_number":554,"context_line":"function and defining loading method."},{"line_number":555,"context_line":""}],"source_content_type":"text/x-rst","patch_set":12,"id":"7a3c09a3_3cafd395","line":552,"range":{"start_line":552,"start_character":4,"end_line":552,"end_character":7},"updated":"2017-01-18 22:40:18.000000000","message":"of the","commit_id":"09ebe4a2d00546eade280cf08d54f68da65998d2"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"2b6ad15a1cb61554d20c5e7f805d3482110ae22e","unresolved":false,"context_lines":[{"line_number":549,"context_line":""},{"line_number":550,"context_line":"Extensions to neutron resources"},{"line_number":551,"context_line":"-------------------------------"},{"line_number":552,"context_line":"One of methods to extend neutron resources is to add an arbitrary value to"},{"line_number":553,"context_line":"dictionary representing the data by providing extend_(subnet|port|network)_dict"},{"line_number":554,"context_line":"function and defining loading method."},{"line_number":555,"context_line":""}],"source_content_type":"text/x-rst","patch_set":12,"id":"5a3905b3_f76bebb4","line":552,"range":{"start_line":552,"start_character":4,"end_line":552,"end_character":7},"in_reply_to":"7a3c09a3_3cafd395","updated":"2017-01-23 20:16:12.000000000","message":"Done","commit_id":"09ebe4a2d00546eade280cf08d54f68da65998d2"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"dc098d20554c2847e281794b2754ae270250fcac","unresolved":false,"context_lines":[{"line_number":558,"context_line":"Network etc.) is that DB result is parsed by make_\u003cresource\u003e_dict and"},{"line_number":559,"context_line":"extend_\u003cresource\u003e_dict. When extension is enabled, extend_\u003cresource\u003e_dict is"},{"line_number":560,"context_line":"taking the DB results and declaring new fields in resulting dict. When extension"},{"line_number":561,"context_line":"is not enabled, data will be fetch, but will not be populated into resulting dict,"},{"line_number":562,"context_line":"because extend_\u003cresource\u003e_dict will not be called."},{"line_number":563,"context_line":""},{"line_number":564,"context_line":"When using objects, we cannot add custom extensions at plugin side. All values"}],"source_content_type":"text/x-rst","patch_set":12,"id":"7a3c09a3_9c752734","line":561,"range":{"start_line":561,"start_character":29,"end_line":561,"end_character":34},"updated":"2017-01-18 22:40:18.000000000","message":"fetched","commit_id":"09ebe4a2d00546eade280cf08d54f68da65998d2"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"2b6ad15a1cb61554d20c5e7f805d3482110ae22e","unresolved":false,"context_lines":[{"line_number":558,"context_line":"Network etc.) is that DB result is parsed by make_\u003cresource\u003e_dict and"},{"line_number":559,"context_line":"extend_\u003cresource\u003e_dict. When extension is enabled, extend_\u003cresource\u003e_dict is"},{"line_number":560,"context_line":"taking the DB results and declaring new fields in resulting dict. When extension"},{"line_number":561,"context_line":"is not enabled, data will be fetch, but will not be populated into resulting dict,"},{"line_number":562,"context_line":"because extend_\u003cresource\u003e_dict will not be called."},{"line_number":563,"context_line":""},{"line_number":564,"context_line":"When using objects, we cannot add custom extensions at plugin side. All values"}],"source_content_type":"text/x-rst","patch_set":12,"id":"5a3905b3_575d9f13","line":561,"range":{"start_line":561,"start_character":29,"end_line":561,"end_character":34},"in_reply_to":"7a3c09a3_9c752734","updated":"2017-01-23 20:16:12.000000000","message":"Done","commit_id":"09ebe4a2d00546eade280cf08d54f68da65998d2"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"450e65ae4fb401190af56be05151ec4ee4be89e6","unresolved":false,"context_lines":[{"line_number":24,"context_line":"Objects in neutron"},{"line_number":25,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"\u0027Versioned object\u0027 is a key concept to achieve zero-downtime upgrades. Initially"},{"line_number":28,"context_line":"implemented by the nova community, it was pushed to oslo library, so that"},{"line_number":29,"context_line":"other projects can benefit from it."},{"line_number":30,"context_line":""}],"source_content_type":"text/x-rst","patch_set":13,"id":"1a430d35_19634143","line":27,"updated":"2017-02-08 18:23:48.000000000","message":"More generally, rolling upgrades.","commit_id":"3621055d6b0ce394ea452470297dc5cd8eb13b4c"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"2e8354efb8f27096f1f158130f1ab3eaf3c6b780","unresolved":false,"context_lines":[{"line_number":24,"context_line":"Objects in neutron"},{"line_number":25,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"\u0027Versioned object\u0027 is a key concept to achieve zero-downtime upgrades. Initially"},{"line_number":28,"context_line":"implemented by the nova community, it was pushed to oslo library, so that"},{"line_number":29,"context_line":"other projects can benefit from it."},{"line_number":30,"context_line":""}],"source_content_type":"text/x-rst","patch_set":13,"id":"fa31d9ce_bd367e00","line":27,"in_reply_to":"1a430d35_19634143","updated":"2017-02-16 07:51:54.000000000","message":"Done","commit_id":"3621055d6b0ce394ea452470297dc5cd8eb13b4c"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"450e65ae4fb401190af56be05151ec4ee4be89e6","unresolved":false,"context_lines":[{"line_number":34,"context_line":"definition with reference number. When you change the database schema, you change"},{"line_number":35,"context_line":"the version of an object and provide backward compatible translation method."},{"line_number":36,"context_line":"Different versions of software can communicate with each other, allowing"},{"line_number":37,"context_line":"communication between different versions of the software (via RPC i.e.)."},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"OVO is also commonly used for RPC payload versioning. It is used for versioning"},{"line_number":40,"context_line":"dictionary messages, define strict structure of it and keep the strong typing."}],"source_content_type":"text/x-rst","patch_set":13,"id":"1a430d35_99de51db","line":37,"updated":"2017-02-08 18:23:48.000000000","message":"I\u0027d suggest removing \"i.e.\" here, as it\u0027s not necessary, and usually used before clarifying the previous statement anyway (not after).","commit_id":"3621055d6b0ce394ea452470297dc5cd8eb13b4c"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"2e8354efb8f27096f1f158130f1ab3eaf3c6b780","unresolved":false,"context_lines":[{"line_number":34,"context_line":"definition with reference number. When you change the database schema, you change"},{"line_number":35,"context_line":"the version of an object and provide backward compatible translation method."},{"line_number":36,"context_line":"Different versions of software can communicate with each other, allowing"},{"line_number":37,"context_line":"communication between different versions of the software (via RPC i.e.)."},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"OVO is also commonly used for RPC payload versioning. It is used for versioning"},{"line_number":40,"context_line":"dictionary messages, define strict structure of it and keep the strong typing."}],"source_content_type":"text/x-rst","patch_set":13,"id":"fa31d9ce_fd3c76e2","line":37,"in_reply_to":"1a430d35_99de51db","updated":"2017-02-16 07:51:54.000000000","message":"Done","commit_id":"3621055d6b0ce394ea452470297dc5cd8eb13b4c"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"450e65ae4fb401190af56be05151ec4ee4be89e6","unresolved":false,"context_lines":[{"line_number":42,"context_line":"receiving end."},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"In order to meet complex neutron requirements, we have introduced multiple"},{"line_number":45,"context_line":"improvements. Please take a look at NeutronDbObject and on below devref."},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"Key concepts we will cover in this devref:"},{"line_number":48,"context_line":""}],"source_content_type":"text/x-rst","patch_set":13,"id":"1a430d35_3950fd31","line":45,"updated":"2017-02-08 18:23:48.000000000","message":"I think this entire paragraph can be cut. I\u0027m not sure it adds any value for the reader.","commit_id":"3621055d6b0ce394ea452470297dc5cd8eb13b4c"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"2e8354efb8f27096f1f158130f1ab3eaf3c6b780","unresolved":false,"context_lines":[{"line_number":42,"context_line":"receiving end."},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"In order to meet complex neutron requirements, we have introduced multiple"},{"line_number":45,"context_line":"improvements. Please take a look at NeutronDbObject and on below devref."},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"Key concepts we will cover in this devref:"},{"line_number":48,"context_line":""}],"source_content_type":"text/x-rst","patch_set":13,"id":"fa31d9ce_bd1d9e74","line":45,"in_reply_to":"1a430d35_3950fd31","updated":"2017-02-16 07:51:54.000000000","message":"Done","commit_id":"3621055d6b0ce394ea452470297dc5cd8eb13b4c"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"450e65ae4fb401190af56be05151ec4ee4be89e6","unresolved":false,"context_lines":[{"line_number":44,"context_line":"In order to meet complex neutron requirements, we have introduced multiple"},{"line_number":45,"context_line":"improvements. Please take a look at NeutronDbObject and on below devref."},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"Key concepts we will cover in this devref:"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"#. Defining your object"},{"line_number":50,"context_line":"#. Synthetic fields introduction"}],"source_content_type":"text/x-rst","patch_set":13,"id":"1a430d35_548110fa","line":47,"updated":"2017-02-08 18:23:48.000000000","message":"This list is redundant and may quickly become out of date, as it\u0027s also rendered on the left side of the docs page based on the actual section headers (which includes links to each section). Cut the whole list?","commit_id":"3621055d6b0ce394ea452470297dc5cd8eb13b4c"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"2e8354efb8f27096f1f158130f1ab3eaf3c6b780","unresolved":false,"context_lines":[{"line_number":44,"context_line":"In order to meet complex neutron requirements, we have introduced multiple"},{"line_number":45,"context_line":"improvements. Please take a look at NeutronDbObject and on below devref."},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"Key concepts we will cover in this devref:"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"#. Defining your object"},{"line_number":50,"context_line":"#. Synthetic fields introduction"}],"source_content_type":"text/x-rst","patch_set":13,"id":"fa31d9ce_1816b84b","line":47,"in_reply_to":"1a430d35_548110fa","updated":"2017-02-16 07:51:54.000000000","message":"Done","commit_id":"3621055d6b0ce394ea452470297dc5cd8eb13b4c"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"450e65ae4fb401190af56be05151ec4ee4be89e6","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        \u0027ip_version\u0027: common_types.IPVersionEnumField()"},{"line_number":81,"context_line":"    }"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"VERSION is a very important field defining version of the object. Initially"},{"line_number":84,"context_line":"version should be set to 1.0."},{"line_number":85,"context_line":"Version needs to be changed if fields or their types are modified. When you"},{"line_number":86,"context_line":"change the version of objects being exposed via RPC, you need to add method"}],"source_content_type":"text/x-rst","patch_set":13,"id":"1a430d35_b4d954f5","line":83,"updated":"2017-02-08 18:23:48.000000000","message":"I think VERSION should be a literal, rather than just a uppercase word, as it is the literal attribute name in Python:\n\n  :code:`VERSION`\n\nThe same change should be made in L84 and L85 as well.","commit_id":"3621055d6b0ce394ea452470297dc5cd8eb13b4c"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"2e8354efb8f27096f1f158130f1ab3eaf3c6b780","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        \u0027ip_version\u0027: common_types.IPVersionEnumField()"},{"line_number":81,"context_line":"    }"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"VERSION is a very important field defining version of the object. Initially"},{"line_number":84,"context_line":"version should be set to 1.0."},{"line_number":85,"context_line":"Version needs to be changed if fields or their types are modified. When you"},{"line_number":86,"context_line":"change the version of objects being exposed via RPC, you need to add method"}],"source_content_type":"text/x-rst","patch_set":13,"id":"fa31d9ce_5854b0c8","line":83,"in_reply_to":"1a430d35_b4d954f5","updated":"2017-02-16 07:51:54.000000000","message":"Done","commit_id":"3621055d6b0ce394ea452470297dc5cd8eb13b4c"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"450e65ae4fb401190af56be05151ec4ee4be89e6","unresolved":false,"context_lines":[{"line_number":98,"context_line":"If there is situation where field needs be named differently in object"},{"line_number":99,"context_line":"than in database schema, you can use :code:`fields_need_translation`."},{"line_number":100,"context_line":"This dictionary contains the name of field in the"},{"line_number":101,"context_line":"object definition and name of field in db. It was created to easily"},{"line_number":102,"context_line":"manipulate the database representation to object definition."},{"line_number":103,"context_line":"For example in IP allocation pools::"},{"line_number":104,"context_line":""}],"source_content_type":"text/x-rst","patch_set":13,"id":"1a430d35_1434e8f9","line":101,"updated":"2017-02-08 18:23:48.000000000","message":"It would be helpful if this clarified which was the key and which was the value.\n\n  This dictionary contains the name of field in the object\n  definition (the key) and the corresponding name of field\n  in the database (the value).","commit_id":"3621055d6b0ce394ea452470297dc5cd8eb13b4c"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"2e8354efb8f27096f1f158130f1ab3eaf3c6b780","unresolved":false,"context_lines":[{"line_number":98,"context_line":"If there is situation where field needs be named differently in object"},{"line_number":99,"context_line":"than in database schema, you can use :code:`fields_need_translation`."},{"line_number":100,"context_line":"This dictionary contains the name of field in the"},{"line_number":101,"context_line":"object definition and name of field in db. It was created to easily"},{"line_number":102,"context_line":"manipulate the database representation to object definition."},{"line_number":103,"context_line":"For example in IP allocation pools::"},{"line_number":104,"context_line":""}],"source_content_type":"text/x-rst","patch_set":13,"id":"fa31d9ce_7866d4bb","line":101,"in_reply_to":"1a430d35_1434e8f9","updated":"2017-02-16 07:51:54.000000000","message":"Done","commit_id":"3621055d6b0ce394ea452470297dc5cd8eb13b4c"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"450e65ae4fb401190af56be05151ec4ee4be89e6","unresolved":false,"context_lines":[{"line_number":155,"context_line":"class. Note that the foreign_keys are declared in related object, where :code:`subnet_id`"},{"line_number":156,"context_line":"is declared, the same way it is done in the SQL model. In order to support foreign"},{"line_number":157,"context_line":"keys for many related objects, you should declare the name of the related object"},{"line_number":158,"context_line":"(:code:`Subnet` i.e.) as key and as value declare which field from local object"},{"line_number":159,"context_line":"(:code:`subnet_id` i.e.) is referring to which field in related object (:code:`id`"},{"line_number":160,"context_line":"i.e.). Note that the multiple primary keys related to one parent object are not"},{"line_number":161,"context_line":"permitted."}],"source_content_type":"text/x-rst","patch_set":13,"id":"1a430d35_ba3dbb2c","line":158,"updated":"2017-02-08 18:23:48.000000000","message":"additional i.e.\u0027s can be removed as well :)","commit_id":"3621055d6b0ce394ea452470297dc5cd8eb13b4c"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"2e8354efb8f27096f1f158130f1ab3eaf3c6b780","unresolved":false,"context_lines":[{"line_number":155,"context_line":"class. Note that the foreign_keys are declared in related object, where :code:`subnet_id`"},{"line_number":156,"context_line":"is declared, the same way it is done in the SQL model. In order to support foreign"},{"line_number":157,"context_line":"keys for many related objects, you should declare the name of the related object"},{"line_number":158,"context_line":"(:code:`Subnet` i.e.) as key and as value declare which field from local object"},{"line_number":159,"context_line":"(:code:`subnet_id` i.e.) is referring to which field in related object (:code:`id`"},{"line_number":160,"context_line":"i.e.). Note that the multiple primary keys related to one parent object are not"},{"line_number":161,"context_line":"permitted."}],"source_content_type":"text/x-rst","patch_set":13,"id":"fa31d9ce_78eb34dc","line":158,"in_reply_to":"1a430d35_ba3dbb2c","updated":"2017-02-16 07:51:54.000000000","message":"Done","commit_id":"3621055d6b0ce394ea452470297dc5cd8eb13b4c"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"450e65ae4fb401190af56be05151ec4ee4be89e6","unresolved":false,"context_lines":[{"line_number":161,"context_line":"permitted."},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"It is important to remember about nullable parameter. In SQLAlchemy model,"},{"line_number":164,"context_line":"the nullable parameter is by default True, while in oslo fields nullable is set"},{"line_number":165,"context_line":"to False."},{"line_number":166,"context_line":""},{"line_number":167,"context_line":""}],"source_content_type":"text/x-rst","patch_set":13,"id":"1a430d35_7ad353d5","line":164,"updated":"2017-02-08 18:23:48.000000000","message":":code:`True`","commit_id":"3621055d6b0ce394ea452470297dc5cd8eb13b4c"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"2e8354efb8f27096f1f158130f1ab3eaf3c6b780","unresolved":false,"context_lines":[{"line_number":161,"context_line":"permitted."},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"It is important to remember about nullable parameter. In SQLAlchemy model,"},{"line_number":164,"context_line":"the nullable parameter is by default True, while in oslo fields nullable is set"},{"line_number":165,"context_line":"to False."},{"line_number":166,"context_line":""},{"line_number":167,"context_line":""}],"source_content_type":"text/x-rst","patch_set":13,"id":"fa31d9ce_381e1c0c","line":164,"in_reply_to":"1a430d35_7ad353d5","updated":"2017-02-16 07:51:54.000000000","message":"Done","commit_id":"3621055d6b0ce394ea452470297dc5cd8eb13b4c"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"450e65ae4fb401190af56be05151ec4ee4be89e6","unresolved":false,"context_lines":[{"line_number":162,"context_line":""},{"line_number":163,"context_line":"It is important to remember about nullable parameter. In SQLAlchemy model,"},{"line_number":164,"context_line":"the nullable parameter is by default True, while in oslo fields nullable is set"},{"line_number":165,"context_line":"to False."},{"line_number":166,"context_line":""},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"Example"}],"source_content_type":"text/x-rst","patch_set":13,"id":"1a430d35_9ade3fdb","line":165,"updated":"2017-02-08 18:23:48.000000000","message":":code:`False`","commit_id":"3621055d6b0ce394ea452470297dc5cd8eb13b4c"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"2e8354efb8f27096f1f158130f1ab3eaf3c6b780","unresolved":false,"context_lines":[{"line_number":162,"context_line":""},{"line_number":163,"context_line":"It is important to remember about nullable parameter. In SQLAlchemy model,"},{"line_number":164,"context_line":"the nullable parameter is by default True, while in oslo fields nullable is set"},{"line_number":165,"context_line":"to False."},{"line_number":166,"context_line":""},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"Example"}],"source_content_type":"text/x-rst","patch_set":13,"id":"fa31d9ce_58191021","line":165,"in_reply_to":"1a430d35_9ade3fdb","updated":"2017-02-16 07:51:54.000000000","message":"Done","commit_id":"3621055d6b0ce394ea452470297dc5cd8eb13b4c"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"450e65ae4fb401190af56be05151ec4ee4be89e6","unresolved":false,"context_lines":[{"line_number":490,"context_line":"DeclarativeObject. If adding standard attribute, it has to be added in"},{"line_number":491,"context_line":"``neutron/objects/extensions/standardattributes.py``. It will be added"},{"line_number":492,"context_line":"to all relevant objects that is using the standardattributes model."},{"line_number":493,"context_line":"Be carefull then adding something to above, because it could trigger change of"},{"line_number":494,"context_line":"the object\u0027s :code:`VERSION`."},{"line_number":495,"context_line":"For more on how standard attributes work, check [#]_."},{"line_number":496,"context_line":""}],"source_content_type":"text/x-rst","patch_set":13,"id":"1a430d35_2e1b50cb","line":493,"updated":"2017-02-08 18:23:48.000000000","message":"spelling: careful","commit_id":"3621055d6b0ce394ea452470297dc5cd8eb13b4c"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"2e8354efb8f27096f1f158130f1ab3eaf3c6b780","unresolved":false,"context_lines":[{"line_number":490,"context_line":"DeclarativeObject. If adding standard attribute, it has to be added in"},{"line_number":491,"context_line":"``neutron/objects/extensions/standardattributes.py``. It will be added"},{"line_number":492,"context_line":"to all relevant objects that is using the standardattributes model."},{"line_number":493,"context_line":"Be carefull then adding something to above, because it could trigger change of"},{"line_number":494,"context_line":"the object\u0027s :code:`VERSION`."},{"line_number":495,"context_line":"For more on how standard attributes work, check [#]_."},{"line_number":496,"context_line":""}],"source_content_type":"text/x-rst","patch_set":13,"id":"fa31d9ce_d8db404d","line":493,"in_reply_to":"1a430d35_2e1b50cb","updated":"2017-02-16 07:51:54.000000000","message":"Done","commit_id":"3621055d6b0ce394ea452470297dc5cd8eb13b4c"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"450e65ae4fb401190af56be05151ec4ee4be89e6","unresolved":false,"context_lines":[{"line_number":653,"context_line":""},{"line_number":654,"context_line":"References"},{"line_number":655,"context_line":"----------"},{"line_number":656,"context_line":".. [#] https://github.com/openstack/neutron/blob/9.0.0/neutron/objects/base.py#L285-L289"},{"line_number":657,"context_line":".. [#] https://github.com/openstack/neutron/blob/9.0.0/neutron/db/standard_attr.py"},{"line_number":658,"context_line":".. [#] https://github.com/openstack/neutron/blob/9.0.0/neutron/objects/base.py#L499"},{"line_number":659,"context_line":".. [#] https://github.com/openstack/neutron/blob/9.0.0/neutron/objects/base.py#L525"}],"source_content_type":"text/x-rst","patch_set":13,"id":"1a430d35_2e4990b7","line":656,"updated":"2017-02-08 18:23:48.000000000","message":"Should probably link to git.openstack.org instead of the mirror?","commit_id":"3621055d6b0ce394ea452470297dc5cd8eb13b4c"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"b053593a7edf5f339020c07ffb90ffbd7f9c7878","unresolved":false,"context_lines":[{"line_number":144,"context_line":"keys for many related objects, you should declare the name of the related object"},{"line_number":145,"context_line":"(:code:`Subnet`) as key and as value declare which field from local object"},{"line_number":146,"context_line":"(:code:`subnet_id`) is referring to which field in related object (:code:`id`"},{"line_number":147,"context_line":"i.e.). Note that the multiple primary keys related to one parent object are not"},{"line_number":148,"context_line":"permitted."},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"It is important to remember about nullable parameter. In SQLAlchemy model,"}],"source_content_type":"text/x-rst","patch_set":14,"id":"fa31d9ce_e6ff57a8","line":147,"range":{"start_line":147,"start_character":0,"end_line":147,"end_character":4},"updated":"2017-02-17 03:04:43.000000000","message":"This one also can be removed.","commit_id":"3c5096dba968fa3faa97db25a82a0919da9c6340"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"deb0b0111828c4cbce925f898c17caa4249cdeb7","unresolved":false,"context_lines":[{"line_number":144,"context_line":"keys for many related objects, you should declare the name of the related object"},{"line_number":145,"context_line":"(:code:`Subnet`) as key and as value declare which field from local object"},{"line_number":146,"context_line":"(:code:`subnet_id`) is referring to which field in related object (:code:`id`"},{"line_number":147,"context_line":"i.e.). Note that the multiple primary keys related to one parent object are not"},{"line_number":148,"context_line":"permitted."},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"It is important to remember about nullable parameter. In SQLAlchemy model,"}],"source_content_type":"text/x-rst","patch_set":14,"id":"fa31d9ce_aeb36d09","line":147,"range":{"start_line":147,"start_character":0,"end_line":147,"end_character":4},"in_reply_to":"fa31d9ce_e6ff57a8","updated":"2017-02-17 10:30:22.000000000","message":"Done","commit_id":"3c5096dba968fa3faa97db25a82a0919da9c6340"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"be516112c34b70f2ca756d701091e245493933a3","unresolved":false,"context_lines":[{"line_number":24,"context_line":"Objects in neutron"},{"line_number":25,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"\u0027Versioned object\u0027 is a key concept to achieve rolling upgrades. Initially"},{"line_number":28,"context_line":"implemented by the nova community, it was pushed to oslo library, so that"},{"line_number":29,"context_line":"other projects can benefit from it."},{"line_number":30,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_57962e95","line":27,"range":{"start_line":27,"start_character":39,"end_line":27,"end_character":46},"updated":"2017-02-19 05:57:28.000000000","message":"achieving","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"2ff09e404954a795dabb77473bfddb46126c4419","unresolved":false,"context_lines":[{"line_number":24,"context_line":"Objects in neutron"},{"line_number":25,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"\u0027Versioned object\u0027 is a key concept to achieve rolling upgrades. Initially"},{"line_number":28,"context_line":"implemented by the nova community, it was pushed to oslo library, so that"},{"line_number":29,"context_line":"other projects can benefit from it."},{"line_number":30,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_ddf936ca","line":27,"range":{"start_line":27,"start_character":39,"end_line":27,"end_character":46},"in_reply_to":"da36d5c6_57962e95","updated":"2017-03-01 18:57:41.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":23205,"name":"ianeta hutchinson","email":"ianeta.hutchinson@intel.com","username":"iphutch"},"change_message_id":"a0665c2a6b1f66a9c663d4ea3829adf9b2ccfe5d","unresolved":false,"context_lines":[{"line_number":24,"context_line":"Objects in neutron"},{"line_number":25,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"\u0027Versioned object\u0027 is a key concept to achieve rolling upgrades. Initially"},{"line_number":28,"context_line":"implemented by the nova community, it was pushed to oslo library, so that"},{"line_number":29,"context_line":"other projects can benefit from it."},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"`Oslo VersionedObjects`_ (aka OVO) is a database facade, where you define the"},{"line_number":32,"context_line":"middle layer between software and database schema. The layer is about creating"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_2b9eaf56","line":29,"range":{"start_line":27,"start_character":0,"end_line":29,"end_character":35},"updated":"2017-02-21 17:40:50.000000000","message":"Could read: Object versioning is a key concept in achieving rolling upgrades. Since its initial implementation by the nova community, a versioned object model has been pushed to an oslo library so that its benefits can be shared across projects.","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"2ff09e404954a795dabb77473bfddb46126c4419","unresolved":false,"context_lines":[{"line_number":24,"context_line":"Objects in neutron"},{"line_number":25,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"\u0027Versioned object\u0027 is a key concept to achieve rolling upgrades. Initially"},{"line_number":28,"context_line":"implemented by the nova community, it was pushed to oslo library, so that"},{"line_number":29,"context_line":"other projects can benefit from it."},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"`Oslo VersionedObjects`_ (aka OVO) is a database facade, where you define the"},{"line_number":32,"context_line":"middle layer between software and database schema. The layer is about creating"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_bde2c201","line":29,"range":{"start_line":27,"start_character":0,"end_line":29,"end_character":35},"in_reply_to":"da36d5c6_2b9eaf56","updated":"2017-03-01 18:57:41.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"be516112c34b70f2ca756d701091e245493933a3","unresolved":false,"context_lines":[{"line_number":29,"context_line":"other projects can benefit from it."},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"`Oslo VersionedObjects`_ (aka OVO) is a database facade, where you define the"},{"line_number":32,"context_line":"middle layer between software and database schema. The layer is about creating"},{"line_number":33,"context_line":"object per database resource, and make them versioned, so it creates strict data"},{"line_number":34,"context_line":"definition with reference number. When you change the database schema, you change"},{"line_number":35,"context_line":"the version of an object and provide backward compatible translation method."}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_9790a697","line":32,"range":{"start_line":32,"start_character":70,"end_line":32,"end_character":78},"updated":"2017-02-19 05:57:28.000000000","message":"creating an","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":23205,"name":"ianeta hutchinson","email":"ianeta.hutchinson@intel.com","username":"iphutch"},"change_message_id":"a0665c2a6b1f66a9c663d4ea3829adf9b2ccfe5d","unresolved":false,"context_lines":[{"line_number":29,"context_line":"other projects can benefit from it."},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"`Oslo VersionedObjects`_ (aka OVO) is a database facade, where you define the"},{"line_number":32,"context_line":"middle layer between software and database schema. The layer is about creating"},{"line_number":33,"context_line":"object per database resource, and make them versioned, so it creates strict data"},{"line_number":34,"context_line":"definition with reference number. When you change the database schema, you change"},{"line_number":35,"context_line":"the version of an object and provide backward compatible translation method."}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_0b356b45","line":32,"range":{"start_line":32,"start_character":33,"end_line":32,"end_character":34},"updated":"2017-02-21 17:40:50.000000000","message":"the","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"2ff09e404954a795dabb77473bfddb46126c4419","unresolved":false,"context_lines":[{"line_number":29,"context_line":"other projects can benefit from it."},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"`Oslo VersionedObjects`_ (aka OVO) is a database facade, where you define the"},{"line_number":32,"context_line":"middle layer between software and database schema. The layer is about creating"},{"line_number":33,"context_line":"object per database resource, and make them versioned, so it creates strict data"},{"line_number":34,"context_line":"definition with reference number. When you change the database schema, you change"},{"line_number":35,"context_line":"the version of an object and provide backward compatible translation method."}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_3d741234","line":32,"range":{"start_line":32,"start_character":33,"end_line":32,"end_character":34},"in_reply_to":"da36d5c6_0b356b45","updated":"2017-03-01 18:57:41.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"2ff09e404954a795dabb77473bfddb46126c4419","unresolved":false,"context_lines":[{"line_number":29,"context_line":"other projects can benefit from it."},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"`Oslo VersionedObjects`_ (aka OVO) is a database facade, where you define the"},{"line_number":32,"context_line":"middle layer between software and database schema. The layer is about creating"},{"line_number":33,"context_line":"object per database resource, and make them versioned, so it creates strict data"},{"line_number":34,"context_line":"definition with reference number. When you change the database schema, you change"},{"line_number":35,"context_line":"the version of an object and provide backward compatible translation method."}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_7d8daa30","line":32,"range":{"start_line":32,"start_character":70,"end_line":32,"end_character":78},"in_reply_to":"da36d5c6_9790a697","updated":"2017-03-01 18:57:41.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":23205,"name":"ianeta hutchinson","email":"ianeta.hutchinson@intel.com","username":"iphutch"},"change_message_id":"a0665c2a6b1f66a9c663d4ea3829adf9b2ccfe5d","unresolved":false,"context_lines":[{"line_number":29,"context_line":"other projects can benefit from it."},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"`Oslo VersionedObjects`_ (aka OVO) is a database facade, where you define the"},{"line_number":32,"context_line":"middle layer between software and database schema. The layer is about creating"},{"line_number":33,"context_line":"object per database resource, and make them versioned, so it creates strict data"},{"line_number":34,"context_line":"definition with reference number. When you change the database schema, you change"},{"line_number":35,"context_line":"the version of an object and provide backward compatible translation method."},{"line_number":36,"context_line":"Different versions of software can communicate with each other, allowing"},{"line_number":37,"context_line":"communication between different versions of the software (via RPC)."}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_8b495bd3","line":34,"range":{"start_line":32,"start_character":51,"end_line":34,"end_character":33},"updated":"2017-02-21 17:40:50.000000000","message":"In order to avoid \"this layer is about creating\": \nIn this layer, a versioned object per database resource is created with a strict data definition and reference number.","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"2ff09e404954a795dabb77473bfddb46126c4419","unresolved":false,"context_lines":[{"line_number":29,"context_line":"other projects can benefit from it."},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"`Oslo VersionedObjects`_ (aka OVO) is a database facade, where you define the"},{"line_number":32,"context_line":"middle layer between software and database schema. The layer is about creating"},{"line_number":33,"context_line":"object per database resource, and make them versioned, so it creates strict data"},{"line_number":34,"context_line":"definition with reference number. When you change the database schema, you change"},{"line_number":35,"context_line":"the version of an object and provide backward compatible translation method."},{"line_number":36,"context_line":"Different versions of software can communicate with each other, allowing"},{"line_number":37,"context_line":"communication between different versions of the software (via RPC)."}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_dda3f69c","line":34,"range":{"start_line":32,"start_character":51,"end_line":34,"end_character":33},"in_reply_to":"da36d5c6_8b495bd3","updated":"2017-03-01 18:57:41.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":29,"context_line":"other projects can benefit from it."},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"`Oslo VersionedObjects`_ (aka OVO) is a database facade, where you define the"},{"line_number":32,"context_line":"middle layer between software and database schema. The layer is about creating"},{"line_number":33,"context_line":"object per database resource, and make them versioned, so it creates strict data"},{"line_number":34,"context_line":"definition with reference number. When you change the database schema, you change"},{"line_number":35,"context_line":"the version of an object and provide backward compatible translation method."},{"line_number":36,"context_line":"Different versions of software can communicate with each other, allowing"},{"line_number":37,"context_line":"communication between different versions of the software (via RPC)."}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_e357c557","line":34,"range":{"start_line":32,"start_character":51,"end_line":34,"end_character":33},"in_reply_to":"da36d5c6_8b495bd3","updated":"2017-02-24 05:08:00.000000000","message":"I am not sure I follow what\u0027s the \u0027reference number\u0027 here.","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"2ff09e404954a795dabb77473bfddb46126c4419","unresolved":false,"context_lines":[{"line_number":29,"context_line":"other projects can benefit from it."},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"`Oslo VersionedObjects`_ (aka OVO) is a database facade, where you define the"},{"line_number":32,"context_line":"middle layer between software and database schema. The layer is about creating"},{"line_number":33,"context_line":"object per database resource, and make them versioned, so it creates strict data"},{"line_number":34,"context_line":"definition with reference number. When you change the database schema, you change"},{"line_number":35,"context_line":"the version of an object and provide backward compatible translation method."},{"line_number":36,"context_line":"Different versions of software can communicate with each other, allowing"},{"line_number":37,"context_line":"communication between different versions of the software (via RPC)."}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_9d5a5e82","line":34,"range":{"start_line":32,"start_character":51,"end_line":34,"end_character":33},"in_reply_to":"da36d5c6_e357c557","updated":"2017-03-01 18:57:41.000000000","message":"I believe, it was about `version number`. I\u0027ve changed to that.","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":32,"context_line":"middle layer between software and database schema. The layer is about creating"},{"line_number":33,"context_line":"object per database resource, and make them versioned, so it creates strict data"},{"line_number":34,"context_line":"definition with reference number. When you change the database schema, you change"},{"line_number":35,"context_line":"the version of an object and provide backward compatible translation method."},{"line_number":36,"context_line":"Different versions of software can communicate with each other, allowing"},{"line_number":37,"context_line":"communication between different versions of the software (via RPC)."},{"line_number":38,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_634cb5c8","line":35,"range":{"start_line":35,"start_character":37,"end_line":35,"end_character":45},"updated":"2017-02-24 05:08:00.000000000","message":"backwards","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"2ff09e404954a795dabb77473bfddb46126c4419","unresolved":false,"context_lines":[{"line_number":32,"context_line":"middle layer between software and database schema. The layer is about creating"},{"line_number":33,"context_line":"object per database resource, and make them versioned, so it creates strict data"},{"line_number":34,"context_line":"definition with reference number. When you change the database schema, you change"},{"line_number":35,"context_line":"the version of an object and provide backward compatible translation method."},{"line_number":36,"context_line":"Different versions of software can communicate with each other, allowing"},{"line_number":37,"context_line":"communication between different versions of the software (via RPC)."},{"line_number":38,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_7d092a95","line":35,"range":{"start_line":35,"start_character":37,"end_line":35,"end_character":45},"in_reply_to":"da36d5c6_634cb5c8","updated":"2017-03-01 18:57:41.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":23205,"name":"ianeta hutchinson","email":"ianeta.hutchinson@intel.com","username":"iphutch"},"change_message_id":"a0665c2a6b1f66a9c663d4ea3829adf9b2ccfe5d","unresolved":false,"context_lines":[{"line_number":31,"context_line":"`Oslo VersionedObjects`_ (aka OVO) is a database facade, where you define the"},{"line_number":32,"context_line":"middle layer between software and database schema. The layer is about creating"},{"line_number":33,"context_line":"object per database resource, and make them versioned, so it creates strict data"},{"line_number":34,"context_line":"definition with reference number. When you change the database schema, you change"},{"line_number":35,"context_line":"the version of an object and provide backward compatible translation method."},{"line_number":36,"context_line":"Different versions of software can communicate with each other, allowing"},{"line_number":37,"context_line":"communication between different versions of the software (via RPC)."},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"OVO is also commonly used for RPC payload versioning. It is used for versioning"},{"line_number":40,"context_line":"dictionary messages, define strict structure of it and keep the strong typing."}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_cb1193b1","line":37,"range":{"start_line":34,"start_character":34,"end_line":37,"end_character":67},"updated":"2017-02-21 17:40:50.000000000","message":"For readability and to avoid repetition in the last sentence:\nWith OVO, when you change the database schema, the version of the object also changes and a backward compatible translation method is provided. This allows different versions of software to communicate with one another (via RPC).","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"2ff09e404954a795dabb77473bfddb46126c4419","unresolved":false,"context_lines":[{"line_number":31,"context_line":"`Oslo VersionedObjects`_ (aka OVO) is a database facade, where you define the"},{"line_number":32,"context_line":"middle layer between software and database schema. The layer is about creating"},{"line_number":33,"context_line":"object per database resource, and make them versioned, so it creates strict data"},{"line_number":34,"context_line":"definition with reference number. When you change the database schema, you change"},{"line_number":35,"context_line":"the version of an object and provide backward compatible translation method."},{"line_number":36,"context_line":"Different versions of software can communicate with each other, allowing"},{"line_number":37,"context_line":"communication between different versions of the software (via RPC)."},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"OVO is also commonly used for RPC payload versioning. It is used for versioning"},{"line_number":40,"context_line":"dictionary messages, define strict structure of it and keep the strong typing."}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_fd743ad0","line":37,"range":{"start_line":34,"start_character":34,"end_line":37,"end_character":67},"in_reply_to":"da36d5c6_cb1193b1","updated":"2017-03-01 18:57:41.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"6e9d20ec348efd6674d113adb9320ceab1815608","unresolved":false,"context_lines":[{"line_number":38,"context_line":""},{"line_number":39,"context_line":"OVO is also commonly used for RPC payload versioning. It is used for versioning"},{"line_number":40,"context_line":"dictionary messages, define strict structure of it and keep the strong typing."},{"line_number":41,"context_line":"Because of it, you can be sure what is sent and how to use the data on"},{"line_number":42,"context_line":"receiving end."},{"line_number":43,"context_line":""},{"line_number":44,"context_line":".. _Oslo VersionedObjects: http://docs.openstack.org/developer/oslo.versionedobjects/"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_866232d7","line":41,"range":{"start_line":41,"start_character":31,"end_line":41,"end_character":35},"updated":"2017-02-20 00:37:09.000000000","message":"of what","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"2ff09e404954a795dabb77473bfddb46126c4419","unresolved":false,"context_lines":[{"line_number":38,"context_line":""},{"line_number":39,"context_line":"OVO is also commonly used for RPC payload versioning. It is used for versioning"},{"line_number":40,"context_line":"dictionary messages, define strict structure of it and keep the strong typing."},{"line_number":41,"context_line":"Because of it, you can be sure what is sent and how to use the data on"},{"line_number":42,"context_line":"receiving end."},{"line_number":43,"context_line":""},{"line_number":44,"context_line":".. _Oslo VersionedObjects: http://docs.openstack.org/developer/oslo.versionedobjects/"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_9d3b3eeb","line":41,"range":{"start_line":41,"start_character":31,"end_line":41,"end_character":35},"in_reply_to":"da36d5c6_866232d7","updated":"2017-03-01 18:57:41.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":23205,"name":"ianeta hutchinson","email":"ianeta.hutchinson@intel.com","username":"iphutch"},"change_message_id":"a0665c2a6b1f66a9c663d4ea3829adf9b2ccfe5d","unresolved":false,"context_lines":[{"line_number":36,"context_line":"Different versions of software can communicate with each other, allowing"},{"line_number":37,"context_line":"communication between different versions of the software (via RPC)."},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"OVO is also commonly used for RPC payload versioning. It is used for versioning"},{"line_number":40,"context_line":"dictionary messages, define strict structure of it and keep the strong typing."},{"line_number":41,"context_line":"Because of it, you can be sure what is sent and how to use the data on"},{"line_number":42,"context_line":"receiving end."},{"line_number":43,"context_line":""},{"line_number":44,"context_line":".. _Oslo VersionedObjects: http://docs.openstack.org/developer/oslo.versionedobjects/"},{"line_number":45,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_2b886fe7","line":42,"range":{"start_line":39,"start_character":54,"end_line":42,"end_character":14},"updated":"2017-02-21 17:40:50.000000000","message":"The subject changes here, so using \"it\" makes for confusion. Do you mean: It [OVO] is used for versioning dictionary messages, define strict structure of it [dictionary messages] and keeping strong typing?\nIf so, it could read: OVO creates versioned dictionary messages by defining a strict structure and keeping strong typing.","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"6e9d20ec348efd6674d113adb9320ceab1815608","unresolved":false,"context_lines":[{"line_number":39,"context_line":"OVO is also commonly used for RPC payload versioning. It is used for versioning"},{"line_number":40,"context_line":"dictionary messages, define strict structure of it and keep the strong typing."},{"line_number":41,"context_line":"Because of it, you can be sure what is sent and how to use the data on"},{"line_number":42,"context_line":"receiving end."},{"line_number":43,"context_line":""},{"line_number":44,"context_line":".. _Oslo VersionedObjects: http://docs.openstack.org/developer/oslo.versionedobjects/"},{"line_number":45,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_a65f360d","line":42,"range":{"start_line":42,"start_character":0,"end_line":42,"end_character":9},"updated":"2017-02-20 00:37:09.000000000","message":"the receiving","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"2ff09e404954a795dabb77473bfddb46126c4419","unresolved":false,"context_lines":[{"line_number":36,"context_line":"Different versions of software can communicate with each other, allowing"},{"line_number":37,"context_line":"communication between different versions of the software (via RPC)."},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"OVO is also commonly used for RPC payload versioning. It is used for versioning"},{"line_number":40,"context_line":"dictionary messages, define strict structure of it and keep the strong typing."},{"line_number":41,"context_line":"Because of it, you can be sure what is sent and how to use the data on"},{"line_number":42,"context_line":"receiving end."},{"line_number":43,"context_line":""},{"line_number":44,"context_line":".. _Oslo VersionedObjects: http://docs.openstack.org/developer/oslo.versionedobjects/"},{"line_number":45,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_a020d99c","line":42,"range":{"start_line":39,"start_character":54,"end_line":42,"end_character":14},"in_reply_to":"da36d5c6_2b886fe7","updated":"2017-03-01 18:57:41.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"2ff09e404954a795dabb77473bfddb46126c4419","unresolved":false,"context_lines":[{"line_number":39,"context_line":"OVO is also commonly used for RPC payload versioning. It is used for versioning"},{"line_number":40,"context_line":"dictionary messages, define strict structure of it and keep the strong typing."},{"line_number":41,"context_line":"Because of it, you can be sure what is sent and how to use the data on"},{"line_number":42,"context_line":"receiving end."},{"line_number":43,"context_line":""},{"line_number":44,"context_line":".. _Oslo VersionedObjects: http://docs.openstack.org/developer/oslo.versionedobjects/"},{"line_number":45,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_a057f900","line":42,"range":{"start_line":42,"start_character":0,"end_line":42,"end_character":9},"in_reply_to":"da36d5c6_a65f360d","updated":"2017-03-01 18:57:41.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":43,"context_line":""},{"line_number":44,"context_line":".. _Oslo VersionedObjects: http://docs.openstack.org/developer/oslo.versionedobjects/"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"Defining your object"},{"line_number":47,"context_line":"--------------------"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"In order to add new object in Neutron, you have to:"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_438891c5","line":46,"updated":"2017-02-24 05:08:00.000000000","message":"this section talks about database backed objects; it\u0027s fine that we make it priority, but we should also mention non-db base class, and its intent.","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"2ff09e404954a795dabb77473bfddb46126c4419","unresolved":false,"context_lines":[{"line_number":43,"context_line":""},{"line_number":44,"context_line":".. _Oslo VersionedObjects: http://docs.openstack.org/developer/oslo.versionedobjects/"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"Defining your object"},{"line_number":47,"context_line":"--------------------"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"In order to add new object in Neutron, you have to:"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_a058d9fb","line":46,"in_reply_to":"da36d5c6_438891c5","updated":"2017-03-01 18:57:41.000000000","message":"Do you have an idea how to describe non-db base class? I can try to write it by myself, or you could do this.","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":23205,"name":"ianeta hutchinson","email":"ianeta.hutchinson@intel.com","username":"iphutch"},"change_message_id":"a0665c2a6b1f66a9c663d4ea3829adf9b2ccfe5d","unresolved":false,"context_lines":[{"line_number":46,"context_line":"Defining your object"},{"line_number":47,"context_line":"--------------------"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"In order to add new object in Neutron, you have to:"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"#. Create object derived from :code:`NeutronDbObject` (aka base object)"},{"line_number":52,"context_line":"#. Add/reuse data model"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_ab745ffd","line":49,"range":{"start_line":49,"start_character":0,"end_line":49,"end_character":51},"updated":"2017-02-21 17:40:50.000000000","message":"To add a new object in neutron:","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"6e9d20ec348efd6674d113adb9320ceab1815608","unresolved":false,"context_lines":[{"line_number":46,"context_line":"Defining your object"},{"line_number":47,"context_line":"--------------------"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"In order to add new object in Neutron, you have to:"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"#. Create object derived from :code:`NeutronDbObject` (aka base object)"},{"line_number":52,"context_line":"#. Add/reuse data model"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_06a56203","line":49,"range":{"start_line":49,"start_character":16,"end_line":49,"end_character":19},"updated":"2017-02-20 00:37:09.000000000","message":"a new","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"2ff09e404954a795dabb77473bfddb46126c4419","unresolved":false,"context_lines":[{"line_number":46,"context_line":"Defining your object"},{"line_number":47,"context_line":"--------------------"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"In order to add new object in Neutron, you have to:"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"#. Create object derived from :code:`NeutronDbObject` (aka base object)"},{"line_number":52,"context_line":"#. Add/reuse data model"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_2091499a","line":49,"in_reply_to":"da36d5c6_06a56203","updated":"2017-03-01 18:57:41.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"2ff09e404954a795dabb77473bfddb46126c4419","unresolved":false,"context_lines":[{"line_number":46,"context_line":"Defining your object"},{"line_number":47,"context_line":"--------------------"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"In order to add new object in Neutron, you have to:"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"#. Create object derived from :code:`NeutronDbObject` (aka base object)"},{"line_number":52,"context_line":"#. Add/reuse data model"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_e0965193","line":49,"in_reply_to":"da36d5c6_ab745ffd","updated":"2017-03-01 18:57:41.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":48,"context_line":""},{"line_number":49,"context_line":"In order to add new object in Neutron, you have to:"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"#. Create object derived from :code:`NeutronDbObject` (aka base object)"},{"line_number":52,"context_line":"#. Add/reuse data model"},{"line_number":53,"context_line":"#. Define fields"},{"line_number":54,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_e3e505a4","line":51,"range":{"start_line":51,"start_character":10,"end_line":51,"end_character":16},"updated":"2017-02-24 05:08:00.000000000","message":"an object","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"2ff09e404954a795dabb77473bfddb46126c4419","unresolved":false,"context_lines":[{"line_number":48,"context_line":""},{"line_number":49,"context_line":"In order to add new object in Neutron, you have to:"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"#. Create object derived from :code:`NeutronDbObject` (aka base object)"},{"line_number":52,"context_line":"#. Add/reuse data model"},{"line_number":53,"context_line":"#. Define fields"},{"line_number":54,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_e0e73110","line":51,"in_reply_to":"da36d5c6_e3e505a4","updated":"2017-03-01 18:57:41.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":56,"context_line":":code:`NeutronDbObject`."},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"Fields should be defined using :code:`oslo_versionobjects.fields` exposed types."},{"line_number":59,"context_line":"If there is a special need to create a new type of field, we have created"},{"line_number":60,"context_line":":code:`common_types.py` in :code:`neutron.objects` directory."},{"line_number":61,"context_line":"Example::"},{"line_number":62,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_c369e1fa","line":59,"range":{"start_line":59,"start_character":58,"end_line":59,"end_character":73},"updated":"2017-02-24 05:08:00.000000000","message":"-\u003e you can use","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"2ff09e404954a795dabb77473bfddb46126c4419","unresolved":false,"context_lines":[{"line_number":56,"context_line":":code:`NeutronDbObject`."},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"Fields should be defined using :code:`oslo_versionobjects.fields` exposed types."},{"line_number":59,"context_line":"If there is a special need to create a new type of field, we have created"},{"line_number":60,"context_line":":code:`common_types.py` in :code:`neutron.objects` directory."},{"line_number":61,"context_line":"Example::"},{"line_number":62,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_808d9533","line":59,"range":{"start_line":59,"start_character":58,"end_line":59,"end_character":73},"in_reply_to":"da36d5c6_c369e1fa","updated":"2017-03-01 18:57:41.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":23205,"name":"ianeta hutchinson","email":"ianeta.hutchinson@intel.com","username":"iphutch"},"change_message_id":"a0665c2a6b1f66a9c663d4ea3829adf9b2ccfe5d","unresolved":false,"context_lines":[{"line_number":57,"context_line":""},{"line_number":58,"context_line":"Fields should be defined using :code:`oslo_versionobjects.fields` exposed types."},{"line_number":59,"context_line":"If there is a special need to create a new type of field, we have created"},{"line_number":60,"context_line":":code:`common_types.py` in :code:`neutron.objects` directory."},{"line_number":61,"context_line":"Example::"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    fields \u003d {"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_cb5fd373","line":60,"range":{"start_line":60,"start_character":26,"end_line":60,"end_character":27},"updated":"2017-02-21 17:40:50.000000000","message":"the","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"2ff09e404954a795dabb77473bfddb46126c4419","unresolved":false,"context_lines":[{"line_number":57,"context_line":""},{"line_number":58,"context_line":"Fields should be defined using :code:`oslo_versionobjects.fields` exposed types."},{"line_number":59,"context_line":"If there is a special need to create a new type of field, we have created"},{"line_number":60,"context_line":":code:`common_types.py` in :code:`neutron.objects` directory."},{"line_number":61,"context_line":"Example::"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    fields \u003d {"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_20a0699f","line":60,"range":{"start_line":60,"start_character":26,"end_line":60,"end_character":27},"in_reply_to":"da36d5c6_cb5fd373","updated":"2017-03-01 18:57:41.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":67,"context_line":"        \u0027ip_version\u0027: common_types.IPVersionEnumField()"},{"line_number":68,"context_line":"    }"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":":code:`VERSION` is a very important field defining version of the object. Initially"},{"line_number":71,"context_line":":code:`VERSION` should be set to 1.0."},{"line_number":72,"context_line":":code:`VERSION` needs to be changed if fields or their types are modified. When you"},{"line_number":73,"context_line":"change the version of objects being exposed via RPC, you need to add method"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_e30fc536","line":70,"range":{"start_line":70,"start_character":16,"end_line":70,"end_character":50},"updated":"2017-02-24 05:08:00.000000000","message":"-\u003e is mandatory and defines the version...","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":23205,"name":"ianeta hutchinson","email":"ianeta.hutchinson@intel.com","username":"iphutch"},"change_message_id":"a0665c2a6b1f66a9c663d4ea3829adf9b2ccfe5d","unresolved":false,"context_lines":[{"line_number":67,"context_line":"        \u0027ip_version\u0027: common_types.IPVersionEnumField()"},{"line_number":68,"context_line":"    }"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":":code:`VERSION` is a very important field defining version of the object. Initially"},{"line_number":71,"context_line":":code:`VERSION` should be set to 1.0."},{"line_number":72,"context_line":":code:`VERSION` needs to be changed if fields or their types are modified. When you"},{"line_number":73,"context_line":"change the version of objects being exposed via RPC, you need to add method"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_eb64974a","line":70,"range":{"start_line":70,"start_character":50,"end_line":70,"end_character":51},"updated":"2017-02-21 17:40:50.000000000","message":"the","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"2ff09e404954a795dabb77473bfddb46126c4419","unresolved":false,"context_lines":[{"line_number":67,"context_line":"        \u0027ip_version\u0027: common_types.IPVersionEnumField()"},{"line_number":68,"context_line":"    }"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":":code:`VERSION` is a very important field defining version of the object. Initially"},{"line_number":71,"context_line":":code:`VERSION` should be set to 1.0."},{"line_number":72,"context_line":":code:`VERSION` needs to be changed if fields or their types are modified. When you"},{"line_number":73,"context_line":"change the version of objects being exposed via RPC, you need to add method"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_e0cad14e","line":70,"range":{"start_line":70,"start_character":16,"end_line":70,"end_character":50},"in_reply_to":"da36d5c6_e30fc536","updated":"2017-03-01 18:57:41.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"2ff09e404954a795dabb77473bfddb46126c4419","unresolved":false,"context_lines":[{"line_number":67,"context_line":"        \u0027ip_version\u0027: common_types.IPVersionEnumField()"},{"line_number":68,"context_line":"    }"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":":code:`VERSION` is a very important field defining version of the object. Initially"},{"line_number":71,"context_line":":code:`VERSION` should be set to 1.0."},{"line_number":72,"context_line":":code:`VERSION` needs to be changed if fields or their types are modified. When you"},{"line_number":73,"context_line":"change the version of objects being exposed via RPC, you need to add method"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_a0b0d9de","line":70,"range":{"start_line":70,"start_character":50,"end_line":70,"end_character":51},"in_reply_to":"da36d5c6_eb64974a","updated":"2017-03-01 18:57:41.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":23205,"name":"ianeta hutchinson","email":"ianeta.hutchinson@intel.com","username":"iphutch"},"change_message_id":"a0665c2a6b1f66a9c663d4ea3829adf9b2ccfe5d","unresolved":false,"context_lines":[{"line_number":68,"context_line":"    }"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":":code:`VERSION` is a very important field defining version of the object. Initially"},{"line_number":71,"context_line":":code:`VERSION` should be set to 1.0."},{"line_number":72,"context_line":":code:`VERSION` needs to be changed if fields or their types are modified. When you"},{"line_number":73,"context_line":"change the version of objects being exposed via RPC, you need to add method"},{"line_number":74,"context_line":":code:`obj_make_compatible(self, primitive, target_version)`."}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_0b5acb83","line":71,"range":{"start_line":71,"start_character":0,"end_line":71,"end_character":36},"updated":"2017-02-21 17:40:50.000000000","message":"Initially, set the :code:`VERSION` field to 1.0.","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"2ff09e404954a795dabb77473bfddb46126c4419","unresolved":false,"context_lines":[{"line_number":68,"context_line":"    }"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":":code:`VERSION` is a very important field defining version of the object. Initially"},{"line_number":71,"context_line":":code:`VERSION` should be set to 1.0."},{"line_number":72,"context_line":":code:`VERSION` needs to be changed if fields or their types are modified. When you"},{"line_number":73,"context_line":"change the version of objects being exposed via RPC, you need to add method"},{"line_number":74,"context_line":":code:`obj_make_compatible(self, primitive, target_version)`."}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_00c8c554","line":71,"range":{"start_line":71,"start_character":0,"end_line":71,"end_character":36},"in_reply_to":"da36d5c6_0b5acb83","updated":"2017-03-01 18:57:41.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":23205,"name":"ianeta hutchinson","email":"ianeta.hutchinson@intel.com","username":"iphutch"},"change_message_id":"a0665c2a6b1f66a9c663d4ea3829adf9b2ccfe5d","unresolved":false,"context_lines":[{"line_number":69,"context_line":""},{"line_number":70,"context_line":":code:`VERSION` is a very important field defining version of the object. Initially"},{"line_number":71,"context_line":":code:`VERSION` should be set to 1.0."},{"line_number":72,"context_line":":code:`VERSION` needs to be changed if fields or their types are modified. When you"},{"line_number":73,"context_line":"change the version of objects being exposed via RPC, you need to add method"},{"line_number":74,"context_line":":code:`obj_make_compatible(self, primitive, target_version)`."},{"line_number":75,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_2b5f8f73","line":72,"range":{"start_line":72,"start_character":0,"end_line":72,"end_character":74},"updated":"2017-02-21 17:40:50.000000000","message":"Change :code:`VERSION` if fields or their types are modified.","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"2ff09e404954a795dabb77473bfddb46126c4419","unresolved":false,"context_lines":[{"line_number":69,"context_line":""},{"line_number":70,"context_line":":code:`VERSION` is a very important field defining version of the object. Initially"},{"line_number":71,"context_line":":code:`VERSION` should be set to 1.0."},{"line_number":72,"context_line":":code:`VERSION` needs to be changed if fields or their types are modified. When you"},{"line_number":73,"context_line":"change the version of objects being exposed via RPC, you need to add method"},{"line_number":74,"context_line":":code:`obj_make_compatible(self, primitive, target_version)`."},{"line_number":75,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_40d9dd20","line":72,"range":{"start_line":72,"start_character":0,"end_line":72,"end_character":74},"in_reply_to":"da36d5c6_2b5f8f73","updated":"2017-03-01 18:57:41.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":23205,"name":"ianeta hutchinson","email":"ianeta.hutchinson@intel.com","username":"iphutch"},"change_message_id":"a0665c2a6b1f66a9c663d4ea3829adf9b2ccfe5d","unresolved":false,"context_lines":[{"line_number":70,"context_line":":code:`VERSION` is a very important field defining version of the object. Initially"},{"line_number":71,"context_line":":code:`VERSION` should be set to 1.0."},{"line_number":72,"context_line":":code:`VERSION` needs to be changed if fields or their types are modified. When you"},{"line_number":73,"context_line":"change the version of objects being exposed via RPC, you need to add method"},{"line_number":74,"context_line":":code:`obj_make_compatible(self, primitive, target_version)`."},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"Note, that Standard Attributes are automatically added to OVO fields in base class."}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_4b54c353","line":73,"range":{"start_line":73,"start_character":53,"end_line":73,"end_character":65},"updated":"2017-02-21 17:40:50.000000000","message":"remove","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"2ff09e404954a795dabb77473bfddb46126c4419","unresolved":false,"context_lines":[{"line_number":70,"context_line":":code:`VERSION` is a very important field defining version of the object. Initially"},{"line_number":71,"context_line":":code:`VERSION` should be set to 1.0."},{"line_number":72,"context_line":":code:`VERSION` needs to be changed if fields or their types are modified. When you"},{"line_number":73,"context_line":"change the version of objects being exposed via RPC, you need to add method"},{"line_number":74,"context_line":":code:`obj_make_compatible(self, primitive, target_version)`."},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"Note, that Standard Attributes are automatically added to OVO fields in base class."}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_60eee18c","line":73,"range":{"start_line":73,"start_character":53,"end_line":73,"end_character":65},"in_reply_to":"da36d5c6_4b54c353","updated":"2017-03-01 18:57:41.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":23205,"name":"ianeta hutchinson","email":"ianeta.hutchinson@intel.com","username":"iphutch"},"change_message_id":"a0665c2a6b1f66a9c663d4ea3829adf9b2ccfe5d","unresolved":false,"context_lines":[{"line_number":73,"context_line":"change the version of objects being exposed via RPC, you need to add method"},{"line_number":74,"context_line":":code:`obj_make_compatible(self, primitive, target_version)`."},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"Note, that Standard Attributes are automatically added to OVO fields in base class."},{"line_number":77,"context_line":"Attributes [#]_ like :code:`description`, :code:`created_at` and :code:`updated_at`"},{"line_number":78,"context_line":"are added in [#]_."},{"line_number":79,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_8b4ebbbf","line":76,"range":{"start_line":76,"start_character":4,"end_line":76,"end_character":10},"updated":"2017-02-21 17:40:50.000000000","message":"remove \"that\" and use the Note:: RST markup","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"2ff09e404954a795dabb77473bfddb46126c4419","unresolved":false,"context_lines":[{"line_number":73,"context_line":"change the version of objects being exposed via RPC, you need to add method"},{"line_number":74,"context_line":":code:`obj_make_compatible(self, primitive, target_version)`."},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"Note, that Standard Attributes are automatically added to OVO fields in base class."},{"line_number":77,"context_line":"Attributes [#]_ like :code:`description`, :code:`created_at` and :code:`updated_at`"},{"line_number":78,"context_line":"are added in [#]_."},{"line_number":79,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_a06d3906","line":76,"range":{"start_line":76,"start_character":4,"end_line":76,"end_character":10},"in_reply_to":"da36d5c6_8b4ebbbf","updated":"2017-03-01 18:57:41.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"6e9d20ec348efd6674d113adb9320ceab1815608","unresolved":false,"context_lines":[{"line_number":73,"context_line":"change the version of objects being exposed via RPC, you need to add method"},{"line_number":74,"context_line":":code:`obj_make_compatible(self, primitive, target_version)`."},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"Note, that Standard Attributes are automatically added to OVO fields in base class."},{"line_number":77,"context_line":"Attributes [#]_ like :code:`description`, :code:`created_at` and :code:`updated_at`"},{"line_number":78,"context_line":"are added in [#]_."},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"You are able to define an object\u0027s primary key using :code:`primary_keys` property"},{"line_number":81,"context_line":"where one or several fields can be listed. The default is :code:`primary_keys \u003d [\u0027id\u0027]`."}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_26f8a6e5","line":78,"range":{"start_line":76,"start_character":0,"end_line":78,"end_character":18},"updated":"2017-02-20 00:37:09.000000000","message":"For notes like this you can do the following:\n\n.. note::\n   Standard Attributes are automatically added to OVO.....\n\nPlease notice that the entire note has to be indented.\n\nA couple formatted examples of this can be seen here:\n\nhttps://docs.openstack.org/newton/networking-guide/config-dns-int.html#the-networking-service-internal-dns-resolution","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"2ff09e404954a795dabb77473bfddb46126c4419","unresolved":false,"context_lines":[{"line_number":73,"context_line":"change the version of objects being exposed via RPC, you need to add method"},{"line_number":74,"context_line":":code:`obj_make_compatible(self, primitive, target_version)`."},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"Note, that Standard Attributes are automatically added to OVO fields in base class."},{"line_number":77,"context_line":"Attributes [#]_ like :code:`description`, :code:`created_at` and :code:`updated_at`"},{"line_number":78,"context_line":"are added in [#]_."},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"You are able to define an object\u0027s primary key using :code:`primary_keys` property"},{"line_number":81,"context_line":"where one or several fields can be listed. The default is :code:`primary_keys \u003d [\u0027id\u0027]`."}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_007525ca","line":78,"range":{"start_line":76,"start_character":0,"end_line":78,"end_character":18},"in_reply_to":"da36d5c6_26f8a6e5","updated":"2017-03-01 18:57:41.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":77,"context_line":"Attributes [#]_ like :code:`description`, :code:`created_at` and :code:`updated_at`"},{"line_number":78,"context_line":"are added in [#]_."},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"You are able to define an object\u0027s primary key using :code:`primary_keys` property"},{"line_number":81,"context_line":"where one or several fields can be listed. The default is :code:`primary_keys \u003d [\u0027id\u0027]`."},{"line_number":82,"context_line":"For immutable object fields that cannot be changed, there is a"},{"line_number":83,"context_line":":code:`fields_no_update` list, and it contains :code:`primary_keys` by default."}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_c36000d2","line":80,"range":{"start_line":80,"start_character":23,"end_line":80,"end_character":46},"updated":"2017-02-24 05:08:00.000000000","message":"-\u003e primary keys for an object","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":77,"context_line":"Attributes [#]_ like :code:`description`, :code:`created_at` and :code:`updated_at`"},{"line_number":78,"context_line":"are added in [#]_."},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"You are able to define an object\u0027s primary key using :code:`primary_keys` property"},{"line_number":81,"context_line":"where one or several fields can be listed. The default is :code:`primary_keys \u003d [\u0027id\u0027]`."},{"line_number":82,"context_line":"For immutable object fields that cannot be changed, there is a"},{"line_number":83,"context_line":":code:`fields_no_update` list, and it contains :code:`primary_keys` by default."}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_8398c8c1","line":80,"range":{"start_line":80,"start_character":0,"end_line":80,"end_character":3},"updated":"2017-02-24 05:08:00.000000000","message":"I feel we miss intention of primary_keys here. You may note that it\u0027s used to define the list of fields that uniquely identify the object. In case of database backed objects, it\u0027s usually mapped onto SQL primary keys.","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"2ff09e404954a795dabb77473bfddb46126c4419","unresolved":false,"context_lines":[{"line_number":77,"context_line":"Attributes [#]_ like :code:`description`, :code:`created_at` and :code:`updated_at`"},{"line_number":78,"context_line":"are added in [#]_."},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"You are able to define an object\u0027s primary key using :code:`primary_keys` property"},{"line_number":81,"context_line":"where one or several fields can be listed. The default is :code:`primary_keys \u003d [\u0027id\u0027]`."},{"line_number":82,"context_line":"For immutable object fields that cannot be changed, there is a"},{"line_number":83,"context_line":":code:`fields_no_update` list, and it contains :code:`primary_keys` by default."}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_333281f2","line":80,"range":{"start_line":80,"start_character":0,"end_line":80,"end_character":3},"in_reply_to":"da36d5c6_8398c8c1","updated":"2017-03-01 18:57:41.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"2ff09e404954a795dabb77473bfddb46126c4419","unresolved":false,"context_lines":[{"line_number":77,"context_line":"Attributes [#]_ like :code:`description`, :code:`created_at` and :code:`updated_at`"},{"line_number":78,"context_line":"are added in [#]_."},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"You are able to define an object\u0027s primary key using :code:`primary_keys` property"},{"line_number":81,"context_line":"where one or several fields can be listed. The default is :code:`primary_keys \u003d [\u0027id\u0027]`."},{"line_number":82,"context_line":"For immutable object fields that cannot be changed, there is a"},{"line_number":83,"context_line":":code:`fields_no_update` list, and it contains :code:`primary_keys` by default."}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_6031810b","line":80,"range":{"start_line":80,"start_character":23,"end_line":80,"end_character":46},"in_reply_to":"da36d5c6_c36000d2","updated":"2017-03-01 18:57:41.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":23205,"name":"ianeta hutchinson","email":"ianeta.hutchinson@intel.com","username":"iphutch"},"change_message_id":"a0665c2a6b1f66a9c663d4ea3829adf9b2ccfe5d","unresolved":false,"context_lines":[{"line_number":80,"context_line":"You are able to define an object\u0027s primary key using :code:`primary_keys` property"},{"line_number":81,"context_line":"where one or several fields can be listed. The default is :code:`primary_keys \u003d [\u0027id\u0027]`."},{"line_number":82,"context_line":"For immutable object fields that cannot be changed, there is a"},{"line_number":83,"context_line":":code:`fields_no_update` list, and it contains :code:`primary_keys` by default."},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"If there is situation where field needs be named differently in object"},{"line_number":86,"context_line":"than in database schema, you can use :code:`fields_need_translation`."}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_ab4b7faf","line":83,"range":{"start_line":83,"start_character":31,"end_line":83,"end_character":37},"updated":"2017-02-21 17:40:50.000000000","message":"that","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"2ff09e404954a795dabb77473bfddb46126c4419","unresolved":false,"context_lines":[{"line_number":80,"context_line":"You are able to define an object\u0027s primary key using :code:`primary_keys` property"},{"line_number":81,"context_line":"where one or several fields can be listed. The default is :code:`primary_keys \u003d [\u0027id\u0027]`."},{"line_number":82,"context_line":"For immutable object fields that cannot be changed, there is a"},{"line_number":83,"context_line":":code:`fields_no_update` list, and it contains :code:`primary_keys` by default."},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"If there is situation where field needs be named differently in object"},{"line_number":86,"context_line":"than in database schema, you can use :code:`fields_need_translation`."}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_f348e92f","line":83,"range":{"start_line":83,"start_character":31,"end_line":83,"end_character":37},"in_reply_to":"da36d5c6_ab4b7faf","updated":"2017-03-01 18:57:41.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":82,"context_line":"For immutable object fields that cannot be changed, there is a"},{"line_number":83,"context_line":":code:`fields_no_update` list, and it contains :code:`primary_keys` by default."},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"If there is situation where field needs be named differently in object"},{"line_number":86,"context_line":"than in database schema, you can use :code:`fields_need_translation`."},{"line_number":87,"context_line":"This dictionary contains the name of field in the object definition (the key)"},{"line_number":88,"context_line":"and name of field in database (the value). It was created to easily"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_e38b4466","line":85,"range":{"start_line":85,"start_character":64,"end_line":85,"end_character":70},"updated":"2017-02-24 05:08:00.000000000","message":"-\u003e an object","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":23205,"name":"ianeta hutchinson","email":"ianeta.hutchinson@intel.com","username":"iphutch"},"change_message_id":"a0665c2a6b1f66a9c663d4ea3829adf9b2ccfe5d","unresolved":false,"context_lines":[{"line_number":82,"context_line":"For immutable object fields that cannot be changed, there is a"},{"line_number":83,"context_line":":code:`fields_no_update` list, and it contains :code:`primary_keys` by default."},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"If there is situation where field needs be named differently in object"},{"line_number":86,"context_line":"than in database schema, you can use :code:`fields_need_translation`."},{"line_number":87,"context_line":"This dictionary contains the name of field in the object definition (the key)"},{"line_number":88,"context_line":"and name of field in database (the value). It was created to easily"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_cbc6f315","line":85,"range":{"start_line":85,"start_character":11,"end_line":85,"end_character":12},"updated":"2017-02-21 17:40:50.000000000","message":"a","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":23205,"name":"ianeta hutchinson","email":"ianeta.hutchinson@intel.com","username":"iphutch"},"change_message_id":"a0665c2a6b1f66a9c663d4ea3829adf9b2ccfe5d","unresolved":false,"context_lines":[{"line_number":82,"context_line":"For immutable object fields that cannot be changed, there is a"},{"line_number":83,"context_line":":code:`fields_no_update` list, and it contains :code:`primary_keys` by default."},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"If there is situation where field needs be named differently in object"},{"line_number":86,"context_line":"than in database schema, you can use :code:`fields_need_translation`."},{"line_number":87,"context_line":"This dictionary contains the name of field in the object definition (the key)"},{"line_number":88,"context_line":"and name of field in database (the value). It was created to easily"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_ebcbb71c","line":85,"range":{"start_line":85,"start_character":27,"end_line":85,"end_character":28},"updated":"2017-02-21 17:40:50.000000000","message":"a","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":23205,"name":"ianeta hutchinson","email":"ianeta.hutchinson@intel.com","username":"iphutch"},"change_message_id":"a0665c2a6b1f66a9c663d4ea3829adf9b2ccfe5d","unresolved":false,"context_lines":[{"line_number":82,"context_line":"For immutable object fields that cannot be changed, there is a"},{"line_number":83,"context_line":":code:`fields_no_update` list, and it contains :code:`primary_keys` by default."},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"If there is situation where field needs be named differently in object"},{"line_number":86,"context_line":"than in database schema, you can use :code:`fields_need_translation`."},{"line_number":87,"context_line":"This dictionary contains the name of field in the object definition (the key)"},{"line_number":88,"context_line":"and name of field in database (the value). It was created to easily"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_0bd1ebcd","line":85,"range":{"start_line":85,"start_character":39,"end_line":85,"end_character":40},"updated":"2017-02-21 17:40:50.000000000","message":"to","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"2ff09e404954a795dabb77473bfddb46126c4419","unresolved":false,"context_lines":[{"line_number":82,"context_line":"For immutable object fields that cannot be changed, there is a"},{"line_number":83,"context_line":":code:`fields_no_update` list, and it contains :code:`primary_keys` by default."},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"If there is situation where field needs be named differently in object"},{"line_number":86,"context_line":"than in database schema, you can use :code:`fields_need_translation`."},{"line_number":87,"context_line":"This dictionary contains the name of field in the object definition (the key)"},{"line_number":88,"context_line":"and name of field in database (the value). It was created to easily"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_f6e4570e","line":85,"range":{"start_line":85,"start_character":39,"end_line":85,"end_character":40},"in_reply_to":"da36d5c6_0bd1ebcd","updated":"2017-03-01 18:57:41.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"2ff09e404954a795dabb77473bfddb46126c4419","unresolved":false,"context_lines":[{"line_number":82,"context_line":"For immutable object fields that cannot be changed, there is a"},{"line_number":83,"context_line":":code:`fields_no_update` list, and it contains :code:`primary_keys` by default."},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"If there is situation where field needs be named differently in object"},{"line_number":86,"context_line":"than in database schema, you can use :code:`fields_need_translation`."},{"line_number":87,"context_line":"This dictionary contains the name of field in the object definition (the key)"},{"line_number":88,"context_line":"and name of field in database (the value). It was created to easily"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_16f2cbd2","line":85,"range":{"start_line":85,"start_character":11,"end_line":85,"end_character":12},"in_reply_to":"da36d5c6_cbc6f315","updated":"2017-03-01 18:57:41.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"2ff09e404954a795dabb77473bfddb46126c4419","unresolved":false,"context_lines":[{"line_number":82,"context_line":"For immutable object fields that cannot be changed, there is a"},{"line_number":83,"context_line":":code:`fields_no_update` list, and it contains :code:`primary_keys` by default."},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"If there is situation where field needs be named differently in object"},{"line_number":86,"context_line":"than in database schema, you can use :code:`fields_need_translation`."},{"line_number":87,"context_line":"This dictionary contains the name of field in the object definition (the key)"},{"line_number":88,"context_line":"and name of field in database (the value). It was created to easily"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_56ba83e2","line":85,"range":{"start_line":85,"start_character":64,"end_line":85,"end_character":70},"in_reply_to":"da36d5c6_e38b4466","updated":"2017-03-01 18:57:41.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"2ff09e404954a795dabb77473bfddb46126c4419","unresolved":false,"context_lines":[{"line_number":82,"context_line":"For immutable object fields that cannot be changed, there is a"},{"line_number":83,"context_line":":code:`fields_no_update` list, and it contains :code:`primary_keys` by default."},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"If there is situation where field needs be named differently in object"},{"line_number":86,"context_line":"than in database schema, you can use :code:`fields_need_translation`."},{"line_number":87,"context_line":"This dictionary contains the name of field in the object definition (the key)"},{"line_number":88,"context_line":"and name of field in database (the value). It was created to easily"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_36efcfe9","line":85,"range":{"start_line":85,"start_character":27,"end_line":85,"end_character":28},"in_reply_to":"da36d5c6_ebcbb71c","updated":"2017-03-01 18:57:41.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":23205,"name":"ianeta hutchinson","email":"ianeta.hutchinson@intel.com","username":"iphutch"},"change_message_id":"a0665c2a6b1f66a9c663d4ea3829adf9b2ccfe5d","unresolved":false,"context_lines":[{"line_number":83,"context_line":":code:`fields_no_update` list, and it contains :code:`primary_keys` by default."},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"If there is situation where field needs be named differently in object"},{"line_number":86,"context_line":"than in database schema, you can use :code:`fields_need_translation`."},{"line_number":87,"context_line":"This dictionary contains the name of field in the object definition (the key)"},{"line_number":88,"context_line":"and name of field in database (the value). It was created to easily"},{"line_number":89,"context_line":"manipulate the database representation to object definition."}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_2bd6afc5","line":86,"range":{"start_line":86,"start_character":7,"end_line":86,"end_character":8},"updated":"2017-02-21 17:40:50.000000000","message":"the","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"2ff09e404954a795dabb77473bfddb46126c4419","unresolved":false,"context_lines":[{"line_number":83,"context_line":":code:`fields_no_update` list, and it contains :code:`primary_keys` by default."},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"If there is situation where field needs be named differently in object"},{"line_number":86,"context_line":"than in database schema, you can use :code:`fields_need_translation`."},{"line_number":87,"context_line":"This dictionary contains the name of field in the object definition (the key)"},{"line_number":88,"context_line":"and name of field in database (the value). It was created to easily"},{"line_number":89,"context_line":"manipulate the database representation to object definition."}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_369d0f66","line":86,"range":{"start_line":86,"start_character":7,"end_line":86,"end_character":8},"in_reply_to":"da36d5c6_2bd6afc5","updated":"2017-03-01 18:57:41.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":23205,"name":"ianeta hutchinson","email":"ianeta.hutchinson@intel.com","username":"iphutch"},"change_message_id":"a0665c2a6b1f66a9c663d4ea3829adf9b2ccfe5d","unresolved":false,"context_lines":[{"line_number":84,"context_line":""},{"line_number":85,"context_line":"If there is situation where field needs be named differently in object"},{"line_number":86,"context_line":"than in database schema, you can use :code:`fields_need_translation`."},{"line_number":87,"context_line":"This dictionary contains the name of field in the object definition (the key)"},{"line_number":88,"context_line":"and name of field in database (the value). It was created to easily"},{"line_number":89,"context_line":"manipulate the database representation to object definition."},{"line_number":90,"context_line":"For example in IP allocation pools::"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_4bdbe3ed","line":87,"range":{"start_line":87,"start_character":36,"end_line":87,"end_character":37},"updated":"2017-02-21 17:40:50.000000000","message":"the","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"2ff09e404954a795dabb77473bfddb46126c4419","unresolved":false,"context_lines":[{"line_number":84,"context_line":""},{"line_number":85,"context_line":"If there is situation where field needs be named differently in object"},{"line_number":86,"context_line":"than in database schema, you can use :code:`fields_need_translation`."},{"line_number":87,"context_line":"This dictionary contains the name of field in the object definition (the key)"},{"line_number":88,"context_line":"and name of field in database (the value). It was created to easily"},{"line_number":89,"context_line":"manipulate the database representation to object definition."},{"line_number":90,"context_line":"For example in IP allocation pools::"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_36742f34","line":87,"range":{"start_line":87,"start_character":36,"end_line":87,"end_character":37},"in_reply_to":"da36d5c6_4bdbe3ed","updated":"2017-03-01 18:57:41.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":23205,"name":"ianeta hutchinson","email":"ianeta.hutchinson@intel.com","username":"iphutch"},"change_message_id":"a0665c2a6b1f66a9c663d4ea3829adf9b2ccfe5d","unresolved":false,"context_lines":[{"line_number":85,"context_line":"If there is situation where field needs be named differently in object"},{"line_number":86,"context_line":"than in database schema, you can use :code:`fields_need_translation`."},{"line_number":87,"context_line":"This dictionary contains the name of field in the object definition (the key)"},{"line_number":88,"context_line":"and name of field in database (the value). It was created to easily"},{"line_number":89,"context_line":"manipulate the database representation to object definition."},{"line_number":90,"context_line":"For example in IP allocation pools::"},{"line_number":91,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_6bd8a7f0","line":88,"range":{"start_line":88,"start_character":3,"end_line":88,"end_character":4},"updated":"2017-02-21 17:40:50.000000000","message":"the","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":23205,"name":"ianeta hutchinson","email":"ianeta.hutchinson@intel.com","username":"iphutch"},"change_message_id":"a0665c2a6b1f66a9c663d4ea3829adf9b2ccfe5d","unresolved":false,"context_lines":[{"line_number":85,"context_line":"If there is situation where field needs be named differently in object"},{"line_number":86,"context_line":"than in database schema, you can use :code:`fields_need_translation`."},{"line_number":87,"context_line":"This dictionary contains the name of field in the object definition (the key)"},{"line_number":88,"context_line":"and name of field in database (the value). It was created to easily"},{"line_number":89,"context_line":"manipulate the database representation to object definition."},{"line_number":90,"context_line":"For example in IP allocation pools::"},{"line_number":91,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_8be5dba9","line":88,"range":{"start_line":88,"start_character":11,"end_line":88,"end_character":12},"updated":"2017-02-21 17:40:50.000000000","message":"the","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":23205,"name":"ianeta hutchinson","email":"ianeta.hutchinson@intel.com","username":"iphutch"},"change_message_id":"a0665c2a6b1f66a9c663d4ea3829adf9b2ccfe5d","unresolved":false,"context_lines":[{"line_number":85,"context_line":"If there is situation where field needs be named differently in object"},{"line_number":86,"context_line":"than in database schema, you can use :code:`fields_need_translation`."},{"line_number":87,"context_line":"This dictionary contains the name of field in the object definition (the key)"},{"line_number":88,"context_line":"and name of field in database (the value). It was created to easily"},{"line_number":89,"context_line":"manipulate the database representation to object definition."},{"line_number":90,"context_line":"For example in IP allocation pools::"},{"line_number":91,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_abe29f9d","line":88,"range":{"start_line":88,"start_character":20,"end_line":88,"end_character":21},"updated":"2017-02-21 17:40:50.000000000","message":"the","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"2ff09e404954a795dabb77473bfddb46126c4419","unresolved":false,"context_lines":[{"line_number":85,"context_line":"If there is situation where field needs be named differently in object"},{"line_number":86,"context_line":"than in database schema, you can use :code:`fields_need_translation`."},{"line_number":87,"context_line":"This dictionary contains the name of field in the object definition (the key)"},{"line_number":88,"context_line":"and name of field in database (the value). It was created to easily"},{"line_number":89,"context_line":"manipulate the database representation to object definition."},{"line_number":90,"context_line":"For example in IP allocation pools::"},{"line_number":91,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_16c56b3b","line":88,"range":{"start_line":88,"start_character":3,"end_line":88,"end_character":4},"in_reply_to":"da36d5c6_6bd8a7f0","updated":"2017-03-01 18:57:41.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"2ff09e404954a795dabb77473bfddb46126c4419","unresolved":false,"context_lines":[{"line_number":85,"context_line":"If there is situation where field needs be named differently in object"},{"line_number":86,"context_line":"than in database schema, you can use :code:`fields_need_translation`."},{"line_number":87,"context_line":"This dictionary contains the name of field in the object definition (the key)"},{"line_number":88,"context_line":"and name of field in database (the value). It was created to easily"},{"line_number":89,"context_line":"manipulate the database representation to object definition."},{"line_number":90,"context_line":"For example in IP allocation pools::"},{"line_number":91,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_56dd2313","line":88,"range":{"start_line":88,"start_character":11,"end_line":88,"end_character":12},"in_reply_to":"da36d5c6_8be5dba9","updated":"2017-03-01 18:57:41.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"2ff09e404954a795dabb77473bfddb46126c4419","unresolved":false,"context_lines":[{"line_number":85,"context_line":"If there is situation where field needs be named differently in object"},{"line_number":86,"context_line":"than in database schema, you can use :code:`fields_need_translation`."},{"line_number":87,"context_line":"This dictionary contains the name of field in the object definition (the key)"},{"line_number":88,"context_line":"and name of field in database (the value). It was created to easily"},{"line_number":89,"context_line":"manipulate the database representation to object definition."},{"line_number":90,"context_line":"For example in IP allocation pools::"},{"line_number":91,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_b6ec9fc8","line":88,"range":{"start_line":88,"start_character":20,"end_line":88,"end_character":21},"in_reply_to":"da36d5c6_abe29f9d","updated":"2017-03-01 18:57:41.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":85,"context_line":"If there is situation where field needs be named differently in object"},{"line_number":86,"context_line":"than in database schema, you can use :code:`fields_need_translation`."},{"line_number":87,"context_line":"This dictionary contains the name of field in the object definition (the key)"},{"line_number":88,"context_line":"and name of field in database (the value). It was created to easily"},{"line_number":89,"context_line":"manipulate the database representation to object definition."},{"line_number":90,"context_line":"For example in IP allocation pools::"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    fields_need_translation \u003d {"},{"line_number":93,"context_line":"        \u0027start\u0027: \u0027first_ip\u0027,"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_a3c30c88","line":90,"range":{"start_line":88,"start_character":42,"end_line":90,"end_character":36},"updated":"2017-02-24 05:08:00.000000000","message":"-\u003e This allows to have a different object layer representation for database persisted data.","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"2ff09e404954a795dabb77473bfddb46126c4419","unresolved":false,"context_lines":[{"line_number":85,"context_line":"If there is situation where field needs be named differently in object"},{"line_number":86,"context_line":"than in database schema, you can use :code:`fields_need_translation`."},{"line_number":87,"context_line":"This dictionary contains the name of field in the object definition (the key)"},{"line_number":88,"context_line":"and name of field in database (the value). It was created to easily"},{"line_number":89,"context_line":"manipulate the database representation to object definition."},{"line_number":90,"context_line":"For example in IP allocation pools::"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    fields_need_translation \u003d {"},{"line_number":93,"context_line":"        \u0027start\u0027: \u0027first_ip\u0027,"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_76306757","line":90,"range":{"start_line":88,"start_character":42,"end_line":90,"end_character":36},"in_reply_to":"da36d5c6_a3c30c88","updated":"2017-03-01 18:57:41.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":90,"context_line":"For example in IP allocation pools::"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    fields_need_translation \u003d {"},{"line_number":93,"context_line":"        \u0027start\u0027: \u0027first_ip\u0027,"},{"line_number":94,"context_line":"        \u0027end\u0027: \u0027last_ip\u0027"},{"line_number":95,"context_line":"    }"},{"line_number":96,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_1124155e","line":93,"updated":"2017-02-24 05:08:00.000000000","message":"would make sense to explain each line with a inline comment before it","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"2ff09e404954a795dabb77473bfddb46126c4419","unresolved":false,"context_lines":[{"line_number":90,"context_line":"For example in IP allocation pools::"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    fields_need_translation \u003d {"},{"line_number":93,"context_line":"        \u0027start\u0027: \u0027first_ip\u0027,"},{"line_number":94,"context_line":"        \u0027end\u0027: \u0027last_ip\u0027"},{"line_number":95,"context_line":"    }"},{"line_number":96,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_b1f829e7","line":93,"in_reply_to":"da36d5c6_1124155e","updated":"2017-03-01 18:57:41.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":23205,"name":"ianeta hutchinson","email":"ianeta.hutchinson@intel.com","username":"iphutch"},"change_message_id":"a0665c2a6b1f66a9c663d4ea3829adf9b2ccfe5d","unresolved":false,"context_lines":[{"line_number":95,"context_line":"    }"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"Above dict is used in :code:`modify_fields_from_db` and in :code:`modify_fields_to_db`"},{"line_number":99,"context_line":"methods which are implemented in base class and will translate the software layer"},{"line_number":100,"context_line":"to database schema naming. It can be also used in :code:`orm.relationship` names"},{"line_number":101,"context_line":"mapping, when relationship in DB model is named differently than in object model."}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_cbed1390","line":98,"range":{"start_line":98,"start_character":0,"end_line":98,"end_character":10},"updated":"2017-02-21 17:40:50.000000000","message":"The above dictionary","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"2ff09e404954a795dabb77473bfddb46126c4419","unresolved":false,"context_lines":[{"line_number":95,"context_line":"    }"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"Above dict is used in :code:`modify_fields_from_db` and in :code:`modify_fields_to_db`"},{"line_number":99,"context_line":"methods which are implemented in base class and will translate the software layer"},{"line_number":100,"context_line":"to database schema naming. It can be also used in :code:`orm.relationship` names"},{"line_number":101,"context_line":"mapping, when relationship in DB model is named differently than in object model."}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_f1daa177","line":98,"range":{"start_line":98,"start_character":0,"end_line":98,"end_character":10},"in_reply_to":"da36d5c6_cbed1390","updated":"2017-03-01 18:57:41.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":97,"context_line":""},{"line_number":98,"context_line":"Above dict is used in :code:`modify_fields_from_db` and in :code:`modify_fields_to_db`"},{"line_number":99,"context_line":"methods which are implemented in base class and will translate the software layer"},{"line_number":100,"context_line":"to database schema naming. It can be also used in :code:`orm.relationship` names"},{"line_number":101,"context_line":"mapping, when relationship in DB model is named differently than in object model."},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"When talking about relationship, for :code:`NeutronDbObject` there is defined"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_233e3c8c","line":100,"range":{"start_line":100,"start_character":19,"end_line":100,"end_character":25},"updated":"2017-02-24 05:08:00.000000000","message":"-\u003e , and vice versa","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":23205,"name":"ianeta hutchinson","email":"ianeta.hutchinson@intel.com","username":"iphutch"},"change_message_id":"a0665c2a6b1f66a9c663d4ea3829adf9b2ccfe5d","unresolved":false,"context_lines":[{"line_number":97,"context_line":""},{"line_number":98,"context_line":"Above dict is used in :code:`modify_fields_from_db` and in :code:`modify_fields_to_db`"},{"line_number":99,"context_line":"methods which are implemented in base class and will translate the software layer"},{"line_number":100,"context_line":"to database schema naming. It can be also used in :code:`orm.relationship` names"},{"line_number":101,"context_line":"mapping, when relationship in DB model is named differently than in object model."},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"When talking about relationship, for :code:`NeutronDbObject` there is defined"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_0be80b7c","line":100,"range":{"start_line":100,"start_character":34,"end_line":100,"end_character":41},"updated":"2017-02-21 17:40:50.000000000","message":"also be","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"2ff09e404954a795dabb77473bfddb46126c4419","unresolved":false,"context_lines":[{"line_number":97,"context_line":""},{"line_number":98,"context_line":"Above dict is used in :code:`modify_fields_from_db` and in :code:`modify_fields_to_db`"},{"line_number":99,"context_line":"methods which are implemented in base class and will translate the software layer"},{"line_number":100,"context_line":"to database schema naming. It can be also used in :code:`orm.relationship` names"},{"line_number":101,"context_line":"mapping, when relationship in DB model is named differently than in object model."},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"When talking about relationship, for :code:`NeutronDbObject` there is defined"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_315359e3","line":100,"range":{"start_line":100,"start_character":34,"end_line":100,"end_character":41},"in_reply_to":"da36d5c6_0be80b7c","updated":"2017-03-01 18:57:41.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"2ff09e404954a795dabb77473bfddb46126c4419","unresolved":false,"context_lines":[{"line_number":97,"context_line":""},{"line_number":98,"context_line":"Above dict is used in :code:`modify_fields_from_db` and in :code:`modify_fields_to_db`"},{"line_number":99,"context_line":"methods which are implemented in base class and will translate the software layer"},{"line_number":100,"context_line":"to database schema naming. It can be also used in :code:`orm.relationship` names"},{"line_number":101,"context_line":"mapping, when relationship in DB model is named differently than in object model."},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"When talking about relationship, for :code:`NeutronDbObject` there is defined"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_716311b2","line":100,"range":{"start_line":100,"start_character":19,"end_line":100,"end_character":25},"in_reply_to":"da36d5c6_233e3c8c","updated":"2017-03-01 18:57:41.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":97,"context_line":""},{"line_number":98,"context_line":"Above dict is used in :code:`modify_fields_from_db` and in :code:`modify_fields_to_db`"},{"line_number":99,"context_line":"methods which are implemented in base class and will translate the software layer"},{"line_number":100,"context_line":"to database schema naming. It can be also used in :code:`orm.relationship` names"},{"line_number":101,"context_line":"mapping, when relationship in DB model is named differently than in object model."},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"When talking about relationship, for :code:`NeutronDbObject` there is defined"},{"line_number":104,"context_line":":code:`synthetic_fields` property, which is a new concept introduced for neutron."}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_23655cb4","line":101,"range":{"start_line":100,"start_character":27,"end_line":101,"end_character":81},"updated":"2017-02-24 05:08:00.000000000","message":"It can also be used to rename orm.relationship backed object-typed fields.","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":23205,"name":"ianeta hutchinson","email":"ianeta.hutchinson@intel.com","username":"iphutch"},"change_message_id":"a0665c2a6b1f66a9c663d4ea3829adf9b2ccfe5d","unresolved":false,"context_lines":[{"line_number":98,"context_line":"Above dict is used in :code:`modify_fields_from_db` and in :code:`modify_fields_to_db`"},{"line_number":99,"context_line":"methods which are implemented in base class and will translate the software layer"},{"line_number":100,"context_line":"to database schema naming. It can be also used in :code:`orm.relationship` names"},{"line_number":101,"context_line":"mapping, when relationship in DB model is named differently than in object model."},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"When talking about relationship, for :code:`NeutronDbObject` there is defined"},{"line_number":104,"context_line":":code:`synthetic_fields` property, which is a new concept introduced for neutron."}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_4b020340","line":101,"range":{"start_line":101,"start_character":67,"end_line":101,"end_character":68},"updated":"2017-02-21 17:40:50.000000000","message":"the","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":23205,"name":"ianeta hutchinson","email":"ianeta.hutchinson@intel.com","username":"iphutch"},"change_message_id":"a0665c2a6b1f66a9c663d4ea3829adf9b2ccfe5d","unresolved":false,"context_lines":[{"line_number":98,"context_line":"Above dict is used in :code:`modify_fields_from_db` and in :code:`modify_fields_to_db`"},{"line_number":99,"context_line":"methods which are implemented in base class and will translate the software layer"},{"line_number":100,"context_line":"to database schema naming. It can be also used in :code:`orm.relationship` names"},{"line_number":101,"context_line":"mapping, when relationship in DB model is named differently than in object model."},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"When talking about relationship, for :code:`NeutronDbObject` there is defined"},{"line_number":104,"context_line":":code:`synthetic_fields` property, which is a new concept introduced for neutron."}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_2bedcf8b","line":101,"range":{"start_line":101,"start_character":13,"end_line":101,"end_character":30},"updated":"2017-02-21 17:40:50.000000000","message":"the relationship in the","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"2ff09e404954a795dabb77473bfddb46126c4419","unresolved":false,"context_lines":[{"line_number":97,"context_line":""},{"line_number":98,"context_line":"Above dict is used in :code:`modify_fields_from_db` and in :code:`modify_fields_to_db`"},{"line_number":99,"context_line":"methods which are implemented in base class and will translate the software layer"},{"line_number":100,"context_line":"to database schema naming. It can be also used in :code:`orm.relationship` names"},{"line_number":101,"context_line":"mapping, when relationship in DB model is named differently than in object model."},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"When talking about relationship, for :code:`NeutronDbObject` there is defined"},{"line_number":104,"context_line":":code:`synthetic_fields` property, which is a new concept introduced for neutron."}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_910fa5e0","line":101,"range":{"start_line":100,"start_character":27,"end_line":101,"end_character":81},"in_reply_to":"da36d5c6_23655cb4","updated":"2017-03-01 18:57:41.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"2ff09e404954a795dabb77473bfddb46126c4419","unresolved":false,"context_lines":[{"line_number":98,"context_line":"Above dict is used in :code:`modify_fields_from_db` and in :code:`modify_fields_to_db`"},{"line_number":99,"context_line":"methods which are implemented in base class and will translate the software layer"},{"line_number":100,"context_line":"to database schema naming. It can be also used in :code:`orm.relationship` names"},{"line_number":101,"context_line":"mapping, when relationship in DB model is named differently than in object model."},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"When talking about relationship, for :code:`NeutronDbObject` there is defined"},{"line_number":104,"context_line":":code:`synthetic_fields` property, which is a new concept introduced for neutron."}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_d1f91dca","line":101,"range":{"start_line":101,"start_character":13,"end_line":101,"end_character":30},"in_reply_to":"da36d5c6_2bedcf8b","updated":"2017-03-01 18:57:41.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"2ff09e404954a795dabb77473bfddb46126c4419","unresolved":false,"context_lines":[{"line_number":98,"context_line":"Above dict is used in :code:`modify_fields_from_db` and in :code:`modify_fields_to_db`"},{"line_number":99,"context_line":"methods which are implemented in base class and will translate the software layer"},{"line_number":100,"context_line":"to database schema naming. It can be also used in :code:`orm.relationship` names"},{"line_number":101,"context_line":"mapping, when relationship in DB model is named differently than in object model."},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"When talking about relationship, for :code:`NeutronDbObject` there is defined"},{"line_number":104,"context_line":":code:`synthetic_fields` property, which is a new concept introduced for neutron."}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_f1f621d6","line":101,"range":{"start_line":101,"start_character":67,"end_line":101,"end_character":68},"in_reply_to":"da36d5c6_4b020340","updated":"2017-03-01 18:57:41.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":23205,"name":"ianeta hutchinson","email":"ianeta.hutchinson@intel.com","username":"iphutch"},"change_message_id":"a0665c2a6b1f66a9c663d4ea3829adf9b2ccfe5d","unresolved":false,"context_lines":[{"line_number":100,"context_line":"to database schema naming. It can be also used in :code:`orm.relationship` names"},{"line_number":101,"context_line":"mapping, when relationship in DB model is named differently than in object model."},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"When talking about relationship, for :code:`NeutronDbObject` there is defined"},{"line_number":104,"context_line":":code:`synthetic_fields` property, which is a new concept introduced for neutron."},{"line_number":105,"context_line":"It is a list of fields that are not directly defined in DB model, but are referenced"},{"line_number":106,"context_line":"as :code:`orm.relationship` or computed at runtime in neutron code."}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_6bffc734","line":103,"range":{"start_line":103,"start_character":69,"end_line":103,"end_character":70},"updated":"2017-02-21 17:40:50.000000000","message":"a","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":23205,"name":"ianeta hutchinson","email":"ianeta.hutchinson@intel.com","username":"iphutch"},"change_message_id":"a0665c2a6b1f66a9c663d4ea3829adf9b2ccfe5d","unresolved":false,"context_lines":[{"line_number":102,"context_line":""},{"line_number":103,"context_line":"When talking about relationship, for :code:`NeutronDbObject` there is defined"},{"line_number":104,"context_line":":code:`synthetic_fields` property, which is a new concept introduced for neutron."},{"line_number":105,"context_line":"It is a list of fields that are not directly defined in DB model, but are referenced"},{"line_number":106,"context_line":"as :code:`orm.relationship` or computed at runtime in neutron code."},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"In order to automatically populate the :code:`synthetic_fields`, the :code:`foreign_keys`"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_abf9bf4f","line":105,"range":{"start_line":105,"start_character":55,"end_line":105,"end_character":56},"updated":"2017-02-21 17:40:50.000000000","message":"the","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":100,"context_line":"to database schema naming. It can be also used in :code:`orm.relationship` names"},{"line_number":101,"context_line":"mapping, when relationship in DB model is named differently than in object model."},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"When talking about relationship, for :code:`NeutronDbObject` there is defined"},{"line_number":104,"context_line":":code:`synthetic_fields` property, which is a new concept introduced for neutron."},{"line_number":105,"context_line":"It is a list of fields that are not directly defined in DB model, but are referenced"},{"line_number":106,"context_line":"as :code:`orm.relationship` or computed at runtime in neutron code."},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"In order to automatically populate the :code:`synthetic_fields`, the :code:`foreign_keys`"},{"line_number":109,"context_line":"property is introduced. :code:`load_synthetic_db_fields` [#]_ method from NeutronDbObject"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_36474f78","line":106,"range":{"start_line":103,"start_character":0,"end_line":106,"end_character":67},"updated":"2017-02-24 05:08:00.000000000","message":"Let\u0027s word it in this way: Most object fields are usually directly mapped to database model attributes. Sometimes it\u0027s useful to expose attributes that are not defined in the model table itself, like relationships and such. In this case, synthetic_fields may become handy. This object property can define a list a object fields that don\u0027t belong to the object database model and that are hence instead to be implemented in some custom way. Some of those fields map to orm.relationships defined on models, while others are completely untangled from the database layer.","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"2ff09e404954a795dabb77473bfddb46126c4419","unresolved":false,"context_lines":[{"line_number":100,"context_line":"to database schema naming. It can be also used in :code:`orm.relationship` names"},{"line_number":101,"context_line":"mapping, when relationship in DB model is named differently than in object model."},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"When talking about relationship, for :code:`NeutronDbObject` there is defined"},{"line_number":104,"context_line":":code:`synthetic_fields` property, which is a new concept introduced for neutron."},{"line_number":105,"context_line":"It is a list of fields that are not directly defined in DB model, but are referenced"},{"line_number":106,"context_line":"as :code:`orm.relationship` or computed at runtime in neutron code."},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"In order to automatically populate the :code:`synthetic_fields`, the :code:`foreign_keys`"},{"line_number":109,"context_line":"property is introduced. :code:`load_synthetic_db_fields` [#]_ method from NeutronDbObject"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_d17cbd22","line":106,"range":{"start_line":103,"start_character":0,"end_line":106,"end_character":67},"in_reply_to":"da36d5c6_36474f78","updated":"2017-03-01 18:57:41.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":105,"context_line":"It is a list of fields that are not directly defined in DB model, but are referenced"},{"line_number":106,"context_line":"as :code:`orm.relationship` or computed at runtime in neutron code."},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"In order to automatically populate the :code:`synthetic_fields`, the :code:`foreign_keys`"},{"line_number":109,"context_line":"property is introduced. :code:`load_synthetic_db_fields` [#]_ method from NeutronDbObject"},{"line_number":110,"context_line":"uses :code:`foreign_keys` to match the foreign key in related object and local"},{"line_number":111,"context_line":"field that the foreign key is referring to. For example:"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":".. code-block:: Python"},{"line_number":114,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_962d5baa","line":111,"range":{"start_line":108,"start_character":0,"end_line":111,"end_character":56},"updated":"2017-02-24 05:08:00.000000000","message":"Let\u0027s start with describing the intent.\n\n\u0027When exposing existing orm.relationships as an ObjectField-typed field, you can use the \u0027foreign_keys\u0027 object property that defines a link between two object types. When used, it allows objects framework to automatically instantiate child objects, and fill the relevant parent fields, based on orm.relationships defined on parent models.\u0027 Then go with technical details.","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"2ff09e404954a795dabb77473bfddb46126c4419","unresolved":false,"context_lines":[{"line_number":105,"context_line":"It is a list of fields that are not directly defined in DB model, but are referenced"},{"line_number":106,"context_line":"as :code:`orm.relationship` or computed at runtime in neutron code."},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"In order to automatically populate the :code:`synthetic_fields`, the :code:`foreign_keys`"},{"line_number":109,"context_line":"property is introduced. :code:`load_synthetic_db_fields` [#]_ method from NeutronDbObject"},{"line_number":110,"context_line":"uses :code:`foreign_keys` to match the foreign key in related object and local"},{"line_number":111,"context_line":"field that the foreign key is referring to. For example:"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":".. code-block:: Python"},{"line_number":114,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_114ad5c5","line":111,"range":{"start_line":108,"start_character":0,"end_line":111,"end_character":56},"in_reply_to":"da36d5c6_962d5baa","updated":"2017-03-01 18:57:41.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":112,"context_line":""},{"line_number":113,"context_line":".. code-block:: Python"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"    class SubnetSqlModel():"},{"line_number":116,"context_line":"        id \u003d sa.Column(sa.String(36), primary_key\u003dTrue)"},{"line_number":117,"context_line":"        allocation_pools \u003d orm.relationship(IPAllocationPool)"},{"line_number":118,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_36158f48","line":115,"updated":"2017-02-24 05:08:00.000000000","message":"I believe since we still do python2, you should inherit from object? Or better, should we use declarative BASE class?","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":112,"context_line":""},{"line_number":113,"context_line":".. code-block:: Python"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"    class SubnetSqlModel():"},{"line_number":116,"context_line":"        id \u003d sa.Column(sa.String(36), primary_key\u003dTrue)"},{"line_number":117,"context_line":"        allocation_pools \u003d orm.relationship(IPAllocationPool)"},{"line_number":118,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_5115ad3d","line":115,"range":{"start_line":115,"start_character":16,"end_line":115,"end_character":24},"updated":"2017-02-24 05:08:00.000000000","message":"Not sure it\u0027s ok to have that suffix in place: we don\u0027t use it in real code, so consider dropping it.","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"2ff09e404954a795dabb77473bfddb46126c4419","unresolved":false,"context_lines":[{"line_number":112,"context_line":""},{"line_number":113,"context_line":".. code-block:: Python"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"    class SubnetSqlModel():"},{"line_number":116,"context_line":"        id \u003d sa.Column(sa.String(36), primary_key\u003dTrue)"},{"line_number":117,"context_line":"        allocation_pools \u003d orm.relationship(IPAllocationPool)"},{"line_number":118,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_ec93aaa1","line":115,"in_reply_to":"da36d5c6_36158f48","updated":"2017-03-01 18:57:41.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"2ff09e404954a795dabb77473bfddb46126c4419","unresolved":false,"context_lines":[{"line_number":112,"context_line":""},{"line_number":113,"context_line":".. code-block:: Python"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"    class SubnetSqlModel():"},{"line_number":116,"context_line":"        id \u003d sa.Column(sa.String(36), primary_key\u003dTrue)"},{"line_number":117,"context_line":"        allocation_pools \u003d orm.relationship(IPAllocationPool)"},{"line_number":118,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_0c91de99","line":115,"range":{"start_line":115,"start_character":16,"end_line":115,"end_character":24},"in_reply_to":"da36d5c6_5115ad3d","updated":"2017-03-01 18:57:41.000000000","message":"I\u0027ve left suffixes to differentiate OVO from SQL Models","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":120,"context_line":"        id \u003d sa.Column(sa.String(36), primary_key\u003dTrue)"},{"line_number":121,"context_line":"        subnet_id \u003d sa.Column(sa.String(36), sa.ForeignKey(\u0027subnets.id\u0027))"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    class SubnetOVO(NeutronDbObject):"},{"line_number":124,"context_line":"        fields \u003d {"},{"line_number":125,"context_line":"            \u0027id\u0027: obj_fields.UUIDField()"},{"line_number":126,"context_line":"            \u0027allocation_pools\u0027: obj_fields.ListOfObjectsField(\u0027IPAllocationPool\u0027,"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_1155f5f8","line":123,"updated":"2017-02-24 05:08:00.000000000","message":"it\u0027s usually base.NeutronDbObject, right?","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"2ff09e404954a795dabb77473bfddb46126c4419","unresolved":false,"context_lines":[{"line_number":120,"context_line":"        id \u003d sa.Column(sa.String(36), primary_key\u003dTrue)"},{"line_number":121,"context_line":"        subnet_id \u003d sa.Column(sa.String(36), sa.ForeignKey(\u0027subnets.id\u0027))"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    class SubnetOVO(NeutronDbObject):"},{"line_number":124,"context_line":"        fields \u003d {"},{"line_number":125,"context_line":"            \u0027id\u0027: obj_fields.UUIDField()"},{"line_number":126,"context_line":"            \u0027allocation_pools\u0027: obj_fields.ListOfObjectsField(\u0027IPAllocationPool\u0027,"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_4c0596c0","line":123,"in_reply_to":"da36d5c6_1155f5f8","updated":"2017-03-01 18:57:41.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    class SubnetOVO(NeutronDbObject):"},{"line_number":124,"context_line":"        fields \u003d {"},{"line_number":125,"context_line":"            \u0027id\u0027: obj_fields.UUIDField()"},{"line_number":126,"context_line":"            \u0027allocation_pools\u0027: obj_fields.ListOfObjectsField(\u0027IPAllocationPool\u0027,"},{"line_number":127,"context_line":"                                                              nullable\u003dTrue)"},{"line_number":128,"context_line":"        }"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_7112b158","line":125,"updated":"2017-02-24 05:08:00.000000000","message":"missing comma","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"2ff09e404954a795dabb77473bfddb46126c4419","unresolved":false,"context_lines":[{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    class SubnetOVO(NeutronDbObject):"},{"line_number":124,"context_line":"        fields \u003d {"},{"line_number":125,"context_line":"            \u0027id\u0027: obj_fields.UUIDField()"},{"line_number":126,"context_line":"            \u0027allocation_pools\u0027: obj_fields.ListOfObjectsField(\u0027IPAllocationPool\u0027,"},{"line_number":127,"context_line":"                                                              nullable\u003dTrue)"},{"line_number":128,"context_line":"        }"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_8c0f8ee0","line":125,"in_reply_to":"da36d5c6_7112b158","updated":"2017-03-01 18:57:41.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":126,"context_line":"            \u0027allocation_pools\u0027: obj_fields.ListOfObjectsField(\u0027IPAllocationPool\u0027,"},{"line_number":127,"context_line":"                                                              nullable\u003dTrue)"},{"line_number":128,"context_line":"        }"},{"line_number":129,"context_line":"        primary_keys \u003d [\u0027id\u0027]"},{"line_number":130,"context_line":"        synthetic_fields \u003d [\u0027allocation_pools\u0027]"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"    class IPAllocationPoolOVO(NeutronDbObject):"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_b118a976","line":129,"updated":"2017-02-24 05:08:00.000000000","message":"since it\u0027s default, it\u0027s not needed. Remove.","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"2ff09e404954a795dabb77473bfddb46126c4419","unresolved":false,"context_lines":[{"line_number":126,"context_line":"            \u0027allocation_pools\u0027: obj_fields.ListOfObjectsField(\u0027IPAllocationPool\u0027,"},{"line_number":127,"context_line":"                                                              nullable\u003dTrue)"},{"line_number":128,"context_line":"        }"},{"line_number":129,"context_line":"        primary_keys \u003d [\u0027id\u0027]"},{"line_number":130,"context_line":"        synthetic_fields \u003d [\u0027allocation_pools\u0027]"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"    class IPAllocationPoolOVO(NeutronDbObject):"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_a75d4beb","line":129,"in_reply_to":"da36d5c6_b118a976","updated":"2017-03-01 18:57:41.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":129,"context_line":"        primary_keys \u003d [\u0027id\u0027]"},{"line_number":130,"context_line":"        synthetic_fields \u003d [\u0027allocation_pools\u0027]"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"    class IPAllocationPoolOVO(NeutronDbObject):"},{"line_number":133,"context_line":"        fields \u003d {"},{"line_number":134,"context_line":"            \u0027id\u0027: obj_fields.UUIDField(),"},{"line_number":135,"context_line":"            \u0027subnet_id\u0027: obj_fields.UUIDField()"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_111ed55e","line":132,"range":{"start_line":132,"start_character":10,"end_line":132,"end_character":29},"updated":"2017-02-24 05:08:00.000000000","message":"Shouldn\u0027t this name reflect the one used in line 126?","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":129,"context_line":"        primary_keys \u003d [\u0027id\u0027]"},{"line_number":130,"context_line":"        synthetic_fields \u003d [\u0027allocation_pools\u0027]"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"    class IPAllocationPoolOVO(NeutronDbObject):"},{"line_number":133,"context_line":"        fields \u003d {"},{"line_number":134,"context_line":"            \u0027id\u0027: obj_fields.UUIDField(),"},{"line_number":135,"context_line":"            \u0027subnet_id\u0027: obj_fields.UUIDField()"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_d14efd6d","line":132,"range":{"start_line":132,"start_character":30,"end_line":132,"end_character":45},"updated":"2017-02-24 05:08:00.000000000","message":"it\u0027s usually base.NeutronDbObject, right?","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"2ff09e404954a795dabb77473bfddb46126c4419","unresolved":false,"context_lines":[{"line_number":129,"context_line":"        primary_keys \u003d [\u0027id\u0027]"},{"line_number":130,"context_line":"        synthetic_fields \u003d [\u0027allocation_pools\u0027]"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"    class IPAllocationPoolOVO(NeutronDbObject):"},{"line_number":133,"context_line":"        fields \u003d {"},{"line_number":134,"context_line":"            \u0027id\u0027: obj_fields.UUIDField(),"},{"line_number":135,"context_line":"            \u0027subnet_id\u0027: obj_fields.UUIDField()"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_a7038b72","line":132,"range":{"start_line":132,"start_character":10,"end_line":132,"end_character":29},"in_reply_to":"da36d5c6_111ed55e","updated":"2017-03-01 18:57:41.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"2ff09e404954a795dabb77473bfddb46126c4419","unresolved":false,"context_lines":[{"line_number":129,"context_line":"        primary_keys \u003d [\u0027id\u0027]"},{"line_number":130,"context_line":"        synthetic_fields \u003d [\u0027allocation_pools\u0027]"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"    class IPAllocationPoolOVO(NeutronDbObject):"},{"line_number":133,"context_line":"        fields \u003d {"},{"line_number":134,"context_line":"            \u0027id\u0027: obj_fields.UUIDField(),"},{"line_number":135,"context_line":"            \u0027subnet_id\u0027: obj_fields.UUIDField()"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_472bafeb","line":132,"range":{"start_line":132,"start_character":30,"end_line":132,"end_character":45},"in_reply_to":"da36d5c6_d14efd6d","updated":"2017-03-01 18:57:41.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":134,"context_line":"            \u0027id\u0027: obj_fields.UUIDField(),"},{"line_number":135,"context_line":"            \u0027subnet_id\u0027: obj_fields.UUIDField()"},{"line_number":136,"context_line":"        }"},{"line_number":137,"context_line":"        primary_keys \u003d [\u0027id\u0027]"},{"line_number":138,"context_line":"        foreign_keys \u003d {\u0027Subnet\u0027: {\u0027subnet_id\u0027: \u0027id\u0027}}"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"The :code:`foreign_keys` is used in :code:`SubnetOVO` to populate the"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_7139d1d6","line":137,"updated":"2017-02-24 05:08:00.000000000","message":"remove the line, it\u0027s not needed","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"2ff09e404954a795dabb77473bfddb46126c4419","unresolved":false,"context_lines":[{"line_number":134,"context_line":"            \u0027id\u0027: obj_fields.UUIDField(),"},{"line_number":135,"context_line":"            \u0027subnet_id\u0027: obj_fields.UUIDField()"},{"line_number":136,"context_line":"        }"},{"line_number":137,"context_line":"        primary_keys \u003d [\u0027id\u0027]"},{"line_number":138,"context_line":"        foreign_keys \u003d {\u0027Subnet\u0027: {\u0027subnet_id\u0027: \u0027id\u0027}}"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"The :code:`foreign_keys` is used in :code:`SubnetOVO` to populate the"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_2c0142af","line":137,"in_reply_to":"da36d5c6_7139d1d6","updated":"2017-03-01 18:57:41.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":135,"context_line":"            \u0027subnet_id\u0027: obj_fields.UUIDField()"},{"line_number":136,"context_line":"        }"},{"line_number":137,"context_line":"        primary_keys \u003d [\u0027id\u0027]"},{"line_number":138,"context_line":"        foreign_keys \u003d {\u0027Subnet\u0027: {\u0027subnet_id\u0027: \u0027id\u0027}}"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"The :code:`foreign_keys` is used in :code:`SubnetOVO` to populate the"},{"line_number":141,"context_line":":code:`allocation_pools` [#]_ synthetic field using the :code:`IPAllocationPoolOVO`"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_315af92a","line":138,"range":{"start_line":138,"start_character":25,"end_line":138,"end_character":32},"updated":"2017-02-24 05:08:00.000000000","message":"Shouldn\u0027t the name reflect one from line 123?","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":135,"context_line":"            \u0027subnet_id\u0027: obj_fields.UUIDField()"},{"line_number":136,"context_line":"        }"},{"line_number":137,"context_line":"        primary_keys \u003d [\u0027id\u0027]"},{"line_number":138,"context_line":"        foreign_keys \u003d {\u0027Subnet\u0027: {\u0027subnet_id\u0027: \u0027id\u0027}}"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"The :code:`foreign_keys` is used in :code:`SubnetOVO` to populate the"},{"line_number":141,"context_line":":code:`allocation_pools` [#]_ synthetic field using the :code:`IPAllocationPoolOVO`"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_31e039fa","line":138,"range":{"start_line":138,"start_character":8,"end_line":138,"end_character":20},"updated":"2017-02-24 05:08:00.000000000","message":"for each line that introduces a new concept, consider adding a inline comment explaining the intent","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"2ff09e404954a795dabb77473bfddb46126c4419","unresolved":false,"context_lines":[{"line_number":135,"context_line":"            \u0027subnet_id\u0027: obj_fields.UUIDField()"},{"line_number":136,"context_line":"        }"},{"line_number":137,"context_line":"        primary_keys \u003d [\u0027id\u0027]"},{"line_number":138,"context_line":"        foreign_keys \u003d {\u0027Subnet\u0027: {\u0027subnet_id\u0027: \u0027id\u0027}}"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"The :code:`foreign_keys` is used in :code:`SubnetOVO` to populate the"},{"line_number":141,"context_line":":code:`allocation_pools` [#]_ synthetic field using the :code:`IPAllocationPoolOVO`"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_c7f87f7f","line":138,"range":{"start_line":138,"start_character":25,"end_line":138,"end_character":32},"in_reply_to":"da36d5c6_315af92a","updated":"2017-03-01 18:57:41.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"2ff09e404954a795dabb77473bfddb46126c4419","unresolved":false,"context_lines":[{"line_number":135,"context_line":"            \u0027subnet_id\u0027: obj_fields.UUIDField()"},{"line_number":136,"context_line":"        }"},{"line_number":137,"context_line":"        primary_keys \u003d [\u0027id\u0027]"},{"line_number":138,"context_line":"        foreign_keys \u003d {\u0027Subnet\u0027: {\u0027subnet_id\u0027: \u0027id\u0027}}"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"The :code:`foreign_keys` is used in :code:`SubnetOVO` to populate the"},{"line_number":141,"context_line":":code:`allocation_pools` [#]_ synthetic field using the :code:`IPAllocationPoolOVO`"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_07f3779f","line":138,"range":{"start_line":138,"start_character":8,"end_line":138,"end_character":20},"in_reply_to":"da36d5c6_31e039fa","updated":"2017-03-01 18:57:41.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":137,"context_line":"        primary_keys \u003d [\u0027id\u0027]"},{"line_number":138,"context_line":"        foreign_keys \u003d {\u0027Subnet\u0027: {\u0027subnet_id\u0027: \u0027id\u0027}}"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"The :code:`foreign_keys` is used in :code:`SubnetOVO` to populate the"},{"line_number":141,"context_line":":code:`allocation_pools` [#]_ synthetic field using the :code:`IPAllocationPoolOVO`"},{"line_number":142,"context_line":"class. Note that the foreign_keys are declared in related object, where :code:`subnet_id`"},{"line_number":143,"context_line":"is declared, the same way it is done in the SQL model. In order to support foreign"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_b146e94c","line":140,"range":{"start_line":140,"start_character":43,"end_line":140,"end_character":52},"updated":"2017-02-24 05:08:00.000000000","message":"sync names","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"2ff09e404954a795dabb77473bfddb46126c4419","unresolved":false,"context_lines":[{"line_number":137,"context_line":"        primary_keys \u003d [\u0027id\u0027]"},{"line_number":138,"context_line":"        foreign_keys \u003d {\u0027Subnet\u0027: {\u0027subnet_id\u0027: \u0027id\u0027}}"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"The :code:`foreign_keys` is used in :code:`SubnetOVO` to populate the"},{"line_number":141,"context_line":":code:`allocation_pools` [#]_ synthetic field using the :code:`IPAllocationPoolOVO`"},{"line_number":142,"context_line":"class. Note that the foreign_keys are declared in related object, where :code:`subnet_id`"},{"line_number":143,"context_line":"is declared, the same way it is done in the SQL model. In order to support foreign"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_ecd80af2","line":140,"range":{"start_line":140,"start_character":43,"end_line":140,"end_character":52},"in_reply_to":"da36d5c6_b146e94c","updated":"2017-03-01 18:57:41.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":23205,"name":"ianeta hutchinson","email":"ianeta.hutchinson@intel.com","username":"iphutch"},"change_message_id":"a0665c2a6b1f66a9c663d4ea3829adf9b2ccfe5d","unresolved":false,"context_lines":[{"line_number":139,"context_line":""},{"line_number":140,"context_line":"The :code:`foreign_keys` is used in :code:`SubnetOVO` to populate the"},{"line_number":141,"context_line":":code:`allocation_pools` [#]_ synthetic field using the :code:`IPAllocationPoolOVO`"},{"line_number":142,"context_line":"class. Note that the foreign_keys are declared in related object, where :code:`subnet_id`"},{"line_number":143,"context_line":"is declared, the same way it is done in the SQL model. In order to support foreign"},{"line_number":144,"context_line":"keys for many related objects, you should declare the name of the related object"},{"line_number":145,"context_line":"(:code:`Subnet`) as key and as value declare which field from local object"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_2ba4ef55","line":142,"range":{"start_line":142,"start_character":21,"end_line":142,"end_character":33},"updated":"2017-02-21 17:40:50.000000000","message":"``foreign_keys``","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"2ff09e404954a795dabb77473bfddb46126c4419","unresolved":false,"context_lines":[{"line_number":139,"context_line":""},{"line_number":140,"context_line":"The :code:`foreign_keys` is used in :code:`SubnetOVO` to populate the"},{"line_number":141,"context_line":":code:`allocation_pools` [#]_ synthetic field using the :code:`IPAllocationPoolOVO`"},{"line_number":142,"context_line":"class. Note that the foreign_keys are declared in related object, where :code:`subnet_id`"},{"line_number":143,"context_line":"is declared, the same way it is done in the SQL model. In order to support foreign"},{"line_number":144,"context_line":"keys for many related objects, you should declare the name of the related object"},{"line_number":145,"context_line":"(:code:`Subnet`) as key and as value declare which field from local object"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_4c9596e2","line":142,"range":{"start_line":142,"start_character":21,"end_line":142,"end_character":33},"in_reply_to":"da36d5c6_2ba4ef55","updated":"2017-03-01 18:57:41.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":23205,"name":"ianeta hutchinson","email":"ianeta.hutchinson@intel.com","username":"iphutch"},"change_message_id":"a0665c2a6b1f66a9c663d4ea3829adf9b2ccfe5d","unresolved":false,"context_lines":[{"line_number":140,"context_line":"The :code:`foreign_keys` is used in :code:`SubnetOVO` to populate the"},{"line_number":141,"context_line":":code:`allocation_pools` [#]_ synthetic field using the :code:`IPAllocationPoolOVO`"},{"line_number":142,"context_line":"class. Note that the foreign_keys are declared in related object, where :code:`subnet_id`"},{"line_number":143,"context_line":"is declared, the same way it is done in the SQL model. In order to support foreign"},{"line_number":144,"context_line":"keys for many related objects, you should declare the name of the related object"},{"line_number":145,"context_line":"(:code:`Subnet`) as key and as value declare which field from local object"},{"line_number":146,"context_line":"(:code:`subnet_id`) is referring to which field in related object (:code:`id`)."},{"line_number":147,"context_line":"Note that the multiple primary keys related to one parent object are not"},{"line_number":148,"context_line":"permitted."},{"line_number":149,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_cbbb5374","line":146,"range":{"start_line":143,"start_character":55,"end_line":146,"end_character":79},"updated":"2017-02-21 17:40:50.000000000","message":"Can you please break up the sentence.","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"2ff09e404954a795dabb77473bfddb46126c4419","unresolved":false,"context_lines":[{"line_number":140,"context_line":"The :code:`foreign_keys` is used in :code:`SubnetOVO` to populate the"},{"line_number":141,"context_line":":code:`allocation_pools` [#]_ synthetic field using the :code:`IPAllocationPoolOVO`"},{"line_number":142,"context_line":"class. Note that the foreign_keys are declared in related object, where :code:`subnet_id`"},{"line_number":143,"context_line":"is declared, the same way it is done in the SQL model. In order to support foreign"},{"line_number":144,"context_line":"keys for many related objects, you should declare the name of the related object"},{"line_number":145,"context_line":"(:code:`Subnet`) as key and as value declare which field from local object"},{"line_number":146,"context_line":"(:code:`subnet_id`) is referring to which field in related object (:code:`id`)."},{"line_number":147,"context_line":"Note that the multiple primary keys related to one parent object are not"},{"line_number":148,"context_line":"permitted."},{"line_number":149,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_67eef323","line":146,"range":{"start_line":143,"start_character":55,"end_line":146,"end_character":79},"in_reply_to":"da36d5c6_11a33501","updated":"2017-03-01 18:57:41.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"2ff09e404954a795dabb77473bfddb46126c4419","unresolved":false,"context_lines":[{"line_number":140,"context_line":"The :code:`foreign_keys` is used in :code:`SubnetOVO` to populate the"},{"line_number":141,"context_line":":code:`allocation_pools` [#]_ synthetic field using the :code:`IPAllocationPoolOVO`"},{"line_number":142,"context_line":"class. Note that the foreign_keys are declared in related object, where :code:`subnet_id`"},{"line_number":143,"context_line":"is declared, the same way it is done in the SQL model. In order to support foreign"},{"line_number":144,"context_line":"keys for many related objects, you should declare the name of the related object"},{"line_number":145,"context_line":"(:code:`Subnet`) as key and as value declare which field from local object"},{"line_number":146,"context_line":"(:code:`subnet_id`) is referring to which field in related object (:code:`id`)."},{"line_number":147,"context_line":"Note that the multiple primary keys related to one parent object are not"},{"line_number":148,"context_line":"permitted."},{"line_number":149,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_87f3e709","line":146,"range":{"start_line":143,"start_character":55,"end_line":146,"end_character":79},"in_reply_to":"da36d5c6_cbbb5374","updated":"2017-03-01 18:57:41.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":140,"context_line":"The :code:`foreign_keys` is used in :code:`SubnetOVO` to populate the"},{"line_number":141,"context_line":":code:`allocation_pools` [#]_ synthetic field using the :code:`IPAllocationPoolOVO`"},{"line_number":142,"context_line":"class. Note that the foreign_keys are declared in related object, where :code:`subnet_id`"},{"line_number":143,"context_line":"is declared, the same way it is done in the SQL model. In order to support foreign"},{"line_number":144,"context_line":"keys for many related objects, you should declare the name of the related object"},{"line_number":145,"context_line":"(:code:`Subnet`) as key and as value declare which field from local object"},{"line_number":146,"context_line":"(:code:`subnet_id`) is referring to which field in related object (:code:`id`)."},{"line_number":147,"context_line":"Note that the multiple primary keys related to one parent object are not"},{"line_number":148,"context_line":"permitted."},{"line_number":149,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_11a33501","line":146,"range":{"start_line":143,"start_character":55,"end_line":146,"end_character":79},"in_reply_to":"da36d5c6_cbbb5374","updated":"2017-02-24 05:08:00.000000000","message":"Suggest instead to just briefly note that a single object type may be linked to multiple parent object types, hence foreign_keys property may have multiple keys in the dictionary.","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":144,"context_line":"keys for many related objects, you should declare the name of the related object"},{"line_number":145,"context_line":"(:code:`Subnet`) as key and as value declare which field from local object"},{"line_number":146,"context_line":"(:code:`subnet_id`) is referring to which field in related object (:code:`id`)."},{"line_number":147,"context_line":"Note that the multiple primary keys related to one parent object are not"},{"line_number":148,"context_line":"permitted."},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"It is important to remember about nullable parameter. In SQLAlchemy model,"},{"line_number":151,"context_line":"the nullable parameter is by default :code:`True`, while in oslo fields nullable is set"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_71ae31e7","line":148,"range":{"start_line":147,"start_character":1,"end_line":148,"end_character":10},"updated":"2017-02-24 05:08:00.000000000","message":"you can use a note:: syntax for that sentence.","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"2ff09e404954a795dabb77473bfddb46126c4419","unresolved":false,"context_lines":[{"line_number":144,"context_line":"keys for many related objects, you should declare the name of the related object"},{"line_number":145,"context_line":"(:code:`Subnet`) as key and as value declare which field from local object"},{"line_number":146,"context_line":"(:code:`subnet_id`) is referring to which field in related object (:code:`id`)."},{"line_number":147,"context_line":"Note that the multiple primary keys related to one parent object are not"},{"line_number":148,"context_line":"permitted."},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"It is important to remember about nullable parameter. In SQLAlchemy model,"},{"line_number":151,"context_line":"the nullable parameter is by default :code:`True`, while in oslo fields nullable is set"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_acbb7271","line":148,"range":{"start_line":147,"start_character":1,"end_line":148,"end_character":10},"in_reply_to":"da36d5c6_71ae31e7","updated":"2017-03-01 18:57:41.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":23205,"name":"ianeta hutchinson","email":"ianeta.hutchinson@intel.com","username":"iphutch"},"change_message_id":"a0665c2a6b1f66a9c663d4ea3829adf9b2ccfe5d","unresolved":false,"context_lines":[{"line_number":147,"context_line":"Note that the multiple primary keys related to one parent object are not"},{"line_number":148,"context_line":"permitted."},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"It is important to remember about nullable parameter. In SQLAlchemy model,"},{"line_number":151,"context_line":"the nullable parameter is by default :code:`True`, while in oslo fields nullable is set"},{"line_number":152,"context_line":"to :code:`False`."},{"line_number":153,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_0bb64b8a","line":150,"range":{"start_line":150,"start_character":33,"end_line":150,"end_character":34},"updated":"2017-02-21 17:40:50.000000000","message":"the","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":23205,"name":"ianeta hutchinson","email":"ianeta.hutchinson@intel.com","username":"iphutch"},"change_message_id":"a0665c2a6b1f66a9c663d4ea3829adf9b2ccfe5d","unresolved":false,"context_lines":[{"line_number":147,"context_line":"Note that the multiple primary keys related to one parent object are not"},{"line_number":148,"context_line":"permitted."},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"It is important to remember about nullable parameter. In SQLAlchemy model,"},{"line_number":151,"context_line":"the nullable parameter is by default :code:`True`, while in oslo fields nullable is set"},{"line_number":152,"context_line":"to :code:`False`."},{"line_number":153,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_4bb0438c","line":150,"range":{"start_line":150,"start_character":56,"end_line":150,"end_character":57},"updated":"2017-02-21 17:40:50.000000000","message":"the","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"2ff09e404954a795dabb77473bfddb46126c4419","unresolved":false,"context_lines":[{"line_number":147,"context_line":"Note that the multiple primary keys related to one parent object are not"},{"line_number":148,"context_line":"permitted."},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"It is important to remember about nullable parameter. In SQLAlchemy model,"},{"line_number":151,"context_line":"the nullable parameter is by default :code:`True`, while in oslo fields nullable is set"},{"line_number":152,"context_line":"to :code:`False`."},{"line_number":153,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_07e8d70f","line":150,"range":{"start_line":150,"start_character":33,"end_line":150,"end_character":34},"in_reply_to":"da36d5c6_0bb64b8a","updated":"2017-03-01 18:57:41.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"2ff09e404954a795dabb77473bfddb46126c4419","unresolved":false,"context_lines":[{"line_number":147,"context_line":"Note that the multiple primary keys related to one parent object are not"},{"line_number":148,"context_line":"permitted."},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"It is important to remember about nullable parameter. In SQLAlchemy model,"},{"line_number":151,"context_line":"the nullable parameter is by default :code:`True`, while in oslo fields nullable is set"},{"line_number":152,"context_line":"to :code:`False`."},{"line_number":153,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_676353b2","line":150,"range":{"start_line":150,"start_character":56,"end_line":150,"end_character":57},"in_reply_to":"da36d5c6_4bb0438c","updated":"2017-03-01 18:57:41.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":148,"context_line":"permitted."},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"It is important to remember about nullable parameter. In SQLAlchemy model,"},{"line_number":151,"context_line":"the nullable parameter is by default :code:`True`, while in oslo fields nullable is set"},{"line_number":152,"context_line":"to :code:`False`."},{"line_number":153,"context_line":""},{"line_number":154,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_f1886173","line":151,"range":{"start_line":151,"start_character":60,"end_line":151,"end_character":64},"updated":"2017-02-24 05:08:00.000000000","message":"OVO","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":23205,"name":"ianeta hutchinson","email":"ianeta.hutchinson@intel.com","username":"iphutch"},"change_message_id":"a0665c2a6b1f66a9c663d4ea3829adf9b2ccfe5d","unresolved":false,"context_lines":[{"line_number":148,"context_line":"permitted."},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"It is important to remember about nullable parameter. In SQLAlchemy model,"},{"line_number":151,"context_line":"the nullable parameter is by default :code:`True`, while in oslo fields nullable is set"},{"line_number":152,"context_line":"to :code:`False`."},{"line_number":153,"context_line":""},{"line_number":154,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_8baa3b18","line":151,"range":{"start_line":151,"start_character":65,"end_line":151,"end_character":80},"updated":"2017-02-21 17:40:50.000000000","message":"fields, the nullable parameter","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":148,"context_line":"permitted."},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"It is important to remember about nullable parameter. In SQLAlchemy model,"},{"line_number":151,"context_line":"the nullable parameter is by default :code:`True`, while in oslo fields nullable is set"},{"line_number":152,"context_line":"to :code:`False`."},{"line_number":153,"context_line":""},{"line_number":154,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_317f5967","line":151,"range":{"start_line":151,"start_character":57,"end_line":151,"end_character":59},"updated":"2017-02-24 05:08:00.000000000","message":"for","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"2ff09e404954a795dabb77473bfddb46126c4419","unresolved":false,"context_lines":[{"line_number":148,"context_line":"permitted."},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"It is important to remember about nullable parameter. In SQLAlchemy model,"},{"line_number":151,"context_line":"the nullable parameter is by default :code:`True`, while in oslo fields nullable is set"},{"line_number":152,"context_line":"to :code:`False`."},{"line_number":153,"context_line":""},{"line_number":154,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_47600f36","line":151,"range":{"start_line":151,"start_character":57,"end_line":151,"end_character":59},"in_reply_to":"da36d5c6_317f5967","updated":"2017-03-01 18:57:41.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"2ff09e404954a795dabb77473bfddb46126c4419","unresolved":false,"context_lines":[{"line_number":148,"context_line":"permitted."},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"It is important to remember about nullable parameter. In SQLAlchemy model,"},{"line_number":151,"context_line":"the nullable parameter is by default :code:`True`, while in oslo fields nullable is set"},{"line_number":152,"context_line":"to :code:`False`."},{"line_number":153,"context_line":""},{"line_number":154,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_2775dbf8","line":151,"range":{"start_line":151,"start_character":65,"end_line":151,"end_character":80},"in_reply_to":"da36d5c6_8baa3b18","updated":"2017-03-01 18:57:41.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"2ff09e404954a795dabb77473bfddb46126c4419","unresolved":false,"context_lines":[{"line_number":148,"context_line":"permitted."},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"It is important to remember about nullable parameter. In SQLAlchemy model,"},{"line_number":151,"context_line":"the nullable parameter is by default :code:`True`, while in oslo fields nullable is set"},{"line_number":152,"context_line":"to :code:`False`."},{"line_number":153,"context_line":""},{"line_number":154,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_67651344","line":151,"range":{"start_line":151,"start_character":60,"end_line":151,"end_character":64},"in_reply_to":"da36d5c6_f1886173","updated":"2017-03-01 18:57:41.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":149,"context_line":""},{"line_number":150,"context_line":"It is important to remember about nullable parameter. In SQLAlchemy model,"},{"line_number":151,"context_line":"the nullable parameter is by default :code:`True`, while in oslo fields nullable is set"},{"line_number":152,"context_line":"to :code:`False`."},{"line_number":153,"context_line":""},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"Example"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_71955185","line":152,"updated":"2017-02-24 05:08:00.000000000","message":"...Make sure you correctly map database model column nullability properties to relevant object fields.","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"2ff09e404954a795dabb77473bfddb46126c4419","unresolved":false,"context_lines":[{"line_number":149,"context_line":""},{"line_number":150,"context_line":"It is important to remember about nullable parameter. In SQLAlchemy model,"},{"line_number":151,"context_line":"the nullable parameter is by default :code:`True`, while in oslo fields nullable is set"},{"line_number":152,"context_line":"to :code:`False`."},{"line_number":153,"context_line":""},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"Example"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_67f35374","line":152,"in_reply_to":"da36d5c6_71955185","updated":"2017-03-01 18:57:41.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":154,"context_line":""},{"line_number":155,"context_line":"Example"},{"line_number":156,"context_line":"~~~~~~~"},{"line_number":157,"context_line":"This is an example for the creation of the Subnet OVO class."},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"Starting from database model:"},{"line_number":160,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_b18b4967","line":157,"updated":"2017-02-24 05:08:00.000000000","message":"example? again? I think there was one above, no? Was it a bad one for your matter? Can we have a single one that would cover all you want to explain?","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"2ff09e404954a795dabb77473bfddb46126c4419","unresolved":false,"context_lines":[{"line_number":154,"context_line":""},{"line_number":155,"context_line":"Example"},{"line_number":156,"context_line":"~~~~~~~"},{"line_number":157,"context_line":"This is an example for the creation of the Subnet OVO class."},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"Starting from database model:"},{"line_number":160,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_d0dd9415","line":157,"in_reply_to":"da36d5c6_b18b4967","updated":"2017-03-01 18:57:41.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":161,"context_line":".. code-block:: Python"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"    class Subnet(model_base.BASEV2, HasId, HasProject):"},{"line_number":164,"context_line":"        \"\"\"Represents a neutron subnet. \"\"\""},{"line_number":165,"context_line":"        name \u003d sa.Column(sa.String(attr.NAME_MAX_LEN))"},{"line_number":166,"context_line":"        dns_nameservers \u003d orm.relationship(DNSNameServer,"},{"line_number":167,"context_line":"                                           backref\u003d\u0027subnet\u0027,"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_11f17501","line":164,"updated":"2017-02-24 05:08:00.000000000","message":"let\u0027s remove docstrings to make the code a tad more dense.","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"2ff09e404954a795dabb77473bfddb46126c4419","unresolved":false,"context_lines":[{"line_number":161,"context_line":".. code-block:: Python"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"    class Subnet(model_base.BASEV2, HasId, HasProject):"},{"line_number":164,"context_line":"        \"\"\"Represents a neutron subnet. \"\"\""},{"line_number":165,"context_line":"        name \u003d sa.Column(sa.String(attr.NAME_MAX_LEN))"},{"line_number":166,"context_line":"        dns_nameservers \u003d orm.relationship(DNSNameServer,"},{"line_number":167,"context_line":"                                           backref\u003d\u0027subnet\u0027,"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_22d94922","line":164,"in_reply_to":"da36d5c6_11f17501","updated":"2017-03-01 18:57:41.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":163,"context_line":"    class Subnet(model_base.BASEV2, HasId, HasProject):"},{"line_number":164,"context_line":"        \"\"\"Represents a neutron subnet. \"\"\""},{"line_number":165,"context_line":"        name \u003d sa.Column(sa.String(attr.NAME_MAX_LEN))"},{"line_number":166,"context_line":"        dns_nameservers \u003d orm.relationship(DNSNameServer,"},{"line_number":167,"context_line":"                                           backref\u003d\u0027subnet\u0027,"},{"line_number":168,"context_line":"                                           cascade\u003d\u0027all, delete, delete-orphan\u0027,"},{"line_number":169,"context_line":"                                           lazy\u003d\u0027joined\u0027)"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_11c895a7","line":166,"range":{"start_line":166,"start_character":43,"end_line":166,"end_character":56},"updated":"2017-02-24 05:08:00.000000000","message":"if that would be an actual python code imported, it would fail, because you define the DNSNameServer class AFTER Subnet class definition. To make it valid python code, swap order for the class definitions.","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"2ff09e404954a795dabb77473bfddb46126c4419","unresolved":false,"context_lines":[{"line_number":163,"context_line":"    class Subnet(model_base.BASEV2, HasId, HasProject):"},{"line_number":164,"context_line":"        \"\"\"Represents a neutron subnet. \"\"\""},{"line_number":165,"context_line":"        name \u003d sa.Column(sa.String(attr.NAME_MAX_LEN))"},{"line_number":166,"context_line":"        dns_nameservers \u003d orm.relationship(DNSNameServer,"},{"line_number":167,"context_line":"                                           backref\u003d\u0027subnet\u0027,"},{"line_number":168,"context_line":"                                           cascade\u003d\u0027all, delete, delete-orphan\u0027,"},{"line_number":169,"context_line":"                                           lazy\u003d\u0027joined\u0027)"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_62e261d7","line":166,"range":{"start_line":166,"start_character":43,"end_line":166,"end_character":56},"in_reply_to":"da36d5c6_11c895a7","updated":"2017-03-01 18:57:41.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":166,"context_line":"        dns_nameservers \u003d orm.relationship(DNSNameServer,"},{"line_number":167,"context_line":"                                           backref\u003d\u0027subnet\u0027,"},{"line_number":168,"context_line":"                                           cascade\u003d\u0027all, delete, delete-orphan\u0027,"},{"line_number":169,"context_line":"                                           lazy\u003d\u0027joined\u0027)"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"    class DNSNameServer(model_base.BASEV2):"},{"line_number":172,"context_line":"        \"\"\"Internal representation of a DNS nameserver.\"\"\""}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_31f679f9","line":169,"updated":"2017-02-24 05:08:00.000000000","message":"I think we tend to go away from joined, instead subquery is now used. Let\u0027s sync with reality.","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"2ff09e404954a795dabb77473bfddb46126c4419","unresolved":false,"context_lines":[{"line_number":166,"context_line":"        dns_nameservers \u003d orm.relationship(DNSNameServer,"},{"line_number":167,"context_line":"                                           backref\u003d\u0027subnet\u0027,"},{"line_number":168,"context_line":"                                           cascade\u003d\u0027all, delete, delete-orphan\u0027,"},{"line_number":169,"context_line":"                                           lazy\u003d\u0027joined\u0027)"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"    class DNSNameServer(model_base.BASEV2):"},{"line_number":172,"context_line":"        \"\"\"Internal representation of a DNS nameserver.\"\"\""}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_029445e0","line":169,"in_reply_to":"da36d5c6_31f679f9","updated":"2017-03-01 18:57:41.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":169,"context_line":"                                           lazy\u003d\u0027joined\u0027)"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"    class DNSNameServer(model_base.BASEV2):"},{"line_number":172,"context_line":"        \"\"\"Internal representation of a DNS nameserver.\"\"\""},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"        address \u003d sa.Column(sa.String(128), nullable\u003dFalse, primary_key\u003dTrue)"},{"line_number":175,"context_line":"        subnet_id \u003d sa.Column(sa.String(36),"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_51df6d68","line":172,"updated":"2017-02-24 05:08:00.000000000","message":"remove docstring","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"2ff09e404954a795dabb77473bfddb46126c4419","unresolved":false,"context_lines":[{"line_number":169,"context_line":"                                           lazy\u003d\u0027joined\u0027)"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"    class DNSNameServer(model_base.BASEV2):"},{"line_number":172,"context_line":"        \"\"\"Internal representation of a DNS nameserver.\"\"\""},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"        address \u003d sa.Column(sa.String(128), nullable\u003dFalse, primary_key\u003dTrue)"},{"line_number":175,"context_line":"        subnet_id \u003d sa.Column(sa.String(36),"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_82e755e3","line":172,"in_reply_to":"da36d5c6_51df6d68","updated":"2017-03-01 18:57:41.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":176,"context_line":"                              sa.ForeignKey(\u0027subnets.id\u0027,"},{"line_number":177,"context_line":"                                            ondelete\u003d\"CASCADE\"),"},{"line_number":178,"context_line":"                              primary_key\u003dTrue)"},{"line_number":179,"context_line":"        order \u003d sa.Column(sa.Integer, server_default\u003d\u00270\u0027)"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"In Subnet object we have default :code:`id` field, which is primary key,"},{"line_number":182,"context_line":":code:`project_id` and :code:`name` fields. We have the :code:`dns_nameservers`"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_71e63116","line":179,"updated":"2017-02-24 05:08:00.000000000","message":"let\u0027s clean up example models from columns and attributes that don\u0027t add value to explanation. For example, do we need order for the documentation, how does it help to understand the material? Do we need server_default?","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"2ff09e404954a795dabb77473bfddb46126c4419","unresolved":false,"context_lines":[{"line_number":176,"context_line":"                              sa.ForeignKey(\u0027subnets.id\u0027,"},{"line_number":177,"context_line":"                                            ondelete\u003d\"CASCADE\"),"},{"line_number":178,"context_line":"                              primary_key\u003dTrue)"},{"line_number":179,"context_line":"        order \u003d sa.Column(sa.Integer, server_default\u003d\u00270\u0027)"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"In Subnet object we have default :code:`id` field, which is primary key,"},{"line_number":182,"context_line":":code:`project_id` and :code:`name` fields. We have the :code:`dns_nameservers`"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_e2f57183","line":179,"in_reply_to":"da36d5c6_71e63116","updated":"2017-03-01 18:57:41.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":23205,"name":"ianeta hutchinson","email":"ianeta.hutchinson@intel.com","username":"iphutch"},"change_message_id":"a0665c2a6b1f66a9c663d4ea3829adf9b2ccfe5d","unresolved":false,"context_lines":[{"line_number":178,"context_line":"                              primary_key\u003dTrue)"},{"line_number":179,"context_line":"        order \u003d sa.Column(sa.Integer, server_default\u003d\u00270\u0027)"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"In Subnet object we have default :code:`id` field, which is primary key,"},{"line_number":182,"context_line":":code:`project_id` and :code:`name` fields. We have the :code:`dns_nameservers`"},{"line_number":183,"context_line":"relationship, which is side-loading the :code:`DNSNameServer` resource"},{"line_number":184,"context_line":"with the same SQL query (:code:`lazy\u003d\u0027joined\u0027`). Lets say, we would like"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_0b6d6b04","line":181,"range":{"start_line":181,"start_character":59,"end_line":181,"end_character":60},"updated":"2017-02-21 17:40:50.000000000","message":"a","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":23205,"name":"ianeta hutchinson","email":"ianeta.hutchinson@intel.com","username":"iphutch"},"change_message_id":"a0665c2a6b1f66a9c663d4ea3829adf9b2ccfe5d","unresolved":false,"context_lines":[{"line_number":178,"context_line":"                              primary_key\u003dTrue)"},{"line_number":179,"context_line":"        order \u003d sa.Column(sa.Integer, server_default\u003d\u00270\u0027)"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"In Subnet object we have default :code:`id` field, which is primary key,"},{"line_number":182,"context_line":":code:`project_id` and :code:`name` fields. We have the :code:`dns_nameservers`"},{"line_number":183,"context_line":"relationship, which is side-loading the :code:`DNSNameServer` resource"},{"line_number":184,"context_line":"with the same SQL query (:code:`lazy\u003d\u0027joined\u0027`). Lets say, we would like"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_eb673723","line":181,"range":{"start_line":181,"start_character":24,"end_line":181,"end_character":25},"updated":"2017-02-21 17:40:50.000000000","message":"a","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":23205,"name":"ianeta hutchinson","email":"ianeta.hutchinson@intel.com","username":"iphutch"},"change_message_id":"a0665c2a6b1f66a9c663d4ea3829adf9b2ccfe5d","unresolved":false,"context_lines":[{"line_number":178,"context_line":"                              primary_key\u003dTrue)"},{"line_number":179,"context_line":"        order \u003d sa.Column(sa.Integer, server_default\u003d\u00270\u0027)"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"In Subnet object we have default :code:`id` field, which is primary key,"},{"line_number":182,"context_line":":code:`project_id` and :code:`name` fields. We have the :code:`dns_nameservers`"},{"line_number":183,"context_line":"relationship, which is side-loading the :code:`DNSNameServer` resource"},{"line_number":184,"context_line":"with the same SQL query (:code:`lazy\u003d\u0027joined\u0027`). Lets say, we would like"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_cb627316","line":181,"range":{"start_line":181,"start_character":2,"end_line":181,"end_character":3},"updated":"2017-02-21 17:40:50.000000000","message":"the","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":23205,"name":"ianeta hutchinson","email":"ianeta.hutchinson@intel.com","username":"iphutch"},"change_message_id":"a0665c2a6b1f66a9c663d4ea3829adf9b2ccfe5d","unresolved":false,"context_lines":[{"line_number":179,"context_line":"        order \u003d sa.Column(sa.Integer, server_default\u003d\u00270\u0027)"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"In Subnet object we have default :code:`id` field, which is primary key,"},{"line_number":182,"context_line":":code:`project_id` and :code:`name` fields. We have the :code:`dns_nameservers`"},{"line_number":183,"context_line":"relationship, which is side-loading the :code:`DNSNameServer` resource"},{"line_number":184,"context_line":"with the same SQL query (:code:`lazy\u003d\u0027joined\u0027`). Lets say, we would like"},{"line_number":185,"context_line":"to rename the :code:`name` to :code:`subnet_name` field in Subnet object."}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_2b722fe6","line":182,"range":{"start_line":182,"start_character":18,"end_line":182,"end_character":19},"updated":"2017-02-21 17:40:50.000000000","message":",","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":179,"context_line":"        order \u003d sa.Column(sa.Integer, server_default\u003d\u00270\u0027)"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"In Subnet object we have default :code:`id` field, which is primary key,"},{"line_number":182,"context_line":":code:`project_id` and :code:`name` fields. We have the :code:`dns_nameservers`"},{"line_number":183,"context_line":"relationship, which is side-loading the :code:`DNSNameServer` resource"},{"line_number":184,"context_line":"with the same SQL query (:code:`lazy\u003d\u0027joined\u0027`). Lets say, we would like"},{"line_number":185,"context_line":"to rename the :code:`name` to :code:`subnet_name` field in Subnet object."}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_91bc8507","line":182,"range":{"start_line":182,"start_character":0,"end_line":182,"end_character":43},"updated":"2017-02-24 05:08:00.000000000","message":"-\u003e , and *also* project_id and name fields","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":179,"context_line":"        order \u003d sa.Column(sa.Integer, server_default\u003d\u00270\u0027)"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"In Subnet object we have default :code:`id` field, which is primary key,"},{"line_number":182,"context_line":":code:`project_id` and :code:`name` fields. We have the :code:`dns_nameservers`"},{"line_number":183,"context_line":"relationship, which is side-loading the :code:`DNSNameServer` resource"},{"line_number":184,"context_line":"with the same SQL query (:code:`lazy\u003d\u0027joined\u0027`). Lets say, we would like"},{"line_number":185,"context_line":"to rename the :code:`name` to :code:`subnet_name` field in Subnet object."}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_3144b919","line":182,"range":{"start_line":182,"start_character":44,"end_line":182,"end_character":51},"updated":"2017-02-24 05:08:00.000000000","message":"-\u003e We also have","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":180,"context_line":""},{"line_number":181,"context_line":"In Subnet object we have default :code:`id` field, which is primary key,"},{"line_number":182,"context_line":":code:`project_id` and :code:`name` fields. We have the :code:`dns_nameservers`"},{"line_number":183,"context_line":"relationship, which is side-loading the :code:`DNSNameServer` resource"},{"line_number":184,"context_line":"with the same SQL query (:code:`lazy\u003d\u0027joined\u0027`). Lets say, we would like"},{"line_number":185,"context_line":"to rename the :code:`name` to :code:`subnet_name` field in Subnet object."},{"line_number":186,"context_line":"Here is how it should look like:"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_f164e1b9","line":183,"range":{"start_line":183,"start_character":23,"end_line":183,"end_character":35},"updated":"2017-02-24 05:08:00.000000000","message":"side-loading? is it some term? first time I see it (it may be the case it\u0027s indeed some term unknown to me, so feel free to educate me). If that\u0027s not a well known term, consider replacing: -\u003e eagerly loading","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":181,"context_line":"In Subnet object we have default :code:`id` field, which is primary key,"},{"line_number":182,"context_line":":code:`project_id` and :code:`name` fields. We have the :code:`dns_nameservers`"},{"line_number":183,"context_line":"relationship, which is side-loading the :code:`DNSNameServer` resource"},{"line_number":184,"context_line":"with the same SQL query (:code:`lazy\u003d\u0027joined\u0027`). Lets say, we would like"},{"line_number":185,"context_line":"to rename the :code:`name` to :code:`subnet_name` field in Subnet object."},{"line_number":186,"context_line":"Here is how it should look like:"},{"line_number":187,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_315bd9f7","line":184,"range":{"start_line":184,"start_character":38,"end_line":184,"end_character":44},"updated":"2017-02-24 05:08:00.000000000","message":"-\u003e subquery","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":23205,"name":"ianeta hutchinson","email":"ianeta.hutchinson@intel.com","username":"iphutch"},"change_message_id":"a0665c2a6b1f66a9c663d4ea3829adf9b2ccfe5d","unresolved":false,"context_lines":[{"line_number":181,"context_line":"In Subnet object we have default :code:`id` field, which is primary key,"},{"line_number":182,"context_line":":code:`project_id` and :code:`name` fields. We have the :code:`dns_nameservers`"},{"line_number":183,"context_line":"relationship, which is side-loading the :code:`DNSNameServer` resource"},{"line_number":184,"context_line":"with the same SQL query (:code:`lazy\u003d\u0027joined\u0027`). Lets say, we would like"},{"line_number":185,"context_line":"to rename the :code:`name` to :code:`subnet_name` field in Subnet object."},{"line_number":186,"context_line":"Here is how it should look like:"},{"line_number":187,"context_line":""},{"line_number":188,"context_line":".. code-block:: Python"},{"line_number":189,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_cb499390","line":186,"range":{"start_line":184,"start_character":49,"end_line":186,"end_character":32},"updated":"2017-02-21 17:40:50.000000000","message":"In the example below, the ``name`` field in the Subnet object is renamed ``subnet_name``:","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":192,"context_line":"        # Version 1.0: Initial version"},{"line_number":193,"context_line":"        VERSION \u003d \u00271.0\u0027"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"        db_model \u003d models_v2.Subnet"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"        fields \u003d {"},{"line_number":198,"context_line":"            \u0027id\u0027: obj_fields.UUIDField(),"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_f10b01d4","line":195,"range":{"start_line":195,"start_character":19,"end_line":195,"end_character":29},"updated":"2017-02-24 05:08:00.000000000","message":"since it\u0027s just an example, you better not use models_v2. name. Instead replace with e.g. models.Subnet (alternatively, you would somehow mention module/file names used for each code block).","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"2ff09e404954a795dabb77473bfddb46126c4419","unresolved":false,"context_lines":[{"line_number":192,"context_line":"        # Version 1.0: Initial version"},{"line_number":193,"context_line":"        VERSION \u003d \u00271.0\u0027"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"        db_model \u003d models_v2.Subnet"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"        fields \u003d {"},{"line_number":198,"context_line":"            \u0027id\u0027: obj_fields.UUIDField(),"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_5027e411","line":195,"range":{"start_line":195,"start_character":19,"end_line":195,"end_character":29},"in_reply_to":"da36d5c6_f10b01d4","updated":"2017-03-01 18:57:41.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":202,"context_line":"                                                             nullable\u003dTrue),"},{"line_number":203,"context_line":"        }"},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"        synthetic_fields \u003d [\u0027dns_nameservers\u0027]"},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"        fields_need_translation \u003d {"},{"line_number":208,"context_line":"            \u0027name\u0027: \u0027subnet_name\u0027"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_91ef25e8","line":205,"updated":"2017-02-24 05:08:00.000000000","message":"let\u0027s add a comment explaining the intent: Claim dns_nameservers field as not directly mapped into the object database model table.","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"2ff09e404954a795dabb77473bfddb46126c4419","unresolved":false,"context_lines":[{"line_number":202,"context_line":"                                                             nullable\u003dTrue),"},{"line_number":203,"context_line":"        }"},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"        synthetic_fields \u003d [\u0027dns_nameservers\u0027]"},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"        fields_need_translation \u003d {"},{"line_number":208,"context_line":"            \u0027name\u0027: \u0027subnet_name\u0027"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_904a3cc4","line":205,"in_reply_to":"da36d5c6_91ef25e8","updated":"2017-03-01 18:57:41.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":205,"context_line":"        synthetic_fields \u003d [\u0027dns_nameservers\u0027]"},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"        fields_need_translation \u003d {"},{"line_number":208,"context_line":"            \u0027name\u0027: \u0027subnet_name\u0027"},{"line_number":209,"context_line":"        }"},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"For DNS, we have multiple fields in primary key, foreign key referencing Subnet"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_f1c06152","line":208,"updated":"2017-02-24 05:08:00.000000000","message":"add a comment: rename in-database subnet_name attribute into name object field","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"a29cc9caec57d8a0dd844e0d47124e5138d0b514","unresolved":false,"context_lines":[{"line_number":205,"context_line":"        synthetic_fields \u003d [\u0027dns_nameservers\u0027]"},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"        fields_need_translation \u003d {"},{"line_number":208,"context_line":"            \u0027name\u0027: \u0027subnet_name\u0027"},{"line_number":209,"context_line":"        }"},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"For DNS, we have multiple fields in primary key, foreign key referencing Subnet"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_17355bf6","line":208,"in_reply_to":"da36d5c6_f1c06152","updated":"2017-03-01 21:06:55.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":23205,"name":"ianeta hutchinson","email":"ianeta.hutchinson@intel.com","username":"iphutch"},"change_message_id":"a0665c2a6b1f66a9c663d4ea3829adf9b2ccfe5d","unresolved":false,"context_lines":[{"line_number":209,"context_line":"        }"},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"For DNS, we have multiple fields in primary key, foreign key referencing Subnet"},{"line_number":212,"context_line":"entity and third field, which can be nullable. To create oslo versionedobject,"},{"line_number":213,"context_line":"we should define:"},{"line_number":214,"context_line":""},{"line_number":215,"context_line":".. code-block:: Python"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_0b448b72","line":212,"range":{"start_line":212,"start_character":6,"end_line":212,"end_character":7},"updated":"2017-02-21 17:40:50.000000000","message":",","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":23205,"name":"ianeta hutchinson","email":"ianeta.hutchinson@intel.com","username":"iphutch"},"change_message_id":"a0665c2a6b1f66a9c663d4ea3829adf9b2ccfe5d","unresolved":false,"context_lines":[{"line_number":209,"context_line":"        }"},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"For DNS, we have multiple fields in primary key, foreign key referencing Subnet"},{"line_number":212,"context_line":"entity and third field, which can be nullable. To create oslo versionedobject,"},{"line_number":213,"context_line":"we should define:"},{"line_number":214,"context_line":""},{"line_number":215,"context_line":".. code-block:: Python"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_eb4e5795","line":212,"range":{"start_line":212,"start_character":10,"end_line":212,"end_character":11},"updated":"2017-02-21 17:40:50.000000000","message":"a","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":210,"context_line":""},{"line_number":211,"context_line":"For DNS, we have multiple fields in primary key, foreign key referencing Subnet"},{"line_number":212,"context_line":"entity and third field, which can be nullable. To create oslo versionedobject,"},{"line_number":213,"context_line":"we should define:"},{"line_number":214,"context_line":""},{"line_number":215,"context_line":".. code-block:: Python"},{"line_number":216,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_b1c34956","line":213,"range":{"start_line":213,"start_character":3,"end_line":213,"end_character":9},"updated":"2017-02-24 05:08:00.000000000","message":"-\u003e would","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":208,"context_line":"            \u0027name\u0027: \u0027subnet_name\u0027"},{"line_number":209,"context_line":"        }"},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"For DNS, we have multiple fields in primary key, foreign key referencing Subnet"},{"line_number":212,"context_line":"entity and third field, which can be nullable. To create oslo versionedobject,"},{"line_number":213,"context_line":"we should define:"},{"line_number":214,"context_line":""},{"line_number":215,"context_line":".. code-block:: Python"},{"line_number":216,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_11a97590","line":213,"range":{"start_line":211,"start_character":0,"end_line":213,"end_character":17},"updated":"2017-02-24 05:08:00.000000000","message":"I doubt the sentence gives anything to the reader. Consider removing and just continuing the previous code block with DNSNameServer class definition.","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"2ff09e404954a795dabb77473bfddb46126c4419","unresolved":false,"context_lines":[{"line_number":208,"context_line":"            \u0027name\u0027: \u0027subnet_name\u0027"},{"line_number":209,"context_line":"        }"},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"For DNS, we have multiple fields in primary key, foreign key referencing Subnet"},{"line_number":212,"context_line":"entity and third field, which can be nullable. To create oslo versionedobject,"},{"line_number":213,"context_line":"we should define:"},{"line_number":214,"context_line":""},{"line_number":215,"context_line":".. code-block:: Python"},{"line_number":216,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_f07c58ed","line":213,"range":{"start_line":211,"start_character":0,"end_line":213,"end_character":17},"in_reply_to":"da36d5c6_11a97590","updated":"2017-03-01 18:57:41.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":219,"context_line":"        # Version 1.0: Initial version"},{"line_number":220,"context_line":"        VERSION \u003d \u00271.0\u0027"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"        db_model \u003d models_v2.DNSNameServer"},{"line_number":223,"context_line":""},{"line_number":224,"context_line":"        primary_keys \u003d [\u0027address\u0027, \u0027subnet_id\u0027]"},{"line_number":225,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_31ae7998","line":222,"range":{"start_line":222,"start_character":19,"end_line":222,"end_character":29},"updated":"2017-02-24 05:08:00.000000000","message":"-\u003e models.?","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"a29cc9caec57d8a0dd844e0d47124e5138d0b514","unresolved":false,"context_lines":[{"line_number":219,"context_line":"        # Version 1.0: Initial version"},{"line_number":220,"context_line":"        VERSION \u003d \u00271.0\u0027"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"        db_model \u003d models_v2.DNSNameServer"},{"line_number":223,"context_line":""},{"line_number":224,"context_line":"        primary_keys \u003d [\u0027address\u0027, \u0027subnet_id\u0027]"},{"line_number":225,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_577193df","line":222,"range":{"start_line":222,"start_character":19,"end_line":222,"end_character":29},"in_reply_to":"da36d5c6_31ae7998","updated":"2017-03-01 21:06:55.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":221,"context_line":""},{"line_number":222,"context_line":"        db_model \u003d models_v2.DNSNameServer"},{"line_number":223,"context_line":""},{"line_number":224,"context_line":"        primary_keys \u003d [\u0027address\u0027, \u0027subnet_id\u0027]"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"        foreign_keys \u003d {\u0027Subnet\u0027: {\u0027subnet_id\u0027: \u0027id\u0027}}"},{"line_number":227,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_71947142","line":224,"updated":"2017-02-24 05:08:00.000000000","message":"add a comment: the object is uniquely identified by the pair of address and subnet_id fields. Override the default \u0027id\u0027 1-tuple.","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"a29cc9caec57d8a0dd844e0d47124e5138d0b514","unresolved":false,"context_lines":[{"line_number":221,"context_line":""},{"line_number":222,"context_line":"        db_model \u003d models_v2.DNSNameServer"},{"line_number":223,"context_line":""},{"line_number":224,"context_line":"        primary_keys \u003d [\u0027address\u0027, \u0027subnet_id\u0027]"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"        foreign_keys \u003d {\u0027Subnet\u0027: {\u0027subnet_id\u0027: \u0027id\u0027}}"},{"line_number":227,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_376edf01","line":224,"in_reply_to":"da36d5c6_71947142","updated":"2017-03-01 21:06:55.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":223,"context_line":""},{"line_number":224,"context_line":"        primary_keys \u003d [\u0027address\u0027, \u0027subnet_id\u0027]"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"        foreign_keys \u003d {\u0027Subnet\u0027: {\u0027subnet_id\u0027: \u0027id\u0027}}"},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"        fields \u003d {"},{"line_number":229,"context_line":"            \u0027address\u0027: obj_fields.StringField(),"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_919d6568","line":226,"updated":"2017-02-24 05:08:00.000000000","message":"add a comment: allow to link DNSNameServer child objects into Subnet parent object fields via subnet_id child database model attribute.","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"a29cc9caec57d8a0dd844e0d47124e5138d0b514","unresolved":false,"context_lines":[{"line_number":223,"context_line":""},{"line_number":224,"context_line":"        primary_keys \u003d [\u0027address\u0027, \u0027subnet_id\u0027]"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"        foreign_keys \u003d {\u0027Subnet\u0027: {\u0027subnet_id\u0027: \u0027id\u0027}}"},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"        fields \u003d {"},{"line_number":229,"context_line":"            \u0027address\u0027: obj_fields.StringField(),"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_b7abaf1c","line":226,"in_reply_to":"da36d5c6_919d6568","updated":"2017-03-01 21:06:55.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":228,"context_line":"        fields \u003d {"},{"line_number":229,"context_line":"            \u0027address\u0027: obj_fields.StringField(),"},{"line_number":230,"context_line":"            \u0027subnet_id\u0027: obj_fields.UUIDField(),"},{"line_number":231,"context_line":"            \u0027order\u0027: obj_fields.IntegerField(nullable\u003dTrue)"},{"line_number":232,"context_line":"        }"},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"We are defining :code:`VERSION` as 1.0, :code:`primary_keys` as :code:`address`"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_118095f6","line":231,"updated":"2017-02-24 05:08:00.000000000","message":"(No action required) If we remove order attribute from the database model above as I suggested in another comment, then also clean it up here.","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"a29cc9caec57d8a0dd844e0d47124e5138d0b514","unresolved":false,"context_lines":[{"line_number":228,"context_line":"        fields \u003d {"},{"line_number":229,"context_line":"            \u0027address\u0027: obj_fields.StringField(),"},{"line_number":230,"context_line":"            \u0027subnet_id\u0027: obj_fields.UUIDField(),"},{"line_number":231,"context_line":"            \u0027order\u0027: obj_fields.IntegerField(nullable\u003dTrue)"},{"line_number":232,"context_line":"        }"},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"We are defining :code:`VERSION` as 1.0, :code:`primary_keys` as :code:`address`"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_d7a66352","line":231,"in_reply_to":"da36d5c6_118095f6","updated":"2017-03-01 21:06:55.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":23205,"name":"ianeta hutchinson","email":"ianeta.hutchinson@intel.com","username":"iphutch"},"change_message_id":"a0665c2a6b1f66a9c663d4ea3829adf9b2ccfe5d","unresolved":false,"context_lines":[{"line_number":235,"context_line":"and :code:`subnet_id` pair, :code:`foreign_keys` referencing :code:`DNSNameServer`"},{"line_number":236,"context_line":":code:`subnet_id` with :code:`id` from :code:`Subnet` class, meaning"},{"line_number":237,"context_line":"that it will be called in :code:`Subnet` get_objects while loading synthetic"},{"line_number":238,"context_line":"fields. Also fields are defined using oslo versionedobjects provided types."},{"line_number":239,"context_line":"Note the :code:`nullable\u003dTrue` for :code:`order` field."},{"line_number":240,"context_line":""},{"line_number":241,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_2b494f8c","line":238,"range":{"start_line":238,"start_character":12,"end_line":238,"end_character":13},"updated":"2017-02-21 17:40:50.000000000","message":",","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":232,"context_line":"        }"},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"We are defining :code:`VERSION` as 1.0, :code:`primary_keys` as :code:`address`"},{"line_number":235,"context_line":"and :code:`subnet_id` pair, :code:`foreign_keys` referencing :code:`DNSNameServer`"},{"line_number":236,"context_line":":code:`subnet_id` with :code:`id` from :code:`Subnet` class, meaning"},{"line_number":237,"context_line":"that it will be called in :code:`Subnet` get_objects while loading synthetic"},{"line_number":238,"context_line":"fields. Also fields are defined using oslo versionedobjects provided types."},{"line_number":239,"context_line":"Note the :code:`nullable\u003dTrue` for :code:`order` field."},{"line_number":240,"context_line":""},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"Synthetic fields"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_91748536","line":239,"range":{"start_line":235,"start_character":0,"end_line":239,"end_character":55},"updated":"2017-02-24 05:08:00.000000000","message":"I really prefer per-line explanations to go inline.","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"a29cc9caec57d8a0dd844e0d47124e5138d0b514","unresolved":false,"context_lines":[{"line_number":232,"context_line":"        }"},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"We are defining :code:`VERSION` as 1.0, :code:`primary_keys` as :code:`address`"},{"line_number":235,"context_line":"and :code:`subnet_id` pair, :code:`foreign_keys` referencing :code:`DNSNameServer`"},{"line_number":236,"context_line":":code:`subnet_id` with :code:`id` from :code:`Subnet` class, meaning"},{"line_number":237,"context_line":"that it will be called in :code:`Subnet` get_objects while loading synthetic"},{"line_number":238,"context_line":"fields. Also fields are defined using oslo versionedobjects provided types."},{"line_number":239,"context_line":"Note the :code:`nullable\u003dTrue` for :code:`order` field."},{"line_number":240,"context_line":""},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"Synthetic fields"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_fa37cead","line":239,"range":{"start_line":235,"start_character":0,"end_line":239,"end_character":55},"in_reply_to":"da36d5c6_91748536","updated":"2017-03-01 21:06:55.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"6e9d20ec348efd6674d113adb9320ceab1815608","unresolved":false,"context_lines":[{"line_number":241,"context_line":""},{"line_number":242,"context_line":"Synthetic fields"},{"line_number":243,"context_line":"----------------"},{"line_number":244,"context_line":"NOTE: This concept was introduced to neutron for a specific usage. Those"},{"line_number":245,"context_line":"fields are list of fields, that are not directly defined in data model,"},{"line_number":246,"context_line":"but should be filled from other database entities or computed at runtime."},{"line_number":247,"context_line":"The built in types (bool, int, etc.) as well as the object type are valid"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_26e26604","line":244,"range":{"start_line":244,"start_character":0,"end_line":244,"end_character":5},"updated":"2017-02-20 00:37:09.000000000","message":"I would remove this","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":23205,"name":"ianeta hutchinson","email":"ianeta.hutchinson@intel.com","username":"iphutch"},"change_message_id":"a0665c2a6b1f66a9c663d4ea3829adf9b2ccfe5d","unresolved":false,"context_lines":[{"line_number":241,"context_line":""},{"line_number":242,"context_line":"Synthetic fields"},{"line_number":243,"context_line":"----------------"},{"line_number":244,"context_line":"NOTE: This concept was introduced to neutron for a specific usage. Those"},{"line_number":245,"context_line":"fields are list of fields, that are not directly defined in data model,"},{"line_number":246,"context_line":"but should be filled from other database entities or computed at runtime."},{"line_number":247,"context_line":"The built in types (bool, int, etc.) as well as the object type are valid"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_4b5e8346","line":244,"range":{"start_line":244,"start_character":0,"end_line":244,"end_character":5},"updated":"2017-02-21 17:40:50.000000000","message":"Use \"Note::\" RST markup and indent all that should be in the Note box.","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"a29cc9caec57d8a0dd844e0d47124e5138d0b514","unresolved":false,"context_lines":[{"line_number":241,"context_line":""},{"line_number":242,"context_line":"Synthetic fields"},{"line_number":243,"context_line":"----------------"},{"line_number":244,"context_line":"NOTE: This concept was introduced to neutron for a specific usage. Those"},{"line_number":245,"context_line":"fields are list of fields, that are not directly defined in data model,"},{"line_number":246,"context_line":"but should be filled from other database entities or computed at runtime."},{"line_number":247,"context_line":"The built in types (bool, int, etc.) as well as the object type are valid"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_fa798efd","line":244,"range":{"start_line":244,"start_character":0,"end_line":244,"end_character":5},"in_reply_to":"da36d5c6_26e26604","updated":"2017-03-01 21:06:55.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":241,"context_line":""},{"line_number":242,"context_line":"Synthetic fields"},{"line_number":243,"context_line":"----------------"},{"line_number":244,"context_line":"NOTE: This concept was introduced to neutron for a specific usage. Those"},{"line_number":245,"context_line":"fields are list of fields, that are not directly defined in data model,"},{"line_number":246,"context_line":"but should be filled from other database entities or computed at runtime."},{"line_number":247,"context_line":"The built in types (bool, int, etc.) as well as the object type are valid"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_d190bd45","line":244,"range":{"start_line":244,"start_character":0,"end_line":244,"end_character":5},"in_reply_to":"da36d5c6_4b5e8346","updated":"2017-02-24 05:08:00.000000000","message":"I think parts of the text are duplicated in line 103-111","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"6e9d20ec348efd6674d113adb9320ceab1815608","unresolved":false,"context_lines":[{"line_number":241,"context_line":""},{"line_number":242,"context_line":"Synthetic fields"},{"line_number":243,"context_line":"----------------"},{"line_number":244,"context_line":"NOTE: This concept was introduced to neutron for a specific usage. Those"},{"line_number":245,"context_line":"fields are list of fields, that are not directly defined in data model,"},{"line_number":246,"context_line":"but should be filled from other database entities or computed at runtime."},{"line_number":247,"context_line":"The built in types (bool, int, etc.) as well as the object type are valid"},{"line_number":248,"context_line":"for synthetic fields. For example::"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_66e45e0d","line":245,"range":{"start_line":244,"start_character":67,"end_line":245,"end_character":11},"updated":"2017-02-20 00:37:09.000000000","message":"It is a","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":242,"context_line":"Synthetic fields"},{"line_number":243,"context_line":"----------------"},{"line_number":244,"context_line":"NOTE: This concept was introduced to neutron for a specific usage. Those"},{"line_number":245,"context_line":"fields are list of fields, that are not directly defined in data model,"},{"line_number":246,"context_line":"but should be filled from other database entities or computed at runtime."},{"line_number":247,"context_line":"The built in types (bool, int, etc.) as well as the object type are valid"},{"line_number":248,"context_line":"for synthetic fields. For example::"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_f1bce1bc","line":245,"range":{"start_line":245,"start_character":49,"end_line":245,"end_character":70},"updated":"2017-02-24 05:08:00.000000000","message":"the wording here is a bit vague: you may argue that some relationships are actually defined in data models; but they are still managed by synthetic fields. What distinguishes the case is not the place of definition (both may be in the sqla model), but whether those fields are directly backed by corresponding object SQL table attributes.","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"a29cc9caec57d8a0dd844e0d47124e5138d0b514","unresolved":false,"context_lines":[{"line_number":241,"context_line":""},{"line_number":242,"context_line":"Synthetic fields"},{"line_number":243,"context_line":"----------------"},{"line_number":244,"context_line":"NOTE: This concept was introduced to neutron for a specific usage. Those"},{"line_number":245,"context_line":"fields are list of fields, that are not directly defined in data model,"},{"line_number":246,"context_line":"but should be filled from other database entities or computed at runtime."},{"line_number":247,"context_line":"The built in types (bool, int, etc.) as well as the object type are valid"},{"line_number":248,"context_line":"for synthetic fields. For example::"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_cd47b649","line":245,"range":{"start_line":244,"start_character":67,"end_line":245,"end_character":11},"in_reply_to":"da36d5c6_66e45e0d","updated":"2017-03-01 21:06:55.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"a29cc9caec57d8a0dd844e0d47124e5138d0b514","unresolved":false,"context_lines":[{"line_number":242,"context_line":"Synthetic fields"},{"line_number":243,"context_line":"----------------"},{"line_number":244,"context_line":"NOTE: This concept was introduced to neutron for a specific usage. Those"},{"line_number":245,"context_line":"fields are list of fields, that are not directly defined in data model,"},{"line_number":246,"context_line":"but should be filled from other database entities or computed at runtime."},{"line_number":247,"context_line":"The built in types (bool, int, etc.) as well as the object type are valid"},{"line_number":248,"context_line":"for synthetic fields. For example::"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_6ddeca6e","line":245,"range":{"start_line":245,"start_character":49,"end_line":245,"end_character":70},"in_reply_to":"da36d5c6_f1bce1bc","updated":"2017-03-01 21:06:55.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":244,"context_line":"NOTE: This concept was introduced to neutron for a specific usage. Those"},{"line_number":245,"context_line":"fields are list of fields, that are not directly defined in data model,"},{"line_number":246,"context_line":"but should be filled from other database entities or computed at runtime."},{"line_number":247,"context_line":"The built in types (bool, int, etc.) as well as the object type are valid"},{"line_number":248,"context_line":"for synthetic fields. For example::"},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"    fields \u003d {"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_11aed580","line":247,"range":{"start_line":247,"start_character":4,"end_line":247,"end_character":12},"updated":"2017-02-24 05:08:00.000000000","message":"builtin, built-in","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"a29cc9caec57d8a0dd844e0d47124e5138d0b514","unresolved":false,"context_lines":[{"line_number":244,"context_line":"NOTE: This concept was introduced to neutron for a specific usage. Those"},{"line_number":245,"context_line":"fields are list of fields, that are not directly defined in data model,"},{"line_number":246,"context_line":"but should be filled from other database entities or computed at runtime."},{"line_number":247,"context_line":"The built in types (bool, int, etc.) as well as the object type are valid"},{"line_number":248,"context_line":"for synthetic fields. For example::"},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"    fields \u003d {"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_fa318e0c","line":247,"range":{"start_line":247,"start_character":4,"end_line":247,"end_character":12},"in_reply_to":"da36d5c6_11aed580","updated":"2017-03-01 21:06:55.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":244,"context_line":"NOTE: This concept was introduced to neutron for a specific usage. Those"},{"line_number":245,"context_line":"fields are list of fields, that are not directly defined in data model,"},{"line_number":246,"context_line":"but should be filled from other database entities or computed at runtime."},{"line_number":247,"context_line":"The built in types (bool, int, etc.) as well as the object type are valid"},{"line_number":248,"context_line":"for synthetic fields. For example::"},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"    fields \u003d {"},{"line_number":251,"context_line":"        \u0027dhcp_agents\u0027: obj_fields.ObjectField(\u0027NetworkDhcpAgentBinding\u0027,"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_71c9d158","line":248,"range":{"start_line":247,"start_character":0,"end_line":248,"end_character":21},"updated":"2017-02-24 05:08:00.000000000","message":"Instead of listing specific types allowed, you may just say that synthetic fields are not limited in types that can be used to implement them.","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"a29cc9caec57d8a0dd844e0d47124e5138d0b514","unresolved":false,"context_lines":[{"line_number":244,"context_line":"NOTE: This concept was introduced to neutron for a specific usage. Those"},{"line_number":245,"context_line":"fields are list of fields, that are not directly defined in data model,"},{"line_number":246,"context_line":"but should be filled from other database entities or computed at runtime."},{"line_number":247,"context_line":"The built in types (bool, int, etc.) as well as the object type are valid"},{"line_number":248,"context_line":"for synthetic fields. For example::"},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"    fields \u003d {"},{"line_number":251,"context_line":"        \u0027dhcp_agents\u0027: obj_fields.ObjectField(\u0027NetworkDhcpAgentBinding\u0027,"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_7a0d9e3d","line":248,"range":{"start_line":247,"start_character":0,"end_line":248,"end_character":21},"in_reply_to":"da36d5c6_71c9d158","updated":"2017-03-01 21:06:55.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":248,"context_line":"for synthetic fields. For example::"},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"    fields \u003d {"},{"line_number":251,"context_line":"        \u0027dhcp_agents\u0027: obj_fields.ObjectField(\u0027NetworkDhcpAgentBinding\u0027,"},{"line_number":252,"context_line":"                                              nullable\u003dTrue),"},{"line_number":253,"context_line":"        \u0027shared\u0027: obj_fields.BooleanField(default\u003dFalse),"},{"line_number":254,"context_line":"        \u0027subnets\u0027: obj_fields.ListOfObjectsField(\u0027Subnet\u0027, nullable\u003dTrue)"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_11e5f5da","line":251,"updated":"2017-02-24 05:08:00.000000000","message":"add inline comment per field explaining the intent in English, like:\n\n(for dhcp_agents) field that contains another single NeutronDbObject of NetworkDhcpAgentBinding type\n\n(btw, isn\u0027t it weird that dhcp_agent*s* is a single-value field?","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"a29cc9caec57d8a0dd844e0d47124e5138d0b514","unresolved":false,"context_lines":[{"line_number":248,"context_line":"for synthetic fields. For example::"},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"    fields \u003d {"},{"line_number":251,"context_line":"        \u0027dhcp_agents\u0027: obj_fields.ObjectField(\u0027NetworkDhcpAgentBinding\u0027,"},{"line_number":252,"context_line":"                                              nullable\u003dTrue),"},{"line_number":253,"context_line":"        \u0027shared\u0027: obj_fields.BooleanField(default\u003dFalse),"},{"line_number":254,"context_line":"        \u0027subnets\u0027: obj_fields.ListOfObjectsField(\u0027Subnet\u0027, nullable\u003dTrue)"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_6d732a81","line":251,"in_reply_to":"da36d5c6_11e5f5da","updated":"2017-03-01 21:06:55.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":254,"context_line":"        \u0027subnets\u0027: obj_fields.ListOfObjectsField(\u0027Subnet\u0027, nullable\u003dTrue)"},{"line_number":255,"context_line":"    }"},{"line_number":256,"context_line":""},{"line_number":257,"context_line":"    synthetic_fields \u003d [\u0027dhcp_agents\u0027, \u0027shared\u0027, \u0027subnets\u0027]"},{"line_number":258,"context_line":""},{"line_number":259,"context_line":":code:`ObjectField` and :code:`ListOfObjectsField`  take the name of object class"},{"line_number":260,"context_line":"as an argument."}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_31eaf9ac","line":257,"updated":"2017-02-24 05:08:00.000000000","message":"add inline comment saying: all three fields do not belong to corresponding SQL table, and will be implemented in some object-specific way.","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"a29cc9caec57d8a0dd844e0d47124e5138d0b514","unresolved":false,"context_lines":[{"line_number":254,"context_line":"        \u0027subnets\u0027: obj_fields.ListOfObjectsField(\u0027Subnet\u0027, nullable\u003dTrue)"},{"line_number":255,"context_line":"    }"},{"line_number":256,"context_line":""},{"line_number":257,"context_line":"    synthetic_fields \u003d [\u0027dhcp_agents\u0027, \u0027shared\u0027, \u0027subnets\u0027]"},{"line_number":258,"context_line":""},{"line_number":259,"context_line":":code:`ObjectField` and :code:`ListOfObjectsField`  take the name of object class"},{"line_number":260,"context_line":"as an argument."}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_4d13c60d","line":257,"in_reply_to":"da36d5c6_31eaf9ac","updated":"2017-03-01 21:06:55.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":259,"context_line":":code:`ObjectField` and :code:`ListOfObjectsField`  take the name of object class"},{"line_number":260,"context_line":"as an argument."},{"line_number":261,"context_line":""},{"line_number":262,"context_line":"For example, ORM relationships can be modeled by synthetic fields."},{"line_number":263,"context_line":"Synthetic fields can have other OVO class defined for access."},{"line_number":264,"context_line":"In base class, :code:`load_synthetic_db_fields` method searches for OVO"},{"line_number":265,"context_line":"classes to load required data."},{"line_number":266,"context_line":""},{"line_number":267,"context_line":""},{"line_number":268,"context_line":"Custom synthetic fields loading method"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_91d9e524","line":265,"range":{"start_line":262,"start_character":0,"end_line":265,"end_character":30},"updated":"2017-02-24 05:08:00.000000000","message":"somewhat duplicating lines 103-106","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"a29cc9caec57d8a0dd844e0d47124e5138d0b514","unresolved":false,"context_lines":[{"line_number":259,"context_line":":code:`ObjectField` and :code:`ListOfObjectsField`  take the name of object class"},{"line_number":260,"context_line":"as an argument."},{"line_number":261,"context_line":""},{"line_number":262,"context_line":"For example, ORM relationships can be modeled by synthetic fields."},{"line_number":263,"context_line":"Synthetic fields can have other OVO class defined for access."},{"line_number":264,"context_line":"In base class, :code:`load_synthetic_db_fields` method searches for OVO"},{"line_number":265,"context_line":"classes to load required data."},{"line_number":266,"context_line":""},{"line_number":267,"context_line":""},{"line_number":268,"context_line":"Custom synthetic fields loading method"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_0d30ee9d","line":265,"range":{"start_line":262,"start_character":0,"end_line":265,"end_character":30},"in_reply_to":"da36d5c6_91d9e524","updated":"2017-03-01 21:06:55.000000000","message":"Removed","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":265,"context_line":"classes to load required data."},{"line_number":266,"context_line":""},{"line_number":267,"context_line":""},{"line_number":268,"context_line":"Custom synthetic fields loading method"},{"line_number":269,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":270,"context_line":"Custom method to load the synthetic fields can be helpful if the field is not"},{"line_number":271,"context_line":"directly defined in the database, OVO class is not suitable to load the data"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_f10a2189","line":268,"range":{"start_line":268,"start_character":0,"end_line":268,"end_character":38},"updated":"2017-02-24 05:08:00.000000000","message":"-\u003e Implementing custom synthetic fields","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"a29cc9caec57d8a0dd844e0d47124e5138d0b514","unresolved":false,"context_lines":[{"line_number":265,"context_line":"classes to load required data."},{"line_number":266,"context_line":""},{"line_number":267,"context_line":""},{"line_number":268,"context_line":"Custom synthetic fields loading method"},{"line_number":269,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":270,"context_line":"Custom method to load the synthetic fields can be helpful if the field is not"},{"line_number":271,"context_line":"directly defined in the database, OVO class is not suitable to load the data"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_8d1cde14","line":268,"range":{"start_line":268,"start_character":0,"end_line":268,"end_character":38},"in_reply_to":"da36d5c6_f10a2189","updated":"2017-03-01 21:06:55.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":266,"context_line":""},{"line_number":267,"context_line":""},{"line_number":268,"context_line":"Custom synthetic fields loading method"},{"line_number":269,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":270,"context_line":"Custom method to load the synthetic fields can be helpful if the field is not"},{"line_number":271,"context_line":"directly defined in the database, OVO class is not suitable to load the data"},{"line_number":272,"context_line":"or the related object is containing only the ID and property of parent object,"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_f131415b","line":269,"updated":"2017-02-24 05:08:00.000000000","message":"Before explaining the technical details, start with laying out the intent:\n\n\"Sometimes you may want to expose a field on an object that is not mapped into a corresponding database model attribute, or its orm.relationship; or may want to expose a orm.relationship data in a format that is not directly mapped onto a child object type. In this case, here is what you need to do to implement custom getters and setters for the custom field. ...","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"a29cc9caec57d8a0dd844e0d47124e5138d0b514","unresolved":false,"context_lines":[{"line_number":266,"context_line":""},{"line_number":267,"context_line":""},{"line_number":268,"context_line":"Custom synthetic fields loading method"},{"line_number":269,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":270,"context_line":"Custom method to load the synthetic fields can be helpful if the field is not"},{"line_number":271,"context_line":"directly defined in the database, OVO class is not suitable to load the data"},{"line_number":272,"context_line":"or the related object is containing only the ID and property of parent object,"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_4db826e6","line":269,"in_reply_to":"da36d5c6_f131415b","updated":"2017-03-01 21:06:55.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":23205,"name":"ianeta hutchinson","email":"ianeta.hutchinson@intel.com","username":"iphutch"},"change_message_id":"a0665c2a6b1f66a9c663d4ea3829adf9b2ccfe5d","unresolved":false,"context_lines":[{"line_number":267,"context_line":""},{"line_number":268,"context_line":"Custom synthetic fields loading method"},{"line_number":269,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":270,"context_line":"Custom method to load the synthetic fields can be helpful if the field is not"},{"line_number":271,"context_line":"directly defined in the database, OVO class is not suitable to load the data"},{"line_number":272,"context_line":"or the related object is containing only the ID and property of parent object,"},{"line_number":273,"context_line":"for example :code:`subnet_id` and property of it: :code:`is_external`."}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_cb30b30a","line":270,"range":{"start_line":270,"start_character":0,"end_line":270,"end_character":1},"updated":"2017-02-21 17:40:50.000000000","message":"The custom","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"a29cc9caec57d8a0dd844e0d47124e5138d0b514","unresolved":false,"context_lines":[{"line_number":267,"context_line":""},{"line_number":268,"context_line":"Custom synthetic fields loading method"},{"line_number":269,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":270,"context_line":"Custom method to load the synthetic fields can be helpful if the field is not"},{"line_number":271,"context_line":"directly defined in the database, OVO class is not suitable to load the data"},{"line_number":272,"context_line":"or the related object is containing only the ID and property of parent object,"},{"line_number":273,"context_line":"for example :code:`subnet_id` and property of it: :code:`is_external`."}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_8dca1e6d","line":270,"range":{"start_line":270,"start_character":0,"end_line":270,"end_character":1},"in_reply_to":"da36d5c6_cb30b30a","updated":"2017-03-01 21:06:55.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"6e9d20ec348efd6674d113adb9320ceab1815608","unresolved":false,"context_lines":[{"line_number":269,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":270,"context_line":"Custom method to load the synthetic fields can be helpful if the field is not"},{"line_number":271,"context_line":"directly defined in the database, OVO class is not suitable to load the data"},{"line_number":272,"context_line":"or the related object is containing only the ID and property of parent object,"},{"line_number":273,"context_line":"for example :code:`subnet_id` and property of it: :code:`is_external`."},{"line_number":274,"context_line":""},{"line_number":275,"context_line":"In order to implement custom method to load the synthetic field, you need to"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_666ffe92","line":272,"range":{"start_line":272,"start_character":22,"end_line":272,"end_character":77},"updated":"2017-02-20 00:37:09.000000000","message":"contains only the ID and a property of the parent object","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"a29cc9caec57d8a0dd844e0d47124e5138d0b514","unresolved":false,"context_lines":[{"line_number":269,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":270,"context_line":"Custom method to load the synthetic fields can be helpful if the field is not"},{"line_number":271,"context_line":"directly defined in the database, OVO class is not suitable to load the data"},{"line_number":272,"context_line":"or the related object is containing only the ID and property of parent object,"},{"line_number":273,"context_line":"for example :code:`subnet_id` and property of it: :code:`is_external`."},{"line_number":274,"context_line":""},{"line_number":275,"context_line":"In order to implement custom method to load the synthetic field, you need to"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_ada0c2a0","line":272,"range":{"start_line":272,"start_character":22,"end_line":272,"end_character":77},"in_reply_to":"da36d5c6_666ffe92","updated":"2017-03-01 21:06:55.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":23205,"name":"ianeta hutchinson","email":"ianeta.hutchinson@intel.com","username":"iphutch"},"change_message_id":"a0665c2a6b1f66a9c663d4ea3829adf9b2ccfe5d","unresolved":false,"context_lines":[{"line_number":272,"context_line":"or the related object is containing only the ID and property of parent object,"},{"line_number":273,"context_line":"for example :code:`subnet_id` and property of it: :code:`is_external`."},{"line_number":274,"context_line":""},{"line_number":275,"context_line":"In order to implement custom method to load the synthetic field, you need to"},{"line_number":276,"context_line":"provide loading method in OVO class and override the base class method"},{"line_number":277,"context_line":":code:`from_db_object` and :code:`obj_load_attr`. The first one is responsible"},{"line_number":278,"context_line":"for loading the fields to object attributes when calling get_object(s), create"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_4b25a3c0","line":275,"range":{"start_line":275,"start_character":21,"end_line":275,"end_character":22},"updated":"2017-02-21 17:40:50.000000000","message":"the","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"a29cc9caec57d8a0dd844e0d47124e5138d0b514","unresolved":false,"context_lines":[{"line_number":272,"context_line":"or the related object is containing only the ID and property of parent object,"},{"line_number":273,"context_line":"for example :code:`subnet_id` and property of it: :code:`is_external`."},{"line_number":274,"context_line":""},{"line_number":275,"context_line":"In order to implement custom method to load the synthetic field, you need to"},{"line_number":276,"context_line":"provide loading method in OVO class and override the base class method"},{"line_number":277,"context_line":":code:`from_db_object` and :code:`obj_load_attr`. The first one is responsible"},{"line_number":278,"context_line":"for loading the fields to object attributes when calling get_object(s), create"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_8d785e2d","line":275,"range":{"start_line":275,"start_character":21,"end_line":275,"end_character":22},"in_reply_to":"da36d5c6_4b25a3c0","updated":"2017-03-01 21:06:55.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":23205,"name":"ianeta hutchinson","email":"ianeta.hutchinson@intel.com","username":"iphutch"},"change_message_id":"a0665c2a6b1f66a9c663d4ea3829adf9b2ccfe5d","unresolved":false,"context_lines":[{"line_number":273,"context_line":"for example :code:`subnet_id` and property of it: :code:`is_external`."},{"line_number":274,"context_line":""},{"line_number":275,"context_line":"In order to implement custom method to load the synthetic field, you need to"},{"line_number":276,"context_line":"provide loading method in OVO class and override the base class method"},{"line_number":277,"context_line":":code:`from_db_object` and :code:`obj_load_attr`. The first one is responsible"},{"line_number":278,"context_line":"for loading the fields to object attributes when calling get_object(s), create"},{"line_number":279,"context_line":"and update. The second is responsible for loading attribute when it is not set"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_6b2267bb","line":276,"range":{"start_line":276,"start_character":25,"end_line":276,"end_character":26},"updated":"2017-02-21 17:40:50.000000000","message":"the","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"a29cc9caec57d8a0dd844e0d47124e5138d0b514","unresolved":false,"context_lines":[{"line_number":273,"context_line":"for example :code:`subnet_id` and property of it: :code:`is_external`."},{"line_number":274,"context_line":""},{"line_number":275,"context_line":"In order to implement custom method to load the synthetic field, you need to"},{"line_number":276,"context_line":"provide loading method in OVO class and override the base class method"},{"line_number":277,"context_line":":code:`from_db_object` and :code:`obj_load_attr`. The first one is responsible"},{"line_number":278,"context_line":"for loading the fields to object attributes when calling get_object(s), create"},{"line_number":279,"context_line":"and update. The second is responsible for loading attribute when it is not set"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_ad77e238","line":276,"range":{"start_line":276,"start_character":25,"end_line":276,"end_character":26},"in_reply_to":"da36d5c6_6b2267bb","updated":"2017-03-01 21:06:55.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":275,"context_line":"In order to implement custom method to load the synthetic field, you need to"},{"line_number":276,"context_line":"provide loading method in OVO class and override the base class method"},{"line_number":277,"context_line":":code:`from_db_object` and :code:`obj_load_attr`. The first one is responsible"},{"line_number":278,"context_line":"for loading the fields to object attributes when calling get_object(s), create"},{"line_number":279,"context_line":"and update. The second is responsible for loading attribute when it is not set"},{"line_number":280,"context_line":"in object. Also, when you need to create related object with attributes passed"},{"line_number":281,"context_line":"in constructor, :code:`create` and :code:`update` methods  need to be overwritten."}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_51412da8","line":278,"range":{"start_line":278,"start_character":57,"end_line":278,"end_character":70},"updated":"2017-02-24 05:08:00.000000000","message":"\":code:`get_object` and :code:`get_objects`\"? there should be a way to format it properly.","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"a29cc9caec57d8a0dd844e0d47124e5138d0b514","unresolved":false,"context_lines":[{"line_number":275,"context_line":"In order to implement custom method to load the synthetic field, you need to"},{"line_number":276,"context_line":"provide loading method in OVO class and override the base class method"},{"line_number":277,"context_line":":code:`from_db_object` and :code:`obj_load_attr`. The first one is responsible"},{"line_number":278,"context_line":"for loading the fields to object attributes when calling get_object(s), create"},{"line_number":279,"context_line":"and update. The second is responsible for loading attribute when it is not set"},{"line_number":280,"context_line":"in object. Also, when you need to create related object with attributes passed"},{"line_number":281,"context_line":"in constructor, :code:`create` and :code:`update` methods  need to be overwritten."}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_4dd586b7","line":278,"range":{"start_line":278,"start_character":57,"end_line":278,"end_character":70},"in_reply_to":"da36d5c6_51412da8","updated":"2017-03-01 21:06:55.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":276,"context_line":"provide loading method in OVO class and override the base class method"},{"line_number":277,"context_line":":code:`from_db_object` and :code:`obj_load_attr`. The first one is responsible"},{"line_number":278,"context_line":"for loading the fields to object attributes when calling get_object(s), create"},{"line_number":279,"context_line":"and update. The second is responsible for loading attribute when it is not set"},{"line_number":280,"context_line":"in object. Also, when you need to create related object with attributes passed"},{"line_number":281,"context_line":"in constructor, :code:`create` and :code:`update` methods  need to be overwritten."},{"line_number":282,"context_line":"Lets see an example:"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_110a5579","line":279,"range":{"start_line":279,"start_character":5,"end_line":279,"end_character":13},"updated":"2017-02-24 05:08:00.000000000","message":"So at this point, you start to refer to get_object(s), create/update/delete; .. but you haven\u0027t ever explained the basic CRUD interface for neutron objects, so it\u0027s hard for a new reader to understand what you are talking about. I see later in line 385, you start explaining CRUD operations, but that\u0027s too late for someone who reads from top to down.\n\nI suggest we move CRUD description as high in the doc as possible. It feels better to me to first explain how to interact with existing objects, and which methods are available; and only after you explained the intent of objects, the basic usage info, and gave some example usage patterns, you can finally move to explaining how to implement your own object; and finally, at the very end, you may get into more involved topics like custom synthetic fields and such.\n\nWhile at it, consider explaining additional API entry points like count/delete_objects/...","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":275,"context_line":"In order to implement custom method to load the synthetic field, you need to"},{"line_number":276,"context_line":"provide loading method in OVO class and override the base class method"},{"line_number":277,"context_line":":code:`from_db_object` and :code:`obj_load_attr`. The first one is responsible"},{"line_number":278,"context_line":"for loading the fields to object attributes when calling get_object(s), create"},{"line_number":279,"context_line":"and update. The second is responsible for loading attribute when it is not set"},{"line_number":280,"context_line":"in object. Also, when you need to create related object with attributes passed"},{"line_number":281,"context_line":"in constructor, :code:`create` and :code:`update` methods  need to be overwritten."},{"line_number":282,"context_line":"Lets see an example:"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_914725bb","line":279,"range":{"start_line":278,"start_character":72,"end_line":279,"end_character":11},"updated":"2017-02-24 05:08:00.000000000","message":"those are also method names, so consider marking them with `` too.","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"a29cc9caec57d8a0dd844e0d47124e5138d0b514","unresolved":false,"context_lines":[{"line_number":275,"context_line":"In order to implement custom method to load the synthetic field, you need to"},{"line_number":276,"context_line":"provide loading method in OVO class and override the base class method"},{"line_number":277,"context_line":":code:`from_db_object` and :code:`obj_load_attr`. The first one is responsible"},{"line_number":278,"context_line":"for loading the fields to object attributes when calling get_object(s), create"},{"line_number":279,"context_line":"and update. The second is responsible for loading attribute when it is not set"},{"line_number":280,"context_line":"in object. Also, when you need to create related object with attributes passed"},{"line_number":281,"context_line":"in constructor, :code:`create` and :code:`update` methods  need to be overwritten."},{"line_number":282,"context_line":"Lets see an example:"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_0d99ce1f","line":279,"range":{"start_line":278,"start_character":72,"end_line":279,"end_character":11},"in_reply_to":"da36d5c6_914725bb","updated":"2017-03-01 21:06:55.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":281,"context_line":"in constructor, :code:`create` and :code:`update` methods  need to be overwritten."},{"line_number":282,"context_line":"Lets see an example:"},{"line_number":283,"context_line":""},{"line_number":284,"context_line":".. code-block:: Python"},{"line_number":285,"context_line":""},{"line_number":286,"context_line":"    @obj_base.VersionedObjectRegistry.register"},{"line_number":287,"context_line":"    class ExternalSubnet(base.NeutronDbObject):"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_d1619d3a","line":284,"updated":"2017-02-24 05:08:00.000000000","message":"before giving the snippet, suggest what you are trying to implement below (I assume you want to expose is_external attribute as a boolean instead of as an object-typed field that would then itself encapsulate the boolean value of interest).","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"4c18be62cb4f8216d166508442a8ea7f4b66bd27","unresolved":false,"context_lines":[{"line_number":281,"context_line":"in constructor, :code:`create` and :code:`update` methods  need to be overwritten."},{"line_number":282,"context_line":"Lets see an example:"},{"line_number":283,"context_line":""},{"line_number":284,"context_line":".. code-block:: Python"},{"line_number":285,"context_line":""},{"line_number":286,"context_line":"    @obj_base.VersionedObjectRegistry.register"},{"line_number":287,"context_line":"    class ExternalSubnet(base.NeutronDbObject):"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_025c34ec","line":284,"in_reply_to":"da36d5c6_d1619d3a","updated":"2017-03-02 00:07:15.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":283,"context_line":""},{"line_number":284,"context_line":".. code-block:: Python"},{"line_number":285,"context_line":""},{"line_number":286,"context_line":"    @obj_base.VersionedObjectRegistry.register"},{"line_number":287,"context_line":"    class ExternalSubnet(base.NeutronDbObject):"},{"line_number":288,"context_line":"        # Version 1.0: Initial version"},{"line_number":289,"context_line":"        VERSION \u003d \u00271.0\u0027"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_116b35f2","line":286,"updated":"2017-02-24 05:08:00.000000000","message":"I find that snippet a bit repetitive. Can\u0027t we just link to an actual object in tree that would be a good example for the scenario?","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":294,"context_line":"        }"},{"line_number":295,"context_line":""},{"line_number":296,"context_line":"        primary_keys \u003d [\u0027subnet_id\u0027]"},{"line_number":297,"context_line":""},{"line_number":298,"context_line":"        foreign_keys \u003d {\u0027Subnet\u0027: {\u0027subnet_id\u0027: \u0027id\u0027}}"},{"line_number":299,"context_line":""},{"line_number":300,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_11589589","line":297,"updated":"2017-02-24 05:08:00.000000000","message":"suggest skipping empty lines if not completely needed for shorter document","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"4c18be62cb4f8216d166508442a8ea7f4b66bd27","unresolved":false,"context_lines":[{"line_number":294,"context_line":"        }"},{"line_number":295,"context_line":""},{"line_number":296,"context_line":"        primary_keys \u003d [\u0027subnet_id\u0027]"},{"line_number":297,"context_line":""},{"line_number":298,"context_line":"        foreign_keys \u003d {\u0027Subnet\u0027: {\u0027subnet_id\u0027: \u0027id\u0027}}"},{"line_number":299,"context_line":""},{"line_number":300,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_c23a1c98","line":297,"in_reply_to":"da36d5c6_11589589","updated":"2017-03-02 00:07:15.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":311,"context_line":""},{"line_number":312,"context_line":"        # it is important to add field for filtering list, if object should"},{"line_number":313,"context_line":"        # support filtering by it. It is required since synthetic fields"},{"line_number":314,"context_line":"        # are not supported to be filterable by default."},{"line_number":315,"context_line":"        def __init__(self, context\u003dNone, **kwargs):"},{"line_number":316,"context_line":"            super(Subnet, self).__init__(context, **kwargs)"},{"line_number":317,"context_line":"            self.add_extra_filter_name(\u0027external\u0027)"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_7153916b","line":314,"updated":"2017-02-24 05:08:00.000000000","message":"instead of that, say: support new custom \u0027external\u003d\u0027 filter for get_objects family of objects API","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"4c18be62cb4f8216d166508442a8ea7f4b66bd27","unresolved":false,"context_lines":[{"line_number":311,"context_line":""},{"line_number":312,"context_line":"        # it is important to add field for filtering list, if object should"},{"line_number":313,"context_line":"        # support filtering by it. It is required since synthetic fields"},{"line_number":314,"context_line":"        # are not supported to be filterable by default."},{"line_number":315,"context_line":"        def __init__(self, context\u003dNone, **kwargs):"},{"line_number":316,"context_line":"            super(Subnet, self).__init__(context, **kwargs)"},{"line_number":317,"context_line":"            self.add_extra_filter_name(\u0027external\u0027)"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_7c5f5641","line":314,"in_reply_to":"da36d5c6_7153916b","updated":"2017-03-02 00:07:15.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":317,"context_line":"            self.add_extra_filter_name(\u0027external\u0027)"},{"line_number":318,"context_line":""},{"line_number":319,"context_line":"        def create(self):"},{"line_number":320,"context_line":"            fields \u003d self.get_changes()"},{"line_number":321,"context_line":"            with db_api.autonested_transaction(self.obj_context.session):"},{"line_number":322,"context_line":"                if \u0027external\u0027 in fields:"},{"line_number":323,"context_line":"                    ExternalSubnet(context, subnet_id\u003dself.id,"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_51ddadde","line":320,"updated":"2017-02-24 05:08:00.000000000","message":"explain what\u0027s that, and what\u0027s the format of \u0027fields\u0027","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":318,"context_line":""},{"line_number":319,"context_line":"        def create(self):"},{"line_number":320,"context_line":"            fields \u003d self.get_changes()"},{"line_number":321,"context_line":"            with db_api.autonested_transaction(self.obj_context.session):"},{"line_number":322,"context_line":"                if \u0027external\u0027 in fields:"},{"line_number":323,"context_line":"                    ExternalSubnet(context, subnet_id\u003dself.id,"},{"line_number":324,"context_line":"                        is_external\u003dfields[\u0027external\u0027]).create()"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_d1c8bd24","line":321,"updated":"2017-02-24 05:08:00.000000000","message":"I think the new pattern is to use the new engine facade (see Ann\u0027s patches), we should reflect that in docs.","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"4c18be62cb4f8216d166508442a8ea7f4b66bd27","unresolved":false,"context_lines":[{"line_number":318,"context_line":""},{"line_number":319,"context_line":"        def create(self):"},{"line_number":320,"context_line":"            fields \u003d self.get_changes()"},{"line_number":321,"context_line":"            with db_api.autonested_transaction(self.obj_context.session):"},{"line_number":322,"context_line":"                if \u0027external\u0027 in fields:"},{"line_number":323,"context_line":"                    ExternalSubnet(context, subnet_id\u003dself.id,"},{"line_number":324,"context_line":"                        is_external\u003dfields[\u0027external\u0027]).create()"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_a2d36837","line":321,"in_reply_to":"da36d5c6_d1c8bd24","updated":"2017-03-02 00:07:15.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":320,"context_line":"            fields \u003d self.get_changes()"},{"line_number":321,"context_line":"            with db_api.autonested_transaction(self.obj_context.session):"},{"line_number":322,"context_line":"                if \u0027external\u0027 in fields:"},{"line_number":323,"context_line":"                    ExternalSubnet(context, subnet_id\u003dself.id,"},{"line_number":324,"context_line":"                        is_external\u003dfields[\u0027external\u0027]).create()"},{"line_number":325,"context_line":"                # more preferable scenario is to call the super().create()"},{"line_number":326,"context_line":"                # at the end because it will reload the whole object with DB state,"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_b1f7c957","line":323,"updated":"2017-02-24 05:08:00.000000000","message":"I don\u0027t think it will work. Since it\u0027s create(), self.id may be not set; and either way, you should not be able to create a child object without first creating the parent one (something that will only happen after super().create() call in line 329).","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":322,"context_line":"                if \u0027external\u0027 in fields:"},{"line_number":323,"context_line":"                    ExternalSubnet(context, subnet_id\u003dself.id,"},{"line_number":324,"context_line":"                        is_external\u003dfields[\u0027external\u0027]).create()"},{"line_number":325,"context_line":"                # more preferable scenario is to call the super().create()"},{"line_number":326,"context_line":"                # at the end because it will reload the whole object with DB state,"},{"line_number":327,"context_line":"                # including synthetic fields, the \u0027external\u0027 field will be"},{"line_number":328,"context_line":"                # reloaded by from_db_object() overwritten implementation"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_91e3a5a3","line":325,"updated":"2017-02-24 05:08:00.000000000","message":"more preferrable than what? I don\u0027t see an alternative proposed, so it\u0027s not clear what you refer to here.","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"4c18be62cb4f8216d166508442a8ea7f4b66bd27","unresolved":false,"context_lines":[{"line_number":322,"context_line":"                if \u0027external\u0027 in fields:"},{"line_number":323,"context_line":"                    ExternalSubnet(context, subnet_id\u003dself.id,"},{"line_number":324,"context_line":"                        is_external\u003dfields[\u0027external\u0027]).create()"},{"line_number":325,"context_line":"                # more preferable scenario is to call the super().create()"},{"line_number":326,"context_line":"                # at the end because it will reload the whole object with DB state,"},{"line_number":327,"context_line":"                # including synthetic fields, the \u0027external\u0027 field will be"},{"line_number":328,"context_line":"                # reloaded by from_db_object() overwritten implementation"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_3c3cfee1","line":325,"in_reply_to":"da36d5c6_91e3a5a3","updated":"2017-03-02 00:07:15.000000000","message":"Removed","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":325,"context_line":"                # more preferable scenario is to call the super().create()"},{"line_number":326,"context_line":"                # at the end because it will reload the whole object with DB state,"},{"line_number":327,"context_line":"                # including synthetic fields, the \u0027external\u0027 field will be"},{"line_number":328,"context_line":"                # reloaded by from_db_object() overwritten implementation"},{"line_number":329,"context_line":"                super(Subnet, self).create()"},{"line_number":330,"context_line":""},{"line_number":331,"context_line":"        def update(self):"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_11e6d5af","line":328,"updated":"2017-02-24 05:08:00.000000000","message":"I think instead of the comment, you could just say:\n\nCall to super() to create the SQL record for the object, and reload its fields from the database, if needed.","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"4c18be62cb4f8216d166508442a8ea7f4b66bd27","unresolved":false,"context_lines":[{"line_number":325,"context_line":"                # more preferable scenario is to call the super().create()"},{"line_number":326,"context_line":"                # at the end because it will reload the whole object with DB state,"},{"line_number":327,"context_line":"                # including synthetic fields, the \u0027external\u0027 field will be"},{"line_number":328,"context_line":"                # reloaded by from_db_object() overwritten implementation"},{"line_number":329,"context_line":"                super(Subnet, self).create()"},{"line_number":330,"context_line":""},{"line_number":331,"context_line":"        def update(self):"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_1c357af6","line":328,"in_reply_to":"da36d5c6_11e6d5af","updated":"2017-03-02 00:07:15.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":330,"context_line":""},{"line_number":331,"context_line":"        def update(self):"},{"line_number":332,"context_line":"            fields \u003d self.get_changes()"},{"line_number":333,"context_line":"            with db_api.autonested_transaction(self.obj_context.session):"},{"line_number":334,"context_line":"                if \u0027external\u0027 in fields:"},{"line_number":335,"context_line":"                    obj_db_api.delete_objects("},{"line_number":336,"context_line":"                        self.obj_context, ExternalSubnet.db_model,"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_f19b0116","line":333,"updated":"2017-02-24 05:08:00.000000000","message":"ditto on the new engine facade","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"4c18be62cb4f8216d166508442a8ea7f4b66bd27","unresolved":false,"context_lines":[{"line_number":330,"context_line":""},{"line_number":331,"context_line":"        def update(self):"},{"line_number":332,"context_line":"            fields \u003d self.get_changes()"},{"line_number":333,"context_line":"            with db_api.autonested_transaction(self.obj_context.session):"},{"line_number":334,"context_line":"                if \u0027external\u0027 in fields:"},{"line_number":335,"context_line":"                    obj_db_api.delete_objects("},{"line_number":336,"context_line":"                        self.obj_context, ExternalSubnet.db_model,"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_22e858e2","line":333,"in_reply_to":"da36d5c6_f19b0116","updated":"2017-03-02 00:07:15.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":332,"context_line":"            fields \u003d self.get_changes()"},{"line_number":333,"context_line":"            with db_api.autonested_transaction(self.obj_context.session):"},{"line_number":334,"context_line":"                if \u0027external\u0027 in fields:"},{"line_number":335,"context_line":"                    obj_db_api.delete_objects("},{"line_number":336,"context_line":"                        self.obj_context, ExternalSubnet.db_model,"},{"line_number":337,"context_line":"                        subnet_id\u003dself.id)"},{"line_number":338,"context_line":"                    ExternalSubnet(context, subnet_id\u003dself.id,"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_119df509","line":335,"updated":"2017-02-24 05:08:00.000000000","message":"add a comment: delete an old ExternalSubnet record, if present","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"4c18be62cb4f8216d166508442a8ea7f4b66bd27","unresolved":false,"context_lines":[{"line_number":332,"context_line":"            fields \u003d self.get_changes()"},{"line_number":333,"context_line":"            with db_api.autonested_transaction(self.obj_context.session):"},{"line_number":334,"context_line":"                if \u0027external\u0027 in fields:"},{"line_number":335,"context_line":"                    obj_db_api.delete_objects("},{"line_number":336,"context_line":"                        self.obj_context, ExternalSubnet.db_model,"},{"line_number":337,"context_line":"                        subnet_id\u003dself.id)"},{"line_number":338,"context_line":"                    ExternalSubnet(context, subnet_id\u003dself.id,"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_dc2be292","line":335,"in_reply_to":"da36d5c6_119df509","updated":"2017-03-02 00:07:15.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":335,"context_line":"                    obj_db_api.delete_objects("},{"line_number":336,"context_line":"                        self.obj_context, ExternalSubnet.db_model,"},{"line_number":337,"context_line":"                        subnet_id\u003dself.id)"},{"line_number":338,"context_line":"                    ExternalSubnet(context, subnet_id\u003dself.id,"},{"line_number":339,"context_line":"                        is_external\u003dfields[\u0027external\u0027]).create()"},{"line_number":340,"context_line":"                # calling super().update() will reload the synthetic fields"},{"line_number":341,"context_line":"                super(Subnet, self).update()"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_31a2f94b","line":338,"updated":"2017-02-24 05:08:00.000000000","message":"create the new intended ExternalSubnet object.","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"4c18be62cb4f8216d166508442a8ea7f4b66bd27","unresolved":false,"context_lines":[{"line_number":335,"context_line":"                    obj_db_api.delete_objects("},{"line_number":336,"context_line":"                        self.obj_context, ExternalSubnet.db_model,"},{"line_number":337,"context_line":"                        subnet_id\u003dself.id)"},{"line_number":338,"context_line":"                    ExternalSubnet(context, subnet_id\u003dself.id,"},{"line_number":339,"context_line":"                        is_external\u003dfields[\u0027external\u0027]).create()"},{"line_number":340,"context_line":"                # calling super().update() will reload the synthetic fields"},{"line_number":341,"context_line":"                super(Subnet, self).update()"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_3c131e68","line":338,"in_reply_to":"da36d5c6_31a2f94b","updated":"2017-03-02 00:07:15.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":337,"context_line":"                        subnet_id\u003dself.id)"},{"line_number":338,"context_line":"                    ExternalSubnet(context, subnet_id\u003dself.id,"},{"line_number":339,"context_line":"                        is_external\u003dfields[\u0027external\u0027]).create()"},{"line_number":340,"context_line":"                # calling super().update() will reload the synthetic fields"},{"line_number":341,"context_line":"                super(Subnet, self).update()"},{"line_number":342,"context_line":""},{"line_number":343,"context_line":"        # this method is called when user of an object access the attribute"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_9191e5f3","line":340,"updated":"2017-02-24 05:08:00.000000000","message":"(and also will update any changed non-synthetic fields, if any)","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"4c18be62cb4f8216d166508442a8ea7f4b66bd27","unresolved":false,"context_lines":[{"line_number":337,"context_line":"                        subnet_id\u003dself.id)"},{"line_number":338,"context_line":"                    ExternalSubnet(context, subnet_id\u003dself.id,"},{"line_number":339,"context_line":"                        is_external\u003dfields[\u0027external\u0027]).create()"},{"line_number":340,"context_line":"                # calling super().update() will reload the synthetic fields"},{"line_number":341,"context_line":"                super(Subnet, self).update()"},{"line_number":342,"context_line":""},{"line_number":343,"context_line":"        # this method is called when user of an object access the attribute"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_dc02020b","line":340,"in_reply_to":"da36d5c6_9191e5f3","updated":"2017-03-02 00:07:15.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":340,"context_line":"                # calling super().update() will reload the synthetic fields"},{"line_number":341,"context_line":"                super(Subnet, self).update()"},{"line_number":342,"context_line":""},{"line_number":343,"context_line":"        # this method is called when user of an object access the attribute"},{"line_number":344,"context_line":"        # and requested attribute is not set."},{"line_number":345,"context_line":"        def obj_load_attr(self, attrname):"},{"line_number":346,"context_line":"            if attrname \u003d\u003d \u0027external\u0027:"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_d1bd1d69","line":343,"range":{"start_line":343,"start_character":55,"end_line":343,"end_character":61},"updated":"2017-02-24 05:08:00.000000000","message":"accesses","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"4c18be62cb4f8216d166508442a8ea7f4b66bd27","unresolved":false,"context_lines":[{"line_number":340,"context_line":"                # calling super().update() will reload the synthetic fields"},{"line_number":341,"context_line":"                super(Subnet, self).update()"},{"line_number":342,"context_line":""},{"line_number":343,"context_line":"        # this method is called when user of an object access the attribute"},{"line_number":344,"context_line":"        # and requested attribute is not set."},{"line_number":345,"context_line":"        def obj_load_attr(self, attrname):"},{"line_number":346,"context_line":"            if attrname \u003d\u003d \u0027external\u0027:"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_020d1437","line":343,"range":{"start_line":343,"start_character":55,"end_line":343,"end_character":61},"in_reply_to":"da36d5c6_d1bd1d69","updated":"2017-03-02 00:07:15.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":345,"context_line":"        def obj_load_attr(self, attrname):"},{"line_number":346,"context_line":"            if attrname \u003d\u003d \u0027external\u0027:"},{"line_number":347,"context_line":"                return self._load_external()"},{"line_number":348,"context_line":"            # it is important to call super if attrname does not math"},{"line_number":349,"context_line":"            # because the base implementation is handling the nullable case"},{"line_number":350,"context_line":"            super(Subnet, self).obj_load_attr(attrname)"},{"line_number":351,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_31b9197a","line":348,"range":{"start_line":348,"start_character":65,"end_line":348,"end_character":69},"updated":"2017-02-24 05:08:00.000000000","message":"match?","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"4c18be62cb4f8216d166508442a8ea7f4b66bd27","unresolved":false,"context_lines":[{"line_number":345,"context_line":"        def obj_load_attr(self, attrname):"},{"line_number":346,"context_line":"            if attrname \u003d\u003d \u0027external\u0027:"},{"line_number":347,"context_line":"                return self._load_external()"},{"line_number":348,"context_line":"            # it is important to call super if attrname does not math"},{"line_number":349,"context_line":"            # because the base implementation is handling the nullable case"},{"line_number":350,"context_line":"            super(Subnet, self).obj_load_attr(attrname)"},{"line_number":351,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_2214d842","line":348,"range":{"start_line":348,"start_character":65,"end_line":348,"end_character":69},"in_reply_to":"da36d5c6_31b9197a","updated":"2017-03-02 00:07:15.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":352,"context_line":"        def _load_external(self, db_obj\u003dNone):"},{"line_number":353,"context_line":"            # do the loading here"},{"line_number":354,"context_line":"            if db_obj:"},{"line_number":355,"context_line":"                # use DB model to fetch the data that may be side-loaded"},{"line_number":356,"context_line":"                external \u003d db_obj.external.is_external if db_obj.external else None"},{"line_number":357,"context_line":"            else:"},{"line_number":358,"context_line":"                # perform extra operation to fetch the data from DB"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_51b20d95","line":355,"range":{"start_line":355,"start_character":61,"end_line":355,"end_character":72},"updated":"2017-02-24 05:08:00.000000000","message":"is it a word?","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":361,"context_line":"                external \u003d external_obj.is_external if external_obj else None"},{"line_number":362,"context_line":""},{"line_number":363,"context_line":"            # it is important to set the attribute and call obj_reset_changes"},{"line_number":364,"context_line":"            setattr(self, \u0027external\u0027, external)"},{"line_number":365,"context_line":"            self.obj_reset_changes([\u0027external\u0027])"},{"line_number":366,"context_line":""},{"line_number":367,"context_line":"        # this is defined in NeutronDbObject and is invoked during get_object(s)"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_d14b5d85","line":364,"updated":"2017-02-24 05:08:00.000000000","message":"why isn\u0027t it self.external \u003d external?","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":362,"context_line":""},{"line_number":363,"context_line":"            # it is important to set the attribute and call obj_reset_changes"},{"line_number":364,"context_line":"            setattr(self, \u0027external\u0027, external)"},{"line_number":365,"context_line":"            self.obj_reset_changes([\u0027external\u0027])"},{"line_number":366,"context_line":""},{"line_number":367,"context_line":"        # this is defined in NeutronDbObject and is invoked during get_object(s)"},{"line_number":368,"context_line":"        # and create/update."}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_917f25aa","line":365,"updated":"2017-02-24 05:08:00.000000000","message":"when explaining the basic usage of objects, you may also spend some words to explain that objects track information about fields changed.","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":23205,"name":"ianeta hutchinson","email":"ianeta.hutchinson@intel.com","username":"iphutch"},"change_message_id":"a0665c2a6b1f66a9c663d4ea3829adf9b2ccfe5d","unresolved":false,"context_lines":[{"line_number":370,"context_line":"            super(Subnet, self).from_db_object(obj)"},{"line_number":371,"context_line":"            self._load_external(obj)"},{"line_number":372,"context_line":""},{"line_number":373,"context_line":"In above example, the :code:`get_object(s)` methods do not have to be overwritten,"},{"line_number":374,"context_line":"because :code:`from_db_object` is taking care of loading the synthetic fields"},{"line_number":375,"context_line":"in custom way."},{"line_number":376,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_8b2f9ba0","line":373,"range":{"start_line":373,"start_character":2,"end_line":373,"end_character":3},"updated":"2017-02-21 17:40:50.000000000","message":"the","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"d425fa630ff5c65f9cecccb37d214f8f4b10c482","unresolved":false,"context_lines":[{"line_number":370,"context_line":"            super(Subnet, self).from_db_object(obj)"},{"line_number":371,"context_line":"            self._load_external(obj)"},{"line_number":372,"context_line":""},{"line_number":373,"context_line":"In above example, the :code:`get_object(s)` methods do not have to be overwritten,"},{"line_number":374,"context_line":"because :code:`from_db_object` is taking care of loading the synthetic fields"},{"line_number":375,"context_line":"in custom way."},{"line_number":376,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_a1c60947","line":373,"range":{"start_line":373,"start_character":2,"end_line":373,"end_character":3},"in_reply_to":"da36d5c6_8b2f9ba0","updated":"2017-03-01 23:21:56.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":23205,"name":"ianeta hutchinson","email":"ianeta.hutchinson@intel.com","username":"iphutch"},"change_message_id":"a0665c2a6b1f66a9c663d4ea3829adf9b2ccfe5d","unresolved":false,"context_lines":[{"line_number":374,"context_line":"because :code:`from_db_object` is taking care of loading the synthetic fields"},{"line_number":375,"context_line":"in custom way."},{"line_number":376,"context_line":""},{"line_number":377,"context_line":"About :code:`obj_reset_changes`, it belongs to oslo versionedobjects lib. The nature"},{"line_number":378,"context_line":"of OVO is when you set some field, OVO tracks its changes."},{"line_number":379,"context_line":"When calling save/create or update, OVO looks for changed fields and save them in DB."},{"line_number":380,"context_line":"When you set some field (regular or synthetic one), and you know that you do not"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_cb17d352","line":377,"range":{"start_line":377,"start_character":0,"end_line":377,"end_character":72},"updated":"2017-02-21 17:40:50.000000000","message":":code:`obj_reset_changes` belongs to the ``oslo.versionedobjects`` library.","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"4c18be62cb4f8216d166508442a8ea7f4b66bd27","unresolved":false,"context_lines":[{"line_number":374,"context_line":"because :code:`from_db_object` is taking care of loading the synthetic fields"},{"line_number":375,"context_line":"in custom way."},{"line_number":376,"context_line":""},{"line_number":377,"context_line":"About :code:`obj_reset_changes`, it belongs to oslo versionedobjects lib. The nature"},{"line_number":378,"context_line":"of OVO is when you set some field, OVO tracks its changes."},{"line_number":379,"context_line":"When calling save/create or update, OVO looks for changed fields and save them in DB."},{"line_number":380,"context_line":"When you set some field (regular or synthetic one), and you know that you do not"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_82b58432","line":377,"range":{"start_line":377,"start_character":0,"end_line":377,"end_character":72},"in_reply_to":"da36d5c6_cb17d352","updated":"2017-03-02 00:07:15.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":23205,"name":"ianeta hutchinson","email":"ianeta.hutchinson@intel.com","username":"iphutch"},"change_message_id":"a0665c2a6b1f66a9c663d4ea3829adf9b2ccfe5d","unresolved":false,"context_lines":[{"line_number":376,"context_line":""},{"line_number":377,"context_line":"About :code:`obj_reset_changes`, it belongs to oslo versionedobjects lib. The nature"},{"line_number":378,"context_line":"of OVO is when you set some field, OVO tracks its changes."},{"line_number":379,"context_line":"When calling save/create or update, OVO looks for changed fields and save them in DB."},{"line_number":380,"context_line":"When you set some field (regular or synthetic one), and you know that you do not"},{"line_number":381,"context_line":"need to set this field in DB, you are calling :code:`obj_reset_changes` to tell OVO lib,"},{"line_number":382,"context_line":"that this field does not need to be saved in DB."}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_0b12cb62","line":379,"range":{"start_line":379,"start_character":40,"end_line":379,"end_character":85},"updated":"2017-02-21 17:40:50.000000000","message":"detects and saves changed fields in the database.","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"6e9d20ec348efd6674d113adb9320ceab1815608","unresolved":false,"context_lines":[{"line_number":376,"context_line":""},{"line_number":377,"context_line":"About :code:`obj_reset_changes`, it belongs to oslo versionedobjects lib. The nature"},{"line_number":378,"context_line":"of OVO is when you set some field, OVO tracks its changes."},{"line_number":379,"context_line":"When calling save/create or update, OVO looks for changed fields and save them in DB."},{"line_number":380,"context_line":"When you set some field (regular or synthetic one), and you know that you do not"},{"line_number":381,"context_line":"need to set this field in DB, you are calling :code:`obj_reset_changes` to tell OVO lib,"},{"line_number":382,"context_line":"that this field does not need to be saved in DB."}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_e6092edf","line":379,"range":{"start_line":379,"start_character":69,"end_line":379,"end_character":73},"updated":"2017-02-20 00:37:09.000000000","message":"saves","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"4c18be62cb4f8216d166508442a8ea7f4b66bd27","unresolved":false,"context_lines":[{"line_number":376,"context_line":""},{"line_number":377,"context_line":"About :code:`obj_reset_changes`, it belongs to oslo versionedobjects lib. The nature"},{"line_number":378,"context_line":"of OVO is when you set some field, OVO tracks its changes."},{"line_number":379,"context_line":"When calling save/create or update, OVO looks for changed fields and save them in DB."},{"line_number":380,"context_line":"When you set some field (regular or synthetic one), and you know that you do not"},{"line_number":381,"context_line":"need to set this field in DB, you are calling :code:`obj_reset_changes` to tell OVO lib,"},{"line_number":382,"context_line":"that this field does not need to be saved in DB."}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_e2a56004","line":379,"range":{"start_line":379,"start_character":40,"end_line":379,"end_character":85},"in_reply_to":"da36d5c6_0b12cb62","updated":"2017-03-02 00:07:15.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"4c18be62cb4f8216d166508442a8ea7f4b66bd27","unresolved":false,"context_lines":[{"line_number":376,"context_line":""},{"line_number":377,"context_line":"About :code:`obj_reset_changes`, it belongs to oslo versionedobjects lib. The nature"},{"line_number":378,"context_line":"of OVO is when you set some field, OVO tracks its changes."},{"line_number":379,"context_line":"When calling save/create or update, OVO looks for changed fields and save them in DB."},{"line_number":380,"context_line":"When you set some field (regular or synthetic one), and you know that you do not"},{"line_number":381,"context_line":"need to set this field in DB, you are calling :code:`obj_reset_changes` to tell OVO lib,"},{"line_number":382,"context_line":"that this field does not need to be saved in DB."}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_02a994df","line":379,"range":{"start_line":379,"start_character":69,"end_line":379,"end_character":73},"in_reply_to":"da36d5c6_e6092edf","updated":"2017-03-02 00:07:15.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":374,"context_line":"because :code:`from_db_object` is taking care of loading the synthetic fields"},{"line_number":375,"context_line":"in custom way."},{"line_number":376,"context_line":""},{"line_number":377,"context_line":"About :code:`obj_reset_changes`, it belongs to oslo versionedobjects lib. The nature"},{"line_number":378,"context_line":"of OVO is when you set some field, OVO tracks its changes."},{"line_number":379,"context_line":"When calling save/create or update, OVO looks for changed fields and save them in DB."},{"line_number":380,"context_line":"When you set some field (regular or synthetic one), and you know that you do not"},{"line_number":381,"context_line":"need to set this field in DB, you are calling :code:`obj_reset_changes` to tell OVO lib,"},{"line_number":382,"context_line":"that this field does not need to be saved in DB."},{"line_number":383,"context_line":""},{"line_number":384,"context_line":""},{"line_number":385,"context_line":"Usage of objects"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_f1506134","line":382,"range":{"start_line":377,"start_character":0,"end_line":382,"end_character":48},"updated":"2017-02-24 05:08:00.000000000","message":"that note should go into the section somewhere near the top that explains basic object usage API.","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"4c18be62cb4f8216d166508442a8ea7f4b66bd27","unresolved":false,"context_lines":[{"line_number":374,"context_line":"because :code:`from_db_object` is taking care of loading the synthetic fields"},{"line_number":375,"context_line":"in custom way."},{"line_number":376,"context_line":""},{"line_number":377,"context_line":"About :code:`obj_reset_changes`, it belongs to oslo versionedobjects lib. The nature"},{"line_number":378,"context_line":"of OVO is when you set some field, OVO tracks its changes."},{"line_number":379,"context_line":"When calling save/create or update, OVO looks for changed fields and save them in DB."},{"line_number":380,"context_line":"When you set some field (regular or synthetic one), and you know that you do not"},{"line_number":381,"context_line":"need to set this field in DB, you are calling :code:`obj_reset_changes` to tell OVO lib,"},{"line_number":382,"context_line":"that this field does not need to be saved in DB."},{"line_number":383,"context_line":""},{"line_number":384,"context_line":""},{"line_number":385,"context_line":"Usage of objects"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_2203f843","line":382,"range":{"start_line":377,"start_character":0,"end_line":382,"end_character":48},"in_reply_to":"da36d5c6_f1506134","updated":"2017-03-02 00:07:15.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":421,"context_line":"        dns.delete()"},{"line_number":422,"context_line":""},{"line_number":423,"context_line":""},{"line_number":424,"context_line":"Sorting and filtering"},{"line_number":425,"context_line":"~~~~~~~~~~~~~~~~~~~~~"},{"line_number":426,"context_line":":code:`NeutronDbObject` class has strict validation on which fields sorting"},{"line_number":427,"context_line":"and filtering can happen. When calling :code:`get_objects` and :code:`count`"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_d1327d0f","line":424,"updated":"2017-02-24 05:08:00.000000000","message":"that section will also need to go to the top, near explanation with basic objects usage info.","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"4c18be62cb4f8216d166508442a8ea7f4b66bd27","unresolved":false,"context_lines":[{"line_number":421,"context_line":"        dns.delete()"},{"line_number":422,"context_line":""},{"line_number":423,"context_line":""},{"line_number":424,"context_line":"Sorting and filtering"},{"line_number":425,"context_line":"~~~~~~~~~~~~~~~~~~~~~"},{"line_number":426,"context_line":":code:`NeutronDbObject` class has strict validation on which fields sorting"},{"line_number":427,"context_line":"and filtering can happen. When calling :code:`get_objects` and :code:`count`"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_e20c8096","line":424,"in_reply_to":"da36d5c6_d1327d0f","updated":"2017-03-02 00:07:15.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":23205,"name":"ianeta hutchinson","email":"ianeta.hutchinson@intel.com","username":"iphutch"},"change_message_id":"a0665c2a6b1f66a9c663d4ea3829adf9b2ccfe5d","unresolved":false,"context_lines":[{"line_number":423,"context_line":""},{"line_number":424,"context_line":"Sorting and filtering"},{"line_number":425,"context_line":"~~~~~~~~~~~~~~~~~~~~~"},{"line_number":426,"context_line":":code:`NeutronDbObject` class has strict validation on which fields sorting"},{"line_number":427,"context_line":"and filtering can happen. When calling :code:`get_objects` and :code:`count`"},{"line_number":428,"context_line":"methods, :code:`validate_filters` is invoked, to see if passed filters are included"},{"line_number":429,"context_line":"in object\u0027s fields. Additional filters can be defined using"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_4b0cc342","line":426,"range":{"start_line":426,"start_character":0,"end_line":426,"end_character":1},"updated":"2017-02-21 17:40:50.000000000","message":"The :","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":23205,"name":"ianeta hutchinson","email":"ianeta.hutchinson@intel.com","username":"iphutch"},"change_message_id":"a0665c2a6b1f66a9c663d4ea3829adf9b2ccfe5d","unresolved":false,"context_lines":[{"line_number":423,"context_line":""},{"line_number":424,"context_line":"Sorting and filtering"},{"line_number":425,"context_line":"~~~~~~~~~~~~~~~~~~~~~"},{"line_number":426,"context_line":":code:`NeutronDbObject` class has strict validation on which fields sorting"},{"line_number":427,"context_line":"and filtering can happen. When calling :code:`get_objects` and :code:`count`"},{"line_number":428,"context_line":"methods, :code:`validate_filters` is invoked, to see if passed filters are included"},{"line_number":429,"context_line":"in object\u0027s fields. Additional filters can be defined using"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_ab037f0e","line":426,"range":{"start_line":426,"start_character":61,"end_line":426,"end_character":67},"updated":"2017-02-21 17:40:50.000000000","message":"field","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"d425fa630ff5c65f9cecccb37d214f8f4b10c482","unresolved":false,"context_lines":[{"line_number":423,"context_line":""},{"line_number":424,"context_line":"Sorting and filtering"},{"line_number":425,"context_line":"~~~~~~~~~~~~~~~~~~~~~"},{"line_number":426,"context_line":":code:`NeutronDbObject` class has strict validation on which fields sorting"},{"line_number":427,"context_line":"and filtering can happen. When calling :code:`get_objects` and :code:`count`"},{"line_number":428,"context_line":"methods, :code:`validate_filters` is invoked, to see if passed filters are included"},{"line_number":429,"context_line":"in object\u0027s fields. Additional filters can be defined using"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_a13b6937","line":426,"range":{"start_line":426,"start_character":0,"end_line":426,"end_character":1},"in_reply_to":"da36d5c6_4b0cc342","updated":"2017-03-01 23:21:56.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"d425fa630ff5c65f9cecccb37d214f8f4b10c482","unresolved":false,"context_lines":[{"line_number":423,"context_line":""},{"line_number":424,"context_line":"Sorting and filtering"},{"line_number":425,"context_line":"~~~~~~~~~~~~~~~~~~~~~"},{"line_number":426,"context_line":":code:`NeutronDbObject` class has strict validation on which fields sorting"},{"line_number":427,"context_line":"and filtering can happen. When calling :code:`get_objects` and :code:`count`"},{"line_number":428,"context_line":"methods, :code:`validate_filters` is invoked, to see if passed filters are included"},{"line_number":429,"context_line":"in object\u0027s fields. Additional filters can be defined using"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_e14561b3","line":426,"range":{"start_line":426,"start_character":61,"end_line":426,"end_character":67},"in_reply_to":"da36d5c6_ab037f0e","updated":"2017-03-01 23:21:56.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":425,"context_line":"~~~~~~~~~~~~~~~~~~~~~"},{"line_number":426,"context_line":":code:`NeutronDbObject` class has strict validation on which fields sorting"},{"line_number":427,"context_line":"and filtering can happen. When calling :code:`get_objects` and :code:`count`"},{"line_number":428,"context_line":"methods, :code:`validate_filters` is invoked, to see if passed filters are included"},{"line_number":429,"context_line":"in object\u0027s fields. Additional filters can be defined using"},{"line_number":430,"context_line":":code:`register_filter_hook_on_model`. This will add requested string to valid"},{"line_number":431,"context_line":"filter names in object implementation. It is optional."},{"line_number":432,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_f13781fc","line":429,"range":{"start_line":428,"start_character":44,"end_line":429,"end_character":19},"updated":"2017-02-24 05:08:00.000000000","message":"no. it\u0027s not to see if it\u0027s one of fields; it\u0027s to see if it\u0027s a supported filter criterion (which is by default non-synthetic fields only).","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"d425fa630ff5c65f9cecccb37d214f8f4b10c482","unresolved":false,"context_lines":[{"line_number":425,"context_line":"~~~~~~~~~~~~~~~~~~~~~"},{"line_number":426,"context_line":":code:`NeutronDbObject` class has strict validation on which fields sorting"},{"line_number":427,"context_line":"and filtering can happen. When calling :code:`get_objects` and :code:`count`"},{"line_number":428,"context_line":"methods, :code:`validate_filters` is invoked, to see if passed filters are included"},{"line_number":429,"context_line":"in object\u0027s fields. Additional filters can be defined using"},{"line_number":430,"context_line":":code:`register_filter_hook_on_model`. This will add requested string to valid"},{"line_number":431,"context_line":"filter names in object implementation. It is optional."},{"line_number":432,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_a169a927","line":429,"range":{"start_line":428,"start_character":44,"end_line":429,"end_character":19},"in_reply_to":"da36d5c6_f13781fc","updated":"2017-03-01 23:21:56.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":23205,"name":"ianeta hutchinson","email":"ianeta.hutchinson@intel.com","username":"iphutch"},"change_message_id":"a0665c2a6b1f66a9c663d4ea3829adf9b2ccfe5d","unresolved":false,"context_lines":[{"line_number":427,"context_line":"and filtering can happen. When calling :code:`get_objects` and :code:`count`"},{"line_number":428,"context_line":"methods, :code:`validate_filters` is invoked, to see if passed filters are included"},{"line_number":429,"context_line":"in object\u0027s fields. Additional filters can be defined using"},{"line_number":430,"context_line":":code:`register_filter_hook_on_model`. This will add requested string to valid"},{"line_number":431,"context_line":"filter names in object implementation. It is optional."},{"line_number":432,"context_line":""},{"line_number":433,"context_line":":code:`register_filter_hook_on_model` is a complementary implementation in"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_e603ee0b","line":430,"range":{"start_line":430,"start_character":52,"end_line":430,"end_character":53},"updated":"2017-02-21 17:40:50.000000000","message":"the","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"d425fa630ff5c65f9cecccb37d214f8f4b10c482","unresolved":false,"context_lines":[{"line_number":427,"context_line":"and filtering can happen. When calling :code:`get_objects` and :code:`count`"},{"line_number":428,"context_line":"methods, :code:`validate_filters` is invoked, to see if passed filters are included"},{"line_number":429,"context_line":"in object\u0027s fields. Additional filters can be defined using"},{"line_number":430,"context_line":":code:`register_filter_hook_on_model`. This will add requested string to valid"},{"line_number":431,"context_line":"filter names in object implementation. It is optional."},{"line_number":432,"context_line":""},{"line_number":433,"context_line":":code:`register_filter_hook_on_model` is a complementary implementation in"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_212f79f7","line":430,"range":{"start_line":430,"start_character":52,"end_line":430,"end_character":53},"in_reply_to":"da36d5c6_e603ee0b","updated":"2017-03-01 23:21:56.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":23205,"name":"ianeta hutchinson","email":"ianeta.hutchinson@intel.com","username":"iphutch"},"change_message_id":"a0665c2a6b1f66a9c663d4ea3829adf9b2ccfe5d","unresolved":false,"context_lines":[{"line_number":431,"context_line":"filter names in object implementation. It is optional."},{"line_number":432,"context_line":""},{"line_number":433,"context_line":":code:`register_filter_hook_on_model` is a complementary implementation in"},{"line_number":434,"context_line":"NeutronDbObject layer to DB layer\u0027s :code:`register_model_query_hook`, which adds"},{"line_number":435,"context_line":"support for extra filtering during construction of SQL query. When extension"},{"line_number":436,"context_line":"defines extra query hook, it needs to be registered using object\u0027s"},{"line_number":437,"context_line":":code:`register_filter_hook_on_model`, if it is not already included in object\u0027s"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_260ee634","line":434,"range":{"start_line":434,"start_character":0,"end_line":434,"end_character":1},"updated":"2017-02-21 17:40:50.000000000","message":"the N","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"d425fa630ff5c65f9cecccb37d214f8f4b10c482","unresolved":false,"context_lines":[{"line_number":431,"context_line":"filter names in object implementation. It is optional."},{"line_number":432,"context_line":""},{"line_number":433,"context_line":":code:`register_filter_hook_on_model` is a complementary implementation in"},{"line_number":434,"context_line":"NeutronDbObject layer to DB layer\u0027s :code:`register_model_query_hook`, which adds"},{"line_number":435,"context_line":"support for extra filtering during construction of SQL query. When extension"},{"line_number":436,"context_line":"defines extra query hook, it needs to be registered using object\u0027s"},{"line_number":437,"context_line":":code:`register_filter_hook_on_model`, if it is not already included in object\u0027s"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_e1ee41b3","line":434,"range":{"start_line":434,"start_character":0,"end_line":434,"end_character":1},"in_reply_to":"da36d5c6_260ee634","updated":"2017-03-01 23:21:56.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":23205,"name":"ianeta hutchinson","email":"ianeta.hutchinson@intel.com","username":"iphutch"},"change_message_id":"a0665c2a6b1f66a9c663d4ea3829adf9b2ccfe5d","unresolved":false,"context_lines":[{"line_number":433,"context_line":":code:`register_filter_hook_on_model` is a complementary implementation in"},{"line_number":434,"context_line":"NeutronDbObject layer to DB layer\u0027s :code:`register_model_query_hook`, which adds"},{"line_number":435,"context_line":"support for extra filtering during construction of SQL query. When extension"},{"line_number":436,"context_line":"defines extra query hook, it needs to be registered using object\u0027s"},{"line_number":437,"context_line":":code:`register_filter_hook_on_model`, if it is not already included in object\u0027s"},{"line_number":438,"context_line":":code:`fields`."},{"line_number":439,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_4613da5c","line":436,"range":{"start_line":436,"start_character":58,"end_line":436,"end_character":66},"updated":"2017-02-21 17:40:50.000000000","message":"the objects","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"d425fa630ff5c65f9cecccb37d214f8f4b10c482","unresolved":false,"context_lines":[{"line_number":433,"context_line":":code:`register_filter_hook_on_model` is a complementary implementation in"},{"line_number":434,"context_line":"NeutronDbObject layer to DB layer\u0027s :code:`register_model_query_hook`, which adds"},{"line_number":435,"context_line":"support for extra filtering during construction of SQL query. When extension"},{"line_number":436,"context_line":"defines extra query hook, it needs to be registered using object\u0027s"},{"line_number":437,"context_line":":code:`register_filter_hook_on_model`, if it is not already included in object\u0027s"},{"line_number":438,"context_line":":code:`fields`."},{"line_number":439,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_61025171","line":436,"range":{"start_line":436,"start_character":58,"end_line":436,"end_character":66},"in_reply_to":"da36d5c6_4613da5c","updated":"2017-03-01 23:21:56.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":23205,"name":"ianeta hutchinson","email":"ianeta.hutchinson@intel.com","username":"iphutch"},"change_message_id":"a0665c2a6b1f66a9c663d4ea3829adf9b2ccfe5d","unresolved":false,"context_lines":[{"line_number":434,"context_line":"NeutronDbObject layer to DB layer\u0027s :code:`register_model_query_hook`, which adds"},{"line_number":435,"context_line":"support for extra filtering during construction of SQL query. When extension"},{"line_number":436,"context_line":"defines extra query hook, it needs to be registered using object\u0027s"},{"line_number":437,"context_line":":code:`register_filter_hook_on_model`, if it is not already included in object\u0027s"},{"line_number":438,"context_line":":code:`fields`."},{"line_number":439,"context_line":""},{"line_number":440,"context_line":"In order to disable filter validation, :code:`validate_filters\u003dFalse` needs to be"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_6610de4f","line":437,"range":{"start_line":437,"start_character":71,"end_line":437,"end_character":80},"updated":"2017-02-21 17:40:50.000000000","message":"the objects","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"d425fa630ff5c65f9cecccb37d214f8f4b10c482","unresolved":false,"context_lines":[{"line_number":434,"context_line":"NeutronDbObject layer to DB layer\u0027s :code:`register_model_query_hook`, which adds"},{"line_number":435,"context_line":"support for extra filtering during construction of SQL query. When extension"},{"line_number":436,"context_line":"defines extra query hook, it needs to be registered using object\u0027s"},{"line_number":437,"context_line":":code:`register_filter_hook_on_model`, if it is not already included in object\u0027s"},{"line_number":438,"context_line":":code:`fields`."},{"line_number":439,"context_line":""},{"line_number":440,"context_line":"In order to disable filter validation, :code:`validate_filters\u003dFalse` needs to be"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_41ff0d67","line":437,"range":{"start_line":437,"start_character":71,"end_line":437,"end_character":80},"in_reply_to":"da36d5c6_6610de4f","updated":"2017-03-01 23:21:56.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":23205,"name":"ianeta hutchinson","email":"ianeta.hutchinson@intel.com","username":"iphutch"},"change_message_id":"a0665c2a6b1f66a9c663d4ea3829adf9b2ccfe5d","unresolved":false,"context_lines":[{"line_number":438,"context_line":":code:`fields`."},{"line_number":439,"context_line":""},{"line_number":440,"context_line":"In order to disable filter validation, :code:`validate_filters\u003dFalse` needs to be"},{"line_number":441,"context_line":"passed as argument in :code:`get_objects` and :code:`count` methods. It was added"},{"line_number":442,"context_line":"because the default behaviour of Neutron API is to accept everything at API level"},{"line_number":443,"context_line":"and filter it out at DB layer. This can be used by out of tree extensions."},{"line_number":444,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_861dd268","line":441,"range":{"start_line":441,"start_character":9,"end_line":441,"end_character":10},"updated":"2017-02-21 17:40:50.000000000","message":"an","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":23205,"name":"ianeta hutchinson","email":"ianeta.hutchinson@intel.com","username":"iphutch"},"change_message_id":"a0665c2a6b1f66a9c663d4ea3829adf9b2ccfe5d","unresolved":false,"context_lines":[{"line_number":438,"context_line":":code:`fields`."},{"line_number":439,"context_line":""},{"line_number":440,"context_line":"In order to disable filter validation, :code:`validate_filters\u003dFalse` needs to be"},{"line_number":441,"context_line":"passed as argument in :code:`get_objects` and :code:`count` methods. It was added"},{"line_number":442,"context_line":"because the default behaviour of Neutron API is to accept everything at API level"},{"line_number":443,"context_line":"and filter it out at DB layer. This can be used by out of tree extensions."},{"line_number":444,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_a61ad66c","line":441,"range":{"start_line":441,"start_character":21,"end_line":441,"end_character":22},"updated":"2017-02-21 17:40:50.000000000","message":"the","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"d425fa630ff5c65f9cecccb37d214f8f4b10c482","unresolved":false,"context_lines":[{"line_number":438,"context_line":":code:`fields`."},{"line_number":439,"context_line":""},{"line_number":440,"context_line":"In order to disable filter validation, :code:`validate_filters\u003dFalse` needs to be"},{"line_number":441,"context_line":"passed as argument in :code:`get_objects` and :code:`count` methods. It was added"},{"line_number":442,"context_line":"because the default behaviour of Neutron API is to accept everything at API level"},{"line_number":443,"context_line":"and filter it out at DB layer. This can be used by out of tree extensions."},{"line_number":444,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_e1d721eb","line":441,"range":{"start_line":441,"start_character":9,"end_line":441,"end_character":10},"in_reply_to":"da36d5c6_861dd268","updated":"2017-03-01 23:21:56.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"d425fa630ff5c65f9cecccb37d214f8f4b10c482","unresolved":false,"context_lines":[{"line_number":438,"context_line":":code:`fields`."},{"line_number":439,"context_line":""},{"line_number":440,"context_line":"In order to disable filter validation, :code:`validate_filters\u003dFalse` needs to be"},{"line_number":441,"context_line":"passed as argument in :code:`get_objects` and :code:`count` methods. It was added"},{"line_number":442,"context_line":"because the default behaviour of Neutron API is to accept everything at API level"},{"line_number":443,"context_line":"and filter it out at DB layer. This can be used by out of tree extensions."},{"line_number":444,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_c1dcdd14","line":441,"range":{"start_line":441,"start_character":21,"end_line":441,"end_character":22},"in_reply_to":"da36d5c6_a61ad66c","updated":"2017-03-01 23:21:56.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":23205,"name":"ianeta hutchinson","email":"ianeta.hutchinson@intel.com","username":"iphutch"},"change_message_id":"a0665c2a6b1f66a9c663d4ea3829adf9b2ccfe5d","unresolved":false,"context_lines":[{"line_number":439,"context_line":""},{"line_number":440,"context_line":"In order to disable filter validation, :code:`validate_filters\u003dFalse` needs to be"},{"line_number":441,"context_line":"passed as argument in :code:`get_objects` and :code:`count` methods. It was added"},{"line_number":442,"context_line":"because the default behaviour of Neutron API is to accept everything at API level"},{"line_number":443,"context_line":"and filter it out at DB layer. This can be used by out of tree extensions."},{"line_number":444,"context_line":""},{"line_number":445,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_c6250aaf","line":442,"range":{"start_line":442,"start_character":32,"end_line":442,"end_character":33},"updated":"2017-02-21 17:40:50.000000000","message":"the","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"d425fa630ff5c65f9cecccb37d214f8f4b10c482","unresolved":false,"context_lines":[{"line_number":439,"context_line":""},{"line_number":440,"context_line":"In order to disable filter validation, :code:`validate_filters\u003dFalse` needs to be"},{"line_number":441,"context_line":"passed as argument in :code:`get_objects` and :code:`count` methods. It was added"},{"line_number":442,"context_line":"because the default behaviour of Neutron API is to accept everything at API level"},{"line_number":443,"context_line":"and filter it out at DB layer. This can be used by out of tree extensions."},{"line_number":444,"context_line":""},{"line_number":445,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_a1cd295f","line":442,"range":{"start_line":442,"start_character":32,"end_line":442,"end_character":33},"in_reply_to":"da36d5c6_c6250aaf","updated":"2017-03-01 23:21:56.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":469,"context_line":"    base_obj.register_filter_hook_on_model(models_v2.DNSNameServer, CHANGED_SINCE)"},{"line_number":470,"context_line":"    # You have to pass the database model, and it will register the filter name"},{"line_number":471,"context_line":"    # in OVO object class"},{"line_number":472,"context_line":""},{"line_number":473,"context_line":""},{"line_number":474,"context_line":"Standard attributes"},{"line_number":475,"context_line":"-------------------"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_11109558","line":472,"updated":"2017-02-24 05:08:00.000000000","message":"consider also explaining how to use pagination","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"4c18be62cb4f8216d166508442a8ea7f4b66bd27","unresolved":false,"context_lines":[{"line_number":469,"context_line":"    base_obj.register_filter_hook_on_model(models_v2.DNSNameServer, CHANGED_SINCE)"},{"line_number":470,"context_line":"    # You have to pass the database model, and it will register the filter name"},{"line_number":471,"context_line":"    # in OVO object class"},{"line_number":472,"context_line":""},{"line_number":473,"context_line":""},{"line_number":474,"context_line":"Standard attributes"},{"line_number":475,"context_line":"-------------------"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_821ca4c2","line":472,"in_reply_to":"da36d5c6_11109558","updated":"2017-03-02 00:07:15.000000000","message":"Could you give an example?","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":23205,"name":"ianeta hutchinson","email":"ianeta.hutchinson@intel.com","username":"iphutch"},"change_message_id":"a0665c2a6b1f66a9c663d4ea3829adf9b2ccfe5d","unresolved":false,"context_lines":[{"line_number":474,"context_line":"Standard attributes"},{"line_number":475,"context_line":"-------------------"},{"line_number":476,"context_line":"The standard attributes are added automatically in metaclass"},{"line_number":477,"context_line":"DeclarativeObject. If adding standard attribute, it has to be added in"},{"line_number":478,"context_line":"``neutron/objects/extensions/standardattributes.py``. It will be added"},{"line_number":479,"context_line":"to all relevant objects that is using the standardattributes model."},{"line_number":480,"context_line":"Be careful then adding something to above, because it could trigger change of"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_a631f6ee","line":477,"range":{"start_line":477,"start_character":0,"end_line":477,"end_character":17},"updated":"2017-02-21 17:40:50.000000000","message":"``DeclarativeObject``","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"d425fa630ff5c65f9cecccb37d214f8f4b10c482","unresolved":false,"context_lines":[{"line_number":474,"context_line":"Standard attributes"},{"line_number":475,"context_line":"-------------------"},{"line_number":476,"context_line":"The standard attributes are added automatically in metaclass"},{"line_number":477,"context_line":"DeclarativeObject. If adding standard attribute, it has to be added in"},{"line_number":478,"context_line":"``neutron/objects/extensions/standardattributes.py``. It will be added"},{"line_number":479,"context_line":"to all relevant objects that is using the standardattributes model."},{"line_number":480,"context_line":"Be careful then adding something to above, because it could trigger change of"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_415b8d87","line":477,"range":{"start_line":477,"start_character":0,"end_line":477,"end_character":17},"in_reply_to":"da36d5c6_a631f6ee","updated":"2017-03-01 23:21:56.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":23205,"name":"ianeta hutchinson","email":"ianeta.hutchinson@intel.com","username":"iphutch"},"change_message_id":"a0665c2a6b1f66a9c663d4ea3829adf9b2ccfe5d","unresolved":false,"context_lines":[{"line_number":476,"context_line":"The standard attributes are added automatically in metaclass"},{"line_number":477,"context_line":"DeclarativeObject. If adding standard attribute, it has to be added in"},{"line_number":478,"context_line":"``neutron/objects/extensions/standardattributes.py``. It will be added"},{"line_number":479,"context_line":"to all relevant objects that is using the standardattributes model."},{"line_number":480,"context_line":"Be careful then adding something to above, because it could trigger change of"},{"line_number":481,"context_line":"the object\u0027s :code:`VERSION`."},{"line_number":482,"context_line":"For more on how standard attributes work, check [#]_."}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_c64c2a79","line":479,"range":{"start_line":479,"start_character":42,"end_line":479,"end_character":60},"updated":"2017-02-21 17:40:50.000000000","message":"``standardattributes``","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"6e9d20ec348efd6674d113adb9320ceab1815608","unresolved":false,"context_lines":[{"line_number":476,"context_line":"The standard attributes are added automatically in metaclass"},{"line_number":477,"context_line":"DeclarativeObject. If adding standard attribute, it has to be added in"},{"line_number":478,"context_line":"``neutron/objects/extensions/standardattributes.py``. It will be added"},{"line_number":479,"context_line":"to all relevant objects that is using the standardattributes model."},{"line_number":480,"context_line":"Be careful then adding something to above, because it could trigger change of"},{"line_number":481,"context_line":"the object\u0027s :code:`VERSION`."},{"line_number":482,"context_line":"For more on how standard attributes work, check [#]_."}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_c62b4a32","line":479,"range":{"start_line":479,"start_character":29,"end_line":479,"end_character":37},"updated":"2017-02-20 00:37:09.000000000","message":"use","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"d425fa630ff5c65f9cecccb37d214f8f4b10c482","unresolved":false,"context_lines":[{"line_number":476,"context_line":"The standard attributes are added automatically in metaclass"},{"line_number":477,"context_line":"DeclarativeObject. If adding standard attribute, it has to be added in"},{"line_number":478,"context_line":"``neutron/objects/extensions/standardattributes.py``. It will be added"},{"line_number":479,"context_line":"to all relevant objects that is using the standardattributes model."},{"line_number":480,"context_line":"Be careful then adding something to above, because it could trigger change of"},{"line_number":481,"context_line":"the object\u0027s :code:`VERSION`."},{"line_number":482,"context_line":"For more on how standard attributes work, check [#]_."}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_a150c95f","line":479,"range":{"start_line":479,"start_character":29,"end_line":479,"end_character":37},"in_reply_to":"da36d5c6_c62b4a32","updated":"2017-03-01 23:21:56.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"d425fa630ff5c65f9cecccb37d214f8f4b10c482","unresolved":false,"context_lines":[{"line_number":476,"context_line":"The standard attributes are added automatically in metaclass"},{"line_number":477,"context_line":"DeclarativeObject. If adding standard attribute, it has to be added in"},{"line_number":478,"context_line":"``neutron/objects/extensions/standardattributes.py``. It will be added"},{"line_number":479,"context_line":"to all relevant objects that is using the standardattributes model."},{"line_number":480,"context_line":"Be careful then adding something to above, because it could trigger change of"},{"line_number":481,"context_line":"the object\u0027s :code:`VERSION`."},{"line_number":482,"context_line":"For more on how standard attributes work, check [#]_."}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_c14f7dbb","line":479,"range":{"start_line":479,"start_character":42,"end_line":479,"end_character":60},"in_reply_to":"da36d5c6_c64c2a79","updated":"2017-03-01 23:21:56.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":23205,"name":"ianeta hutchinson","email":"ianeta.hutchinson@intel.com","username":"iphutch"},"change_message_id":"a0665c2a6b1f66a9c663d4ea3829adf9b2ccfe5d","unresolved":false,"context_lines":[{"line_number":477,"context_line":"DeclarativeObject. If adding standard attribute, it has to be added in"},{"line_number":478,"context_line":"``neutron/objects/extensions/standardattributes.py``. It will be added"},{"line_number":479,"context_line":"to all relevant objects that is using the standardattributes model."},{"line_number":480,"context_line":"Be careful then adding something to above, because it could trigger change of"},{"line_number":481,"context_line":"the object\u0027s :code:`VERSION`."},{"line_number":482,"context_line":"For more on how standard attributes work, check [#]_."},{"line_number":483,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_265c2625","line":480,"range":{"start_line":480,"start_character":67,"end_line":480,"end_character":77},"updated":"2017-02-21 17:40:50.000000000","message":"a change in","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":23205,"name":"ianeta hutchinson","email":"ianeta.hutchinson@intel.com","username":"iphutch"},"change_message_id":"a0665c2a6b1f66a9c663d4ea3829adf9b2ccfe5d","unresolved":false,"context_lines":[{"line_number":477,"context_line":"DeclarativeObject. If adding standard attribute, it has to be added in"},{"line_number":478,"context_line":"``neutron/objects/extensions/standardattributes.py``. It will be added"},{"line_number":479,"context_line":"to all relevant objects that is using the standardattributes model."},{"line_number":480,"context_line":"Be careful then adding something to above, because it could trigger change of"},{"line_number":481,"context_line":"the object\u0027s :code:`VERSION`."},{"line_number":482,"context_line":"For more on how standard attributes work, check [#]_."},{"line_number":483,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_06572203","line":480,"range":{"start_line":480,"start_character":35,"end_line":480,"end_character":36},"updated":"2017-02-21 17:40:50.000000000","message":"the","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"6e9d20ec348efd6674d113adb9320ceab1815608","unresolved":false,"context_lines":[{"line_number":477,"context_line":"DeclarativeObject. If adding standard attribute, it has to be added in"},{"line_number":478,"context_line":"``neutron/objects/extensions/standardattributes.py``. It will be added"},{"line_number":479,"context_line":"to all relevant objects that is using the standardattributes model."},{"line_number":480,"context_line":"Be careful then adding something to above, because it could trigger change of"},{"line_number":481,"context_line":"the object\u0027s :code:`VERSION`."},{"line_number":482,"context_line":"For more on how standard attributes work, check [#]_."},{"line_number":483,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_06264268","line":480,"range":{"start_line":480,"start_character":11,"end_line":480,"end_character":15},"updated":"2017-02-20 00:37:09.000000000","message":"when","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":23205,"name":"ianeta hutchinson","email":"ianeta.hutchinson@intel.com","username":"iphutch"},"change_message_id":"a0665c2a6b1f66a9c663d4ea3829adf9b2ccfe5d","unresolved":false,"context_lines":[{"line_number":477,"context_line":"DeclarativeObject. If adding standard attribute, it has to be added in"},{"line_number":478,"context_line":"``neutron/objects/extensions/standardattributes.py``. It will be added"},{"line_number":479,"context_line":"to all relevant objects that is using the standardattributes model."},{"line_number":480,"context_line":"Be careful then adding something to above, because it could trigger change of"},{"line_number":481,"context_line":"the object\u0027s :code:`VERSION`."},{"line_number":482,"context_line":"For more on how standard attributes work, check [#]_."},{"line_number":483,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_e6512e10","line":480,"range":{"start_line":480,"start_character":11,"end_line":480,"end_character":15},"updated":"2017-02-21 17:40:50.000000000","message":"when","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"d425fa630ff5c65f9cecccb37d214f8f4b10c482","unresolved":false,"context_lines":[{"line_number":477,"context_line":"DeclarativeObject. If adding standard attribute, it has to be added in"},{"line_number":478,"context_line":"``neutron/objects/extensions/standardattributes.py``. It will be added"},{"line_number":479,"context_line":"to all relevant objects that is using the standardattributes model."},{"line_number":480,"context_line":"Be careful then adding something to above, because it could trigger change of"},{"line_number":481,"context_line":"the object\u0027s :code:`VERSION`."},{"line_number":482,"context_line":"For more on how standard attributes work, check [#]_."},{"line_number":483,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_e14ac1ab","line":480,"range":{"start_line":480,"start_character":11,"end_line":480,"end_character":15},"in_reply_to":"da36d5c6_06264268","updated":"2017-03-01 23:21:56.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"d425fa630ff5c65f9cecccb37d214f8f4b10c482","unresolved":false,"context_lines":[{"line_number":477,"context_line":"DeclarativeObject. If adding standard attribute, it has to be added in"},{"line_number":478,"context_line":"``neutron/objects/extensions/standardattributes.py``. It will be added"},{"line_number":479,"context_line":"to all relevant objects that is using the standardattributes model."},{"line_number":480,"context_line":"Be careful then adding something to above, because it could trigger change of"},{"line_number":481,"context_line":"the object\u0027s :code:`VERSION`."},{"line_number":482,"context_line":"For more on how standard attributes work, check [#]_."},{"line_number":483,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_21cbf91f","line":480,"range":{"start_line":480,"start_character":35,"end_line":480,"end_character":36},"in_reply_to":"da36d5c6_06572203","updated":"2017-03-01 23:21:56.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"d425fa630ff5c65f9cecccb37d214f8f4b10c482","unresolved":false,"context_lines":[{"line_number":477,"context_line":"DeclarativeObject. If adding standard attribute, it has to be added in"},{"line_number":478,"context_line":"``neutron/objects/extensions/standardattributes.py``. It will be added"},{"line_number":479,"context_line":"to all relevant objects that is using the standardattributes model."},{"line_number":480,"context_line":"Be careful then adding something to above, because it could trigger change of"},{"line_number":481,"context_line":"the object\u0027s :code:`VERSION`."},{"line_number":482,"context_line":"For more on how standard attributes work, check [#]_."},{"line_number":483,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_61d5f1b7","line":480,"range":{"start_line":480,"start_character":67,"end_line":480,"end_character":77},"in_reply_to":"da36d5c6_265c2625","updated":"2017-03-01 23:21:56.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"d425fa630ff5c65f9cecccb37d214f8f4b10c482","unresolved":false,"context_lines":[{"line_number":477,"context_line":"DeclarativeObject. If adding standard attribute, it has to be added in"},{"line_number":478,"context_line":"``neutron/objects/extensions/standardattributes.py``. It will be added"},{"line_number":479,"context_line":"to all relevant objects that is using the standardattributes model."},{"line_number":480,"context_line":"Be careful then adding something to above, because it could trigger change of"},{"line_number":481,"context_line":"the object\u0027s :code:`VERSION`."},{"line_number":482,"context_line":"For more on how standard attributes work, check [#]_."},{"line_number":483,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_81dca5e5","line":480,"range":{"start_line":480,"start_character":11,"end_line":480,"end_character":15},"in_reply_to":"da36d5c6_e6512e10","updated":"2017-03-01 23:21:56.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":23205,"name":"ianeta hutchinson","email":"ianeta.hutchinson@intel.com","username":"iphutch"},"change_message_id":"a0665c2a6b1f66a9c663d4ea3829adf9b2ccfe5d","unresolved":false,"context_lines":[{"line_number":490,"context_line":"The RBAC support for objects is defined in ``neutron/objects/rbac_db.py``."},{"line_number":491,"context_line":"It defines new base class :code:`NeutronRbacObject`. The new class wraps standard"},{"line_number":492,"context_line":":code:`NeutronDbObject` methods like :code:`create`, :code:`update` and"},{"line_number":493,"context_line":":code:`to_dict`. It checks if \u0027shared\u0027 attribute is defined in :code:`fields`"},{"line_number":494,"context_line":"dictionary and adds it to :code:`synthetic_fields`. Also :code:`rbac_db_model`"},{"line_number":495,"context_line":"is required to be defined in Network and QosPolicy classes."},{"line_number":496,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_663e1eba","line":493,"range":{"start_line":493,"start_character":29,"end_line":493,"end_character":30},"updated":"2017-02-21 17:40:50.000000000","message":"the","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":23205,"name":"ianeta hutchinson","email":"ianeta.hutchinson@intel.com","username":"iphutch"},"change_message_id":"a0665c2a6b1f66a9c663d4ea3829adf9b2ccfe5d","unresolved":false,"context_lines":[{"line_number":490,"context_line":"The RBAC support for objects is defined in ``neutron/objects/rbac_db.py``."},{"line_number":491,"context_line":"It defines new base class :code:`NeutronRbacObject`. The new class wraps standard"},{"line_number":492,"context_line":":code:`NeutronDbObject` methods like :code:`create`, :code:`update` and"},{"line_number":493,"context_line":":code:`to_dict`. It checks if \u0027shared\u0027 attribute is defined in :code:`fields`"},{"line_number":494,"context_line":"dictionary and adds it to :code:`synthetic_fields`. Also :code:`rbac_db_model`"},{"line_number":495,"context_line":"is required to be defined in Network and QosPolicy classes."},{"line_number":496,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_864b1259","line":493,"range":{"start_line":493,"start_character":62,"end_line":493,"end_character":63},"updated":"2017-02-21 17:40:50.000000000","message":"the","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"d425fa630ff5c65f9cecccb37d214f8f4b10c482","unresolved":false,"context_lines":[{"line_number":490,"context_line":"The RBAC support for objects is defined in ``neutron/objects/rbac_db.py``."},{"line_number":491,"context_line":"It defines new base class :code:`NeutronRbacObject`. The new class wraps standard"},{"line_number":492,"context_line":":code:`NeutronDbObject` methods like :code:`create`, :code:`update` and"},{"line_number":493,"context_line":":code:`to_dict`. It checks if \u0027shared\u0027 attribute is defined in :code:`fields`"},{"line_number":494,"context_line":"dictionary and adds it to :code:`synthetic_fields`. Also :code:`rbac_db_model`"},{"line_number":495,"context_line":"is required to be defined in Network and QosPolicy classes."},{"line_number":496,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_8103c541","line":493,"range":{"start_line":493,"start_character":29,"end_line":493,"end_character":30},"in_reply_to":"da36d5c6_663e1eba","updated":"2017-03-01 23:21:56.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"d425fa630ff5c65f9cecccb37d214f8f4b10c482","unresolved":false,"context_lines":[{"line_number":490,"context_line":"The RBAC support for objects is defined in ``neutron/objects/rbac_db.py``."},{"line_number":491,"context_line":"It defines new base class :code:`NeutronRbacObject`. The new class wraps standard"},{"line_number":492,"context_line":":code:`NeutronDbObject` methods like :code:`create`, :code:`update` and"},{"line_number":493,"context_line":":code:`to_dict`. It checks if \u0027shared\u0027 attribute is defined in :code:`fields`"},{"line_number":494,"context_line":"dictionary and adds it to :code:`synthetic_fields`. Also :code:`rbac_db_model`"},{"line_number":495,"context_line":"is required to be defined in Network and QosPolicy classes."},{"line_number":496,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_21993920","line":493,"range":{"start_line":493,"start_character":62,"end_line":493,"end_character":63},"in_reply_to":"da36d5c6_864b1259","updated":"2017-03-01 23:21:56.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":23205,"name":"ianeta hutchinson","email":"ianeta.hutchinson@intel.com","username":"iphutch"},"change_message_id":"a0665c2a6b1f66a9c663d4ea3829adf9b2ccfe5d","unresolved":false,"context_lines":[{"line_number":491,"context_line":"It defines new base class :code:`NeutronRbacObject`. The new class wraps standard"},{"line_number":492,"context_line":":code:`NeutronDbObject` methods like :code:`create`, :code:`update` and"},{"line_number":493,"context_line":":code:`to_dict`. It checks if \u0027shared\u0027 attribute is defined in :code:`fields`"},{"line_number":494,"context_line":"dictionary and adds it to :code:`synthetic_fields`. Also :code:`rbac_db_model`"},{"line_number":495,"context_line":"is required to be defined in Network and QosPolicy classes."},{"line_number":496,"context_line":""},{"line_number":497,"context_line":":code:`NeutronRbacObject` is a common place to handle all operations on the RBAC"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_a648165d","line":494,"range":{"start_line":494,"start_character":56,"end_line":494,"end_character":57},"updated":"2017-02-21 17:40:50.000000000","message":",","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"d425fa630ff5c65f9cecccb37d214f8f4b10c482","unresolved":false,"context_lines":[{"line_number":491,"context_line":"It defines new base class :code:`NeutronRbacObject`. The new class wraps standard"},{"line_number":492,"context_line":":code:`NeutronDbObject` methods like :code:`create`, :code:`update` and"},{"line_number":493,"context_line":":code:`to_dict`. It checks if \u0027shared\u0027 attribute is defined in :code:`fields`"},{"line_number":494,"context_line":"dictionary and adds it to :code:`synthetic_fields`. Also :code:`rbac_db_model`"},{"line_number":495,"context_line":"is required to be defined in Network and QosPolicy classes."},{"line_number":496,"context_line":""},{"line_number":497,"context_line":":code:`NeutronRbacObject` is a common place to handle all operations on the RBAC"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_41a0ed43","line":494,"range":{"start_line":494,"start_character":56,"end_line":494,"end_character":57},"in_reply_to":"da36d5c6_a648165d","updated":"2017-03-01 23:21:56.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"6e9d20ec348efd6674d113adb9320ceab1815608","unresolved":false,"context_lines":[{"line_number":530,"context_line":"            \u0027shared\u0027: obj_fields.BooleanField(default\u003dFalse),"},{"line_number":531,"context_line":"        }"},{"line_number":532,"context_line":""},{"line_number":533,"context_line":"Note, that \u0027shared\u0027 field is not added to the :code:`synthetic_fields`, because"},{"line_number":534,"context_line":":code:`NeutronRbacObject` requires to add it by itself, otherwise"},{"line_number":535,"context_line":":code:`ObjectActionError` is raised. [#]_"},{"line_number":536,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_661d3e0f","line":533,"updated":"2017-02-20 00:37:09.000000000","message":"See my comment to L76 regarding notes","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":23205,"name":"ianeta hutchinson","email":"ianeta.hutchinson@intel.com","username":"iphutch"},"change_message_id":"a0665c2a6b1f66a9c663d4ea3829adf9b2ccfe5d","unresolved":false,"context_lines":[{"line_number":530,"context_line":"            \u0027shared\u0027: obj_fields.BooleanField(default\u003dFalse),"},{"line_number":531,"context_line":"        }"},{"line_number":532,"context_line":""},{"line_number":533,"context_line":"Note, that \u0027shared\u0027 field is not added to the :code:`synthetic_fields`, because"},{"line_number":534,"context_line":":code:`NeutronRbacObject` requires to add it by itself, otherwise"},{"line_number":535,"context_line":":code:`ObjectActionError` is raised. [#]_"},{"line_number":536,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_e6784e92","line":533,"range":{"start_line":533,"start_character":10,"end_line":533,"end_character":11},"updated":"2017-02-21 17:40:50.000000000","message":"the","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"d425fa630ff5c65f9cecccb37d214f8f4b10c482","unresolved":false,"context_lines":[{"line_number":530,"context_line":"            \u0027shared\u0027: obj_fields.BooleanField(default\u003dFalse),"},{"line_number":531,"context_line":"        }"},{"line_number":532,"context_line":""},{"line_number":533,"context_line":"Note, that \u0027shared\u0027 field is not added to the :code:`synthetic_fields`, because"},{"line_number":534,"context_line":":code:`NeutronRbacObject` requires to add it by itself, otherwise"},{"line_number":535,"context_line":":code:`ObjectActionError` is raised. [#]_"},{"line_number":536,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_41b70d86","line":533,"in_reply_to":"da36d5c6_661d3e0f","updated":"2017-03-01 23:21:56.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"d425fa630ff5c65f9cecccb37d214f8f4b10c482","unresolved":false,"context_lines":[{"line_number":530,"context_line":"            \u0027shared\u0027: obj_fields.BooleanField(default\u003dFalse),"},{"line_number":531,"context_line":"        }"},{"line_number":532,"context_line":""},{"line_number":533,"context_line":"Note, that \u0027shared\u0027 field is not added to the :code:`synthetic_fields`, because"},{"line_number":534,"context_line":":code:`NeutronRbacObject` requires to add it by itself, otherwise"},{"line_number":535,"context_line":":code:`ObjectActionError` is raised. [#]_"},{"line_number":536,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_61ba5170","line":533,"range":{"start_line":533,"start_character":10,"end_line":533,"end_character":11},"in_reply_to":"da36d5c6_e6784e92","updated":"2017-03-01 23:21:56.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":23205,"name":"ianeta hutchinson","email":"ianeta.hutchinson@intel.com","username":"iphutch"},"change_message_id":"a0665c2a6b1f66a9c663d4ea3829adf9b2ccfe5d","unresolved":false,"context_lines":[{"line_number":537,"context_line":"Extensions to neutron resources"},{"line_number":538,"context_line":"-------------------------------"},{"line_number":539,"context_line":"One of the methods to extend neutron resources is to add an arbitrary value to"},{"line_number":540,"context_line":"dictionary representing the data by providing extend_(subnet|port|network)_dict"},{"line_number":541,"context_line":"function and defining loading method."},{"line_number":542,"context_line":""},{"line_number":543,"context_line":"From DB perspective, all the data will be loaded, including all declared fields"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_bd6ace18","line":540,"range":{"start_line":540,"start_character":46,"end_line":540,"end_character":79},"updated":"2017-02-21 17:40:50.000000000","message":"Use `` for literal text: ``extend_(subnet|port|network)_dict``","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"d425fa630ff5c65f9cecccb37d214f8f4b10c482","unresolved":false,"context_lines":[{"line_number":537,"context_line":"Extensions to neutron resources"},{"line_number":538,"context_line":"-------------------------------"},{"line_number":539,"context_line":"One of the methods to extend neutron resources is to add an arbitrary value to"},{"line_number":540,"context_line":"dictionary representing the data by providing extend_(subnet|port|network)_dict"},{"line_number":541,"context_line":"function and defining loading method."},{"line_number":542,"context_line":""},{"line_number":543,"context_line":"From DB perspective, all the data will be loaded, including all declared fields"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_7c4036a6","line":540,"range":{"start_line":540,"start_character":46,"end_line":540,"end_character":79},"in_reply_to":"da36d5c6_bd6ace18","updated":"2017-03-01 23:21:56.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"6e9d20ec348efd6674d113adb9320ceab1815608","unresolved":false,"context_lines":[{"line_number":544,"context_line":"from DB relationships. Current implementation for core resources (Port, Subnet,"},{"line_number":545,"context_line":"Network etc.) is that DB result is parsed by make_\u003cresource\u003e_dict and"},{"line_number":546,"context_line":"extend_\u003cresource\u003e_dict. When extension is enabled, extend_\u003cresource\u003e_dict is"},{"line_number":547,"context_line":"taking the DB results and declaring new fields in resulting dict. When extension"},{"line_number":548,"context_line":"is not enabled, data will be fetched, but will not be populated into resulting dict,"},{"line_number":549,"context_line":"because extend_\u003cresource\u003e_dict will not be called."},{"line_number":550,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_a61736ec","line":547,"range":{"start_line":547,"start_character":26,"end_line":547,"end_character":35},"updated":"2017-02-20 00:37:09.000000000","message":"declares","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"6e9d20ec348efd6674d113adb9320ceab1815608","unresolved":false,"context_lines":[{"line_number":543,"context_line":"From DB perspective, all the data will be loaded, including all declared fields"},{"line_number":544,"context_line":"from DB relationships. Current implementation for core resources (Port, Subnet,"},{"line_number":545,"context_line":"Network etc.) is that DB result is parsed by make_\u003cresource\u003e_dict and"},{"line_number":546,"context_line":"extend_\u003cresource\u003e_dict. When extension is enabled, extend_\u003cresource\u003e_dict is"},{"line_number":547,"context_line":"taking the DB results and declaring new fields in resulting dict. When extension"},{"line_number":548,"context_line":"is not enabled, data will be fetched, but will not be populated into resulting dict,"},{"line_number":549,"context_line":"because extend_\u003cresource\u003e_dict will not be called."},{"line_number":550,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_861a3216","line":547,"range":{"start_line":546,"start_character":74,"end_line":547,"end_character":6},"updated":"2017-02-20 00:37:09.000000000","message":"takes","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"d425fa630ff5c65f9cecccb37d214f8f4b10c482","unresolved":false,"context_lines":[{"line_number":543,"context_line":"From DB perspective, all the data will be loaded, including all declared fields"},{"line_number":544,"context_line":"from DB relationships. Current implementation for core resources (Port, Subnet,"},{"line_number":545,"context_line":"Network etc.) is that DB result is parsed by make_\u003cresource\u003e_dict and"},{"line_number":546,"context_line":"extend_\u003cresource\u003e_dict. When extension is enabled, extend_\u003cresource\u003e_dict is"},{"line_number":547,"context_line":"taking the DB results and declaring new fields in resulting dict. When extension"},{"line_number":548,"context_line":"is not enabled, data will be fetched, but will not be populated into resulting dict,"},{"line_number":549,"context_line":"because extend_\u003cresource\u003e_dict will not be called."},{"line_number":550,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_c1593d5c","line":547,"range":{"start_line":546,"start_character":74,"end_line":547,"end_character":6},"in_reply_to":"da36d5c6_861a3216","updated":"2017-03-01 23:21:56.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"d425fa630ff5c65f9cecccb37d214f8f4b10c482","unresolved":false,"context_lines":[{"line_number":544,"context_line":"from DB relationships. Current implementation for core resources (Port, Subnet,"},{"line_number":545,"context_line":"Network etc.) is that DB result is parsed by make_\u003cresource\u003e_dict and"},{"line_number":546,"context_line":"extend_\u003cresource\u003e_dict. When extension is enabled, extend_\u003cresource\u003e_dict is"},{"line_number":547,"context_line":"taking the DB results and declaring new fields in resulting dict. When extension"},{"line_number":548,"context_line":"is not enabled, data will be fetched, but will not be populated into resulting dict,"},{"line_number":549,"context_line":"because extend_\u003cresource\u003e_dict will not be called."},{"line_number":550,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_e1548122","line":547,"range":{"start_line":547,"start_character":26,"end_line":547,"end_character":35},"in_reply_to":"da36d5c6_a61736ec","updated":"2017-03-01 23:21:56.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":23205,"name":"ianeta hutchinson","email":"ianeta.hutchinson@intel.com","username":"iphutch"},"change_message_id":"a0665c2a6b1f66a9c663d4ea3829adf9b2ccfe5d","unresolved":false,"context_lines":[{"line_number":548,"context_line":"is not enabled, data will be fetched, but will not be populated into resulting dict,"},{"line_number":549,"context_line":"because extend_\u003cresource\u003e_dict will not be called."},{"line_number":550,"context_line":""},{"line_number":551,"context_line":"When using objects, we cannot add custom extensions at plugin side. All values"},{"line_number":552,"context_line":"have to be exposed in object class that defines the resource, meaning that"},{"line_number":553,"context_line":"even if some extensions can be vendor specific, it has to be defined in object"},{"line_number":554,"context_line":"fields. The extension data itself has to be defined also with OVO class."}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_f88d347c","line":551,"range":{"start_line":551,"start_character":52,"end_line":551,"end_character":55},"updated":"2017-02-21 17:40:50.000000000","message":"on the","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":23205,"name":"ianeta hutchinson","email":"ianeta.hutchinson@intel.com","username":"iphutch"},"change_message_id":"a0665c2a6b1f66a9c663d4ea3829adf9b2ccfe5d","unresolved":false,"context_lines":[{"line_number":549,"context_line":"because extend_\u003cresource\u003e_dict will not be called."},{"line_number":550,"context_line":""},{"line_number":551,"context_line":"When using objects, we cannot add custom extensions at plugin side. All values"},{"line_number":552,"context_line":"have to be exposed in object class that defines the resource, meaning that"},{"line_number":553,"context_line":"even if some extensions can be vendor specific, it has to be defined in object"},{"line_number":554,"context_line":"fields. The extension data itself has to be defined also with OVO class."},{"line_number":555,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_98dd1873","line":552,"range":{"start_line":552,"start_character":21,"end_line":552,"end_character":22},"updated":"2017-02-21 17:40:50.000000000","message":"the","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":548,"context_line":"is not enabled, data will be fetched, but will not be populated into resulting dict,"},{"line_number":549,"context_line":"because extend_\u003cresource\u003e_dict will not be called."},{"line_number":550,"context_line":""},{"line_number":551,"context_line":"When using objects, we cannot add custom extensions at plugin side. All values"},{"line_number":552,"context_line":"have to be exposed in object class that defines the resource, meaning that"},{"line_number":553,"context_line":"even if some extensions can be vendor specific, it has to be defined in object"},{"line_number":554,"context_line":"fields. The extension data itself has to be defined also with OVO class."},{"line_number":555,"context_line":""},{"line_number":556,"context_line":"For example:"},{"line_number":557,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_812c329a","line":554,"range":{"start_line":551,"start_character":0,"end_line":554,"end_character":7},"updated":"2017-02-24 05:08:00.000000000","message":"Well I don\u0027t think it\u0027s actually correct. The thing is, plugins can still use objects for some work, but then convert them to dicts and work as they please, extending the dict as they wish.","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"d425fa630ff5c65f9cecccb37d214f8f4b10c482","unresolved":false,"context_lines":[{"line_number":548,"context_line":"is not enabled, data will be fetched, but will not be populated into resulting dict,"},{"line_number":549,"context_line":"because extend_\u003cresource\u003e_dict will not be called."},{"line_number":550,"context_line":""},{"line_number":551,"context_line":"When using objects, we cannot add custom extensions at plugin side. All values"},{"line_number":552,"context_line":"have to be exposed in object class that defines the resource, meaning that"},{"line_number":553,"context_line":"even if some extensions can be vendor specific, it has to be defined in object"},{"line_number":554,"context_line":"fields. The extension data itself has to be defined also with OVO class."},{"line_number":555,"context_line":""},{"line_number":556,"context_line":"For example:"},{"line_number":557,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_1c99fa1f","line":554,"range":{"start_line":551,"start_character":0,"end_line":554,"end_character":7},"in_reply_to":"da36d5c6_812c329a","updated":"2017-03-01 23:21:56.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":23205,"name":"ianeta hutchinson","email":"ianeta.hutchinson@intel.com","username":"iphutch"},"change_message_id":"a0665c2a6b1f66a9c663d4ea3829adf9b2ccfe5d","unresolved":false,"context_lines":[{"line_number":604,"context_line":"        result[\u0027subnet_extension\u0027] \u003d value"},{"line_number":605,"context_line":""},{"line_number":606,"context_line":"The above example is the ideal situation, where all extensions have objects"},{"line_number":607,"context_line":"adopted and enabled in core Neutron resources."},{"line_number":608,"context_line":""},{"line_number":609,"context_line":"The initial effort to introduce the OVO needs to be backward compatible, so"},{"line_number":610,"context_line":"we decided to leave the :code:`_make_(subnet|port|network)_dict` intact,"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_38d50c43","line":607,"range":{"start_line":607,"start_character":28,"end_line":607,"end_character":29},"updated":"2017-02-21 17:40:50.000000000","message":"n","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"d425fa630ff5c65f9cecccb37d214f8f4b10c482","unresolved":false,"context_lines":[{"line_number":604,"context_line":"        result[\u0027subnet_extension\u0027] \u003d value"},{"line_number":605,"context_line":""},{"line_number":606,"context_line":"The above example is the ideal situation, where all extensions have objects"},{"line_number":607,"context_line":"adopted and enabled in core Neutron resources."},{"line_number":608,"context_line":""},{"line_number":609,"context_line":"The initial effort to introduce the OVO needs to be backward compatible, so"},{"line_number":610,"context_line":"we decided to leave the :code:`_make_(subnet|port|network)_dict` intact,"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_0190b542","line":607,"range":{"start_line":607,"start_character":28,"end_line":607,"end_character":29},"in_reply_to":"da36d5c6_38d50c43","updated":"2017-03-01 23:21:56.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":23205,"name":"ianeta hutchinson","email":"ianeta.hutchinson@intel.com","username":"iphutch"},"change_message_id":"a0665c2a6b1f66a9c663d4ea3829adf9b2ccfe5d","unresolved":false,"context_lines":[{"line_number":606,"context_line":"The above example is the ideal situation, where all extensions have objects"},{"line_number":607,"context_line":"adopted and enabled in core Neutron resources."},{"line_number":608,"context_line":""},{"line_number":609,"context_line":"The initial effort to introduce the OVO needs to be backward compatible, so"},{"line_number":610,"context_line":"we decided to leave the :code:`_make_(subnet|port|network)_dict` intact,"},{"line_number":611,"context_line":"passing the database object into:code:`_make_(subnet|port|network)_dict` and"},{"line_number":612,"context_line":":code:`_apply_dict_extend_functions` methods and support for out-of-tree neutron"},{"line_number":613,"context_line":"drivers and plugins."},{"line_number":614,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_53827e95","line":611,"range":{"start_line":609,"start_character":0,"end_line":611,"end_character":7},"updated":"2017-02-21 17:40:50.000000000","message":"Try to avoid using \"we\". It is confusing for the reader as they are unsure whether they are included in the \"we\".  Could read: \nLeave the :code:`_make_(subnet|port|network)_dict` intact to ensure the initial effort is backward compatible. Passing","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":606,"context_line":"The above example is the ideal situation, where all extensions have objects"},{"line_number":607,"context_line":"adopted and enabled in core Neutron resources."},{"line_number":608,"context_line":""},{"line_number":609,"context_line":"The initial effort to introduce the OVO needs to be backward compatible, so"},{"line_number":610,"context_line":"we decided to leave the :code:`_make_(subnet|port|network)_dict` intact,"},{"line_number":611,"context_line":"passing the database object into:code:`_make_(subnet|port|network)_dict` and"},{"line_number":612,"context_line":":code:`_apply_dict_extend_functions` methods and support for out-of-tree neutron"},{"line_number":613,"context_line":"drivers and plugins."},{"line_number":614,"context_line":""},{"line_number":615,"context_line":"Backward compatibility for tenant_id."},{"line_number":616,"context_line":"-------------------------------------"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_c122aaa2","line":613,"range":{"start_line":609,"start_character":0,"end_line":613,"end_character":20},"updated":"2017-02-24 05:08:00.000000000","message":"that\u0027s some internals of base db plugin implementation. _make_***_dict at least.\n\nWhat reader should know is that by introducing the OVO work in tree, we haven\u0027t changed interface between base plugin code and registered extension functions. Those still receive a SQLAlchemy model, not an object. This is achieved by capturing the corresponding database model on get_***/create/update, and exposing it via \u003cobject\u003e.db_obj.","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"d425fa630ff5c65f9cecccb37d214f8f4b10c482","unresolved":false,"context_lines":[{"line_number":606,"context_line":"The above example is the ideal situation, where all extensions have objects"},{"line_number":607,"context_line":"adopted and enabled in core Neutron resources."},{"line_number":608,"context_line":""},{"line_number":609,"context_line":"The initial effort to introduce the OVO needs to be backward compatible, so"},{"line_number":610,"context_line":"we decided to leave the :code:`_make_(subnet|port|network)_dict` intact,"},{"line_number":611,"context_line":"passing the database object into:code:`_make_(subnet|port|network)_dict` and"},{"line_number":612,"context_line":":code:`_apply_dict_extend_functions` methods and support for out-of-tree neutron"},{"line_number":613,"context_line":"drivers and plugins."},{"line_number":614,"context_line":""},{"line_number":615,"context_line":"Backward compatibility for tenant_id."},{"line_number":616,"context_line":"-------------------------------------"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_7cdcb6e4","line":613,"range":{"start_line":609,"start_character":0,"end_line":613,"end_character":20},"in_reply_to":"da36d5c6_c122aaa2","updated":"2017-03-01 23:21:56.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":612,"context_line":":code:`_apply_dict_extend_functions` methods and support for out-of-tree neutron"},{"line_number":613,"context_line":"drivers and plugins."},{"line_number":614,"context_line":""},{"line_number":615,"context_line":"Backward compatibility for tenant_id."},{"line_number":616,"context_line":"-------------------------------------"},{"line_number":617,"context_line":"The base :code:`NeutronDbObject` class has support for exposing :code:`tenant_id`"},{"line_number":618,"context_line":"in dictionary access to the object fields (:code:`subnet[\u0027tenant_id\u0027]`) and in"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_e13deec4","line":615,"range":{"start_line":615,"start_character":36,"end_line":615,"end_character":37},"updated":"2017-02-24 05:08:00.000000000","message":"remove dot","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"d425fa630ff5c65f9cecccb37d214f8f4b10c482","unresolved":false,"context_lines":[{"line_number":612,"context_line":":code:`_apply_dict_extend_functions` methods and support for out-of-tree neutron"},{"line_number":613,"context_line":"drivers and plugins."},{"line_number":614,"context_line":""},{"line_number":615,"context_line":"Backward compatibility for tenant_id."},{"line_number":616,"context_line":"-------------------------------------"},{"line_number":617,"context_line":"The base :code:`NeutronDbObject` class has support for exposing :code:`tenant_id`"},{"line_number":618,"context_line":"in dictionary access to the object fields (:code:`subnet[\u0027tenant_id\u0027]`) and in"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_81210550","line":615,"range":{"start_line":615,"start_character":36,"end_line":615,"end_character":37},"in_reply_to":"da36d5c6_e13deec4","updated":"2017-03-01 23:21:56.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":614,"context_line":""},{"line_number":615,"context_line":"Backward compatibility for tenant_id."},{"line_number":616,"context_line":"-------------------------------------"},{"line_number":617,"context_line":"The base :code:`NeutronDbObject` class has support for exposing :code:`tenant_id`"},{"line_number":618,"context_line":"in dictionary access to the object fields (:code:`subnet[\u0027tenant_id\u0027]`) and in"},{"line_number":619,"context_line":":code:`to_dict()` method. There is a :code:`tenant_id` read-only property"},{"line_number":620,"context_line":"for every object that has :code:`project_id` in :code:`fields`. It is not exposed"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_c159ca36","line":617,"updated":"2017-02-24 05:08:00.000000000","message":"That\u0027s some internals, not sure we need that here at all. But if we do, just explain the intent (\u0027There is support for all objects to support tenant_id and project_id filters and fields at the same time; it is automatically enabled for all objects that have a project_id field.\u0027).","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"d425fa630ff5c65f9cecccb37d214f8f4b10c482","unresolved":false,"context_lines":[{"line_number":614,"context_line":""},{"line_number":615,"context_line":"Backward compatibility for tenant_id."},{"line_number":616,"context_line":"-------------------------------------"},{"line_number":617,"context_line":"The base :code:`NeutronDbObject` class has support for exposing :code:`tenant_id`"},{"line_number":618,"context_line":"in dictionary access to the object fields (:code:`subnet[\u0027tenant_id\u0027]`) and in"},{"line_number":619,"context_line":":code:`to_dict()` method. There is a :code:`tenant_id` read-only property"},{"line_number":620,"context_line":"for every object that has :code:`project_id` in :code:`fields`. It is not exposed"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_012d1546","line":617,"in_reply_to":"da36d5c6_c159ca36","updated":"2017-03-01 23:21:56.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":636,"context_line":"        filters \u003d convert_filters(**filters)"},{"line_number":637,"context_line":"        return subnet_obj.Subnet.get_objects(context, **filters)"},{"line_number":638,"context_line":""},{"line_number":639,"context_line":"The :code:`convert_filters` method is available in ``neutron.objects.utils.py`` [#]_."},{"line_number":640,"context_line":""},{"line_number":641,"context_line":"References"},{"line_number":642,"context_line":"----------"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_a16db6cd","line":639,"range":{"start_line":639,"start_character":74,"end_line":639,"end_character":77},"updated":"2017-02-24 05:08:00.000000000","message":"remove","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"d425fa630ff5c65f9cecccb37d214f8f4b10c482","unresolved":false,"context_lines":[{"line_number":636,"context_line":"        filters \u003d convert_filters(**filters)"},{"line_number":637,"context_line":"        return subnet_obj.Subnet.get_objects(context, **filters)"},{"line_number":638,"context_line":""},{"line_number":639,"context_line":"The :code:`convert_filters` method is available in ``neutron.objects.utils.py`` [#]_."},{"line_number":640,"context_line":""},{"line_number":641,"context_line":"References"},{"line_number":642,"context_line":"----------"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_e151e1d9","line":639,"range":{"start_line":639,"start_character":74,"end_line":639,"end_character":77},"in_reply_to":"da36d5c6_a16db6cd","updated":"2017-03-01 23:21:56.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8326e869f658198dbe1f0d893c62a90f1fe72445","unresolved":false,"context_lines":[{"line_number":640,"context_line":""},{"line_number":641,"context_line":"References"},{"line_number":642,"context_line":"----------"},{"line_number":643,"context_line":".. [#] https://github.com/openstack/neutron/blob/9.0.0/neutron/objects/base.py#L285-L289"},{"line_number":644,"context_line":".. [#] https://github.com/openstack/neutron/blob/9.0.0/neutron/db/standard_attr.py"},{"line_number":645,"context_line":".. [#] https://github.com/openstack/neutron/blob/9.0.0/neutron/objects/base.py#L499"},{"line_number":646,"context_line":".. [#] https://github.com/openstack/neutron/blob/9.0.0/neutron/objects/base.py#L525"}],"source_content_type":"text/x-rst","patch_set":15,"id":"da36d5c6_c170eaa6","line":643,"range":{"start_line":643,"start_character":49,"end_line":643,"end_character":54},"updated":"2017-02-24 05:08:00.000000000","message":"dare to update links to 10.0.0?","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"4c18be62cb4f8216d166508442a8ea7f4b66bd27","unresolved":false,"context_lines":[{"line_number":640,"context_line":""},{"line_number":641,"context_line":"References"},{"line_number":642,"context_line":"----------"},{"line_number":643,"context_line":".. [#] https://github.com/openstack/neutron/blob/9.0.0/neutron/objects/base.py#L285-L289"},{"line_number":644,"context_line":".. [#] https://github.com/openstack/neutron/blob/9.0.0/neutron/db/standard_attr.py"},{"line_number":645,"context_line":".. [#] https://github.com/openstack/neutron/blob/9.0.0/neutron/objects/base.py#L499"},{"line_number":646,"context_line":".. [#] https://github.com/openstack/neutron/blob/9.0.0/neutron/objects/base.py#L525"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba2be162_456476e4","line":643,"range":{"start_line":643,"start_character":49,"end_line":643,"end_character":54},"in_reply_to":"da36d5c6_c170eaa6","updated":"2017-03-02 00:07:15.000000000","message":"Done","commit_id":"f282129202cab5a432534d372b1c0d954eb14645"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"4b65f4e4e0208553b0fea8884c3e7e7b809eb32a","unresolved":false,"context_lines":[{"line_number":48,"context_line":""},{"line_number":49,"context_line":"CRUD operations"},{"line_number":50,"context_line":"~~~~~~~~~~~~~~~"},{"line_number":51,"context_line":"Objects support CRUD operations: :code:`create`, :code:`read`, :code:`update`"},{"line_number":52,"context_line":"and :code:`delete`. The nature of OVO is, when any change is applied, OVO"},{"line_number":53,"context_line":"tracks it. After calling :code:`save`, :code:`create` or :code:`update`, OVO"},{"line_number":54,"context_line":"detects this and changed fields are saved in the database. When field (regular"}],"source_content_type":"text/x-rst","patch_set":16,"id":"ba2be162_8d89f777","line":51,"range":{"start_line":51,"start_character":56,"end_line":51,"end_character":60},"updated":"2017-03-02 22:36:46.000000000","message":"huh? it\u0027s get_objects/get_objects.","commit_id":"e2591db71681a8d60fae6cb541ed663ae5729874"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"41efa7a91b41748b6cdc65114e1f92f387a51e88","unresolved":false,"context_lines":[{"line_number":48,"context_line":""},{"line_number":49,"context_line":"CRUD operations"},{"line_number":50,"context_line":"~~~~~~~~~~~~~~~"},{"line_number":51,"context_line":"Objects support CRUD operations: :code:`create`, :code:`read`, :code:`update`"},{"line_number":52,"context_line":"and :code:`delete`. The nature of OVO is, when any change is applied, OVO"},{"line_number":53,"context_line":"tracks it. After calling :code:`save`, :code:`create` or :code:`update`, OVO"},{"line_number":54,"context_line":"detects this and changed fields are saved in the database. When field (regular"}],"source_content_type":"text/x-rst","patch_set":16,"id":"ba2be162_fad12358","line":51,"range":{"start_line":51,"start_character":56,"end_line":51,"end_character":60},"in_reply_to":"ba2be162_8d89f777","updated":"2017-03-03 16:52:07.000000000","message":"Done","commit_id":"e2591db71681a8d60fae6cb541ed663ae5729874"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"4b65f4e4e0208553b0fea8884c3e7e7b809eb32a","unresolved":false,"context_lines":[{"line_number":50,"context_line":"~~~~~~~~~~~~~~~"},{"line_number":51,"context_line":"Objects support CRUD operations: :code:`create`, :code:`read`, :code:`update`"},{"line_number":52,"context_line":"and :code:`delete`. The nature of OVO is, when any change is applied, OVO"},{"line_number":53,"context_line":"tracks it. After calling :code:`save`, :code:`create` or :code:`update`, OVO"},{"line_number":54,"context_line":"detects this and changed fields are saved in the database. When field (regular"},{"line_number":55,"context_line":"or synthetic one) is changed, but this doesn\u0027t need to be saved into database,"},{"line_number":56,"context_line":":code:`obj_reset_changes` can be called, to tell OVO library to ignore that."}],"source_content_type":"text/x-rst","patch_set":16,"id":"ba2be162_cd7f6f64","line":53,"range":{"start_line":53,"start_character":32,"end_line":53,"end_character":36},"updated":"2017-03-02 22:36:46.000000000","message":"no, there is no save in neutron","commit_id":"e2591db71681a8d60fae6cb541ed663ae5729874"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"41efa7a91b41748b6cdc65114e1f92f387a51e88","unresolved":false,"context_lines":[{"line_number":50,"context_line":"~~~~~~~~~~~~~~~"},{"line_number":51,"context_line":"Objects support CRUD operations: :code:`create`, :code:`read`, :code:`update`"},{"line_number":52,"context_line":"and :code:`delete`. The nature of OVO is, when any change is applied, OVO"},{"line_number":53,"context_line":"tracks it. After calling :code:`save`, :code:`create` or :code:`update`, OVO"},{"line_number":54,"context_line":"detects this and changed fields are saved in the database. When field (regular"},{"line_number":55,"context_line":"or synthetic one) is changed, but this doesn\u0027t need to be saved into database,"},{"line_number":56,"context_line":":code:`obj_reset_changes` can be called, to tell OVO library to ignore that."}],"source_content_type":"text/x-rst","patch_set":16,"id":"ba2be162_bab7ab38","line":53,"range":{"start_line":53,"start_character":32,"end_line":53,"end_character":36},"in_reply_to":"ba2be162_cd7f6f64","updated":"2017-03-03 16:52:07.000000000","message":"Removed","commit_id":"e2591db71681a8d60fae6cb541ed663ae5729874"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"0a27494140baab94d9987a53739745043843e21f","unresolved":false,"context_lines":[{"line_number":60,"context_line":".. code-block:: Python"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    # to create an object, you can pass the attributes in constructor:"},{"line_number":63,"context_line":"    dns \u003d subnet.DNSNameServer(context, address\u003d\u0027asd\u0027, subnet_id\u003d\u0027xxx\u0027, order\u003d1)"},{"line_number":64,"context_line":"    dns.create()"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    # or you can create a dict and pass it as kwargs:"}],"source_content_type":"text/x-rst","patch_set":16,"id":"ba2be162_883045ea","line":63,"range":{"start_line":63,"start_character":10,"end_line":63,"end_character":16},"updated":"2017-03-02 01:16:49.000000000","message":"nit: just a small inconsistency in this example using the mode in lines 63 and 68 but not in following lines line 72, 77, 81 and 84","commit_id":"e2591db71681a8d60fae6cb541ed663ae5729874"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"41efa7a91b41748b6cdc65114e1f92f387a51e88","unresolved":false,"context_lines":[{"line_number":60,"context_line":".. code-block:: Python"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    # to create an object, you can pass the attributes in constructor:"},{"line_number":63,"context_line":"    dns \u003d subnet.DNSNameServer(context, address\u003d\u0027asd\u0027, subnet_id\u003d\u0027xxx\u0027, order\u003d1)"},{"line_number":64,"context_line":"    dns.create()"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    # or you can create a dict and pass it as kwargs:"}],"source_content_type":"text/x-rst","patch_set":16,"id":"ba2be162_1a3ef78b","line":63,"range":{"start_line":63,"start_character":10,"end_line":63,"end_character":16},"in_reply_to":"ba2be162_883045ea","updated":"2017-03-03 16:52:07.000000000","message":"Done","commit_id":"e2591db71681a8d60fae6cb541ed663ae5729874"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"0a27494140baab94d9987a53739745043843e21f","unresolved":false,"context_lines":[{"line_number":68,"context_line":"    dns \u003d subnet.DNSNameServer(context, **dns_data)"},{"line_number":69,"context_line":"    dns.create()"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    # to fetch the object:"},{"line_number":72,"context_line":"    dns \u003d DNSNameServer.get_object(context, address\u003d\u0027asd\u0027, subnet_id\u003d\u0027xxx\u0027)"},{"line_number":73,"context_line":"    # the result will be object or none"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    # you can also create a dict and pass it as kwargs"},{"line_number":76,"context_line":"    primary_keys \u003d {address: \u0027asd\u0027, subnet_id: \u0027xxx\u0027}"}],"source_content_type":"text/x-rst","patch_set":16,"id":"ba2be162_087295ad","line":73,"range":{"start_line":71,"start_character":4,"end_line":73,"end_character":39},"updated":"2017-03-02 01:16:49.000000000","message":"Given that you are mentioning this in line 84, you can remove it","commit_id":"e2591db71681a8d60fae6cb541ed663ae5729874"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"41efa7a91b41748b6cdc65114e1f92f387a51e88","unresolved":false,"context_lines":[{"line_number":68,"context_line":"    dns \u003d subnet.DNSNameServer(context, **dns_data)"},{"line_number":69,"context_line":"    dns.create()"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    # to fetch the object:"},{"line_number":72,"context_line":"    dns \u003d DNSNameServer.get_object(context, address\u003d\u0027asd\u0027, subnet_id\u003d\u0027xxx\u0027)"},{"line_number":73,"context_line":"    # the result will be object or none"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    # you can also create a dict and pass it as kwargs"},{"line_number":76,"context_line":"    primary_keys \u003d {address: \u0027asd\u0027, subnet_id: \u0027xxx\u0027}"}],"source_content_type":"text/x-rst","patch_set":16,"id":"ba2be162_fa5f63e2","line":73,"range":{"start_line":71,"start_character":4,"end_line":73,"end_character":39},"in_reply_to":"ba2be162_087295ad","updated":"2017-03-03 16:52:07.000000000","message":"Removed","commit_id":"e2591db71681a8d60fae6cb541ed663ae5729874"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"0a27494140baab94d9987a53739745043843e21f","unresolved":false,"context_lines":[{"line_number":92,"context_line":"Sorting and filtering"},{"line_number":93,"context_line":"~~~~~~~~~~~~~~~~~~~~~"},{"line_number":94,"context_line":"The :code:`NeutronDbObject` class has strict validation on which field sorting"},{"line_number":95,"context_line":"and filtering can happen. When calling :code:`get_objects` and :code:`count`"},{"line_number":96,"context_line":"methods, :code:`validate_filters` is invoked, to see if it\u0027s a supported filter"},{"line_number":97,"context_line":"criterion (which is by default non-synthetic fields only). Additional filters"},{"line_number":98,"context_line":"can be defined using :code:`register_filter_hook_on_model`. This will add the"},{"line_number":99,"context_line":"requested string to valid filter names in object implementation. It is"}],"source_content_type":"text/x-rst","patch_set":16,"id":"ba2be162_4892cda0","line":96,"range":{"start_line":95,"start_character":39,"end_line":96,"end_character":7},"updated":"2017-03-02 01:16:49.000000000","message":":code:`get_objects`, :code:`count`, :code: `delete_objects` and :code:`object_exist`\nmethods","commit_id":"e2591db71681a8d60fae6cb541ed663ae5729874"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"41efa7a91b41748b6cdc65114e1f92f387a51e88","unresolved":false,"context_lines":[{"line_number":92,"context_line":"Sorting and filtering"},{"line_number":93,"context_line":"~~~~~~~~~~~~~~~~~~~~~"},{"line_number":94,"context_line":"The :code:`NeutronDbObject` class has strict validation on which field sorting"},{"line_number":95,"context_line":"and filtering can happen. When calling :code:`get_objects` and :code:`count`"},{"line_number":96,"context_line":"methods, :code:`validate_filters` is invoked, to see if it\u0027s a supported filter"},{"line_number":97,"context_line":"criterion (which is by default non-synthetic fields only). Additional filters"},{"line_number":98,"context_line":"can be defined using :code:`register_filter_hook_on_model`. This will add the"},{"line_number":99,"context_line":"requested string to valid filter names in object implementation. It is"}],"source_content_type":"text/x-rst","patch_set":16,"id":"ba2be162_5aaeaf98","line":96,"range":{"start_line":95,"start_character":39,"end_line":96,"end_character":7},"in_reply_to":"ba2be162_4892cda0","updated":"2017-03-03 16:52:07.000000000","message":"Done","commit_id":"e2591db71681a8d60fae6cb541ed663ae5729874"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"0a27494140baab94d9987a53739745043843e21f","unresolved":false,"context_lines":[{"line_number":107,"context_line":":code:`fields`."},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"In order to disable filter validation, :code:`validate_filters\u003dFalse` needs to be"},{"line_number":110,"context_line":"passed as an argument in the :code:`get_objects` and :code:`count` methods. It was added"},{"line_number":111,"context_line":"because the default behaviour of the neutron API is to accept everything at API level"},{"line_number":112,"context_line":"and filter it out at DB layer. This can be used by out of tree extensions."},{"line_number":113,"context_line":""}],"source_content_type":"text/x-rst","patch_set":16,"id":"ba2be162_c8ecfd2b","line":110,"range":{"start_line":110,"start_character":29,"end_line":110,"end_character":66},"updated":"2017-03-02 01:16:49.000000000","message":"ditto: line 95","commit_id":"e2591db71681a8d60fae6cb541ed663ae5729874"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"41efa7a91b41748b6cdc65114e1f92f387a51e88","unresolved":false,"context_lines":[{"line_number":107,"context_line":":code:`fields`."},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"In order to disable filter validation, :code:`validate_filters\u003dFalse` needs to be"},{"line_number":110,"context_line":"passed as an argument in the :code:`get_objects` and :code:`count` methods. It was added"},{"line_number":111,"context_line":"because the default behaviour of the neutron API is to accept everything at API level"},{"line_number":112,"context_line":"and filter it out at DB layer. This can be used by out of tree extensions."},{"line_number":113,"context_line":""}],"source_content_type":"text/x-rst","patch_set":16,"id":"ba2be162_3aae5b81","line":110,"range":{"start_line":110,"start_character":29,"end_line":110,"end_character":66},"in_reply_to":"ba2be162_c8ecfd2b","updated":"2017-03-03 16:52:07.000000000","message":"Done","commit_id":"e2591db71681a8d60fae6cb541ed663ae5729874"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"0a27494140baab94d9987a53739745043843e21f","unresolved":false,"context_lines":[{"line_number":114,"context_line":""},{"line_number":115,"context_line":".. code-block:: Python"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    # filtering"},{"line_number":118,"context_line":"    dnses \u003d DNSNameServer.get_objects(context, subnet_id\u003d\u0027xxx\u0027)"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"    filters \u003d {\u0027subnet_id\u0027: [\u0027xxx\u0027, \u0027yyy\u0027]}"},{"line_number":121,"context_line":"    dnses \u003d DNSNameServer.get_objects(context, **filters)"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    dnses \u003d DNSNameServer.get_objects(context, **{\u0027subnet_id\u0027: [\u0027xxx\u0027, \u0027yyy\u0027]})"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    # do not validate filters"},{"line_number":126,"context_line":"    dnses \u003d DNSNameServer.get_objects(context, valdiate_filters\u003dFalse,"}],"source_content_type":"text/x-rst","patch_set":16,"id":"ba2be162_e8caa1a0","line":123,"range":{"start_line":117,"start_character":0,"end_line":123,"end_character":79},"updated":"2017-03-02 01:16:49.000000000","message":"these examples can be omitted because were covered previously","commit_id":"e2591db71681a8d60fae6cb541ed663ae5729874"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"41efa7a91b41748b6cdc65114e1f92f387a51e88","unresolved":false,"context_lines":[{"line_number":114,"context_line":""},{"line_number":115,"context_line":".. code-block:: Python"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    # filtering"},{"line_number":118,"context_line":"    dnses \u003d DNSNameServer.get_objects(context, subnet_id\u003d\u0027xxx\u0027)"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"    filters \u003d {\u0027subnet_id\u0027: [\u0027xxx\u0027, \u0027yyy\u0027]}"},{"line_number":121,"context_line":"    dnses \u003d DNSNameServer.get_objects(context, **filters)"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    dnses \u003d DNSNameServer.get_objects(context, **{\u0027subnet_id\u0027: [\u0027xxx\u0027, \u0027yyy\u0027]})"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    # do not validate filters"},{"line_number":126,"context_line":"    dnses \u003d DNSNameServer.get_objects(context, valdiate_filters\u003dFalse,"}],"source_content_type":"text/x-rst","patch_set":16,"id":"ba2be162_3ab49b80","line":123,"range":{"start_line":117,"start_character":0,"end_line":123,"end_character":79},"in_reply_to":"ba2be162_e8caa1a0","updated":"2017-03-03 16:52:07.000000000","message":"Removed code from above example, left this one, which describes filtering behavior.","commit_id":"e2591db71681a8d60fae6cb541ed663ae5729874"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"0a27494140baab94d9987a53739745043843e21f","unresolved":false,"context_lines":[{"line_number":123,"context_line":"    dnses \u003d DNSNameServer.get_objects(context, **{\u0027subnet_id\u0027: [\u0027xxx\u0027, \u0027yyy\u0027]})"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    # do not validate filters"},{"line_number":126,"context_line":"    dnses \u003d DNSNameServer.get_objects(context, valdiate_filters\u003dFalse,"},{"line_number":127,"context_line":"                                      fake_filter\u003d\u0027xxx\u0027)"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"    # count the dns servers for given subnet"}],"source_content_type":"text/x-rst","patch_set":16,"id":"ba2be162_28de796d","line":126,"range":{"start_line":126,"start_character":47,"end_line":126,"end_character":63},"updated":"2017-03-02 01:16:49.000000000","message":"s/valdiate_filters/validate_filters","commit_id":"e2591db71681a8d60fae6cb541ed663ae5729874"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"41efa7a91b41748b6cdc65114e1f92f387a51e88","unresolved":false,"context_lines":[{"line_number":123,"context_line":"    dnses \u003d DNSNameServer.get_objects(context, **{\u0027subnet_id\u0027: [\u0027xxx\u0027, \u0027yyy\u0027]})"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    # do not validate filters"},{"line_number":126,"context_line":"    dnses \u003d DNSNameServer.get_objects(context, valdiate_filters\u003dFalse,"},{"line_number":127,"context_line":"                                      fake_filter\u003d\u0027xxx\u0027)"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"    # count the dns servers for given subnet"}],"source_content_type":"text/x-rst","patch_set":16,"id":"ba2be162_9a01073b","line":126,"range":{"start_line":126,"start_character":47,"end_line":126,"end_character":63},"in_reply_to":"ba2be162_28de796d","updated":"2017-03-03 16:52:07.000000000","message":"Done","commit_id":"e2591db71681a8d60fae6cb541ed663ae5729874"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"0a27494140baab94d9987a53739745043843e21f","unresolved":false,"context_lines":[{"line_number":131,"context_line":""},{"line_number":132,"context_line":"    # sorting"},{"line_number":133,"context_line":"    # True means ASC, False is DESC"},{"line_number":134,"context_line":"    pager \u003d obj_base.Pager(sorts\u003d[(\u0027order\u0027, False)])"},{"line_number":135,"context_line":"    dnses \u003d DNSNameServer.get_objects(context, _pager\u003dpager, subnet_id\u003d\u0027xxx\u0027)"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"    # register extra filter name"}],"source_content_type":"text/x-rst","patch_set":16,"id":"ba2be162_68bf91fb","line":134,"range":{"start_line":134,"start_character":21,"end_line":134,"end_character":26},"updated":"2017-03-02 01:16:49.000000000","message":"Could you include all the parameters that Pager supports for given better idea of its usage or describe it in a Note?","commit_id":"e2591db71681a8d60fae6cb541ed663ae5729874"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"41efa7a91b41748b6cdc65114e1f92f387a51e88","unresolved":false,"context_lines":[{"line_number":131,"context_line":""},{"line_number":132,"context_line":"    # sorting"},{"line_number":133,"context_line":"    # True means ASC, False is DESC"},{"line_number":134,"context_line":"    pager \u003d obj_base.Pager(sorts\u003d[(\u0027order\u0027, False)])"},{"line_number":135,"context_line":"    dnses \u003d DNSNameServer.get_objects(context, _pager\u003dpager, subnet_id\u003d\u0027xxx\u0027)"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"    # register extra filter name"}],"source_content_type":"text/x-rst","patch_set":16,"id":"ba2be162_db71c145","line":134,"range":{"start_line":134,"start_character":21,"end_line":134,"end_character":26},"in_reply_to":"ba2be162_68bf91fb","updated":"2017-03-03 16:52:07.000000000","message":"Done","commit_id":"e2591db71681a8d60fae6cb541ed663ae5729874"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"4b65f4e4e0208553b0fea8884c3e7e7b809eb32a","unresolved":false,"context_lines":[{"line_number":164,"context_line":"        \u0027ip_version\u0027: common_types.IPVersionEnumField()"},{"line_number":165,"context_line":"    }"},{"line_number":166,"context_line":""},{"line_number":167,"context_line":":code:`VERSION` is mandatory and defines th version of the object. Initially,"},{"line_number":168,"context_line":"set the :code:`VERSION` field to 1.0."},{"line_number":169,"context_line":"Change :code:`VERSION` if fields or their types are modified. When you change"},{"line_number":170,"context_line":"the version of objects being exposed via RPC, add method"}],"source_content_type":"text/x-rst","patch_set":16,"id":"ba2be162_ed743369","line":167,"range":{"start_line":167,"start_character":41,"end_line":167,"end_character":43},"updated":"2017-03-02 22:36:46.000000000","message":"the","commit_id":"e2591db71681a8d60fae6cb541ed663ae5729874"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"41efa7a91b41748b6cdc65114e1f92f387a51e88","unresolved":false,"context_lines":[{"line_number":164,"context_line":"        \u0027ip_version\u0027: common_types.IPVersionEnumField()"},{"line_number":165,"context_line":"    }"},{"line_number":166,"context_line":""},{"line_number":167,"context_line":":code:`VERSION` is mandatory and defines th version of the object. Initially,"},{"line_number":168,"context_line":"set the :code:`VERSION` field to 1.0."},{"line_number":169,"context_line":"Change :code:`VERSION` if fields or their types are modified. When you change"},{"line_number":170,"context_line":"the version of objects being exposed via RPC, add method"}],"source_content_type":"text/x-rst","patch_set":16,"id":"ba2be162_3b973d3b","line":167,"range":{"start_line":167,"start_character":41,"end_line":167,"end_character":43},"in_reply_to":"ba2be162_ed743369","updated":"2017-03-03 16:52:07.000000000","message":"Done","commit_id":"e2591db71681a8d60fae6cb541ed663ae5729874"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"0a27494140baab94d9987a53739745043843e21f","unresolved":false,"context_lines":[{"line_number":172,"context_line":""},{"line_number":173,"context_line":".. note::"},{"line_number":174,"context_line":"   Standard Attributes are automatically added to OVO fields in base class."},{"line_number":175,"context_line":"   Attributes [#]_ like :code:`description`, :code:`created_at` and"},{"line_number":176,"context_line":"   :code:`updated_at` are added in [#]_."},{"line_number":177,"context_line":""},{"line_number":178,"context_line":":code:`primary_keys` is used to define the list of fields, that uniquely"},{"line_number":179,"context_line":"identify the object. In case of database backed objects, it\u0027s usually mapped"}],"source_content_type":"text/x-rst","patch_set":16,"id":"ba2be162_881685ef","line":176,"range":{"start_line":175,"start_character":24,"end_line":176,"end_character":19},"updated":"2017-03-02 01:16:49.000000000","message":"and :code:`revision_number`","commit_id":"e2591db71681a8d60fae6cb541ed663ae5729874"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"41efa7a91b41748b6cdc65114e1f92f387a51e88","unresolved":false,"context_lines":[{"line_number":172,"context_line":""},{"line_number":173,"context_line":".. note::"},{"line_number":174,"context_line":"   Standard Attributes are automatically added to OVO fields in base class."},{"line_number":175,"context_line":"   Attributes [#]_ like :code:`description`, :code:`created_at` and"},{"line_number":176,"context_line":"   :code:`updated_at` are added in [#]_."},{"line_number":177,"context_line":""},{"line_number":178,"context_line":":code:`primary_keys` is used to define the list of fields, that uniquely"},{"line_number":179,"context_line":"identify the object. In case of database backed objects, it\u0027s usually mapped"}],"source_content_type":"text/x-rst","patch_set":16,"id":"ba2be162_bbab2d74","line":176,"range":{"start_line":175,"start_character":24,"end_line":176,"end_character":19},"in_reply_to":"ba2be162_881685ef","updated":"2017-03-03 16:52:07.000000000","message":"Done","commit_id":"e2591db71681a8d60fae6cb541ed663ae5729874"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"4b65f4e4e0208553b0fea8884c3e7e7b809eb32a","unresolved":false,"context_lines":[{"line_number":175,"context_line":"   Attributes [#]_ like :code:`description`, :code:`created_at` and"},{"line_number":176,"context_line":"   :code:`updated_at` are added in [#]_."},{"line_number":177,"context_line":""},{"line_number":178,"context_line":":code:`primary_keys` is used to define the list of fields, that uniquely"},{"line_number":179,"context_line":"identify the object. In case of database backed objects, it\u0027s usually mapped"},{"line_number":180,"context_line":"onto SQL primary keys. For immutable object fields that cannot be changed,"},{"line_number":181,"context_line":"there is a :code:`fields_no_update` list, that contains"}],"source_content_type":"text/x-rst","patch_set":16,"id":"ba2be162_2d19eb22","line":178,"range":{"start_line":178,"start_character":57,"end_line":178,"end_character":58},"updated":"2017-03-02 22:36:46.000000000","message":"remove","commit_id":"e2591db71681a8d60fae6cb541ed663ae5729874"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"41efa7a91b41748b6cdc65114e1f92f387a51e88","unresolved":false,"context_lines":[{"line_number":175,"context_line":"   Attributes [#]_ like :code:`description`, :code:`created_at` and"},{"line_number":176,"context_line":"   :code:`updated_at` are added in [#]_."},{"line_number":177,"context_line":""},{"line_number":178,"context_line":":code:`primary_keys` is used to define the list of fields, that uniquely"},{"line_number":179,"context_line":"identify the object. In case of database backed objects, it\u0027s usually mapped"},{"line_number":180,"context_line":"onto SQL primary keys. For immutable object fields that cannot be changed,"},{"line_number":181,"context_line":"there is a :code:`fields_no_update` list, that contains"}],"source_content_type":"text/x-rst","patch_set":16,"id":"ba2be162_7bcc556a","line":178,"range":{"start_line":178,"start_character":57,"end_line":178,"end_character":58},"in_reply_to":"ba2be162_2d19eb22","updated":"2017-03-03 16:52:07.000000000","message":"Done","commit_id":"e2591db71681a8d60fae6cb541ed663ae5729874"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"4b65f4e4e0208553b0fea8884c3e7e7b809eb32a","unresolved":false,"context_lines":[{"line_number":184,"context_line":"If there is a situation where a field needs to be named differently in an"},{"line_number":185,"context_line":"object than in the database schema, you can use"},{"line_number":186,"context_line":":code:`fields_need_translation`. This dictionary contains the name of the field"},{"line_number":187,"context_line":"in the object definition (the key) and the name of the the field in the"},{"line_number":188,"context_line":"database (the value). This allows to have a different object layer"},{"line_number":189,"context_line":"representation for database persisted data."},{"line_number":190,"context_line":"For example in IP allocation pools::"}],"source_content_type":"text/x-rst","patch_set":16,"id":"ba2be162_8ddad74a","line":187,"range":{"start_line":187,"start_character":51,"end_line":187,"end_character":55},"updated":"2017-03-02 22:36:46.000000000","message":"remove","commit_id":"e2591db71681a8d60fae6cb541ed663ae5729874"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"41efa7a91b41748b6cdc65114e1f92f387a51e88","unresolved":false,"context_lines":[{"line_number":184,"context_line":"If there is a situation where a field needs to be named differently in an"},{"line_number":185,"context_line":"object than in the database schema, you can use"},{"line_number":186,"context_line":":code:`fields_need_translation`. This dictionary contains the name of the field"},{"line_number":187,"context_line":"in the object definition (the key) and the name of the the field in the"},{"line_number":188,"context_line":"database (the value). This allows to have a different object layer"},{"line_number":189,"context_line":"representation for database persisted data."},{"line_number":190,"context_line":"For example in IP allocation pools::"}],"source_content_type":"text/x-rst","patch_set":16,"id":"ba2be162_bbd96d24","line":187,"range":{"start_line":187,"start_character":51,"end_line":187,"end_character":55},"in_reply_to":"ba2be162_8ddad74a","updated":"2017-03-03 16:52:07.000000000","message":"Done","commit_id":"e2591db71681a8d60fae6cb541ed663ae5729874"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"0a27494140baab94d9987a53739745043843e21f","unresolved":false,"context_lines":[{"line_number":256,"context_line":""},{"line_number":257,"context_line":"        fields \u003d {"},{"line_number":258,"context_line":"            \u0027address\u0027: obj_fields.StringField(),"},{"line_number":259,"context_line":"            \u0027subnet_id\u0027: obj_fields.UUIDField(),"},{"line_number":260,"context_line":"        }"},{"line_number":261,"context_line":""},{"line_number":262,"context_line":"    @obj_base.VersionedObjectRegistry.register"}],"source_content_type":"text/x-rst","patch_set":16,"id":"ba2be162_08aff594","line":259,"range":{"start_line":259,"start_character":25,"end_line":259,"end_character":35},"updated":"2017-03-02 01:16:49.000000000","message":"Can you change this for `common_types` module, the reason of that is because we use our custom field which validates the UUID field","commit_id":"e2591db71681a8d60fae6cb541ed663ae5729874"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"41efa7a91b41748b6cdc65114e1f92f387a51e88","unresolved":false,"context_lines":[{"line_number":256,"context_line":""},{"line_number":257,"context_line":"        fields \u003d {"},{"line_number":258,"context_line":"            \u0027address\u0027: obj_fields.StringField(),"},{"line_number":259,"context_line":"            \u0027subnet_id\u0027: obj_fields.UUIDField(),"},{"line_number":260,"context_line":"        }"},{"line_number":261,"context_line":""},{"line_number":262,"context_line":"    @obj_base.VersionedObjectRegistry.register"}],"source_content_type":"text/x-rst","patch_set":16,"id":"ba2be162_fb61253a","line":259,"range":{"start_line":259,"start_character":25,"end_line":259,"end_character":35},"in_reply_to":"ba2be162_08aff594","updated":"2017-03-03 16:52:07.000000000","message":"subnet_id is obj_fields in neutron/object/subnet.py so, don\u0027t changing that.","commit_id":"e2591db71681a8d60fae6cb541ed663ae5729874"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"0a27494140baab94d9987a53739745043843e21f","unresolved":false,"context_lines":[{"line_number":265,"context_line":"        db_base \u003d  SubnetSqlModel"},{"line_number":266,"context_line":""},{"line_number":267,"context_line":"        fields \u003d {"},{"line_number":268,"context_line":"            \u0027id\u0027: obj_fields.UUIDField(),  # HasId from model class"},{"line_number":269,"context_line":"            \u0027project_id\u0027: obj_fields.StringField(nullable\u003dTrue),  # HasProject from model class"},{"line_number":270,"context_line":"            \u0027subnet_name\u0027: obj_fields.StringField(nullable\u003dTrue),"},{"line_number":271,"context_line":"            \u0027dns_nameservers\u0027: obj_fields.ListOfObjectsField(\u0027DNSNameServer\u0027,"}],"source_content_type":"text/x-rst","patch_set":16,"id":"ba2be162_4891ed51","line":268,"range":{"start_line":268,"start_character":18,"end_line":268,"end_character":28},"updated":"2017-03-02 01:16:49.000000000","message":"ditto: line 259","commit_id":"e2591db71681a8d60fae6cb541ed663ae5729874"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"41efa7a91b41748b6cdc65114e1f92f387a51e88","unresolved":false,"context_lines":[{"line_number":265,"context_line":"        db_base \u003d  SubnetSqlModel"},{"line_number":266,"context_line":""},{"line_number":267,"context_line":"        fields \u003d {"},{"line_number":268,"context_line":"            \u0027id\u0027: obj_fields.UUIDField(),  # HasId from model class"},{"line_number":269,"context_line":"            \u0027project_id\u0027: obj_fields.StringField(nullable\u003dTrue),  # HasProject from model class"},{"line_number":270,"context_line":"            \u0027subnet_name\u0027: obj_fields.StringField(nullable\u003dTrue),"},{"line_number":271,"context_line":"            \u0027dns_nameservers\u0027: obj_fields.ListOfObjectsField(\u0027DNSNameServer\u0027,"}],"source_content_type":"text/x-rst","patch_set":16,"id":"ba2be162_bb4c0dc9","line":268,"range":{"start_line":268,"start_character":18,"end_line":268,"end_character":28},"in_reply_to":"ba2be162_4891ed51","updated":"2017-03-03 16:52:07.000000000","message":"ditto","commit_id":"e2591db71681a8d60fae6cb541ed663ae5729874"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"0a27494140baab94d9987a53739745043843e21f","unresolved":false,"context_lines":[{"line_number":290,"context_line":"        db_base \u003d IPAllocationPoolSqlModel"},{"line_number":291,"context_line":""},{"line_number":292,"context_line":"        fields \u003d {"},{"line_number":293,"context_line":"            \u0027subnet_id\u0027: obj_fields.UUIDField()"},{"line_number":294,"context_line":"        }"},{"line_number":295,"context_line":""},{"line_number":296,"context_line":"        foreign_keys \u003d {\u0027SubnetOVO\u0027: {\u0027subnet_id\u0027: \u0027id\u0027}}"}],"source_content_type":"text/x-rst","patch_set":16,"id":"ba2be162_c8923d4b","line":293,"range":{"start_line":293,"start_character":25,"end_line":293,"end_character":35},"updated":"2017-03-02 01:16:49.000000000","message":"ditto: line 259","commit_id":"e2591db71681a8d60fae6cb541ed663ae5729874"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"41efa7a91b41748b6cdc65114e1f92f387a51e88","unresolved":false,"context_lines":[{"line_number":290,"context_line":"        db_base \u003d IPAllocationPoolSqlModel"},{"line_number":291,"context_line":""},{"line_number":292,"context_line":"        fields \u003d {"},{"line_number":293,"context_line":"            \u0027subnet_id\u0027: obj_fields.UUIDField()"},{"line_number":294,"context_line":"        }"},{"line_number":295,"context_line":""},{"line_number":296,"context_line":"        foreign_keys \u003d {\u0027SubnetOVO\u0027: {\u0027subnet_id\u0027: \u0027id\u0027}}"}],"source_content_type":"text/x-rst","patch_set":16,"id":"ba2be162_fbc84524","line":293,"range":{"start_line":293,"start_character":25,"end_line":293,"end_character":35},"in_reply_to":"ba2be162_c8923d4b","updated":"2017-03-03 16:52:07.000000000","message":"ditto","commit_id":"e2591db71681a8d60fae6cb541ed663ae5729874"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"0a27494140baab94d9987a53739745043843e21f","unresolved":false,"context_lines":[{"line_number":306,"context_line":"   :code:`IPAllocationPoolOVO`, the same way as it\u0027s done in the SQL model"},{"line_number":307,"context_line":"   :code:`IPAllocationPoolSqlModel`: :code:`sa.ForeignKey(\u0027subnets.id\u0027)`"},{"line_number":308,"context_line":""},{"line_number":309,"context_line":".. note::"},{"line_number":310,"context_line":"   Multiple primary keys related to one parent object are not permitted."},{"line_number":311,"context_line":""},{"line_number":312,"context_line":"It is important to remember about the nullable parameter. In the SQLAlchemy"},{"line_number":313,"context_line":"model, the nullable parameter is by default :code:`True`, while for OVO fields,"}],"source_content_type":"text/x-rst","patch_set":16,"id":"ba2be162_483bad38","line":310,"range":{"start_line":309,"start_character":0,"end_line":310,"end_character":72},"updated":"2017-03-02 01:16:49.000000000","message":"this is confuse, what primary keys? parent object?","commit_id":"e2591db71681a8d60fae6cb541ed663ae5729874"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"4b65f4e4e0208553b0fea8884c3e7e7b809eb32a","unresolved":false,"context_lines":[{"line_number":306,"context_line":"   :code:`IPAllocationPoolOVO`, the same way as it\u0027s done in the SQL model"},{"line_number":307,"context_line":"   :code:`IPAllocationPoolSqlModel`: :code:`sa.ForeignKey(\u0027subnets.id\u0027)`"},{"line_number":308,"context_line":""},{"line_number":309,"context_line":".. note::"},{"line_number":310,"context_line":"   Multiple primary keys related to one parent object are not permitted."},{"line_number":311,"context_line":""},{"line_number":312,"context_line":"It is important to remember about the nullable parameter. In the SQLAlchemy"},{"line_number":313,"context_line":"model, the nullable parameter is by default :code:`True`, while for OVO fields,"}],"source_content_type":"text/x-rst","patch_set":16,"id":"ba2be162_eda513a2","line":310,"range":{"start_line":309,"start_character":0,"end_line":310,"end_character":72},"in_reply_to":"ba2be162_483bad38","updated":"2017-03-02 22:36:46.000000000","message":"I guess it means that a single foreign key is allowed (usually parent ID), you can\u0027t link through multiple model attributes.","commit_id":"e2591db71681a8d60fae6cb541ed663ae5729874"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"41efa7a91b41748b6cdc65114e1f92f387a51e88","unresolved":false,"context_lines":[{"line_number":306,"context_line":"   :code:`IPAllocationPoolOVO`, the same way as it\u0027s done in the SQL model"},{"line_number":307,"context_line":"   :code:`IPAllocationPoolSqlModel`: :code:`sa.ForeignKey(\u0027subnets.id\u0027)`"},{"line_number":308,"context_line":""},{"line_number":309,"context_line":".. note::"},{"line_number":310,"context_line":"   Multiple primary keys related to one parent object are not permitted."},{"line_number":311,"context_line":""},{"line_number":312,"context_line":"It is important to remember about the nullable parameter. In the SQLAlchemy"},{"line_number":313,"context_line":"model, the nullable parameter is by default :code:`True`, while for OVO fields,"}],"source_content_type":"text/x-rst","patch_set":16,"id":"ba2be162_9b01093b","line":310,"range":{"start_line":309,"start_character":0,"end_line":310,"end_character":72},"in_reply_to":"ba2be162_eda513a2","updated":"2017-03-03 16:52:07.000000000","message":"Changed wording, using provided by Ihar","commit_id":"e2591db71681a8d60fae6cb541ed663ae5729874"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"4b65f4e4e0208553b0fea8884c3e7e7b809eb32a","unresolved":false,"context_lines":[{"line_number":347,"context_line":"implement custom getters and setters for the custom field."},{"line_number":348,"context_line":"The custom method to load the synthetic fields can be helpful if the field is"},{"line_number":349,"context_line":"not directly defined in the database, OVO class is not suitable to load the"},{"line_number":350,"context_line":"data or the related object contain only the ID and property of the parent"},{"line_number":351,"context_line":"object, for example :code:`subnet_id` and property of it: :code:`is_external`."},{"line_number":352,"context_line":""},{"line_number":353,"context_line":"In order to implement the custom method to load the synthetic field, you need"}],"source_content_type":"text/x-rst","patch_set":16,"id":"ba2be162_8d32d75d","line":350,"range":{"start_line":350,"start_character":27,"end_line":350,"end_character":34},"updated":"2017-03-02 22:36:46.000000000","message":"contains","commit_id":"e2591db71681a8d60fae6cb541ed663ae5729874"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"41efa7a91b41748b6cdc65114e1f92f387a51e88","unresolved":false,"context_lines":[{"line_number":347,"context_line":"implement custom getters and setters for the custom field."},{"line_number":348,"context_line":"The custom method to load the synthetic fields can be helpful if the field is"},{"line_number":349,"context_line":"not directly defined in the database, OVO class is not suitable to load the"},{"line_number":350,"context_line":"data or the related object contain only the ID and property of the parent"},{"line_number":351,"context_line":"object, for example :code:`subnet_id` and property of it: :code:`is_external`."},{"line_number":352,"context_line":""},{"line_number":353,"context_line":"In order to implement the custom method to load the synthetic field, you need"}],"source_content_type":"text/x-rst","patch_set":16,"id":"ba2be162_7b8b75c3","line":350,"range":{"start_line":350,"start_character":27,"end_line":350,"end_character":34},"in_reply_to":"ba2be162_8d32d75d","updated":"2017-03-03 16:52:07.000000000","message":"Done","commit_id":"e2591db71681a8d60fae6cb541ed663ae5729874"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"4b65f4e4e0208553b0fea8884c3e7e7b809eb32a","unresolved":false,"context_lines":[{"line_number":357,"context_line":"and :code:`update`. The second is responsible for loading attribute when it is not set"},{"line_number":358,"context_line":"in object. Also, when you need to create related object with attributes passed"},{"line_number":359,"context_line":"in constructor, :code:`create` and :code:`update` methods  need to be overwritten."},{"line_number":360,"context_line":"To expose is_external attribute as a boolean instead of as an object-typed field that would then itself encapsulate the boolean value of interest"},{"line_number":361,"context_line":"Let\u0027s see an example:"},{"line_number":362,"context_line":""},{"line_number":363,"context_line":".. code-block:: Python"},{"line_number":364,"context_line":""}],"source_content_type":"text/x-rst","patch_set":16,"id":"ba2be162_0d542751","line":361,"range":{"start_line":360,"start_character":0,"end_line":361,"end_character":21},"updated":"2017-03-02 22:36:46.000000000","message":"Not clear if it\u0027s a single sentence or two. Two upper-case letters and/or no dot in between are misleading.","commit_id":"e2591db71681a8d60fae6cb541ed663ae5729874"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"41efa7a91b41748b6cdc65114e1f92f387a51e88","unresolved":false,"context_lines":[{"line_number":357,"context_line":"and :code:`update`. The second is responsible for loading attribute when it is not set"},{"line_number":358,"context_line":"in object. Also, when you need to create related object with attributes passed"},{"line_number":359,"context_line":"in constructor, :code:`create` and :code:`update` methods  need to be overwritten."},{"line_number":360,"context_line":"To expose is_external attribute as a boolean instead of as an object-typed field that would then itself encapsulate the boolean value of interest"},{"line_number":361,"context_line":"Let\u0027s see an example:"},{"line_number":362,"context_line":""},{"line_number":363,"context_line":".. code-block:: Python"},{"line_number":364,"context_line":""}],"source_content_type":"text/x-rst","patch_set":16,"id":"ba2be162_8dcd5087","line":361,"range":{"start_line":360,"start_character":0,"end_line":361,"end_character":21},"in_reply_to":"ba2be162_0d542751","updated":"2017-03-03 16:52:07.000000000","message":"Rephrased that.","commit_id":"e2591db71681a8d60fae6cb541ed663ae5729874"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"0a27494140baab94d9987a53739745043843e21f","unresolved":false,"context_lines":[{"line_number":503,"context_line":"        }"},{"line_number":504,"context_line":""},{"line_number":505,"context_line":".. note::"},{"line_number":506,"context_line":"   The :code`shared` field is not added to the :code:`synthetic_fields`,"},{"line_number":507,"context_line":"   because :code:`NeutronRbacObject` requires to add it by itself, otherwise"},{"line_number":508,"context_line":"   :code:`ObjectActionError` is raised. [#]_"},{"line_number":509,"context_line":""}],"source_content_type":"text/x-rst","patch_set":16,"id":"ba2be162_e86d4105","line":506,"range":{"start_line":506,"start_character":7,"end_line":506,"end_character":12},"updated":"2017-03-02 01:16:49.000000000","message":"s/:code/:code:","commit_id":"e2591db71681a8d60fae6cb541ed663ae5729874"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"41efa7a91b41748b6cdc65114e1f92f387a51e88","unresolved":false,"context_lines":[{"line_number":503,"context_line":"        }"},{"line_number":504,"context_line":""},{"line_number":505,"context_line":".. note::"},{"line_number":506,"context_line":"   The :code`shared` field is not added to the :code:`synthetic_fields`,"},{"line_number":507,"context_line":"   because :code:`NeutronRbacObject` requires to add it by itself, otherwise"},{"line_number":508,"context_line":"   :code:`ObjectActionError` is raised. [#]_"},{"line_number":509,"context_line":""}],"source_content_type":"text/x-rst","patch_set":16,"id":"ba2be162_dba54147","line":506,"range":{"start_line":506,"start_character":7,"end_line":506,"end_character":12},"in_reply_to":"ba2be162_e86d4105","updated":"2017-03-03 16:52:07.000000000","message":"Done","commit_id":"e2591db71681a8d60fae6cb541ed663ae5729874"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"4b65f4e4e0208553b0fea8884c3e7e7b809eb32a","unresolved":false,"context_lines":[{"line_number":575,"context_line":"The above example is the ideal situation, where all extensions have objects"},{"line_number":576,"context_line":"adopted and enabled in core neutron resources."},{"line_number":577,"context_line":""},{"line_number":578,"context_line":"By introducing the OVO work in tree, interface between base plugin code and registered extension functions haven\u0027t been changed. Those still receive a SQLAlchemy model, not an object. This is achieved by capturing the corresponding database model on :code:`get_***/create/update`, and exposing it via :code:`\u003cobject\u003e.db_obj`"},{"line_number":579,"context_line":""},{"line_number":580,"context_line":"Backward compatibility for tenant_id"},{"line_number":581,"context_line":"------------------------------------"}],"source_content_type":"text/x-rst","patch_set":16,"id":"ba2be162_2dfbab48","line":578,"range":{"start_line":578,"start_character":107,"end_line":578,"end_character":114},"updated":"2017-03-02 22:36:46.000000000","message":"hasn\u0027t","commit_id":"e2591db71681a8d60fae6cb541ed663ae5729874"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"4b65f4e4e0208553b0fea8884c3e7e7b809eb32a","unresolved":false,"context_lines":[{"line_number":575,"context_line":"The above example is the ideal situation, where all extensions have objects"},{"line_number":576,"context_line":"adopted and enabled in core neutron resources."},{"line_number":577,"context_line":""},{"line_number":578,"context_line":"By introducing the OVO work in tree, interface between base plugin code and registered extension functions haven\u0027t been changed. Those still receive a SQLAlchemy model, not an object. This is achieved by capturing the corresponding database model on :code:`get_***/create/update`, and exposing it via :code:`\u003cobject\u003e.db_obj`"},{"line_number":579,"context_line":""},{"line_number":580,"context_line":"Backward compatibility for tenant_id"},{"line_number":581,"context_line":"------------------------------------"}],"source_content_type":"text/x-rst","patch_set":16,"id":"ba2be162_6d9763ec","line":578,"range":{"start_line":578,"start_character":129,"end_line":578,"end_character":133},"updated":"2017-03-02 22:36:46.000000000","message":"you probably want to wrap lines here","commit_id":"e2591db71681a8d60fae6cb541ed663ae5729874"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"41efa7a91b41748b6cdc65114e1f92f387a51e88","unresolved":false,"context_lines":[{"line_number":575,"context_line":"The above example is the ideal situation, where all extensions have objects"},{"line_number":576,"context_line":"adopted and enabled in core neutron resources."},{"line_number":577,"context_line":""},{"line_number":578,"context_line":"By introducing the OVO work in tree, interface between base plugin code and registered extension functions haven\u0027t been changed. Those still receive a SQLAlchemy model, not an object. This is achieved by capturing the corresponding database model on :code:`get_***/create/update`, and exposing it via :code:`\u003cobject\u003e.db_obj`"},{"line_number":579,"context_line":""},{"line_number":580,"context_line":"Backward compatibility for tenant_id"},{"line_number":581,"context_line":"------------------------------------"}],"source_content_type":"text/x-rst","patch_set":16,"id":"ba2be162_db538137","line":578,"range":{"start_line":578,"start_character":107,"end_line":578,"end_character":114},"in_reply_to":"ba2be162_2dfbab48","updated":"2017-03-03 16:52:07.000000000","message":"Done","commit_id":"e2591db71681a8d60fae6cb541ed663ae5729874"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"41efa7a91b41748b6cdc65114e1f92f387a51e88","unresolved":false,"context_lines":[{"line_number":575,"context_line":"The above example is the ideal situation, where all extensions have objects"},{"line_number":576,"context_line":"adopted and enabled in core neutron resources."},{"line_number":577,"context_line":""},{"line_number":578,"context_line":"By introducing the OVO work in tree, interface between base plugin code and registered extension functions haven\u0027t been changed. Those still receive a SQLAlchemy model, not an object. This is achieved by capturing the corresponding database model on :code:`get_***/create/update`, and exposing it via :code:`\u003cobject\u003e.db_obj`"},{"line_number":579,"context_line":""},{"line_number":580,"context_line":"Backward compatibility for tenant_id"},{"line_number":581,"context_line":"------------------------------------"}],"source_content_type":"text/x-rst","patch_set":16,"id":"ba2be162_bb56cd27","line":578,"range":{"start_line":578,"start_character":129,"end_line":578,"end_character":133},"in_reply_to":"ba2be162_6d9763ec","updated":"2017-03-03 16:52:07.000000000","message":"Done","commit_id":"e2591db71681a8d60fae6cb541ed663ae5729874"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"4b65f4e4e0208553b0fea8884c3e7e7b809eb32a","unresolved":false,"context_lines":[{"line_number":608,"context_line":""},{"line_number":609,"context_line":"References"},{"line_number":610,"context_line":"----------"},{"line_number":611,"context_line":".. [#] https://git.openstack.org/cgit/openstack/deb-neutron/tree/neutron/objects/base.py?h\u003dstable/ocata#n258"},{"line_number":612,"context_line":".. [#] https://git.openstack.org/cgit/openstack/deb-neutron/tree/neutron/db/standard_attr.py?h\u003dstable/ocata"},{"line_number":613,"context_line":".. [#] https://git.openstack.org/cgit/openstack/deb-neutron/tree/neutron/objects/base.py?h\u003dstable/ocata#n516"},{"line_number":614,"context_line":".. [#] https://git.openstack.org/cgit/openstack/deb-neutron/tree/neutron/objects/base.py?h\u003dstable/ocata#n542"}],"source_content_type":"text/x-rst","patch_set":16,"id":"ba2be162_edb27393","line":611,"range":{"start_line":611,"start_character":48,"end_line":611,"end_character":52},"updated":"2017-03-02 22:36:46.000000000","message":"WAT? we should link to neutron repo, not deb-neutron","commit_id":"e2591db71681a8d60fae6cb541ed663ae5729874"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"41efa7a91b41748b6cdc65114e1f92f387a51e88","unresolved":false,"context_lines":[{"line_number":608,"context_line":""},{"line_number":609,"context_line":"References"},{"line_number":610,"context_line":"----------"},{"line_number":611,"context_line":".. [#] https://git.openstack.org/cgit/openstack/deb-neutron/tree/neutron/objects/base.py?h\u003dstable/ocata#n258"},{"line_number":612,"context_line":".. [#] https://git.openstack.org/cgit/openstack/deb-neutron/tree/neutron/db/standard_attr.py?h\u003dstable/ocata"},{"line_number":613,"context_line":".. [#] https://git.openstack.org/cgit/openstack/deb-neutron/tree/neutron/objects/base.py?h\u003dstable/ocata#n516"},{"line_number":614,"context_line":".. [#] https://git.openstack.org/cgit/openstack/deb-neutron/tree/neutron/objects/base.py?h\u003dstable/ocata#n542"}],"source_content_type":"text/x-rst","patch_set":16,"id":"ba2be162_3b101d59","line":611,"range":{"start_line":611,"start_character":48,"end_line":611,"end_character":52},"in_reply_to":"ba2be162_edb27393","updated":"2017-03-03 16:52:07.000000000","message":"Done","commit_id":"e2591db71681a8d60fae6cb541ed663ae5729874"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"72872ab6d6e1595e40a650e8d073a982d5d759b4","unresolved":false,"context_lines":[{"line_number":74,"context_line":"    # will return list of all dns name servers from DB"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    # if you want to remove the object, you need to fetch it first:"},{"line_number":77,"context_line":"    primary_keys \u003d {address: \u0027asd\u0027, subnet_id: \u0027xxx\u0027}"},{"line_number":78,"context_line":"    dns \u003d DNSNameServer.get_object(context, **primary_keys)"},{"line_number":79,"context_line":"    if dns:"},{"line_number":80,"context_line":"        # get_object can return None if no result was found, so we have to"}],"source_content_type":"text/x-rst","patch_set":17,"id":"ba2be162_505bebf5","line":77,"range":{"start_line":77,"start_character":20,"end_line":77,"end_character":27},"updated":"2017-03-03 17:08:47.000000000","message":"should be \u0027quoted\u0027","commit_id":"e5eaa8e3423c5ea8865e11314a7cb45d2ae50498"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"72872ab6d6e1595e40a650e8d073a982d5d759b4","unresolved":false,"context_lines":[{"line_number":589,"context_line":""},{"line_number":590,"context_line":"Backward compatibility for tenant_id"},{"line_number":591,"context_line":"------------------------------------"},{"line_number":592,"context_line":"Aall objects can support :code:`tenant_id` and :code:`project_id` filters and"},{"line_number":593,"context_line":"fields at the same time; it is automatically enabled for all objects that have"},{"line_number":594,"context_line":"a :code:`project_id` field. The base :code:`NeutronDbObject` class has support"},{"line_number":595,"context_line":"for exposing :code:`tenant_id` in dictionary access to the object fields"}],"source_content_type":"text/x-rst","patch_set":17,"id":"ba2be162_30a91791","line":592,"range":{"start_line":592,"start_character":0,"end_line":592,"end_character":4},"updated":"2017-03-03 17:08:47.000000000","message":"Y\u0027all! :)","commit_id":"e5eaa8e3423c5ea8865e11314a7cb45d2ae50498"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"853afb01c306036c6959b99567cbecf2846d9b61","unresolved":false,"context_lines":[{"line_number":74,"context_line":"    # will return list of all dns name servers from DB"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    # if you want to remove the object, you need to fetch it first:"},{"line_number":77,"context_line":"    primary_keys \u003d {address: \u0027asd\u0027, subnet_id: \u0027xxx\u0027}"},{"line_number":78,"context_line":"    dns \u003d DNSNameServer.get_object(context, **primary_keys)"},{"line_number":79,"context_line":"    if dns:"},{"line_number":80,"context_line":"        # get_object can return None if no result was found, so we have to"}],"source_content_type":"text/x-rst","patch_set":18,"id":"ba2be162_90c9e35b","line":77,"range":{"start_line":77,"start_character":20,"end_line":77,"end_character":28},"updated":"2017-03-03 17:09:49.000000000","message":"to quote","commit_id":"deec7c166dbec81d44466e08cd700ab4ee5865ca"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"2b472b1ee01d5c38dcf6e299191b3831230eb97d","unresolved":false,"context_lines":[{"line_number":74,"context_line":"    # will return list of all dns name servers from DB"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    # if you want to remove the object, you need to fetch it first:"},{"line_number":77,"context_line":"    primary_keys \u003d {address: \u0027asd\u0027, subnet_id: \u0027xxx\u0027}"},{"line_number":78,"context_line":"    dns \u003d DNSNameServer.get_object(context, **primary_keys)"},{"line_number":79,"context_line":"    if dns:"},{"line_number":80,"context_line":"        # get_object can return None if no result was found, so we have to"}],"source_content_type":"text/x-rst","patch_set":18,"id":"ba2be162_903e4326","line":77,"range":{"start_line":77,"start_character":20,"end_line":77,"end_character":28},"in_reply_to":"ba2be162_90c9e35b","updated":"2017-03-03 17:12:53.000000000","message":"Done","commit_id":"deec7c166dbec81d44466e08cd700ab4ee5865ca"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"853afb01c306036c6959b99567cbecf2846d9b61","unresolved":false,"context_lines":[{"line_number":522,"context_line":":code:`extend_\u003cresource\u003e_dict`. When extension is enabled,"},{"line_number":523,"context_line":":code:`extend_\u003cresource\u003e_dict` takes the DB results and declares new fields in"},{"line_number":524,"context_line":"resulting dict. When extension is not enabled, data will be fetched, but will"},{"line_number":525,"context_line":"not be populated into resulting dict, :code:`because extend_\u003cresource\u003e_dict`"},{"line_number":526,"context_line":"will not be called."},{"line_number":527,"context_line":""},{"line_number":528,"context_line":"Plugins can still use objects for some work, but then convert them to dicts and"}],"source_content_type":"text/x-rst","patch_set":18,"id":"ba2be162_90a2c397","line":525,"range":{"start_line":525,"start_character":38,"end_line":525,"end_character":52},"updated":"2017-03-03 17:09:49.000000000","message":"did you really want to include because in :code:?","commit_id":"deec7c166dbec81d44466e08cd700ab4ee5865ca"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"2b472b1ee01d5c38dcf6e299191b3831230eb97d","unresolved":false,"context_lines":[{"line_number":522,"context_line":":code:`extend_\u003cresource\u003e_dict`. When extension is enabled,"},{"line_number":523,"context_line":":code:`extend_\u003cresource\u003e_dict` takes the DB results and declares new fields in"},{"line_number":524,"context_line":"resulting dict. When extension is not enabled, data will be fetched, but will"},{"line_number":525,"context_line":"not be populated into resulting dict, :code:`because extend_\u003cresource\u003e_dict`"},{"line_number":526,"context_line":"will not be called."},{"line_number":527,"context_line":""},{"line_number":528,"context_line":"Plugins can still use objects for some work, but then convert them to dicts and"}],"source_content_type":"text/x-rst","patch_set":18,"id":"ba2be162_706f0f2b","line":525,"range":{"start_line":525,"start_character":38,"end_line":525,"end_character":52},"in_reply_to":"ba2be162_90a2c397","updated":"2017-03-03 17:12:53.000000000","message":"Of course! It\u0027s the most common keyword in Python!","commit_id":"deec7c166dbec81d44466e08cd700ab4ee5865ca"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"853afb01c306036c6959b99567cbecf2846d9b61","unresolved":false,"context_lines":[{"line_number":589,"context_line":""},{"line_number":590,"context_line":"Backward compatibility for tenant_id"},{"line_number":591,"context_line":"------------------------------------"},{"line_number":592,"context_line":"Aall objects can support :code:`tenant_id` and :code:`project_id` filters and"},{"line_number":593,"context_line":"fields at the same time; it is automatically enabled for all objects that have"},{"line_number":594,"context_line":"a :code:`project_id` field. The base :code:`NeutronDbObject` class has support"},{"line_number":595,"context_line":"for exposing :code:`tenant_id` in dictionary access to the object fields"}],"source_content_type":"text/x-rst","patch_set":18,"id":"ba2be162_50b3ebe8","line":592,"range":{"start_line":592,"start_character":0,"end_line":592,"end_character":4},"updated":"2017-03-03 17:09:49.000000000","message":"y\u0027all :))","commit_id":"deec7c166dbec81d44466e08cd700ab4ee5865ca"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"2b472b1ee01d5c38dcf6e299191b3831230eb97d","unresolved":false,"context_lines":[{"line_number":589,"context_line":""},{"line_number":590,"context_line":"Backward compatibility for tenant_id"},{"line_number":591,"context_line":"------------------------------------"},{"line_number":592,"context_line":"Aall objects can support :code:`tenant_id` and :code:`project_id` filters and"},{"line_number":593,"context_line":"fields at the same time; it is automatically enabled for all objects that have"},{"line_number":594,"context_line":"a :code:`project_id` field. The base :code:`NeutronDbObject` class has support"},{"line_number":595,"context_line":"for exposing :code:`tenant_id` in dictionary access to the object fields"}],"source_content_type":"text/x-rst","patch_set":18,"id":"ba2be162_505dab77","line":592,"range":{"start_line":592,"start_character":0,"end_line":592,"end_character":4},"in_reply_to":"ba2be162_50b3ebe8","updated":"2017-03-03 17:12:53.000000000","message":"I\u0027m in TX :)","commit_id":"deec7c166dbec81d44466e08cd700ab4ee5865ca"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"027587d92125c826d8f64b229caf972431de91d6","unresolved":false,"context_lines":[{"line_number":50,"context_line":"~~~~~~~~~~~~~~~"},{"line_number":51,"context_line":"Objects support CRUD operations: :code:`create`, :code:`get_object` and"},{"line_number":52,"context_line":":code:`get_objects` (equivalent of :code:`read`), :code:`update`"},{"line_number":53,"context_line":"and :code:`delete`. The nature of OVO is, when any change is applied, OVO"},{"line_number":54,"context_line":"tracks it. After calling :code:`create` or :code:`update`, OVO"},{"line_number":55,"context_line":"detects this and changed fields are saved in the database. When field (regular"},{"line_number":56,"context_line":"or synthetic one) is changed, but this doesn\u0027t need to be saved into database,"}],"source_content_type":"text/x-rst","patch_set":19,"id":"ba2be162_97ef15e8","line":53,"range":{"start_line":53,"start_character":0,"end_line":53,"end_character":18},"updated":"2017-03-03 18:40:34.000000000","message":"delete_objects is also there might want to add that too","commit_id":"056104c9a407683b54595b78e4f5ccf35d9e8fc8"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"bbaddbc9543cc5543c0fb94a8307df4b14ee683f","unresolved":false,"context_lines":[{"line_number":50,"context_line":"~~~~~~~~~~~~~~~"},{"line_number":51,"context_line":"Objects support CRUD operations: :code:`create`, :code:`get_object` and"},{"line_number":52,"context_line":":code:`get_objects` (equivalent of :code:`read`), :code:`update`"},{"line_number":53,"context_line":"and :code:`delete`. The nature of OVO is, when any change is applied, OVO"},{"line_number":54,"context_line":"tracks it. After calling :code:`create` or :code:`update`, OVO"},{"line_number":55,"context_line":"detects this and changed fields are saved in the database. When field (regular"},{"line_number":56,"context_line":"or synthetic one) is changed, but this doesn\u0027t need to be saved into database,"}],"source_content_type":"text/x-rst","patch_set":19,"id":"ba2be162_cf7011a7","line":53,"range":{"start_line":53,"start_character":0,"end_line":53,"end_character":18},"in_reply_to":"ba2be162_97ef15e8","updated":"2017-03-03 20:39:48.000000000","message":"Done","commit_id":"056104c9a407683b54595b78e4f5ccf35d9e8fc8"},{"author":{"_account_id":22220,"name":"Anindita Das","email":"anindita.das@utexas.edu","username":"anudas"},"change_message_id":"aa7b1045230413eafc55259deddc1fbe4e7ea01f","unresolved":false,"context_lines":[{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    # if you want to remove the object, you need to fetch it first:"},{"line_number":77,"context_line":"    primary_keys \u003d {\u0027address\u0027: \u0027asd\u0027, \u0027subnet_id\u0027: \u0027xxx\u0027}"},{"line_number":78,"context_line":"    dns \u003d DNSNameServer.get_object(context, **primary_keys)"},{"line_number":79,"context_line":"    if dns:"},{"line_number":80,"context_line":"        # get_object can return None if no result was found, so we have to"},{"line_number":81,"context_line":"        # check if \u0027dns\u0027 is not None to call the .delete() method on it."},{"line_number":82,"context_line":"        # Otherwise, the delete() called on None object will raise"},{"line_number":83,"context_line":"        # AttributeError."},{"line_number":84,"context_line":"        dns.delete()"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"Filter, sort and paginate"}],"source_content_type":"text/x-rst","patch_set":19,"id":"ba2be162_c90bb122","line":84,"range":{"start_line":78,"start_character":4,"end_line":84,"end_character":20},"updated":"2017-03-03 20:27:00.000000000","message":"AFAIU: this is replaced by delete_objects method in [1]\n\n[1] https://github.com/openstack/neutron/blob/master/neutron/objects/base.py#L177-L181","commit_id":"056104c9a407683b54595b78e4f5ccf35d9e8fc8"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"bbaddbc9543cc5543c0fb94a8307df4b14ee683f","unresolved":false,"context_lines":[{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    # if you want to remove the object, you need to fetch it first:"},{"line_number":77,"context_line":"    primary_keys \u003d {\u0027address\u0027: \u0027asd\u0027, \u0027subnet_id\u0027: \u0027xxx\u0027}"},{"line_number":78,"context_line":"    dns \u003d DNSNameServer.get_object(context, **primary_keys)"},{"line_number":79,"context_line":"    if dns:"},{"line_number":80,"context_line":"        # get_object can return None if no result was found, so we have to"},{"line_number":81,"context_line":"        # check if \u0027dns\u0027 is not None to call the .delete() method on it."},{"line_number":82,"context_line":"        # Otherwise, the delete() called on None object will raise"},{"line_number":83,"context_line":"        # AttributeError."},{"line_number":84,"context_line":"        dns.delete()"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"Filter, sort and paginate"}],"source_content_type":"text/x-rst","patch_set":19,"id":"ba2be162_ef9955c5","line":84,"range":{"start_line":78,"start_character":4,"end_line":84,"end_character":20},"in_reply_to":"ba2be162_54a83477","updated":"2017-03-03 20:39:48.000000000","message":"Done","commit_id":"056104c9a407683b54595b78e4f5ccf35d9e8fc8"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"bbaddbc9543cc5543c0fb94a8307df4b14ee683f","unresolved":false,"context_lines":[{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    # if you want to remove the object, you need to fetch it first:"},{"line_number":77,"context_line":"    primary_keys \u003d {\u0027address\u0027: \u0027asd\u0027, \u0027subnet_id\u0027: \u0027xxx\u0027}"},{"line_number":78,"context_line":"    dns \u003d DNSNameServer.get_object(context, **primary_keys)"},{"line_number":79,"context_line":"    if dns:"},{"line_number":80,"context_line":"        # get_object can return None if no result was found, so we have to"},{"line_number":81,"context_line":"        # check if \u0027dns\u0027 is not None to call the .delete() method on it."},{"line_number":82,"context_line":"        # Otherwise, the delete() called on None object will raise"},{"line_number":83,"context_line":"        # AttributeError."},{"line_number":84,"context_line":"        dns.delete()"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"Filter, sort and paginate"}],"source_content_type":"text/x-rst","patch_set":19,"id":"ba2be162_0f95c985","line":84,"range":{"start_line":78,"start_character":4,"end_line":84,"end_character":20},"in_reply_to":"ba2be162_c90bb122","updated":"2017-03-03 20:39:48.000000000","message":"Done","commit_id":"056104c9a407683b54595b78e4f5ccf35d9e8fc8"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"a930b87ac5f5ed70aca2437e87484541f92528ab","unresolved":false,"context_lines":[{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    # if you want to remove the object, you need to fetch it first:"},{"line_number":77,"context_line":"    primary_keys \u003d {\u0027address\u0027: \u0027asd\u0027, \u0027subnet_id\u0027: \u0027xxx\u0027}"},{"line_number":78,"context_line":"    dns \u003d DNSNameServer.get_object(context, **primary_keys)"},{"line_number":79,"context_line":"    if dns:"},{"line_number":80,"context_line":"        # get_object can return None if no result was found, so we have to"},{"line_number":81,"context_line":"        # check if \u0027dns\u0027 is not None to call the .delete() method on it."},{"line_number":82,"context_line":"        # Otherwise, the delete() called on None object will raise"},{"line_number":83,"context_line":"        # AttributeError."},{"line_number":84,"context_line":"        dns.delete()"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"Filter, sort and paginate"}],"source_content_type":"text/x-rst","patch_set":19,"id":"ba2be162_54a83477","line":84,"range":{"start_line":78,"start_character":4,"end_line":84,"end_character":20},"in_reply_to":"ba2be162_c90bb122","updated":"2017-03-03 20:29:38.000000000","message":"Oh right, probably worth documenting best practices.","commit_id":"056104c9a407683b54595b78e4f5ccf35d9e8fc8"},{"author":{"_account_id":22220,"name":"Anindita Das","email":"anindita.das@utexas.edu","username":"anudas"},"change_message_id":"aa7b1045230413eafc55259deddc1fbe4e7ea01f","unresolved":false,"context_lines":[{"line_number":157,"context_line":"Example::"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"    fields \u003d {"},{"line_number":160,"context_line":"        \u0027id\u0027: obj_fields.UUIDField(),"},{"line_number":161,"context_line":"        \u0027name\u0027: obj_fields.StringField(),"},{"line_number":162,"context_line":"        \u0027subnetpool_id\u0027: obj_fields.UUIDField(nullable\u003dTrue),"},{"line_number":163,"context_line":"        \u0027ip_version\u0027: common_types.IPVersionEnumField()"}],"source_content_type":"text/x-rst","patch_set":19,"id":"ba2be162_6961e5a8","line":160,"range":{"start_line":160,"start_character":14,"end_line":160,"end_character":24},"updated":"2017-03-03 20:27:00.000000000","message":"IIUC, obj_fields need to be replaced by common_types as in [1]\n\n[1] https://github.com/openstack/neutron/blob/master/neutron/objects/agent.py#L32","commit_id":"056104c9a407683b54595b78e4f5ccf35d9e8fc8"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"bbaddbc9543cc5543c0fb94a8307df4b14ee683f","unresolved":false,"context_lines":[{"line_number":157,"context_line":"Example::"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"    fields \u003d {"},{"line_number":160,"context_line":"        \u0027id\u0027: obj_fields.UUIDField(),"},{"line_number":161,"context_line":"        \u0027name\u0027: obj_fields.StringField(),"},{"line_number":162,"context_line":"        \u0027subnetpool_id\u0027: obj_fields.UUIDField(nullable\u003dTrue),"},{"line_number":163,"context_line":"        \u0027ip_version\u0027: common_types.IPVersionEnumField()"}],"source_content_type":"text/x-rst","patch_set":19,"id":"ba2be162_efc79593","line":160,"range":{"start_line":160,"start_character":14,"end_line":160,"end_character":24},"in_reply_to":"ba2be162_54bf54a9","updated":"2017-03-03 20:39:48.000000000","message":"Done","commit_id":"056104c9a407683b54595b78e4f5ccf35d9e8fc8"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"bbaddbc9543cc5543c0fb94a8307df4b14ee683f","unresolved":false,"context_lines":[{"line_number":157,"context_line":"Example::"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"    fields \u003d {"},{"line_number":160,"context_line":"        \u0027id\u0027: obj_fields.UUIDField(),"},{"line_number":161,"context_line":"        \u0027name\u0027: obj_fields.StringField(),"},{"line_number":162,"context_line":"        \u0027subnetpool_id\u0027: obj_fields.UUIDField(nullable\u003dTrue),"},{"line_number":163,"context_line":"        \u0027ip_version\u0027: common_types.IPVersionEnumField()"}],"source_content_type":"text/x-rst","patch_set":19,"id":"ba2be162_cfcc91bd","line":160,"range":{"start_line":160,"start_character":14,"end_line":160,"end_character":24},"in_reply_to":"ba2be162_6961e5a8","updated":"2017-03-03 20:39:48.000000000","message":"Done","commit_id":"056104c9a407683b54595b78e4f5ccf35d9e8fc8"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"a930b87ac5f5ed70aca2437e87484541f92528ab","unresolved":false,"context_lines":[{"line_number":157,"context_line":"Example::"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"    fields \u003d {"},{"line_number":160,"context_line":"        \u0027id\u0027: obj_fields.UUIDField(),"},{"line_number":161,"context_line":"        \u0027name\u0027: obj_fields.StringField(),"},{"line_number":162,"context_line":"        \u0027subnetpool_id\u0027: obj_fields.UUIDField(nullable\u003dTrue),"},{"line_number":163,"context_line":"        \u0027ip_version\u0027: common_types.IPVersionEnumField()"}],"source_content_type":"text/x-rst","patch_set":19,"id":"ba2be162_54bf54a9","line":160,"range":{"start_line":160,"start_character":14,"end_line":160,"end_character":24},"in_reply_to":"ba2be162_6961e5a8","updated":"2017-03-03 20:29:38.000000000","message":"You are the second to note that. I guess it\u0027s worth changing it.","commit_id":"056104c9a407683b54595b78e4f5ccf35d9e8fc8"},{"author":{"_account_id":22220,"name":"Anindita Das","email":"anindita.das@utexas.edu","username":"anudas"},"change_message_id":"aa7b1045230413eafc55259deddc1fbe4e7ea01f","unresolved":false,"context_lines":[{"line_number":255,"context_line":""},{"line_number":256,"context_line":"        fields \u003d {"},{"line_number":257,"context_line":"            \u0027address\u0027: obj_fields.StringField(),"},{"line_number":258,"context_line":"            \u0027subnet_id\u0027: obj_fields.UUIDField(),"},{"line_number":259,"context_line":"        }"},{"line_number":260,"context_line":""},{"line_number":261,"context_line":"    @obj_base.VersionedObjectRegistry.register"}],"source_content_type":"text/x-rst","patch_set":19,"id":"ba2be162_89d9b959","line":258,"range":{"start_line":258,"start_character":25,"end_line":258,"end_character":35},"updated":"2017-03-03 20:27:00.000000000","message":"Needs to be changed to common types as in [1].\n\n[1] https://github.com/openstack/neutron/blob/master/neutron/objects/subnet.py#L40","commit_id":"056104c9a407683b54595b78e4f5ccf35d9e8fc8"},{"author":{"_account_id":22220,"name":"Anindita Das","email":"anindita.das@utexas.edu","username":"anudas"},"change_message_id":"aa7b1045230413eafc55259deddc1fbe4e7ea01f","unresolved":false,"context_lines":[{"line_number":264,"context_line":"        db_base \u003d  SubnetSqlModel"},{"line_number":265,"context_line":""},{"line_number":266,"context_line":"        fields \u003d {"},{"line_number":267,"context_line":"            \u0027id\u0027: obj_fields.UUIDField(),  # HasId from model class"},{"line_number":268,"context_line":"            \u0027project_id\u0027: obj_fields.StringField(nullable\u003dTrue),  # HasProject from model class"},{"line_number":269,"context_line":"            \u0027subnet_name\u0027: obj_fields.StringField(nullable\u003dTrue),"},{"line_number":270,"context_line":"            \u0027dns_nameservers\u0027: obj_fields.ListOfObjectsField(\u0027DNSNameServer\u0027,"}],"source_content_type":"text/x-rst","patch_set":19,"id":"ba2be162_29db6d1c","line":267,"range":{"start_line":267,"start_character":18,"end_line":267,"end_character":28},"updated":"2017-03-03 20:27:00.000000000","message":"ditto as in [1].\n\n[1] https://github.com/openstack/neutron/blob/master/neutron/objects/subnet.py#L172","commit_id":"056104c9a407683b54595b78e4f5ccf35d9e8fc8"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"bbaddbc9543cc5543c0fb94a8307df4b14ee683f","unresolved":false,"context_lines":[{"line_number":264,"context_line":"        db_base \u003d  SubnetSqlModel"},{"line_number":265,"context_line":""},{"line_number":266,"context_line":"        fields \u003d {"},{"line_number":267,"context_line":"            \u0027id\u0027: obj_fields.UUIDField(),  # HasId from model class"},{"line_number":268,"context_line":"            \u0027project_id\u0027: obj_fields.StringField(nullable\u003dTrue),  # HasProject from model class"},{"line_number":269,"context_line":"            \u0027subnet_name\u0027: obj_fields.StringField(nullable\u003dTrue),"},{"line_number":270,"context_line":"            \u0027dns_nameservers\u0027: obj_fields.ListOfObjectsField(\u0027DNSNameServer\u0027,"}],"source_content_type":"text/x-rst","patch_set":19,"id":"ba2be162_af575dc8","line":267,"range":{"start_line":267,"start_character":18,"end_line":267,"end_character":28},"in_reply_to":"ba2be162_29db6d1c","updated":"2017-03-03 20:39:48.000000000","message":"Done","commit_id":"056104c9a407683b54595b78e4f5ccf35d9e8fc8"},{"author":{"_account_id":22220,"name":"Anindita Das","email":"anindita.das@utexas.edu","username":"anudas"},"change_message_id":"aa7b1045230413eafc55259deddc1fbe4e7ea01f","unresolved":false,"context_lines":[{"line_number":289,"context_line":"        db_base \u003d IPAllocationPoolSqlModel"},{"line_number":290,"context_line":""},{"line_number":291,"context_line":"        fields \u003d {"},{"line_number":292,"context_line":"            \u0027subnet_id\u0027: obj_fields.UUIDField()"},{"line_number":293,"context_line":"        }"},{"line_number":294,"context_line":""},{"line_number":295,"context_line":"        foreign_keys \u003d {\u0027SubnetOVO\u0027: {\u0027subnet_id\u0027: \u0027id\u0027}}"}],"source_content_type":"text/x-rst","patch_set":19,"id":"ba2be162_49ed01b6","line":292,"range":{"start_line":292,"start_character":25,"end_line":292,"end_character":35},"updated":"2017-03-03 20:27:00.000000000","message":"ditto as in [1].\n\n[1] https://github.com/openstack/neutron/blob/master/neutron/objects/subnet.py#L114","commit_id":"056104c9a407683b54595b78e4f5ccf35d9e8fc8"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"bbaddbc9543cc5543c0fb94a8307df4b14ee683f","unresolved":false,"context_lines":[{"line_number":289,"context_line":"        db_base \u003d IPAllocationPoolSqlModel"},{"line_number":290,"context_line":""},{"line_number":291,"context_line":"        fields \u003d {"},{"line_number":292,"context_line":"            \u0027subnet_id\u0027: obj_fields.UUIDField()"},{"line_number":293,"context_line":"        }"},{"line_number":294,"context_line":""},{"line_number":295,"context_line":"        foreign_keys \u003d {\u0027SubnetOVO\u0027: {\u0027subnet_id\u0027: \u0027id\u0027}}"}],"source_content_type":"text/x-rst","patch_set":19,"id":"ba2be162_ef75d563","line":292,"range":{"start_line":292,"start_character":25,"end_line":292,"end_character":35},"in_reply_to":"ba2be162_49ed01b6","updated":"2017-03-03 20:39:48.000000000","message":"Done","commit_id":"056104c9a407683b54595b78e4f5ccf35d9e8fc8"},{"author":{"_account_id":22220,"name":"Anindita Das","email":"anindita.das@utexas.edu","username":"anudas"},"change_message_id":"aa7b1045230413eafc55259deddc1fbe4e7ea01f","unresolved":false,"context_lines":[{"line_number":366,"context_line":"    @obj_base.VersionedObjectRegistry.register"},{"line_number":367,"context_line":"    class ExternalSubnet(base.NeutronDbObject):"},{"line_number":368,"context_line":"        VERSION \u003d \u00271.0\u0027"},{"line_number":369,"context_line":"        fields \u003d {\u0027subnet_id\u0027: obj_fields.UUIDField(),"},{"line_number":370,"context_line":"                  \u0027is_external\u0027: obj_fields.BooleanField()}"},{"line_number":371,"context_line":"        primary_keys \u003d [\u0027subnet_id\u0027]"},{"line_number":372,"context_line":"        foreign_keys \u003d {\u0027Subnet\u0027: {\u0027subnet_id\u0027: \u0027id\u0027}}"}],"source_content_type":"text/x-rst","patch_set":19,"id":"ba2be162_a9591d90","line":369,"range":{"start_line":369,"start_character":31,"end_line":369,"end_character":41},"updated":"2017-03-03 20:27:00.000000000","message":"ditto","commit_id":"056104c9a407683b54595b78e4f5ccf35d9e8fc8"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"bbaddbc9543cc5543c0fb94a8307df4b14ee683f","unresolved":false,"context_lines":[{"line_number":366,"context_line":"    @obj_base.VersionedObjectRegistry.register"},{"line_number":367,"context_line":"    class ExternalSubnet(base.NeutronDbObject):"},{"line_number":368,"context_line":"        VERSION \u003d \u00271.0\u0027"},{"line_number":369,"context_line":"        fields \u003d {\u0027subnet_id\u0027: obj_fields.UUIDField(),"},{"line_number":370,"context_line":"                  \u0027is_external\u0027: obj_fields.BooleanField()}"},{"line_number":371,"context_line":"        primary_keys \u003d [\u0027subnet_id\u0027]"},{"line_number":372,"context_line":"        foreign_keys \u003d {\u0027Subnet\u0027: {\u0027subnet_id\u0027: \u0027id\u0027}}"}],"source_content_type":"text/x-rst","patch_set":19,"id":"ba2be162_af0e7de2","line":369,"range":{"start_line":369,"start_character":31,"end_line":369,"end_character":41},"in_reply_to":"ba2be162_a9591d90","updated":"2017-03-03 20:39:48.000000000","message":"Done","commit_id":"056104c9a407683b54595b78e4f5ccf35d9e8fc8"},{"author":{"_account_id":22220,"name":"Anindita Das","email":"anindita.das@utexas.edu","username":"anudas"},"change_message_id":"aa7b1045230413eafc55259deddc1fbe4e7ea01f","unresolved":false,"context_lines":[{"line_number":498,"context_line":"        db_model \u003d models_v2.Network"},{"line_number":499,"context_line":""},{"line_number":500,"context_line":"        fields \u003d {"},{"line_number":501,"context_line":"            \u0027id\u0027: obj_fields.UUIDField(),"},{"line_number":502,"context_line":"            \u0027project_id\u0027: obj_fields.StringField(nullable\u003dTrue),"},{"line_number":503,"context_line":"            \u0027name\u0027: obj_fields.StringField(nullable\u003dTrue),"},{"line_number":504,"context_line":"            # share is required to be added to fields"}],"source_content_type":"text/x-rst","patch_set":19,"id":"ba2be162_29936dfb","line":501,"range":{"start_line":501,"start_character":18,"end_line":501,"end_character":28},"updated":"2017-03-03 20:27:00.000000000","message":"ditto as in [1].\n\n[1] https://github.com/openstack/neutron/blob/master/neutron/objects/network.py#L88","commit_id":"056104c9a407683b54595b78e4f5ccf35d9e8fc8"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"bbaddbc9543cc5543c0fb94a8307df4b14ee683f","unresolved":false,"context_lines":[{"line_number":498,"context_line":"        db_model \u003d models_v2.Network"},{"line_number":499,"context_line":""},{"line_number":500,"context_line":"        fields \u003d {"},{"line_number":501,"context_line":"            \u0027id\u0027: obj_fields.UUIDField(),"},{"line_number":502,"context_line":"            \u0027project_id\u0027: obj_fields.StringField(nullable\u003dTrue),"},{"line_number":503,"context_line":"            \u0027name\u0027: obj_fields.StringField(nullable\u003dTrue),"},{"line_number":504,"context_line":"            # share is required to be added to fields"}],"source_content_type":"text/x-rst","patch_set":19,"id":"ba2be162_6f2f253f","line":501,"range":{"start_line":501,"start_character":18,"end_line":501,"end_character":28},"in_reply_to":"ba2be162_29936dfb","updated":"2017-03-03 20:39:48.000000000","message":"Done","commit_id":"056104c9a407683b54595b78e4f5ccf35d9e8fc8"},{"author":{"_account_id":22220,"name":"Anindita Das","email":"anindita.das@utexas.edu","username":"anudas"},"change_message_id":"aa7b1045230413eafc55259deddc1fbe4e7ea01f","unresolved":false,"context_lines":[{"line_number":551,"context_line":"        db_model \u003d TestSubnetExtension"},{"line_number":552,"context_line":""},{"line_number":553,"context_line":"        fields \u003d {"},{"line_number":554,"context_line":"            \u0027subnet_id\u0027: obj_fields.UUIDField(),"},{"line_number":555,"context_line":"            \u0027value\u0027: obj_fields.StringField(nullable\u003dTrue)"},{"line_number":556,"context_line":"        }"},{"line_number":557,"context_line":""}],"source_content_type":"text/x-rst","patch_set":19,"id":"ba2be162_09af892a","line":554,"range":{"start_line":554,"start_character":25,"end_line":554,"end_character":35},"updated":"2017-03-03 20:27:00.000000000","message":"ditto","commit_id":"056104c9a407683b54595b78e4f5ccf35d9e8fc8"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"bbaddbc9543cc5543c0fb94a8307df4b14ee683f","unresolved":false,"context_lines":[{"line_number":551,"context_line":"        db_model \u003d TestSubnetExtension"},{"line_number":552,"context_line":""},{"line_number":553,"context_line":"        fields \u003d {"},{"line_number":554,"context_line":"            \u0027subnet_id\u0027: obj_fields.UUIDField(),"},{"line_number":555,"context_line":"            \u0027value\u0027: obj_fields.StringField(nullable\u003dTrue)"},{"line_number":556,"context_line":"        }"},{"line_number":557,"context_line":""}],"source_content_type":"text/x-rst","patch_set":19,"id":"ba2be162_af259d5c","line":554,"range":{"start_line":554,"start_character":25,"end_line":554,"end_character":35},"in_reply_to":"ba2be162_09af892a","updated":"2017-03-03 20:39:48.000000000","message":"Done","commit_id":"056104c9a407683b54595b78e4f5ccf35d9e8fc8"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"7b60e19ddef948fb7e00fdfe23e9e134a55d04b9","unresolved":false,"context_lines":[{"line_number":50,"context_line":"~~~~~~~~~~~~~~~"},{"line_number":51,"context_line":"Objects support CRUD operations: :code:`create`, :code:`get_object` and"},{"line_number":52,"context_line":":code:`get_objects` (equivalent of :code:`read`), :code:`update`"},{"line_number":53,"context_line":"and :code:`delete_objects`. The nature of OVO is, when any change is applied,"},{"line_number":54,"context_line":"OVO tracks it. After calling :code:`create` or :code:`update`, OVO"},{"line_number":55,"context_line":"detects this and changed fields are saved in the database. When field (regular"},{"line_number":56,"context_line":"or synthetic one) is changed, but this doesn\u0027t need to be saved into database,"}],"source_content_type":"text/x-rst","patch_set":20,"id":"ba2be162_2fc8cd73","line":53,"range":{"start_line":53,"start_character":8,"end_line":53,"end_character":26},"updated":"2017-03-03 20:40:47.000000000","message":"meh. please ADD delete_objects, without removing delete","commit_id":"0132513951b659f08eb173edd4a0fb97f5f52d82"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"861249ac6f0042a33c5b18ea8550eceabb90762e","unresolved":false,"context_lines":[{"line_number":1,"context_line":"."},{"line_number":2,"context_line":"      Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":3,"context_line":"      not use this file except in compliance with the License. You may obtain"},{"line_number":4,"context_line":"      a copy of the License at"}],"source_content_type":"text/x-rst","patch_set":21,"id":"ba2be162_5cac9d8c","line":1,"range":{"start_line":1,"start_character":0,"end_line":1,"end_character":1},"updated":"2017-03-06 17:20:10.000000000","message":"You need two \u0027.\u0027 chars here. Currently the license is being rendered on the page.","commit_id":"d507337adf7adfdde89465263927ff81dce5fadd"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"1efa224cf291e5a8b8b815461a0d1ffbf9683f0d","unresolved":false,"context_lines":[{"line_number":1,"context_line":"."},{"line_number":2,"context_line":"      Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":3,"context_line":"      not use this file except in compliance with the License. You may obtain"},{"line_number":4,"context_line":"      a copy of the License at"}],"source_content_type":"text/x-rst","patch_set":21,"id":"9a30ddce_653a8138","line":1,"range":{"start_line":1,"start_character":0,"end_line":1,"end_character":1},"in_reply_to":"ba2be162_5cac9d8c","updated":"2017-03-07 16:37:40.000000000","message":"Done","commit_id":"d507337adf7adfdde89465263927ff81dce5fadd"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"04b49e6decc883be090bd8a0dc85fc7490a3744f","unresolved":false,"context_lines":[{"line_number":73,"context_line":"    dnses \u003d DNSNameServer.get_objects(context)"},{"line_number":74,"context_line":"    # will return list of all dns name servers from DB"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    # if you want to remove the object, you need to fetch it first:"},{"line_number":77,"context_line":"    primary_keys \u003d {\u0027address\u0027: \u0027asd\u0027, \u0027subnet_id\u0027: \u0027xxx\u0027}"},{"line_number":78,"context_line":"    DNSNameServer.delete_objects(context, **primary_keys)"},{"line_number":79,"context_line":""}],"source_content_type":"text/x-rst","patch_set":21,"id":"ba2be162_44cf6d55","line":76,"updated":"2017-03-06 16:04:22.000000000","message":"But in this example it\u0027s not fetching it first. Outdated comment?","commit_id":"d507337adf7adfdde89465263927ff81dce5fadd"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"1efa224cf291e5a8b8b815461a0d1ffbf9683f0d","unresolved":false,"context_lines":[{"line_number":73,"context_line":"    dnses \u003d DNSNameServer.get_objects(context)"},{"line_number":74,"context_line":"    # will return list of all dns name servers from DB"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    # if you want to remove the object, you need to fetch it first:"},{"line_number":77,"context_line":"    primary_keys \u003d {\u0027address\u0027: \u0027asd\u0027, \u0027subnet_id\u0027: \u0027xxx\u0027}"},{"line_number":78,"context_line":"    DNSNameServer.delete_objects(context, **primary_keys)"},{"line_number":79,"context_line":""}],"source_content_type":"text/x-rst","patch_set":21,"id":"9a30ddce_6511a1ac","line":76,"in_reply_to":"ba2be162_44cf6d55","updated":"2017-03-07 16:37:40.000000000","message":"Done","commit_id":"d507337adf7adfdde89465263927ff81dce5fadd"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"04b49e6decc883be090bd8a0dc85fc7490a3744f","unresolved":false,"context_lines":[{"line_number":128,"context_line":"    dnses \u003d DNSNameServer.get_objects(context, _pager\u003dpager, subnet_id\u003d\u0027xxx\u0027)"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"    # register extra filter name"},{"line_number":131,"context_line":"    register_filter_hook_on_model(DNSNameServer, CHANGED_SINCE)"},{"line_number":132,"context_line":"    # You have to pass the database model, and it will register the filter name"},{"line_number":133,"context_line":"    # in OVO object class"},{"line_number":134,"context_line":""}],"source_content_type":"text/x-rst","patch_set":21,"id":"ba2be162_1a706c0a","line":131,"updated":"2017-03-06 16:04:22.000000000","message":"I don\u0027t understand this example (from my ignorant point of view)","commit_id":"d507337adf7adfdde89465263927ff81dce5fadd"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"b93aef2c6a6e7f6e816ec0a15973da6237e41abf","unresolved":false,"context_lines":[{"line_number":128,"context_line":"    dnses \u003d DNSNameServer.get_objects(context, _pager\u003dpager, subnet_id\u003d\u0027xxx\u0027)"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"    # register extra filter name"},{"line_number":131,"context_line":"    register_filter_hook_on_model(DNSNameServer, CHANGED_SINCE)"},{"line_number":132,"context_line":"    # You have to pass the database model, and it will register the filter name"},{"line_number":133,"context_line":"    # in OVO object class"},{"line_number":134,"context_line":""}],"source_content_type":"text/x-rst","patch_set":21,"id":"ba2be162_6851a3d8","line":131,"in_reply_to":"ba2be162_1a706c0a","updated":"2017-03-06 16:13:08.000000000","message":"Yes, we should kill it, it\u0027s not applicable for user usage section.","commit_id":"d507337adf7adfdde89465263927ff81dce5fadd"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"1efa224cf291e5a8b8b815461a0d1ffbf9683f0d","unresolved":false,"context_lines":[{"line_number":128,"context_line":"    dnses \u003d DNSNameServer.get_objects(context, _pager\u003dpager, subnet_id\u003d\u0027xxx\u0027)"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"    # register extra filter name"},{"line_number":131,"context_line":"    register_filter_hook_on_model(DNSNameServer, CHANGED_SINCE)"},{"line_number":132,"context_line":"    # You have to pass the database model, and it will register the filter name"},{"line_number":133,"context_line":"    # in OVO object class"},{"line_number":134,"context_line":""}],"source_content_type":"text/x-rst","patch_set":21,"id":"9a30ddce_e51d91be","line":131,"in_reply_to":"ba2be162_6851a3d8","updated":"2017-03-07 16:37:40.000000000","message":"Done","commit_id":"d507337adf7adfdde89465263927ff81dce5fadd"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"54f2debba5e61777d2d857e1f1858ae61c8ff225","unresolved":false,"context_lines":[{"line_number":233,"context_line":"        subnet_id \u003d sa.Column(sa.String(36), sa.ForeignKey(\u0027subnets.id\u0027))"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"    @obj_base.VersionedObjectRegistry.register"},{"line_number":236,"context_line":"    class DNSNameServerOVO(base.NeutronDbObject):"},{"line_number":237,"context_line":"        VERSION \u003d \u00271.0\u0027"},{"line_number":238,"context_line":"        db_model \u003d DNSNameServerSqlModel"},{"line_number":239,"context_line":""}],"source_content_type":"text/x-rst","patch_set":21,"id":"9a30ddce_e9f2d599","line":236,"range":{"start_line":236,"start_character":23,"end_line":236,"end_character":26},"updated":"2017-03-07 14:23:20.000000000","message":"We don\u0027t append OVO to our OVO classes, I know it\u0027s just an example, but precisely for that may be we should remove it.","commit_id":"d507337adf7adfdde89465263927ff81dce5fadd"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"54f2debba5e61777d2d857e1f1858ae61c8ff225","unresolved":false,"context_lines":[{"line_number":242,"context_line":"        # subnet_id fields. Override the default \u0027id\u0027 1-tuple."},{"line_number":243,"context_line":"        primary_keys \u003d [\u0027address\u0027, \u0027subnet_id\u0027]"},{"line_number":244,"context_line":""},{"line_number":245,"context_line":"        # Allow to link DNSNameServerOVO child objects into SubnetOVO parent"},{"line_number":246,"context_line":"        # object fields via subnet_id child database model attribute."},{"line_number":247,"context_line":"        # Used during loading synthetic fields in SubnetOVO get_objects."},{"line_number":248,"context_line":"        foreign_keys \u003d {\u0027SubnetOVO\u0027: {\u0027subnet_id\u0027: \u0027id\u0027}}"}],"source_content_type":"text/x-rst","patch_set":21,"id":"9a30ddce_491761a3","line":245,"range":{"start_line":245,"start_character":24,"end_line":245,"end_character":40},"updated":"2017-03-07 14:23:20.000000000","message":"ditto","commit_id":"d507337adf7adfdde89465263927ff81dce5fadd"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"54f2debba5e61777d2d857e1f1858ae61c8ff225","unresolved":false,"context_lines":[{"line_number":245,"context_line":"        # Allow to link DNSNameServerOVO child objects into SubnetOVO parent"},{"line_number":246,"context_line":"        # object fields via subnet_id child database model attribute."},{"line_number":247,"context_line":"        # Used during loading synthetic fields in SubnetOVO get_objects."},{"line_number":248,"context_line":"        foreign_keys \u003d {\u0027SubnetOVO\u0027: {\u0027subnet_id\u0027: \u0027id\u0027}}"},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"        fields \u003d {"},{"line_number":251,"context_line":"            \u0027address\u0027: obj_fields.StringField(),"}],"source_content_type":"text/x-rst","patch_set":21,"id":"9a30ddce_e949f5d1","line":248,"range":{"start_line":248,"start_character":25,"end_line":248,"end_character":34},"updated":"2017-03-07 14:23:20.000000000","message":"ditto","commit_id":"d507337adf7adfdde89465263927ff81dce5fadd"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"54f2debba5e61777d2d857e1f1858ae61c8ff225","unresolved":false,"context_lines":[{"line_number":253,"context_line":"        }"},{"line_number":254,"context_line":""},{"line_number":255,"context_line":"    @obj_base.VersionedObjectRegistry.register"},{"line_number":256,"context_line":"    class SubnetOVO(base.NeutronDbObject):"},{"line_number":257,"context_line":"        VERSION \u003d \u00271.0\u0027"},{"line_number":258,"context_line":"        db_base \u003d  SubnetSqlModel"},{"line_number":259,"context_line":""}],"source_content_type":"text/x-rst","patch_set":21,"id":"9a30ddce_091e49ba","line":256,"range":{"start_line":256,"start_character":10,"end_line":256,"end_character":19},"updated":"2017-03-07 14:23:20.000000000","message":"ditto","commit_id":"d507337adf7adfdde89465263927ff81dce5fadd"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"54f2debba5e61777d2d857e1f1858ae61c8ff225","unresolved":false,"context_lines":[{"line_number":278,"context_line":""},{"line_number":279,"context_line":""},{"line_number":280,"context_line":"    @obj_base.VersionedObjectRegistry.register"},{"line_number":281,"context_line":"    class IPAllocationPoolOVO(base.NeutronDbObject):"},{"line_number":282,"context_line":"        VERSION \u003d \u00271.0\u0027"},{"line_number":283,"context_line":"        db_base \u003d IPAllocationPoolSqlModel"},{"line_number":284,"context_line":""}],"source_content_type":"text/x-rst","patch_set":21,"id":"9a30ddce_097569f8","line":281,"range":{"start_line":281,"start_character":26,"end_line":281,"end_character":27},"updated":"2017-03-07 14:23:20.000000000","message":"ditto","commit_id":"d507337adf7adfdde89465263927ff81dce5fadd"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"3cd2fafcc67197d29cda4964319ab4decf5119f9","unresolved":false,"context_lines":[{"line_number":1,"context_line":"..."},{"line_number":2,"context_line":"      Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":3,"context_line":"      not use this file except in compliance with the License. You may obtain"},{"line_number":4,"context_line":"      a copy of the License at"}],"source_content_type":"text/x-rst","patch_set":22,"id":"9a30ddce_dbf22a9a","line":1,"range":{"start_line":1,"start_character":2,"end_line":1,"end_character":3},"updated":"2017-03-07 17:10:24.000000000","message":"remove? I think we need just two.","commit_id":"e504d15b13c8e429fcfa453957cbd11082f8ddb8"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"4cab2972ca5f462bfddbe391f384456ebda1f950","unresolved":false,"context_lines":[{"line_number":1,"context_line":"..."},{"line_number":2,"context_line":"      Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":3,"context_line":"      not use this file except in compliance with the License. You may obtain"},{"line_number":4,"context_line":"      a copy of the License at"}],"source_content_type":"text/x-rst","patch_set":22,"id":"9a30ddce_150d5c90","line":1,"range":{"start_line":1,"start_character":2,"end_line":1,"end_character":3},"in_reply_to":"9a30ddce_dbf22a9a","updated":"2017-03-08 01:14:22.000000000","message":":(\nThanks","commit_id":"e504d15b13c8e429fcfa453957cbd11082f8ddb8"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"ffb961a11eea88a8cde813555bc3de0635609c37","unresolved":false,"context_lines":[{"line_number":48,"context_line":""},{"line_number":49,"context_line":"CRUD operations"},{"line_number":50,"context_line":"~~~~~~~~~~~~~~~"},{"line_number":51,"context_line":"Objects support CRUD operations: :code:`create`, :code:`get_object` and"},{"line_number":52,"context_line":":code:`get_objects` (equivalent of :code:`read`), :code:`update`, :code:`delete`,"},{"line_number":53,"context_line":"and :code:`delete_objects`. The nature of OVO is, when any change is applied,"},{"line_number":54,"context_line":"OVO tracks it. After calling :code:`create` or :code:`update`, OVO"}],"source_content_type":"text/x-rst","patch_set":23,"id":"9a30ddce_849bd271","line":51,"range":{"start_line":51,"start_character":40,"end_line":51,"end_character":46},"updated":"2017-03-08 12:33:13.000000000","message":"Just an idea: We can differentiate callables from attributes/objects/classes by parenthesis suffix: create()","commit_id":"37f4bd7eb5c63781f85516bb346dbcfc5169b1b1"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"f03ef4c035ae4615fdcab2fb9d6cee43e368e64f","unresolved":false,"context_lines":[{"line_number":48,"context_line":""},{"line_number":49,"context_line":"CRUD operations"},{"line_number":50,"context_line":"~~~~~~~~~~~~~~~"},{"line_number":51,"context_line":"Objects support CRUD operations: :code:`create`, :code:`get_object` and"},{"line_number":52,"context_line":":code:`get_objects` (equivalent of :code:`read`), :code:`update`, :code:`delete`,"},{"line_number":53,"context_line":"and :code:`delete_objects`. The nature of OVO is, when any change is applied,"},{"line_number":54,"context_line":"OVO tracks it. After calling :code:`create` or :code:`update`, OVO"}],"source_content_type":"text/x-rst","patch_set":23,"id":"9a30ddce_6a9f8050","line":51,"range":{"start_line":51,"start_character":40,"end_line":51,"end_character":46},"in_reply_to":"9a30ddce_849bd271","updated":"2017-03-08 14:06:27.000000000","message":"I think I\u0027ve covered all cases.","commit_id":"37f4bd7eb5c63781f85516bb346dbcfc5169b1b1"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"ffb961a11eea88a8cde813555bc3de0635609c37","unresolved":false,"context_lines":[{"line_number":53,"context_line":"and :code:`delete_objects`. The nature of OVO is, when any change is applied,"},{"line_number":54,"context_line":"OVO tracks it. After calling :code:`create` or :code:`update`, OVO"},{"line_number":55,"context_line":"detects this and changed fields are saved in the database. When field (regular"},{"line_number":56,"context_line":"or synthetic one) is changed, but this doesn\u0027t need to be saved into database,"},{"line_number":57,"context_line":":code:`obj_reset_changes` can be called, to tell OVO library to ignore that."},{"line_number":58,"context_line":"Please take a look at simple object usage scenarios using example of"},{"line_number":59,"context_line":"DNSNameServer:"}],"source_content_type":"text/x-rst","patch_set":23,"id":"9a30ddce_045b622f","line":56,"range":{"start_line":56,"start_character":3,"end_line":56,"end_character":12},"updated":"2017-03-08 12:33:13.000000000","message":"This is the first time syntethic is mentioned, I think it would make sense to first describe (or link to lower definition) what that is or defer here from using the word at all: \"When field is changed\".\n\nOr maybe a short par that objects consist from fields - which are basically typed attributes, and synthetic fields - which are usually objects requiring special handling.","commit_id":"37f4bd7eb5c63781f85516bb346dbcfc5169b1b1"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"f03ef4c035ae4615fdcab2fb9d6cee43e368e64f","unresolved":false,"context_lines":[{"line_number":53,"context_line":"and :code:`delete_objects`. The nature of OVO is, when any change is applied,"},{"line_number":54,"context_line":"OVO tracks it. After calling :code:`create` or :code:`update`, OVO"},{"line_number":55,"context_line":"detects this and changed fields are saved in the database. When field (regular"},{"line_number":56,"context_line":"or synthetic one) is changed, but this doesn\u0027t need to be saved into database,"},{"line_number":57,"context_line":":code:`obj_reset_changes` can be called, to tell OVO library to ignore that."},{"line_number":58,"context_line":"Please take a look at simple object usage scenarios using example of"},{"line_number":59,"context_line":"DNSNameServer:"}],"source_content_type":"text/x-rst","patch_set":23,"id":"9a30ddce_ade35232","line":56,"range":{"start_line":56,"start_character":3,"end_line":56,"end_character":12},"in_reply_to":"9a30ddce_045b622f","updated":"2017-03-08 14:06:27.000000000","message":"Reorganized this piece of text. Moved info about obj_reset_changes to part about \"custom fields\"","commit_id":"37f4bd7eb5c63781f85516bb346dbcfc5169b1b1"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"53214fc2a4298164c9faea3d8cf7eaf385d8d71a","unresolved":false,"context_lines":[{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    # or you can create a dict and pass it as kwargs:"},{"line_number":68,"context_line":"    dns_data \u003d {\u0027address\u0027: \u0027asd\u0027, \u0027subnet_id\u0027: \u0027xxx\u0027, \u0027order\u0027: 1}"},{"line_number":69,"context_line":"    dns \u003d DNSNameServer(context, **dns_data)"},{"line_number":70,"context_line":"    dns.create()"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    # for fetching multiple objects:"},{"line_number":73,"context_line":"    dnses \u003d DNSNameServer.get_objects(context)"}],"source_content_type":"text/x-rst","patch_set":23,"id":"9a30ddce_71879f0f","line":70,"range":{"start_line":69,"start_character":3,"end_line":70,"end_character":16},"updated":"2017-03-07 17:48:51.000000000","message":"all these examples look good, what i was thinking is (though I may be wrong) having at least one example of each type one for update() and delete() as well, or may be in follow up patch","commit_id":"37f4bd7eb5c63781f85516bb346dbcfc5169b1b1"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"62327a387d1742ef8502e787f413e476200f216f","unresolved":false,"context_lines":[{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    # or you can create a dict and pass it as kwargs:"},{"line_number":68,"context_line":"    dns_data \u003d {\u0027address\u0027: \u0027asd\u0027, \u0027subnet_id\u0027: \u0027xxx\u0027, \u0027order\u0027: 1}"},{"line_number":69,"context_line":"    dns \u003d DNSNameServer(context, **dns_data)"},{"line_number":70,"context_line":"    dns.create()"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    # for fetching multiple objects:"},{"line_number":73,"context_line":"    dnses \u003d DNSNameServer.get_objects(context)"}],"source_content_type":"text/x-rst","patch_set":23,"id":"9a30ddce_aa127960","line":70,"range":{"start_line":69,"start_character":3,"end_line":70,"end_character":16},"in_reply_to":"9a30ddce_71879f0f","updated":"2017-03-07 20:33:27.000000000","message":"I tend to think we should leave enhancements to after it lands. We took enormous time to get where we are now.","commit_id":"37f4bd7eb5c63781f85516bb346dbcfc5169b1b1"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"f03ef4c035ae4615fdcab2fb9d6cee43e368e64f","unresolved":false,"context_lines":[{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    # or you can create a dict and pass it as kwargs:"},{"line_number":68,"context_line":"    dns_data \u003d {\u0027address\u0027: \u0027asd\u0027, \u0027subnet_id\u0027: \u0027xxx\u0027, \u0027order\u0027: 1}"},{"line_number":69,"context_line":"    dns \u003d DNSNameServer(context, **dns_data)"},{"line_number":70,"context_line":"    dns.create()"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    # for fetching multiple objects:"},{"line_number":73,"context_line":"    dnses \u003d DNSNameServer.get_objects(context)"}],"source_content_type":"text/x-rst","patch_set":23,"id":"9a30ddce_cd05e6c2","line":70,"range":{"start_line":69,"start_character":3,"end_line":70,"end_character":16},"in_reply_to":"9a30ddce_71879f0f","updated":"2017-03-08 14:06:27.000000000","message":"I\u0027m not following you. There are examples for creating, fetching and deleting.","commit_id":"37f4bd7eb5c63781f85516bb346dbcfc5169b1b1"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"dd87038ea89d2258d46d58912adeb54c1ffa8473","unresolved":false,"context_lines":[{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    # or you can create a dict and pass it as kwargs:"},{"line_number":68,"context_line":"    dns_data \u003d {\u0027address\u0027: \u0027asd\u0027, \u0027subnet_id\u0027: \u0027xxx\u0027, \u0027order\u0027: 1}"},{"line_number":69,"context_line":"    dns \u003d DNSNameServer(context, **dns_data)"},{"line_number":70,"context_line":"    dns.create()"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    # for fetching multiple objects:"},{"line_number":73,"context_line":"    dnses \u003d DNSNameServer.get_objects(context)"}],"source_content_type":"text/x-rst","patch_set":23,"id":"9a30ddce_efb0dadf","line":70,"range":{"start_line":69,"start_character":3,"end_line":70,"end_character":16},"in_reply_to":"9a30ddce_cd05e6c2","updated":"2017-03-08 16:43:40.000000000","message":"update, and delete case can also be covered in these, delete_objects is covered which is different from delete.","commit_id":"37f4bd7eb5c63781f85516bb346dbcfc5169b1b1"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"53214fc2a4298164c9faea3d8cf7eaf385d8d71a","unresolved":false,"context_lines":[{"line_number":74,"context_line":"    # will return list of all dns name servers from DB"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    # to remove object:"},{"line_number":77,"context_line":"    primary_keys \u003d {\u0027address\u0027: \u0027asd\u0027, \u0027subnet_id\u0027: \u0027xxx\u0027}"},{"line_number":78,"context_line":"    DNSNameServer.delete_objects(context, **primary_keys)"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":""}],"source_content_type":"text/x-rst","patch_set":23,"id":"9a30ddce_91d173fe","line":77,"range":{"start_line":77,"start_character":4,"end_line":77,"end_character":57},"updated":"2017-03-07 17:48:51.000000000","message":"would you mind renaming this dict ? delete_objects does not need primary keys it can be other attributes too.","commit_id":"37f4bd7eb5c63781f85516bb346dbcfc5169b1b1"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"62327a387d1742ef8502e787f413e476200f216f","unresolved":false,"context_lines":[{"line_number":74,"context_line":"    # will return list of all dns name servers from DB"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    # to remove object:"},{"line_number":77,"context_line":"    primary_keys \u003d {\u0027address\u0027: \u0027asd\u0027, \u0027subnet_id\u0027: \u0027xxx\u0027}"},{"line_number":78,"context_line":"    DNSNameServer.delete_objects(context, **primary_keys)"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":""}],"source_content_type":"text/x-rst","patch_set":23,"id":"9a30ddce_ea0c7144","line":77,"range":{"start_line":77,"start_character":4,"end_line":77,"end_character":57},"in_reply_to":"9a30ddce_91d173fe","updated":"2017-03-07 20:33:27.000000000","message":"but to remove the exact object, you need primary keys.","commit_id":"37f4bd7eb5c63781f85516bb346dbcfc5169b1b1"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"dd87038ea89d2258d46d58912adeb54c1ffa8473","unresolved":false,"context_lines":[{"line_number":74,"context_line":"    # will return list of all dns name servers from DB"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    # to remove object:"},{"line_number":77,"context_line":"    primary_keys \u003d {\u0027address\u0027: \u0027asd\u0027, \u0027subnet_id\u0027: \u0027xxx\u0027}"},{"line_number":78,"context_line":"    DNSNameServer.delete_objects(context, **primary_keys)"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":""}],"source_content_type":"text/x-rst","patch_set":23,"id":"9a30ddce_ef3b7ae9","line":77,"range":{"start_line":77,"start_character":4,"end_line":77,"end_character":57},"in_reply_to":"9a30ddce_ea0c7144","updated":"2017-03-08 16:43:40.000000000","message":"as I see delete_objects calls get_objects (which does not have any restriction or check if arguments are primary key) and then issue delete on the fetched objects.","commit_id":"37f4bd7eb5c63781f85516bb346dbcfc5169b1b1"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"ffb961a11eea88a8cde813555bc3de0635609c37","unresolved":false,"context_lines":[{"line_number":82,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":83,"context_line":"The :code:`NeutronDbObject` class has strict validation on which field sorting"},{"line_number":84,"context_line":"and filtering can happen. When calling :code:`get_objects`, :code:`count`,"},{"line_number":85,"context_line":":code: `delete_objects` and :code:`object_exist` methods,"},{"line_number":86,"context_line":":code:`validate_filters` is invoked, to see if it\u0027s a supported filter"},{"line_number":87,"context_line":"criterion (which is by default non-synthetic fields only). Additional filters"},{"line_number":88,"context_line":"can be defined using :code:`register_filter_hook_on_model`. This will add the"}],"source_content_type":"text/x-rst","patch_set":23,"id":"9a30ddce_c49eaab7","line":85,"range":{"start_line":85,"start_character":6,"end_line":85,"end_character":7},"updated":"2017-03-08 12:33:13.000000000","message":"Missing space","commit_id":"37f4bd7eb5c63781f85516bb346dbcfc5169b1b1"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"f03ef4c035ae4615fdcab2fb9d6cee43e368e64f","unresolved":false,"context_lines":[{"line_number":82,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":83,"context_line":"The :code:`NeutronDbObject` class has strict validation on which field sorting"},{"line_number":84,"context_line":"and filtering can happen. When calling :code:`get_objects`, :code:`count`,"},{"line_number":85,"context_line":":code: `delete_objects` and :code:`object_exist` methods,"},{"line_number":86,"context_line":":code:`validate_filters` is invoked, to see if it\u0027s a supported filter"},{"line_number":87,"context_line":"criterion (which is by default non-synthetic fields only). Additional filters"},{"line_number":88,"context_line":"can be defined using :code:`register_filter_hook_on_model`. This will add the"}],"source_content_type":"text/x-rst","patch_set":23,"id":"9a30ddce_d60f38df","line":85,"range":{"start_line":85,"start_character":6,"end_line":85,"end_character":7},"in_reply_to":"9a30ddce_c49eaab7","updated":"2017-03-08 14:06:27.000000000","message":"Removed this extra space :)","commit_id":"37f4bd7eb5c63781f85516bb346dbcfc5169b1b1"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"53214fc2a4298164c9faea3d8cf7eaf385d8d71a","unresolved":false,"context_lines":[{"line_number":108,"context_line":""},{"line_number":109,"context_line":".. code-block:: Python"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"    # filtering"},{"line_number":112,"context_line":"    dnses \u003d DNSNameServer.get_objects(context, subnet_id\u003d\u0027xxx\u0027)"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"    filters \u003d {\u0027subnet_id\u0027: [\u0027xxx\u0027, \u0027yyy\u0027]}"},{"line_number":115,"context_line":"    dnses \u003d DNSNameServer.get_objects(context, **filters)"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    # do not validate filters"},{"line_number":118,"context_line":"    dnses \u003d DNSNameServer.get_objects(context, validate_filters\u003dFalse,"},{"line_number":119,"context_line":"                                      fake_filter\u003d\u0027xxx\u0027)"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    # count the dns servers for given subnet"},{"line_number":122,"context_line":"    dns_count \u003d DNSNameServer.count(context, subnet_id\u003d\u0027xxx\u0027)"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"    # sorting"},{"line_number":125,"context_line":"    # direction True \u003d\u003d ASC, False \u003d\u003d DESC"},{"line_number":126,"context_line":"    direction \u003d False"},{"line_number":127,"context_line":"    pager \u003d Pager(sorts\u003d[(\u0027order\u0027, direction)])"},{"line_number":128,"context_line":"    dnses \u003d DNSNameServer.get_objects(context, _pager\u003dpager, subnet_id\u003d\u0027xxx\u0027)"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"Defining your own object"}],"source_content_type":"text/x-rst","patch_set":23,"id":"9a30ddce_f14b8fae","line":128,"range":{"start_line":111,"start_character":4,"end_line":128,"end_character":77},"updated":"2017-03-07 17:48:51.000000000","message":"not sure if we should do that here or not, may be having an example from get_object as well and a note to mention the difference, get_object call will complain if the arguments are not primary key etc.","commit_id":"37f4bd7eb5c63781f85516bb346dbcfc5169b1b1"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"dd87038ea89d2258d46d58912adeb54c1ffa8473","unresolved":false,"context_lines":[{"line_number":108,"context_line":""},{"line_number":109,"context_line":".. code-block:: Python"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"    # filtering"},{"line_number":112,"context_line":"    dnses \u003d DNSNameServer.get_objects(context, subnet_id\u003d\u0027xxx\u0027)"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"    filters \u003d {\u0027subnet_id\u0027: [\u0027xxx\u0027, \u0027yyy\u0027]}"},{"line_number":115,"context_line":"    dnses \u003d DNSNameServer.get_objects(context, **filters)"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    # do not validate filters"},{"line_number":118,"context_line":"    dnses \u003d DNSNameServer.get_objects(context, validate_filters\u003dFalse,"},{"line_number":119,"context_line":"                                      fake_filter\u003d\u0027xxx\u0027)"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    # count the dns servers for given subnet"},{"line_number":122,"context_line":"    dns_count \u003d DNSNameServer.count(context, subnet_id\u003d\u0027xxx\u0027)"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"    # sorting"},{"line_number":125,"context_line":"    # direction True \u003d\u003d ASC, False \u003d\u003d DESC"},{"line_number":126,"context_line":"    direction \u003d False"},{"line_number":127,"context_line":"    pager \u003d Pager(sorts\u003d[(\u0027order\u0027, direction)])"},{"line_number":128,"context_line":"    dnses \u003d DNSNameServer.get_objects(context, _pager\u003dpager, subnet_id\u003d\u0027xxx\u0027)"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"Defining your own object"}],"source_content_type":"text/x-rst","patch_set":23,"id":"9a30ddce_cfe076cf","line":128,"range":{"start_line":111,"start_character":4,"end_line":128,"end_character":77},"in_reply_to":"9a30ddce_adffd2a8","updated":"2017-03-08 16:43:40.000000000","message":"i agree, but docs should try to cover atmost.","commit_id":"37f4bd7eb5c63781f85516bb346dbcfc5169b1b1"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"f03ef4c035ae4615fdcab2fb9d6cee43e368e64f","unresolved":false,"context_lines":[{"line_number":108,"context_line":""},{"line_number":109,"context_line":".. code-block:: Python"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"    # filtering"},{"line_number":112,"context_line":"    dnses \u003d DNSNameServer.get_objects(context, subnet_id\u003d\u0027xxx\u0027)"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"    filters \u003d {\u0027subnet_id\u0027: [\u0027xxx\u0027, \u0027yyy\u0027]}"},{"line_number":115,"context_line":"    dnses \u003d DNSNameServer.get_objects(context, **filters)"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    # do not validate filters"},{"line_number":118,"context_line":"    dnses \u003d DNSNameServer.get_objects(context, validate_filters\u003dFalse,"},{"line_number":119,"context_line":"                                      fake_filter\u003d\u0027xxx\u0027)"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    # count the dns servers for given subnet"},{"line_number":122,"context_line":"    dns_count \u003d DNSNameServer.count(context, subnet_id\u003d\u0027xxx\u0027)"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"    # sorting"},{"line_number":125,"context_line":"    # direction True \u003d\u003d ASC, False \u003d\u003d DESC"},{"line_number":126,"context_line":"    direction \u003d False"},{"line_number":127,"context_line":"    pager \u003d Pager(sorts\u003d[(\u0027order\u0027, direction)])"},{"line_number":128,"context_line":"    dnses \u003d DNSNameServer.get_objects(context, _pager\u003dpager, subnet_id\u003d\u0027xxx\u0027)"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"Defining your own object"}],"source_content_type":"text/x-rst","patch_set":23,"id":"9a30ddce_adffd2a8","line":128,"range":{"start_line":111,"start_character":4,"end_line":128,"end_character":77},"in_reply_to":"9a30ddce_f14b8fae","updated":"2017-03-08 14:06:27.000000000","message":"I believe, it can be done, although not everything can be described in docs.","commit_id":"37f4bd7eb5c63781f85516bb346dbcfc5169b1b1"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"ffb961a11eea88a8cde813555bc3de0635609c37","unresolved":false,"context_lines":[{"line_number":137,"context_line":"#. Add/reuse data model"},{"line_number":138,"context_line":"#. Define fields"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"It is mandatory to define data model using :code:`db_model` property from"},{"line_number":141,"context_line":":code:`NeutronDbObject`."},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"Fields should be defined using :code:`oslo_versionobjects.fields` exposed"}],"source_content_type":"text/x-rst","patch_set":23,"id":"9a30ddce_0a160955","line":140,"range":{"start_line":140,"start_character":60,"end_line":140,"end_character":68},"updated":"2017-03-08 12:33:13.000000000","message":"Technically it\u0027s an attribute","commit_id":"37f4bd7eb5c63781f85516bb346dbcfc5169b1b1"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"f03ef4c035ae4615fdcab2fb9d6cee43e368e64f","unresolved":false,"context_lines":[{"line_number":137,"context_line":"#. Add/reuse data model"},{"line_number":138,"context_line":"#. Define fields"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"It is mandatory to define data model using :code:`db_model` property from"},{"line_number":141,"context_line":":code:`NeutronDbObject`."},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"Fields should be defined using :code:`oslo_versionobjects.fields` exposed"}],"source_content_type":"text/x-rst","patch_set":23,"id":"9a30ddce_5656e8d2","line":140,"range":{"start_line":140,"start_character":60,"end_line":140,"end_character":68},"in_reply_to":"9a30ddce_0a160955","updated":"2017-03-08 14:06:27.000000000","message":"Done","commit_id":"37f4bd7eb5c63781f85516bb346dbcfc5169b1b1"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"ffb961a11eea88a8cde813555bc3de0635609c37","unresolved":false,"context_lines":[{"line_number":250,"context_line":"    @obj_base.VersionedObjectRegistry.register"},{"line_number":251,"context_line":"    class SubnetOVO(base.NeutronDbObject):"},{"line_number":252,"context_line":"        VERSION \u003d \u00271.0\u0027"},{"line_number":253,"context_line":"        db_base \u003d  SubnetSqlModel"},{"line_number":254,"context_line":""},{"line_number":255,"context_line":"        fields \u003d {"},{"line_number":256,"context_line":"            \u0027id\u0027: common_types.UUIDField(),  # HasId from model class"}],"source_content_type":"text/x-rst","patch_set":23,"id":"9a30ddce_10f9d880","line":253,"range":{"start_line":253,"start_character":8,"end_line":253,"end_character":15},"updated":"2017-03-08 12:33:13.000000000","message":"db_model","commit_id":"37f4bd7eb5c63781f85516bb346dbcfc5169b1b1"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"f03ef4c035ae4615fdcab2fb9d6cee43e368e64f","unresolved":false,"context_lines":[{"line_number":250,"context_line":"    @obj_base.VersionedObjectRegistry.register"},{"line_number":251,"context_line":"    class SubnetOVO(base.NeutronDbObject):"},{"line_number":252,"context_line":"        VERSION \u003d \u00271.0\u0027"},{"line_number":253,"context_line":"        db_base \u003d  SubnetSqlModel"},{"line_number":254,"context_line":""},{"line_number":255,"context_line":"        fields \u003d {"},{"line_number":256,"context_line":"            \u0027id\u0027: common_types.UUIDField(),  # HasId from model class"}],"source_content_type":"text/x-rst","patch_set":23,"id":"9a30ddce_965ea0e7","line":253,"range":{"start_line":253,"start_character":8,"end_line":253,"end_character":15},"in_reply_to":"9a30ddce_10f9d880","updated":"2017-03-08 14:06:27.000000000","message":"Thanks, good catch.","commit_id":"37f4bd7eb5c63781f85516bb346dbcfc5169b1b1"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"ffb961a11eea88a8cde813555bc3de0635609c37","unresolved":false,"context_lines":[{"line_number":275,"context_line":"    @obj_base.VersionedObjectRegistry.register"},{"line_number":276,"context_line":"    class IPAllocationPoolOVO(base.NeutronDbObject):"},{"line_number":277,"context_line":"        VERSION \u003d \u00271.0\u0027"},{"line_number":278,"context_line":"        db_base \u003d IPAllocationPoolSqlModel"},{"line_number":279,"context_line":""},{"line_number":280,"context_line":"        fields \u003d {"},{"line_number":281,"context_line":"            \u0027subnet_id\u0027: common_types.UUIDField()"}],"source_content_type":"text/x-rst","patch_set":23,"id":"9a30ddce_70ee94b5","line":278,"range":{"start_line":278,"start_character":8,"end_line":278,"end_character":15},"updated":"2017-03-08 12:33:13.000000000","message":"db_model","commit_id":"37f4bd7eb5c63781f85516bb346dbcfc5169b1b1"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"f03ef4c035ae4615fdcab2fb9d6cee43e368e64f","unresolved":false,"context_lines":[{"line_number":275,"context_line":"    @obj_base.VersionedObjectRegistry.register"},{"line_number":276,"context_line":"    class IPAllocationPoolOVO(base.NeutronDbObject):"},{"line_number":277,"context_line":"        VERSION \u003d \u00271.0\u0027"},{"line_number":278,"context_line":"        db_base \u003d IPAllocationPoolSqlModel"},{"line_number":279,"context_line":""},{"line_number":280,"context_line":"        fields \u003d {"},{"line_number":281,"context_line":"            \u0027subnet_id\u0027: common_types.UUIDField()"}],"source_content_type":"text/x-rst","patch_set":23,"id":"9a30ddce_b661e4aa","line":278,"range":{"start_line":278,"start_character":8,"end_line":278,"end_character":15},"in_reply_to":"9a30ddce_70ee94b5","updated":"2017-03-08 14:06:27.000000000","message":"Done","commit_id":"37f4bd7eb5c63781f85516bb346dbcfc5169b1b1"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"86a92cd1ac5645af554bed038e680013e5a4ccf8","unresolved":false,"context_lines":[{"line_number":80,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":81,"context_line":"The :code:`NeutronDbObject` class has strict validation on which field sorting"},{"line_number":82,"context_line":"and filtering can happen. When calling :code:`get_objects()`, :code:`count()`"},{"line_number":83,"context_line":"and :code:`delete_objects()`, :code:`validate_filters()` is invoked, to see if"},{"line_number":84,"context_line":"it\u0027s a supported filter criterion (which is by default non-synthetic fields"},{"line_number":85,"context_line":"only). Additional filters can be defined using"},{"line_number":86,"context_line":":code:`register_filter_hook_on_model()`. This will add the requested string to"}],"source_content_type":"text/x-rst","patch_set":24,"id":"9a30ddce_0058a531","line":83,"updated":"2017-03-08 14:56:08.000000000","message":"Why did you remove the objects_exist() ? It also calls to  validate_filters()","commit_id":"80e8ebfd8046d58648b1e66273ee9ba3d50cc071"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"903a212313590e5f220507b01f839a072c9bad6d","unresolved":false,"context_lines":[{"line_number":80,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":81,"context_line":"The :code:`NeutronDbObject` class has strict validation on which field sorting"},{"line_number":82,"context_line":"and filtering can happen. When calling :code:`get_objects()`, :code:`count()`"},{"line_number":83,"context_line":"and :code:`delete_objects()`, :code:`validate_filters()` is invoked, to see if"},{"line_number":84,"context_line":"it\u0027s a supported filter criterion (which is by default non-synthetic fields"},{"line_number":85,"context_line":"only). Additional filters can be defined using"},{"line_number":86,"context_line":":code:`register_filter_hook_on_model()`. This will add the requested string to"}],"source_content_type":"text/x-rst","patch_set":24,"id":"9a30ddce_9ee31233","line":83,"in_reply_to":"9a30ddce_0058a531","updated":"2017-03-08 15:25:00.000000000","message":"Done","commit_id":"80e8ebfd8046d58648b1e66273ee9ba3d50cc071"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"a025ecf4a1e87c5e12ebe2161cc3c069d36987ac","unresolved":false,"context_lines":[{"line_number":190,"context_line":"Sometimes it\u0027s useful to expose attributes that are not defined in the model"},{"line_number":191,"context_line":"table itself, like relationships and such. In this case,"},{"line_number":192,"context_line":":code:`synthetic_fields` may become handy. This object property can define a"},{"line_number":193,"context_line":"list of object fields that don\u0027t belong to the object database model and that"},{"line_number":194,"context_line":"are hence instead to be implemented in some custom way. Some of those fields"},{"line_number":195,"context_line":"map to :code:`orm.relationships` defined on models, while others are completely"},{"line_number":196,"context_line":"untangled from the database layer."}],"source_content_type":"text/x-rst","patch_set":25,"id":"9a30ddce_abded53c","line":193,"range":{"start_line":193,"start_character":47,"end_line":193,"end_character":53},"updated":"2017-03-08 17:18:58.000000000","message":"nit object\u0027s","commit_id":"b80d630cdbc4283018a71aa3a706cdc76b7a40ad"}]}
