)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":8731,"name":"Renat Akhmerov","email":"renat.akhmerov@gmail.com","username":"rakhmerov"},"change_message_id":"87042af0ac0505efc33324c3e2b5faeb51cc5b33","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     ali \u003cali.abdelal@nokia.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2019-09-25 11:35:46 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"It\u0027s impossible to set \"equal to None\" filter when calling REST API:-"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"added a list to get_all executions API which includes columns that"},{"line_number":10,"context_line":" are required to be null in the query."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"3fa7e38b_76ed2e8a","line":7,"range":{"start_line":7,"start_character":67,"end_line":7,"end_character":69},"updated":"2019-10-02 08:25:51.000000000","message":"What is \":-\"?\n\nAlso, it\u0027s usually better to say what the patch does in the title rather than repeating the title of the bug.","commit_id":"7bfd7e047756ff6dbf43d1cc441a1758d884509f"},{"author":{"_account_id":8731,"name":"Renat Akhmerov","email":"renat.akhmerov@gmail.com","username":"rakhmerov"},"change_message_id":"87042af0ac0505efc33324c3e2b5faeb51cc5b33","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"added a list to get_all executions API which includes columns that"},{"line_number":10,"context_line":" are required to be null in the query."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Change-Id: I78fbf993519beb63ee9aef7058bdcb40f0a12ec3"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"3fa7e38b_96930a01","line":11,"updated":"2019-10-02 08:25:51.000000000","message":"Please also add:\n\nCloses-Bug: #\u003cbug number from LP\u003e","commit_id":"7bfd7e047756ff6dbf43d1cc441a1758d884509f"},{"author":{"_account_id":8731,"name":"Renat Akhmerov","email":"renat.akhmerov@gmail.com","username":"rakhmerov"},"change_message_id":"3b8c1900316060623fea35c2e41b05b492b30746","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     ali \u003cali.abdelal@nokia.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2019-10-06 12:25:22 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"It\u0027s impossible to set \"equal to None\" filter"},{"line_number":8,"context_line":"when calling REST API"},{"line_number":9,"context_line":""},{"line_number":10,"context_line":"added a list to get_all executions API which includes columns that"},{"line_number":11,"context_line":" are required to be null in the query."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"3fa7e38b_813946a4","line":8,"range":{"start_line":7,"start_character":0,"end_line":8,"end_character":21},"updated":"2019-10-07 05:14:11.000000000","message":"A title must fit into one line. Again, don\u0027t repeat the name of the ticket in a title of the commit message. Rather state what this patch changes. I\u0027d use a title like this:\n\n\"Make it possible to set None to REST API filters\"","commit_id":"89338d275fe4d9a89e0c946cb25485209c763a6a"},{"author":{"_account_id":21970,"name":"Andras Kovi","email":"akovi@nokia.com","username":"andras.kovi"},"change_message_id":"4d6142709f9a7a567246ab8eca6881267e275690","unresolved":false,"context_lines":[{"line_number":12,"context_line":"  code) in the query string. Thereby we\u0027re getting the ability to"},{"line_number":13,"context_line":"  filter API entities (currently only workflow executions) fetched"},{"line_number":14,"context_line":"  with the get_all() by some fields that are assigned to the None"},{"line_number":15,"context_line":"  (null from the API perspective) value, i.e. typically it means"},{"line_number":16,"context_line":"  that a value of a field is not defined."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Closes-Bug: #1702421"},{"line_number":19,"context_line":"Change-Id: I78fbf993519beb63ee9aef7058bdcb40f0a12ec3"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":14,"id":"3fa7e38b_b2e5630c","line":16,"range":{"start_line":15,"start_character":39,"end_line":16,"end_character":41},"updated":"2019-11-19 07:23:13.000000000","message":"being null typically means that the field\u0027s value is null. You needn\u0027t have to explain this. :)","commit_id":"c49212e17168f5ebb0833d220bea1dddc5bc88a5"}],"mistral/api/controllers/v2/execution.py":[{"author":{"_account_id":8731,"name":"Renat Akhmerov","email":"renat.akhmerov@gmail.com","username":"rakhmerov"},"change_message_id":"87042af0ac0505efc33324c3e2b5faeb51cc5b33","unresolved":false,"context_lines":[{"line_number":357,"context_line":"                all_projects\u003dFalse, nulls\u003d\u0027\u0027):"},{"line_number":358,"context_line":""},{"line_number":359,"context_line":"        def get_nullable_columns():"},{"line_number":360,"context_line":"            nullables \u003d []"},{"line_number":361,"context_line":"            for column in db_models.WorkflowExecution.__table__.columns:"},{"line_number":362,"context_line":"                if column.nullable:"},{"line_number":363,"context_line":"                    nullables.append(column.name)"},{"line_number":364,"context_line":"            return nullables"},{"line_number":365,"context_line":""},{"line_number":366,"context_line":"        def check_null_variables(nullable_columns, nulls):"},{"line_number":367,"context_line":"            for column in nulls:"}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_16871ab9","line":364,"range":{"start_line":360,"start_character":12,"end_line":364,"end_character":28},"updated":"2019-10-02 08:25:51.000000000","message":"This logic is too low level and DB specific and shouldn\u0027t be in the REST layer. I\u0027d move it either to the DB model class (MistralBase) or to some DB module. But on this level we should not know anything about the structure of the DB tables.","commit_id":"7bfd7e047756ff6dbf43d1cc441a1758d884509f"},{"author":{"_account_id":8731,"name":"Renat Akhmerov","email":"renat.akhmerov@gmail.com","username":"rakhmerov"},"change_message_id":"87042af0ac0505efc33324c3e2b5faeb51cc5b33","unresolved":false,"context_lines":[{"line_number":366,"context_line":"        def check_null_variables(nullable_columns, nulls):"},{"line_number":367,"context_line":"            for column in nulls:"},{"line_number":368,"context_line":"                if column not in nullable_columns:"},{"line_number":369,"context_line":"                    # TODO(Ali) throw an exception"},{"line_number":370,"context_line":"                    print(\"Exception\")"},{"line_number":371,"context_line":""},{"line_number":372,"context_line":"        nullables \u003d get_nullable_columns()"},{"line_number":373,"context_line":"        \"\"\"Return all Executions."}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_16b07a8b","line":370,"range":{"start_line":369,"start_character":19,"end_line":370,"end_character":38},"updated":"2019-10-02 08:25:51.000000000","message":"I think you can simply do:\n\nraise ValueError(\"...\")\n\nBut please provide a detailed description of what was wrong with the user input.","commit_id":"7bfd7e047756ff6dbf43d1cc441a1758d884509f"},{"author":{"_account_id":8731,"name":"Renat Akhmerov","email":"renat.akhmerov@gmail.com","username":"rakhmerov"},"change_message_id":"87042af0ac0505efc33324c3e2b5faeb51cc5b33","unresolved":false,"context_lines":[{"line_number":355,"context_line":"                state_info\u003dNone, input\u003dNone, output\u003dNone, created_at\u003dNone,"},{"line_number":356,"context_line":"                updated_at\u003dNone, include_output\u003dNone, project_id\u003dNone,"},{"line_number":357,"context_line":"                all_projects\u003dFalse, nulls\u003d\u0027\u0027):"},{"line_number":358,"context_line":""},{"line_number":359,"context_line":"        def get_nullable_columns():"},{"line_number":360,"context_line":"            nullables \u003d []"},{"line_number":361,"context_line":"            for column in db_models.WorkflowExecution.__table__.columns:"},{"line_number":362,"context_line":"                if column.nullable:"},{"line_number":363,"context_line":"                    nullables.append(column.name)"},{"line_number":364,"context_line":"            return nullables"},{"line_number":365,"context_line":""},{"line_number":366,"context_line":"        def check_null_variables(nullable_columns, nulls):"},{"line_number":367,"context_line":"            for column in nulls:"},{"line_number":368,"context_line":"                if column not in nullable_columns:"},{"line_number":369,"context_line":"                    # TODO(Ali) throw an exception"},{"line_number":370,"context_line":"                    print(\"Exception\")"},{"line_number":371,"context_line":""},{"line_number":372,"context_line":"        nullables \u003d get_nullable_columns()"},{"line_number":373,"context_line":"        \"\"\"Return all Executions."},{"line_number":374,"context_line":""},{"line_number":375,"context_line":"        :param marker: Optional. Pagination marker for large data sets."}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_76a20e4e","line":372,"range":{"start_line":358,"start_character":0,"end_line":372,"end_character":42},"updated":"2019-10-02 08:25:51.000000000","message":"Why did you put these functions right before the docstring?","commit_id":"7bfd7e047756ff6dbf43d1cc441a1758d884509f"},{"author":{"_account_id":30755,"name":"ali","email":"ali.abdelal@nokia.com","username":"abdelal"},"change_message_id":"c42a22d0997013470c346c6628c988b94dc1a494","unresolved":false,"context_lines":[{"line_number":355,"context_line":"                state_info\u003dNone, input\u003dNone, output\u003dNone, created_at\u003dNone,"},{"line_number":356,"context_line":"                updated_at\u003dNone, include_output\u003dNone, project_id\u003dNone,"},{"line_number":357,"context_line":"                all_projects\u003dFalse, nulls\u003d\u0027\u0027):"},{"line_number":358,"context_line":""},{"line_number":359,"context_line":"        def get_nullable_columns():"},{"line_number":360,"context_line":"            nullables \u003d []"},{"line_number":361,"context_line":"            for column in db_models.WorkflowExecution.__table__.columns:"},{"line_number":362,"context_line":"                if column.nullable:"},{"line_number":363,"context_line":"                    nullables.append(column.name)"},{"line_number":364,"context_line":"            return nullables"},{"line_number":365,"context_line":""},{"line_number":366,"context_line":"        def check_null_variables(nullable_columns, nulls):"},{"line_number":367,"context_line":"            for column in nulls:"},{"line_number":368,"context_line":"                if column not in nullable_columns:"},{"line_number":369,"context_line":"                    # TODO(Ali) throw an exception"},{"line_number":370,"context_line":"                    print(\"Exception\")"},{"line_number":371,"context_line":""},{"line_number":372,"context_line":"        nullables \u003d get_nullable_columns()"},{"line_number":373,"context_line":"        \"\"\"Return all Executions."},{"line_number":374,"context_line":""},{"line_number":375,"context_line":"        :param marker: Optional. Pagination marker for large data sets."}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_79ed218a","line":372,"range":{"start_line":358,"start_character":0,"end_line":372,"end_character":42},"in_reply_to":"3fa7e38b_76a20e4e","updated":"2019-10-02 10:19:00.000000000","message":"this code is temporarily here, it will be moved before the code is merged.","commit_id":"7bfd7e047756ff6dbf43d1cc441a1758d884509f"},{"author":{"_account_id":8731,"name":"Renat Akhmerov","email":"renat.akhmerov@gmail.com","username":"rakhmerov"},"change_message_id":"87042af0ac0505efc33324c3e2b5faeb51cc5b33","unresolved":false,"context_lines":[{"line_number":412,"context_line":"            Admin required."},{"line_number":413,"context_line":"        :param all_projects: Optional. Get resources of all projects. Admin"},{"line_number":414,"context_line":"            required."},{"line_number":415,"context_line":"            :param nulls: Optional.the names of the columns with null value in"},{"line_number":416,"context_line":"                        the query."},{"line_number":417,"context_line":"        \"\"\""},{"line_number":418,"context_line":"        acl.enforce(\u0027executions:list\u0027, context.ctx())"}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_f68d9ed3","line":415,"range":{"start_line":415,"start_character":35,"end_line":415,"end_character":36},"updated":"2019-10-02 08:25:51.000000000","message":"-\u003e \" T\" (A white space + capital T)","commit_id":"7bfd7e047756ff6dbf43d1cc441a1758d884509f"},{"author":{"_account_id":19134,"name":"Eyal","email":"eyalb1@gmail.com","username":"eyalb"},"change_message_id":"dd16ae1e97a1f2cf217ff67e7ee68666fe0195fc","unresolved":false,"context_lines":[{"line_number":401,"context_line":"        :param nulls: Optional. The names of the columns with null value in"},{"line_number":402,"context_line":"                        the query."},{"line_number":403,"context_line":"        \"\"\""},{"line_number":404,"context_line":"        db_models.WorkflowExecution.validate_nones(nulls)"},{"line_number":405,"context_line":"        acl.enforce(\u0027executions:list\u0027, context.ctx())"},{"line_number":406,"context_line":""},{"line_number":407,"context_line":"        if all_projects or project_id:"}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa7e38b_a2202eb2","line":404,"range":{"start_line":404,"start_character":8,"end_line":404,"end_character":57},"updated":"2019-10-03 10:02:31.000000000","message":"This should be below the enforce","commit_id":"3c23f5509fe15629d4443ed9880167beb8857ced"}],"mistral/db/v2/sqlalchemy/models.py":[{"author":{"_account_id":8731,"name":"Renat Akhmerov","email":"renat.akhmerov@gmail.com","username":"rakhmerov"},"change_message_id":"3b8c1900316060623fea35c2e41b05b492b30746","unresolved":false,"context_lines":[{"line_number":239,"context_line":"    context \u003d sa.orm.deferred(sa.Column(st.JsonLongDictType()))"},{"line_number":240,"context_line":""},{"line_number":241,"context_line":"    @classmethod"},{"line_number":242,"context_line":"    def _get_nullable_columns(cls):"},{"line_number":243,"context_line":"        nullable_columns \u003d []"},{"line_number":244,"context_line":"        for column in cls.__table__.columns:"},{"line_number":245,"context_line":"            if column.nullable:"}],"source_content_type":"text/x-python","patch_set":10,"id":"3fa7e38b_a16c829c","line":242,"range":{"start_line":242,"start_character":9,"end_line":242,"end_character":29},"updated":"2019-10-07 05:14:11.000000000","message":"_get_nullable_column_names would be a bit more correct.","commit_id":"89338d275fe4d9a89e0c946cb25485209c763a6a"},{"author":{"_account_id":8731,"name":"Renat Akhmerov","email":"renat.akhmerov@gmail.com","username":"rakhmerov"},"change_message_id":"3b8c1900316060623fea35c2e41b05b492b30746","unresolved":false,"context_lines":[{"line_number":240,"context_line":""},{"line_number":241,"context_line":"    @classmethod"},{"line_number":242,"context_line":"    def _get_nullable_columns(cls):"},{"line_number":243,"context_line":"        nullable_columns \u003d []"},{"line_number":244,"context_line":"        for column in cls.__table__.columns:"},{"line_number":245,"context_line":"            if column.nullable:"},{"line_number":246,"context_line":"                nullable_columns.append(column.name)"},{"line_number":247,"context_line":"        return nullable_columns"},{"line_number":248,"context_line":""},{"line_number":249,"context_line":"    @classmethod"},{"line_number":250,"context_line":"    def validate_nones(cls, nulls):"}],"source_content_type":"text/x-python","patch_set":10,"id":"3fa7e38b_016eb695","line":247,"range":{"start_line":243,"start_character":8,"end_line":247,"end_character":31},"updated":"2019-10-07 05:14:11.000000000","message":"return [c.name for c in cls.__table__.columns if c.nullable]","commit_id":"89338d275fe4d9a89e0c946cb25485209c763a6a"},{"author":{"_account_id":8731,"name":"Renat Akhmerov","email":"renat.akhmerov@gmail.com","username":"rakhmerov"},"change_message_id":"3b8c1900316060623fea35c2e41b05b492b30746","unresolved":false,"context_lines":[{"line_number":247,"context_line":"        return nullable_columns"},{"line_number":248,"context_line":""},{"line_number":249,"context_line":"    @classmethod"},{"line_number":250,"context_line":"    def validate_nones(cls, nulls):"},{"line_number":251,"context_line":"        nullable_columns \u003d cls._get_nullable_columns()"},{"line_number":252,"context_line":"        columns \u003d cls.__table__.columns.keys()"},{"line_number":253,"context_line":"        for column in nulls:"}],"source_content_type":"text/x-python","patch_set":10,"id":"3fa7e38b_21409207","line":250,"range":{"start_line":250,"start_character":28,"end_line":250,"end_character":33},"updated":"2019-10-07 05:14:11.000000000","message":"It looks weird that we use \"nones\" and \"nulls\" at different places. Please make it consistent. Now I think that \"nulls\" is probably OK everywhere because \"column.nullable\" is something that we don\u0027t choose. This is part of SQLAlchemy.","commit_id":"89338d275fe4d9a89e0c946cb25485209c763a6a"},{"author":{"_account_id":8731,"name":"Renat Akhmerov","email":"renat.akhmerov@gmail.com","username":"rakhmerov"},"change_message_id":"3b8c1900316060623fea35c2e41b05b492b30746","unresolved":false,"context_lines":[{"line_number":247,"context_line":"        return nullable_columns"},{"line_number":248,"context_line":""},{"line_number":249,"context_line":"    @classmethod"},{"line_number":250,"context_line":"    def validate_nones(cls, nulls):"},{"line_number":251,"context_line":"        nullable_columns \u003d cls._get_nullable_columns()"},{"line_number":252,"context_line":"        columns \u003d cls.__table__.columns.keys()"},{"line_number":253,"context_line":"        for column in nulls:"}],"source_content_type":"text/x-python","patch_set":10,"id":"3fa7e38b_210e52e5","line":250,"range":{"start_line":250,"start_character":28,"end_line":250,"end_character":33},"updated":"2019-10-07 05:14:11.000000000","message":"The parameter \"nulls\" looks a bit weird here. In the previous version it was kind of OK because the method was in the upper layer where we had more context (i.e. \"nulls\" REST endpoint parameter). But here when you look at it it\u0027s hard to guess what it is. A list of None values?\n\nMy suggestion is \"null_columns\" or \"empty_columns\".\n\nWhat\u0027s more, the name of the method \"validate_nones\" also looks weird now because it\u0027s in a different context. I\u0027d suggest we use the following method signature:\n\ndef check_allowed_none_values(column_names):\n    ...","commit_id":"89338d275fe4d9a89e0c946cb25485209c763a6a"},{"author":{"_account_id":8731,"name":"Renat Akhmerov","email":"renat.akhmerov@gmail.com","username":"rakhmerov"},"change_message_id":"3b8c1900316060623fea35c2e41b05b492b30746","unresolved":false,"context_lines":[{"line_number":238,"context_line":"    #   * This structure does not contain workflow input."},{"line_number":239,"context_line":"    context \u003d sa.orm.deferred(sa.Column(st.JsonLongDictType()))"},{"line_number":240,"context_line":""},{"line_number":241,"context_line":"    @classmethod"},{"line_number":242,"context_line":"    def _get_nullable_columns(cls):"},{"line_number":243,"context_line":"        nullable_columns \u003d []"},{"line_number":244,"context_line":"        for column in cls.__table__.columns:"},{"line_number":245,"context_line":"            if column.nullable:"},{"line_number":246,"context_line":"                nullable_columns.append(column.name)"},{"line_number":247,"context_line":"        return nullable_columns"},{"line_number":248,"context_line":""},{"line_number":249,"context_line":"    @classmethod"},{"line_number":250,"context_line":"    def validate_nones(cls, nulls):"},{"line_number":251,"context_line":"        nullable_columns \u003d cls._get_nullable_columns()"},{"line_number":252,"context_line":"        columns \u003d cls.__table__.columns.keys()"},{"line_number":253,"context_line":"        for column in nulls:"},{"line_number":254,"context_line":"            if column not in columns:"},{"line_number":255,"context_line":"                raise ValueError(\u0027{} is not a valid field\u0027.format(column))"},{"line_number":256,"context_line":"            if column not in nullable_columns:"},{"line_number":257,"context_line":"                raise ValueError(\u0027{} can not be null\u0027.format(column))"},{"line_number":258,"context_line":""},{"line_number":259,"context_line":""},{"line_number":260,"context_line":"class TaskExecution(Execution):"}],"source_content_type":"text/x-python","patch_set":10,"id":"3fa7e38b_215972fd","line":257,"range":{"start_line":241,"start_character":0,"end_line":257,"end_character":69},"updated":"2019-10-07 05:14:11.000000000","message":"These two methods are misplaced. They are 100% generic and can be applied to any DB model. So please move them to the most base class (model_base._MistralModelBase)","commit_id":"89338d275fe4d9a89e0c946cb25485209c763a6a"}],"mistral/tests/unit/utils/test_filter_utils.py":[{"author":{"_account_id":8731,"name":"Renat Akhmerov","email":"renat.akhmerov@gmail.com","username":"rakhmerov"},"change_message_id":"3b8c1900316060623fea35c2e41b05b492b30746","unresolved":false,"context_lines":[{"line_number":22,"context_line":"    def test_create_filters_with_nones(self):"},{"line_number":23,"context_line":"        expected_filters \u003d {\u0027key2\u0027: {\u0027eq\u0027: \u0027value2\u0027}, \u0027key1\u0027: {\u0027eq\u0027: None}}"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"        filters \u003d filter_utils \\"},{"line_number":26,"context_line":"            .create_filters_from_request_params("},{"line_number":27,"context_line":"                none_values\u003d[\u0027key1\u0027],"},{"line_number":28,"context_line":"                key1\u003dNone,"},{"line_number":29,"context_line":"                key2\u003d\u0027value2\u0027,"}],"source_content_type":"text/x-python","patch_set":10,"id":"3fa7e38b_a101e2b1","line":26,"range":{"start_line":25,"start_character":31,"end_line":26,"end_character":13},"updated":"2019-10-07 05:14:11.000000000","message":"Not sure we need to use a backslash here. it can be just\n\nfilters \u003d filter_utils.create_filters_from_request_params(\n    none_values\u003d[\u0027key1\u0027],\n    ...\n\n)","commit_id":"89338d275fe4d9a89e0c946cb25485209c763a6a"},{"author":{"_account_id":8731,"name":"Renat Akhmerov","email":"renat.akhmerov@gmail.com","username":"rakhmerov"},"change_message_id":"3b8c1900316060623fea35c2e41b05b492b30746","unresolved":false,"context_lines":[{"line_number":32,"context_line":"        self.assertEqual(expected_filters, filters)"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"        del expected_filters[\u0027key1\u0027]"},{"line_number":35,"context_line":"        filters \u003d filter_utils \\"},{"line_number":36,"context_line":"            .create_filters_from_request_params("},{"line_number":37,"context_line":"                none_values\u003d[],"},{"line_number":38,"context_line":"                key1\u003dNone,"}],"source_content_type":"text/x-python","patch_set":10,"id":"3fa7e38b_c1fc1eb7","line":35,"range":{"start_line":35,"start_character":31,"end_line":35,"end_character":32},"updated":"2019-10-07 05:14:11.000000000","message":"Same.","commit_id":"89338d275fe4d9a89e0c946cb25485209c763a6a"}],"mistral/utils/filter_utils.py":[{"author":{"_account_id":8731,"name":"Renat Akhmerov","email":"renat.akhmerov@gmail.com","username":"rakhmerov"},"change_message_id":"87042af0ac0505efc33324c3e2b5faeb51cc5b33","unresolved":false,"context_lines":[{"line_number":15,"context_line":"import six"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"def create_filters_from_request_params(nulls\u003dNone, **params):"},{"line_number":19,"context_line":"    \"\"\"Create filters from REST request parameters."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"    :param nulls: key names, where the value is required to be null."}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_9661ca14","line":18,"range":{"start_line":18,"start_character":39,"end_line":18,"end_character":44},"updated":"2019-10-02 08:25:51.000000000","message":"I think everywhere in the Python code we need to use \"nones\" or \"none_values\" because it makes more sense for Python. In the REST controller the parameter can remain \"nulls\" or \"null_values\".","commit_id":"7bfd7e047756ff6dbf43d1cc441a1758d884509f"},{"author":{"_account_id":19134,"name":"Eyal","email":"eyalb1@gmail.com","username":"eyalb"},"change_message_id":"dd16ae1e97a1f2cf217ff67e7ee68666fe0195fc","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    filters \u003d {}"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    for column, data in params.items():"},{"line_number":29,"context_line":"        if (data is None and (column in none_values)) or data is not None:"},{"line_number":30,"context_line":"            if isinstance(data, six.string_types):"},{"line_number":31,"context_line":"                f_type, value \u003d _extract_filter_type_and_value(data)"},{"line_number":32,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa7e38b_221e7e70","line":29,"range":{"start_line":29,"start_character":29,"end_line":29,"end_character":52},"updated":"2019-10-03 10:02:31.000000000","message":"no need for parentheses","commit_id":"3c23f5509fe15629d4443ed9880167beb8857ced"},{"author":{"_account_id":8731,"name":"Renat Akhmerov","email":"renat.akhmerov@gmail.com","username":"rakhmerov"},"change_message_id":"3b8c1900316060623fea35c2e41b05b492b30746","unresolved":false,"context_lines":[{"line_number":18,"context_line":"def create_filters_from_request_params(none_values\u003dNone, **params):"},{"line_number":19,"context_line":"    \"\"\"Create filters from REST request parameters."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"    :param none_values: key names, where the value is required to be null."},{"line_number":22,"context_line":"    :param req_params: REST request parameters."},{"line_number":23,"context_line":"    :return: filters dictionary."},{"line_number":24,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":10,"id":"3fa7e38b_813066a0","line":21,"range":{"start_line":21,"start_character":69,"end_line":21,"end_character":73},"updated":"2019-10-07 05:14:11.000000000","message":"-\u003e None","commit_id":"89338d275fe4d9a89e0c946cb25485209c763a6a"},{"author":{"_account_id":8731,"name":"Renat Akhmerov","email":"renat.akhmerov@gmail.com","username":"rakhmerov"},"change_message_id":"3b8c1900316060623fea35c2e41b05b492b30746","unresolved":false,"context_lines":[{"line_number":18,"context_line":"def create_filters_from_request_params(none_values\u003dNone, **params):"},{"line_number":19,"context_line":"    \"\"\"Create filters from REST request parameters."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"    :param none_values: key names, where the value is required to be null."},{"line_number":22,"context_line":"    :param req_params: REST request parameters."},{"line_number":23,"context_line":"    :return: filters dictionary."},{"line_number":24,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":10,"id":"3fa7e38b_412a6e2c","line":21,"range":{"start_line":21,"start_character":24,"end_line":21,"end_character":27},"updated":"2019-10-07 05:14:11.000000000","message":"Not sure what you mean by \"key\" here. May be better to use \"field\" or \"REST resource field\"?","commit_id":"89338d275fe4d9a89e0c946cb25485209c763a6a"}]}
