예제 #1
0
파일: views.py 프로젝트: harvard-lil/perma
    def patch(self, request, guid, format=None):
        """ Update link. """
        link = self.get_object_for_user_by_pk(request.user, guid)

        was_private = link.is_private
        data = request.data

        serializer = self.serializer_class(link, data=data, partial=True, context={'request': self.request})
        if serializer.is_valid():
            serializer.save()

            # move to new folder
            folder = AuthenticatedLinkListView.get_folder_from_request(request)
            if folder:
                link.move_to_folder_for_user(folder, request.user)

            # handle file patch
            uploaded_file = request.data.get('file')
            if uploaded_file:

                # delete related cdxlines and captures, delete warc (rename)
                link.delete_related()
                link.safe_delete_warc()

                # write new warc and capture
                link.write_uploaded_file(uploaded_file, cache_break=True)

                # delete the link from Webrecorder and
                # clear the user's Webrecorder session, if any,
                # so that the new warc is used for this visitor's
                # next playback of this link.
                if settings.ENABLE_WR_PLAYBACK:
                    link.delete_from_wr(request)
                    clear_wr_session(request)

            # update internet archive if privacy changes
            if 'is_private' in data and was_private != bool(data.get("is_private")) and link.is_archive_eligible():
                if was_private:
                    # link was private but has been marked public
                    run_task(upload_to_internet_archive.s(link_guid=link.guid))

                else:
                    # link was public but has been marked private
                    run_task(delete_from_internet_archive.s(link_guid=link.guid))

            # include remaining links in response
            links_remaining = request.user.get_links_remaining()
            serializer.data['links_remaining'] = 'Infinity' if links_remaining[0] == float('inf') else links_remaining[0]
            serializer.data['links_remaining_period'] = links_remaining[1]

            # clear out any caches that might be based on old link data
            link.clear_cache()

            return Response(serializer.data)

        raise ValidationError(serializer.errors)
예제 #2
0
    def patch(self, request, guid, format=None):
        """ Update link. """
        link = self.get_object_for_user_by_pk(request.user, guid)

        was_private = link.is_private
        data = request.data

        serializer = self.serializer_class(link, data=data, partial=True, context={'request': self.request})
        if serializer.is_valid():
            serializer.save()

            # move to new folder
            folder = AuthenticatedLinkListView.get_folder_from_request(request)
            if folder:
                link.move_to_folder_for_user(folder, request.user)

            # handle file patch
            uploaded_file = request.data.get('file')
            if uploaded_file:

                # delete related cdxlines and captures, delete warc (rename)
                link.delete_related()
                link.safe_delete_warc()

                # write new warc and capture
                link.write_uploaded_file(uploaded_file, cache_break=True)
                link.warc_size = default_storage.size(link.warc_storage_file())
                link.save()

                # delete the link from Webrecorder and
                # clear the user's Webrecorder session, if any,
                # so that the new warc is used for this visitor's
                # next playback of this link.
                link.delete_from_wr(request)
                clear_wr_session(request)

            # update internet archive if privacy changes
            if 'is_private' in data and was_private != bool(data.get("is_private")) and link.is_archive_eligible():
                if was_private:
                    # link was private but has been marked public
                    run_task(upload_to_internet_archive.s(link_guid=link.guid))

                else:
                    # link was public but has been marked private
                    run_task(delete_from_internet_archive.s(link_guid=link.guid))

            # include remaining links in response
            links_remaining = request.user.get_links_remaining()
            serializer.data['links_remaining'] = 'Infinity' if links_remaining[0] == float('inf') else links_remaining[0]
            serializer.data['links_remaining_period'] = links_remaining[1]

            return Response(serializer.data)

        raise ValidationError(serializer.errors)
