)]}'
{"nova/api/openstack/compute/contrib/quotas.py":[{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"8900b45c03adf0bac0b5e7afbaa9042d1ecb538d","unresolved":false,"context_lines":[{"line_number":65,"context_line":"        if limit \u003c -1:"},{"line_number":66,"context_line":"            msg \u003d _(\"Quota limit must be -1 or greater.\")"},{"line_number":67,"context_line":"            raise webob.exc.HTTPBadRequest(explanation\u003dmsg)"},{"line_number":68,"context_line":"        if ((maximum \u003d\u003d -1 and limit !\u003d -1 and limit \u003c minimum) or"},{"line_number":69,"context_line":"            (maximum !\u003d -1 and limit \u003c minimum)):"},{"line_number":70,"context_line":"            msg \u003d _(\"Quota limit must greater than %s.\") % minimum"},{"line_number":71,"context_line":"            raise webob.exc.HTTPBadRequest(explanation\u003dmsg)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAOn%2F%2FUfo%3D","line":68,"updated":"2013-05-14 19:31:06.000000000","message":"nit: \n\nit could be simplify:\n(limit \u003c minimum) and (maximum !\u003d -1 or (maximum \u003d\u003d -1 and limit !\u003d -1))","commit_id":"909e59a0badf532013aff678c1f296da4465e161"},{"author":{"_account_id":4428,"name":"Liyingjun","email":"yinjalee@163.com","username":"liyingjun"},"change_message_id":"308750ea2d2bd60773904e80e67a295f655286b2","unresolved":false,"context_lines":[{"line_number":65,"context_line":"        if limit \u003c -1:"},{"line_number":66,"context_line":"            msg \u003d _(\"Quota limit must be -1 or greater.\")"},{"line_number":67,"context_line":"            raise webob.exc.HTTPBadRequest(explanation\u003dmsg)"},{"line_number":68,"context_line":"        if ((maximum \u003d\u003d -1 and limit !\u003d -1 and limit \u003c minimum) or"},{"line_number":69,"context_line":"            (maximum !\u003d -1 and limit \u003c minimum)):"},{"line_number":70,"context_line":"            msg \u003d _(\"Quota limit must greater than %s.\") % minimum"},{"line_number":71,"context_line":"            raise webob.exc.HTTPBadRequest(explanation\u003dmsg)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAOn%2F%2FT3Y%3D","line":68,"in_reply_to":"AAAAOn%2F%2FUfo%3D","updated":"2013-05-15 01:44:43.000000000","message":"Done","commit_id":"909e59a0badf532013aff678c1f296da4465e161"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"8900b45c03adf0bac0b5e7afbaa9042d1ecb538d","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        else:"},{"line_number":81,"context_line":"            values \u003d QUOTAS.get_project_quotas(context, id, usages\u003dusages)"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"        if usages:"},{"line_number":84,"context_line":"            return values"},{"line_number":85,"context_line":"        else:"},{"line_number":86,"context_line":"            return dict((k, v[\u0027limit\u0027]) for k, v in values.items())"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAOn%2F%2FUfQ%3D","line":83,"updated":"2013-05-14 19:31:06.000000000","message":"could you explain why we are returning here different things, and it depends on usages?","commit_id":"909e59a0badf532013aff678c1f296da4465e161"},{"author":{"_account_id":4428,"name":"Liyingjun","email":"yinjalee@163.com","username":"liyingjun"},"change_message_id":"308750ea2d2bd60773904e80e67a295f655286b2","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        else:"},{"line_number":81,"context_line":"            values \u003d QUOTAS.get_project_quotas(context, id, usages\u003dusages)"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"        if usages:"},{"line_number":84,"context_line":"            return values"},{"line_number":85,"context_line":"        else:"},{"line_number":86,"context_line":"            return dict((k, v[\u0027limit\u0027]) for k, v in values.items())"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAOn%2F%2FT6g%3D","line":83,"in_reply_to":"AAAAOn%2F%2FUfQ%3D","updated":"2013-05-15 01:44:43.000000000","message":"Usage is not used here, maybe it\u0027s for future use,  so i leave it here.","commit_id":"909e59a0badf532013aff678c1f296da4465e161"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"8900b45c03adf0bac0b5e7afbaa9042d1ecb538d","unresolved":false,"context_lines":[{"line_number":89,"context_line":"    def show(self, req, id):"},{"line_number":90,"context_line":"        context \u003d req.environ[\u0027nova.context\u0027]"},{"line_number":91,"context_line":"        authorize_show(context)"},{"line_number":92,"context_line":"        qs \u003d req.environ.get(\u0027QUERY_STRING\u0027, \u0027\u0027)"},{"line_number":93,"context_line":"        params \u003d urlparse.parse_qs(qs)"},{"line_number":94,"context_line":"        user_id \u003d params.get(\u0027user_id\u0027, [None])[0]"},{"line_number":95,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAOn%2F%2FUfA%3D","line":92,"updated":"2013-05-14 19:31:06.000000000","message":"probably you should remove qs variable and put req.env.. inline?","commit_id":"909e59a0badf532013aff678c1f296da4465e161"},{"author":{"_account_id":4428,"name":"Liyingjun","email":"yinjalee@163.com","username":"liyingjun"},"change_message_id":"308750ea2d2bd60773904e80e67a295f655286b2","unresolved":false,"context_lines":[{"line_number":89,"context_line":"    def show(self, req, id):"},{"line_number":90,"context_line":"        context \u003d req.environ[\u0027nova.context\u0027]"},{"line_number":91,"context_line":"        authorize_show(context)"},{"line_number":92,"context_line":"        qs \u003d req.environ.get(\u0027QUERY_STRING\u0027, \u0027\u0027)"},{"line_number":93,"context_line":"        params \u003d urlparse.parse_qs(qs)"},{"line_number":94,"context_line":"        user_id \u003d params.get(\u0027user_id\u0027, [None])[0]"},{"line_number":95,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAOn%2F%2FT3Q%3D","line":92,"in_reply_to":"AAAAOn%2F%2FUfA%3D","updated":"2013-05-15 01:44:43.000000000","message":"Done","commit_id":"909e59a0badf532013aff678c1f296da4465e161"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"8900b45c03adf0bac0b5e7afbaa9042d1ecb538d","unresolved":false,"context_lines":[{"line_number":103,"context_line":"    def update(self, req, id, body):"},{"line_number":104,"context_line":"        context \u003d req.environ[\u0027nova.context\u0027]"},{"line_number":105,"context_line":"        authorize_update(context)"},{"line_number":106,"context_line":"        qs \u003d req.environ.get(\u0027QUERY_STRING\u0027, \u0027\u0027)"},{"line_number":107,"context_line":"        params \u003d urlparse.parse_qs(qs)"},{"line_number":108,"context_line":"        user_id \u003d params.get(\u0027user_id\u0027, [None])[0]"},{"line_number":109,"context_line":"        project_id \u003d id"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAOn%2F%2FUe8%3D","line":106,"updated":"2013-05-14 19:31:06.000000000","message":"same","commit_id":"909e59a0badf532013aff678c1f296da4465e161"},{"author":{"_account_id":5652,"name":"David Ripton","email":"dripton@redhat.com","username":"dripton"},"change_message_id":"ce0f6b8af247c59b598fdc62cb6db7a0cd2ad039","unresolved":false,"context_lines":[{"line_number":116,"context_line":"            raise webob.exc.HTTPForbidden()"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"        bad_keys \u003d []"},{"line_number":119,"context_line":"        for key in body[\u0027quota_set\u0027].keys():"},{"line_number":120,"context_line":"            if (key not in QUOTAS and"},{"line_number":121,"context_line":"                    key !\u003d \u0027tenant_id\u0027 and"},{"line_number":122,"context_line":"                    key !\u003d \u0027id\u0027):"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAPH%2F%2FdiM%3D","line":119,"updated":"2013-06-03 13:44:26.000000000","message":"for key in body[\u0027quota_set\u0027] works here and avoids making an extra list.","commit_id":"e30f38994da0b84db8fee5f9f640b6e21c95d629"}],"nova/db/sqlalchemy/api.py":[{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"e016e72f550f745d9460493e2cf6a1ef6900eb78","unresolved":false,"context_lines":[{"line_number":2527,"context_line":""},{"line_number":2528,"context_line":""},{"line_number":2529,"context_line":"@require_context"},{"line_number":2530,"context_line":"def quota_get_all_by_user(context, project_id, user_id, session\u003dNone):"},{"line_number":2531,"context_line":"    nova.context.authorize_project_context(context, project_id)"},{"line_number":2532,"context_line":""},{"line_number":2533,"context_line":"    rows \u003d model_query(context, models.UserQuota, session\u003dsession,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAOn%2F%2FjVQ%3D","line":2530,"updated":"2013-05-04 16:13:55.000000000","message":"Do not use session parameter in public methods \ntake a look at https://blueprints.launchpad.net/nova/+spec/db-session-cleanup","commit_id":"322f6f5f9a474dd95e1f517ec3337ffa4bab40dc"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"e016e72f550f745d9460493e2cf6a1ef6900eb78","unresolved":false,"context_lines":[{"line_number":2544,"context_line":""},{"line_number":2545,"context_line":""},{"line_number":2546,"context_line":"@require_context"},{"line_number":2547,"context_line":"def quota_get_all_by_project(context, project_id, session\u003dNone):"},{"line_number":2548,"context_line":"    nova.context.authorize_project_context(context, project_id)"},{"line_number":2549,"context_line":""},{"line_number":2550,"context_line":"    rows \u003d model_query(context, models.Quota, session\u003dsession,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAOn%2F%2FjVM%3D","line":2547,"updated":"2013-05-04 16:13:55.000000000","message":"same","commit_id":"322f6f5f9a474dd95e1f517ec3337ffa4bab40dc"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"e016e72f550f745d9460493e2cf6a1ef6900eb78","unresolved":false,"context_lines":[{"line_number":2560,"context_line":""},{"line_number":2561,"context_line":""},{"line_number":2562,"context_line":"@require_context"},{"line_number":2563,"context_line":"def quota_get_all(context, project_id, session\u003dNone):"},{"line_number":2564,"context_line":"    nova.context.authorize_project_context(context, project_id)"},{"line_number":2565,"context_line":""},{"line_number":2566,"context_line":"    result \u003d model_query(context, models.UserQuota, session\u003dsession,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAOn%2F%2FjVI%3D","line":2563,"updated":"2013-05-04 16:13:55.000000000","message":"same","commit_id":"322f6f5f9a474dd95e1f517ec3337ffa4bab40dc"},{"author":{"_account_id":5652,"name":"David Ripton","email":"dripton@redhat.com","username":"dripton"},"change_message_id":"ce0f6b8af247c59b598fdc62cb6db7a0cd2ad039","unresolved":false,"context_lines":[{"line_number":2878,"context_line":"    result \u003d dict()"},{"line_number":2879,"context_line":"    # Get the total count of in_use,reserved"},{"line_number":2880,"context_line":"    for row in rows:"},{"line_number":2881,"context_line":"        if row.resource in result.keys():"},{"line_number":2882,"context_line":"            result[row.resource][\u0027in_use\u0027] +\u003d row.in_use"},{"line_number":2883,"context_line":"            result[row.resource][\u0027reserved\u0027] +\u003d row.reserved"},{"line_number":2884,"context_line":"            result[row.resource][\u0027total\u0027] +\u003d (row.in_use + row.reserved)"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAPH%2F%2Fdig%3D","line":2881,"updated":"2013-06-03 13:44:26.000000000","message":"You can just say if row.resource in result, which avoids allocating a new list every time through the loop.","commit_id":"e30f38994da0b84db8fee5f9f640b6e21c95d629"},{"author":{"_account_id":5652,"name":"David Ripton","email":"dripton@redhat.com","username":"dripton"},"change_message_id":"ce0f6b8af247c59b598fdc62cb6db7a0cd2ad039","unresolved":false,"context_lines":[{"line_number":2980,"context_line":"        #            be able to reduce their usage without any"},{"line_number":2981,"context_line":"        #            problems."},{"line_number":2982,"context_line":"        for key, value in user_usages.items():"},{"line_number":2983,"context_line":"            if key not in project_usages.keys():"},{"line_number":2984,"context_line":"                project_usages[key] \u003d value"},{"line_number":2985,"context_line":"        overs \u003d [resource for resource, delta in deltas.items()"},{"line_number":2986,"context_line":"                 if user_quotas[resource] \u003e\u003d 0 and delta \u003e\u003d 0 and"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAPH%2F%2Fdic%3D","line":2983,"updated":"2013-06-03 13:44:26.000000000","message":"if key not in project_usages","commit_id":"e30f38994da0b84db8fee5f9f640b6e21c95d629"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"7f041e8b13aa684f8d3cfb7f477133b9b415d9c7","unresolved":false,"context_lines":[{"line_number":2596,"context_line":"                     filter_by(project_id\u003dproject_id).\\"},{"line_number":2597,"context_line":"                     filter_by(resource\u003dresource).\\"},{"line_number":2598,"context_line":"                     first()"},{"line_number":2599,"context_line":"    if user_id:"},{"line_number":2600,"context_line":"        u_quota \u003d model_query(context, models.ProjectUserQuota,"},{"line_number":2601,"context_line":"                              read_deleted\u003d\"no\").\\"},{"line_number":2602,"context_line":"                     filter_by(project_id\u003dproject_id).\\"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAPn%2F%2F%2F3Q%3D","line":2599,"updated":"2013-06-14 22:01:56.000000000","message":"In this case if you have user_id specified you will make always 2 queries. \n\nAnd if you write, \nresult \u003d None\nif user_id: \n    result \u003d ProjectUserQuota query\nif not result:\n    result \u003d Quota query\n\ndo things.","commit_id":"542e71017f550a13d40465d7f44db55556d0e023"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"7f041e8b13aa684f8d3cfb7f477133b9b415d9c7","unresolved":false,"context_lines":[{"line_number":2603,"context_line":"                     filter_by(user_id\u003duser_id).\\"},{"line_number":2604,"context_line":"                     filter_by(resource\u003dresource).\\"},{"line_number":2605,"context_line":"                     first()"},{"line_number":2606,"context_line":"        if u_quota:"},{"line_number":2607,"context_line":"            result \u003d u_quota"},{"line_number":2608,"context_line":""},{"line_number":2609,"context_line":"    if not result:"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAPn%2F%2F%2F3I%3D","line":2606,"updated":"2013-06-14 22:01:56.000000000","message":"Are you sure that NO records in DB is the same as user_id is not specified?","commit_id":"542e71017f550a13d40465d7f44db55556d0e023"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"7f041e8b13aa684f8d3cfb7f477133b9b415d9c7","unresolved":false,"context_lines":[{"line_number":2616,"context_line":"def quota_get_all_by_project_and_user(context, project_id, user_id):"},{"line_number":2617,"context_line":"    nova.context.authorize_project_context(context, project_id)"},{"line_number":2618,"context_line":""},{"line_number":2619,"context_line":"    rows \u003d model_query(context, models.ProjectUserQuota, read_deleted\u003d\"no\").\\"},{"line_number":2620,"context_line":"                   filter_by(project_id\u003dproject_id).\\"},{"line_number":2621,"context_line":"                   filter_by(user_id\u003duser_id).\\"},{"line_number":2622,"context_line":"                   all()"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAPn%2F%2F%2F28%3D","line":2619,"updated":"2013-06-14 22:01:56.000000000","message":"this is really nit, but you could make a little bit performance optimization if you request only columns that are required: \n\n(context, models.ProjectUserQuota.resource, models.ProjectQuota.hard_limit, base_model\u003dmodels.ProjectUserQuota,)....","commit_id":"542e71017f550a13d40465d7f44db55556d0e023"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"7f041e8b13aa684f8d3cfb7f477133b9b415d9c7","unresolved":false,"context_lines":[{"line_number":2663,"context_line":"    quota_ref.project_id \u003d project_id"},{"line_number":2664,"context_line":"    quota_ref.resource \u003d resource"},{"line_number":2665,"context_line":"    quota_ref.hard_limit \u003d limit"},{"line_number":2666,"context_line":"    quota_ref.save()"},{"line_number":2667,"context_line":"    return quota_ref"},{"line_number":2668,"context_line":""},{"line_number":2669,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAPn%2F%2F%2F20%3D","line":2666,"updated":"2013-06-14 22:01:56.000000000","message":"What will happen if you try 2 times to create the ProjectUserQuota with the same (project_id, user_id, resource) I think we will break all this\u003d)","commit_id":"542e71017f550a13d40465d7f44db55556d0e023"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"7f041e8b13aa684f8d3cfb7f477133b9b415d9c7","unresolved":false,"context_lines":[{"line_number":2682,"context_line":"                     filter_by(resource\u003dresource).\\"},{"line_number":2683,"context_line":"                     update({\u0027hard_limit\u0027: limit})"},{"line_number":2684,"context_line":""},{"line_number":2685,"context_line":"    if not result:"},{"line_number":2686,"context_line":"        if user_id:"},{"line_number":2687,"context_line":"            raise exception.ProjectUserQuotaNotFound(project_id\u003dproject_id,"},{"line_number":2688,"context_line":"                                                     user_id\u003duser_id)"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAPn%2F%2F%2F2g%3D","line":2685,"updated":"2013-06-14 22:01:56.000000000","message":"I would prefer to see if result \u003d\u003d 0:","commit_id":"542e71017f550a13d40465d7f44db55556d0e023"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"7f041e8b13aa684f8d3cfb7f477133b9b415d9c7","unresolved":false,"context_lines":[{"line_number":2685,"context_line":"    if not result:"},{"line_number":2686,"context_line":"        if user_id:"},{"line_number":2687,"context_line":"            raise exception.ProjectUserQuotaNotFound(project_id\u003dproject_id,"},{"line_number":2688,"context_line":"                                                     user_id\u003duser_id)"},{"line_number":2689,"context_line":"        raise exception.ProjectQuotaNotFound(project_id\u003dproject_id)"},{"line_number":2690,"context_line":""},{"line_number":2691,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAPn%2F%2F%2F2k%3D","line":2688,"updated":"2013-06-14 22:01:56.000000000","message":"align","commit_id":"542e71017f550a13d40465d7f44db55556d0e023"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"7f041e8b13aa684f8d3cfb7f477133b9b415d9c7","unresolved":false,"context_lines":[{"line_number":2758,"context_line":""},{"line_number":2759,"context_line":"@require_context"},{"line_number":2760,"context_line":"def quota_usage_get(context, project_id, resource, user_id\u003dNone):"},{"line_number":2761,"context_line":"    result \u003d model_query(context, models.QuotaUsage, read_deleted\u003d\"no\").\\"},{"line_number":2762,"context_line":"                     filter_by(project_id\u003dproject_id).\\"},{"line_number":2763,"context_line":"                     filter_by(resource\u003dresource)"},{"line_number":2764,"context_line":"    if user_id:"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAPn%2F%2F%2F2Q%3D","line":2761,"updated":"2013-06-14 22:01:56.000000000","message":"I would prefer to see s/result/query/","commit_id":"542e71017f550a13d40465d7f44db55556d0e023"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"7f041e8b13aa684f8d3cfb7f477133b9b415d9c7","unresolved":false,"context_lines":[{"line_number":2781,"context_line":"        result \u003d {\u0027project_id\u0027: project_id, \u0027user_id\u0027: user_id}"},{"line_number":2782,"context_line":"    else:"},{"line_number":2783,"context_line":"        rows \u003d rows.all()"},{"line_number":2784,"context_line":"        result \u003d {\u0027project_id\u0027: project_id}"},{"line_number":2785,"context_line":"    for row in rows:"},{"line_number":2786,"context_line":"        if row.resource in result:"},{"line_number":2787,"context_line":"            result[row.resource][\u0027in_use\u0027] +\u003d row.in_use"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAPn%2F%2F%2F2M%3D","line":2784,"updated":"2013-06-14 22:01:56.000000000","message":"this could be moved on top","commit_id":"542e71017f550a13d40465d7f44db55556d0e023"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"0836748a798361741f838dbfec9a14579cfef9ae","unresolved":false,"context_lines":[{"line_number":2582,"context_line":"@require_context"},{"line_number":2583,"context_line":"def quota_get(context, project_id, resource, user_id\u003dNone):"},{"line_number":2584,"context_line":"    if user_id:"},{"line_number":2585,"context_line":"        result \u003d model_query(context, models.ProjectUserQuota).\\"},{"line_number":2586,"context_line":"                     filter_by(project_id\u003dproject_id).\\"},{"line_number":2587,"context_line":"                     filter_by(user_id\u003duser_id).\\"},{"line_number":2588,"context_line":"                     filter_by(resource\u003dresource).\\"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAPn%2F%2F9h0%3D","line":2585,"updated":"2013-06-17 11:24:08.000000000","message":"this could be a little bit generalized: \n\n  model \u003d models.ProjectUserQuota if user_id else model.Quota\n  query \u003d model_query(context, model).\\\n                  filter_by(project_id\u003dproject_id).\\\n                  filter_by(resource\u003dresource).\\\n   if user_id:\n      query \u003d query.filter_by(user_id\u003duser_id)\n\n   result \u003d query.first()\n   if not result:\n       ...","commit_id":"43c862fe1a849af94bf8fcbfa14fa5dfb49268b5"},{"author":{"_account_id":4428,"name":"Liyingjun","email":"yinjalee@163.com","username":"liyingjun"},"change_message_id":"7c40491944c621aaa4ba1feaf60aa22d8a20550e","unresolved":false,"context_lines":[{"line_number":2582,"context_line":"@require_context"},{"line_number":2583,"context_line":"def quota_get(context, project_id, resource, user_id\u003dNone):"},{"line_number":2584,"context_line":"    if user_id:"},{"line_number":2585,"context_line":"        result \u003d model_query(context, models.ProjectUserQuota).\\"},{"line_number":2586,"context_line":"                     filter_by(project_id\u003dproject_id).\\"},{"line_number":2587,"context_line":"                     filter_by(user_id\u003duser_id).\\"},{"line_number":2588,"context_line":"                     filter_by(resource\u003dresource).\\"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAPn%2F%2F89A%3D","line":2585,"in_reply_to":"AAAAPn%2F%2F9h0%3D","updated":"2013-06-17 15:00:11.000000000","message":"Done","commit_id":"43c862fe1a849af94bf8fcbfa14fa5dfb49268b5"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"0836748a798361741f838dbfec9a14579cfef9ae","unresolved":false,"context_lines":[{"line_number":2607,"context_line":"def quota_get_all_by_project_and_user(context, project_id, user_id):"},{"line_number":2608,"context_line":"    nova.context.authorize_project_context(context, project_id)"},{"line_number":2609,"context_line":""},{"line_number":2610,"context_line":"    rows \u003d model_query(context, models.ProjectUserQuota,"},{"line_number":2611,"context_line":"                       models.ProjectUserQuota.resource,"},{"line_number":2612,"context_line":"                       models.ProjectUserQuota.hard_limit).\\"},{"line_number":2613,"context_line":"                   filter_by(project_id\u003dproject_id).\\"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAPn%2F%2F9g4%3D","line":2610,"updated":"2013-06-17 11:24:08.000000000","message":"no I didn\u0027t mean this.\n\nIf you would like to use not:\nselect * from table_name, and just\nselect c1, c2 from table_name then you have to specify in model_query these columns c1 and c2. \n\nto do this use should use next code: \n\n  model_query(context, models.ProjectUserQuota.resource,   models.ProjectUserQuota.hard_limit, base_model\u003dmodels.ProjectUserQuota)....\n\nbase_model is used in model_query to handle work around filtering by deleted value. \n\nread model_query description pls. this file line 179","commit_id":"43c862fe1a849af94bf8fcbfa14fa5dfb49268b5"},{"author":{"_account_id":4428,"name":"Liyingjun","email":"yinjalee@163.com","username":"liyingjun"},"change_message_id":"7c40491944c621aaa4ba1feaf60aa22d8a20550e","unresolved":false,"context_lines":[{"line_number":2607,"context_line":"def quota_get_all_by_project_and_user(context, project_id, user_id):"},{"line_number":2608,"context_line":"    nova.context.authorize_project_context(context, project_id)"},{"line_number":2609,"context_line":""},{"line_number":2610,"context_line":"    rows \u003d model_query(context, models.ProjectUserQuota,"},{"line_number":2611,"context_line":"                       models.ProjectUserQuota.resource,"},{"line_number":2612,"context_line":"                       models.ProjectUserQuota.hard_limit).\\"},{"line_number":2613,"context_line":"                   filter_by(project_id\u003dproject_id).\\"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAPn%2F%2F89o%3D","line":2610,"in_reply_to":"AAAAPn%2F%2F9g4%3D","updated":"2013-06-17 15:00:11.000000000","message":"Done","commit_id":"43c862fe1a849af94bf8fcbfa14fa5dfb49268b5"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"0836748a798361741f838dbfec9a14579cfef9ae","unresolved":false,"context_lines":[{"line_number":2656,"context_line":"    quota_ref.project_id \u003d project_id"},{"line_number":2657,"context_line":"    quota_ref.resource \u003d resource"},{"line_number":2658,"context_line":"    quota_ref.hard_limit \u003d limit"},{"line_number":2659,"context_line":"    quota_ref.save()"},{"line_number":2660,"context_line":"    return quota_ref"},{"line_number":2661,"context_line":""},{"line_number":2662,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAPn%2F%2F9gs%3D","line":2659,"updated":"2013-06-17 11:24:08.000000000","message":"I think that you should handle situation when you are trying to create quota that already exists.","commit_id":"43c862fe1a849af94bf8fcbfa14fa5dfb49268b5"},{"author":{"_account_id":4428,"name":"Liyingjun","email":"yinjalee@163.com","username":"liyingjun"},"change_message_id":"7c40491944c621aaa4ba1feaf60aa22d8a20550e","unresolved":false,"context_lines":[{"line_number":2656,"context_line":"    quota_ref.project_id \u003d project_id"},{"line_number":2657,"context_line":"    quota_ref.resource \u003d resource"},{"line_number":2658,"context_line":"    quota_ref.hard_limit \u003d limit"},{"line_number":2659,"context_line":"    quota_ref.save()"},{"line_number":2660,"context_line":"    return quota_ref"},{"line_number":2661,"context_line":""},{"line_number":2662,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAPn%2F%2F9AI%3D","line":2659,"in_reply_to":"AAAAPn%2F%2F9gs%3D","updated":"2013-06-17 15:00:11.000000000","message":"We call quota_update first when we create/update quota, call this only if QuotaNotFound exception catched, so i think there is no need to do a double check.","commit_id":"43c862fe1a849af94bf8fcbfa14fa5dfb49268b5"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"0836748a798361741f838dbfec9a14579cfef9ae","unresolved":false,"context_lines":[{"line_number":2663,"context_line":"@require_admin_context"},{"line_number":2664,"context_line":"def quota_update(context, project_id, resource, limit, user_id\u003dNone):"},{"line_number":2665,"context_line":"    if user_id:"},{"line_number":2666,"context_line":"        result \u003d model_query(context, models.ProjectUserQuota,"},{"line_number":2667,"context_line":"                             read_deleted\u003d\"no\").\\"},{"line_number":2668,"context_line":"                     filter_by(project_id\u003dproject_id).\\"},{"line_number":2669,"context_line":"                     filter_by(user_id\u003duser_id).\\"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAPn%2F%2F9gk%3D","line":2666,"updated":"2013-06-17 11:24:08.000000000","message":"I think that here we should also make some generalization as in 2585 line.","commit_id":"43c862fe1a849af94bf8fcbfa14fa5dfb49268b5"},{"author":{"_account_id":4428,"name":"Liyingjun","email":"yinjalee@163.com","username":"liyingjun"},"change_message_id":"7c40491944c621aaa4ba1feaf60aa22d8a20550e","unresolved":false,"context_lines":[{"line_number":2663,"context_line":"@require_admin_context"},{"line_number":2664,"context_line":"def quota_update(context, project_id, resource, limit, user_id\u003dNone):"},{"line_number":2665,"context_line":"    if user_id:"},{"line_number":2666,"context_line":"        result \u003d model_query(context, models.ProjectUserQuota,"},{"line_number":2667,"context_line":"                             read_deleted\u003d\"no\").\\"},{"line_number":2668,"context_line":"                     filter_by(project_id\u003dproject_id).\\"},{"line_number":2669,"context_line":"                     filter_by(user_id\u003duser_id).\\"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAPn%2F%2F89s%3D","line":2666,"in_reply_to":"AAAAPn%2F%2F9gk%3D","updated":"2013-06-17 15:00:11.000000000","message":"Done","commit_id":"43c862fe1a849af94bf8fcbfa14fa5dfb49268b5"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"0836748a798361741f838dbfec9a14579cfef9ae","unresolved":false,"context_lines":[{"line_number":2768,"context_line":""},{"line_number":2769,"context_line":"def _quota_usage_get_all(context, project_id, user_id\u003dNone):"},{"line_number":2770,"context_line":"    nova.context.authorize_project_context(context, project_id)"},{"line_number":2771,"context_line":"    rows \u003d model_query(context, models.QuotaUsage, read_deleted\u003d\"no\").\\"},{"line_number":2772,"context_line":"                   filter_by(project_id\u003dproject_id)"},{"line_number":2773,"context_line":"    result \u003d {\u0027project_id\u0027: project_id}"},{"line_number":2774,"context_line":"    if user_id:"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAPn%2F%2F9gc%3D","line":2771,"updated":"2013-06-17 11:24:08.000000000","message":"s/rows/query/ As this are not rows at all.","commit_id":"43c862fe1a849af94bf8fcbfa14fa5dfb49268b5"},{"author":{"_account_id":4428,"name":"Liyingjun","email":"yinjalee@163.com","username":"liyingjun"},"change_message_id":"7c40491944c621aaa4ba1feaf60aa22d8a20550e","unresolved":false,"context_lines":[{"line_number":2768,"context_line":""},{"line_number":2769,"context_line":"def _quota_usage_get_all(context, project_id, user_id\u003dNone):"},{"line_number":2770,"context_line":"    nova.context.authorize_project_context(context, project_id)"},{"line_number":2771,"context_line":"    rows \u003d model_query(context, models.QuotaUsage, read_deleted\u003d\"no\").\\"},{"line_number":2772,"context_line":"                   filter_by(project_id\u003dproject_id)"},{"line_number":2773,"context_line":"    result \u003d {\u0027project_id\u0027: project_id}"},{"line_number":2774,"context_line":"    if user_id:"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAPn%2F%2F9AA%3D","line":2771,"in_reply_to":"AAAAPn%2F%2F9gc%3D","updated":"2013-06-17 15:00:11.000000000","message":"Done","commit_id":"43c862fe1a849af94bf8fcbfa14fa5dfb49268b5"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"0836748a798361741f838dbfec9a14579cfef9ae","unresolved":false,"context_lines":[{"line_number":2808,"context_line":"    quota_usage_ref.reserved \u003d reserved"},{"line_number":2809,"context_line":"    quota_usage_ref.until_refresh \u003d until_refresh"},{"line_number":2810,"context_line":"    # updated_at is needed for judgement of max_age"},{"line_number":2811,"context_line":"    quota_usage_ref.updated_at \u003d timeutils.utcnow()"},{"line_number":2812,"context_line":""},{"line_number":2813,"context_line":"    quota_usage_ref.save(session\u003dsession)"},{"line_number":2814,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAPn%2F%2F9gU%3D","line":2811,"updated":"2013-06-17 11:24:08.000000000","message":"It will be passed automatically but sqlalchemy session or not?","commit_id":"43c862fe1a849af94bf8fcbfa14fa5dfb49268b5"},{"author":{"_account_id":4428,"name":"Liyingjun","email":"yinjalee@163.com","username":"liyingjun"},"change_message_id":"7c40491944c621aaa4ba1feaf60aa22d8a20550e","unresolved":false,"context_lines":[{"line_number":2808,"context_line":"    quota_usage_ref.reserved \u003d reserved"},{"line_number":2809,"context_line":"    quota_usage_ref.until_refresh \u003d until_refresh"},{"line_number":2810,"context_line":"    # updated_at is needed for judgement of max_age"},{"line_number":2811,"context_line":"    quota_usage_ref.updated_at \u003d timeutils.utcnow()"},{"line_number":2812,"context_line":""},{"line_number":2813,"context_line":"    quota_usage_ref.save(session\u003dsession)"},{"line_number":2814,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAPn%2F%2F8%2Fc%3D","line":2811,"in_reply_to":"AAAAPn%2F%2F9gU%3D","updated":"2013-06-17 15:00:11.000000000","message":"?","commit_id":"43c862fe1a849af94bf8fcbfa14fa5dfb49268b5"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"0836748a798361741f838dbfec9a14579cfef9ae","unresolved":false,"context_lines":[{"line_number":2818,"context_line":"@require_admin_context"},{"line_number":2819,"context_line":"def quota_usage_update(context, project_id, user_id, resource, **kwargs):"},{"line_number":2820,"context_line":"    updates \u003d {}"},{"line_number":2821,"context_line":"    if \u0027in_use\u0027 in kwargs:"},{"line_number":2822,"context_line":"        updates[\u0027in_use\u0027] \u003d kwargs[\u0027in_use\u0027]"},{"line_number":2823,"context_line":"    if \u0027reserved\u0027 in kwargs:"},{"line_number":2824,"context_line":"        updates[\u0027reserved\u0027] \u003d kwargs[\u0027reserved\u0027]"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAPn%2F%2F9gA%3D","line":2821,"updated":"2013-06-17 11:24:08.000000000","message":"It is not common way to check kwargs in such way, but this should be at least generalized: \n\n  for key in [\u0027in_use\u0027, \u0027reserved\u0027, \u0027until_refresh\u0027]: \n    if key in kwargs: \n      updates[key] \u003d kwargs[key]","commit_id":"43c862fe1a849af94bf8fcbfa14fa5dfb49268b5"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"0836748a798361741f838dbfec9a14579cfef9ae","unresolved":false,"context_lines":[{"line_number":3086,"context_line":"        usages \u003d _get_user_quota_usages(context, session, project_id, user_id)"},{"line_number":3087,"context_line":"        reservation_query \u003d _quota_reservations_query(session, context,"},{"line_number":3088,"context_line":"                                                      reservations)"},{"line_number":3089,"context_line":"        for reservation in reservation_query.all():"},{"line_number":3090,"context_line":"            usage \u003d usages[reservation.resource]"},{"line_number":3091,"context_line":"            if reservation.delta \u003e\u003d 0:"},{"line_number":3092,"context_line":"                usage.reserved -\u003d reservation.delta"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAPn%2F%2F9fc%3D","line":3089,"updated":"2013-06-17 11:24:08.000000000","message":"I think that we should move check in 3091 to query.filter","commit_id":"43c862fe1a849af94bf8fcbfa14fa5dfb49268b5"},{"author":{"_account_id":4428,"name":"Liyingjun","email":"yinjalee@163.com","username":"liyingjun"},"change_message_id":"7c40491944c621aaa4ba1feaf60aa22d8a20550e","unresolved":false,"context_lines":[{"line_number":3086,"context_line":"        usages \u003d _get_user_quota_usages(context, session, project_id, user_id)"},{"line_number":3087,"context_line":"        reservation_query \u003d _quota_reservations_query(session, context,"},{"line_number":3088,"context_line":"                                                      reservations)"},{"line_number":3089,"context_line":"        for reservation in reservation_query.all():"},{"line_number":3090,"context_line":"            usage \u003d usages[reservation.resource]"},{"line_number":3091,"context_line":"            if reservation.delta \u003e\u003d 0:"},{"line_number":3092,"context_line":"                usage.reserved -\u003d reservation.delta"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAPn%2F%2F9CY%3D","line":3089,"in_reply_to":"AAAAPn%2F%2F9fc%3D","updated":"2013-06-17 15:00:11.000000000","message":"I don\u0027t think so, delta is probably negative","commit_id":"43c862fe1a849af94bf8fcbfa14fa5dfb49268b5"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"0836748a798361741f838dbfec9a14579cfef9ae","unresolved":false,"context_lines":[{"line_number":3113,"context_line":"    session \u003d get_session()"},{"line_number":3114,"context_line":"    with session.begin():"},{"line_number":3115,"context_line":"        model_query(context, models.ProjectUserQuota, session\u003dsession,"},{"line_number":3116,"context_line":"                    read_deleted\u003d\"no\").\\"},{"line_number":3117,"context_line":"                filter_by(project_id\u003dproject_id).\\"},{"line_number":3118,"context_line":"                filter_by(user_id\u003duser_id).\\"},{"line_number":3119,"context_line":"                soft_delete(synchronize_session\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAPn%2F%2F9fk%3D","line":3116,"updated":"2013-06-17 11:24:08.000000000","message":"could you check is read_deleted overridden in contex? if it is not you could avoid explicit usage of read_deleted\u003d\u0027no\u0027","commit_id":"43c862fe1a849af94bf8fcbfa14fa5dfb49268b5"},{"author":{"_account_id":4428,"name":"Liyingjun","email":"yinjalee@163.com","username":"liyingjun"},"change_message_id":"7c40491944c621aaa4ba1feaf60aa22d8a20550e","unresolved":false,"context_lines":[{"line_number":3113,"context_line":"    session \u003d get_session()"},{"line_number":3114,"context_line":"    with session.begin():"},{"line_number":3115,"context_line":"        model_query(context, models.ProjectUserQuota, session\u003dsession,"},{"line_number":3116,"context_line":"                    read_deleted\u003d\"no\").\\"},{"line_number":3117,"context_line":"                filter_by(project_id\u003dproject_id).\\"},{"line_number":3118,"context_line":"                filter_by(user_id\u003duser_id).\\"},{"line_number":3119,"context_line":"                soft_delete(synchronize_session\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAPn%2F%2F894%3D","line":3116,"in_reply_to":"AAAAPn%2F%2F9fk%3D","updated":"2013-06-17 15:00:11.000000000","message":"yes","commit_id":"43c862fe1a849af94bf8fcbfa14fa5dfb49268b5"}],"nova/db/sqlalchemy/migrate_repo/versions/178_make_user_quotas_key_and_value.py":[{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"2ccce60f444326f8599fe29a062a6adadee95759","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    reservations.create_column(user_id)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    # New table."},{"line_number":48,"context_line":"    user_quotas \u003d Table(\u0027user_quotas\u0027, meta,"},{"line_number":49,"context_line":"                        Column(\u0027id\u0027, Integer(), primary_key\u003dTrue),"},{"line_number":50,"context_line":"                        Column(\u0027created_at\u0027, DateTime(timezone\u003dFalse)),"},{"line_number":51,"context_line":"                        Column(\u0027updated_at\u0027, DateTime(timezone\u003dFalse)),"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAOn%2F%2FgX8%3D","line":48,"updated":"2013-05-07 14:53:50.000000000","message":"Ok here we have one big problem.\u003d)\n\nYou haven\u0027t create shadow table for user_quotas (so we will have problems on db archiving)\n\nI am working now on generic method that will allow us to create shadow table in generic way. \n\nSo could you please wait with shadow tables until I finish my patch (It will be pretty soon)","commit_id":"682442beb2d7c86930a7664247283df87ab11c62"}],"nova/db/sqlalchemy/migrate_repo/versions/179_make_user_quotas_key_and_value.py":[{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"a4013bff0d0ff9f126b2fee3569a62e42f85a14d","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        meta.drop_all(tables\u003d[project_user_quotas])"},{"line_number":77,"context_line":"        raise"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    # Create shadow table"},{"line_number":80,"context_line":"    columns \u003d [column.copy() for column in project_user_quotas.columns]"},{"line_number":81,"context_line":"    shadow_table_name \u003d \u0027shadow_\u0027 + project_user_quotas.name"},{"line_number":82,"context_line":"    shadow_table \u003d Table(shadow_table_name, meta, *columns,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAOn%2F%2Fd0Y%3D","line":79,"updated":"2013-05-08 20:04:07.000000000","message":"I would prefer that you replace this place of code to use sqlalchemy.utils.create_shadow_table method that will be soon in master (here is it https://review.openstack.org/#/c/28563/)","commit_id":"d9177d4018047d31e66c6bf3d981f2c2d7a8607c"}],"nova/db/sqlalchemy/migrate_repo/versions/180_make_user_quotas_key_and_value.py":[{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"61396146c2865fda2f60f1930a53c087e318273a","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    # Add \u0027user_id\u0027 column to quota_usages table."},{"line_number":34,"context_line":"    quota_usages \u003d Table(\u0027quota_usages\u0027, meta, autoload\u003dTrue)"},{"line_number":35,"context_line":"    user_id \u003d Column(\u0027user_id\u0027,"},{"line_number":36,"context_line":"                     String(length\u003d255, convert_unicode\u003dFalse,"},{"line_number":37,"context_line":"                            assert_unicode\u003dNone, unicode_error\u003dNone,"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAOn%2F%2FY7g%3D","line":34,"updated":"2013-05-11 14:34:57.000000000","message":"Ohh one more nit. You should make the same changes in corresponding tables..","commit_id":"e0b9b371eb4f94be2e3480717ccc40a0e4819c56"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"bc638aa0c56414f426e6ccd00cd98dc356d3a2e3","unresolved":false,"context_lines":[{"line_number":79,"context_line":"        raise"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    # Create shadow table"},{"line_number":82,"context_line":"    utils.create_shadow_table(migrate_engine, table\u003dproject_user_quotas)"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"def downgrade(migrate_engine):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAOn%2F%2FY70%3D","line":82,"updated":"2013-05-11 14:31:14.000000000","message":"Thanks for rebasing patch, but I think that you should create shadow table in the same try-except where you are creating table.","commit_id":"e0b9b371eb4f94be2e3480717ccc40a0e4819c56"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"8900b45c03adf0bac0b5e7afbaa9042d1ecb538d","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    # Add \u0027user_id\u0027 column to quota_usages table and its shadow table."},{"line_number":34,"context_line":"    quota_usages \u003d Table(\u0027quota_usages\u0027, meta, autoload\u003dTrue)"},{"line_number":35,"context_line":"    user_id \u003d Column(\u0027user_id\u0027,"},{"line_number":36,"context_line":"                     String(length\u003d255, convert_unicode\u003dFalse,"},{"line_number":37,"context_line":"                            assert_unicode\u003dNone, unicode_error\u003dNone,"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAOn%2F%2FUgc%3D","line":34,"updated":"2013-05-14 19:31:06.000000000","message":"nit: \nin utils there is also method get_table() that is more clean and clear then Table autolad","commit_id":"909e59a0badf532013aff678c1f296da4465e161"}],"nova/db/sqlalchemy/migrate_repo/versions/185_make_user_quotas_key_and_value.py":[{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"7f041e8b13aa684f8d3cfb7f477133b9b415d9c7","unresolved":false,"context_lines":[{"line_number":55,"context_line":"                            assert_unicode\u003dNone, unicode_error\u003dNone,"},{"line_number":56,"context_line":"                            _warn_on_bytestring\u003dFalse))"},{"line_number":57,"context_line":"    reservations.create_column(user_id)"},{"line_number":58,"context_line":"    Index(\u0027ix_reservations_user_id\u0027, reservations.c.user_id)"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    shadow_reservations \u003d utils.get_table(migrate_engine,"},{"line_number":61,"context_line":"                                db._SHADOW_TABLE_PREFIX + \u0027reservations\u0027)"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAPn%2F%2F%2F4Y%3D","line":58,"updated":"2013-06-14 22:01:56.000000000","message":"I think that Index should be on on user_id and deleted columns.","commit_id":"542e71017f550a13d40465d7f44db55556d0e023"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"7f041e8b13aa684f8d3cfb7f477133b9b415d9c7","unresolved":false,"context_lines":[{"line_number":64,"context_line":"                            assert_unicode\u003dNone, unicode_error\u003dNone,"},{"line_number":65,"context_line":"                            _warn_on_bytestring\u003dFalse))"},{"line_number":66,"context_line":"    shadow_reservations.create_column(user_id)"},{"line_number":67,"context_line":"    Index(\u0027ix_shadow_reservations_user_id\u0027, shadow_reservations.c.user_id)"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    # New table."},{"line_number":70,"context_line":"    project_user_quotas \u003d Table(\u0027project_user_quotas\u0027, meta,"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAPn%2F%2F%2F4U%3D","line":67,"updated":"2013-06-14 22:01:56.000000000","message":"don\u0027t create Indexes on shadow tables","commit_id":"542e71017f550a13d40465d7f44db55556d0e023"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"7f041e8b13aa684f8d3cfb7f477133b9b415d9c7","unresolved":false,"context_lines":[{"line_number":66,"context_line":"    shadow_reservations.create_column(user_id)"},{"line_number":67,"context_line":"    Index(\u0027ix_shadow_reservations_user_id\u0027, shadow_reservations.c.user_id)"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    # New table."},{"line_number":70,"context_line":"    project_user_quotas \u003d Table(\u0027project_user_quotas\u0027, meta,"},{"line_number":71,"context_line":"                        Column(\u0027id\u0027, Integer(), primary_key\u003dTrue),"},{"line_number":72,"context_line":"                        Column(\u0027created_at\u0027, DateTime(timezone\u003dFalse)),"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAPn%2F%2F%2F4g%3D","line":69,"updated":"2013-06-14 22:01:56.000000000","message":"I don\u0027t think that this comment is useful","commit_id":"542e71017f550a13d40465d7f44db55556d0e023"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"7f041e8b13aa684f8d3cfb7f477133b9b415d9c7","unresolved":false,"context_lines":[{"line_number":67,"context_line":"    Index(\u0027ix_shadow_reservations_user_id\u0027, shadow_reservations.c.user_id)"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    # New table."},{"line_number":70,"context_line":"    project_user_quotas \u003d Table(\u0027project_user_quotas\u0027, meta,"},{"line_number":71,"context_line":"                        Column(\u0027id\u0027, Integer(), primary_key\u003dTrue),"},{"line_number":72,"context_line":"                        Column(\u0027created_at\u0027, DateTime(timezone\u003dFalse)),"},{"line_number":73,"context_line":"                        Column(\u0027updated_at\u0027, DateTime(timezone\u003dFalse)),"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAPn%2F%2F%2F4E%3D","line":70,"updated":"2013-06-14 22:01:56.000000000","message":"Hm I think that this table should have Unique constraint on \n(user_id, project_id, resource, deleted) columns.","commit_id":"542e71017f550a13d40465d7f44db55556d0e023"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"7f041e8b13aa684f8d3cfb7f477133b9b415d9c7","unresolved":false,"context_lines":[{"line_number":73,"context_line":"                        Column(\u0027updated_at\u0027, DateTime(timezone\u003dFalse)),"},{"line_number":74,"context_line":"                        Column(\u0027deleted_at\u0027, DateTime(timezone\u003dFalse)),"},{"line_number":75,"context_line":"                        Column(\u0027deleted\u0027, Boolean(), default\u003dFalse),"},{"line_number":76,"context_line":"                        Column(\u0027user_id\u0027,"},{"line_number":77,"context_line":"                               String(length\u003d255, convert_unicode\u003dFalse,"},{"line_number":78,"context_line":"                                      assert_unicode\u003dNone, unicode_error\u003dNone,"},{"line_number":79,"context_line":"                                      _warn_on_bytestring\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAPn%2F%2F%2F3s%3D","line":76,"updated":"2013-06-14 22:01:56.000000000","message":"You will always use ;deleted\u0027 column on filtering, so you should at least create these indexes with deleted column:\n(user_id, deleted) and (project_id, deleted)","commit_id":"542e71017f550a13d40465d7f44db55556d0e023"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"7f041e8b13aa684f8d3cfb7f477133b9b415d9c7","unresolved":false,"context_lines":[{"line_number":102,"context_line":""},{"line_number":103,"context_line":"    try:"},{"line_number":104,"context_line":"        # Create shadow table"},{"line_number":105,"context_line":"        utils.create_shadow_table(migrate_engine, table\u003dproject_user_quotas)"},{"line_number":106,"context_line":"    except Exception:"},{"line_number":107,"context_line":"        LOG.exception(\"Exception while creating shadow table for \""},{"line_number":108,"context_line":"                      \"\u0027project_user_quotas\u0027\")"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAPn%2F%2F%2F3o%3D","line":105,"updated":"2013-06-14 22:01:56.000000000","message":"I think that shadow and main table should be created in the same try excepted.","commit_id":"542e71017f550a13d40465d7f44db55556d0e023"}],"nova/db/sqlalchemy/migrate_repo/versions/189_make_user_quotas_key_and_value.py":[{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"0836748a798361741f838dbfec9a14579cfef9ae","unresolved":false,"context_lines":[{"line_number":37,"context_line":"                            assert_unicode\u003dNone, unicode_error\u003dNone,"},{"line_number":38,"context_line":"                            _warn_on_bytestring\u003dFalse))"},{"line_number":39,"context_line":"    quota_usages.create_column(user_id)"},{"line_number":40,"context_line":"    Index(\u0027ix_quota_usages_user_id_deleted\u0027,"},{"line_number":41,"context_line":"          quota_usages.c.user_id, quota_usages.c.deleted)"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    shadow_quota_usages \u003d utils.get_table(migrate_engine,"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAPn%2F%2F9jc%3D","line":40,"updated":"2013-06-17 11:24:08.000000000","message":"here the same as in 95 line","commit_id":"43c862fe1a849af94bf8fcbfa14fa5dfb49268b5"},{"author":{"_account_id":4428,"name":"Liyingjun","email":"yinjalee@163.com","username":"liyingjun"},"change_message_id":"7c40491944c621aaa4ba1feaf60aa22d8a20550e","unresolved":false,"context_lines":[{"line_number":37,"context_line":"                            assert_unicode\u003dNone, unicode_error\u003dNone,"},{"line_number":38,"context_line":"                            _warn_on_bytestring\u003dFalse))"},{"line_number":39,"context_line":"    quota_usages.create_column(user_id)"},{"line_number":40,"context_line":"    Index(\u0027ix_quota_usages_user_id_deleted\u0027,"},{"line_number":41,"context_line":"          quota_usages.c.user_id, quota_usages.c.deleted)"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    shadow_quota_usages \u003d utils.get_table(migrate_engine,"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAPn%2F%2F89Y%3D","line":40,"in_reply_to":"AAAAPn%2F%2F9jc%3D","updated":"2013-06-17 15:00:11.000000000","message":"Done","commit_id":"43c862fe1a849af94bf8fcbfa14fa5dfb49268b5"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"0836748a798361741f838dbfec9a14579cfef9ae","unresolved":false,"context_lines":[{"line_number":71,"context_line":"                        Column(\u0027created_at\u0027, DateTime(timezone\u003dFalse)),"},{"line_number":72,"context_line":"                        Column(\u0027updated_at\u0027, DateTime(timezone\u003dFalse)),"},{"line_number":73,"context_line":"                        Column(\u0027deleted_at\u0027, DateTime(timezone\u003dFalse)),"},{"line_number":74,"context_line":"                        Column(\u0027deleted\u0027, Boolean(), default\u003dFalse),"},{"line_number":75,"context_line":"                        Column(\u0027user_id\u0027,"},{"line_number":76,"context_line":"                               String(length\u003d255, convert_unicode\u003dFalse,"},{"line_number":77,"context_line":"                                      assert_unicode\u003dNone, unicode_error\u003dNone,"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAPn%2F%2F9ik%3D","line":74,"updated":"2013-06-17 11:24:08.000000000","message":"It won\u0027t work at all, to use soft_delete \u0027deleted\u0027 column type should be the same as \u0027id\u0027\n\nnova/openstack/common/db/sqlalchemy/models.py:103\nand \nnova/openstack/common/db/sqlalchemy/session.py:602","commit_id":"43c862fe1a849af94bf8fcbfa14fa5dfb49268b5"},{"author":{"_account_id":4428,"name":"Liyingjun","email":"yinjalee@163.com","username":"liyingjun"},"change_message_id":"7c40491944c621aaa4ba1feaf60aa22d8a20550e","unresolved":false,"context_lines":[{"line_number":71,"context_line":"                        Column(\u0027created_at\u0027, DateTime(timezone\u003dFalse)),"},{"line_number":72,"context_line":"                        Column(\u0027updated_at\u0027, DateTime(timezone\u003dFalse)),"},{"line_number":73,"context_line":"                        Column(\u0027deleted_at\u0027, DateTime(timezone\u003dFalse)),"},{"line_number":74,"context_line":"                        Column(\u0027deleted\u0027, Boolean(), default\u003dFalse),"},{"line_number":75,"context_line":"                        Column(\u0027user_id\u0027,"},{"line_number":76,"context_line":"                               String(length\u003d255, convert_unicode\u003dFalse,"},{"line_number":77,"context_line":"                                      assert_unicode\u003dNone, unicode_error\u003dNone,"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAPn%2F%2F89U%3D","line":74,"in_reply_to":"AAAAPn%2F%2F9ik%3D","updated":"2013-06-17 15:00:11.000000000","message":"Done","commit_id":"43c862fe1a849af94bf8fcbfa14fa5dfb49268b5"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"0836748a798361741f838dbfec9a14579cfef9ae","unresolved":false,"context_lines":[{"line_number":85,"context_line":"                                      assert_unicode\u003dNone, unicode_error\u003dNone,"},{"line_number":86,"context_line":"                                      _warn_on_bytestring\u003dFalse),"},{"line_number":87,"context_line":"                               nullable\u003dFalse),"},{"line_number":88,"context_line":"                        Column(\u0027hard_limit\u0027, Integer(), nullable\u003dTrue),"},{"line_number":89,"context_line":"                        UniqueConstraint(\u0027user_id\u0027, \u0027project_id\u0027, \u0027resource\u0027,"},{"line_number":90,"context_line":"                                         \u0027deleted\u0027,"},{"line_number":91,"context_line":"                                         name\u003d\u0027uniq_project_user_quotas\u0027),"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAPn%2F%2F9jk%3D","line":88,"updated":"2013-06-17 11:24:08.000000000","message":"as you have to make one more patchset, you are able to write just Integer without ()","commit_id":"43c862fe1a849af94bf8fcbfa14fa5dfb49268b5"},{"author":{"_account_id":4428,"name":"Liyingjun","email":"yinjalee@163.com","username":"liyingjun"},"change_message_id":"7c40491944c621aaa4ba1feaf60aa22d8a20550e","unresolved":false,"context_lines":[{"line_number":85,"context_line":"                                      assert_unicode\u003dNone, unicode_error\u003dNone,"},{"line_number":86,"context_line":"                                      _warn_on_bytestring\u003dFalse),"},{"line_number":87,"context_line":"                               nullable\u003dFalse),"},{"line_number":88,"context_line":"                        Column(\u0027hard_limit\u0027, Integer(), nullable\u003dTrue),"},{"line_number":89,"context_line":"                        UniqueConstraint(\u0027user_id\u0027, \u0027project_id\u0027, \u0027resource\u0027,"},{"line_number":90,"context_line":"                                         \u0027deleted\u0027,"},{"line_number":91,"context_line":"                                         name\u003d\u0027uniq_project_user_quotas\u0027),"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAPn%2F%2F89Q%3D","line":88,"in_reply_to":"AAAAPn%2F%2F9jk%3D","updated":"2013-06-17 15:00:11.000000000","message":"Done","commit_id":"43c862fe1a849af94bf8fcbfa14fa5dfb49268b5"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"0836748a798361741f838dbfec9a14579cfef9ae","unresolved":false,"context_lines":[{"line_number":88,"context_line":"                        Column(\u0027hard_limit\u0027, Integer(), nullable\u003dTrue),"},{"line_number":89,"context_line":"                        UniqueConstraint(\u0027user_id\u0027, \u0027project_id\u0027, \u0027resource\u0027,"},{"line_number":90,"context_line":"                                         \u0027deleted\u0027,"},{"line_number":91,"context_line":"                                         name\u003d\u0027uniq_project_user_quotas\u0027),"},{"line_number":92,"context_line":"                        mysql_engine\u003d\u0027InnoDB\u0027,"},{"line_number":93,"context_line":"                        mysql_charset\u003d\u0027utf8\u0027,"},{"line_number":94,"context_line":"                        )"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAPn%2F%2F9jE%3D","line":91,"updated":"2013-06-17 11:24:08.000000000","message":"wrong name convention. \n\nSorry we haven\u0027t tests for this case, but the right name convention for UC is next: \n\nuniq_tbl0col10cl20col3 where tbl - is table name, col1,col2, col3 are columns names. \n\nSo in your case you have to write something like: \n\nname\u003d\u0027uniq_project_user_quotas0user_id0project_id0resource0deleted\u0027\n\ntake a look at: \nnova/openstack/common/db/sqlalchemy/session.py:389","commit_id":"43c862fe1a849af94bf8fcbfa14fa5dfb49268b5"},{"author":{"_account_id":4428,"name":"Liyingjun","email":"yinjalee@163.com","username":"liyingjun"},"change_message_id":"7c40491944c621aaa4ba1feaf60aa22d8a20550e","unresolved":false,"context_lines":[{"line_number":88,"context_line":"                        Column(\u0027hard_limit\u0027, Integer(), nullable\u003dTrue),"},{"line_number":89,"context_line":"                        UniqueConstraint(\u0027user_id\u0027, \u0027project_id\u0027, \u0027resource\u0027,"},{"line_number":90,"context_line":"                                         \u0027deleted\u0027,"},{"line_number":91,"context_line":"                                         name\u003d\u0027uniq_project_user_quotas\u0027),"},{"line_number":92,"context_line":"                        mysql_engine\u003d\u0027InnoDB\u0027,"},{"line_number":93,"context_line":"                        mysql_charset\u003d\u0027utf8\u0027,"},{"line_number":94,"context_line":"                        )"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAPn%2F%2F89M%3D","line":91,"in_reply_to":"AAAAPn%2F%2F9jE%3D","updated":"2013-06-17 15:00:11.000000000","message":"Done","commit_id":"43c862fe1a849af94bf8fcbfa14fa5dfb49268b5"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"0836748a798361741f838dbfec9a14579cfef9ae","unresolved":false,"context_lines":[{"line_number":92,"context_line":"                        mysql_engine\u003d\u0027InnoDB\u0027,"},{"line_number":93,"context_line":"                        mysql_charset\u003d\u0027utf8\u0027,"},{"line_number":94,"context_line":"                        )"},{"line_number":95,"context_line":"    Index(\u0027project_user_quotas_project_id_deleted_idx\u0027,"},{"line_number":96,"context_line":"          project_user_quotas.c.project_id, project_user_quotas.c.deleted)"},{"line_number":97,"context_line":"    Index(\u0027project_user_quotas_user_id_deleted_idx\u0027,"},{"line_number":98,"context_line":"          project_user_quotas.c.user_id, project_user_quotas.c.deleted)"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAPn%2F%2F9j4%3D","line":95,"updated":"2013-06-17 11:24:08.000000000","message":"put this Index description into Table description. In current situation you don\u0027t create any Index","commit_id":"43c862fe1a849af94bf8fcbfa14fa5dfb49268b5"},{"author":{"_account_id":4428,"name":"Liyingjun","email":"yinjalee@163.com","username":"liyingjun"},"change_message_id":"7c40491944c621aaa4ba1feaf60aa22d8a20550e","unresolved":false,"context_lines":[{"line_number":92,"context_line":"                        mysql_engine\u003d\u0027InnoDB\u0027,"},{"line_number":93,"context_line":"                        mysql_charset\u003d\u0027utf8\u0027,"},{"line_number":94,"context_line":"                        )"},{"line_number":95,"context_line":"    Index(\u0027project_user_quotas_project_id_deleted_idx\u0027,"},{"line_number":96,"context_line":"          project_user_quotas.c.project_id, project_user_quotas.c.deleted)"},{"line_number":97,"context_line":"    Index(\u0027project_user_quotas_user_id_deleted_idx\u0027,"},{"line_number":98,"context_line":"          project_user_quotas.c.user_id, project_user_quotas.c.deleted)"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAPn%2F%2F89I%3D","line":95,"in_reply_to":"AAAAPn%2F%2F9j4%3D","updated":"2013-06-17 15:00:11.000000000","message":"Done","commit_id":"43c862fe1a849af94bf8fcbfa14fa5dfb49268b5"}],"nova/db/sqlalchemy/models.py":[{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"bc638aa0c56414f426e6ccd00cd98dc356d3a2e3","unresolved":false,"context_lines":[{"line_number":339,"context_line":"    __tablename__ \u003d \u0027project_user_quotas\u0027"},{"line_number":340,"context_line":"    id \u003d Column(Integer, primary_key\u003dTrue)"},{"line_number":341,"context_line":""},{"line_number":342,"context_line":"    project_id \u003d Column(String(255), index\u003dTrue)"},{"line_number":343,"context_line":"    user_id \u003d Column(String(255), index\u003dTrue)"},{"line_number":344,"context_line":""},{"line_number":345,"context_line":"    resource \u003d Column(String(255))"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAOn%2F%2FY7w%3D","line":342,"updated":"2013-05-11 14:31:14.000000000","message":"I bet that this won\u0027t create index at all. (You should create indexes in migration). In our \"nova\" case, we are using declarative_base (Base and NovaBase) only for mapping (not migrating). And indexes require migrations..","commit_id":"e0b9b371eb4f94be2e3480717ccc40a0e4819c56"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"7f041e8b13aa684f8d3cfb7f477133b9b415d9c7","unresolved":false,"context_lines":[{"line_number":337,"context_line":"    \"\"\"Represents a single quota override for a user with in a project.\"\"\""},{"line_number":338,"context_line":""},{"line_number":339,"context_line":"    __tablename__ \u003d \u0027project_user_quotas\u0027"},{"line_number":340,"context_line":"    id \u003d Column(Integer, primary_key\u003dTrue)"},{"line_number":341,"context_line":""},{"line_number":342,"context_line":"    project_id \u003d Column(String(255), index\u003dTrue)"},{"line_number":343,"context_line":"    user_id \u003d Column(String(255), index\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAPn%2F%2F%2F3k%3D","line":340,"updated":"2013-06-14 22:01:56.000000000","message":"specify in __table_args__ indexes.","commit_id":"542e71017f550a13d40465d7f44db55556d0e023"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"7f041e8b13aa684f8d3cfb7f477133b9b415d9c7","unresolved":false,"context_lines":[{"line_number":339,"context_line":"    __tablename__ \u003d \u0027project_user_quotas\u0027"},{"line_number":340,"context_line":"    id \u003d Column(Integer, primary_key\u003dTrue)"},{"line_number":341,"context_line":""},{"line_number":342,"context_line":"    project_id \u003d Column(String(255), index\u003dTrue)"},{"line_number":343,"context_line":"    user_id \u003d Column(String(255), index\u003dTrue)"},{"line_number":344,"context_line":""},{"line_number":345,"context_line":"    resource \u003d Column(String(255))"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAPn%2F%2F%2F3g%3D","line":342,"updated":"2013-06-14 22:01:56.000000000","message":"use explicit nullable for all Columns","commit_id":"542e71017f550a13d40465d7f44db55556d0e023"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"0836748a798361741f838dbfec9a14579cfef9ae","unresolved":false,"context_lines":[{"line_number":384,"context_line":"              \u0027project_id\u0027, \u0027deleted\u0027),"},{"line_number":385,"context_line":"        Index(\u0027project_user_quotas_user_id_deleted_idx\u0027,"},{"line_number":386,"context_line":"              \u0027user_id\u0027, \u0027deleted\u0027)"},{"line_number":387,"context_line":"    )"},{"line_number":388,"context_line":"    id \u003d Column(Integer, primary_key\u003dTrue, nullable\u003dFalse)"},{"line_number":389,"context_line":""},{"line_number":390,"context_line":"    project_id \u003d Column(String(255), nullable\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAPn%2F%2F9ic%3D","line":387,"updated":"2013-06-17 11:24:08.000000000","message":"specify also the UniqueConstraint here","commit_id":"43c862fe1a849af94bf8fcbfa14fa5dfb49268b5"},{"author":{"_account_id":4428,"name":"Liyingjun","email":"yinjalee@163.com","username":"liyingjun"},"change_message_id":"7c40491944c621aaa4ba1feaf60aa22d8a20550e","unresolved":false,"context_lines":[{"line_number":384,"context_line":"              \u0027project_id\u0027, \u0027deleted\u0027),"},{"line_number":385,"context_line":"        Index(\u0027project_user_quotas_user_id_deleted_idx\u0027,"},{"line_number":386,"context_line":"              \u0027user_id\u0027, \u0027deleted\u0027)"},{"line_number":387,"context_line":"    )"},{"line_number":388,"context_line":"    id \u003d Column(Integer, primary_key\u003dTrue, nullable\u003dFalse)"},{"line_number":389,"context_line":""},{"line_number":390,"context_line":"    project_id \u003d Column(String(255), nullable\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAPn%2F%2F89E%3D","line":387,"in_reply_to":"AAAAPn%2F%2F9ic%3D","updated":"2013-06-17 15:00:11.000000000","message":"Done","commit_id":"43c862fe1a849af94bf8fcbfa14fa5dfb49268b5"}],"nova/quota.py":[{"author":{"_account_id":1501,"name":"Phil Day","email":"philip.day@hp.com","username":"philip-day"},"change_message_id":"a2aabde531fd4ac9ca5d5ee9cce03e4080347202","unresolved":false,"context_lines":[{"line_number":92,"context_line":"    quota information.  The default driver utilizes the local"},{"line_number":93,"context_line":"    database."},{"line_number":94,"context_line":"    \"\"\""},{"line_number":95,"context_line":"    def get_by_user(self, context, project_id, user_id, resource):"},{"line_number":96,"context_line":"        \"\"\"Get a specific quota by user.\"\"\""},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"        return db.quota_get(context, project_id, user_id, resource)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAOn%2F%2FZLU%3D","line":95,"updated":"2013-05-11 01:35:20.000000000","message":"This needs to be renamed to something like get_by_project_and_user","commit_id":"d9177d4018047d31e66c6bf3d981f2c2d7a8607c"},{"author":{"_account_id":5652,"name":"David Ripton","email":"dripton@redhat.com","username":"dripton"},"change_message_id":"3100a41cd6c8e10d5eb9a980afe786c04dd78ff5","unresolved":false,"context_lines":[{"line_number":158,"context_line":"        # any)"},{"line_number":159,"context_line":"        if project_id \u003d\u003d context.project_id:"},{"line_number":160,"context_line":"            quota_class \u003d context.quota_class"},{"line_number":161,"context_line":"        if quota_class:"},{"line_number":162,"context_line":"            class_quotas \u003d db.quota_class_get_all_by_name(context, quota_class)"},{"line_number":163,"context_line":"        else:"},{"line_number":164,"context_line":"            class_quotas \u003d {}"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAPX%2F%2F8ow%3D","line":161,"updated":"2013-06-05 14:35:42.000000000","message":"quota_class can be undefined here, if the previous if was false.","commit_id":"41ea3f0126c08d530535a3fa37dc2a2f1f354cb9"}]}
