Skip to content

Image

ImageView

Bases: View

View for image records.

This view doesn't have a Data Portal resource that it populates, instead the records that go through this view are embedded within other record types.

Source code in dataimporter/emu/views/image.py
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
class ImageView(View):
    """
    View for image records.

    This view doesn't have a Data Portal resource that it populates, instead the records
    that go through this view are embedded within other record types.
    """

    def __init__(self, path: Path, store: Store, iiif_url_base: str):
        """
        :param path: the root path that all view related data should be stored under
        :param db: the DataDB object that backs this view
        :param iiif_url_base: base URL for the IIIF image URLs created in make_data
        """
        super().__init__(path, store)
        self.iiif_url_base = iiif_url_base

    def is_member(self, record: SourceRecord) -> FilterResult:
        """
        Filters the given record, determining whether it is an image or not.

        :param record: the record to filter
        :return: a FilterResult object
        """
        if record.get_first_value('MulMimeType') != 'image':
            return MULTIMEDIA_NOT_IMAGE

        return SUCCESS_RESULT

    def is_publishable(self, record: SourceRecord) -> FilterResult:
        """
        Filters the given record, determining whether it matches the publishing rules
        for images.

        :param record: the record to filter
        :return: a FilterResult object
        """
        if not is_valid_guid(record):
            return INVALID_GUID

        if not is_web_published(record):
            return NO_PUBLISH

        return SUCCESS_RESULT

    @strip_empty
    def transform(self, record: SourceRecord) -> dict:
        """
        Converts the record's raw data to a dict which will then be embedded in other
        records and presented on the Data Portal.

        :param record: the record to project
        :return: a dict containing the data for this record that should be displayed on
            the Data Portal
        """
        # cache for perf
        get_first = record.get_first_value

        asset_id = get_first('AdmGUIDPreferredValue')
        data = {
            '_id': record.id,
            'created': emu_date(
                get_first('AdmDateInserted'), get_first('AdmTimeInserted')
            ),
            'modified': emu_date(
                get_first('AdmDateModified'), get_first('AdmTimeModified')
            ),
            'assetID': asset_id,
            'identifier': f'{self.iiif_url_base}/{asset_id}',
            'title': get_first('MulTitle'),
            'creator': get_first('MulCreator'),
            'category': get_first('DetResourceType'),
            'type': 'StillImage',
            'license': 'http://creativecommons.org/licenses/by/4.0/',
            'rightsHolder': 'The Trustees of the Natural History Museum, London',
        }

        width = get_first('ChaImageWidth')
        height = get_first('ChaImageHeight')
        if width and height:
            swap = orientation_requires_swap(record)
            data['PixelXDimension'] = width if not swap else height
            data['PixelYDimension'] = height if not swap else width

        if mime_subtype := get_first('MulMimeFormat'):
            # we know that the mime type is image because it's in our member filter
            data['format'] = f'image/{mime_subtype}'

        return data

__init__(path, store, iiif_url_base)

Parameters:

Name Type Description Default
path Path

the root path that all view related data should be stored under

required
db

the DataDB object that backs this view

required
iiif_url_base str

base URL for the IIIF image URLs created in make_data

required
Source code in dataimporter/emu/views/image.py
26
27
28
29
30
31
32
33
def __init__(self, path: Path, store: Store, iiif_url_base: str):
    """
    :param path: the root path that all view related data should be stored under
    :param db: the DataDB object that backs this view
    :param iiif_url_base: base URL for the IIIF image URLs created in make_data
    """
    super().__init__(path, store)
    self.iiif_url_base = iiif_url_base

is_member(record)

Filters the given record, determining whether it is an image or not.

Parameters:

Name Type Description Default
record SourceRecord

the record to filter

required

Returns:

Type Description
FilterResult

a FilterResult object

Source code in dataimporter/emu/views/image.py
35
36
37
38
39
40
41
42
43
44
45
def is_member(self, record: SourceRecord) -> FilterResult:
    """
    Filters the given record, determining whether it is an image or not.

    :param record: the record to filter
    :return: a FilterResult object
    """
    if record.get_first_value('MulMimeType') != 'image':
        return MULTIMEDIA_NOT_IMAGE

    return SUCCESS_RESULT

is_publishable(record)

Filters the given record, determining whether it matches the publishing rules for images.

Parameters:

Name Type Description Default
record SourceRecord

the record to filter

required

Returns:

Type Description
FilterResult

a FilterResult object

Source code in dataimporter/emu/views/image.py
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
def is_publishable(self, record: SourceRecord) -> FilterResult:
    """
    Filters the given record, determining whether it matches the publishing rules
    for images.

    :param record: the record to filter
    :return: a FilterResult object
    """
    if not is_valid_guid(record):
        return INVALID_GUID

    if not is_web_published(record):
        return NO_PUBLISH

    return SUCCESS_RESULT

transform(record)

Converts the record's raw data to a dict which will then be embedded in other records and presented on the Data Portal.

Parameters:

Name Type Description Default
record SourceRecord

the record to project

required

Returns:

Type Description
dict

a dict containing the data for this record that should be displayed on the Data Portal

Source code in dataimporter/emu/views/image.py
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
@strip_empty
def transform(self, record: SourceRecord) -> dict:
    """
    Converts the record's raw data to a dict which will then be embedded in other
    records and presented on the Data Portal.

    :param record: the record to project
    :return: a dict containing the data for this record that should be displayed on
        the Data Portal
    """
    # cache for perf
    get_first = record.get_first_value

    asset_id = get_first('AdmGUIDPreferredValue')
    data = {
        '_id': record.id,
        'created': emu_date(
            get_first('AdmDateInserted'), get_first('AdmTimeInserted')
        ),
        'modified': emu_date(
            get_first('AdmDateModified'), get_first('AdmTimeModified')
        ),
        'assetID': asset_id,
        'identifier': f'{self.iiif_url_base}/{asset_id}',
        'title': get_first('MulTitle'),
        'creator': get_first('MulCreator'),
        'category': get_first('DetResourceType'),
        'type': 'StillImage',
        'license': 'http://creativecommons.org/licenses/by/4.0/',
        'rightsHolder': 'The Trustees of the Natural History Museum, London',
    }

    width = get_first('ChaImageWidth')
    height = get_first('ChaImageHeight')
    if width and height:
        swap = orientation_requires_swap(record)
        data['PixelXDimension'] = width if not swap else height
        data['PixelYDimension'] = height if not swap else width

    if mime_subtype := get_first('MulMimeFormat'):
        # we know that the mime type is image because it's in our member filter
        data['format'] = f'image/{mime_subtype}'

    return data