Ejemplo n.º 1
0
    def destroy(self, request, pk):
        entry: Entry = self.get_object()
        if not entry.is_active:
            raise ValidationError("specified entry has already been deleted")

        user: User = request.user

        if custom_view.is_custom("before_delete_entry_v2", entry.schema.name):
            custom_view.call_custom("before_delete_entry_v2",
                                    entry.schema.name, user, entry)

        # register operation History for deleting entry
        user.seth_entry_del(entry)

        # delete entry
        entry.delete(deleted_user=user)

        if custom_view.is_custom("after_delete_entry_v2", entry.schema.name):
            custom_view.call_custom("after_delete_entry_v2", entry.schema.name,
                                    user, entry)

        # Send notification to the webhook URL
        job_notify: Job = Job.new_notify_delete_entry(user, entry)
        job_notify.run()

        return Response(status=status.HTTP_204_NO_CONTENT)
Ejemplo n.º 2
0
def do_delete(request, entry_id, recv_data):
    user = User.objects.get(id=request.user.id)
    ret = {}

    if not Entry.objects.filter(id=entry_id).exists():
        return HttpResponse('Failed to get an Entry object of specified id',
                            status=400)

    # update name of Entry object
    entry = Entry.objects.filter(id=entry_id).get()

    if custom_view.is_custom("do_delete_entry", entry.schema.name):
        # do_delete custom view
        resp = custom_view.call_custom("do_delete_entry", entry.schema.name,
                                       request, user, entry)

        # If custom_view returns available response this returns it to user,
        # or continues default processing.
        if resp:
            return resp

    # set deleted flag in advance because deleting processing taks long time
    entry.is_active = False
    entry.save(update_fields=['is_active'])

    # save deleting Entry name before do it
    ret['name'] = entry.name

    # register operation History for deleting entry
    user.seth_entry_del(entry)

    # Create a new job to delete entry and run it
    job_delete_entry = Job.new_delete(user, entry)
    job_notify_event = Job.new_notify_delete_entry(user, entry)

    # This prioritizes notifying job rather than deleting entry
    if job_delete_entry.dependent_job:
        job_notify_event.dependent_job = job_delete_entry.dependent_job

    job_notify_event.save(update_fields=['dependent_job'])
    job_notify_event.run()

    # This update dependent job of deleting entry job
    job_delete_entry.dependent_job = job_notify_event
    job_delete_entry.save(update_fields=['dependent_job'])

    job_delete_entry.run()

    return JsonResponse(ret)
Ejemplo n.º 3
0
    def delete(self, request, *args, **kwargs):
        # checks mandatory parameters are specified
        if not all([x in request.data for x in ["entity", "entry"]]):
            return Response(
                'Parameter "entity" and "entry" are mandatory',
                status=status.HTTP_400_BAD_REQUEST,
            )

        entity = Entity.objects.filter(name=request.data["entity"]).first()
        if not entity:
            return Response(
                "Failed to find specified Entity (%s)" %
                request.data["entity"],
                status=status.HTTP_404_NOT_FOUND,
            )

        entry = Entry.objects.filter(name=request.data["entry"],
                                     schema=entity).first()
        if not entry:
            return Response(
                "Failed to find specified Entry (%s)" % request.data["entry"],
                status=status.HTTP_404_NOT_FOUND,
            )

        # permission check
        if not request.user.has_permission(
                entry, ACLType.Full) or not request.user.has_permission(
                    entity, ACLType.Readable):
            return Response("Permission denied to operate",
                            status=status.HTTP_400_BAD_REQUEST)

        # Delete the specified entry then return its id, if is active
        if entry.is_active:
            # create a new Job to delete entry and run it
            job = Job.new_delete(request.user, entry)

            # create and run notify delete entry task
            job_notify = Job.new_notify_delete_entry(request.user, entry)
            job_notify.run()

            job.dependent_job = job_notify
            job.save(update_fields=["dependent_job"])

            job.run()

        return Response({"id": entry.id})
Ejemplo n.º 4
0
def do_delete(request, entry_id, recv_data):
    entry, error = get_obj_with_check_perm(request.user, Entry, entry_id,
                                           ACLType.Full)
    if error:
        return error

    if custom_view.is_custom("do_delete_entry", entry.schema.name):
        # do_delete custom view
        resp = custom_view.call_custom("do_delete_entry", entry.schema.name,
                                       request, request.user, entry)

        # If custom_view returns available response this returns it to user,
        # or continues default processing.
        if resp:
            return resp

    # set deleted flag in advance because deleting processing taks long time
    entry.is_active = False
    entry.save(update_fields=["is_active"])

    ret = {}
    # save deleting Entry name before do it
    ret["name"] = entry.name

    # register operation History for deleting entry
    request.user.seth_entry_del(entry)

    # Create a new job to delete entry and run it
    job_delete_entry = Job.new_delete(request.user, entry)
    job_notify_event = Job.new_notify_delete_entry(request.user, entry)

    # This prioritizes notifying job rather than deleting entry
    if job_delete_entry.dependent_job:
        job_notify_event.dependent_job = job_delete_entry.dependent_job

    job_notify_event.save(update_fields=["dependent_job"])
    job_notify_event.run()

    # This update dependent job of deleting entry job
    job_delete_entry.dependent_job = job_notify_event
    job_delete_entry.save(update_fields=["dependent_job"])

    job_delete_entry.run()

    return JsonResponse(ret)