Skip to content
Snippets Groups Projects
Commit fd8b48a8 authored by Bastien Abadie's avatar Bastien Abadie
Browse files

Merge branch 'check-images' into 'master'

Add check_images command

See merge request !203
parents 41d3e417 59d9ea0e
No related branches found
No related tags found
1 merge request!203Add check_images command
from django.core.management.base import CommandError
from ponos.management.base import PonosCommand
from arkindex.project.argparse import CorpusArgument, ElementArgument
from arkindex.images.models import Image, ImageStatus
import logging
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s [%(levelname)s] %(message)s',
)
logger = logging.getLogger()
class Command(PonosCommand):
help = 'Check images availability'
def add_arguments(self, parser):
super().add_arguments(parser)
parser.add_argument(
'--force',
action='store_true',
default=False,
)
parser.add_argument(
'--corpus',
help='A corpus to run checks on',
type=CorpusArgument(),
)
parser.add_argument(
'--element',
help='One or more elements to run checks on',
type=ElementArgument(),
nargs='+',
)
def validate_args(self, corpus=None, element=None, force=False, **options):
if corpus and element:
raise CommandError('--corpus and --element cannot be used together')
if corpus:
images = Image.objects.filter(zones__elements__corpus=corpus).distinct()
elif element:
images = Image.objects.filter(zones__elements__in=element).distinct()
else:
images = Image.objects.all()
if not force:
images = images.exclude(status=ImageStatus.Checked)
return {'images': images}
def run(self, images=[]):
for image in images:
logger.info('Checking image {} at {}'.format(str(image.id), image.url))
image.perform_check(save=True)
from arkindex.project.tests import FixtureTestCase
from arkindex.project.polygon import Polygon
from arkindex.documents.models import Transcription, TranscriptionType, DataSource
from arkindex.images.models import Image, ImageServer, ImageStatus
from arkindex.images.importer import build_transcriptions, save_transcriptions
......@@ -11,7 +10,7 @@ class TestBulkTranscriptions(FixtureTestCase):
@classmethod
def setUpTestData(cls):
super().setUpTestData()
cls.img = Image.objects.get(path='img6', server=cls.imgsrv)
cls.img = cls.imgsrv.images.get(path='img6')
pagezone = cls.img.zones.first()
cls.page = pagezone.elements.first()
cls.src = DataSource.objects.get(slug='test')
......@@ -133,25 +132,3 @@ class TestBulkTranscriptions(FixtureTestCase):
# should not recreate
trpolygons = build_transcriptions(self.img, self.page, self.src, items)
self.assertEqual(len(trpolygons), 0)
class TestImageServer(FixtureTestCase):
'''
Test Image server creation
'''
def test_check(self):
server = ImageServer.objects.create(name='dummy', url='http://test/iiif')
image = server.find_image('https://test/iiif/dog.jpg', width=800, height=600)
self.assertEqual(image.status, ImageStatus.Error) # connection error, no exception
class TestImage(FixtureTestCase):
def test_path_not_encoded(self):
"""
Assert that an image's path is not URL encoded when created
This can yield to images with URLs such as http://.../test%34test to be encoded as http://.../test%2534test
"""
img = Image.objects.create(server=self.imgsrv, path='!#%:+*')
img.refresh_from_db()
self.assertEqual(img.path, '!#%:+*')
from arkindex.project.tests import FixtureTestCase
from arkindex.images.models import ImageStatus
from django.core.management import call_command
from django.core.management.base import CommandError
from unittest.mock import patch
class TestCheckImages(FixtureTestCase):
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.check_mock = patch('arkindex.images.management.commands.check_images.Image.perform_check').start()
@classmethod
def setUpTestData(cls):
super().setUpTestData()
cls.p1 = cls.corpus.elements.get(name='Volume 1, page 1r')
cls.p2 = cls.corpus.elements.get(name='Volume 1, page 1v')
# Set two images to Checked
cls.imgsrv.images.filter(path='img5').update(status=ImageStatus.Checked)
cls.imgsrv.images.filter(path='img6').update(status=ImageStatus.Checked)
# Create an image linked to zero elements
cls.imgsrv.images.create(path='am-outside')
def tearDown(self):
super().tearDown()
self.check_mock.reset_mock()
def test_nothing(self):
call_command(
'check_images',
)
self.assertEqual(self.check_mock.call_count, 5)
def test_corpus(self):
call_command(
'check_images',
corpus=self.corpus,
)
self.assertEqual(self.check_mock.call_count, 4)
def test_element(self):
call_command(
'check_images',
element=[self.p1, self.p2],
)
self.assertEqual(self.check_mock.call_count, 2)
def test_corpus_xor_element(self):
with self.assertRaises(CommandError):
call_command(
'check_images',
corpus=self.corpus,
element=[self.p1, ],
)
def test_force(self):
call_command(
'check_images',
force=True,
)
self.assertEqual(self.check_mock.call_count, 7)
from arkindex.project.tests import FixtureTestCase
from arkindex.images.models import Image
class TestImage(FixtureTestCase):
def test_path_not_encoded(self):
"""
Assert that an image's path is not URL encoded when created
This can yield to images with URLs such as http://.../test%34test to be encoded as http://.../test%2534test
"""
img = Image.objects.create(server=self.imgsrv, path='!#%:+*')
img.refresh_from_db()
self.assertEqual(img.path, '!#%:+*')
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment