Ejemplo n.º 1
0
    def test_should_find_inconsistent_derived_image_metadatas(self):

        for i in range(1, 15):
            original_image_metadata = domain.OriginalImageMetadata(
                'MYID%s' % i, domain.STATUS_INCONSISTENT, (800, 600),
                domain.IMAGE_FORMAT_JPEG)
            self._itemRepository.add(original_image_metadata)

            item = domain.DerivedImageMetadata(domain.STATUS_INCONSISTENT,
                                               (100, 100),
                                               domain.IMAGE_FORMAT_JPEG,
                                               original_image_metadata)
            self._itemRepository.add(item)

        for i in range(16, 20):
            original_image_metadata = domain.OriginalImageMetadata(
                'MYID%s' % i, domain.STATUS_OK, (900, 400),
                domain.IMAGE_FORMAT_JPEG)
            self._itemRepository.add(original_image_metadata)

            item = domain.DerivedImageMetadata(domain.STATUS_OK, (100, 100),
                                               domain.IMAGE_FORMAT_JPEG,
                                               original_image_metadata)
            self._itemRepository.add(item)

        items = self._itemRepository.find_inconsistent_derived_image_metadatas(
            10)
        assert len(items) == 10
        for i in items:
            assert i.id in ['MYID%s-100x100-JPEG' % n for n in range(1, 15)]
            assert i.status == domain.STATUS_INCONSISTENT
            assert i.width == 100
            assert i.height == 100
            assert i.format == domain.IMAGE_FORMAT_JPEG
Ejemplo n.º 2
0
 def test_should_not_save_two_original_image_metadatas_with_same_id(self):
     item = domain.OriginalImageMetadata('MYID12435', domain.STATUS_OK,
                                         (800, 600),
                                         domain.IMAGE_FORMAT_JPEG)
     item2 = domain.OriginalImageMetadata('MYID12435',
                                          domain.STATUS_INCONSISTENT,
                                          (700, 100),
                                          domain.IMAGE_FORMAT_JPEG)
     self._itemRepository.add(item)
     try:
         self._itemRepository.add(item2)
     except domain.DuplicateEntryException, ex:
         assert 'MYID12435' == ex.duplicate_id
Ejemplo n.º 3
0
    def test_should_find_derived_image_metadata_by_original_image_metadata_id_size_and_format(
            self):
        original_image_metadata = domain.OriginalImageMetadata(
            'MYID12435', domain.STATUS_OK, (800, 600),
            domain.IMAGE_FORMAT_JPEG)
        self._itemRepository.add(original_image_metadata)

        item = domain.DerivedImageMetadata(domain.STATUS_OK, (100, 100),
                                           domain.IMAGE_FORMAT_JPEG,
                                           original_image_metadata)
        self._itemRepository.add(item)
        found_item = self._itemRepository.find_derived_image_metadata_by_original_image_metadata_id_size_and_format(
            'MYID12435', (100, 100), domain.IMAGE_FORMAT_JPEG)

        assert found_item is not None
        assert found_item.status == domain.STATUS_OK
        assert found_item.width == 100
        assert found_item.height == 100
        assert found_item.format == domain.IMAGE_FORMAT_JPEG
        assert found_item.original_image_metadata.id == 'MYID12435'
        assert found_item.original_image_metadata.status == domain.STATUS_OK
        assert found_item.original_image_metadata.width == 800
        assert found_item.original_image_metadata.height == 600
        assert found_item.original_image_metadata.format == domain.IMAGE_FORMAT_JPEG
        _datetimes_should_be_equal(item.last_status_change_date,
                                   found_item.last_status_change_date)
 def test_format_should_be_mandatory_at_creation_time(self):
     try:
         domain.OriginalImageMetadata('MYID12435', domain.STATUS_OK,
                                      (800, 600), None)
     except Exception:
         pass
     else:
         self.fail()
 def test_heiht_should_be_mandatory_at_creation_time(self):
     try:
         domain.OriginalImageMetadata('MYID12435', domain.STATUS_OK,
                                      (800, None), domain.IMAGE_FORMAT_JPEG)
     except Exception:
         pass
     else:
         self.fail()
 def test_id_should_be_mandatory_at_creation_time(self):
     try:
         domain.OriginalImageMetadata(None, domain.STATUS_OK, (800, 600),
                                      domain.IMAGE_FORMAT_JPEG)
     except Exception:
         pass
     else:
         self.fail()
 def test_setting_status_should_update_status_change_date(self):
     item = domain.OriginalImageMetadata('MYID12435',
                                         domain.STATUS_INCONSISTENT,
                                         (800, 600),
                                         domain.IMAGE_FORMAT_JPEG)
     # f**k date by breaking encapsulation
     item._last_status_change_date = datetime.utcnow() - timedelta(1)
     item.status = domain.STATUS_OK
     assertionutils.last_status_date_should_be_now(item)
