django-lambda-tasks 0.2.5__tar.gz → 0.3.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/PKG-INFO +1 -1
  2. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/lambda_tasks/admin.py +11 -0
  3. django_lambda_tasks-0.3.0/lambda_tasks/migrations/0002_alter_taskrecord_status.py +60 -0
  4. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/lambda_tasks/models.py +8 -8
  5. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/pyproject.toml +1 -1
  6. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/tests/test_decorator.py +1 -1
  7. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/tests/test_models.py +23 -23
  8. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/tests/test_tasks.py +4 -4
  9. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.github/workflows/ci.yml +0 -0
  10. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.github/workflows/release.yml +0 -0
  11. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.gitignore +0 -0
  12. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/deferred-task-enqueue/.config.kiro +0 -0
  13. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/deferred-task-enqueue/design.md +0 -0
  14. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/deferred-task-enqueue/requirements.md +0 -0
  15. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/deferred-task-enqueue/tasks.md +0 -0
  16. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/eager-mode-example-app/.config.kiro +0 -0
  17. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/eager-mode-example-app/design.md +0 -0
  18. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/eager-mode-example-app/requirements.md +0 -0
  19. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/eager-mode-example-app/tasks.md +0 -0
  20. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/ignore-errors-decorator-option/.config.kiro +0 -0
  21. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/ignore-errors-decorator-option/design.md +0 -0
  22. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/ignore-errors-decorator-option/requirements.md +0 -0
  23. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/ignore-errors-decorator-option/tasks.md +0 -0
  24. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/import-string-task-resolution/.config.kiro +0 -0
  25. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/import-string-task-resolution/design.md +0 -0
  26. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/import-string-task-resolution/requirements.md +0 -0
  27. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/import-string-task-resolution/tasks.md +0 -0
  28. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/retry-delay/.config.kiro +0 -0
  29. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/retry-delay/design.md +0 -0
  30. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/retry-delay/requirements.md +0 -0
  31. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/retry-delay/tasks.md +0 -0
  32. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/rse-background-tasks/.config.kiro +0 -0
  33. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/rse-background-tasks/design.md +0 -0
  34. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/rse-background-tasks/requirements.md +0 -0
  35. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/rse-background-tasks/tasks.md +0 -0
  36. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/rse-background-tasks-bugfix/.config.kiro +0 -0
  37. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/rse-background-tasks-bugfix/bugfix.md +0 -0
  38. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/rse-background-tasks-bugfix/design.md +0 -0
  39. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/rse-background-tasks-bugfix/tasks.md +0 -0
  40. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/singleton-task/.config.kiro +0 -0
  41. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/singleton-task/design.md +0 -0
  42. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/singleton-task/requirements.md +0 -0
  43. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/singleton-task/tasks.md +0 -0
  44. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/ssm-environment-loader/.config.kiro +0 -0
  45. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/ssm-environment-loader/design.md +0 -0
  46. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/ssm-environment-loader/requirements.md +0 -0
  47. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/ssm-environment-loader/tasks.md +0 -0
  48. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/task-retry/.config.kiro +0 -0
  49. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/task-retry/design.md +0 -0
  50. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/task-retry/requirements.md +0 -0
  51. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/task-retry/tasks.md +0 -0
  52. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/steering/product.md +0 -0
  53. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/steering/structure.md +0 -0
  54. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/steering/tech.md +0 -0
  55. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.pre-commit-config.yaml +0 -0
  56. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.vscode/settings.json +0 -0
  57. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/README.md +0 -0
  58. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/example/README.md +0 -0
  59. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/example/example_app/__init__.py +0 -0
  60. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/example/example_app/apps.py +0 -0
  61. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/example/example_app/tasks.py +0 -0
  62. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/example/example_app/urls.py +0 -0
  63. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/example/example_app/views.py +0 -0
  64. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/example/example_project/__init__.py +0 -0
  65. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/example/example_project/settings.py +0 -0
  66. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/example/example_project/urls.py +0 -0
  67. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/example/example_project/wsgi.py +0 -0
  68. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/example/manage.py +0 -0
  69. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/lambda_tasks/__init__.py +0 -0
  70. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/lambda_tasks/apps.py +0 -0
  71. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/lambda_tasks/decorators.py +0 -0
  72. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/lambda_tasks/environment_loader.py +0 -0
  73. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/lambda_tasks/handler.py +0 -0
  74. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/lambda_tasks/logging.py +0 -0
  75. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/lambda_tasks/migrations/0001_initial.py +0 -0
  76. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/lambda_tasks/migrations/__init__.py +0 -0
  77. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/lambda_tasks/secret_loader.py +0 -0
  78. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/lambda_tasks/settings.py +0 -0
  79. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/lambda_tasks/tasks.py +0 -0
  80. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/lambda_tasks/timeouts.py +0 -0
  81. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/tests/conftest.py +0 -0
  82. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/tests/settings.py +0 -0
  83. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/tests/test_admin.py +0 -0
  84. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/tests/test_decorators.py +0 -0
  85. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/tests/test_deferred_enqueue.py +0 -0
  86. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/tests/test_environment_loader.py +0 -0
  87. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/tests/test_handler.py +0 -0
  88. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/tests/test_kwargs_only.py +0 -0
  89. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/tests/test_logging.py +0 -0
  90. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/tests/test_secret_loader.py +0 -0
  91. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/tests/test_serializer.py +0 -0
  92. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/tests/test_settings.py +0 -0
  93. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/tests/test_timeout_validation.py +0 -0
  94. {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/tests/test_timeouts.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: django-lambda-tasks
3
- Version: 0.2.5
3
+ Version: 0.3.0
4
4
  Summary: Run async tasks in a lambda function
5
5
  Requires-Python: >=3.10
6
6
  Requires-Dist: awslambdaric
@@ -22,6 +22,17 @@ class TaskRecordAdmin(admin.ModelAdmin):
22
22
  list_filter = ("status", "task_name")
23
23
  date_hierarchy = "start_time"
24
24
  search_fields = ("pk", "kwargs")
25
+ readonly_fields = (
26
+ "pk",
27
+ "task_name",
28
+ "kwargs",
29
+ "n_retries",
30
+ "status",
31
+ "start_time",
32
+ "end_time",
33
+ "result",
34
+ "traceback",
35
+ )
25
36
 
26
37
  def get_queryset(self, request: HttpRequest) -> QuerySet:
27
38
  return (
@@ -0,0 +1,60 @@
1
+ """Rename SUCCESS → SUCCEEDED and RETRYING → RETRIED status values."""
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ def rename_statuses_forward(apps, schema_editor):
7
+ TaskRecord = apps.get_model("lambda_tasks", "TaskRecord")
8
+ TaskRecord.objects.filter(status="SUCCESS").update(status="SUCCEEDED")
9
+ TaskRecord.objects.filter(status="RETRYING").update(status="RETRIED")
10
+
11
+
12
+ def rename_statuses_backward(apps, schema_editor):
13
+ TaskRecord = apps.get_model("lambda_tasks", "TaskRecord")
14
+ TaskRecord.objects.filter(status="SUCCEEDED").update(status="SUCCESS")
15
+ TaskRecord.objects.filter(status="RETRIED").update(status="RETRYING")
16
+
17
+
18
+ class Migration(migrations.Migration):
19
+
20
+ dependencies = [
21
+ ("lambda_tasks", "0001_initial"),
22
+ ]
23
+
24
+ operations = [
25
+ # First, drop the existing check constraint so we can update data
26
+ migrations.RemoveConstraint(
27
+ model_name="taskrecord",
28
+ name="taskrecord_status_valid",
29
+ ),
30
+ # Run data migration to rename existing rows
31
+ migrations.RunPython(
32
+ rename_statuses_forward,
33
+ rename_statuses_backward,
34
+ ),
35
+ # Alter the field with new choices
36
+ migrations.AlterField(
37
+ model_name="taskrecord",
38
+ name="status",
39
+ field=models.CharField(
40
+ choices=[
41
+ ("RUNNING", "Running"),
42
+ ("SUCCEEDED", "Succeeded"),
43
+ ("FAILED", "Failed"),
44
+ ("RETRIED", "Retried"),
45
+ ],
46
+ editable=False,
47
+ max_length=10,
48
+ ),
49
+ ),
50
+ # Re-add the check constraint with updated values
51
+ migrations.AddConstraint(
52
+ model_name="taskrecord",
53
+ constraint=models.CheckConstraint(
54
+ condition=models.Q(
55
+ ("status__in", ["RUNNING", "SUCCEEDED", "FAILED", "RETRIED"])
56
+ ),
57
+ name="taskrecord_status_valid",
58
+ ),
59
+ ),
60
+ ]
@@ -30,9 +30,9 @@ class MaxRetriesExceededError(Exception):
30
30
 
31
31
  class TaskStatus(models.TextChoices):
32
32
  RUNNING = "RUNNING"
33
- SUCCESS = "SUCCESS"
33
+ SUCCEEDED = "SUCCEEDED"
34
34
  FAILED = "FAILED"
35
- RETRYING = "RETRYING"
35
+ RETRIED = "RETRIED"
36
36
 
37
37
 
38
38
  class TaskRecord(models.Model):
@@ -115,7 +115,7 @@ class SQSLambdaTaskMessage(BaseModel):
115
115
  "task_name": self.task_name,
116
116
  "kwargs": self.model_dump(mode="json")["kwargs"],
117
117
  "n_retries": self.n_retries,
118
- "status": TaskRecord.TaskStatus.RUNNING,
118
+ "status": TaskStatus.RUNNING,
119
119
  "start_time": now(),
120
120
  },
121
121
  )
