Merge pull request #6246 from wwitzel3/issue-5756

Create /inventories/N/update_inventory_sources endpoint.
This commit is contained in:
Wayne Witzel III
2017-05-12 17:30:00 -04:00
committed by GitHub
6 changed files with 96 additions and 3 deletions

View File

@@ -2405,6 +2405,51 @@ class InventoryInventorySourcesList(SubListCreateAPIView):
new_in_14 = True
class InventoryInventorySourcesUpdate(RetrieveAPIView):
view_name = _('Inventory Sources Update')
model = Inventory
serializer_class = InventorySourceUpdateSerializer
permission_classes = (InventoryInventorySourcesUpdatePermission,)
is_job_start = True
new_in_320 = True
def retrieve(self, request, *args, **kwargs):
inventory = self.get_object()
update_data = []
for inventory_source in inventory.inventory_sources.all():
details = {'inventory_source': inventory_source.pk,
'can_update': inventory_source.can_update}
update_data.append(details)
return Response(update_data)
def post(self, request, *args, **kwargs):
inventory = self.get_object()
update_data = []
for inventory_source in inventory.inventory_sources.all():
details = {'inventory_source': inventory_source.pk, 'status': None}
can_update = inventory_source.can_update
project_update = False
if inventory_source.source == 'scm' and inventory_source.update_on_project_update:
if not request.user or not request.user.can_access(Project, 'start', inventory_source.source_project):
details['status'] = 'You do not have permission to update project `{}`'.format(inventory_source.source_project.name)
can_update = False
else:
project_update = True
if can_update:
if project_update:
details['project_update'] = inventory_source.source_project.update().id
details['status'] = 'started'
details['inventory_update'] = inventory_source.update().id
else:
if not details.get('status'):
details['status'] = 'Could not start because `can_update` returned False'
update_data.append(details)
return Response(update_data, status=status.HTTP_202_ACCEPTED)
class InventorySourceList(ListCreateAPIView):
model = InventorySource
@@ -2523,7 +2568,7 @@ class InventorySourceUpdateView(RetrieveAPIView):
obj = self.get_object()
if obj.can_update:
if obj.source == 'scm' and obj.update_on_project_update:
if not self.request.user or self.request.user.can_access(self.model, 'update', obj):
if not self.request.user or not self.request.user.can_access(Project, 'start', obj.source_project):
raise PermissionDenied(detail=_(
'You do not have permission to update project `{}`.'.format(obj.source_project.name)))
return self._build_update_response(obj.source_project.update(), request)