Ejemplo n.º 8
0
    def test_should_delete_original_image_metadata(self):
        item = domain.OriginalImageMetadata('MYID12435', domain.STATUS_OK,
                                            (800, 600),
                                            domain.IMAGE_FORMAT_JPEG)
        self._itemRepository.add(item)
        self._itemRepository.delete(
            self._itemRepository.find_original_image_metadata_by_id(
                'MYID12435'))

        found_item = self._itemRepository.find_original_image_metadata_by_id(
            'MYID12435')
        assert found_item is None
Ejemplo n.º 9
0
    def test_should_not_find_derived_image_metadata_because_of_format(self):
        original_image_metadata = domain.OriginalImageMetadata(
            'MYID12435', domain.STATUS_OK, (800, 600),
            domain.IMAGE_FORMAT_JPEG)
        self._itemRepository.add(original_image_metadata)

        item = domain.DerivedImageMetadata(domain.STATUS_OK, (100, 100),
                                           domain.IMAGE_FORMAT_JPEG,
                                           original_image_metadata)
        self._itemRepository.add(item)
        found_item = self._itemRepository.find_derived_image_metadata_by_original_image_metadata_id_size_and_format(
            'MYID12435', (100, 100), 'JPEG2')
        assert found_item is None
Ejemplo n.º 10
0
 def test_should_find_original_image_metadata_by_id(self):
     item = domain.OriginalImageMetadata('MYID12435', domain.STATUS_OK,
                                         (800, 600),
                                         domain.IMAGE_FORMAT_JPEG)
     self._itemRepository.add(item)
     found_item = self._itemRepository.find_original_image_metadata_by_id(
         'MYID12435')
     assert found_item is not None
     assert found_item.id == 'MYID12435'
     assert found_item.status == domain.STATUS_OK
     assert found_item.width == 800
     assert found_item.height == 600
     assert found_item.format == domain.IMAGE_FORMAT_JPEG
     _datetimes_should_be_equal(item.last_status_change_date,
                                found_item.last_status_change_date)
Ejemplo n.º 11
0
    def test_should_navigate_to_derived_image_metadatas_from_original_image_metadata(
            self):
        original_image_metadata = domain.OriginalImageMetadata(
            'MYID12435', domain.STATUS_OK, (800, 600),
            domain.IMAGE_FORMAT_JPEG)
        self._itemRepository.add(original_image_metadata)

        item = domain.DerivedImageMetadata(domain.STATUS_OK, (100, 100),
                                           domain.IMAGE_FORMAT_JPEG,
                                           original_image_metadata)
        self._itemRepository.add(item)

        found_item = self._itemRepository.find_original_image_metadata_by_id(
            'MYID12435')
        assert found_item is not None
        assert found_item.derived_image_metadatas is not None
        assert len(found_item.derived_image_metadatas) == 1
        assert found_item.derived_image_metadatas[0].id == item.id
Ejemplo n.º 12
0
    def test_should_not_save_two_derived_image_metadatas_with_same_id(self):
        original_image_metadata = domain.OriginalImageMetadata(
            'MYID12435', domain.STATUS_OK, (800, 600),
            domain.IMAGE_FORMAT_JPEG)
        self._itemRepository.add(original_image_metadata)
        item = domain.DerivedImageMetadata(domain.STATUS_OK, (100, 100),
                                           domain.IMAGE_FORMAT_JPEG,
                                           original_image_metadata)
        self._itemRepository.add(item)

        try:
            item2 = domain.DerivedImageMetadata(domain.STATUS_OK, (100, 100),
                                                domain.IMAGE_FORMAT_JPEG,
                                                original_image_metadata)
            self._itemRepository.add(item2)
        except domain.DuplicateEntryException as ex:
            assert 'MYID12435-100x100-JPEG' == ex.duplicate_id
        except Exception as e:
            print e
        else:
            self.fail()
Ejemplo n.º 13
0
    def test_deletion_of_original_image_metadata_should_delete_associated_derived_image_metadatas(
            self):
        original_image_metadata = domain.OriginalImageMetadata(
            'MYID12435', domain.STATUS_OK, (800, 600),
            domain.IMAGE_FORMAT_JPEG)
        self._itemRepository.add(original_image_metadata)

        item = domain.DerivedImageMetadata(domain.STATUS_OK, (100, 100),
                                           domain.IMAGE_FORMAT_JPEG,
                                           original_image_metadata)
        self._itemRepository.add(item)

        self._session.delete(
            self._itemRepository.find_original_image_metadata_by_id(
                'MYID12435'))

        found_derived_image_metadata = self._itemRepository.find_derived_image_metadata_by_original_image_metadata_id_size_and_format(
            'MYID12435', (100, 100), domain.IMAGE_FORMAT_JPEG)
        assert found_derived_image_metadata is None

        found_original_image_metadata = self._itemRepository.find_original_image_metadata_by_id(
            'MYID12435')
        assert found_original_image_metadata is None