@@ -157,7 +157,7 @@ class SQSLambdaTaskMessage(BaseModel):
157
157
  elif effective_retry_on and isinstance(error, effective_retry_on):
158
158
  conf = LambdaTasksSettings()
159
159
  if self.n_retries >= conf.MAX_RETRIES:
160
- record.status = TaskRecord.TaskStatus.FAILED
160
+ record.status = TaskStatus.FAILED
161
161
  record.traceback = traceback.format_exc()
162
162
  record.end_time = now()
163
163
  record.save(update_fields=["status", "traceback", "end_time"])
@@ -170,7 +170,7 @@ class SQSLambdaTaskMessage(BaseModel):
170
170
  task_name=self.task_name, n_retries=self.n_retries
171
171
  )
172
172
  else:
173
- record.status = TaskRecord.TaskStatus.RETRYING
173
+ record.status = TaskStatus.RETRIED
174
174
  record.traceback = traceback.format_exc()
175
175
  record.end_time = now()
176
176
  record.save(update_fields=["status", "traceback", "end_time"])
@@ -198,7 +198,7 @@ class SQSLambdaTaskMessage(BaseModel):
198
198
  else:
199
199
  task_logger.error(error, exc_info=True)
200
200
 
201
- record.status = TaskRecord.TaskStatus.FAILED
201
+ record.status = TaskStatus.FAILED
202
202
  record.traceback = traceback.format_exc()
