def _get_file_manager(self, request, resource, **kwargs): """ Instantiates the correct file manager class Args: request: Request object. Used to get the user object. resource: Resource name to decide which class to instantiate. """ user_obj = request.user fm_cls = lookup_file_manager(resource) if fm_cls: return fm_cls(user_obj, **kwargs)
def get_context_data(self, **kwargs): context = super(DataBrowserTestView, self).get_context_data(**kwargs) logger.info('Get context Data') context['unreadNotifications'] = get_number_unread_notifications( self.request) resource = kwargs.pop('resource', None) if resource is None: if self.request.user.is_authenticated: resource = 'agave' else: resource = 'public' fm_cls = lookup_file_manager(resource) if fm_cls is None: raise Http404('Unknown resource') file_path = kwargs.pop('file_path', None) try: fm = fm_cls(self.request.user) if not fm.is_search(file_path): listing = fm.listing(file_path) else: d = {} d.update(kwargs) d.update(self.request.GET.dict()) listing = fm.search(**d) except ApiException as e: fm = None action_url = e.extra.get('action_url', None) action_label = e.extra.get('action_label', None) if action_url is None and e.response.status_code == 403: action_url = '{}?next={}'.format(reverse('login'), self.request.path) action_label = 'Log in' listing = { 'source': resource, 'id': file_path, '_error': { 'status': e.response.status_code, 'message': e.response.reason, 'action_url': action_url, 'action_label': action_label }, } sources_api = SourcesApi() source_id = resource if source_id == 'agave': if fm is not None and fm.is_shared(file_path): source_id = '$share' else: source_id = 'mydata' current_source = sources_api.get(source_id) sources_list = sources_api.list() context['angular_init'] = json.dumps({ 'currentSource': current_source, 'sources': sources_list, 'listing': listing, 'state': { 'search': fm.is_search(file_path) if fm is not None else False } }) return context
def copy_public_to_mydata(self, username, src_resource, src_file_id, dest_resource, dest_file_id): logger.debug('Scheduled copy of files from %s://%s to %s://%s', src_resource, src_file_id, dest_resource, dest_file_id) try: n = Notification(event_type = 'data', status = 'INFO', operation = 'copy_public_to_mydata_start', message = 'Copying folder/files %s from public data to your private data. Please wait...' % (src_file_id, ), user = username, extra={ 'system': dest_resource, 'id': dest_file_id, }) # extra = {'target_path': '%s%s' %(reverse('designsafe_data:data_depot'), src_file_id)}) n.save() notify_status = 'SUCCESS' from designsafe.apps.api.data import lookup_file_manager source_fm_cls = lookup_file_manager(src_resource) dest_fm_cls = lookup_file_manager(dest_resource) if source_fm_cls and dest_fm_cls: user = get_user_model().objects.get(username=username) source_fm = source_fm_cls(user) dest_fm = dest_fm_cls(user) source_real_path = source_fm.get_file_real_path(src_file_id) dirname = os.path.basename(source_real_path) dest_real_path = os.path.join(dest_fm.get_file_real_path(dest_file_id), dirname) if os.path.isdir(source_real_path): shutil.copytree(source_real_path, dest_real_path) elif os.path.isfile(source_real_path): shutil.copy(source_real_path, dest_real_path) else: notify_status = 'ERROR' logger.error('The request copy source=%s does not exist!', src_resource) system, username, path = dest_fm.parse_file_id(dest_file_id) dest_fm.indexer.index(system, path, username, levels = 1) n = Notification(event_type = 'data', status = notify_status, operation = 'copy_public_to_mydata_end', message = 'Files were copied to your private data.', user = username, extra={ 'system': dest_resource, 'id': dest_file_id, }) # extra = {'target_path': '%s%s' %(reverse('designsafe_data:data_depot'), dest_file_id)}) n.save() else: logger.error('Unable to load file managers for both source=%s and destination=%s', src_resource, dest_resource) n = Notification(event_type = 'data', status = 'ERROR', operation = 'copy_public_to_mydata_error', message = '''There was an error copying the files to your public data. Plese try again.''', user = username, extra={ 'system': dest_resource, 'id': dest_file_id, }) # extra = {}) n.save() except: logger.exception('Unexpected task failure') n = Notification(event_type = 'data', status = 'ERROR', operation = 'copy_public_to_mydata_error', message = '''There was an error copying the files to your public data. Plese try again.''', user = username, extra={ 'system': dest_resource, 'id': dest_file_id, }) # extra = {}) n.save()
def box_upload(self, username, src_resource, src_file_id, dest_resource, dest_file_id): """ :param self: :param username: :param src_resource: should be 'agave' :param src_file_id: the agave file id :param dest_resource: should be 'box' :param dest_file_id: the box id of the destination folder :return: """ logger.debug('Importing file %s://%s for user %s to %s://%s' % ( src_resource, src_file_id, username, dest_resource, dest_file_id)) try: n = Notification(event_type = 'data', status = Notification.INFO, operation = 'box_upload_start', message = 'Starting import of file %s into box.' % src_file_id, user = username, # extra = {'target_path': '%s%s/%s' %(reverse('designsafe_data:data_depot'), src_resource, src_file_id)}) extra={'id': src_file_id}) n.save() user = get_user_model().objects.get(username=username) from designsafe.apps.api.data import BoxFileManager box_fm = BoxFileManager(user) file_type, file_id = box_fm.parse_file_id(dest_file_id) if file_type != 'folder': logger.warn('Cannot import to a file destination!') raise Exception('You can only import files to a folder!', status=400, extra={ 'src_resource': src_resource, 'src_file_id': src_file_id, 'dest_resource': dest_resource, 'dest_file_id': dest_file_id, }) if src_resource == 'agave' or src_resource == 'public': try: logger.debug('Starting upload to Box...') from designsafe.apps.api.data import lookup_file_manager agave_fm = lookup_file_manager(src_resource)(user) file_real_path = agave_fm.get_file_real_path(src_file_id) if os.path.isfile(file_real_path): box_upload_file(box_fm, file_id, file_real_path) elif os.path.isdir(file_real_path): box_upload_directory(box_fm, file_id, file_real_path) else: logger.error('Unable to upload %s: file does not exist!', file_real_path) except: logger.exception('Upload to Box failed!') logger.debug('Box upload task complete.') n = Notification(event_type = 'data', status = Notification.SUCCESS, operation = 'box_upload_end', message = 'File(s) %s succesfully uploaded into box!' % src_file_id, user = username, extra={'id': src_file_id}) # extra = {'target_path': '%s%s/%s' %(reverse('designsafe_data:data_depot'), dest_resource, dest_file_id)}) n.save() except: logger.exception('Unexpected task failure: box_upload', extra={ 'username': username, 'src_resource': src_resource, 'src_file_id': src_file_id, 'dest_resource': dest_resource, 'dest_file_id': dest_file_id, }) n = Notification(event_type = 'data', status = Notification.ERROR, operation = 'box_download_error', message = 'We were unable to get the specified file from box. Please try again...', user = username, extra={ 'src_resource': src_resource, 'id': src_file_id, 'dest_resource': dest_resource, 'dest_file_id': dest_file_id, }) # extra = {'target_path': '%s%s/%s' %(reverse('designsafe_data:data_depot'), src_resource, src_file_id)}) n.save()
def get_context_data(self, **kwargs): context = super(DataBrowserTestView, self).get_context_data(**kwargs) resource = kwargs.pop('resource', None) if resource is None: if self.request.user.is_authenticated(): resource = 'agave' else: resource = 'public' fm_cls = lookup_file_manager(resource) if fm_cls is None: raise Http404('Unknown resource') file_path = kwargs.pop('file_path', None) try: fm = fm_cls(self.request.user) if not fm.is_search(file_path): listing = fm.listing(file_path) else: d = {} d.update(kwargs) d.update(self.request.GET.dict()) listing = fm.search(**d) except ApiException as e: fm = None action_url = e.extra.get('action_url', None) action_label = e.extra.get('action_label', None) if action_url is None and e.response.status_code == 403: action_url = '{}?next={}'.format(reverse('login'), self.request.path) action_label = 'Log in' listing = { 'source': resource, 'id': file_path, '_error': { 'status': e.response.status_code, 'message': e.response.reason, 'action_url': action_url, 'action_label': action_label }, } sources_api = SourcesApi() source_id = resource if source_id == 'agave': if fm is not None and fm.is_shared(file_path): source_id = '$share' else: source_id = 'mydata' current_source = sources_api.get(source_id) sources_list = sources_api.list() context['angular_init'] = json.dumps({ 'currentSource': current_source, 'sources': sources_list, 'listing': listing, 'state': { 'search': fm.is_search(file_path) if fm is not None else False } }) return context
def copy_public_to_mydata(self, username, src_resource, src_file_id, dest_resource, dest_file_id): logger.debug('Scheduled copy of files from %s://%s to %s://%s', src_resource, src_file_id, dest_resource, dest_file_id) try: n = Notification(event_type = 'data', status = 'INFO', operation = 'copy_public_to_mydata_start', message = 'Copying folder/files %s from public data to your private data. Please wait...' % (src_file_id, ), user = username, extra = {'target_path': '%s%s' %(reverse('designsafe_data:data_browser'), src_file_id)}) n.save() notify_status = 'SUCCESS' from designsafe.apps.api.data import lookup_file_manager source_fm_cls = lookup_file_manager(src_resource) dest_fm_cls = lookup_file_manager(dest_resource) if source_fm_cls and dest_fm_cls: user = get_user_model().objects.get(username=username) source_fm = source_fm_cls(user) dest_fm = dest_fm_cls(user) source_real_path = source_fm.get_file_real_path(src_file_id) dirname = os.path.basename(source_real_path) dest_real_path = os.path.join(dest_fm.get_file_real_path(dest_file_id), dirname) if os.path.isdir(source_real_path): shutil.copytree(source_real_path, dest_real_path) elif os.path.isfile(source_real_path): shutil.copy(source_real_path, dest_real_path) else: notify_status = 'ERROR' logger.error('The request copy source=%s does not exist!', src_resource) system, username, path = dest_fm.parse_file_id(dest_file_id) dest_fm.indexer.index(system, path, username, levels = 1) n = Notification(event_type = 'data', status = notify_status, operation = 'copy_public_to_mydata_end', message = 'Files have been copied to your private data.', user = username, extra = {'target_path': '%s%s' %(reverse('designsafe_data:data_browser'), dest_file_id)}) n.save() else: logger.error('Unable to load file managers for both source=%s and destination=%s', src_resource, dest_resource) n = Notification(event_type = 'data', status = 'ERROR', operation = 'copy_public_to_mydata_error', message = '''There was an error copying the files to your public data. Plese try again.''', user = username, extra = {}) n.save() except: logger.exception('Unexpected task failure') n = Notification(event_type = 'data', status = 'ERROR', operation = 'copy_public_to_mydata_error', message = '''There was an error copying the files to your public data. Plese try again.''', user = username, extra = {}) n.save()
def box_upload(self, username, src_resource, src_file_id, dest_resource, dest_file_id): """ :param self: :param username: :param src_resource: should be 'agave' :param src_file_id: the agave file id :param dest_resource: should be 'box' :param dest_file_id: the box id of the destination folder :return: """ logger.debug('Importing file %s://%s for user %s to %s://%s' % ( src_resource, src_file_id, username, dest_resource, dest_file_id)) try: n = Notification(event_type = 'data', status = Notification.INFO, operation = 'box_upload_start', message = 'Starting import file %s into box.' % src_file_id, user = username, extra = {'target_path': '%s%s/%s' %(reverse('designsafe_data:data_browser'), src_resource, src_file_id)}) n.save() user = get_user_model().objects.get(username=username) from designsafe.apps.api.data import BoxFileManager box_fm = BoxFileManager(user) file_type, file_id = box_fm.parse_file_id(dest_file_id) if file_type != 'folder': logger.warn('Cannot import to a file destination!') raise Exception('You can only import files to a folder!', status=400, extra={ 'src_resource': src_resource, 'src_file_id': src_file_id, 'dest_resource': dest_resource, 'dest_file_id': dest_file_id, }) if src_resource == 'agave' or src_resource == 'public': try: logger.debug('Starting upload to Box...') from designsafe.apps.api.data import lookup_file_manager agave_fm = lookup_file_manager(src_resource)(user) file_real_path = agave_fm.get_file_real_path(src_file_id) if os.path.isfile(file_real_path): box_upload_file(box_fm, file_id, file_real_path) elif os.path.isdir(file_real_path): box_upload_directory(box_fm, file_id, file_real_path) else: logger.error('Unable to upload %s: file does not exist!', file_real_path) except: logger.exception('Upload to Box failed!') logger.debug('Box upload task complete.') n = Notification(event_type = 'data', status = Notification.SUCCESS, operation = 'box_upload_end', message = 'File(s) %s succesfully uploaded into box!' % src_file_id, user = username, extra = {'target_path': '%s%s/%s' %(reverse('designsafe_data:data_browser'), dest_resource, dest_file_id)}) n.save() except: logger.exception('Unexpected task failure: box_upload', extra={ 'username': username, 'src_resource': src_resource, 'src_file_id': src_file_id, 'dest_resource': dest_resource, 'dest_file_id': dest_file_id, }) n = Notification(event_type = 'data', status = Notification.ERROR, operation = 'box_download_error', message = 'We were unable to get the specified file from box. Please try again...', user = username, extra = {'target_path': '%s%s/%s' %(reverse('designsafe_data:data_browser'), src_resource, src_file_id)}) n.save()