예제 #3
0
    def obj_update(self, bundle, skip_errors=False, **kwargs):
        uploaded_file = bundle.data.get('file')
        if uploaded_file and bundle.request.method == 'PATCH':
            if kwargs['request']:
                del kwargs['request']

            bundle.obj = self.obj_get(bundle=bundle, **kwargs)
            bundle.data["replace"] = True

            # delete related cdxlines and captures, delete warc (rename)
            self.obj_delete(bundle=bundle, **kwargs)

            bundle = super(LinkResource, self).obj_update(
                bundle, archive_timestamp=bundle.obj.archive_timestamp)

            # if no 'folder' was supplied for this patch, set folder to current folder before calling obj_create,
            # since obj_create requires a folder to be included
            bundle.data.setdefault(
                'folder',
                Folder.objects.accessible_to(
                    bundle.request.user).filter(links=bundle.obj).first())

            bundle = self.obj_create(bundle=bundle, **kwargs)

        else:
            is_private = bundle.obj.is_private
            bundle = super(LinkResource,
                           self).obj_update(bundle, skip_errors, **kwargs)

            if bundle.data.get('folder', None):
                bundle.obj.move_to_folder_for_user(bundle.data['folder'],
                                                   bundle.request.user)

            if 'is_private' in bundle.data:
                if bundle.obj.is_archive_eligible():
                    going_private = bundle.data.get("is_private")
                    # if link was private but has been marked public
                    if is_private and not going_private:
                        run_task(
                            upload_to_internet_archive.s(
                                link_guid=bundle.obj.guid))

                    # if link was public but has been marked private
                    elif not is_private and going_private:
                        run_task(
                            delete_from_internet_archive.s(
                                link_guid=bundle.obj.guid))
            links_remaining = bundle.request.user.get_links_remaining()
            bundle.data['links_remaining'] = links_remaining

        bundle.obj.clear_cache()

        return bundle
예제 #4
0
파일: views.py 프로젝트: leonidg/perma
    def patch(self, request, guid, format=None):
        """ Update link. """
        link = self.get_object_for_user_by_pk(request.user, guid)

        was_private = link.is_private
        data = request.data

        serializer = self.serializer_class(link,
                                           data=data,
                                           partial=True,
                                           context={'request': self.request})
        if serializer.is_valid():
            serializer.save()

            # move to new folder
            folder = AuthenticatedLinkListView.get_folder_from_request(request)
            if folder:
                link.move_to_folder_for_user(folder, request.user)

            # handle file patch
            uploaded_file = request.data.get('file')
            if uploaded_file:

                # delete related cdxlines and captures, delete warc (rename)
                link.delete_related()
                link.safe_delete_warc()

                # write new warc and capture
                link.write_uploaded_file(uploaded_file, cache_break=True)

            # update internet archive if privacy changes
            if 'is_private' in data and was_private != bool(
                    data.get("is_private")) and link.is_archive_eligible():
                if was_private:
                    # link was private but has been marked public
                    run_task(upload_to_internet_archive.s(link_guid=link.guid))

                else:
                    # link was public but has been marked private
                    run_task(
                        delete_from_internet_archive.s(link_guid=link.guid))

            # include remaining links in response
            links_remaining = request.user.get_links_remaining()
            serializer.data['links_remaining'] = links_remaining

            # clear out any caches that might be based on old link data
            link.clear_cache()

            return Response(serializer.data)

        raise ValidationError(serializer.errors)
예제 #5
0
파일: resources.py 프로젝트: trifle/perma
    def obj_delete(self, bundle, **kwargs):
        if not hasattr(bundle.obj, 'delete'):
            try:
                bundle.obj = self.obj_get(bundle=bundle, **kwargs)
            except ObjectDoesNotExist:
                raise NotFound("A model instance matching the provided arguments could not be found.")

        self.authorized_delete_detail(self.get_object_list(bundle.request), bundle)

        bundle.obj.safe_delete()
        bundle.obj.save()
        if bundle.obj.uploaded_to_internet_archive:
            run_task(delete_from_internet_archive.s(link_guid=bundle.obj.guid))