203
203
  record.end_time = now()
204
204
  record.save(update_fields=["status", "traceback", "end_time"])
@@ -207,14 +207,14 @@ class SQSLambdaTaskMessage(BaseModel):
207
207
  return
208
208
 
209
209
  if ignored_exception is None:
210
- record.status = TaskRecord.TaskStatus.SUCCESS
210
+ record.status = TaskStatus.SUCCEEDED
211
211
  record.result = result
212
212
  record.end_time = now()
213
213
  record.save(update_fields=["status", "result", "end_time"])
214
214
 
215
215
  task_logger.info(f"Succeeded in {record.duration}")
216
216
  else:
217
- record.status = TaskRecord.TaskStatus.SUCCESS
217
+ record.status = TaskStatus.SUCCEEDED
218
218
  record.traceback = ignored_traceback
219
219
  record.end_time = now()
220
220
  record.save(update_fields=["status", "traceback", "end_time"])
@@ -7,7 +7,7 @@ packages = ["lambda_tasks"]
7
7
 
8
8
  [project]
9
9
  name = "django-lambda-tasks"
10
- version = "0.2.5"
10
+ version = "0.3.0"
11
11
  description = "Run async tasks in a lambda function"
12
12
  readme = "README.md"
13
13
  requires-python = ">=3.10"
@@ -666,7 +666,7 @@ def test_property_3_eager_mode_writes_task_record(value):
666
666
  assert TaskRecord.objects.filter(
667
667
  task_name=task_name,
668
668
  kwargs={"n": value},
669
- status__in=[TaskRecord.TaskStatus.SUCCESS, TaskRecord.TaskStatus.FAILED],
669
+ status__in=[TaskRecord.TaskStatus.SUCCEEDED, TaskRecord.TaskStatus.FAILED],
670
670
  ).exists()
