예제 #1
0
 def handle(self, *args, **options):
     t0 = time()
     system_id = options['system'] or settings.AGAVE_STORAGE_SYSTEM
     username = options['username']
     file_path = options['file_path']
     self.stdout.write('Starting at: {}'.format(file_path))
     self.stdout.write('Clearing permissions for username: {}'.format(username))
     res, root_folders = Object.listing(system_id, admin_user, file_path)
     self.stdout.write('Documents meta: {}'.format({'index': res[0].meta.index,
                                                    'doc_type': res[0].meta.doc_type}))
     cnt = 0
     #for folder in root_folders.scan():
     s = Object.search()
     res = s.execute()
     for folder in s.scan():
         self._clear_pems(folder, username)
         cnt += 1
         owner = folder.full_path.strip('/').split('/')[0]
         res, listing = Object.listing_recursive(system_id, owner,
                                                 folder.full_path.strip('/'))
         for doc in listing.scan():
             self._clear_pems(doc, username)
             cnt += 1
     t1 = time()
     self.stdout.write('Accurate enough running time: {} s'.format(t1 - t0))
     self.stdout.write('Total number of docs touched: {}'.format(str(cnt)))
예제 #2
0
 def test_object_from_agave_file(self, mock_obj_from_file_path, 
                         mock_obj_update, mock_obj_save):
     af = self.get_mock_agave_file()
     mock_obj_from_file_path.return_value = None
     
     doc = Object.from_agave_file(self.user.username, af)
     
     self.assertEqual(os.path.join(doc.path, doc.name),
             self.afile_json['path'])
예제 #3
0
 def get_mock_object_folder(self):
     doc = Object(
         mimeType = self.afolder_json['mimeType'],
         name = self.afolder_json['name'] if self.afolder_json['name'] != '.' else os.path.split(self.afolder_json['path'])[1],
         format = self.afolder_json['format'],
         deleted = False,
         lastModified = self.afolder_json['lastModified'],
         fileType = os.path.splitext(self.afolder_json['name'])[1] if self.afolder_json['format'] != 'folder' else 'folder',
         agavePath = 'agave://{}/{}'.format(self.afolder_json['system'], self.afolder_json['path']),
         systemTags = [],
         length = self.afolder_json['length'],
         systemId = self.afolder_json['system'],
         path = os.path.split(self.afolder_json['path'])[0],
         keywords = [],
         link = self.afolder_json['_links']['self']['href'],
         type = self.afolder_json['type'],
         permissions = self.apems_json
     )
     return doc
예제 #4
0
def share_agave(self, username, file_id, permissions, recursive):
    try:
        # n = Notification(event_type = 'data',
        #                  status = 'INFO',
        #                  operation = 'share_initializing',
        #                  message = 'File sharing is initializing. Please wait...',
        #                  user = username,
        #                  extra = {'target_path': reverse('designsafe_data:data_depot',
        #                                                  args=['agave', file_id])})
        # n.save()
        user = get_user_model().objects.get(username=username)

        from designsafe.apps.api.data import AgaveFileManager
        from designsafe.apps.api.data.agave.file import AgaveFile
        from designsafe.apps.api.data.agave.elasticsearch.documents import Object
        agave_fm = AgaveFileManager(user)
        system_id, file_user, file_path = agave_fm.parse_file_id(file_id)

        f = AgaveFile.from_file_path(system_id, username, file_path,
                                     agave_client=agave_fm.agave_client)
        f_dict = f.to_dict()

        n = Notification(event_type = 'data',
                         status = 'INFO',
                         operation = 'share_initializing',
                         message = 'File sharing is initializing. Please wait...',
                         user = username,
                         extra = f_dict)
        n.save()

        f.share(permissions, recursive)
        #reindex_agave.apply_async(args=(self.username, file_id))
        # self.indexer.index(system, file_path, file_user, pems_indexing=True)

        esf = Object.from_file_path(system_id, username, file_path)
        esf.share(username, permissions, recursive)

        # Notify owner share completed
        n = Notification(event_type = 'data',
                         status = 'SUCCESS',
                         operation = 'share_finished',
                         message = 'File permissions were updated successfully.',
                         user = username,
                         extra = f_dict)
        n.save()

        # Notify users they have new shared files
        for pem in permissions:
            if pem['permission'] != 'NONE':
                message = '%s shared some files with you.' % user.get_full_name()
                n = Notification(event_type = 'data',
                                 status = 'SUCCESS',
                                 operation = 'share_finished',
                                 message = message,
                                 user = pem['user_to_share'],
                                 extra = f_dict)
                n.save()

    except:
        logger.error('Error sharing file/folder', exc_info=True,
                     extra = {
                         'username': username,
                         'file_id': file_id,
                         'permissions': permissions
                     })
        n = Notification(event_type='data',
                         status=Notification.ERROR,
                         operation='share_error',
                         message='We were unable to share the specified folder/file(s). '
                                 'Please try again...',
                         user=username,
                         extra={'system': system_id,
                                'path': file_path
                         })
        n.save()
예제 #5
0
def share_agave(self, username, file_id, permissions, recursive):
    try:
        n = Notification(event_type = 'data',
                         status = 'INFO',
                         operation = 'share_initializing',
                         message = 'File sharing is initializing. Please wait...',
                         user = username,
                         extra = {'target_path': reverse('designsafe_data:data_browser',
                                                         args=['agave', file_id])})
        n.save()
        user = get_user_model().objects.get(username=username)

        from designsafe.apps.api.data import AgaveFileManager
        from designsafe.apps.api.data.agave.file import AgaveFile
        from designsafe.apps.api.data.agave.elasticsearch.documents import Object
        agave_fm = AgaveFileManager(user)
        system_id, file_user, file_path = agave_fm.parse_file_id(file_id)

        f = AgaveFile.from_file_path(system_id, username, file_path,
                                     agave_client=agave_fm.agave_client)
        f.share(permissions, recursive)
        #reindex_agave.apply_async(args=(self.username, file_id))
        # self.indexer.index(system, file_path, file_user, pems_indexing=True)
        
        esf = Object.from_file_path(system_id, username, file_path)
        esf.share(username, permissions, recursive)

        # Notify owner share completed
        n = Notification(event_type = 'data',
                         status = 'SUCCESS',
                         operation = 'share_finished',
                         message = 'File permissions were updated successfully.',
                         user = username,
                         extra = {'target_path': reverse('designsafe_data:data_browser',
                                                         args=['agave', file_id])})
        n.save()

        # Notify users they have new shared files
        for pem in permissions:
            if pem['permission'] != 'NONE':
                message = '%s shared some files with you.' % user.get_full_name()
                n = Notification(event_type = 'data',
                                 status = 'SUCCESS',
                                 operation = 'share_finished',
                                 message = message,
                                 user = pem['user_to_share'],
                                 extra = {'target_path': reverse('designsafe_data:data_browser',
                                                                 args=['agave', file_id])})
                n.save()

    except:
        logger.error('Error sharing file/folder', exc_info=True,
                     extra = {
                         'username': username,
                         'file_id': file_id,
                         'permissions': permissions
                     })
        n = Notification(event_type='data',
                         status=Notification.ERROR,
                         operation='share_error',
                         message='We were unable to share the specified folder/file(s). '
                                 'Please try again...',
                         user=username,
                         extra={})
        n.save()
예제 #6
0
 def scan(self): 
     for o in self.listing_json:
         doc = Object(**o)
         #doc.to_dict.return_value = o
         yield doc