예제 #6
0
    def obj_update(self, bundle, skip_errors=False, **kwargs):
        uploaded_file = bundle.data.get('file')
        if uploaded_file and bundle.request.method == 'PATCH':
            if kwargs['request']:
                del kwargs['request']

            bundle.obj = self.obj_get(bundle=bundle, **kwargs)
            bundle.data["replace"]=True

            # delete related cdxlines and captures, delete warc (rename)
            self.obj_delete(bundle=bundle, **kwargs)

            bundle = super(LinkResource, self).obj_update(bundle, archive_timestamp=bundle.obj.archive_timestamp)

            # if no 'folder' was supplied for this patch, set folder to current folder before calling obj_create,
            # since obj_create requires a folder to be included
            bundle.data.setdefault('folder', Folder.objects.accessible_to(bundle.request.user).filter(links=bundle.obj).first())

            bundle = self.obj_create(bundle=bundle, **kwargs)

        else:
            is_private = bundle.obj.is_private
            bundle = super(LinkResource, self).obj_update(bundle, skip_errors, **kwargs)

            if bundle.data.get('folder', None):
                bundle.obj.move_to_folder_for_user(bundle.data['folder'], bundle.request.user)

            if 'is_private' in bundle.data:
                if bundle.obj.is_archive_eligible():
                    going_private = bundle.data.get("is_private")
                    # if link was private but has been marked public
                    if is_private and not going_private:
                        run_task(upload_to_internet_archive.s(link_guid=bundle.obj.guid))

                    # if link was public but has been marked private
                    elif not is_private and going_private:
                        run_task(delete_from_internet_archive.s(link_guid=bundle.obj.guid))
            links_remaining = bundle.request.user.get_links_remaining()
            bundle.data['links_remaining'] = links_remaining

        bundle.obj.clear_cache()

        return bundle
예제 #7
0
    def obj_delete(self, bundle, **kwargs):
        if not hasattr(bundle.obj, 'delete'):
            try:
                bundle.obj = self.obj_get(bundle=bundle, **kwargs)
            except ObjectDoesNotExist:
                raise NotFound("A model instance matching the provided arguments could not be found.")

        self.authorized_delete_detail(self.get_object_list(bundle.request), bundle)

        # deleting related captures and cdxlines
        bundle.obj.delete_related()

        # if replacing file, only "delete" warc by renaming
        if bundle.data.get("replace"):
            bundle.obj.safe_delete_warc()
        else:
            bundle.obj.safe_delete()

        bundle.obj.save()
        if bundle.obj.internet_archive_upload_status == 'completed':
            run_task(delete_from_internet_archive.s(link_guid=bundle.obj.guid))
예제 #8
0
파일: resources.py 프로젝트: trifle/perma
    def obj_update(self, bundle, skip_errors=False, **kwargs):
        is_private = bundle.obj.is_private
        bundle = super(LinkResource, self).obj_update(bundle, skip_errors, **kwargs)

        if bundle.data.get('folder', None):
            bundle.obj.move_to_folder_for_user(bundle.data['folder'], bundle.request.user)

        if 'is_private' in bundle.data:
            if bundle.obj.is_archive_eligible():
                going_private = bundle.data.get("is_private")
                # if link was private but has been marked public
                if is_private and not going_private:
                    run_task(upload_to_internet_archive.s(link_guid=bundle.obj.guid))

                # if link was public but has been marked private
                elif not is_private and going_private:
                    run_task(delete_from_internet_archive.s(link_guid=bundle.obj.guid))

        links_remaining = bundle.request.user.get_links_remaining()
        bundle.data['links_remaining'] = links_remaining
        return bundle
예제 #9
0
    def obj_delete(self, bundle, **kwargs):
        if not hasattr(bundle.obj, 'delete'):
            try:
                bundle.obj = self.obj_get(bundle=bundle, **kwargs)
            except ObjectDoesNotExist:
                raise NotFound("A model instance matching the provided arguments could not be found.")

        self.authorized_delete_detail(self.get_object_list(bundle.request), bundle)

        # deleting related captures and cdxlines
        bundle.obj.delete_related()

        # if replacing file, only "delete" warc by renaming
        if bundle.data.get("replace"):
            bundle.obj.safe_delete_warc()
        else:
            bundle.obj.safe_delete()

        bundle.obj.save()
        if bundle.obj.internet_archive_upload_status == 'completed':
            run_task(delete_from_internet_archive.s(link_guid=bundle.obj.guid))