base-api-utils 1.1.115__tar.gz → 1.1.117.dev1__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.
- {base_api_utils-1.1.115/src/base_api_utils.egg-info → base_api_utils-1.1.117.dev1}/PKG-INFO +1 -1
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/pyproject.toml +1 -1
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/filters/filter_utils_mixin.py +12 -0
- base_api_utils-1.1.117.dev1/src/base_api_utils/tests/test_task_status_endpoints.py +104 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/views/tasks_result_view.py +2 -4
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1/src/base_api_utils.egg-info}/PKG-INFO +1 -1
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils.egg-info/SOURCES.txt +1 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/LICENSE +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/README.md +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/setup.cfg +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/__init__.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/commands/__init__.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/commands/failed_task_management_mixin.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/domain/__init__.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/domain/event_message.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/domain/event_message_factory.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/domain/events.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/dtos/__init__.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/dtos/authz_user.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/fields/__init__.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/fields/email_list_field.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/filters/__init__.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/filters/base_filter.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/filters/custom_ordering_filter.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/handlers/__init__.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/handlers/base_event_handler.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/handlers/sponsor_event_handler.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/handlers/sponsorship_addon_event_handler.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/handlers/sponsorship_event_handler.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/handlers/summit_event_handler.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/ioc/__init__.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/ioc/container.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/models/__init__.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/models/item_image.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/security/__init__.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/security/abstract_access_token_service.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/security/abstract_oauth2_api_client.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/security/access_token_service.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/security/check_sponsor_user_permissions.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/security/group_required.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/security/oauth2_authentication.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/security/oauth2_client_factory.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/security/oauth2_scope_required.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/security/permission_event_handler.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/security/shared.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/security/user_permissions_service.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/serializers/__init__.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/serializers/base_model_serializer.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/serializers/email_list_char_field.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/serializers/nullable_slug_related_field.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/serializers/serializers_registry.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/serializers/task_result_serializer.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/serializers/timestamp_field.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/serializers/v2/__init__.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/serializers/v2/abstract_serializer.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/serializers/v2/base_model_serializer.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/serializers/v2/expands.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/serializers/v2/query_params.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/serializers/v2/spectacular.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/services/__init__.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/services/abstract_domain_events_service.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/services/abstract_event_dispatcher.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/services/abstract_images_service.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/services/abstract_sponsor_metadata_service.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/services/abstract_storage_service.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/services/abstract_summit_metadata_service.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/services/amqp_service.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/services/celery_failed.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/services/event_dispatcher.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/services/images_service.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/services/s3_service.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/services/strategies/__init__.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/services/strategies/abstract_task_runner_strategy.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/services/strategies/publish_domain_event_strategy.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/tests/__init__.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/tests/test_failed_celery_task_management.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/urls.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/utils/__init__.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/utils/async_helpers.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/utils/circuit_breaker.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/utils/config.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/utils/custom_auto_schema.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/utils/db_connection_helpers.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/utils/debounce_helpers.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/utils/enums.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/utils/env_var_eval.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/utils/exceptions.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/utils/expand_queryset_optimization_mixin.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/utils/external_errors.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/utils/file_lock.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/utils/fingerprint_helpers.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/utils/http_helpers.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/utils/inject_job.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/utils/look_up_value_mixin.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/utils/model_helpers.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/utils/oauth2_custom_schema_base.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/utils/pagination.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/utils/rate_utils.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/utils/read_write_serializer_mixin.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/utils/serializers.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/utils/service_utils.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/utils/string.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/utils/tests.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/views/__init__.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/views/base_view.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/views/parent_children_crud.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/views/root_entity_crud.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils.egg-info/dependency_links.txt +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils.egg-info/requires.txt +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils.egg-info/top_level.txt +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/tests/test_circuit_breaker.py +0 -0
- {base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/tests/test_lazy_imports.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: base-api-utils
|
|
3
|
-
Version: 1.1.
|
|
3
|
+
Version: 1.1.117.dev1
|
|
4
4
|
Summary: Django Rest Framework micro services common utilities
|
|
5
5
|
Author-email: Román Gutierrez <roman@tipit.net>, Sebastian Marcet <sebastian@tipit.net>
|
|
6
6
|
Project-URL: Homepage, https://github.com/fntechgit/base-api-utils
|
|
@@ -56,3 +56,15 @@ class FilterUtilsMixin:
|
|
|
56
56
|
def filter_isnull(self, queryset, field_name, value):
|
|
57
57
|
is_null = str(value).lower() == 'true'
|
|
58
58
|
return Q(**{f"{field_name}__isnull": is_null})
|
|
59
|
+
|
|
60
|
+
def get_and_filter(self, filter_name):
|
|
61
|
+
"""Returns (operator, value) for the named AND filter, or None if absent."""
|
|
62
|
+
for f in self.data.getlist(self.filters_param, []):
|
|
63
|
+
fname, fop, fval = self.parse_filter(f)
|
|
64
|
+
if fname == filter_name:
|
|
65
|
+
return fop, fval
|
|
66
|
+
return None
|
|
67
|
+
|
|
68
|
+
def has_and_filter(self, filter_name):
|
|
69
|
+
"""Returns True if the named filter is present in the AND filter list."""
|
|
70
|
+
return self.get_and_filter(filter_name) is not None
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
from unittest.mock import patch, MagicMock
|
|
2
|
+
|
|
3
|
+
from django.core.management import call_command
|
|
4
|
+
from rest_framework.test import APITestCase
|
|
5
|
+
from django.urls import reverse
|
|
6
|
+
import json
|
|
7
|
+
from rest_framework import status
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class TaskStatusEndpointsTest(APITestCase):
|
|
11
|
+
def setUp(self):
|
|
12
|
+
self.access_token = 'ACCESS_TOKEN'
|
|
13
|
+
call_command('seed_data')
|
|
14
|
+
|
|
15
|
+
def test_task_status_pending(self):
|
|
16
|
+
task_id = 'test-task-pending'
|
|
17
|
+
url = reverse('private-tasks-admin-endpoints:retrieve_async_task_status', kwargs={'task_id': task_id})
|
|
18
|
+
|
|
19
|
+
mock_result = MagicMock()
|
|
20
|
+
mock_result.status = 'PENDING'
|
|
21
|
+
|
|
22
|
+
with patch('base_api_utils.views.tasks_result_view.AsyncResult', return_value=mock_result):
|
|
23
|
+
response = self.client.get(f'{url}?access_token={self.access_token}')
|
|
24
|
+
|
|
25
|
+
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
|
26
|
+
json_response = json.loads(response.content)
|
|
27
|
+
self.assertEqual(json_response['task_id'], task_id)
|
|
28
|
+
self.assertEqual(json_response['status'], 'PENDING')
|
|
29
|
+
self.assertNotIn('result', json_response)
|
|
30
|
+
self.assertNotIn('error', json_response)
|
|
31
|
+
|
|
32
|
+
def test_task_status_started(self):
|
|
33
|
+
task_id = 'test-task-started'
|
|
34
|
+
url = reverse('private-tasks-admin-endpoints:retrieve_async_task_status', kwargs={'task_id': task_id})
|
|
35
|
+
|
|
36
|
+
mock_result = MagicMock()
|
|
37
|
+
mock_result.status = 'STARTED'
|
|
38
|
+
|
|
39
|
+
with patch('base_api_utils.views.tasks_result_view.AsyncResult', return_value=mock_result):
|
|
40
|
+
response = self.client.get(f'{url}?access_token={self.access_token}')
|
|
41
|
+
|
|
42
|
+
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
|
43
|
+
json_response = json.loads(response.content)
|
|
44
|
+
self.assertEqual(json_response['status'], 'STARTED')
|
|
45
|
+
self.assertNotIn('result', json_response)
|
|
46
|
+
self.assertNotIn('error', json_response)
|
|
47
|
+
|
|
48
|
+
def test_task_status_success(self):
|
|
49
|
+
task_id = 'test-task-success'
|
|
50
|
+
url = reverse('private-tasks-admin-endpoints:retrieve_async_task_status', kwargs={'task_id': task_id})
|
|
51
|
+
|
|
52
|
+
mock_result = MagicMock()
|
|
53
|
+
mock_result.status = 'SUCCESS'
|
|
54
|
+
mock_result.result = {'imported': [1667], 'errors': []}
|
|
55
|
+
|
|
56
|
+
with patch('base_api_utils.views.tasks_result_view.AsyncResult', return_value=mock_result):
|
|
57
|
+
response = self.client.get(f'{url}?access_token={self.access_token}')
|
|
58
|
+
|
|
59
|
+
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
|
60
|
+
json_response = json.loads(response.content)
|
|
61
|
+
self.assertEqual(json_response['task_id'], task_id)
|
|
62
|
+
self.assertEqual(json_response['status'], 'SUCCESS')
|
|
63
|
+
self.assertIn('result', json_response)
|
|
64
|
+
self.assertEqual(json_response['result'], {'imported': [1667], 'errors': []})
|
|
65
|
+
self.assertNotIn('error', json_response)
|
|
66
|
+
|
|
67
|
+
def test_task_status_success_with_partial_errors(self):
|
|
68
|
+
task_id = 'test-task-partial'
|
|
69
|
+
url = reverse('private-tasks-admin-endpoints:retrieve_async_task_status', kwargs={'task_id': task_id})
|
|
70
|
+
|
|
71
|
+
mock_result = MagicMock()
|
|
72
|
+
mock_result.status = 'SUCCESS'
|
|
73
|
+
mock_result.result = {
|
|
74
|
+
'imported': [1667],
|
|
75
|
+
'errors': [{'user_id': 9999, 'error': 'There is no sponsor user registered with the id 9999'}]
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
with patch('base_api_utils.views.tasks_result_view.AsyncResult', return_value=mock_result):
|
|
79
|
+
response = self.client.get(f'{url}?access_token={self.access_token}')
|
|
80
|
+
|
|
81
|
+
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
|
82
|
+
json_response = json.loads(response.content)
|
|
83
|
+
self.assertEqual(json_response['status'], 'SUCCESS')
|
|
84
|
+
self.assertEqual(len(json_response['result']['imported']), 1)
|
|
85
|
+
self.assertEqual(len(json_response['result']['errors']), 1)
|
|
86
|
+
self.assertEqual(json_response['result']['errors'][0]['user_id'], 9999)
|
|
87
|
+
|
|
88
|
+
def test_task_status_failure(self):
|
|
89
|
+
task_id = 'test-task-failure'
|
|
90
|
+
url = reverse('private-tasks-admin-endpoints:retrieve_async_task_status', kwargs={'task_id': task_id})
|
|
91
|
+
|
|
92
|
+
mock_result = MagicMock()
|
|
93
|
+
mock_result.status = 'FAILURE'
|
|
94
|
+
mock_result.result = Exception('Sponsor 999 not found')
|
|
95
|
+
|
|
96
|
+
with patch('base_api_utils.views.tasks_result_view.AsyncResult', return_value=mock_result):
|
|
97
|
+
response = self.client.get(f'{url}?access_token={self.access_token}')
|
|
98
|
+
|
|
99
|
+
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
|
100
|
+
json_response = json.loads(response.content)
|
|
101
|
+
self.assertEqual(json_response['task_id'], task_id)
|
|
102
|
+
self.assertEqual(json_response['status'], 'FAILURE')
|
|
103
|
+
self.assertIn('error', json_response)
|
|
104
|
+
self.assertNotIn('result', json_response)
|
{base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/views/tasks_result_view.py
RENAMED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
from celery.result import AsyncResult
|
|
2
|
+
from drf_spectacular.utils import extend_schema
|
|
2
3
|
from rest_framework import viewsets, status
|
|
3
4
|
from rest_framework.response import Response
|
|
4
5
|
from django_celery_results.models import TaskResult
|
|
@@ -8,17 +9,14 @@ from ..security import oauth2_scope_required, group_required
|
|
|
8
9
|
from ..serializers import TaskResultSerializer
|
|
9
10
|
|
|
10
11
|
|
|
12
|
+
@extend_schema(tags=["Celery Tasks"])
|
|
11
13
|
class TasksResultAPIView(viewsets.ReadOnlyModelViewSet):
|
|
12
|
-
"""
|
|
13
|
-
ViewSet to view failed Celery tasks and retry them manually.
|
|
14
|
-
"""
|
|
15
14
|
queryset = TaskResult.objects.filter(status='FAILURE')
|
|
16
15
|
serializer_class = TaskResultSerializer
|
|
17
16
|
|
|
18
17
|
@oauth2_scope_required()
|
|
19
18
|
@group_required()
|
|
20
19
|
def retry(self, request, task_id, *args, **kwargs):
|
|
21
|
-
"""Rerun a failed task manually"""
|
|
22
20
|
task_result = self.get_queryset().filter(task_id=task_id).first()
|
|
23
21
|
if not task_result:
|
|
24
22
|
return Response({"error": "Task not registered as failed"}, status=status.HTTP_404_NOT_FOUND)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: base-api-utils
|
|
3
|
-
Version: 1.1.
|
|
3
|
+
Version: 1.1.117.dev1
|
|
4
4
|
Summary: Django Rest Framework micro services common utilities
|
|
5
5
|
Author-email: Román Gutierrez <roman@tipit.net>, Sebastian Marcet <sebastian@tipit.net>
|
|
6
6
|
Project-URL: Homepage, https://github.com/fntechgit/base-api-utils
|
{base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils.egg-info/SOURCES.txt
RENAMED
|
@@ -74,6 +74,7 @@ src/base_api_utils/services/strategies/abstract_task_runner_strategy.py
|
|
|
74
74
|
src/base_api_utils/services/strategies/publish_domain_event_strategy.py
|
|
75
75
|
src/base_api_utils/tests/__init__.py
|
|
76
76
|
src/base_api_utils/tests/test_failed_celery_task_management.py
|
|
77
|
+
src/base_api_utils/tests/test_task_status_endpoints.py
|
|
77
78
|
src/base_api_utils/utils/__init__.py
|
|
78
79
|
src/base_api_utils/utils/async_helpers.py
|
|
79
80
|
src/base_api_utils/utils/circuit_breaker.py
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/commands/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/domain/__init__.py
RENAMED
|
File without changes
|
{base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/domain/event_message.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/dtos/authz_user.py
RENAMED
|
File without changes
|
{base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/fields/__init__.py
RENAMED
|
File without changes
|
{base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/fields/email_list_field.py
RENAMED
|
File without changes
|
{base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/filters/__init__.py
RENAMED
|
File without changes
|
{base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/filters/base_filter.py
RENAMED
|
File without changes
|
|
File without changes
|
{base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/handlers/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/models/__init__.py
RENAMED
|
File without changes
|
{base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/models/item_image.py
RENAMED
|
File without changes
|
{base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/security/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/security/group_required.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/security/shared.py
RENAMED
|
File without changes
|
|
File without changes
|
{base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/serializers/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/serializers/v2/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/serializers/v2/expands.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/services/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/services/amqp_service.py
RENAMED
|
File without changes
|
{base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/services/celery_failed.py
RENAMED
|
File without changes
|
|
File without changes
|
{base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/services/images_service.py
RENAMED
|
File without changes
|
{base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/services/s3_service.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/utils/async_helpers.py
RENAMED
|
File without changes
|
{base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/utils/circuit_breaker.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/utils/debounce_helpers.py
RENAMED
|
File without changes
|
|
File without changes
|
{base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/utils/env_var_eval.py
RENAMED
|
File without changes
|
{base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/utils/exceptions.py
RENAMED
|
File without changes
|
|
File without changes
|
{base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/utils/external_errors.py
RENAMED
|
File without changes
|
{base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/utils/file_lock.py
RENAMED
|
File without changes
|
|
File without changes
|
{base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/utils/http_helpers.py
RENAMED
|
File without changes
|
{base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/utils/inject_job.py
RENAMED
|
File without changes
|
|
File without changes
|
{base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/utils/model_helpers.py
RENAMED
|
File without changes
|
|
File without changes
|
{base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/utils/pagination.py
RENAMED
|
File without changes
|
{base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/utils/rate_utils.py
RENAMED
|
File without changes
|
|
File without changes
|
{base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/utils/serializers.py
RENAMED
|
File without changes
|
{base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/utils/service_utils.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/views/base_view.py
RENAMED
|
File without changes
|
|
File without changes
|
{base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils/views/root_entity_crud.py
RENAMED
|
File without changes
|
|
File without changes
|
{base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils.egg-info/requires.txt
RENAMED
|
File without changes
|
{base_api_utils-1.1.115 → base_api_utils-1.1.117.dev1}/src/base_api_utils.egg-info/top_level.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|