Example #1
0
def template_edit(template_id):
    embed = request.args.get('embed', '')
    fields = None
    field_values = None
    db_template = None
    err_msg = None
    try:
        if template_id > 0:
            db_template = data_engine.get_image_template(template_id)

        # See also views_pages.publish
        fields = ImageAttrs.validators().copy()
        fields.update(TemplateAttrs.validators().copy())
        # ...but here we use the template values as field values
        if db_template:
            template = TemplateAttrs(db_template.name, db_template.template)
            field_values = template.get_values_dict()
        else:
            # New template defaults
            field_values = {
                'record_stats': True,
                'expiry_secs': image_engine.DEFAULT_EXPIRY_SECS
            }

    except Exception as e:
        log_security_error(e, request)
        err_msg = safe_error_str(e)
    return render_template(
        'admin_template_edit.html',
        fields=fields,
        field_values=field_values,
        supported_fields=image_engine.get_supported_operations(),
        embed=embed,
        template=db_template,
        err_msg=err_msg)
Example #2
0
 def put(self, template_id):
     permissions_engine.ensure_permitted(
         SystemPermissions.PERMIT_SUPER_USER, get_session_user())
     params = self._get_validated_object_parameters(request.form)
     template = data_engine.get_image_template(template_id)
     if template is None:
         raise DoesNotExistError(str(template_id))
     template.name = params['name']
     template.description = params['description']
     template.template = params['template']
     data_engine.save_object(template)
     image_engine.reset_templates()
     return self.get(template.id)
Example #3
0
 def delete(self, template_id):
     permissions_engine.ensure_permitted(
         SystemPermissions.PERMIT_SUPER_USER, get_session_user())
     template_info = data_engine.get_image_template(template_id)
     if template_info is None:
         raise DoesNotExistError(str(template_id))
     db_default_template = data_engine.get_object(Property,
                                                  Property.DEFAULT_TEMPLATE)
     if template_info.name.lower() == db_default_template.value.lower():
         raise ParameterError(
             'The system default template cannot be deleted')
     data_engine.delete_object(template_info)
     image_engine.reset_templates()
     return make_api_success_response()
Example #4
0
 def get(self, template_id=None):
     if template_id is None:
         # List templates
         tlist = data_engine.list_objects(ImageTemplate, ImageTemplate.name)
         tdictlist = object_to_dict_list(tlist)
         for tdict in tdictlist:
             self._del_keys(tdict['template'], TemplateAPI.HIDE_FIELDS)
         return make_api_success_response(tdictlist)
     else:
         # Get single template
         template_info = data_engine.get_image_template(template_id)
         if template_info is None:
             raise DoesNotExistError(str(template_id))
         tdict = object_to_dict(template_info)
         self._del_keys(tdict['template'], TemplateAPI.HIDE_FIELDS)
         return make_api_success_response(tdict)
Example #5
0
def create_default_template():
    from imageserver.flask_app import app, data_engine
    from imageserver.models import ImageTemplate, Property

    log('Creating default image template')

    existing_obj = data_engine.get_image_template(tempname='Default')
    if existing_obj is None:
        data_engine.save_object(ImageTemplate(
            'Default',
            'Defines the system defaults for image generation if the '
            'image does not specify a template or specific parameter value', {
                'format': {'value': app.config.get('IMAGE_FORMAT_DEFAULT', '')},
                'quality': {'value': app.config.get('IMAGE_QUALITY_DEFAULT', 80)},
                'strip': {'value': app.config.get('IMAGE_STRIP_DEFAULT', True)},
                'colorspace': {'value': app.config.get('IMAGE_COLORSPACE_DEFAULT', 'RGB')},
                'dpi_x': {'value': app.config.get('IMAGE_DPI_DEFAULT', None)},
                'dpi_y': {'value': app.config.get('IMAGE_DPI_DEFAULT', None)},
                'record_stats': {'value': True},
                'expiry_secs': {'value': app.config.get('IMAGE_EXPIRY_TIME_DEFAULT',
                                                        60 * 60 * 24 * 7)}
            }
        ))
        log(
            'Info: Default image generation settings have been moved into a '
            'new template called \'Default\'.'
        )
    else:
        log('Skipped creation of a \'Default\' template as it already exists.')

    data_engine.save_object(Property(Property.DEFAULT_TEMPLATE, 'default'))
    log(
        'If you have any of the following settings in your local_settings.py '
        'file, they can now be deleted:\n\n'
        'IMAGE_FORMAT_DEFAULT\nIMAGE_QUALITY_DEFAULT\nIMAGE_STRIP_DEFAULT\n'
        'IMAGE_COLORSPACE_DEFAULT\nIMAGE_DPI_DEFAULT\nIMAGE_EXPIRY_TIME_DEFAULT\n'
    )
