old_contents: # Copyright 2019 Camptocamp SA
  # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
  
  from odoo import api, fields, models, tools, _
  from odoo.exceptions import ValidationError
  
  
  class Image(models.Model):
      _name = 'image'
  
      name = fields.Char('Name', required=True)
      model_name = fields.Char('Model Name', required=True)
      selector = fields.Text(
          'Selector',
          help='Python expression used as selector when multiple images are used'
               'for the same object. The variable `object` refer '
               'to the actual record on which the expression will be executed. '
               'An empty expression will always return `True`.'
      )
      company_id = fields.Many2one(
          'res.company', 'Company',
          help='Company related check. If inherited object does not have a '
               '`company_id` field, it will be ignored. '
               'The check will first take the records with a company then, '
               'if not match is found, the ones without a company.'
      )
  
      # image: all image fields are base64 encoded and PIL-supported
      image = fields.Binary(
          "Image", attachment=True,
          help="This field holds the standard image, limited to 1024x1024px"
      )
      image_medium = fields.Binary(
          "Medium-sized image", attachment=True,
          help="Medium-sized image. It is automatically "
               "resized as a 128x128px image, with aspect ratio preserved. "
               "Use this field in form views or some kanban views."
      )
      image_small = fields.Binary(
          "Small-sized image", attachment=True,
          help="Small-sized image. It is automatically "
               "resized as a 64x64px image, with aspect ratio preserved. "
               "Use this field anywhere a small image is required."
      )
  
      @api.model
      def _process_images(self, vals, required=False):
          if set(['image', 'image_medium', 'image_small']) & set(vals.keys()):
              tools.image_resize_images(vals)
          elif required:
              raise ValidationError(
                  _('At least one image type must be specified')
              )
  
      @api.model
      def create(self, vals):
          self._process_images(vals, required=True)
          return super().create(vals)
  
      @api.multi
      def write(self, vals):
          self._process_images(vals)
          return super().write(vals)
  
new_contents: # Copyright 2019 Camptocamp SA
  # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
  
  from odoo import api, fields, models, tools, _
  from odoo.exceptions import ValidationError
  
  
  class Image(models.Model):
      _name = 'image'
  
      name = fields.Char('Name', required=True)
      model_name = fields.Char('Model Name', required=True)
      selector = fields.Text(
          'Selector',
          help='Python expression used as selector when multiple images are used'
               'for the same object. The variable `object` refers '
               'to the actual record on which the expression will be executed. '
               'An empty expression will always return `True`.'
      )
      company_id = fields.Many2one(
          'res.company', 'Company',
          help='Company related check. If inherited object does not have a '
               '`company_id` field, it will be ignored. '
               'The check will first take the records with a company then, '
               'if no match is found, the ones without a company.'
      )
  
      # image: all image fields are base64 encoded and PIL-supported
      image = fields.Binary(
          "Image", attachment=True,
          help="This field holds the standard image, limited to 1024x1024px"
      )
      image_medium = fields.Binary(
          "Medium-sized image", attachment=True,
          help="Medium-sized image. It is automatically "
               "resized as a 128x128px image, with aspect ratio preserved. "
               "Use this field in form views or some kanban views."
      )
      image_small = fields.Binary(
          "Small-sized image", attachment=True,
          help="Small-sized image. It is automatically "
               "resized as a 64x64px image, with aspect ratio preserved. "
               "Use this field anywhere a small image is required."
      )
  
      @api.model
      def _process_images(self, vals, required=False):
          if set(['image', 'image_medium', 'image_small']) & set(vals.keys()):
              tools.image_resize_images(vals)
          elif required:
              raise ValidationError(
                  _('At least one image type must be specified')
              )
  
      @api.model
      def create(self, vals):
          self._process_images(vals, required=True)
          return super().create(vals)
  
      @api.multi
      def write(self, vals):
          self._process_images(vals)
          return super().write(vals)
  
subject: Apply suggestions from code review