def handle(self, *args, **options): ignore_errors = options.get('ignore_errors') remove_duplicates = options.get('remove_duplicates') prune = options.get('prune') set_uuid = ast.literal_eval(options.get('set_uuid', 'False')) set_attrib = ast.literal_eval(options.get('set_attrib', 'True')) set_links = ast.literal_eval(options.get('set_links', 'True')) delete_orphaned_thumbnails = options.get('delete_orphaned_thumbnails') filter = options.get('filter') if not options.get('username'): username = None else: username = options.get('username') all_layers = Layer.objects.all().order_by('name') if filter: all_layers = all_layers.filter(name__icontains=filter) if username: all_layers = all_layers.filter(owner__username=username) for index, layer in enumerate(all_layers): print(f"[{(index + 1)} / {len(all_layers)}] Updating Layer [{layer.name}] ...") try: # recalculate the layer statistics if set_attrib: set_attributes(layer, overwrite=True) if set_uuid and hasattr(settings, 'LAYER_UUID_HANDLER') and settings.LAYER_UUID_HANDLER != '': from geonode.layers.utils import get_uuid_handler uuid = get_uuid_handler()(layer).create_uuid() la = Layer.objects.filter(resourcebase_ptr=layer.resourcebase_ptr) la.update(uuid=uuid) layer.refresh_from_db() # refresh metadata links if set_links: set_resource_default_links(layer, layer, prune=prune) # refresh catalogue metadata records catalogue_post_save(instance=layer, sender=layer.__class__) # remove duplicates if remove_duplicates: remove_duplicate_links(layer) except Exception as e: import traceback traceback.print_exc() if ignore_errors: logger.error(f"[ERROR] Layer [{layer.name}] couldn't be updated") else: raise e # delete orphaned thumbs if delete_orphaned_thumbnails: delete_orphaned_thumbs()
def handle(self, *args, **options): ignore_errors = options.get('ignore_errors') remove_duplicates = options.get('remove_duplicates') prune = options.get('prune') delete_orphaned_thumbnails = options.get('delete_orphaned_thumbnails') filter = options.get('filter') if not options.get('username'): username = None else: username = options.get('username') all_layers = Layer.objects.all().order_by('name') if filter: all_layers = all_layers.filter(name__icontains=filter) if username: all_layers = all_layers.filter(owner__username=username) for index, layer in enumerate(all_layers): print( f"[{(index + 1)} / {len(all_layers)}] Updating Layer [{layer.name}] ..." ) try: # recalculate the layer statistics set_attributes(layer, overwrite=True) # refresh metadata links set_resource_default_links(layer, layer, prune=prune) # refresh catalogue metadata records catalogue_post_save(instance=layer, sender=layer.__class__) # remove duplicates if remove_duplicates: remove_duplicate_links(layer) except Exception as e: import traceback traceback.print_exc() if ignore_errors: logger.error( f"[ERROR] Layer [{layer.name}] couldn't be updated") else: raise e # delete orphaned thumbs if delete_orphaned_thumbnails: delete_orphaned_thumbs()
def test_moderated_upload(self): """ Test if moderation flag works """ with self.settings(ADMIN_MODERATE_UPLOADS=False): document_upload_url = reverse('document_upload') self.client.login(username=self.user, password=self.passwd) input_path = self._get_input_path() with open(input_path, 'rb') as f: data = {'title': 'document title', 'doc_file': f, 'doc_url': '', 'resource': '', 'permissions': '{}', } resp = self.client.post(document_upload_url, data=data) self.assertEqual(resp.status_code, 302) dname = 'document title' _d = Document.objects.get(title=dname) self.assertTrue(_d.is_published) uuid = _d.uuid _d.delete() from geonode.documents.utils import delete_orphaned_document_files delete_orphaned_document_files() from geonode.base.utils import delete_orphaned_thumbs delete_orphaned_thumbs() from django.conf import settings documents_path = os.path.join(settings.MEDIA_ROOT, 'documents') fn = os.path.join(documents_path, os.path.basename(input_path)) self.assertFalse(os.path.isfile(fn)) thumbs_path = os.path.join(settings.MEDIA_ROOT, 'thumbs') _cnt = 0 for filename in os.listdir(thumbs_path): fn = os.path.join(thumbs_path, filename) if uuid in filename: _cnt += 1 self.assertTrue(_cnt == 0) with self.settings(ADMIN_MODERATE_UPLOADS=True): document_upload_url = reverse('document_upload') self.client.login(username=self.user, password=self.passwd) input_path = self._get_input_path() with open(input_path, 'rb') as f: data = {'title': 'document title', 'doc_file': f, 'doc_url': '', 'resource': '', 'permissions': '{}', } resp = self.client.post(document_upload_url, data=data) self.assertEqual(resp.status_code, 302) dname = 'document title' _d = Document.objects.get(title=dname) self.assertFalse(_d.is_published)
def delete_orphaned_thumbnails(self): from geonode.base.utils import delete_orphaned_thumbs delete_orphaned_thumbs()
def test_moderated_upload(self): """ Test if moderation flag works """ with self.settings(ADMIN_MODERATE_UPLOADS=False): self.client.login(username=self.user, password=self.passwd) input_path = self._get_input_path() with open(input_path, 'rb') as f: data = { 'title': 'document title', 'doc_file': f, 'resource': '', 'extension': 'txt', 'permissions': '{}', } resp = self.client.post(self.document_upload_url, data=data) self.assertEqual(resp.status_code, 200) dname = 'document title' _d = Document.objects.get(title=dname) self.assertTrue(_d.is_published) uuid = _d.uuid _d.delete() from geonode.documents.utils import delete_orphaned_document_files _, document_files_before = storage.listdir( os.path.join("documents", "document")) deleted = delete_orphaned_document_files() _, document_files_after = storage.listdir( os.path.join("documents", "document")) self.assertTrue(len(deleted) > 0) self.assertEqual( set(deleted), set(document_files_before) - set(document_files_after)) from geonode.base.utils import delete_orphaned_thumbs thumb_files_before = get_thumbs() deleted = delete_orphaned_thumbs() thumb_files_after = get_thumbs() if len(thumb_files_before): self.assertTrue( len(deleted) > 0, f"before: {thumb_files_before} - deleted: {deleted} - after: {thumb_files_after}" ) self.assertEqual( set(deleted), set(thumb_files_before) - set(thumb_files_after), f"deleted: {deleted} vs {set(thumb_files_before) - set(thumb_files_after)}" ) fn = os.path.join(os.path.join("documents", "document"), os.path.basename(input_path)) self.assertFalse(storage.exists(fn)) files = [thumb for thumb in get_thumbs() if uuid in thumb] self.assertEqual(len(files), 0) with self.settings(ADMIN_MODERATE_UPLOADS=True): self.client.login(username=self.user, password=self.passwd) norman = get_user_model().objects.get(username="******") group = GroupProfile.objects.get(slug="bar") input_path = self._get_input_path() with open(input_path, 'rb') as f: data = { 'title': 'document title', 'doc_file': f, 'resource': '', 'extension': 'txt', 'permissions': '{}', } resp = self.client.post(self.document_upload_url, data=data) self.assertEqual(resp.status_code, 200) dname = 'document title' _d = Document.objects.get(title=dname) self.assertFalse(_d.is_approved) self.assertTrue(_d.is_published) group.join(norman) self.assertFalse(group.user_is_role(norman, "manager")) GroupMember.objects.get(group=group, user=norman).promote() self.assertTrue(group.user_is_role(norman, "manager")) self.client.login(username="******", password="******") resp = self.client.get(reverse('document_detail', args=(_d.id, ))) # Forbidden self.assertEqual(resp.status_code, 403) _d.group = group.group _d.save() resp = self.client.get(reverse('document_detail', args=(_d.id, ))) # Allowed - edit permissions self.assertEqual(resp.status_code, 200) perms_list = get_perms(norman, _d.get_self_resource()) + get_perms( norman, _d) self.assertTrue('change_resourcebase_metadata' in perms_list) GroupMember.objects.get(group=group, user=norman).demote() self.assertFalse(group.user_is_role(norman, "manager")) resp = self.client.get(reverse('document_detail', args=(_d.id, ))) # Allowed - no edit self.assertEqual(resp.status_code, 200) perms_list = get_perms(norman, _d.get_self_resource()) + get_perms( norman, _d) self.assertFalse('change_resourcebase_metadata' in perms_list) group.leave(norman)
def test_moderated_upload(self): """ Test if moderation flag works """ with self.settings(ADMIN_MODERATE_UPLOADS=False): self.client.login(username=self.user, password=self.passwd) input_path = self._get_input_path() with open(input_path, 'rb') as f: data = { 'title': 'document title', 'doc_file': f, 'resource': '', 'extension': 'txt', 'permissions': '{}', } resp = self.client.post(self.document_upload_url, data=data) self.assertEqual(resp.status_code, 200) dname = 'document title' _d = Document.objects.get(title=dname) self.assertTrue(_d.is_published) uuid = _d.uuid _d.delete() from geonode.documents.utils import delete_orphaned_document_files delete_orphaned_document_files() from geonode.base.utils import delete_orphaned_thumbs delete_orphaned_thumbs() from django.conf import settings documents_path = os.path.join(settings.MEDIA_ROOT, 'documents') fn = os.path.join(documents_path, os.path.basename(input_path)) self.assertFalse(os.path.isfile(fn)) thumbs_path = os.path.join(settings.MEDIA_ROOT, 'thumbs') _cnt = 0 for filename in os.listdir(thumbs_path): fn = os.path.join(thumbs_path, filename) if uuid in filename: _cnt += 1 self.assertTrue(_cnt == 0) with self.settings(ADMIN_MODERATE_UPLOADS=True): self.client.login(username=self.user, password=self.passwd) norman = get_user_model().objects.get(username="******") group = GroupProfile.objects.get(slug="bar") input_path = self._get_input_path() with open(input_path, 'rb') as f: data = { 'title': 'document title', 'doc_file': f, 'resource': '', 'extension': 'txt', 'permissions': '{}', } resp = self.client.post(self.document_upload_url, data=data) self.assertEqual(resp.status_code, 200) dname = 'document title' _d = Document.objects.get(title=dname) self.assertFalse(_d.is_approved) self.assertTrue(_d.is_published) group.join(norman) self.assertFalse(group.user_is_role(norman, "manager")) GroupMember.objects.get(group=group, user=norman).promote() self.assertTrue(group.user_is_role(norman, "manager")) self.client.login(username="******", password="******") resp = self.client.get(reverse('document_detail', args=(_d.id, ))) # Forbidden self.assertEqual(resp.status_code, 403) _d.group = group.group _d.save() resp = self.client.get(reverse('document_detail', args=(_d.id, ))) # Allowed - edit permissions self.assertEqual(resp.status_code, 200) perms_list = get_perms(norman, _d.get_self_resource()) + get_perms( norman, _d) self.assertTrue('change_resourcebase_metadata' in perms_list) GroupMember.objects.get(group=group, user=norman).demote() self.assertFalse(group.user_is_role(norman, "manager")) resp = self.client.get(reverse('document_detail', args=(_d.id, ))) # Allowed - no edit self.assertEqual(resp.status_code, 200) perms_list = get_perms(norman, _d.get_self_resource()) + get_perms( norman, _d) self.assertFalse('change_resourcebase_metadata' in perms_list) group.leave(norman)
def handle(self, *args, **options): delete_orphaned_thumbs()
def delete_orphaned_thumbnails(self): from geonode.base.utils import delete_orphaned_thumbs delete_orphaned_thumbs()