Example #6
0
def import_templates():
    from imageserver.flask_app import app, data_engine
    from imageserver.image_attrs import ImageAttrs
    from imageserver.models import ImageTemplate
    from imageserver.template_attrs import TemplateAttrs
    from imageserver.util import filepath_filename, parse_colour

    # Find *.cfg
    num_files = 0
    num_errors = 0
    num_skipped = 0
    template_dir_path = app.config.get(
        'TEMPLATES_BASE_DIR',
        os.path.join(app.config['INSTALL_DIR'], 'templates')
    )
    cfg_files = glob.glob(os.path.join(template_dir_path, '*.cfg'))
    log('Starting image templates import')

    merge_def_settings = False
    if cfg_files:
        merge_conf = input(
            '\nQIS v2 removes the system settings for default image format, '
            'quality, DPI, strip, colorspace, and expiry time. These values '
            'now need to be defined in your image templates instead. '
            'Do you want to merge these settings into your templates now? '
            'Y/N (Y recommended)\n'
        )
        merge_def_settings = (merge_conf in ['y', 'Y'])

    for cfg_file_path in cfg_files:
        num_files += 1
        (template_name, _) = os.path.splitext(filepath_filename(cfg_file_path))
        try:
            # Read config file
            cp = configparser.RawConfigParser()
            cp.read(cfg_file_path)

            # Get image values and put them in an ImageAttrs object
            section = 'ImageAttributes'
            t_image_attrs = ImageAttrs(
                template_name,
                -1,
                _config_get(cp, cp.getint, section, 'page'),
                _config_get(cp, cp.get, section, 'format', True),
                None,
                _config_get(cp, cp.getint, section, 'width'),
                _config_get(cp, cp.getint, section, 'height'),
                _config_get(cp, cp.get, section, 'halign', True),
                _config_get(cp, cp.get, section, 'valign', True),
                _config_get(cp, cp.getfloat, section, 'angle'),
                _config_get(cp, cp.get, section, 'flip'),
                _config_get(cp, cp.getfloat, section, 'top'),
                _config_get(cp, cp.getfloat, section, 'left'),
                _config_get(cp, cp.getfloat, section, 'bottom'),
                _config_get(cp, cp.getfloat, section, 'right'),
                _config_get(cp, cp.getboolean, section, 'autocropfit'),
                _config_get(cp, cp.getboolean, section, 'autosizefit'),
                parse_colour(_config_get(cp, cp.get, section, 'fill')),
                _config_get(cp, cp.getint, section, 'quality'),
                _config_get(cp, cp.getint, section, 'sharpen'),
                _config_get(cp, cp.get, section, 'overlay', False),
                _config_get(cp, cp.getfloat, section, 'ovsize'),
                _config_get(cp, cp.get, section, 'ovpos', True),
                _config_get(cp, cp.getfloat, section, 'ovopacity'),
                _config_get(cp, cp.get, section, 'icc', True),
                _config_get(cp, cp.get, section, 'intent', True),
                _config_get(cp, cp.getboolean, section, 'bpc'),
                _config_get(cp, cp.get, section, 'colorspace', True),
                _config_get(cp, cp.getboolean, section, 'strip'),
                _config_get(cp, cp.getint, section, 'dpi'),
                None
            )
            t_image_attrs.normalise_values()

            # Get misc options
            section = 'Miscellaneous'
            t_stats = _config_get(cp, cp.getboolean, section, 'stats')

            # Get handling options and create the TemplateAttrs object
            section = 'BrowserOptions'
            t_expiry = _config_get(cp, cp.getint, section, 'expiry')
            t_attach = _config_get(cp, cp.getboolean, section, 'attach')

            # Get the template as a dict
            template_dict = {
                'expiry_secs': {'value': t_expiry},
                'attachment': {'value': t_attach},
                'record_stats': {'value': t_stats}
            }
            ia_dict = t_image_attrs.to_dict()
            template_dict.update(dict(
                (k, {'value': v}) for k, v in ia_dict.items()
                if k not in ['filename', 'template']
            ))
            # Apply the obsolete default image settings to it
            if merge_def_settings:
                if not template_dict['format']['value']:
                    template_dict['format']['value'] = app.config.get('IMAGE_FORMAT_DEFAULT')
                if not template_dict['quality']['value']:
                    template_dict['quality']['value'] = app.config.get('IMAGE_QUALITY_DEFAULT')
                if template_dict['strip']['value'] is None:
                    template_dict['strip']['value'] = app.config.get('IMAGE_STRIP_DEFAULT')
                if not template_dict['colorspace']['value']:
                    template_dict['colorspace']['value'] = app.config.get('IMAGE_COLORSPACE_DEFAULT')
                if not template_dict['dpi_x']['value']:
                    template_dict['dpi_x']['value'] = app.config.get('IMAGE_DPI_DEFAULT')
                if not template_dict['dpi_y']['value']:
                    template_dict['dpi_y']['value'] = app.config.get('IMAGE_DPI_DEFAULT')
                if template_dict['expiry_secs']['value'] is None:
                    template_dict['expiry_secs']['value'] = app.config.get('IMAGE_EXPIRY_TIME_DEFAULT', 60 * 60 * 24 * 7)
            # Record stats needs to default to True in v2.2+
            if template_dict['record_stats']['value'] is None:
                template_dict['record_stats']['value'] = True
            # Create the TemplateAttrs object
            template_attrs = TemplateAttrs(template_name, template_dict)

            # Validate
            template_attrs.validate()

            # Import template if it doesn't exist already
            existing_obj = data_engine.get_image_template(tempname=template_name)
            if existing_obj is None:
                log('Importing template \'%s\'' % template_name)
                data_engine.save_object(ImageTemplate(
                    template_name,
                    'Imported template',
                    template_attrs.get_raw_dict()
                ))
            else:
                log('Skipped template \'%s\' as it already exists' % template_name)
                num_skipped += 1

        except Exception as e:
            log('Failed to import template \'%s\' due to: %s' % (template_name, str(e)))
            num_errors += 1

    log('Template import complete, %d file(s) found, '
        '%d errors, %d skipped.' % (num_files, num_errors, num_skipped))

    if not merge_def_settings:
        log('Warning: You chose not to merge your v1 default image settings '
            'into your v2 templates. Since the default image settings are '
            'now ignored, some images may be rendered differently.')

    deleted = False
    if num_errors == 0 and os.path.exists(template_dir_path):
        conf = input('\nThe old template files are no longer required. ' +
                         'Do you want to remove them now? Y/N\n')
        if conf in ['y', 'Y']:
            log('Removing directory ' + template_dir_path)
            try:
                shutil.rmtree(template_dir_path)
                log('Old templates removed OK')
                deleted = True
            except Exception as e:
                log('Warning: failed to delete directory: ' + str(e))

    if num_files > 0 and not deleted:
        log('Info: Old template files remain in ' + template_dir_path)