Ejemplo n.º 14
0
 def test_should_create_item_using_width_and_height_expressed_as_int(self):
     item = domain.OriginalImageMetadata('MYID12435', domain.STATUS_OK,
                                         (800, 600),
                                         domain.IMAGE_FORMAT_JPEG)
     _item_should_match(item)
Ejemplo n.º 15
0
 def setUp(self):
     unittest.TestCase.setUp(self)
     self.original_image_metadata = domain.OriginalImageMetadata(
         'MYID12435', domain.STATUS_OK, ('800', '600'),
         domain.IMAGE_FORMAT_JPEG)
Ejemplo n.º 16
0
def original_yemmagouraya_metadata():
    return domain.OriginalImageMetadata('yemmaGouraya', domain.STATUS_OK,
                                        ('800', '600'),
                                        domain.IMAGE_FORMAT_JPEG)
class DefaultImageRequestProcessor(object):
    implements(ImageRequestProcessor)

    def __init__(self,
                 image_metadata_repository,
                 path_generator,
                 image_format_mapper,
                 schema_migrator,
                 data_directory,
                 session_template,
                 dev_mode=False):
        """ @param data_directory: the directory that this 
            ImageRequestProcessor will use for its work files """
        self._data_directory = data_directory
        self._image_metadata_repository = domain.ImageMetadataRepository(
            image_metadata_repository)
        self._image_format_mapper = resources.ImageFormatMapper(
            image_format_mapper)
        self._schema_migrator = persistence.SchemaMigrator(schema_migrator)
        self._path_generator = resources.PathGenerator(path_generator)
        self._session_template = session_template
        self._dev_mode = dev_mode

        if self._dev_mode:
            self._drop_data()

        self._init_data()
        self.cleanup_inconsistent_items()

    @tx.transactional
    def _wait_for_item_status_ok(self, pollingCallback):
        """ Wait for the status property of the object returned by pollingCallback() to be STATUS_OK
        It honors LOCK_MAX_RETRIES and LOCK_WAIT_SECONDS
        """
        item = pollingCallback()
        i = 0
        while i < LOCK_MAX_RETRIES and item is not None and item.status != domain.STATUS_OK:
            time.sleep(LOCK_WAIT_SECONDS)
            item = pollingCallback()
            i = i + 1
        if i == LOCK_MAX_RETRIES:
            raise imgengine.ImageProcessingException(
                'Item seems to be locked forever')

    def _wait_for_original_image_metadata(self, image_id):
        """ Wait for the given original item to have a status of STATUS_OK """
        self._wait_for_item_status_ok(
            lambda: self._image_metadata_repository.
            find_original_image_metadata_by_id(image_id))

    def _required_original_image_metadata(self, image_id,
                                          original_image_metadata):
        if original_image_metadata is None:
            raise imgengine.ImageMetadataNotFoundException(image_id)

    @tx.transactional
    def get_original_image_path(self, image_id):
        logger.debug("get_original_image_path")
        original_image_metadata = self._image_metadata_repository.find_original_image_metadata_by_id(
            image_id)
        self._required_original_image_metadata(image_id,
                                               original_image_metadata)
        self._wait_for_original_image_metadata(image_id)
        return self._path_generator.original_path(
            original_image_metadata).relative()

    @tx.transactional
    def save_file_to_repository(self, file, image_id):
        def filename_save_strategy(file, item):
            shutil.copyfile(
                file,
                self._path_generator.original_path(item).absolute())

        def file_like_save_strategy(file, item):
            file.seek(0)
            with open(
                    self._path_generator.original_path(item).absolute(),
                    "w+b") as out:
                shutil.copyfileobj(file, out)
                out.flush()

        if type(file) == str:
            save = filename_save_strategy
        else:
            save = file_like_save_strategy

        # Check that the image is not broken
        try:
            img = Image.open(file)
            img.verify()
        except IOError, ex:
            raise imgengine.ImageStreamNotRecognizedException(ex)

        item = domain.OriginalImageMetadata(image_id,
                                            domain.STATUS_INCONSISTENT,
                                            img.size, img.format)

        try:
            # atomic creation
            self._image_metadata_repository.add(item)
        except domain.DuplicateEntryException, ex:
            raise imgengine.ImageIDAlreadyExistsException(item.id)