)]}'
{"freezer_api/db/sqlalchemy/api.py":[{"author":{"_account_id":28619,"name":"Dmitriy Rabotyagov","email":"noonedeadpunk@gmail.com","username":"noonedeadpunk"},"change_message_id":"d1fbfcdc1fd124e8712d78f652f61391ae03d4ae","unresolved":true,"context_lines":[{"line_number":1054,"context_line":"                      inc_retry_interval\u003dFalse, retry_on_deadlock\u003dTrue)"},{"line_number":1055,"context_line":"def purge_deleted_rows(age_in_days):"},{"line_number":1056,"context_line":"    \"\"\"Hard delete rows soft deleted more than age_in_days days ago.\"\"\""},{"line_number":1057,"context_line":"    if age_in_days \u003c 0:"},{"line_number":1058,"context_line":"        raise ValueError(\u0027Age in days must be a non-negative integer\u0027)"},{"line_number":1059,"context_line":"    cutoff \u003d timeutils.utcnow() - datetime.timedelta(days\u003dage_in_days)"},{"line_number":1060,"context_line":"    with (session_for_write() as session):"},{"line_number":1061,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":1,"id":"18b57690_affc8cee","line":1058,"range":{"start_line":1057,"start_character":0,"end_line":1058,"end_character":70},"updated":"2026-10-23 08:47:42.000000000","message":"do you think it might be better to check and raise earlier in cmd/manage.py?","commit_id":"dbec9e2d6ca7b9d04e690f4e9fa23f36bdedb95e"},{"author":{"_account_id":39044,"name":"Alicja Filipek","display_name":"alaf01","email":"alicja.filipek@cleura.com","username":"alaf01"},"change_message_id":"dd2f0f65e43571ad458abf9ccdd2e0f216681b59","unresolved":true,"context_lines":[{"line_number":1054,"context_line":"                      inc_retry_interval\u003dFalse, retry_on_deadlock\u003dTrue)"},{"line_number":1055,"context_line":"def purge_deleted_rows(age_in_days):"},{"line_number":1056,"context_line":"    \"\"\"Hard delete rows soft deleted more than age_in_days days ago.\"\"\""},{"line_number":1057,"context_line":"    if age_in_days \u003c 0:"},{"line_number":1058,"context_line":"        raise ValueError(\u0027Age in days must be a non-negative integer\u0027)"},{"line_number":1059,"context_line":"    cutoff \u003d timeutils.utcnow() - datetime.timedelta(days\u003dage_in_days)"},{"line_number":1060,"context_line":"    with (session_for_write() as session):"},{"line_number":1061,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":1,"id":"1b5405dd_4d3d7ee1","line":1058,"range":{"start_line":1057,"start_character":0,"end_line":1058,"end_character":70},"in_reply_to":"18b57690_affc8cee","updated":"2026-10-27 11:53:02.000000000","message":"We could check it earlier, but what I like to do is to move all logic to the service layer. It is kind of validation of the params, so it also belongs to management, but checking the age_in_days also fits to the function itself (as it is not about the wrong format, but what should the function \u0027purge_deleted_rows\u0027 do in case of negative \u0027age_in_days\u0027. I\u0027d say it fits more in function itself, but as a validation it can be performed also earier, and raise immediately. I also don\u0027t want the management command to grow too much.","commit_id":"dbec9e2d6ca7b9d04e690f4e9fa23f36bdedb95e"},{"author":{"_account_id":28619,"name":"Dmitriy Rabotyagov","email":"noonedeadpunk@gmail.com","username":"noonedeadpunk"},"change_message_id":"7fa80edd26880df37c52cdb426ac79a316a4915d","unresolved":false,"context_lines":[{"line_number":1054,"context_line":"                      inc_retry_interval\u003dFalse, retry_on_deadlock\u003dTrue)"},{"line_number":1055,"context_line":"def purge_deleted_rows(age_in_days):"},{"line_number":1056,"context_line":"    \"\"\"Hard delete rows soft deleted more than age_in_days days ago.\"\"\""},{"line_number":1057,"context_line":"    if age_in_days \u003c 0:"},{"line_number":1058,"context_line":"        raise ValueError(\u0027Age in days must be a non-negative integer\u0027)"},{"line_number":1059,"context_line":"    cutoff \u003d timeutils.utcnow() - datetime.timedelta(days\u003dage_in_days)"},{"line_number":1060,"context_line":"    with (session_for_write() as session):"},{"line_number":1061,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":1,"id":"839634e7_6e55fe3c","line":1058,"range":{"start_line":1057,"start_character":0,"end_line":1058,"end_character":70},"in_reply_to":"1b5405dd_4d3d7ee1","updated":"2026-10-29 13:32:07.000000000","message":"Acknowledged","commit_id":"dbec9e2d6ca7b9d04e690f4e9fa23f36bdedb95e"},{"author":{"_account_id":28619,"name":"Dmitriy Rabotyagov","email":"noonedeadpunk@gmail.com","username":"noonedeadpunk"},"change_message_id":"d1fbfcdc1fd124e8712d78f652f61391ae03d4ae","unresolved":true,"context_lines":[{"line_number":1067,"context_line":"                    jobs_to_remove.with_entities(models.Job.id))"},{"line_number":1068,"context_line":"            ).delete(synchronize_session\u003dFalse)"},{"line_number":1069,"context_line":"            _log_count(models.JobAction, action_jobs_count)"},{"line_number":1070,"context_line":"            user_credentials_count \u003d session.query("},{"line_number":1071,"context_line":"                models.UserCredentials).filter("},{"line_number":1072,"context_line":"                models.UserCredentials.job_id.in_("},{"line_number":1073,"context_line":"                    jobs_to_remove.with_entities(models.Job.id))"},{"line_number":1074,"context_line":"            ).delete(synchronize_session\u003dFalse)"},{"line_number":1075,"context_line":"            _log_count(models.UserCredentials, user_credentials_count)"},{"line_number":1076,"context_line":"            jobs_count \u003d jobs_to_remove.delete(synchronize_session\u003dFalse)"},{"line_number":1077,"context_line":"            _log_count(models.Job, jobs_count)"}],"source_content_type":"text/x-python","patch_set":1,"id":"29b41d69_28bde61b","line":1074,"range":{"start_line":1070,"start_character":0,"end_line":1074,"end_character":47},"updated":"2026-10-23 08:47:42.000000000","message":"Question - do we actually revoke trusts when marking it as deleted? Can you kindly double check that?","commit_id":"dbec9e2d6ca7b9d04e690f4e9fa23f36bdedb95e"},{"author":{"_account_id":28619,"name":"Dmitriy Rabotyagov","email":"noonedeadpunk@gmail.com","username":"noonedeadpunk"},"change_message_id":"7fa80edd26880df37c52cdb426ac79a316a4915d","unresolved":false,"context_lines":[{"line_number":1067,"context_line":"                    jobs_to_remove.with_entities(models.Job.id))"},{"line_number":1068,"context_line":"            ).delete(synchronize_session\u003dFalse)"},{"line_number":1069,"context_line":"            _log_count(models.JobAction, action_jobs_count)"},{"line_number":1070,"context_line":"            user_credentials_count \u003d session.query("},{"line_number":1071,"context_line":"                models.UserCredentials).filter("},{"line_number":1072,"context_line":"                models.UserCredentials.job_id.in_("},{"line_number":1073,"context_line":"                    jobs_to_remove.with_entities(models.Job.id))"},{"line_number":1074,"context_line":"            ).delete(synchronize_session\u003dFalse)"},{"line_number":1075,"context_line":"            _log_count(models.UserCredentials, user_credentials_count)"},{"line_number":1076,"context_line":"            jobs_count \u003d jobs_to_remove.delete(synchronize_session\u003dFalse)"},{"line_number":1077,"context_line":"            _log_count(models.Job, jobs_count)"}],"source_content_type":"text/x-python","patch_set":1,"id":"aa9e315a_6b8fbc09","line":1074,"range":{"start_line":1070,"start_character":0,"end_line":1074,"end_character":47},"in_reply_to":"27a88c62_356d02f8","updated":"2026-10-29 13:32:07.000000000","message":"Acknowledged","commit_id":"dbec9e2d6ca7b9d04e690f4e9fa23f36bdedb95e"},{"author":{"_account_id":39044,"name":"Alicja Filipek","display_name":"alaf01","email":"alicja.filipek@cleura.com","username":"alaf01"},"change_message_id":"dd2f0f65e43571ad458abf9ccdd2e0f216681b59","unresolved":true,"context_lines":[{"line_number":1067,"context_line":"                    jobs_to_remove.with_entities(models.Job.id))"},{"line_number":1068,"context_line":"            ).delete(synchronize_session\u003dFalse)"},{"line_number":1069,"context_line":"            _log_count(models.JobAction, action_jobs_count)"},{"line_number":1070,"context_line":"            user_credentials_count \u003d session.query("},{"line_number":1071,"context_line":"                models.UserCredentials).filter("},{"line_number":1072,"context_line":"                models.UserCredentials.job_id.in_("},{"line_number":1073,"context_line":"                    jobs_to_remove.with_entities(models.Job.id))"},{"line_number":1074,"context_line":"            ).delete(synchronize_session\u003dFalse)"},{"line_number":1075,"context_line":"            _log_count(models.UserCredentials, user_credentials_count)"},{"line_number":1076,"context_line":"            jobs_count \u003d jobs_to_remove.delete(synchronize_session\u003dFalse)"},{"line_number":1077,"context_line":"            _log_count(models.Job, jobs_count)"}],"source_content_type":"text/x-python","patch_set":1,"id":"27a88c62_356d02f8","line":1074,"range":{"start_line":1070,"start_character":0,"end_line":1074,"end_character":47},"in_reply_to":"29b41d69_28bde61b","updated":"2026-10-27 11:53:02.000000000","message":"Yes, we do revoke trust when soft deleting Jobs. If any other active job uses the trust, it is not removed (as intended).","commit_id":"dbec9e2d6ca7b9d04e690f4e9fa23f36bdedb95e"},{"author":{"_account_id":28619,"name":"Dmitriy Rabotyagov","email":"noonedeadpunk@gmail.com","username":"noonedeadpunk"},"change_message_id":"d1fbfcdc1fd124e8712d78f652f61391ae03d4ae","unresolved":true,"context_lines":[{"line_number":1090,"context_line":"            ).delete(synchronize_session\u003dFalse)"},{"line_number":1091,"context_line":"            _log_count(models.Client, clients__count)"},{"line_number":1092,"context_line":"            for model in [models.JobAction, models.UserCredentials,"},{"line_number":1093,"context_line":"                          models.Action, models.Backup,"},{"line_number":1094,"context_line":"                          models.ActionReport]:"},{"line_number":1095,"context_line":"                count \u003d session.query(model).filter("},{"line_number":1096,"context_line":"                    model.deleted.is_(True),"},{"line_number":1097,"context_line":"                    model.deleted_at \u003c cutoff"}],"source_content_type":"text/x-python","patch_set":1,"id":"d6346523_af943d91","line":1094,"range":{"start_line":1093,"start_character":26,"end_line":1094,"end_character":45},"updated":"2026-10-23 08:47:42.000000000","message":"Is action/actionreport order is correct? Just thinking of foreign keys","commit_id":"dbec9e2d6ca7b9d04e690f4e9fa23f36bdedb95e"},{"author":{"_account_id":28619,"name":"Dmitriy Rabotyagov","email":"noonedeadpunk@gmail.com","username":"noonedeadpunk"},"change_message_id":"7fa80edd26880df37c52cdb426ac79a316a4915d","unresolved":false,"context_lines":[{"line_number":1090,"context_line":"            ).delete(synchronize_session\u003dFalse)"},{"line_number":1091,"context_line":"            _log_count(models.Client, clients__count)"},{"line_number":1092,"context_line":"            for model in [models.JobAction, models.UserCredentials,"},{"line_number":1093,"context_line":"                          models.Action, models.Backup,"},{"line_number":1094,"context_line":"                          models.ActionReport]:"},{"line_number":1095,"context_line":"                count \u003d session.query(model).filter("},{"line_number":1096,"context_line":"                    model.deleted.is_(True),"},{"line_number":1097,"context_line":"                    model.deleted_at \u003c cutoff"}],"source_content_type":"text/x-python","patch_set":1,"id":"a9ccf358_a6a6189c","line":1094,"range":{"start_line":1093,"start_character":26,"end_line":1094,"end_character":45},"in_reply_to":"7831244e_365f16d2","updated":"2026-10-29 13:32:07.000000000","message":"Acknowledged","commit_id":"dbec9e2d6ca7b9d04e690f4e9fa23f36bdedb95e"},{"author":{"_account_id":39044,"name":"Alicja Filipek","display_name":"alaf01","email":"alicja.filipek@cleura.com","username":"alaf01"},"change_message_id":"dd2f0f65e43571ad458abf9ccdd2e0f216681b59","unresolved":true,"context_lines":[{"line_number":1090,"context_line":"            ).delete(synchronize_session\u003dFalse)"},{"line_number":1091,"context_line":"            _log_count(models.Client, clients__count)"},{"line_number":1092,"context_line":"            for model in [models.JobAction, models.UserCredentials,"},{"line_number":1093,"context_line":"                          models.Action, models.Backup,"},{"line_number":1094,"context_line":"                          models.ActionReport]:"},{"line_number":1095,"context_line":"                count \u003d session.query(model).filter("},{"line_number":1096,"context_line":"                    model.deleted.is_(True),"},{"line_number":1097,"context_line":"                    model.deleted_at \u003c cutoff"}],"source_content_type":"text/x-python","patch_set":1,"id":"7831244e_365f16d2","line":1094,"range":{"start_line":1093,"start_character":26,"end_line":1094,"end_character":45},"in_reply_to":"d6346523_af943d91","updated":"2026-10-27 11:53:02.000000000","message":"Yes, I kept the order in mind when working on the solution. ActionReport does not keep ids as a Foreign keys, so it is safe to remove it after Action. But in case there is some db change (as a proper FK connection between ActionReport and Action) I changed the order- it does not hurt, and that command is a place that might be easly overlooked while changing to a ForeignKey connection.","commit_id":"dbec9e2d6ca7b9d04e690f4e9fa23f36bdedb95e"}]}
