)]}'
{"keystone/limit/models/strict_two_level.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"4cc7b0866bafcb704ab32855198af53c31c37454","unresolved":false,"context_lines":[{"line_number":115,"context_line":"                if parent_limit:"},{"line_number":116,"context_line":"                    if resource_limit \u003e parent_limit[0][\u0027resource_limit\u0027]:"},{"line_number":117,"context_line":"                        raise exception.InvalidLimit("},{"line_number":118,"context_line":"                            reason\u003d\"The input hierarchy tree is invalid.\")"},{"line_number":119,"context_line":"                    # The limit\u0027s parent is in request body, no need to"},{"line_number":120,"context_line":"                    # check the backend any more."},{"line_number":121,"context_line":"                    continue"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f79a3b5_785f3d11","line":118,"range":{"start_line":118,"start_character":28,"end_line":118,"end_character":73},"updated":"2018-12-12 22:15:42.000000000","message":"I\u0027m just noticing this now that I\u0027m re-reading the code, but maybe we could put a bit more information in here that tells how the limit is invalid.\n\nWe could do that in a follow-up, too.","commit_id":"52266fa66a4d20f90f0cba7df0aea35e1eee148a"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"741285571aedce0a4471312b2aca0c1ef94e1ab1","unresolved":false,"context_lines":[{"line_number":115,"context_line":"                if parent_limit:"},{"line_number":116,"context_line":"                    if resource_limit \u003e parent_limit[0][\u0027resource_limit\u0027]:"},{"line_number":117,"context_line":"                        raise exception.InvalidLimit("},{"line_number":118,"context_line":"                            reason\u003d\"The input hierarchy tree is invalid.\")"},{"line_number":119,"context_line":"                    # The limit\u0027s parent is in request body, no need to"},{"line_number":120,"context_line":"                    # check the backend any more."},{"line_number":121,"context_line":"                    continue"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f79a3b5_fa98e468","line":118,"range":{"start_line":118,"start_character":28,"end_line":118,"end_character":73},"in_reply_to":"3f79a3b5_785f3d11","updated":"2018-12-17 08:31:12.000000000","message":"Done","commit_id":"52266fa66a4d20f90f0cba7df0aea35e1eee148a"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"bb672273f53c15e4f78a1070035974eb78409683","unresolved":false,"context_lines":[{"line_number":58,"context_line":"            limit_value \u003d limits[0][\u0027default_limit\u0027] if limits else None"},{"line_number":59,"context_line":"        return limit_value"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def _check_limit(self, resource_name, service_id, region_id,"},{"line_number":62,"context_line":"                     resource_limit, domain_id\u003dNone, parent_id\u003dNone):"},{"line_number":63,"context_line":"        \"\"\"Check the specified limit value satisfies the related project tree."},{"line_number":64,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"9fdfeff1_88907997","line":61,"range":{"start_line":61,"start_character":53,"end_line":61,"end_character":63},"updated":"2019-02-08 05:55:25.000000000","message":"We can initialize region_id with \u0027None\u0027 too or we can do that in L103, region_id \u003d limit.get(\u0027region_id\u0027, None)?","commit_id":"d30072ad37042d9887854ddf8fb853af50f18537"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"994d68d962e378da566a0c74136e0ceb52ce2073","unresolved":false,"context_lines":[{"line_number":58,"context_line":"            limit_value \u003d limits[0][\u0027default_limit\u0027] if limits else None"},{"line_number":59,"context_line":"        return limit_value"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def _check_limit(self, resource_name, service_id, region_id,"},{"line_number":62,"context_line":"                     resource_limit, domain_id\u003dNone, parent_id\u003dNone):"},{"line_number":63,"context_line":"        \"\"\"Check the specified limit value satisfies the related project tree."},{"line_number":64,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"9fdfeff1_08377b01","line":61,"range":{"start_line":61,"start_character":53,"end_line":61,"end_character":63},"in_reply_to":"9fdfeff1_18f35b75","updated":"2019-02-12 02:04:02.000000000","message":"yes.","commit_id":"d30072ad37042d9887854ddf8fb853af50f18537"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"af8cec4669b7452b12773065c4e7192513286729","unresolved":false,"context_lines":[{"line_number":58,"context_line":"            limit_value \u003d limits[0][\u0027default_limit\u0027] if limits else None"},{"line_number":59,"context_line":"        return limit_value"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def _check_limit(self, resource_name, service_id, region_id,"},{"line_number":62,"context_line":"                     resource_limit, domain_id\u003dNone, parent_id\u003dNone):"},{"line_number":63,"context_line":"        \"\"\"Check the specified limit value satisfies the related project tree."},{"line_number":64,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"9fdfeff1_d6aa8983","line":61,"range":{"start_line":61,"start_character":53,"end_line":61,"end_character":63},"in_reply_to":"9fdfeff1_88907997","updated":"2019-02-11 03:12:35.000000000","message":"the default value for \"get\" is None in python","commit_id":"d30072ad37042d9887854ddf8fb853af50f18537"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"c64642c794282d614a7be0d9430fdfcf5ed17f35","unresolved":false,"context_lines":[{"line_number":58,"context_line":"            limit_value \u003d limits[0][\u0027default_limit\u0027] if limits else None"},{"line_number":59,"context_line":"        return limit_value"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def _check_limit(self, resource_name, service_id, region_id,"},{"line_number":62,"context_line":"                     resource_limit, domain_id\u003dNone, parent_id\u003dNone):"},{"line_number":63,"context_line":"        \"\"\"Check the specified limit value satisfies the related project tree."},{"line_number":64,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"9fdfeff1_18f35b75","line":61,"range":{"start_line":61,"start_character":53,"end_line":61,"end_character":63},"in_reply_to":"9fdfeff1_d6aa8983","updated":"2019-02-11 10:17:19.000000000","message":"region is not mandatory I think, it can be None right?","commit_id":"d30072ad37042d9887854ddf8fb853af50f18537"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"bb672273f53c15e4f78a1070035974eb78409683","unresolved":false,"context_lines":[{"line_number":69,"context_line":"        if parent_id:"},{"line_number":70,"context_line":"            # This is a project limit, need make sure its limit is not bigger"},{"line_number":71,"context_line":"            # than its parent."},{"line_number":72,"context_line":"            parent_limit_value \u003d self._get_specified_limit_value("},{"line_number":73,"context_line":"                resource_name, service_id, region_id, domain_id\u003dparent_id)"},{"line_number":74,"context_line":"            if parent_limit_value and resource_limit \u003e parent_limit_value:"},{"line_number":75,"context_line":"                raise exception.InvalidLimit("},{"line_number":76,"context_line":"                    reason\u003d\"Limit is bigger than parent.\")"},{"line_number":77,"context_line":"        else:"},{"line_number":78,"context_line":"            # This is a domain limit, need make sure its limit is not smaller"},{"line_number":79,"context_line":"            # than its children."}],"source_content_type":"text/x-python","patch_set":8,"id":"9fdfeff1_0827a966","line":76,"range":{"start_line":72,"start_character":11,"end_line":76,"end_character":58},"updated":"2019-02-08 05:55:25.000000000","message":"We have compared that the resource limit of parent and project limit in L117. As per my understanding the parent_limit_value is the usage value of parent?\nIf so then the project resource_limit  can be more than parent_limit_value but the total of both project resource_limit and parent_limit_value cannot be more than parent resource limit. Correct me if I am wrong?","commit_id":"d30072ad37042d9887854ddf8fb853af50f18537"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"af8cec4669b7452b12773065c4e7192513286729","unresolved":false,"context_lines":[{"line_number":69,"context_line":"        if parent_id:"},{"line_number":70,"context_line":"            # This is a project limit, need make sure its limit is not bigger"},{"line_number":71,"context_line":"            # than its parent."},{"line_number":72,"context_line":"            parent_limit_value \u003d self._get_specified_limit_value("},{"line_number":73,"context_line":"                resource_name, service_id, region_id, domain_id\u003dparent_id)"},{"line_number":74,"context_line":"            if parent_limit_value and resource_limit \u003e parent_limit_value:"},{"line_number":75,"context_line":"                raise exception.InvalidLimit("},{"line_number":76,"context_line":"                    reason\u003d\"Limit is bigger than parent.\")"},{"line_number":77,"context_line":"        else:"},{"line_number":78,"context_line":"            # This is a domain limit, need make sure its limit is not smaller"},{"line_number":79,"context_line":"            # than its children."}],"source_content_type":"text/x-python","patch_set":8,"id":"9fdfeff1_f6b46dd3","line":76,"range":{"start_line":72,"start_character":11,"end_line":76,"end_character":58},"in_reply_to":"9fdfeff1_0827a966","updated":"2019-02-11 03:12:35.000000000","message":"No, Keystone doesn\u0027t care about \"usage\" at all.\n\nFirst of all, We should know that Keystone support batch creation for limits. So L110 is to check the input limit tree is legal, e.g. If creating two limits in one request, one is parent, another is child.\n\nthen here is to ensure the input limit won\u0027t break the existed ones. e.g. If creating a project limit whose parent domain is in DB already.","commit_id":"d30072ad37042d9887854ddf8fb853af50f18537"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"c64642c794282d614a7be0d9430fdfcf5ed17f35","unresolved":false,"context_lines":[{"line_number":69,"context_line":"        if parent_id:"},{"line_number":70,"context_line":"            # This is a project limit, need make sure its limit is not bigger"},{"line_number":71,"context_line":"            # than its parent."},{"line_number":72,"context_line":"            parent_limit_value \u003d self._get_specified_limit_value("},{"line_number":73,"context_line":"                resource_name, service_id, region_id, domain_id\u003dparent_id)"},{"line_number":74,"context_line":"            if parent_limit_value and resource_limit \u003e parent_limit_value:"},{"line_number":75,"context_line":"                raise exception.InvalidLimit("},{"line_number":76,"context_line":"                    reason\u003d\"Limit is bigger than parent.\")"},{"line_number":77,"context_line":"        else:"},{"line_number":78,"context_line":"            # This is a domain limit, need make sure its limit is not smaller"},{"line_number":79,"context_line":"            # than its children."}],"source_content_type":"text/x-python","patch_set":8,"id":"9fdfeff1_38e41fac","line":76,"range":{"start_line":72,"start_character":11,"end_line":76,"end_character":58},"in_reply_to":"9fdfeff1_f6b46dd3","updated":"2019-02-11 10:17:19.000000000","message":"ok. Got the usage part.Thanks","commit_id":"d30072ad37042d9887854ddf8fb853af50f18537"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"bb672273f53c15e4f78a1070035974eb78409683","unresolved":false,"context_lines":[{"line_number":109,"context_line":"                        \u0027parent_id\u0027]"},{"line_number":110,"context_line":"                    parent_limit \u003d list(filter("},{"line_number":111,"context_line":"                        lambda x: (x.get(\u0027domain_id\u0027) \u003d\u003d parent_id and"},{"line_number":112,"context_line":"                                   x[\u0027service_id\u0027] \u003d\u003d service_id and"},{"line_number":113,"context_line":"                                   x.get(\u0027region_id\u0027) \u003d\u003d region_id and"},{"line_number":114,"context_line":"                                   x[\u0027resource_name\u0027] \u003d\u003d resource_name),"},{"line_number":115,"context_line":"                        limits))"},{"line_number":116,"context_line":"                    if parent_limit:"},{"line_number":117,"context_line":"                        if resource_limit \u003e parent_limit[0][\u0027resource_limit\u0027]:"}],"source_content_type":"text/x-python","patch_set":8,"id":"9fdfeff1_88495961","line":114,"range":{"start_line":112,"start_character":35,"end_line":114,"end_character":71},"updated":"2019-02-08 05:55:25.000000000","message":"As we are fetching service_id, region_id, and resource_name while iterating over limits, then what difference will it make comparing again with the limits?","commit_id":"d30072ad37042d9887854ddf8fb853af50f18537"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"d51b95caa5875e121cfe333366d494cd93f87c7c","unresolved":false,"context_lines":[{"line_number":109,"context_line":"                        \u0027parent_id\u0027]"},{"line_number":110,"context_line":"                    parent_limit \u003d list(filter("},{"line_number":111,"context_line":"                        lambda x: (x.get(\u0027domain_id\u0027) \u003d\u003d parent_id and"},{"line_number":112,"context_line":"                                   x[\u0027service_id\u0027] \u003d\u003d service_id and"},{"line_number":113,"context_line":"                                   x.get(\u0027region_id\u0027) \u003d\u003d region_id and"},{"line_number":114,"context_line":"                                   x[\u0027resource_name\u0027] \u003d\u003d resource_name),"},{"line_number":115,"context_line":"                        limits))"},{"line_number":116,"context_line":"                    if parent_limit:"},{"line_number":117,"context_line":"                        if resource_limit \u003e parent_limit[0][\u0027resource_limit\u0027]:"}],"source_content_type":"text/x-python","patch_set":8,"id":"9fdfeff1_a4675c4d","line":114,"range":{"start_line":112,"start_character":35,"end_line":114,"end_character":71},"in_reply_to":"9fdfeff1_5169a2f6","updated":"2019-02-22 05:09:59.000000000","message":"ok.thanks","commit_id":"d30072ad37042d9887854ddf8fb853af50f18537"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"2ed8ccbe66eceae4862ba5bf63f78c762ade7b9c","unresolved":false,"context_lines":[{"line_number":109,"context_line":"                        \u0027parent_id\u0027]"},{"line_number":110,"context_line":"                    parent_limit \u003d list(filter("},{"line_number":111,"context_line":"                        lambda x: (x.get(\u0027domain_id\u0027) \u003d\u003d parent_id and"},{"line_number":112,"context_line":"                                   x[\u0027service_id\u0027] \u003d\u003d service_id and"},{"line_number":113,"context_line":"                                   x.get(\u0027region_id\u0027) \u003d\u003d region_id and"},{"line_number":114,"context_line":"                                   x[\u0027resource_name\u0027] \u003d\u003d resource_name),"},{"line_number":115,"context_line":"                        limits))"},{"line_number":116,"context_line":"                    if parent_limit:"},{"line_number":117,"context_line":"                        if resource_limit \u003e parent_limit[0][\u0027resource_limit\u0027]:"}],"source_content_type":"text/x-python","patch_set":8,"id":"9fdfeff1_5169a2f6","line":114,"range":{"start_line":112,"start_character":35,"end_line":114,"end_character":71},"in_reply_to":"9fdfeff1_5949d3b4","updated":"2019-02-12 15:34:08.000000000","message":"yeah, the service_id, region_id and resource_name must be the same between parent limit and child limit.","commit_id":"d30072ad37042d9887854ddf8fb853af50f18537"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"c64642c794282d614a7be0d9430fdfcf5ed17f35","unresolved":false,"context_lines":[{"line_number":109,"context_line":"                        \u0027parent_id\u0027]"},{"line_number":110,"context_line":"                    parent_limit \u003d list(filter("},{"line_number":111,"context_line":"                        lambda x: (x.get(\u0027domain_id\u0027) \u003d\u003d parent_id and"},{"line_number":112,"context_line":"                                   x[\u0027service_id\u0027] \u003d\u003d service_id and"},{"line_number":113,"context_line":"                                   x.get(\u0027region_id\u0027) \u003d\u003d region_id and"},{"line_number":114,"context_line":"                                   x[\u0027resource_name\u0027] \u003d\u003d resource_name),"},{"line_number":115,"context_line":"                        limits))"},{"line_number":116,"context_line":"                    if parent_limit:"},{"line_number":117,"context_line":"                        if resource_limit \u003e parent_limit[0][\u0027resource_limit\u0027]:"}],"source_content_type":"text/x-python","patch_set":8,"id":"9fdfeff1_9850ab60","line":114,"range":{"start_line":112,"start_character":35,"end_line":114,"end_character":71},"in_reply_to":"9fdfeff1_88495961","updated":"2019-02-11 10:17:19.000000000","message":"This one left","commit_id":"d30072ad37042d9887854ddf8fb853af50f18537"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"994d68d962e378da566a0c74136e0ceb52ce2073","unresolved":false,"context_lines":[{"line_number":109,"context_line":"                        \u0027parent_id\u0027]"},{"line_number":110,"context_line":"                    parent_limit \u003d list(filter("},{"line_number":111,"context_line":"                        lambda x: (x.get(\u0027domain_id\u0027) \u003d\u003d parent_id and"},{"line_number":112,"context_line":"                                   x[\u0027service_id\u0027] \u003d\u003d service_id and"},{"line_number":113,"context_line":"                                   x.get(\u0027region_id\u0027) \u003d\u003d region_id and"},{"line_number":114,"context_line":"                                   x[\u0027resource_name\u0027] \u003d\u003d resource_name),"},{"line_number":115,"context_line":"                        limits))"},{"line_number":116,"context_line":"                    if parent_limit:"},{"line_number":117,"context_line":"                        if resource_limit \u003e parent_limit[0][\u0027resource_limit\u0027]:"}],"source_content_type":"text/x-python","patch_set":8,"id":"9fdfeff1_b3058012","line":114,"range":{"start_line":112,"start_character":35,"end_line":114,"end_character":71},"in_reply_to":"9fdfeff1_9850ab60","updated":"2019-02-12 02:04:02.000000000","message":"the code here aims to find if the input limits contain related parent limit(domain level) or not. See L111, it compare the \"domain_id\" in input with the parent_id from DB. It they are matched, it means that the input \"domain\" limit is a parent limit for some input \"project\" limit","commit_id":"d30072ad37042d9887854ddf8fb853af50f18537"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"1cf0a393377658ffabc3b60607724398240c6bb4","unresolved":false,"context_lines":[{"line_number":109,"context_line":"                        \u0027parent_id\u0027]"},{"line_number":110,"context_line":"                    parent_limit \u003d list(filter("},{"line_number":111,"context_line":"                        lambda x: (x.get(\u0027domain_id\u0027) \u003d\u003d parent_id and"},{"line_number":112,"context_line":"                                   x[\u0027service_id\u0027] \u003d\u003d service_id and"},{"line_number":113,"context_line":"                                   x.get(\u0027region_id\u0027) \u003d\u003d region_id and"},{"line_number":114,"context_line":"                                   x[\u0027resource_name\u0027] \u003d\u003d resource_name),"},{"line_number":115,"context_line":"                        limits))"},{"line_number":116,"context_line":"                    if parent_limit:"},{"line_number":117,"context_line":"                        if resource_limit \u003e parent_limit[0][\u0027resource_limit\u0027]:"}],"source_content_type":"text/x-python","patch_set":8,"id":"9fdfeff1_5949d3b4","line":114,"range":{"start_line":112,"start_character":35,"end_line":114,"end_character":71},"in_reply_to":"9fdfeff1_b3058012","updated":"2019-02-12 06:30:35.000000000","message":"yes I understand L111. But I was having doubts on  L112,L113, L114. Does these lines make any difference?","commit_id":"d30072ad37042d9887854ddf8fb853af50f18537"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"d090de722829b6df7378e0c35c90172e81cda27f","unresolved":false,"context_lines":[{"line_number":74,"context_line":"            if parent_limit_value and resource_limit \u003e parent_limit_value:"},{"line_number":75,"context_line":"                raise exception.InvalidLimit("},{"line_number":76,"context_line":"                    reason\u003d\"Limit is bigger than parent.\")"},{"line_number":77,"context_line":"        else:"},{"line_number":78,"context_line":"            # This is a domain limit, need make sure its limit is not smaller"},{"line_number":79,"context_line":"            # than its children."},{"line_number":80,"context_line":"            sub_projects \u003d PROVIDERS.resource_api.list_projects_in_subtree("}],"source_content_type":"text/x-python","patch_set":15,"id":"9fdfeff1_6395b83f","line":77,"range":{"start_line":77,"start_character":8,"end_line":77,"end_character":12},"updated":"2019-02-28 10:46:43.000000000","message":"I think it would be safer to explicitly check domain_id instead of relying on !parent_id","commit_id":"7e98d297ae4ba2122056893e571f949015867a27"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"d090de722829b6df7378e0c35c90172e81cda27f","unresolved":false,"context_lines":[{"line_number":108,"context_line":"                    parent_id \u003d PROVIDERS.resource_api.get_project(project_id)["},{"line_number":109,"context_line":"                        \u0027parent_id\u0027]"},{"line_number":110,"context_line":"                    parent_limit \u003d list(filter("},{"line_number":111,"context_line":"                        lambda x: (x.get(\u0027domain_id\u0027) \u003d\u003d parent_id and"},{"line_number":112,"context_line":"                                   x[\u0027service_id\u0027] \u003d\u003d service_id and"},{"line_number":113,"context_line":"                                   x.get(\u0027region_id\u0027) \u003d\u003d region_id and"},{"line_number":114,"context_line":"                                   x[\u0027resource_name\u0027] \u003d\u003d resource_name),"}],"source_content_type":"text/x-python","patch_set":15,"id":"9fdfeff1_03d70c25","line":111,"range":{"start_line":111,"start_character":24,"end_line":111,"end_character":33},"updated":"2019-02-28 10:46:43.000000000","message":"(nit) a lambda this long should probably be a named function imo","commit_id":"7e98d297ae4ba2122056893e571f949015867a27"}],"keystone/tests/unit/test_limits.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"e0c613f30342635c459f7b9c10652c7e52c6fa5c","unresolved":false,"context_lines":[{"line_number":1083,"context_line":"    def setUp(self):"},{"line_number":1084,"context_line":"        super(StrictTwoLevelLimitsTestCase, self).setUp()"},{"line_number":1085,"context_line":"        # create two hierarchical projects trees for test. The first level is"},{"line_number":1086,"context_line":"        # domain."},{"line_number":1087,"context_line":"        #   A        D"},{"line_number":1088,"context_line":"        #  / \\      / \\"},{"line_number":1089,"context_line":"        # B   C    E   F"}],"source_content_type":"text/x-python","patch_set":6,"id":"bfdaf3ff_d729399b","line":1086,"updated":"2019-01-15 22:12:41.000000000","message":"Are we still planning to support the case where A, B, and C are all projects?","commit_id":"8b0291e010f8152da802c0b1a08850697bc13b5b"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"34b4aa0ede538682f45967ce178f8ee6a1d40627","unresolved":false,"context_lines":[{"line_number":1083,"context_line":"    def setUp(self):"},{"line_number":1084,"context_line":"        super(StrictTwoLevelLimitsTestCase, self).setUp()"},{"line_number":1085,"context_line":"        # create two hierarchical projects trees for test. The first level is"},{"line_number":1086,"context_line":"        # domain."},{"line_number":1087,"context_line":"        #   A        D"},{"line_number":1088,"context_line":"        #  / \\      / \\"},{"line_number":1089,"context_line":"        # B   C    E   F"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fdfeff1_c74a0654","line":1086,"in_reply_to":"bfdaf3ff_d729399b","updated":"2019-01-23 07:18:22.000000000","message":"I think we can handle that case in a new model","commit_id":"8b0291e010f8152da802c0b1a08850697bc13b5b"}]}
