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)
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)
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
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)
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
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