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)
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)
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()
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)
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' )
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)