update an existing attachment

        the given metadata dict will be merged with the old one.
        only the following fields could be updated:
        [name, mime, notes, download_count]

def update_attachment(self, volumeID, attachmentID, metadata):
        '''update an existing attachment

        the given metadata dict will be merged with the old one.
        only the following fields could be updated:
        [name, mime, notes, download_count]
        '''
        log.debug('updating metadata of attachment {} from volume {}'.format(attachmentID, volumeID))
        modifiable_fields = ['name', 'mime', 'notes', 'download_count']
        for k in metadata.keys():
            if k not in modifiable_fields:
                raise ValueError('Not modifiable field given: {}'.format(k))
        if 'name' in metadata and not isinstance(metadata['name'], basestring):
            raise ValueError("'name' must be a string")
        if 'mime' in metadata and not isinstance(metadata['mime'], basestring):
            raise ValueError("'mime' must be a string")
        if 'notes' in metadata and not isinstance(metadata['notes'], basestring):
            raise ValueError("'notes' must be a string")
        if 'download_count' in metadata and not isinstance(metadata['download_count'], Integral):
            raise ValueError("'download_count' must be a number")
        rawVolume = self._req_raw_volume(volumeID)
        for attachment in rawVolume['_source']['_attachments']:
            if attachment['id'] == attachmentID:
                attachment.update(metadata)
                self._db.modify_book(id=volumeID, body=rawVolume['_source'], version=rawVolume['_version'])
                return
        raise NotFoundException('Could not found attachment with id {} in volume {}'.format(attachmentID, volumeID))