671
671
 
672
672
 
@@ -66,9 +66,9 @@ class TestTaskRecordStatusChoices:
66
66
  "status",
67
67
  [
68
68
  TaskRecord.TaskStatus.RUNNING,
69
- TaskRecord.TaskStatus.SUCCESS,
69
+ TaskRecord.TaskStatus.SUCCEEDED,
70
70
  TaskRecord.TaskStatus.FAILED,
71
- TaskRecord.TaskStatus.RETRYING,
71
+ TaskRecord.TaskStatus.RETRIED,
72
72
  ],
73
73
  )
74
74
  def test_valid_status_choices(self, status):
@@ -83,21 +83,20 @@ class TestTaskRecordStatusChoices:
83
83
 
84
84
  def test_status_choice_values(self):
85
85
  assert TaskRecord.TaskStatus.RUNNING == "RUNNING"
86
- assert TaskRecord.TaskStatus.SUCCESS == "SUCCESS"
86
+ assert TaskRecord.TaskStatus.SUCCEEDED == "SUCCEEDED"
87
87
  assert TaskRecord.TaskStatus.FAILED == "FAILED"
88
- assert TaskRecord.TaskStatus.RETRYING == "RETRYING"
88
+ assert TaskRecord.TaskStatus.RETRIED == "RETRIED"
89
89
 
90
- def test_retrying_status_can_be_saved(self):
90
+ def test_retried_status_can_be_saved(self):
91
91
  record = TaskRecord.objects.create(
92
92
  task_name="myapp.tasks.job",
93
93
  pk=uuid.uuid4(),
94
94
  kwargs={},
95
95
  n_retries=0,
96
- status=TaskRecord.TaskStatus.RETRYING,
96
+ status=TaskRecord.TaskStatus.RETRIED,
97
97
  )
98
98
  assert (
99
- TaskRecord.objects.get(pk=record.pk).status
100
- == TaskRecord.TaskStatus.RETRYING
99
+ TaskRecord.objects.get(pk=record.pk).status == TaskRecord.TaskStatus.RETRIED
101
100
  )
102
101
 
103
102
 
@@ -179,7 +178,7 @@ class TestTaskRecordOrmQueryable:
179
178
  pk=uuid.uuid4(),
180
179
  kwargs={},
181
180
  n_retries=0,
182
- status=TaskRecord.TaskStatus.SUCCESS,
181
+ status=TaskRecord.TaskStatus.SUCCEEDED,
183
182
  )
184
183
  TaskRecord.objects.create(
185
184
  task_name="myapp.tasks.job",
@@ -189,7 +188,8 @@ class TestTaskRecordOrmQueryable:
189
188
  status=TaskRecord.TaskStatus.FAILED,
190
189
  )
191
190
  assert (
192
- TaskRecord.objects.filter(status=TaskRecord.TaskStatus.SUCCESS).count() == 1
191
+ TaskRecord.objects.filter(status=TaskRecord.TaskStatus.SUCCEEDED).count()
192
+ == 1
193
193
  )
