)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"e2475965a129a0e9fe9d98a50754b78d7c914ec4","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"- move \u0027input\u0027, \u0027message\u0027 and \u0027result\u0027 columns to table \u0027task_info\u0027"},{"line_number":10,"context_line":"- introduce migration script for the above db changes."},{"line_number":11,"context_line":"- seperate out soft delete columns to \u0027SoftDeleteMixin\u0027 from \u0027ModelBase\u0027"},{"line_number":12,"context_line":"- introduce GlanceBase(SoftDeleteMixin, ModelBase). Have it extended by respective model entities."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"partly implements bp async-glance-workers"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":18,"id":"AAAATn%2F%2BK9w%3D","line":11,"updated":"2013-11-29 21:53:33.000000000","message":"I feel that the Mixin earlier introduced in this MP is already introduced in master by a commit for porting oslo DB code. \n\n\nBasically, now this patch does not introduce any Mixin.","commit_id":"1dac387d6700b8d11f07919f59d09f7d28f8cf4b"}],"glance/db/sqlalchemy/api.py":[{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"b431d17caef38dfbd51e98b8b0e2f7ae76f693e7","unresolved":false,"context_lines":[{"line_number":22,"context_line":"\"\"\""},{"line_number":23,"context_line":"Defines interface for DB access"},{"line_number":24,"context_line":"\"\"\""},{"line_number":25,"context_line":"import copy"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"import logging"},{"line_number":28,"context_line":"import time"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2Ftu8%3D","line":25,"updated":"2013-10-30 04:12:17.000000000","message":"seems this new line on the wrong place, move line 25 to 26 is make sense to me.\n\n1. keep a blank line before first \"import\" sentence.\n2. the python built-in modular importing sentence should in one group, without blanks.","commit_id":"4b0e97e47384abcc2fa289c5453e32636dd2db44"},{"author":{"_account_id":7703,"name":"Venkatesh Sampath","email":"venkatesh.sampath@outlook.com","username":"venkateshsampath"},"change_message_id":"4e20800df49244e984928abe96e51bbe0b7d8b68","unresolved":false,"context_lines":[{"line_number":22,"context_line":"\"\"\""},{"line_number":23,"context_line":"Defines interface for DB access"},{"line_number":24,"context_line":"\"\"\""},{"line_number":25,"context_line":"import copy"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"import logging"},{"line_number":28,"context_line":"import time"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2FszI%3D","line":25,"in_reply_to":"AAAATn%2F%2Ftu8%3D","updated":"2013-10-30 09:51:53.000000000","message":"fixed the import grouping.","commit_id":"4b0e97e47384abcc2fa289c5453e32636dd2db44"},{"author":{"_account_id":8759,"name":"Arnaud Legendre","email":"arnaudleg@gmail.com","username":"arnaud"},"change_message_id":"4d6424b21f2e99c1a5ec14cedef6490f65b6a1bc","unresolved":false,"context_lines":[{"line_number":1212,"context_line":"    try:"},{"line_number":1213,"context_line":"        task_info_ref \u003d query.one()"},{"line_number":1214,"context_line":"    except sa_orm.exc.NoResultFound:"},{"line_number":1215,"context_line":"        task_info_ref \u003d None"},{"line_number":1216,"context_line":""},{"line_number":1217,"context_line":"    return task_info_ref"},{"line_number":1218,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2FZaI%3D","line":1215,"updated":"2013-11-07 09:12:40.000000000","message":"I would add a log here","commit_id":"ab88de79b69dc99770c760149628cfbbeddfc0a6"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"7166bcaf09402354fb50a6d0dcde5871551eafce","unresolved":false,"context_lines":[{"line_number":1237,"context_line":"def task_update(context, task_id, values, session\u003dNone):"},{"line_number":1238,"context_line":"    \"\"\"Update a task object\"\"\""},{"line_number":1239,"context_line":"    session \u003d session or _get_session()"},{"line_number":1240,"context_line":"    task_ref \u003d _task_get(context, task_id, session)"},{"line_number":1241,"context_line":"    task_info_values \u003d {"},{"line_number":1242,"context_line":"        \u0027input\u0027: values.pop(\u0027input\u0027, None),"},{"line_number":1243,"context_line":"        \u0027result\u0027: values.pop(\u0027result\u0027, None),"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2FV%2Bk%3D","line":1240,"updated":"2013-11-08 20:02:31.000000000","message":"this is a bug here.\n\nIf task_id is valid i.e task is created, we ensure that there is a entry in info table as well. When a update is tried on the same task with new task info values as None, existing values in the DB are overridden with None.\n\nThis is due to _task_get just gets the values from task table and not from the task_info table. The public task_get method however, seems to return correct value.","commit_id":"ab88de79b69dc99770c760149628cfbbeddfc0a6"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"467bf95f362deba6e80e567ae3a1c251e940a316","unresolved":false,"context_lines":[{"line_number":1244,"context_line":"    }"},{"line_number":1245,"context_line":"    for key in task_info_values:"},{"line_number":1246,"context_line":"        if not task_info_values[key]:"},{"line_number":1247,"context_line":"            task_info_values[key] \u003d old_task_info_values[key]"},{"line_number":1248,"context_line":""},{"line_number":1249,"context_line":"    task_info_ref \u003d _task_info_update(context,"},{"line_number":1250,"context_line":"                                      task_id,"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2FQDk%3D","line":1247,"updated":"2013-11-12 08:51:23.000000000","message":"If so upper layer how to remove a value from task info? for example if upper code want to remove \u0027result\u0027 value from a task, then he will pass a None in. @nikil","commit_id":"961ef4f5c129b7ae4e1239169360a2462a442d33"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"d2382def7189e10ed937021b8f080e85b3fa32cd","unresolved":false,"context_lines":[{"line_number":1244,"context_line":"    }"},{"line_number":1245,"context_line":"    for key in task_info_values:"},{"line_number":1246,"context_line":"        if not task_info_values[key]:"},{"line_number":1247,"context_line":"            task_info_values[key] \u003d old_task_info_values[key]"},{"line_number":1248,"context_line":""},{"line_number":1249,"context_line":"    task_info_ref \u003d _task_info_update(context,"},{"line_number":1250,"context_line":"                                      task_id,"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAATn%2F%2BmuU%3D","line":1247,"updated":"2013-11-22 15:32:54.000000000","message":"zhi\u0027s question is still, valid. Will try to address it soon.","commit_id":"ad22cd1c7706e33eb30a46d575d071984e8bbc02"},{"author":{"_account_id":4463,"name":"iccha-sethi","email":"iccha.sethi@rackspace.com","username":"iccha-sethi"},"change_message_id":"b60b147b9425deeaac69126dad795af6cae30618","unresolved":false,"context_lines":[{"line_number":560,"context_line":"    if \u0027deleted\u0027 in filters:"},{"line_number":561,"context_line":"        deleted_filter \u003d filters.pop(\u0027deleted\u0027)"},{"line_number":562,"context_line":"        image_conditions.append(models.Image.deleted \u003d\u003d deleted_filter)"},{"line_number":563,"context_line":"        # TODO(bcwaldon): handle this logic in registry server"},{"line_number":564,"context_line":"        if not deleted_filter:"},{"line_number":565,"context_line":"            image_statuses \u003d [s for s in STATUSES if s !\u003d \u0027killed\u0027]"},{"line_number":566,"context_line":"            image_conditions.append(models.Image.status.in_(image_statuses))"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAATn%2F%2BYEs%3D","side":"PARENT","line":563,"updated":"2013-11-26 19:44:16.000000000","message":"why is this line being removed in this patch?","commit_id":"a33dbeec1f287b264cda3b50a47a7418e3f04c96"},{"author":{"_account_id":7703,"name":"Venkatesh Sampath","email":"venkatesh.sampath@outlook.com","username":"venkateshsampath"},"change_message_id":"bd306bb6fe8c0dcccc2727c05d68123458bee00e","unresolved":false,"context_lines":[{"line_number":560,"context_line":"    if \u0027deleted\u0027 in filters:"},{"line_number":561,"context_line":"        deleted_filter \u003d filters.pop(\u0027deleted\u0027)"},{"line_number":562,"context_line":"        image_conditions.append(models.Image.deleted \u003d\u003d deleted_filter)"},{"line_number":563,"context_line":"        # TODO(bcwaldon): handle this logic in registry server"},{"line_number":564,"context_line":"        if not deleted_filter:"},{"line_number":565,"context_line":"            image_statuses \u003d [s for s in STATUSES if s !\u003d \u0027killed\u0027]"},{"line_number":566,"context_line":"            image_conditions.append(models.Image.status.in_(image_statuses))"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAATn%2F%2BUjE%3D","side":"PARENT","line":563,"in_reply_to":"AAAATn%2F%2BYEs%3D","updated":"2013-11-27 13:34:55.000000000","message":"some time ago, eddie mentioned me during one of our review discussions on (db query optimization) that this line is no more needed and i can remove it. remembered that and removed it. But from other discussion, i realize that may be it is not right to remove as part of this patch. may be will submit as a seperate patch. will re-put it back again.","commit_id":"a33dbeec1f287b264cda3b50a47a7418e3f04c96"},{"author":{"_account_id":4463,"name":"iccha-sethi","email":"iccha.sethi@rackspace.com","username":"iccha-sethi"},"change_message_id":"b60b147b9425deeaac69126dad795af6cae30618","unresolved":false,"context_lines":[{"line_number":1177,"context_line":"    \"\"\"Create an TaskInfo object\"\"\""},{"line_number":1178,"context_line":"    session \u003d session or _get_session()"},{"line_number":1179,"context_line":"    task_info_values \u003d dict([(k, v)"},{"line_number":1180,"context_line":"                             for k, v in values.iteritems()"},{"line_number":1181,"context_line":"                             if v is not None])"},{"line_number":1182,"context_line":"    if len(task_info_values) \u003e 0:"},{"line_number":1183,"context_line":"        task_info_ref \u003d models.TaskInfo()"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAATn%2F%2BX1s%3D","line":1180,"updated":"2013-11-26 19:44:16.000000000","message":"This None check might be dangerous. Because if input, result and message are not provided during task create then the task info table will not have an entry for this task. this might be an issue during task info update","commit_id":"338a8ed5cc07f99b3a0d6df32ff660b106f8597e"},{"author":{"_account_id":7703,"name":"Venkatesh Sampath","email":"venkatesh.sampath@outlook.com","username":"venkateshsampath"},"change_message_id":"bd306bb6fe8c0dcccc2727c05d68123458bee00e","unresolved":false,"context_lines":[{"line_number":1177,"context_line":"    \"\"\"Create an TaskInfo object\"\"\""},{"line_number":1178,"context_line":"    session \u003d session or _get_session()"},{"line_number":1179,"context_line":"    task_info_values \u003d dict([(k, v)"},{"line_number":1180,"context_line":"                             for k, v in values.iteritems()"},{"line_number":1181,"context_line":"                             if v is not None])"},{"line_number":1182,"context_line":"    if len(task_info_values) \u003e 0:"},{"line_number":1183,"context_line":"        task_info_ref \u003d models.TaskInfo()"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAATn%2F%2BUiY%3D","line":1180,"in_reply_to":"AAAATn%2F%2BX1s%3D","updated":"2013-11-27 13:34:55.000000000","message":"no. i think in the task info update, we check if the record exists and if no, we create a new task_info record. hence this None check should be fine.","commit_id":"338a8ed5cc07f99b3a0d6df32ff660b106f8597e"},{"author":{"_account_id":4463,"name":"iccha-sethi","email":"iccha.sethi@rackspace.com","username":"iccha-sethi"},"change_message_id":"b60b147b9425deeaac69126dad795af6cae30618","unresolved":false,"context_lines":[{"line_number":1182,"context_line":"    if len(task_info_values) \u003e 0:"},{"line_number":1183,"context_line":"        task_info_ref \u003d models.TaskInfo()"},{"line_number":1184,"context_line":"        task_info_ref.task_id \u003d task_id"},{"line_number":1185,"context_line":"        task_info_ref.update(values)"},{"line_number":1186,"context_line":"        task_info_ref.save(session\u003dsession)"},{"line_number":1187,"context_line":"    return _task_info_format(task_info_ref)"},{"line_number":1188,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAATn%2F%2BX3Q%3D","line":1185,"updated":"2013-11-26 19:44:16.000000000","message":"should this be task_info_values?","commit_id":"338a8ed5cc07f99b3a0d6df32ff660b106f8597e"},{"author":{"_account_id":7703,"name":"Venkatesh Sampath","email":"venkatesh.sampath@outlook.com","username":"venkateshsampath"},"change_message_id":"bd306bb6fe8c0dcccc2727c05d68123458bee00e","unresolved":false,"context_lines":[{"line_number":1182,"context_line":"    if len(task_info_values) \u003e 0:"},{"line_number":1183,"context_line":"        task_info_ref \u003d models.TaskInfo()"},{"line_number":1184,"context_line":"        task_info_ref.task_id \u003d task_id"},{"line_number":1185,"context_line":"        task_info_ref.update(values)"},{"line_number":1186,"context_line":"        task_info_ref.save(session\u003dsession)"},{"line_number":1187,"context_line":"    return _task_info_format(task_info_ref)"},{"line_number":1188,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAATn%2F%2BUik%3D","line":1185,"in_reply_to":"AAAATn%2F%2BX3Q%3D","updated":"2013-11-27 13:34:55.000000000","message":"yes, thanks for pointing this one. will fix it.","commit_id":"338a8ed5cc07f99b3a0d6df32ff660b106f8597e"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"c12691bc5e4bba1e2a970e491ae3ed63c6246dc9","unresolved":false,"context_lines":[{"line_number":1242,"context_line":"        \u0027result\u0027: values.pop(\u0027result\u0027, None),"},{"line_number":1243,"context_line":"        \u0027message\u0027: values.pop(\u0027message\u0027, None),"},{"line_number":1244,"context_line":"    }"},{"line_number":1245,"context_line":"    for key in task_info_values:"},{"line_number":1246,"context_line":"        if not task_info_values[key]:"},{"line_number":1247,"context_line":"            task_info_values[key] \u003d old_task_info_values[key]"},{"line_number":1248,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAATn%2F%2BZtU%3D","line":1245,"updated":"2013-11-26 14:19:53.000000000","message":"Zhi Yan Liu\t\tNov 12\n\nIf so upper layer how to remove a value from task info? for example if upper code want to remove \u0027result\u0027 value from a task, then he will pass a None in. @nikil","commit_id":"338a8ed5cc07f99b3a0d6df32ff660b106f8597e"},{"author":{"_account_id":4463,"name":"iccha-sethi","email":"iccha.sethi@rackspace.com","username":"iccha-sethi"},"change_message_id":"b60b147b9425deeaac69126dad795af6cae30618","unresolved":false,"context_lines":[{"line_number":1246,"context_line":"        if not task_info_values[key]:"},{"line_number":1247,"context_line":"            task_info_values[key] \u003d old_task_info_values[key]"},{"line_number":1248,"context_line":""},{"line_number":1249,"context_line":"    task_info_ref \u003d _task_info_update(context,"},{"line_number":1250,"context_line":"                                      task_id,"},{"line_number":1251,"context_line":"                                      task_info_values,"},{"line_number":1252,"context_line":"                                      session)"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAATn%2F%2BXzw%3D","line":1249,"updated":"2013-11-26 19:44:16.000000000","message":"should we even call update for info if nothing has changed? we should maybe have a check here.\n\nNikhil: use the approach in 1180 to not update unless value is provided.","commit_id":"338a8ed5cc07f99b3a0d6df32ff660b106f8597e"},{"author":{"_account_id":4463,"name":"iccha-sethi","email":"iccha.sethi@rackspace.com","username":"iccha-sethi"},"change_message_id":"b60b147b9425deeaac69126dad795af6cae30618","unresolved":false,"context_lines":[{"line_number":1407,"context_line":"        task_info_dict \u003d {"},{"line_number":1408,"context_line":"            \u0027input\u0027: task_info_ref[\u0027input\u0027],"},{"line_number":1409,"context_line":"            \u0027result\u0027: task_info_ref[\u0027result\u0027],"},{"line_number":1410,"context_line":"            \u0027message\u0027: task_info_ref[\u0027message\u0027],"},{"line_number":1411,"context_line":"        }"},{"line_number":1412,"context_line":"        task_dict.update(task_info_dict)"},{"line_number":1413,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAATn%2F%2BXzY%3D","line":1410,"updated":"2013-11-26 19:44:16.000000000","message":"do we want to keep updated_at separately for task and task info?","commit_id":"338a8ed5cc07f99b3a0d6df32ff660b106f8597e"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"ef2e87814a26de3d2831fb6ae91b6f69f7878fbb","unresolved":false,"context_lines":[{"line_number":1165,"context_line":"    \"\"\"Format a task info ref for consumption outside of this module\"\"\""},{"line_number":1166,"context_line":"    if task_info_ref is None:"},{"line_number":1167,"context_line":"        return {}"},{"line_number":1168,"context_line":"    return {"},{"line_number":1169,"context_line":"        \u0027task_id\u0027: task_info_ref[\u0027task_id\u0027],"},{"line_number":1170,"context_line":"        \u0027input\u0027: task_info_ref[\u0027input\u0027],"},{"line_number":1171,"context_line":"        \u0027result\u0027: task_info_ref[\u0027result\u0027],"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F%2BMK4%3D","line":1168,"updated":"2013-11-29 13:06:44.000000000","message":"Just a question - can we you use to_dict() method here?","commit_id":"1dac387d6700b8d11f07919f59d09f7d28f8cf4b"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"5a31ad1c47907641a48a429c9db7d6a81528d763","unresolved":false,"context_lines":[{"line_number":1165,"context_line":"    \"\"\"Format a task info ref for consumption outside of this module\"\"\""},{"line_number":1166,"context_line":"    if task_info_ref is None:"},{"line_number":1167,"context_line":"        return {}"},{"line_number":1168,"context_line":"    return {"},{"line_number":1169,"context_line":"        \u0027task_id\u0027: task_info_ref[\u0027task_id\u0027],"},{"line_number":1170,"context_line":"        \u0027input\u0027: task_info_ref[\u0027input\u0027],"},{"line_number":1171,"context_line":"        \u0027result\u0027: task_info_ref[\u0027result\u0027],"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F%2BHXU%3D","line":1168,"in_reply_to":"AAAATn%2F%2BLE0%3D","updated":"2013-12-03 09:01:49.000000000","message":"My suggestion is simple - we should keep code clean so it makes a sense to avoid code duplication, if it is possible.","commit_id":"1dac387d6700b8d11f07919f59d09f7d28f8cf4b"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"81578556665a6a54ad4e6898587aae365460460d","unresolved":false,"context_lines":[{"line_number":1165,"context_line":"    \"\"\"Format a task info ref for consumption outside of this module\"\"\""},{"line_number":1166,"context_line":"    if task_info_ref is None:"},{"line_number":1167,"context_line":"        return {}"},{"line_number":1168,"context_line":"    return {"},{"line_number":1169,"context_line":"        \u0027task_id\u0027: task_info_ref[\u0027task_id\u0027],"},{"line_number":1170,"context_line":"        \u0027input\u0027: task_info_ref[\u0027input\u0027],"},{"line_number":1171,"context_line":"        \u0027result\u0027: task_info_ref[\u0027result\u0027],"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F%2BLE0%3D","line":1168,"in_reply_to":"AAAATn%2F%2BMK4%3D","updated":"2013-11-29 20:41:44.000000000","message":"Why do you suggest so, there are other places in this module which return the constructed dict directly?\n\nDo you think we have a chance of having circular reference here?\n\n(Relatively speaking, this method is equivalent to a to_dict implementation in some other places in Glance anyways)","commit_id":"1dac387d6700b8d11f07919f59d09f7d28f8cf4b"},{"author":{"_account_id":616,"name":"Mark Washenberger","email":"mark.washenberger@markwash.net","username":"markwash"},"change_message_id":"83b753afaebc2d357b822efb9e8bf16a844da2f5","unresolved":false,"context_lines":[{"line_number":1228,"context_line":"        task_ref \u003d models.Task()"},{"line_number":1229,"context_line":"        _task_update(context, task_ref, values, session\u003dsession)"},{"line_number":1230,"context_line":""},{"line_number":1231,"context_line":"        if task_info_values:"},{"line_number":1232,"context_line":"            _task_info_create(context,"},{"line_number":1233,"context_line":"                              task_ref.id,"},{"line_number":1234,"context_line":"                              task_info_values,"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAATn%2F%2BE2Q%3D","line":1231,"updated":"2013-12-02 20:21:58.000000000","message":"I\u0027m curious if there is any strong reason to create task rows without corresponding task_info rows. Maybe we should just create a task_info row where all the info fields are NULL?","commit_id":"a484e093e012b4c7278f2b6027814808a0cd6870"},{"author":{"_account_id":7703,"name":"Venkatesh Sampath","email":"venkatesh.sampath@outlook.com","username":"venkateshsampath"},"change_message_id":"c0652e99b64098e22d2a00bdcb8a70202f5dd9a2","unresolved":false,"context_lines":[{"line_number":1228,"context_line":"        task_ref \u003d models.Task()"},{"line_number":1229,"context_line":"        _task_update(context, task_ref, values, session\u003dsession)"},{"line_number":1230,"context_line":""},{"line_number":1231,"context_line":"        if task_info_values:"},{"line_number":1232,"context_line":"            _task_info_create(context,"},{"line_number":1233,"context_line":"                              task_ref.id,"},{"line_number":1234,"context_line":"                              task_info_values,"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAATn%2F%2BCEg%3D","line":1231,"in_reply_to":"AAAATn%2F%2BE2Q%3D","updated":"2013-12-03 08:55:50.000000000","message":"Hi Mark, what I initially thought was aTaskInfo without any values (values as NULL) is a redundant record. Hence thought of initializing lazily via task_update.\nBut if we prefer to have a task_info records for every task, that should not be a problem. I think Nikhil has already done this change in PS-21.","commit_id":"a484e093e012b4c7278f2b6027814808a0cd6870"},{"author":{"_account_id":616,"name":"Mark Washenberger","email":"mark.washenberger@markwash.net","username":"markwash"},"change_message_id":"83b753afaebc2d357b822efb9e8bf16a844da2f5","unresolved":false,"context_lines":[{"line_number":1288,"context_line":"    return _task_format(task_ref, task_ref.info)"},{"line_number":1289,"context_line":""},{"line_number":1290,"context_line":""},{"line_number":1291,"context_line":"def task_get_all(context, filters\u003dNone, marker\u003dNone, limit\u003dNone,"},{"line_number":1292,"context_line":"                 sort_key\u003d\u0027created_at\u0027, sort_dir\u003d\u0027desc\u0027, admin_as_user\u003dFalse):"},{"line_number":1293,"context_line":"    \"\"\""},{"line_number":1294,"context_line":"    Get all tasks that match zero or more filters."}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAATn%2F%2BEs0%3D","line":1291,"updated":"2013-12-02 20:21:58.000000000","message":"I kinda thought in this PS that task_get_all would keep returning all of the task_info as well. And that we would later change task_get_all to return only the task part when we had an appropriate domain fix ready.\n\nI\u0027d like to keep returning the full task here for the time being so that we can move forward with other items without waiting.","commit_id":"a484e093e012b4c7278f2b6027814808a0cd6870"},{"author":{"_account_id":7703,"name":"Venkatesh Sampath","email":"venkatesh.sampath@outlook.com","username":"venkateshsampath"},"change_message_id":"c0652e99b64098e22d2a00bdcb8a70202f5dd9a2","unresolved":false,"context_lines":[{"line_number":1288,"context_line":"    return _task_format(task_ref, task_ref.info)"},{"line_number":1289,"context_line":""},{"line_number":1290,"context_line":""},{"line_number":1291,"context_line":"def task_get_all(context, filters\u003dNone, marker\u003dNone, limit\u003dNone,"},{"line_number":1292,"context_line":"                 sort_key\u003d\u0027created_at\u0027, sort_dir\u003d\u0027desc\u0027, admin_as_user\u003dFalse):"},{"line_number":1293,"context_line":"    \"\"\""},{"line_number":1294,"context_line":"    Get all tasks that match zero or more filters."}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAATn%2F%2BCD8%3D","line":1291,"in_reply_to":"AAAATn%2F%2BEs0%3D","updated":"2013-12-03 08:55:50.000000000","message":"I removed task_info from task_get_all yesterday thinking that there will a boost in performance by avoiding looking up for task_info. But was bit skeptical on doing it. After committing the PS, also had a word with Nikhil mentioning that if at all we feel we need task_info for now, we can revert this change back.\nNikhil has already done this change as well on PS-21.\nThanks for the feedback Mark.","commit_id":"a484e093e012b4c7278f2b6027814808a0cd6870"},{"author":{"_account_id":4463,"name":"iccha-sethi","email":"iccha.sethi@rackspace.com","username":"iccha-sethi"},"change_message_id":"9d4223296b55a0c39121b29c5fbdc99e50797a57","unresolved":false,"context_lines":[{"line_number":1193,"context_line":"    if task_info_ref:"},{"line_number":1194,"context_line":"        task_info_ref.update(values)"},{"line_number":1195,"context_line":"        task_info_ref.save(session\u003dsession)"},{"line_number":1196,"context_line":"    else:"},{"line_number":1197,"context_line":"        _task_info_create(context, task_id, values, session)"},{"line_number":1198,"context_line":"    return _task_info_format(task_info_ref)"},{"line_number":1199,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAATn%2F%2BAgM%3D","line":1196,"updated":"2013-12-03 15:03:08.000000000","message":"cince in line 1228 we are always creating task info row, do we need this?","commit_id":"27df38c9b5d7b1a247cd5bc68619980f1f27ea36"},{"author":{"_account_id":616,"name":"Mark Washenberger","email":"mark.washenberger@markwash.net","username":"markwash"},"change_message_id":"527e545798136b84616ee45663163ea02c90e9d3","unresolved":false,"context_lines":[{"line_number":1331,"context_line":""},{"line_number":1332,"context_line":"    tasks \u003d []"},{"line_number":1333,"context_line":"    for task_ref in task_refs:"},{"line_number":1334,"context_line":"        task_info_ref \u003d _task_info_get(context, task_ref.id, session)"},{"line_number":1335,"context_line":"        tasks.append(_task_format(task_ref, task_info_ref))"},{"line_number":1336,"context_line":""},{"line_number":1337,"context_line":"    return tasks"}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAATn%2F994Y%3D","line":1334,"updated":"2013-12-03 22:29:43.000000000","message":"Please do not do this. Use a joinedload() above in the query so that all of the results come back and once in 1 query and we do not need to do N + 1 queries for N results.","commit_id":"fbc3e8f2e5014d44da91160c418848d53d0d1a57"},{"author":{"_account_id":7703,"name":"Venkatesh Sampath","email":"venkatesh.sampath@outlook.com","username":"venkateshsampath"},"change_message_id":"522f8040a16b12bcec868000d9ec3928a55b55d4","unresolved":false,"context_lines":[{"line_number":1331,"context_line":""},{"line_number":1332,"context_line":"    tasks \u003d []"},{"line_number":1333,"context_line":"    for task_ref in task_refs:"},{"line_number":1334,"context_line":"        task_info_ref \u003d _task_info_get(context, task_ref.id, session)"},{"line_number":1335,"context_line":"        tasks.append(_task_format(task_ref, task_info_ref))"},{"line_number":1336,"context_line":""},{"line_number":1337,"context_line":"    return tasks"}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAATn%2F97N4%3D","line":1334,"in_reply_to":"AAAATn%2F994Y%3D","updated":"2013-12-04 12:14:35.000000000","message":"Thank you so much Mark. I have fixed it in PS-27.","commit_id":"fbc3e8f2e5014d44da91160c418848d53d0d1a57"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"404622d32b9fadda7e0776bda638909157a33b82","unresolved":false,"context_lines":[{"line_number":24,"context_line":""},{"line_number":25,"context_line":"import logging"},{"line_number":26,"context_line":"import time"},{"line_number":27,"context_line":"from glance.openstack.common.gettextutils import _"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"from oslo.config import cfg"},{"line_number":30,"context_line":"import sqlalchemy"}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAATn%2F95d4%3D","line":27,"updated":"2013-12-04 18:38:52.000000000","message":"Not required","commit_id":"b09eed9146617e20ccb756773747dcc4801e6eb2"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"404622d32b9fadda7e0776bda638909157a33b82","unresolved":false,"context_lines":[{"line_number":1228,"context_line":"    return task_get(context, task_ref.id, session)"},{"line_number":1229,"context_line":""},{"line_number":1230,"context_line":""},{"line_number":1231,"context_line":"def _pop_task_info_values(values):"},{"line_number":1232,"context_line":"    return dict([(k, v)"},{"line_number":1233,"context_line":"                 for k, v in values.items()"},{"line_number":1234,"context_line":"                 if k in [\u0027input\u0027, \u0027result\u0027, \u0027message\u0027]])"}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAATn%2F95ds%3D","line":1231,"updated":"2013-12-04 18:38:52.000000000","message":"Method needs a new name now.","commit_id":"b09eed9146617e20ccb756773747dcc4801e6eb2"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"404622d32b9fadda7e0776bda638909157a33b82","unresolved":false,"context_lines":[{"line_number":1237,"context_line":"def task_update(context, task_id, values, session\u003dNone):"},{"line_number":1238,"context_line":"    \"\"\"Update a task object\"\"\""},{"line_number":1239,"context_line":""},{"line_number":1240,"context_line":"    values \u003d values.copy()"},{"line_number":1241,"context_line":"    session \u003d session or _get_session()"},{"line_number":1242,"context_line":""},{"line_number":1243,"context_line":"    with session.begin():"}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAATn%2F95dM%3D","line":1240,"updated":"2013-12-04 18:38:52.000000000","message":"I\u0027m not sure, if we need this now.","commit_id":"b09eed9146617e20ccb756773747dcc4801e6eb2"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"0ee010d6ac3cf8b11b41d04dc211e6d3881a1e5f","unresolved":false,"context_lines":[{"line_number":1246,"context_line":"        task_ref \u003d _task_get(context, task_id, session)"},{"line_number":1247,"context_line":"        _drop_protected_attrs(models.Task, values)"},{"line_number":1248,"context_line":""},{"line_number":1249,"context_line":"        datetime_now \u003d timeutils.utcnow()"},{"line_number":1250,"context_line":"        values[\u0027updated_at\u0027] \u003d datetime_now"},{"line_number":1251,"context_line":""},{"line_number":1252,"context_line":"        _task_update(context, task_ref, values, session)"}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAATn%2F94ho%3D","line":1249,"updated":"2013-12-04 22:36:01.000000000","message":"deleted this variable","commit_id":"b09eed9146617e20ccb756773747dcc4801e6eb2"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"404622d32b9fadda7e0776bda638909157a33b82","unresolved":false,"context_lines":[{"line_number":1252,"context_line":"        _task_update(context, task_ref, values, session)"},{"line_number":1253,"context_line":""},{"line_number":1254,"context_line":"        if task_info_values:"},{"line_number":1255,"context_line":"            task_info_values[\u0027updated_at\u0027] \u003d datetime_now"},{"line_number":1256,"context_line":"            _task_info_update(context,"},{"line_number":1257,"context_line":"                              task_id,"},{"line_number":1258,"context_line":"                              task_info_values,"}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAATn%2F95dA%3D","line":1255,"updated":"2013-12-04 18:38:52.000000000","message":"Not needed anymore.","commit_id":"b09eed9146617e20ccb756773747dcc4801e6eb2"},{"author":{"_account_id":616,"name":"Mark Washenberger","email":"mark.washenberger@markwash.net","username":"markwash"},"change_message_id":"4e93d7d641e686b02e14dae6e22d0a4580ac70d8","unresolved":false,"context_lines":[{"line_number":1192,"context_line":"def _task_info_create(context, task_id, values, session\u003dNone):"},{"line_number":1193,"context_line":"    \"\"\"Create an TaskInfo object\"\"\""},{"line_number":1194,"context_line":"    session \u003d session or _get_session()"},{"line_number":1195,"context_line":"    task_info_values \u003d dict([(k, v)"},{"line_number":1196,"context_line":"                             for k, v in values.iteritems()])"},{"line_number":1197,"context_line":"    task_info_ref \u003d models.TaskInfo()"},{"line_number":1198,"context_line":"    task_info_ref.task_id \u003d task_id"}],"source_content_type":"text/x-python","patch_set":28,"id":"AAAATn%2F94RE%3D","line":1195,"updated":"2013-12-04 23:04:14.000000000","message":"What does this and the line below it accomplish?","commit_id":"7cc77b2820193d8d8898f509048d98f495812362"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"6748d6e62be6a2c0a260f02e95dbfec06fa8f531","unresolved":false,"context_lines":[{"line_number":1192,"context_line":"def _task_info_create(context, task_id, values, session\u003dNone):"},{"line_number":1193,"context_line":"    \"\"\"Create an TaskInfo object\"\"\""},{"line_number":1194,"context_line":"    session \u003d session or _get_session()"},{"line_number":1195,"context_line":"    task_info_values \u003d dict([(k, v)"},{"line_number":1196,"context_line":"                             for k, v in values.iteritems()])"},{"line_number":1197,"context_line":"    task_info_ref \u003d models.TaskInfo()"},{"line_number":1198,"context_line":"    task_info_ref.task_id \u003d task_id"}],"source_content_type":"text/x-python","patch_set":28,"id":"AAAATn%2F94Nw%3D","line":1195,"in_reply_to":"AAAATn%2F94RE%3D","updated":"2013-12-05 01:55:34.000000000","message":"Sorry, this is a blunder.","commit_id":"7cc77b2820193d8d8898f509048d98f495812362"},{"author":{"_account_id":616,"name":"Mark Washenberger","email":"mark.washenberger@markwash.net","username":"markwash"},"change_message_id":"4e93d7d641e686b02e14dae6e22d0a4580ac70d8","unresolved":false,"context_lines":[{"line_number":1232,"context_line":"    values \u003d values.copy()"},{"line_number":1233,"context_line":"    session \u003d session or _get_session()"},{"line_number":1234,"context_line":"    with session.begin():"},{"line_number":1235,"context_line":"        task_info_values \u003d _get_task_info_values(values)"},{"line_number":1236,"context_line":""},{"line_number":1237,"context_line":"        task_ref \u003d models.Task()"},{"line_number":1238,"context_line":"        _task_update(context, task_ref, values, session\u003dsession)"}],"source_content_type":"text/x-python","patch_set":28,"id":"AAAATn%2F94PI%3D","line":1235,"updated":"2013-12-04 23:04:14.000000000","message":"It seems like maybe it still makes sense to \"pop\" the values from the dict. Though I\u0027m sure it still works, I\u0027m a tiny bit uncomfortable calling _task_update() with e.g. \u0027input\u0027 still in the values dictionary.","commit_id":"7cc77b2820193d8d8898f509048d98f495812362"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"6748d6e62be6a2c0a260f02e95dbfec06fa8f531","unresolved":false,"context_lines":[{"line_number":1232,"context_line":"    values \u003d values.copy()"},{"line_number":1233,"context_line":"    session \u003d session or _get_session()"},{"line_number":1234,"context_line":"    with session.begin():"},{"line_number":1235,"context_line":"        task_info_values \u003d _get_task_info_values(values)"},{"line_number":1236,"context_line":""},{"line_number":1237,"context_line":"        task_ref \u003d models.Task()"},{"line_number":1238,"context_line":"        _task_update(context, task_ref, values, session\u003dsession)"}],"source_content_type":"text/x-python","patch_set":28,"id":"AAAATn%2F94NU%3D","line":1235,"in_reply_to":"AAAATn%2F94PI%3D","updated":"2013-12-05 01:55:34.000000000","message":"that makes sense, reverting","commit_id":"7cc77b2820193d8d8898f509048d98f495812362"},{"author":{"_account_id":616,"name":"Mark Washenberger","email":"mark.washenberger@markwash.net","username":"markwash"},"change_message_id":"4e93d7d641e686b02e14dae6e22d0a4580ac70d8","unresolved":false,"context_lines":[{"line_number":1257,"context_line":"    session \u003d session or _get_session()"},{"line_number":1258,"context_line":""},{"line_number":1259,"context_line":"    with session.begin():"},{"line_number":1260,"context_line":"        task_info_values \u003d _get_task_info_values(values)"},{"line_number":1261,"context_line":""},{"line_number":1262,"context_line":"        task_ref \u003d _task_get(context, task_id, session)"},{"line_number":1263,"context_line":"        _drop_protected_attrs(models.Task, values)"}],"source_content_type":"text/x-python","patch_set":28,"id":"AAAATn%2F94PA%3D","line":1260,"updated":"2013-12-04 23:04:14.000000000","message":"Similar question about \"popping\" here.","commit_id":"7cc77b2820193d8d8898f509048d98f495812362"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"6748d6e62be6a2c0a260f02e95dbfec06fa8f531","unresolved":false,"context_lines":[{"line_number":1257,"context_line":"    session \u003d session or _get_session()"},{"line_number":1258,"context_line":""},{"line_number":1259,"context_line":"    with session.begin():"},{"line_number":1260,"context_line":"        task_info_values \u003d _get_task_info_values(values)"},{"line_number":1261,"context_line":""},{"line_number":1262,"context_line":"        task_ref \u003d _task_get(context, task_id, session)"},{"line_number":1263,"context_line":"        _drop_protected_attrs(models.Task, values)"}],"source_content_type":"text/x-python","patch_set":28,"id":"AAAATn%2F94NA%3D","line":1260,"in_reply_to":"AAAATn%2F94PA%3D","updated":"2013-12-05 01:55:34.000000000","message":"removing","commit_id":"7cc77b2820193d8d8898f509048d98f495812362"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"e6f4575ba9aa33b8ffd091d39015e0c4c8667deb","unresolved":false,"context_lines":[{"line_number":1202,"context_line":"def _task_info_update(context, task_id, values, session\u003dNone):"},{"line_number":1203,"context_line":"    \"\"\"Update an TaskInfo object\"\"\""},{"line_number":1204,"context_line":"    session \u003d session or _get_session()"},{"line_number":1205,"context_line":"    task_info_ref \u003d _task_info_get(context, task_id, session)"},{"line_number":1206,"context_line":"    task_info_ref.update(values)"},{"line_number":1207,"context_line":"    task_info_ref.save(session\u003dsession)"},{"line_number":1208,"context_line":"    return _task_info_format(task_info_ref)"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAATn%2F9244%3D","line":1205,"updated":"2013-12-05 07:29:19.000000000","message":"nit:\n\n1. \".., session\u003dsession)\"? like you did at other places around session argument.\n\n2. From the code path in context, maybe _task_info_get() will not return a None value in current case, but I still think if we put a check at here it will be safer, Line #1222.","commit_id":"0d7bd85990438aa60ccf3310695fd4c8a080fd15"},{"author":{"_account_id":7703,"name":"Venkatesh Sampath","email":"venkatesh.sampath@outlook.com","username":"venkateshsampath"},"change_message_id":"76b6556c08b22eab7ffa178d4d9376f9812e38a2","unresolved":false,"context_lines":[{"line_number":1202,"context_line":"def _task_info_update(context, task_id, values, session\u003dNone):"},{"line_number":1203,"context_line":"    \"\"\"Update an TaskInfo object\"\"\""},{"line_number":1204,"context_line":"    session \u003d session or _get_session()"},{"line_number":1205,"context_line":"    task_info_ref \u003d _task_info_get(context, task_id, session)"},{"line_number":1206,"context_line":"    task_info_ref.update(values)"},{"line_number":1207,"context_line":"    task_info_ref.save(session\u003dsession)"},{"line_number":1208,"context_line":"    return _task_info_format(task_info_ref)"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAATn%2F91Eg%3D","line":1205,"in_reply_to":"AAAATn%2F9244%3D","updated":"2013-12-05 14:18:26.000000000","message":"Thanks Zhi. Fixing in the next patch set","commit_id":"0d7bd85990438aa60ccf3310695fd4c8a080fd15"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"e6f4575ba9aa33b8ffd091d39015e0c4c8667deb","unresolved":false,"context_lines":[{"line_number":1203,"context_line":"    \"\"\"Update an TaskInfo object\"\"\""},{"line_number":1204,"context_line":"    session \u003d session or _get_session()"},{"line_number":1205,"context_line":"    task_info_ref \u003d _task_info_get(context, task_id, session)"},{"line_number":1206,"context_line":"    task_info_ref.update(values)"},{"line_number":1207,"context_line":"    task_info_ref.save(session\u003dsession)"},{"line_number":1208,"context_line":"    return _task_info_format(task_info_ref)"},{"line_number":1209,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAATn%2F921U%3D","line":1206,"updated":"2013-12-05 07:29:19.000000000","message":"make sure my concern at [1]: so @niknil under current design, we required/assumed upper layer pass all original values into task_update() right? thanks.\n\n[1] https://review.openstack.org/#/c/54252/12/glance/db/sqlalchemy/api.py","commit_id":"0d7bd85990438aa60ccf3310695fd4c8a080fd15"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"a8ffc064c8c2939168c254ad4697e625a3ecbbcd","unresolved":false,"context_lines":[{"line_number":1203,"context_line":"    \"\"\"Update an TaskInfo object\"\"\""},{"line_number":1204,"context_line":"    session \u003d session or _get_session()"},{"line_number":1205,"context_line":"    task_info_ref \u003d _task_info_get(context, task_id, session)"},{"line_number":1206,"context_line":"    task_info_ref.update(values)"},{"line_number":1207,"context_line":"    task_info_ref.save(session\u003dsession)"},{"line_number":1208,"context_line":"    return _task_info_format(task_info_ref)"},{"line_number":1209,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAATn%2F90OA%3D","line":1206,"in_reply_to":"AAAATn%2F90R8%3D","updated":"2013-12-05 16:23:09.000000000","message":"make sense to me, thanks.","commit_id":"0d7bd85990438aa60ccf3310695fd4c8a080fd15"},{"author":{"_account_id":616,"name":"Mark Washenberger","email":"mark.washenberger@markwash.net","username":"markwash"},"change_message_id":"f463ec2f44a4e55688a6b522640a2146ed720c08","unresolved":false,"context_lines":[{"line_number":1203,"context_line":"    \"\"\"Update an TaskInfo object\"\"\""},{"line_number":1204,"context_line":"    session \u003d session or _get_session()"},{"line_number":1205,"context_line":"    task_info_ref \u003d _task_info_get(context, task_id, session)"},{"line_number":1206,"context_line":"    task_info_ref.update(values)"},{"line_number":1207,"context_line":"    task_info_ref.save(session\u003dsession)"},{"line_number":1208,"context_line":"    return _task_info_format(task_info_ref)"},{"line_number":1209,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAATn%2F90R8%3D","line":1206,"in_reply_to":"AAAATn%2F90lE%3D","updated":"2013-12-05 16:09:43.000000000","message":"@Zhi, AFAICT, your concern has been addressed. For example, if we call task_update(...values\u003d{\u0027input\u0027: None, \u0027message\u0027: \u0027foo\u0027}) I believe the end result is that input is deleted (set to NULL), message is set to \u0027foo\u0027, and result is left unchanged.","commit_id":"0d7bd85990438aa60ccf3310695fd4c8a080fd15"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"531feb8142ca9d7b68959a85590dd267f1c5c012","unresolved":false,"context_lines":[{"line_number":1203,"context_line":"    \"\"\"Update an TaskInfo object\"\"\""},{"line_number":1204,"context_line":"    session \u003d session or _get_session()"},{"line_number":1205,"context_line":"    task_info_ref \u003d _task_info_get(context, task_id, session)"},{"line_number":1206,"context_line":"    task_info_ref.update(values)"},{"line_number":1207,"context_line":"    task_info_ref.save(session\u003dsession)"},{"line_number":1208,"context_line":"    return _task_info_format(task_info_ref)"},{"line_number":1209,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAATn%2F90lE%3D","line":1206,"in_reply_to":"AAAATn%2F921U%3D","updated":"2013-12-05 15:28:11.000000000","message":"@Zhi: Actually, Mark pointed out that it is not necessary for us to pass the original values. It would be an acceptable error on the user\u0027s front if NULL values are set for an update call. (if that made sense)","commit_id":"0d7bd85990438aa60ccf3310695fd4c8a080fd15"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"e6f4575ba9aa33b8ffd091d39015e0c4c8667deb","unresolved":false,"context_lines":[{"line_number":1288,"context_line":"    \"\"\"Delete a task\"\"\""},{"line_number":1289,"context_line":"    session \u003d session or _get_session()"},{"line_number":1290,"context_line":"    task_ref \u003d _task_get(context, task_id, session\u003dsession)"},{"line_number":1291,"context_line":"    task_ref.delete(session\u003dsession)"},{"line_number":1292,"context_line":"    return _task_format(task_ref, task_ref.info)"},{"line_number":1293,"context_line":""},{"line_number":1294,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAATn%2F92zs%3D","line":1291,"updated":"2013-12-05 07:29:19.000000000","message":"Do we need keep task_info record for a \"deleted\" task? I think we can remove it from db directly to release space and dbms overhead on it. thanks","commit_id":"0d7bd85990438aa60ccf3310695fd4c8a080fd15"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"a8ffc064c8c2939168c254ad4697e625a3ecbbcd","unresolved":false,"context_lines":[{"line_number":1288,"context_line":"    \"\"\"Delete a task\"\"\""},{"line_number":1289,"context_line":"    session \u003d session or _get_session()"},{"line_number":1290,"context_line":"    task_ref \u003d _task_get(context, task_id, session\u003dsession)"},{"line_number":1291,"context_line":"    task_ref.delete(session\u003dsession)"},{"line_number":1292,"context_line":"    return _task_format(task_ref, task_ref.info)"},{"line_number":1293,"context_line":""},{"line_number":1294,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAATn%2F90L0%3D","line":1291,"in_reply_to":"AAAATn%2F90Uk%3D","updated":"2013-12-05 16:23:09.000000000","message":"OK, it\u0027s work for me, thanks.\n\n(TBH I still think we can delete task_info at here, since it does not support soft-delete. anyway, we can release resource immediately, or as you said do it later.)","commit_id":"0d7bd85990438aa60ccf3310695fd4c8a080fd15"},{"author":{"_account_id":616,"name":"Mark Washenberger","email":"mark.washenberger@markwash.net","username":"markwash"},"change_message_id":"2340955f287152b36ae08e33507333a9c54c171f","unresolved":false,"context_lines":[{"line_number":1288,"context_line":"    \"\"\"Delete a task\"\"\""},{"line_number":1289,"context_line":"    session \u003d session or _get_session()"},{"line_number":1290,"context_line":"    task_ref \u003d _task_get(context, task_id, session\u003dsession)"},{"line_number":1291,"context_line":"    task_ref.delete(session\u003dsession)"},{"line_number":1292,"context_line":"    return _task_format(task_ref, task_ref.info)"},{"line_number":1293,"context_line":""},{"line_number":1294,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAATn%2F90Qw%3D","line":1291,"in_reply_to":"AAAATn%2F90dI%3D","updated":"2013-12-05 16:11:49.000000000","message":"Sorry my other reply came in at the same time as yours.\n\nI think task_infos are not independent of tasks. So they cannot be cleaned up separately.","commit_id":"0d7bd85990438aa60ccf3310695fd4c8a080fd15"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"11698ae6fbb10a676a05482b8e7b1a8c05a382b6","unresolved":false,"context_lines":[{"line_number":1288,"context_line":"    \"\"\"Delete a task\"\"\""},{"line_number":1289,"context_line":"    session \u003d session or _get_session()"},{"line_number":1290,"context_line":"    task_ref \u003d _task_get(context, task_id, session\u003dsession)"},{"line_number":1291,"context_line":"    task_ref.delete(session\u003dsession)"},{"line_number":1292,"context_line":"    return _task_format(task_ref, task_ref.info)"},{"line_number":1293,"context_line":""},{"line_number":1294,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAATn%2F90dI%3D","line":1291,"in_reply_to":"AAAATn%2F91Bk%3D","updated":"2013-12-05 15:55:41.000000000","message":"Hi Venkatesh, sure. Actually my thought is we can do them be separated, and you know we can\u0027t do soft-delete on task_info since it has no \u0027deleted\u0027 flag. IMO we can remove task record be asynchronous, says using a scrubber worker remove deleted and expired records,but remove task_info be immediate at here since latter one can\u0027t be soft-deleted and can never be accessed once we do this call, so we can release db resource immediatly.","commit_id":"0d7bd85990438aa60ccf3310695fd4c8a080fd15"},{"author":{"_account_id":616,"name":"Mark Washenberger","email":"mark.washenberger@markwash.net","username":"markwash"},"change_message_id":"f463ec2f44a4e55688a6b522640a2146ed720c08","unresolved":false,"context_lines":[{"line_number":1288,"context_line":"    \"\"\"Delete a task\"\"\""},{"line_number":1289,"context_line":"    session \u003d session or _get_session()"},{"line_number":1290,"context_line":"    task_ref \u003d _task_get(context, task_id, session\u003dsession)"},{"line_number":1291,"context_line":"    task_ref.delete(session\u003dsession)"},{"line_number":1292,"context_line":"    return _task_format(task_ref, task_ref.info)"},{"line_number":1293,"context_line":""},{"line_number":1294,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAATn%2F90Uk%3D","line":1291,"in_reply_to":"AAAATn%2F91Bk%3D","updated":"2013-12-05 16:09:43.000000000","message":"Hi guys,\n\nI think the latest patchset is doing it right. TaskInfo is just an extension of Task, it doesn\u0027t have its own deleted column. So the most natural thing IMO is to leave the task_info untouched and only mark deleted\u003dTrue in the task table.\n\nWhen we clean things up to save space, we should remove the entries in both rows.","commit_id":"0d7bd85990438aa60ccf3310695fd4c8a080fd15"},{"author":{"_account_id":7703,"name":"Venkatesh Sampath","email":"venkatesh.sampath@outlook.com","username":"venkateshsampath"},"change_message_id":"76b6556c08b22eab7ffa178d4d9376f9812e38a2","unresolved":false,"context_lines":[{"line_number":1288,"context_line":"    \"\"\"Delete a task\"\"\""},{"line_number":1289,"context_line":"    session \u003d session or _get_session()"},{"line_number":1290,"context_line":"    task_ref \u003d _task_get(context, task_id, session\u003dsession)"},{"line_number":1291,"context_line":"    task_ref.delete(session\u003dsession)"},{"line_number":1292,"context_line":"    return _task_format(task_ref, task_ref.info)"},{"line_number":1293,"context_line":""},{"line_number":1294,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAATn%2F91Bk%3D","line":1291,"in_reply_to":"AAAATn%2F92zs%3D","updated":"2013-12-05 14:18:26.000000000","message":"Hi Zhi, As far as I know we always do only soft-delete. IMO we can delete both Task \u0026 Task Info records for deleted tasks if we choose to release space than doing a partial deletion. May be we can check with the team once before taking a final call on this. thoughts?","commit_id":"0d7bd85990438aa60ccf3310695fd4c8a080fd15"}],"glance/db/sqlalchemy/migrate_repo/versions/031_add_task_info_table.py":[{"author":{"_account_id":4463,"name":"iccha-sethi","email":"iccha.sethi@rackspace.com","username":"iccha-sethi"},"change_message_id":"b3ded56de6341521fd82f7ba4b8cf3be5d696951","unresolved":false,"context_lines":[{"line_number":56,"context_line":"    tasks \u003d tasks_table.select().execute().fetchall()"},{"line_number":57,"context_line":"    for task in tasks:"},{"line_number":58,"context_line":"        values \u003d {"},{"line_number":59,"context_line":"            \u0027task_id\u0027: getattr(task, \u0027id\u0027),"},{"line_number":60,"context_line":"            \u0027input\u0027: task.input,"},{"line_number":61,"context_line":"            \u0027result\u0027: task.result,"},{"line_number":62,"context_line":"            \u0027message\u0027: task.message,"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2Fu9w%3D","line":59,"updated":"2013-10-29 20:12:10.000000000","message":"Why will a task not have an id?","commit_id":"a27ba44084ab925ba1c4de76eea7ca22b18cd8fa"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"331eef5181f996c7659a23917a98b001964713e5","unresolved":false,"context_lines":[{"line_number":56,"context_line":"    tasks \u003d tasks_table.select().execute().fetchall()"},{"line_number":57,"context_line":"    for task in tasks:"},{"line_number":58,"context_line":"        values \u003d {"},{"line_number":59,"context_line":"            \u0027task_id\u0027: getattr(task, \u0027id\u0027),"},{"line_number":60,"context_line":"            \u0027input\u0027: task.input,"},{"line_number":61,"context_line":"            \u0027result\u0027: task.result,"},{"line_number":62,"context_line":"            \u0027message\u0027: task.message,"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2FtyI%3D","line":59,"in_reply_to":"AAAATn%2F%2Fu9w%3D","updated":"2013-10-30 02:20:27.000000000","message":"done.","commit_id":"a27ba44084ab925ba1c4de76eea7ca22b18cd8fa"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"b431d17caef38dfbd51e98b8b0e2f7ae76f693e7","unresolved":false,"context_lines":[{"line_number":93,"context_line":"            .where(tasks_table.c.id \u003d\u003d task_info.task_id)\\"},{"line_number":94,"context_line":"            .execute()"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"    tables \u003d [task_info_table]"},{"line_number":97,"context_line":"    drop_tables(tables)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2Ftug%3D","line":96,"updated":"2013-10-30 04:12:17.000000000","message":"nit: humm..I\u0027m not sure why we need this this temporary/middle variable \"tables\", IMO we can do \"drop_tables([task_info_table])\" directly.","commit_id":"4b0e97e47384abcc2fa289c5453e32636dd2db44"},{"author":{"_account_id":7703,"name":"Venkatesh Sampath","email":"venkatesh.sampath@outlook.com","username":"venkateshsampath"},"change_message_id":"4e20800df49244e984928abe96e51bbe0b7d8b68","unresolved":false,"context_lines":[{"line_number":93,"context_line":"            .where(tasks_table.c.id \u003d\u003d task_info.task_id)\\"},{"line_number":94,"context_line":"            .execute()"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"    tables \u003d [task_info_table]"},{"line_number":97,"context_line":"    drop_tables(tables)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2Fszg%3D","line":96,"in_reply_to":"AAAATn%2F%2Ftug%3D","updated":"2013-10-30 09:51:53.000000000","message":"thanks zhi. fixed it.","commit_id":"4b0e97e47384abcc2fa289c5453e32636dd2db44"},{"author":{"_account_id":4463,"name":"iccha-sethi","email":"iccha.sethi@rackspace.com","username":"iccha-sethi"},"change_message_id":"b60b147b9425deeaac69126dad795af6cae30618","unresolved":false,"context_lines":[{"line_number":16,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":17,"context_line":"#    under the License."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from sqlalchemy.schema import (Column, MetaData, Table, ForeignKey)"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from glance.db.sqlalchemy.migrate_repo.schema import ("},{"line_number":22,"context_line":"    DateTime, String, Text, create_tables, drop_tables)"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAATn%2F%2BYDs%3D","line":19,"updated":"2013-11-26 19:44:16.000000000","message":"minor nit: Column, Foreign Key, Metadata, Table\n(alphabetical order)","commit_id":"338a8ed5cc07f99b3a0d6df32ff660b106f8597e"},{"author":{"_account_id":7703,"name":"Venkatesh Sampath","email":"venkatesh.sampath@outlook.com","username":"venkateshsampath"},"change_message_id":"bd306bb6fe8c0dcccc2727c05d68123458bee00e","unresolved":false,"context_lines":[{"line_number":16,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":17,"context_line":"#    under the License."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from sqlalchemy.schema import (Column, MetaData, Table, ForeignKey)"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from glance.db.sqlalchemy.migrate_repo.schema import ("},{"line_number":22,"context_line":"    DateTime, String, Text, create_tables, drop_tables)"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAATn%2F%2BVbA%3D","line":19,"in_reply_to":"AAAATn%2F%2BYDs%3D","updated":"2013-11-27 13:34:55.000000000","message":"will fix the order. thanks iccha.","commit_id":"338a8ed5cc07f99b3a0d6df32ff660b106f8597e"},{"author":{"_account_id":4463,"name":"iccha-sethi","email":"iccha.sethi@rackspace.com","username":"iccha-sethi"},"change_message_id":"b60b147b9425deeaac69126dad795af6cae30618","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    #NOTE(nikhil): input and result are stored as text in the DB."},{"line_number":30,"context_line":"    # SQLAlchemy marshals the data to/from JSON using custom type"},{"line_number":31,"context_line":"    # JSONEncodedDict. It uses simplejson underneath."},{"line_number":32,"context_line":"    task_info \u003d Table(\u0027task_info\u0027,"},{"line_number":33,"context_line":"                      meta,"},{"line_number":34,"context_line":"                      Column(\u0027task_id\u0027, String(36),"},{"line_number":35,"context_line":"                             ForeignKey(\u0027tasks.id\u0027),"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAATn%2F%2BYCY%3D","line":32,"updated":"2013-11-26 19:44:16.000000000","message":"Iccha:Do we need a separate id column for this table as primary key? Will there always be 1-1 mapping with task and task info?\n\nNikhil: Yes there will be always 1-1 mapping, so there is no need for a separate column","commit_id":"338a8ed5cc07f99b3a0d6df32ff660b106f8597e"},{"author":{"_account_id":4463,"name":"iccha-sethi","email":"iccha.sethi@rackspace.com","username":"iccha-sethi"},"change_message_id":"b60b147b9425deeaac69126dad795af6cae30618","unresolved":false,"context_lines":[{"line_number":65,"context_line":"            \u0027created_at\u0027: task.created_at,"},{"line_number":66,"context_line":"            \u0027updated_at\u0027: task.updated_at"},{"line_number":67,"context_line":"        }"},{"line_number":68,"context_line":"        task_info_table.insert(values\u003dvalues).execute()"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    for col_name in TASKS_MIGRATE_COLUMNS:"},{"line_number":71,"context_line":"        tasks_table.columns[col_name].drop()"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAATn%2F%2BYAs%3D","line":68,"updated":"2013-11-26 19:44:16.000000000","message":"Nikhil: Do we need data migration?","commit_id":"338a8ed5cc07f99b3a0d6df32ff660b106f8597e"},{"author":{"_account_id":4463,"name":"iccha-sethi","email":"iccha.sethi@rackspace.com","username":"iccha-sethi"},"change_message_id":"b60b147b9425deeaac69126dad795af6cae30618","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        tasks_table\\"},{"line_number":94,"context_line":"            .update(values\u003dvalues)\\"},{"line_number":95,"context_line":"            .where(tasks_table.c.id \u003d\u003d task_info.task_id)\\"},{"line_number":96,"context_line":"            .execute()"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    drop_tables([task_info_table])"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAATn%2F%2BX%2Fs%3D","line":96,"updated":"2013-11-26 19:44:16.000000000","message":"If the updated_at has been updated in the Task Info table and is at a time later then the updated_at in the task table, should we be updating the task table with the latest time?","commit_id":"338a8ed5cc07f99b3a0d6df32ff660b106f8597e"},{"author":{"_account_id":7703,"name":"Venkatesh Sampath","email":"venkatesh.sampath@outlook.com","username":"venkateshsampath"},"change_message_id":"bd306bb6fe8c0dcccc2727c05d68123458bee00e","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        tasks_table\\"},{"line_number":94,"context_line":"            .update(values\u003dvalues)\\"},{"line_number":95,"context_line":"            .where(tasks_table.c.id \u003d\u003d task_info.task_id)\\"},{"line_number":96,"context_line":"            .execute()"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    drop_tables([task_info_table])"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAATn%2F%2BVXk%3D","line":96,"in_reply_to":"AAAATn%2F%2BX%2Fs%3D","updated":"2013-11-27 13:34:55.000000000","message":"you are right iccha. will implement it. thanks.","commit_id":"338a8ed5cc07f99b3a0d6df32ff660b106f8597e"}],"glance/db/sqlalchemy/migrate_repo/versions/032_add_task_info_table.py":[{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"ef2e87814a26de3d2831fb6ae91b6f69f7878fbb","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright 2013 OpenStack Foundation"},{"line_number":4,"context_line":"# Copyright 2013 Rackspace"},{"line_number":5,"context_line":"# All Rights Reserved."},{"line_number":6,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F%2BMIg%3D","line":3,"updated":"2013-11-29 13:06:44.000000000","message":"do you really need both copyrights here?","commit_id":"1dac387d6700b8d11f07919f59d09f7d28f8cf4b"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"81578556665a6a54ad4e6898587aae365460460d","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright 2013 OpenStack Foundation"},{"line_number":4,"context_line":"# Copyright 2013 Rackspace"},{"line_number":5,"context_line":"# All Rights Reserved."},{"line_number":6,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F%2BLDU%3D","line":3,"in_reply_to":"AAAATn%2F%2BMIg%3D","updated":"2013-11-29 20:41:44.000000000","message":"removing","commit_id":"1dac387d6700b8d11f07919f59d09f7d28f8cf4b"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"ef2e87814a26de3d2831fb6ae91b6f69f7878fbb","unresolved":false,"context_lines":[{"line_number":49,"context_line":"    meta \u003d MetaData()"},{"line_number":50,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    tables \u003d [define_task_info_table(meta)]"},{"line_number":53,"context_line":"    create_tables(tables)"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    tasks_table \u003d Table(\u0027tasks\u0027, meta, autoload\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F%2BMKo%3D","line":52,"updated":"2013-11-29 13:06:44.000000000","message":"why do you need a list here?","commit_id":"1dac387d6700b8d11f07919f59d09f7d28f8cf4b"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"5a31ad1c47907641a48a429c9db7d6a81528d763","unresolved":false,"context_lines":[{"line_number":49,"context_line":"    meta \u003d MetaData()"},{"line_number":50,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    tables \u003d [define_task_info_table(meta)]"},{"line_number":53,"context_line":"    create_tables(tables)"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    tasks_table \u003d Table(\u0027tasks\u0027, meta, autoload\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F%2BHW4%3D","line":52,"in_reply_to":"AAAATn%2F%2BLC0%3D","updated":"2013-12-03 09:01:49.000000000","message":"Oh, I missed log line in create_tables() and drop_tables() functions... But I\u0027m a little confused with a `3 line functions`.","commit_id":"1dac387d6700b8d11f07919f59d09f7d28f8cf4b"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"21897a260cfcc9e300b8f4369b8e2898fb65d3e9","unresolved":false,"context_lines":[{"line_number":49,"context_line":"    meta \u003d MetaData()"},{"line_number":50,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    tables \u003d [define_task_info_table(meta)]"},{"line_number":53,"context_line":"    create_tables(tables)"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    tasks_table \u003d Table(\u0027tasks\u0027, meta, autoload\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F%2BLC0%3D","line":52,"in_reply_to":"AAAATn%2F%2BMKo%3D","updated":"2013-11-29 20:47:56.000000000","message":"This is a static method, being used from the glance.db.sqlalchemy.migrate_repo.schema module directly. It has log line and such so, reuse of that code makes sense to me. Please let me know your thoughts.","commit_id":"1dac387d6700b8d11f07919f59d09f7d28f8cf4b"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"ef2e87814a26de3d2831fb6ae91b6f69f7878fbb","unresolved":false,"context_lines":[{"line_number":102,"context_line":"            .where(tasks_table.c.id \u003d\u003d task_info.task_id)\\"},{"line_number":103,"context_line":"            .execute()"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"    drop_tables([task_info_table])"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F%2BMIs%3D","line":105,"updated":"2013-11-29 13:06:44.000000000","message":"you want to drop single table. Why cant you do it in a such way ?\n\n  task_info_table.drop()","commit_id":"1dac387d6700b8d11f07919f59d09f7d28f8cf4b"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"21897a260cfcc9e300b8f4369b8e2898fb65d3e9","unresolved":false,"context_lines":[{"line_number":102,"context_line":"            .where(tasks_table.c.id \u003d\u003d task_info.task_id)\\"},{"line_number":103,"context_line":"            .execute()"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"    drop_tables([task_info_table])"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F%2BLCw%3D","line":105,"in_reply_to":"AAAATn%2F%2BMIs%3D","updated":"2013-11-29 20:47:56.000000000","message":"same as line 52","commit_id":"1dac387d6700b8d11f07919f59d09f7d28f8cf4b"},{"author":{"_account_id":616,"name":"Mark Washenberger","email":"mark.washenberger@markwash.net","username":"markwash"},"change_message_id":"4e93d7d641e686b02e14dae6e22d0a4580ac70d8","unresolved":false,"context_lines":[{"line_number":61,"context_line":"            \u0027input\u0027: task.input,"},{"line_number":62,"context_line":"            \u0027result\u0027: task.result,"},{"line_number":63,"context_line":"            \u0027message\u0027: task.message,"},{"line_number":64,"context_line":"            \u0027created_at\u0027: task.created_at,"},{"line_number":65,"context_line":"            \u0027updated_at\u0027: task.updated_at"},{"line_number":66,"context_line":"        }"},{"line_number":67,"context_line":"        task_info_table.insert(values\u003dvalues).execute()"}],"source_content_type":"text/x-python","patch_set":28,"id":"AAAATn%2F94O0%3D","line":64,"updated":"2013-12-04 23:04:14.000000000","message":"I guess this line and the line below can be removed?","commit_id":"7cc77b2820193d8d8898f509048d98f495812362"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"6748d6e62be6a2c0a260f02e95dbfec06fa8f531","unresolved":false,"context_lines":[{"line_number":61,"context_line":"            \u0027input\u0027: task.input,"},{"line_number":62,"context_line":"            \u0027result\u0027: task.result,"},{"line_number":63,"context_line":"            \u0027message\u0027: task.message,"},{"line_number":64,"context_line":"            \u0027created_at\u0027: task.created_at,"},{"line_number":65,"context_line":"            \u0027updated_at\u0027: task.updated_at"},{"line_number":66,"context_line":"        }"},{"line_number":67,"context_line":"        task_info_table.insert(values\u003dvalues).execute()"}],"source_content_type":"text/x-python","patch_set":28,"id":"AAAATn%2F94Mg%3D","line":64,"in_reply_to":"AAAATn%2F94O0%3D","updated":"2013-12-05 01:55:34.000000000","message":"oh yeah! I feel bad about ignoring this.","commit_id":"7cc77b2820193d8d8898f509048d98f495812362"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"e6f4575ba9aa33b8ffd091d39015e0c4c8667deb","unresolved":false,"context_lines":[{"line_number":54,"context_line":"    tasks_table \u003d Table(\u0027tasks\u0027, meta, autoload\u003dTrue)"},{"line_number":55,"context_line":"    task_info_table \u003d Table(\u0027task_info\u0027, meta, autoload\u003dTrue)"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    tasks \u003d tasks_table.select().execute().fetchall()"},{"line_number":58,"context_line":"    for task in tasks:"},{"line_number":59,"context_line":"        values \u003d {"},{"line_number":60,"context_line":"            \u0027task_id\u0027: task.id,"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAATn%2F928U%3D","line":57,"updated":"2013-12-05 07:29:19.000000000","message":"I\u0027m not sure whether this operation can ask sqlalchemy load all data to local glance process from DB immediately or it can do some lazy loading mechanism? Who can educate me, thanks.","commit_id":"0d7bd85990438aa60ccf3310695fd4c8a080fd15"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"11698ae6fbb10a676a05482b8e7b1a8c05a382b6","unresolved":false,"context_lines":[{"line_number":54,"context_line":"    tasks_table \u003d Table(\u0027tasks\u0027, meta, autoload\u003dTrue)"},{"line_number":55,"context_line":"    task_info_table \u003d Table(\u0027task_info\u0027, meta, autoload\u003dTrue)"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    tasks \u003d tasks_table.select().execute().fetchall()"},{"line_number":58,"context_line":"    for task in tasks:"},{"line_number":59,"context_line":"        values \u003d {"},{"line_number":60,"context_line":"            \u0027task_id\u0027: task.id,"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAATn%2F90Zo%3D","line":57,"in_reply_to":"AAAATn%2F91MY%3D","updated":"2013-12-05 15:55:41.000000000","message":"I\u0027m ok on this point..maybe, but I really don\u0027t like do any assumption, put our hope on a particular deployment case. anyway.","commit_id":"0d7bd85990438aa60ccf3310695fd4c8a080fd15"},{"author":{"_account_id":7703,"name":"Venkatesh Sampath","email":"venkatesh.sampath@outlook.com","username":"venkateshsampath"},"change_message_id":"76b6556c08b22eab7ffa178d4d9376f9812e38a2","unresolved":false,"context_lines":[{"line_number":54,"context_line":"    tasks_table \u003d Table(\u0027tasks\u0027, meta, autoload\u003dTrue)"},{"line_number":55,"context_line":"    task_info_table \u003d Table(\u0027task_info\u0027, meta, autoload\u003dTrue)"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    tasks \u003d tasks_table.select().execute().fetchall()"},{"line_number":58,"context_line":"    for task in tasks:"},{"line_number":59,"context_line":"        values \u003d {"},{"line_number":60,"context_line":"            \u0027task_id\u0027: task.id,"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAATn%2F91MY%3D","line":57,"in_reply_to":"AAAATn%2F928U%3D","updated":"2013-12-05 14:18:26.000000000","message":"I guess fetchall loads all data into the memory. fetchall by itself doesn\u0027t seem to have any lazy loading mechanism. but we probably can use other methods like yield_per() or fetchmany() with limit/offset to handle huge dataset. For more details we can always refer SQLAlchemy documentation for more info on this.\nAs for as task_info migration is concerned, will we ever be dealing with huge data (tasks)?","commit_id":"0d7bd85990438aa60ccf3310695fd4c8a080fd15"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"e6f4575ba9aa33b8ffd091d39015e0c4c8667deb","unresolved":false,"context_lines":[{"line_number":79,"context_line":"        column \u003d Column(col_name, Text())"},{"line_number":80,"context_line":"        column.create(tasks_table)"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    task_info_records \u003d task_info_table.select().execute().fetchall()"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    for task_info in task_info_records:"},{"line_number":85,"context_line":"        values \u003d {"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAATn%2F928Q%3D","line":82,"updated":"2013-12-05 07:29:19.000000000","message":"dittlo","commit_id":"0d7bd85990438aa60ccf3310695fd4c8a080fd15"}],"glance/db/sqlalchemy/models.py":[{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"3610260cb7b172b546ef258d8faffb72e472253d","unresolved":false,"context_lines":[{"line_number":28,"context_line":"from sqlalchemy.orm import relationship, backref, object_mapper"},{"line_number":29,"context_line":"from sqlalchemy.types import TypeDecorator"},{"line_number":30,"context_line":"from sqlalchemy import Index, UniqueConstraint"},{"line_number":31,"context_line":"from sqlalchemy.types import TypeDecorator"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"from glance.openstack.common import timeutils"},{"line_number":34,"context_line":"from glance.openstack.common import uuidutils"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F%2FxKQ%3D","line":31,"updated":"2013-10-29 11:05:04.000000000","message":"duplicated","commit_id":"f14f7cd92c71d823f94b57c8cf30d4fa84f8ae9a"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"25cbf1a49cc512323eb269d074ac73007f8a22b4","unresolved":false,"context_lines":[{"line_number":28,"context_line":"from sqlalchemy.orm import relationship, backref, object_mapper"},{"line_number":29,"context_line":"from sqlalchemy.types import TypeDecorator"},{"line_number":30,"context_line":"from sqlalchemy import Index, UniqueConstraint"},{"line_number":31,"context_line":"from sqlalchemy.types import TypeDecorator"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"from glance.openstack.common import timeutils"},{"line_number":34,"context_line":"from glance.openstack.common import uuidutils"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F%2Ftwk%3D","line":31,"in_reply_to":"AAAATn%2F%2FxKQ%3D","updated":"2013-10-30 02:36:06.000000000","message":"done.","commit_id":"f14f7cd92c71d823f94b57c8cf30d4fa84f8ae9a"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"b431d17caef38dfbd51e98b8b0e2f7ae76f693e7","unresolved":false,"context_lines":[{"line_number":19,"context_line":"\"\"\""},{"line_number":20,"context_line":"SQLAlchemy models for glance data"},{"line_number":21,"context_line":"\"\"\""},{"line_number":22,"context_line":"import json"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"from sqlalchemy import Column, Integer, String, BigInteger"},{"line_number":25,"context_line":"from sqlalchemy.ext.compiler import compiles"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2FttQ%3D","line":22,"updated":"2013-10-30 04:12:17.000000000","message":"ditto","commit_id":"4b0e97e47384abcc2fa289c5453e32636dd2db44"},{"author":{"_account_id":7703,"name":"Venkatesh Sampath","email":"venkatesh.sampath@outlook.com","username":"venkateshsampath"},"change_message_id":"4e20800df49244e984928abe96e51bbe0b7d8b68","unresolved":false,"context_lines":[{"line_number":19,"context_line":"\"\"\""},{"line_number":20,"context_line":"SQLAlchemy models for glance data"},{"line_number":21,"context_line":"\"\"\""},{"line_number":22,"context_line":"import json"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"from sqlalchemy import Column, Integer, String, BigInteger"},{"line_number":25,"context_line":"from sqlalchemy.ext.compiler import compiles"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2Fsys%3D","line":22,"in_reply_to":"AAAATn%2F%2FttQ%3D","updated":"2013-10-30 09:51:53.000000000","message":"fixed this one too. thanks.","commit_id":"4b0e97e47384abcc2fa289c5453e32636dd2db44"},{"author":{"_account_id":4463,"name":"iccha-sethi","email":"iccha.sethi@rackspace.com","username":"iccha-sethi"},"change_message_id":"a3b1ec9848123b563ae8cfe6146f136a90378dd8","unresolved":false,"context_lines":[{"line_number":239,"context_line":""},{"line_number":240,"context_line":""},{"line_number":241,"context_line":"class TaskInfo(BASE, ModelBase):"},{"line_number":242,"context_line":"    \"\"\"Represents an image members in the datastore\"\"\""},{"line_number":243,"context_line":"    __tablename__ \u003d \u0027task_info\u0027"},{"line_number":244,"context_line":""},{"line_number":245,"context_line":"    task_id \u003d Column(String(36), ForeignKey(\u0027tasks.id\u0027),"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2FacY%3D","line":242,"updated":"2013-11-06 21:47:06.000000000","message":"doc string says image members","commit_id":"ab88de79b69dc99770c760149628cfbbeddfc0a6"},{"author":{"_account_id":4463,"name":"iccha-sethi","email":"iccha.sethi@rackspace.com","username":"iccha-sethi"},"change_message_id":"a3b1ec9848123b563ae8cfe6146f136a90378dd8","unresolved":false,"context_lines":[{"line_number":240,"context_line":""},{"line_number":241,"context_line":"class TaskInfo(BASE, ModelBase):"},{"line_number":242,"context_line":"    \"\"\"Represents an image members in the datastore\"\"\""},{"line_number":243,"context_line":"    __tablename__ \u003d \u0027task_info\u0027"},{"line_number":244,"context_line":""},{"line_number":245,"context_line":"    task_id \u003d Column(String(36), ForeignKey(\u0027tasks.id\u0027),"},{"line_number":246,"context_line":"                     primary_key\u003dTrue,"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2FabU%3D","line":243,"updated":"2013-11-06 21:47:06.000000000","message":"Also will be good to document somewhere why migrations have text columns and sqlalchemy uses jsonencodeddict. And the benefits of using jsonencoded dict in the sqlalchemy layer.\nMay be a note here and in migration script?","commit_id":"ab88de79b69dc99770c760149628cfbbeddfc0a6"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"bf0ea983db72de873bb1b64448fb57740cfa751c","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"import json"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"from sqlalchemy import Column, Integer, String, BigInteger"},{"line_number":26,"context_line":"from sqlalchemy import ForeignKey, DateTime, Boolean, Text"},{"line_number":27,"context_line":"from sqlalchemy import Index, UniqueConstraint"},{"line_number":28,"context_line":"from sqlalchemy.ext.compiler import compiles"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAATn%2F%2BjIo%3D","line":25,"updated":"2013-11-24 07:51:02.000000000","message":"nits: Change import order to \"from sqlalchemy import BigInteger, Column, Integer, String\"","commit_id":"ad22cd1c7706e33eb30a46d575d071984e8bbc02"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"bf0ea983db72de873bb1b64448fb57740cfa751c","unresolved":false,"context_lines":[{"line_number":23,"context_line":"import json"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"from sqlalchemy import Column, Integer, String, BigInteger"},{"line_number":26,"context_line":"from sqlalchemy import ForeignKey, DateTime, Boolean, Text"},{"line_number":27,"context_line":"from sqlalchemy import Index, UniqueConstraint"},{"line_number":28,"context_line":"from sqlalchemy.ext.compiler import compiles"},{"line_number":29,"context_line":"from sqlalchemy.ext.declarative import declarative_base"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAATn%2F%2BjIs%3D","line":26,"updated":"2013-11-24 07:51:02.000000000","message":"nits: Change import order to \"from sqlalchemy import Boolean, DateTime, ForeignKey, Text\" ?","commit_id":"ad22cd1c7706e33eb30a46d575d071984e8bbc02"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"bf0ea983db72de873bb1b64448fb57740cfa751c","unresolved":false,"context_lines":[{"line_number":27,"context_line":"from sqlalchemy import Index, UniqueConstraint"},{"line_number":28,"context_line":"from sqlalchemy.ext.compiler import compiles"},{"line_number":29,"context_line":"from sqlalchemy.ext.declarative import declarative_base"},{"line_number":30,"context_line":"from sqlalchemy.orm import relationship, backref, object_mapper"},{"line_number":31,"context_line":"from sqlalchemy.types import TypeDecorator"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"from glance.openstack.common import timeutils"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAATn%2F%2BjIk%3D","line":30,"updated":"2013-11-24 07:51:02.000000000","message":"nits: change import order also?","commit_id":"ad22cd1c7706e33eb30a46d575d071984e8bbc02"},{"author":{"_account_id":4463,"name":"iccha-sethi","email":"iccha.sethi@rackspace.com","username":"iccha-sethi"},"change_message_id":"b60b147b9425deeaac69126dad795af6cae30618","unresolved":false,"context_lines":[{"line_number":123,"context_line":"        return d"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"class SoftDeleteMixin(object):"},{"line_number":127,"context_line":"    deleted_at \u003d Column(DateTime)"},{"line_number":128,"context_line":"    deleted \u003d Column(Boolean, nullable\u003dFalse, default\u003dFalse)"},{"line_number":129,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAATn%2F%2BX7U%3D","line":126,"updated":"2013-11-26 19:44:16.000000000","message":"should this change be in a separate patch? because it is affecting other classes like IMages?It may be ok to have it in this patch, with a note?On the fence here. Happy to hear what your thoughts are and what other reviewers think.","commit_id":"338a8ed5cc07f99b3a0d6df32ff660b106f8597e"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"ef2e87814a26de3d2831fb6ae91b6f69f7878fbb","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"import json"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"from sqlalchemy import (BigInteger,"},{"line_number":26,"context_line":"                        Boolean,"},{"line_number":27,"context_line":"                        Column,"},{"line_number":28,"context_line":"                        DateTime,"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F%2BMJw%3D","line":25,"updated":"2013-11-29 13:06:44.000000000","message":"nit: If yo want to use \"one import per line\" rule, you should make somthing like this\n\n from sqlalchemy import BigInteger\n from sqlalchemy import Boolean\n ...","commit_id":"1dac387d6700b8d11f07919f59d09f7d28f8cf4b"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"5a31ad1c47907641a48a429c9db7d6a81528d763","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"import json"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"from sqlalchemy import (BigInteger,"},{"line_number":26,"context_line":"                        Boolean,"},{"line_number":27,"context_line":"                        Column,"},{"line_number":28,"context_line":"                        DateTime,"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F%2BCCo%3D","line":25,"in_reply_to":"AAAATn%2F%2BLEM%3D","updated":"2013-12-03 09:01:49.000000000","message":"ok, let it be","commit_id":"1dac387d6700b8d11f07919f59d09f7d28f8cf4b"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"81578556665a6a54ad4e6898587aae365460460d","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"import json"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"from sqlalchemy import (BigInteger,"},{"line_number":26,"context_line":"                        Boolean,"},{"line_number":27,"context_line":"                        Column,"},{"line_number":28,"context_line":"                        DateTime,"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F%2BLEM%3D","line":25,"in_reply_to":"AAAATn%2F%2BMJw%3D","updated":"2013-11-29 20:41:44.000000000","message":"I felt that keep them organized together is much better. It gives an idea of what all is being imported from the top level sqlalchemy module. Generally, I would prefer not to import classes like this however, we can do clean up of imports later.\n\nAlso, you can see that importing on two different lines from the same module can cause confusion, resulting in mismatched import order in the \"old version\" (on the left).","commit_id":"1dac387d6700b8d11f07919f59d09f7d28f8cf4b"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"ef2e87814a26de3d2831fb6ae91b6f69f7878fbb","unresolved":false,"context_lines":[{"line_number":231,"context_line":"    expires_at \u003d Column(DateTime, nullable\u003dTrue)"},{"line_number":232,"context_line":""},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"class TaskInfo(BASE, models.ModelBase):"},{"line_number":235,"context_line":"    \"\"\"Represents task info in the datastore\"\"\""},{"line_number":236,"context_line":"    __tablename__ \u003d \u0027task_info\u0027"},{"line_number":237,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F%2BMJA%3D","line":234,"updated":"2013-11-29 13:06:44.000000000","message":"why don\u0027t you use GlanceBase() instead of models.ModelBase() ?","commit_id":"1dac387d6700b8d11f07919f59d09f7d28f8cf4b"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"5a31ad1c47907641a48a429c9db7d6a81528d763","unresolved":false,"context_lines":[{"line_number":231,"context_line":"    expires_at \u003d Column(DateTime, nullable\u003dTrue)"},{"line_number":232,"context_line":""},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"class TaskInfo(BASE, models.ModelBase):"},{"line_number":235,"context_line":"    \"\"\"Represents task info in the datastore\"\"\""},{"line_number":236,"context_line":"    __tablename__ \u003d \u0027task_info\u0027"},{"line_number":237,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F%2BCC0%3D","line":234,"in_reply_to":"AAAATn%2F%2BLEA%3D","updated":"2013-12-03 09:01:49.000000000","message":"ok, got it","commit_id":"1dac387d6700b8d11f07919f59d09f7d28f8cf4b"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"81578556665a6a54ad4e6898587aae365460460d","unresolved":false,"context_lines":[{"line_number":231,"context_line":"    expires_at \u003d Column(DateTime, nullable\u003dTrue)"},{"line_number":232,"context_line":""},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"class TaskInfo(BASE, models.ModelBase):"},{"line_number":235,"context_line":"    \"\"\"Represents task info in the datastore\"\"\""},{"line_number":236,"context_line":"    __tablename__ \u003d \u0027task_info\u0027"},{"line_number":237,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F%2BLEA%3D","line":234,"in_reply_to":"AAAATn%2F%2BMJA%3D","updated":"2013-11-29 20:41:44.000000000","message":"Glance base has deleted, deleted_at which we do not want/need. \n\nEarlier PS had a proposal for a Mixin which avoided having deleted/deleted_at however, with oslo DB code being imported there is a Mixin added from that. \n\nIt would result into way too many Mixins if we were to create another one here at this point.","commit_id":"1dac387d6700b8d11f07919f59d09f7d28f8cf4b"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"ef2e87814a26de3d2831fb6ae91b6f69f7878fbb","unresolved":false,"context_lines":[{"line_number":245,"context_line":"                        nullable\u003dFalse)"},{"line_number":246,"context_line":""},{"line_number":247,"context_line":"    updated_at \u003d Column(DateTime,"},{"line_number":248,"context_line":"                        default\u003dtimeutils.utcnow,"},{"line_number":249,"context_line":"                        nullable\u003dFalse)"},{"line_number":250,"context_line":""},{"line_number":251,"context_line":"    task \u003d relationship(Task, backref\u003dbackref(\u0027info\u0027, uselist\u003dFalse))"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F%2BMJE%3D","line":248,"updated":"2013-11-29 13:06:44.000000000","message":"nit: we already have `created_at` and `updated_at` colums in GlanceBase()","commit_id":"1dac387d6700b8d11f07919f59d09f7d28f8cf4b"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"81578556665a6a54ad4e6898587aae365460460d","unresolved":false,"context_lines":[{"line_number":245,"context_line":"                        nullable\u003dFalse)"},{"line_number":246,"context_line":""},{"line_number":247,"context_line":"    updated_at \u003d Column(DateTime,"},{"line_number":248,"context_line":"                        default\u003dtimeutils.utcnow,"},{"line_number":249,"context_line":"                        nullable\u003dFalse)"},{"line_number":250,"context_line":""},{"line_number":251,"context_line":"    task \u003d relationship(Task, backref\u003dbackref(\u0027info\u0027, uselist\u003dFalse))"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F%2BLD4%3D","line":248,"in_reply_to":"AAAATn%2F%2BMJE%3D","updated":"2013-11-29 20:41:44.000000000","message":"please see the reply to this comment above.","commit_id":"1dac387d6700b8d11f07919f59d09f7d28f8cf4b"},{"author":{"_account_id":4463,"name":"iccha-sethi","email":"iccha.sethi@rackspace.com","username":"iccha-sethi"},"change_message_id":"cd417007a96b34e5e4d5540315ec4dec8492ac76","unresolved":false,"context_lines":[{"line_number":247,"context_line":"    updated_at \u003d Column(DateTime,"},{"line_number":248,"context_line":"                        default\u003dtimeutils.utcnow,"},{"line_number":249,"context_line":"                        nullable\u003dFalse)"},{"line_number":250,"context_line":""},{"line_number":251,"context_line":"    task \u003d relationship(Task, backref\u003dbackref(\u0027info\u0027, uselist\u003dFalse))"},{"line_number":252,"context_line":""},{"line_number":253,"context_line":"    #NOTE(nikhil): input and result are stored as text in the DB."}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F%2BLFU%3D","line":250,"updated":"2013-11-29 20:14:54.000000000","message":"Maybe a note about deleted add would help? So it is helpful for ppl to understand why it is not there.","commit_id":"1dac387d6700b8d11f07919f59d09f7d28f8cf4b"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"81578556665a6a54ad4e6898587aae365460460d","unresolved":false,"context_lines":[{"line_number":247,"context_line":"    updated_at \u003d Column(DateTime,"},{"line_number":248,"context_line":"                        default\u003dtimeutils.utcnow,"},{"line_number":249,"context_line":"                        nullable\u003dFalse)"},{"line_number":250,"context_line":""},{"line_number":251,"context_line":"    task \u003d relationship(Task, backref\u003dbackref(\u0027info\u0027, uselist\u003dFalse))"},{"line_number":252,"context_line":""},{"line_number":253,"context_line":"    #NOTE(nikhil): input and result are stored as text in the DB."}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F%2BLDw%3D","line":250,"in_reply_to":"AAAATn%2F%2BLFU%3D","updated":"2013-11-29 20:41:44.000000000","message":"Thanks for pointing out Iccha. Adding.","commit_id":"1dac387d6700b8d11f07919f59d09f7d28f8cf4b"},{"author":{"_account_id":616,"name":"Mark Washenberger","email":"mark.washenberger@markwash.net","username":"markwash"},"change_message_id":"83b753afaebc2d357b822efb9e8bf16a844da2f5","unresolved":false,"context_lines":[{"line_number":240,"context_line":"                     primary_key\u003dTrue,"},{"line_number":241,"context_line":"                     nullable\u003dFalse)"},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"    #NOTE(venkatesh): could not use \u0027created_at\u0027 \u0026 \u0027updated_at\u0027 from"},{"line_number":244,"context_line":"    # GlanceBase because, we doesn\u0027t wanted \u0027deleted\u0027 \u0026 \u0027deleted_at\u0027"},{"line_number":245,"context_line":"    # to be inherited from GlanceBase. TaskInfo basically relies on"},{"line_number":246,"context_line":"    # the \u0027deleted\u0027 \u0026 \u0027deleted_at\u0027 columns on its parent \u0027Task\u0027 table."}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAATn%2F%2BE4o%3D","line":243,"updated":"2013-12-02 20:21:58.000000000","message":"Hey, do we really need created_at and updated_at at all either? Couldn\u0027t they be inferred from the corresponding row in the Task table?","commit_id":"a484e093e012b4c7278f2b6027814808a0cd6870"},{"author":{"_account_id":7703,"name":"Venkatesh Sampath","email":"venkatesh.sampath@outlook.com","username":"venkateshsampath"},"change_message_id":"c0652e99b64098e22d2a00bdcb8a70202f5dd9a2","unresolved":false,"context_lines":[{"line_number":240,"context_line":"                     primary_key\u003dTrue,"},{"line_number":241,"context_line":"                     nullable\u003dFalse)"},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"    #NOTE(venkatesh): could not use \u0027created_at\u0027 \u0026 \u0027updated_at\u0027 from"},{"line_number":244,"context_line":"    # GlanceBase because, we doesn\u0027t wanted \u0027deleted\u0027 \u0026 \u0027deleted_at\u0027"},{"line_number":245,"context_line":"    # to be inherited from GlanceBase. TaskInfo basically relies on"},{"line_number":246,"context_line":"    # the \u0027deleted\u0027 \u0026 \u0027deleted_at\u0027 columns on its parent \u0027Task\u0027 table."}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAATn%2F%2BCDw%3D","line":243,"in_reply_to":"AAAATn%2F%2BE4o%3D","updated":"2013-12-03 08:55:50.000000000","message":"You are right Mark. They can be inferred from Task table. This change needs to be done and will work on it to remove the created_at and updated_at columns from task_info table. Thanks.","commit_id":"a484e093e012b4c7278f2b6027814808a0cd6870"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"642301aa5433e904254db7a625005a81fb5f8e83","unresolved":false,"context_lines":[{"line_number":227,"context_line":"    id \u003d Column(String(36), primary_key\u003dTrue, default\u003duuidutils.generate_uuid)"},{"line_number":228,"context_line":"    type \u003d Column(String(30))"},{"line_number":229,"context_line":"    status \u003d Column(String(30))"},{"line_number":230,"context_line":"    owner \u003d Column(String(255))"},{"line_number":231,"context_line":"    expires_at \u003d Column(DateTime, nullable\u003dTrue)"},{"line_number":232,"context_line":""},{"line_number":233,"context_line":""}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAATn%2F94sg%3D","line":230,"updated":"2013-12-04 21:40:03.000000000","message":"Should we set owner as nullable\u003dFalse (the tasks table already has it as per the migration 030) ?","commit_id":"b09eed9146617e20ccb756773747dcc4801e6eb2"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"0ee010d6ac3cf8b11b41d04dc211e6d3881a1e5f","unresolved":false,"context_lines":[{"line_number":227,"context_line":"    id \u003d Column(String(36), primary_key\u003dTrue, default\u003duuidutils.generate_uuid)"},{"line_number":228,"context_line":"    type \u003d Column(String(30))"},{"line_number":229,"context_line":"    status \u003d Column(String(30))"},{"line_number":230,"context_line":"    owner \u003d Column(String(255))"},{"line_number":231,"context_line":"    expires_at \u003d Column(DateTime, nullable\u003dTrue)"},{"line_number":232,"context_line":""},{"line_number":233,"context_line":""}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAATn%2F94cU%3D","line":230,"in_reply_to":"AAAATn%2F94sg%3D","updated":"2013-12-04 22:36:01.000000000","message":"Talked to Mark offline and filing a separate bug and patch for this as it seems like a bit out of place here.","commit_id":"b09eed9146617e20ccb756773747dcc4801e6eb2"},{"author":{"_account_id":6493,"name":"John Bresnahan","email":"john@bresnahan.me","username":"jbresnah"},"change_message_id":"57a29387b16244ad45a4b3e2764d6cc99745cd43","unresolved":false,"context_lines":[{"line_number":31,"context_line":"                        Integer,"},{"line_number":32,"context_line":"                        String,"},{"line_number":33,"context_line":"                        Text,"},{"line_number":34,"context_line":"                        UniqueConstraint)"},{"line_number":35,"context_line":"from sqlalchemy.ext.compiler import compiles"},{"line_number":36,"context_line":"from sqlalchemy.ext.declarative import declarative_base"},{"line_number":37,"context_line":"from sqlalchemy.orm import backref, relationship"}],"source_content_type":"text/x-python","patch_set":30,"id":"AAAATn%2F90eQ%3D","line":34,"updated":"2013-12-05 15:59:24.000000000","message":"I am not exactly sure what the policy is but while you are cleaning this up I would rather see each of these as a separate import.  Obviously this is not a big deal.","commit_id":"41839dfb0d46ef843546d8d581f0a9dafa5fa574"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"ff40d99215c927745f73f83715ab570f30df2398","unresolved":false,"context_lines":[{"line_number":31,"context_line":"                        Integer,"},{"line_number":32,"context_line":"                        String,"},{"line_number":33,"context_line":"                        Text,"},{"line_number":34,"context_line":"                        UniqueConstraint)"},{"line_number":35,"context_line":"from sqlalchemy.ext.compiler import compiles"},{"line_number":36,"context_line":"from sqlalchemy.ext.declarative import declarative_base"},{"line_number":37,"context_line":"from sqlalchemy.orm import backref, relationship"}],"source_content_type":"text/x-python","patch_set":30,"id":"AAAATn%2F90JY%3D","line":34,"in_reply_to":"AAAATn%2F90NI%3D","updated":"2013-12-05 16:29:30.000000000","message":"I could not avoid reverting this so, I\u0027ve pushed up another PS :-)","commit_id":"41839dfb0d46ef843546d8d581f0a9dafa5fa574"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"3c760fd957443109b7ed0d2ea15beaddba7e8c18","unresolved":false,"context_lines":[{"line_number":31,"context_line":"                        Integer,"},{"line_number":32,"context_line":"                        String,"},{"line_number":33,"context_line":"                        Text,"},{"line_number":34,"context_line":"                        UniqueConstraint)"},{"line_number":35,"context_line":"from sqlalchemy.ext.compiler import compiles"},{"line_number":36,"context_line":"from sqlalchemy.ext.declarative import declarative_base"},{"line_number":37,"context_line":"from sqlalchemy.orm import backref, relationship"}],"source_content_type":"text/x-python","patch_set":30,"id":"AAAATn%2F90NI%3D","line":34,"in_reply_to":"AAAATn%2F90eQ%3D","updated":"2013-12-05 16:19:51.000000000","message":"I can follow up with another PS today if that\u0027s okay. I found it better to group them as you can see in the previous version - the disordering of imports.\n\nAnd sorry about the cleanup - there were addition to the imports earlier and now that they have been removed, it\u0027s just cleanup.","commit_id":"41839dfb0d46ef843546d8d581f0a9dafa5fa574"}],"glance/tests/functional/db/base.py":[{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"1188981cc24ec0eb9a67bee1aaba065e8ac525ba","unresolved":false,"context_lines":[{"line_number":1387,"context_line":"        self.assertEqual(tasks[1][\u0027input\u0027], fixture2[\u0027input\u0027])"},{"line_number":1388,"context_line":"        self.assertEqual(tasks[1][\u0027result\u0027], fixture2[\u0027result\u0027])"},{"line_number":1389,"context_line":"        self.assertEqual(tasks[1][\u0027message\u0027], fixture2[\u0027message\u0027])"},{"line_number":1390,"context_line":"        self.assertEqual(tasks[1][\u0027expires_at\u0027], expires_at)"},{"line_number":1391,"context_line":""},{"line_number":1392,"context_line":"    def test_task_create(self):"},{"line_number":1393,"context_line":"        task_id \u003d uuidutils.generate_uuid()"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F%2BK%2B0%3D","line":1390,"updated":"2013-11-29 21:46:38.000000000","message":"Need to add assertions for all task attributes.","commit_id":"1dac387d6700b8d11f07919f59d09f7d28f8cf4b"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"1188981cc24ec0eb9a67bee1aaba065e8ac525ba","unresolved":false,"context_lines":[{"line_number":1389,"context_line":"        self.assertEqual(tasks[1][\u0027message\u0027], fixture2[\u0027message\u0027])"},{"line_number":1390,"context_line":"        self.assertEqual(tasks[1][\u0027expires_at\u0027], expires_at)"},{"line_number":1391,"context_line":""},{"line_number":1392,"context_line":"    def test_task_create(self):"},{"line_number":1393,"context_line":"        task_id \u003d uuidutils.generate_uuid()"},{"line_number":1394,"context_line":"        self.context.tenant \u003d uuidutils.generate_uuid()"},{"line_number":1395,"context_line":"        values \u003d {"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F%2BK%2Bg%3D","line":1392,"updated":"2013-11-29 21:46:38.000000000","message":"same as line 1409","commit_id":"1dac387d6700b8d11f07919f59d09f7d28f8cf4b"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"1188981cc24ec0eb9a67bee1aaba065e8ac525ba","unresolved":false,"context_lines":[{"line_number":1406,"context_line":"        self.assertEqual(task[\u0027type\u0027], \u0027export\u0027)"},{"line_number":1407,"context_line":"        self.assertEqual(task[\u0027status\u0027], \u0027pending\u0027)"},{"line_number":1408,"context_line":""},{"line_number":1409,"context_line":"    def test_task_update(self):"},{"line_number":1410,"context_line":"        self.context.tenant \u003d uuidutils.generate_uuid()"},{"line_number":1411,"context_line":"        result \u003d {\u0027foo\u0027: \u0027bar\u0027}"},{"line_number":1412,"context_line":"        message \u003d \u0027This is a error string\u0027"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F%2BK%2Bs%3D","line":1409,"updated":"2013-11-29 21:46:38.000000000","message":"Since input and result are JSONEncodedDict in the sqlalchemy model, may be we need to add another test for checking appropriate error raised when either are attempted to be updated with incorrect values (non-dict values).","commit_id":"1dac387d6700b8d11f07919f59d09f7d28f8cf4b"},{"author":{"_account_id":4463,"name":"iccha-sethi","email":"iccha.sethi@rackspace.com","username":"iccha-sethi"},"change_message_id":"cd417007a96b34e5e4d5540315ec4dec8492ac76","unresolved":false,"context_lines":[{"line_number":1424,"context_line":"        self.assertEqual(task[\u0027type\u0027], \u0027import\u0027)"},{"line_number":1425,"context_line":"        self.assertEqual(task[\u0027status\u0027], \u0027processing\u0027)"},{"line_number":1426,"context_line":"        self.assertEqual(task[\u0027result\u0027], result)"},{"line_number":1427,"context_line":"        self.assertEqual(task[\u0027message\u0027], message)"},{"line_number":1428,"context_line":""},{"line_number":1429,"context_line":"    def test_task_delete(self):"},{"line_number":1430,"context_line":"        task_values \u003d build_task_fixture(owner\u003dself.context.owner)"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F%2BLFI%3D","line":1427,"updated":"2013-11-29 20:14:54.000000000","message":"can you also assert that updating task info, updates task updated_at?","commit_id":"1dac387d6700b8d11f07919f59d09f7d28f8cf4b"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"1188981cc24ec0eb9a67bee1aaba065e8ac525ba","unresolved":false,"context_lines":[{"line_number":1424,"context_line":"        self.assertEqual(task[\u0027type\u0027], \u0027import\u0027)"},{"line_number":1425,"context_line":"        self.assertEqual(task[\u0027status\u0027], \u0027processing\u0027)"},{"line_number":1426,"context_line":"        self.assertEqual(task[\u0027result\u0027], result)"},{"line_number":1427,"context_line":"        self.assertEqual(task[\u0027message\u0027], message)"},{"line_number":1428,"context_line":""},{"line_number":1429,"context_line":"    def test_task_delete(self):"},{"line_number":1430,"context_line":"        task_values \u003d build_task_fixture(owner\u003dself.context.owner)"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F%2BK%2FE%3D","line":1427,"in_reply_to":"AAAATn%2F%2BLDo%3D","updated":"2013-11-29 21:46:38.000000000","message":"Realized that, since we do soft deleted on tasks we do not delete task_info. Hence, updated_at won\u0027t be changed.\n\nHowever, I will add asserts for all the task attributes.","commit_id":"1dac387d6700b8d11f07919f59d09f7d28f8cf4b"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"81578556665a6a54ad4e6898587aae365460460d","unresolved":false,"context_lines":[{"line_number":1424,"context_line":"        self.assertEqual(task[\u0027type\u0027], \u0027import\u0027)"},{"line_number":1425,"context_line":"        self.assertEqual(task[\u0027status\u0027], \u0027processing\u0027)"},{"line_number":1426,"context_line":"        self.assertEqual(task[\u0027result\u0027], result)"},{"line_number":1427,"context_line":"        self.assertEqual(task[\u0027message\u0027], message)"},{"line_number":1428,"context_line":""},{"line_number":1429,"context_line":"    def test_task_delete(self):"},{"line_number":1430,"context_line":"        task_values \u003d build_task_fixture(owner\u003dself.context.owner)"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F%2BLDo%3D","line":1427,"in_reply_to":"AAAATn%2F%2BLFI%3D","updated":"2013-11-29 20:41:44.000000000","message":"sounds good.","commit_id":"1dac387d6700b8d11f07919f59d09f7d28f8cf4b"},{"author":{"_account_id":4463,"name":"iccha-sethi","email":"iccha.sethi@rackspace.com","username":"iccha-sethi"},"change_message_id":"cd417007a96b34e5e4d5540315ec4dec8492ac76","unresolved":false,"context_lines":[{"line_number":1435,"context_line":"        self.assertIsNone(task[\u0027deleted_at\u0027])"},{"line_number":1436,"context_line":""},{"line_number":1437,"context_line":"        task_id \u003d task[\u0027id\u0027]"},{"line_number":1438,"context_line":"        self.db_api.task_delete(self.context, task_id)"},{"line_number":1439,"context_line":"        self.assertRaises(exception.TaskNotFound, self.db_api.task_get,"},{"line_number":1440,"context_line":"                          self.context, task_id)"},{"line_number":1441,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F%2BLFM%3D","line":1438,"updated":"2013-11-29 20:14:54.000000000","message":"could u add in check for task info here as well?","commit_id":"1dac387d6700b8d11f07919f59d09f7d28f8cf4b"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"1188981cc24ec0eb9a67bee1aaba065e8ac525ba","unresolved":false,"context_lines":[{"line_number":1435,"context_line":"        self.assertIsNone(task[\u0027deleted_at\u0027])"},{"line_number":1436,"context_line":""},{"line_number":1437,"context_line":"        task_id \u003d task[\u0027id\u0027]"},{"line_number":1438,"context_line":"        self.db_api.task_delete(self.context, task_id)"},{"line_number":1439,"context_line":"        self.assertRaises(exception.TaskNotFound, self.db_api.task_get,"},{"line_number":1440,"context_line":"                          self.context, task_id)"},{"line_number":1441,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F%2BK%2FA%3D","line":1438,"in_reply_to":"AAAATn%2F%2BLDg%3D","updated":"2013-11-29 21:46:38.000000000","message":"Same as above. We won\u0027t delete task_info row for soft-delete on a task.","commit_id":"1dac387d6700b8d11f07919f59d09f7d28f8cf4b"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"81578556665a6a54ad4e6898587aae365460460d","unresolved":false,"context_lines":[{"line_number":1435,"context_line":"        self.assertIsNone(task[\u0027deleted_at\u0027])"},{"line_number":1436,"context_line":""},{"line_number":1437,"context_line":"        task_id \u003d task[\u0027id\u0027]"},{"line_number":1438,"context_line":"        self.db_api.task_delete(self.context, task_id)"},{"line_number":1439,"context_line":"        self.assertRaises(exception.TaskNotFound, self.db_api.task_get,"},{"line_number":1440,"context_line":"                          self.context, task_id)"},{"line_number":1441,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F%2BLDg%3D","line":1438,"in_reply_to":"AAAATn%2F%2BLFM%3D","updated":"2013-11-29 20:41:44.000000000","message":"sounds good.","commit_id":"1dac387d6700b8d11f07919f59d09f7d28f8cf4b"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"1188981cc24ec0eb9a67bee1aaba065e8ac525ba","unresolved":false,"context_lines":[{"line_number":1437,"context_line":"        task_id \u003d task[\u0027id\u0027]"},{"line_number":1438,"context_line":"        self.db_api.task_delete(self.context, task_id)"},{"line_number":1439,"context_line":"        self.assertRaises(exception.TaskNotFound, self.db_api.task_get,"},{"line_number":1440,"context_line":"                          self.context, task_id)"},{"line_number":1441,"context_line":""},{"line_number":1442,"context_line":""},{"line_number":1443,"context_line":"class TestVisibility(test_utils.BaseTestCase):"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F%2BK%2Bo%3D","line":1440,"updated":"2013-11-29 21:46:38.000000000","message":"may be we can add another test for the following scenario:\n\n1. when deleted has happened on a task and\n\n2. context.is_admin \u003d True and task and task_info can be obtained.\n\n(Basically, more test coverage)","commit_id":"1dac387d6700b8d11f07919f59d09f7d28f8cf4b"}],"glance/tests/unit/test_migrations.py":[{"author":{"_account_id":4463,"name":"iccha-sethi","email":"iccha.sethi@rackspace.com","username":"iccha-sethi"},"change_message_id":"b60b147b9425deeaac69126dad795af6cae30618","unresolved":false,"context_lines":[{"line_number":1089,"context_line":"        self.assertEqual(task_info.task_id, data[0][\u0027id\u0027])"},{"line_number":1090,"context_line":"        self.assertEqual(task_info.input, data[0][\u0027input\u0027])"},{"line_number":1091,"context_line":"        self.assertEqual(task_info.result, data[0][\u0027result\u0027])"},{"line_number":1092,"context_line":"        self.assertIsNone(task_info.message)"},{"line_number":1093,"context_line":""},{"line_number":1094,"context_line":"        task_info \u003d records[1]"},{"line_number":1095,"context_line":"        self.assertEqual(task_info.task_id, \u0027task-2\u0027)"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAATn%2F%2BX%2BU%3D","line":1092,"updated":"2013-11-26 19:44:16.000000000","message":"should we be checking that it gets the updated_at and created_at too?","commit_id":"338a8ed5cc07f99b3a0d6df32ff660b106f8597e"},{"author":{"_account_id":7703,"name":"Venkatesh Sampath","email":"venkatesh.sampath@outlook.com","username":"venkateshsampath"},"change_message_id":"bd306bb6fe8c0dcccc2727c05d68123458bee00e","unresolved":false,"context_lines":[{"line_number":1089,"context_line":"        self.assertEqual(task_info.task_id, data[0][\u0027id\u0027])"},{"line_number":1090,"context_line":"        self.assertEqual(task_info.input, data[0][\u0027input\u0027])"},{"line_number":1091,"context_line":"        self.assertEqual(task_info.result, data[0][\u0027result\u0027])"},{"line_number":1092,"context_line":"        self.assertIsNone(task_info.message)"},{"line_number":1093,"context_line":""},{"line_number":1094,"context_line":"        task_info \u003d records[1]"},{"line_number":1095,"context_line":"        self.assertEqual(task_info.task_id, \u0027task-2\u0027)"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAATn%2F%2BVZA%3D","line":1092,"in_reply_to":"AAAATn%2F%2BX%2BU%3D","updated":"2013-11-27 13:34:55.000000000","message":"will fix it. thanks iccha.","commit_id":"338a8ed5cc07f99b3a0d6df32ff660b106f8597e"},{"author":{"_account_id":4463,"name":"iccha-sethi","email":"iccha.sethi@rackspace.com","username":"iccha-sethi"},"change_message_id":"b60b147b9425deeaac69126dad795af6cae30618","unresolved":false,"context_lines":[{"line_number":1114,"context_line":"        task_1 \u003d tasks.get(\u0027task-1\u0027)"},{"line_number":1115,"context_line":"        self.assertEqual(task_1.input, \u0027some input\u0027)"},{"line_number":1116,"context_line":"        self.assertEqual(task_1.result, \u0027successful\u0027)"},{"line_number":1117,"context_line":"        self.assertIsNone(task_1.message)"},{"line_number":1118,"context_line":""},{"line_number":1119,"context_line":"        task_2 \u003d tasks.get(\u0027task-2\u0027)"},{"line_number":1120,"context_line":"        self.assertIsNone(task_2.input)"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAATn%2F%2BX%2BI%3D","line":1117,"updated":"2013-11-26 19:44:16.000000000","message":"can u check for the condition of updated at mentioned in the migration patch?","commit_id":"338a8ed5cc07f99b3a0d6df32ff660b106f8597e"},{"author":{"_account_id":7703,"name":"Venkatesh Sampath","email":"venkatesh.sampath@outlook.com","username":"venkateshsampath"},"change_message_id":"bd306bb6fe8c0dcccc2727c05d68123458bee00e","unresolved":false,"context_lines":[{"line_number":1114,"context_line":"        task_1 \u003d tasks.get(\u0027task-1\u0027)"},{"line_number":1115,"context_line":"        self.assertEqual(task_1.input, \u0027some input\u0027)"},{"line_number":1116,"context_line":"        self.assertEqual(task_1.result, \u0027successful\u0027)"},{"line_number":1117,"context_line":"        self.assertIsNone(task_1.message)"},{"line_number":1118,"context_line":""},{"line_number":1119,"context_line":"        task_2 \u003d tasks.get(\u0027task-2\u0027)"},{"line_number":1120,"context_line":"        self.assertIsNone(task_2.input)"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAATn%2F%2BUkY%3D","line":1117,"in_reply_to":"AAAATn%2F%2BX%2BI%3D","updated":"2013-11-27 13:34:55.000000000","message":"yes, i will include the condition.","commit_id":"338a8ed5cc07f99b3a0d6df32ff660b106f8597e"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"259dd276dfa4b0cf9a2e70c499a19a4ef4438520","unresolved":false,"context_lines":[{"line_number":1134,"context_line":""},{"line_number":1135,"context_line":"        self.assertEquals(len(records), 2)"},{"line_number":1136,"context_line":""},{"line_number":1137,"context_line":"        task_info \u003d records[0]"},{"line_number":1138,"context_line":"        self.assertEqual(task_info.task_id, data[0][\u0027id\u0027])"},{"line_number":1139,"context_line":"        self.assertEqual(task_info.input, data[0][\u0027input\u0027])"},{"line_number":1140,"context_line":"        self.assertEqual(task_info.result, data[0][\u0027result\u0027])"}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAATn%2F94m8%3D","line":1137,"updated":"2013-12-04 21:51:08.000000000","message":"adding a for loop here as well for assertion for multiple tasks","commit_id":"b09eed9146617e20ccb756773747dcc4801e6eb2"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"259dd276dfa4b0cf9a2e70c499a19a4ef4438520","unresolved":false,"context_lines":[{"line_number":1161,"context_line":""},{"line_number":1162,"context_line":"        tasks \u003d dict([(t.id, t) for t in records])"},{"line_number":1163,"context_line":""},{"line_number":1164,"context_line":"        task_1 \u003d tasks.get(\u0027task-1\u0027)"},{"line_number":1165,"context_line":"        self.assertEqual(task_1.input, \u0027some input\u0027)"},{"line_number":1166,"context_line":"        self.assertEqual(task_1.result, \u0027successful\u0027)"},{"line_number":1167,"context_line":"        self.assertIsNone(task_1.message)"}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAATn%2F94m0%3D","line":1164,"updated":"2013-12-04 21:51:08.000000000","message":"adding a for loop here as well for assertion for multiple tasks","commit_id":"b09eed9146617e20ccb756773747dcc4801e6eb2"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"0ee010d6ac3cf8b11b41d04dc211e6d3881a1e5f","unresolved":false,"context_lines":[{"line_number":1161,"context_line":""},{"line_number":1162,"context_line":"        tasks \u003d dict([(t.id, t) for t in records])"},{"line_number":1163,"context_line":""},{"line_number":1164,"context_line":"        task_1 \u003d tasks.get(\u0027task-1\u0027)"},{"line_number":1165,"context_line":"        self.assertEqual(task_1.input, \u0027some input\u0027)"},{"line_number":1166,"context_line":"        self.assertEqual(task_1.result, \u0027successful\u0027)"},{"line_number":1167,"context_line":"        self.assertIsNone(task_1.message)"}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAATn%2F94c4%3D","line":1164,"in_reply_to":"AAAATn%2F94m0%3D","updated":"2013-12-04 22:36:01.000000000","message":"This was getting gruesome so avoided the loop.","commit_id":"b09eed9146617e20ccb756773747dcc4801e6eb2"}]}