194
194
  assert (
195
195
  TaskRecord.objects.filter(status=TaskRecord.TaskStatus.FAILED).count() == 1
@@ -359,7 +359,7 @@ class TestExecuteTaskSuccess:
359
359
  with patch("lambda_tasks.models.TimeoutContext"):
360
360
  msg.execute_immediately(message_id=message_id)
361
361
  record = TaskRecord.objects.get(pk=message_id)
362
- assert record.status == TaskRecord.TaskStatus.SUCCESS
362
+ assert record.status == TaskRecord.TaskStatus.SUCCEEDED
363
363
 
364
364
  def test_successful_task_record_has_result(self):
365
365
  msg = _make_message(_task_name(_task_returns_value), {"x": 7})
@@ -611,7 +611,7 @@ def test_property_13_task_record_lifecycle_success(return_value):
611
611
  assert _lifecycle_captured[0]["status"] == TaskRecord.TaskStatus.RUNNING
612
612
  assert _lifecycle_captured[0]["start_time"] is not None
613
613
  record = TaskRecord.objects.get(pk=inv_id)
614
- assert record.status == TaskRecord.TaskStatus.SUCCESS
614
+ assert record.status == TaskRecord.TaskStatus.SUCCEEDED
615
615
  assert record.end_time is not None
616
616
  assert record.result == return_value
617
617
 
@@ -649,7 +649,7 @@ class TestExecuteTaskDuplicateDelivery:
649
649
  msg.execute_immediately(message_id=message_id) # duplicate
650
650
  assert TaskRecord.objects.filter(pk=message_id).count() == 1
651
651
  record = TaskRecord.objects.get(pk=message_id)
652
- assert record.status == TaskRecord.TaskStatus.SUCCESS
652
+ assert record.status == TaskRecord.TaskStatus.SUCCEEDED
653
653
 
654
654
  def test_duplicate_of_failed_is_skipped(self):
655
655
  msg = _make_message(_task_name(_task_raises), {"msg": "boom"})
@@ -1081,7 +1081,7 @@ def test_property_ignored_exc_produces_success(exc_type_name):
1081
1081
  with patch("lambda_tasks.models.TimeoutContext"):
1082
1082
  msg.execute_immediately(message_id=message_id)
1083
1083
  record = TaskRecord.objects.get(pk=message_id)
1084
- assert record.status == TaskRecord.TaskStatus.SUCCESS
1084
+ assert record.status == TaskRecord.TaskStatus.SUCCEEDED
1085
1085
  assert record.traceback is not None
1086
1086
  assert exc_type_name in record.traceback
1087
1087
  assert record.end_time is not None
@@ -1106,7 +1106,7 @@ def test_property_ignored_exc_commits_record(label):
1106
1106
  ).exists()
1107
1107
  # TaskRecord itself must be committed as SUCCESS
1108
1108
  record = TaskRecord.objects.get(pk=message_id)
1109
- assert record.status == TaskRecord.TaskStatus.SUCCESS
1109
+ assert record.status == TaskRecord.TaskStatus.SUCCEEDED
1110
1110
 
1111
1111
 
1112
1112
  # Feature: ignore-errors-decorator-option, Property 5: Subclass of ignored exception type is also ignored
@@ -1128,7 +1128,7 @@ def test_property_subclass_of_ignored_is_ignored(base_exc):
1128
1128
  with patch("lambda_tasks.models.TimeoutContext"):
1129
1129
  msg.execute_immediately(message_id=message_id)
1130
1130
  record = TaskRecord.objects.get(pk=message_id)
1131
- assert record.status == TaskRecord.TaskStatus.SUCCESS
1131
+ assert record.status == TaskRecord.TaskStatus.SUCCEEDED
1132
1132
 
1133
1133
 
1134
1134
  # Feature: ignore-errors-decorator-option, Property 6: Non-ignored exception produces FAILED with rollback
@@ -1179,7 +1179,7 @@ class TestIgnoreErrorsRegressionGuard:
1179
1179
  with patch("lambda_tasks.models.TimeoutContext"):
1180
1180
  msg.execute_immediately(message_id=message_id)
1181
1181
  record = TaskRecord.objects.get(pk=message_id)
1182
- assert record.status == TaskRecord.TaskStatus.SUCCESS
1182
+ assert record.status == TaskRecord.TaskStatus.SUCCEEDED
1183
1183
  assert record.traceback is None
1184
1184
 
1185
1185
  def test_non_ignored_exception_produces_failed(self):
@@ -1227,7 +1227,7 @@ def test_property_eager_mode_ignore_errors_parity(exc_type_name):
1227
1227
  with patch("lambda_tasks.models.import_string", return_value=_task_raises_ignored):
1228
1228
  msg.execute_immediately(message_id=message_id)
1229
1229
  record = TaskRecord.objects.get(pk=message_id)
1230
- assert record.status == TaskRecord.TaskStatus.SUCCESS
1230
+ assert record.status == TaskRecord.TaskStatus.SUCCEEDED
1231
1231
  assert record.traceback is not None
1232
1232
 
1233
1233
 
@@ -1379,7 +1379,7 @@ def test_property_6_retrying_status_and_traceback(exc_type_name):
1379
1379
  with patch.object(SQSLambdaTask, "execute_on_commit"):
1380
1380
  msg.execute_immediately(message_id=message_id)
1381
1381
  record = TaskRecord.objects.get(pk=message_id)
1382
- assert record.status == TaskRecord.TaskStatus.RETRYING
1382
+ assert record.status == TaskRecord.TaskStatus.RETRIED
1383
1383
  assert record.traceback is not None
1384
1384
  assert record.end_time is not None
1385
1385
 
@@ -1855,7 +1855,7 @@ def test_property_singleton_lockerror_retry(
1855
1855
 
1856
1856
  # TaskRecord should be RETRYING with LockError in traceback
1857
1857
  record = TaskRecord.objects.get(pk=message_id)
1858
- assert record.status == TaskRecord.TaskStatus.RETRYING
1858
+ assert record.status == TaskRecord.TaskStatus.RETRIED
1859
1859
  assert record.traceback is not None
1860
1860
  assert "LockError" in record.traceback
1861
1861
 
@@ -1959,7 +1959,7 @@ class TestSingletonExecutionUnit:
1959
1959
  mock_cache.lock.assert_not_called()
1960
1960
 
1961
1961
  record = TaskRecord.objects.get(pk=message_id)
1962
- assert record.status == TaskRecord.TaskStatus.SUCCESS
1962
+ assert record.status == TaskRecord.TaskStatus.SUCCEEDED
1963
1963
  assert record.result == 42
1964
1964
 
1965
1965
  def test_singleton_uses_singleton_cache_backend(self, settings: object) -> None:
@@ -2050,7 +2050,7 @@ class TestSingletonIgnoreErrorsPrecedence:
2050
2050
  msg.execute_immediately(message_id=message_id)
2051
2051
 
2052
2052
  record = TaskRecord.objects.get(pk=message_id)
2053
- assert record.status == TaskRecord.TaskStatus.SUCCESS
2053
+ assert record.status == TaskRecord.TaskStatus.SUCCEEDED
2054
2054
  assert record.traceback is not None
2055
2055
  assert "LockError" in record.traceback
2056
2056
  mock_eoc.assert_not_called()
@@ -2086,7 +2086,7 @@ class TestSingletonIgnoreErrorsPrecedence:
2086
2086
  msg.execute_immediately(message_id=message_id)
2087
2087
 
2088
2088
  record = TaskRecord.objects.get(pk=message_id)
2089
- assert record.status == TaskRecord.TaskStatus.SUCCESS
2089
+ assert record.status == TaskRecord.TaskStatus.SUCCEEDED
2090
2090
  assert record.traceback is not None
2091
2091
  assert "SoftTimeLimitExceeded" in record.traceback
2092
2092
  mock_eoc.assert_not_called()
@@ -13,7 +13,7 @@ from lambda_tasks.tasks import cleanup_task_records
13
13
  @pytest.mark.django_db
14
14
  class TestCleanupTaskRecordsDeletesOldRecords:
15
15
  def _create_record(
16
- self, *, age_days: int, status: str = TaskStatus.SUCCESS
16
+ self, *, age_days: int, status: str = TaskStatus.SUCCEEDED
17
17
  ) -> uuid.UUID:
18
18
  record_id = uuid.uuid4()
19
19
  TaskRecord.objects.create(
@@ -54,7 +54,7 @@ class TestCleanupTaskRecordsDeletesOldRecords:
54
54
  task_name="some.task",
55
55
  kwargs={},
56
56
  n_retries=0,
57
- status=TaskStatus.SUCCESS,
57
+ status=TaskStatus.SUCCEEDED,
58
58
  start_time=cutoff_time + timedelta(seconds=1),
59
59
  end_time=cutoff_time + timedelta(seconds=2),
60
60
  )
@@ -65,10 +65,10 @@ class TestCleanupTaskRecordsDeletesOldRecords:
65
65
 
66
66
  def test_deletes_all_statuses(self) -> None:
67
67
  ids = [
68
- self._create_record(age_days=10, status=TaskStatus.SUCCESS),
68
+ self._create_record(age_days=10, status=TaskStatus.SUCCEEDED),
69
69
  self._create_record(age_days=10, status=TaskStatus.FAILED),
70
70
  self._create_record(age_days=10, status=TaskStatus.RUNNING),
71
- self._create_record(age_days=10, status=TaskStatus.RETRYING),
71
+ self._create_record(age_days=10, status=TaskStatus.RETRIED),
72
72
  ]
73
73
 
74
74
  cleanup_task_records(retention_days=7)