# Base class for example case data migrations. # # Contains common methods for creating asset types, assets, # task types and form types. # # Data is defined/setup with the class variables. require 'db/migration_temp_models' class ExampleCaseDataCreation < ActiveRecord::Migration # # Data definition class variables: # @@root_asset_id = 1 # ID of the asset under which assets are created @@root_asset_attributes = nil @@binary_data_dir = 'example_case_data/' # the directory where icon and template files can be found @@asset_type_icon_filenames = [] @@asset_types = [] @@assets = [] @@task_types = [] @@form_types = [] def self.up # Existing data root_asset = TempAsset.find @@root_asset_id user_groups = TempUserGroup.find :all # Edit the root asset root_asset.update_attributes(@@root_asset_attributes) if @@root_asset_attributes # Create asset types asset_type_ids = create_asset_types(@@asset_types, @@asset_type_icon_filenames) # Create the asset tree assets = create_asset_tree(@@assets, asset_type_ids) # Give assets the same permissions as the root asset has user_groups_and_their_permissions = asset_permissions_for_user_groups(root_asset, user_groups) create_asset_permissions(assets, user_groups_and_their_permissions) # Create task types create_task_types(@@task_types) # Create form types create_form_types(@@form_types) end # Creates asset types and returns their names and ids in a hash: {'name' => id, ...} def self.create_asset_types(type_attributes, icon_filenames) # TempAssetTypeIcon.delete_all asset_type_icon_ids = create_asset_type_icons(icon_filenames) type_ids = {} for attributes in type_attributes icon_id = asset_type_icon_ids[attributes.delete(:icon_name)] attributes[:asset_type_icon_id] = icon_id fields = attributes.delete(:fields) type = TempAssetType.create!(attributes) type_ids[type.name] = type.id next unless fields #and not fields.empty? for field in fields TempAssetField.create!(field.merge(:asset_type_id => type.id)) end end return type_ids end # Creates asset type icons and returns their filenames and ids in a hash: {'filename' => id, ...} def self.create_asset_type_icons(icon_filenames) icons = [] icon_ids = {} for filename in icon_filenames icon = TempAssetTypeIcon.new icon.data = File.open(File.join(@@binary_data_dir, 'icons', "#{filename}.gif")).read icon.content_type = 'image/gif' icon.save! icon_ids[filename] = icon.id icons.push icon end # Remove duplicate icons if they are not used for existing_icon in TempAssetTypeIcon.find(:all, :conditions => ['id NOT IN (?)', icon_ids.values]) next if TempAssetType.count(:conditions => ['asset_type_icon_id = ?', existing_icon.id]) > 0 for icon in icons existing_icon.destroy and break if existing_icon.data == icon.data end end return icon_ids end # Creates asset tree from given attributes and returns a list of assets def self.create_asset_tree(asset_attributes, asset_type_ids) asset_attributes.map { |attributes| parent_code = attributes.delete(:parent_code) if parent_code parent = TempAsset.find_by_code(parent_code) attributes[:parent_id] = parent.id if parent end raise "Parent asset not found for asset: #{attributes[:code]} (#{attributes[:name]})" unless attributes[:parent_id].is_a?(Integer) type_name = attributes.delete(:type_name) attributes[:asset_type_id] = asset_type_ids[type_name] if type_name field_values = attributes.delete(:field_values) asset = TempAsset.create!(attributes) if asset.asset_type_id for field in TempAssetField.find_all_by_asset_type_id(asset.asset_type_id) value = field_values[field.name] TempAssetFieldValue.create_for_field!(field, :asset_id => asset.id, :value => value) end end asset } end # Finds existing asset permissions for user_groups in an asset def self.asset_permissions_for_user_groups(asset, user_groups) user_groups.map { |user_group| aug = TempAssetsUserGroup.find_by_asset_id_and_user_group_id(asset.id, user_group.id) aug_attributes = aug.attributes ['id', 'asset_id'].each {|a| aug_attributes.delete(a) } permission_profiles = TempDataPermissionProfile.find_all_by_assets_user_group_id(aug.id).map { |profile| attr = profile.attributes ['id', 'assets_user_group_id'].each {|a| attr.delete(a) } attr } [user_group, aug_attributes, permission_profiles] } end # Give assets the given permissions (constructed with asset_permissions_for_user_groups) def self.create_asset_permissions(assets, groups_and_their_permissions) for group, permissions, profiles in groups_and_their_permissions for asset in assets aug = TempAssetsUserGroup.create!(permissions.merge(:asset_id => asset.id)) for profile in profiles p = TempDataPermissionProfile.new(profile.merge(:assets_user_group_id => aug.id)) p.type = profile['type'] p.save! end end end end # Creates task types and their templates def self.create_task_types(task_types) for attributes in task_types filename = attributes.delete(:template_file) type = TempTaskType.create!(attributes) TempTaskTemplate.create_for_task_type(type, File.join(@@binary_data_dir, 'task_templates', filename)) end end # Creates form types and their templates def self.create_form_types(form_types) ids_of_created_types = [] for attributes in form_types filename = attributes.delete(:template_file) field_groups = attributes.delete(:field_groups) fields = attributes.delete(:fields) type = TempFormType.create!(attributes.merge(:ready => true)) # create form template TempFormTemplate.create_for_form_type(type, File.join(@@binary_data_dir, 'form_templates', filename)) # create form field groups group_ids = {} field_groups.each_pair { |place, name| group_ids[place] = TempFormFieldGroup.create!(:form_type_id => type.id, :name => name, :place => place).id } # create form fields for field in fields field[:name] = field[:user_field_name] unless field.has_key?(:name) field[:form_field_group_id] = group_ids[field.delete(:group)] if field.has_key?(:group) TempFormField.create!(field.merge(:form_type_id => type.id)) end ids_of_created_types.push type.id end # create html templates for created types unless ids_of_created_types.empty? for form_type in FormType.find(:all, :conditions => ['id IN (?)', ids_of_created_types]) form_type.create_html_template_and_images end end end def self.down # This direction is not supported raise ActiveRecord::IrreversibleMigration end end # Base class for example case data migrations. # # Contains common methods for creating asset types, assets, # task types and form types. # # Data is defined/setup with the class variables. require 'db/migration_temp_models' class ExampleCaseDataCreation < ActiveRecord::Migration # # Data definition class variables: # @@root_asset_id = 1 # ID of the asset under which assets are created @@root_asset_attributes = nil @@binary_data_dir = 'example_case_data/' # the directory where icon and template files can be found @@asset_type_icon_filenames = [] @@asset_types = [] @@assets = [] @@task_types = [] @@form_types = [] def self.up # Existing data root_asset = TempAsset.find @@root_asset_id user_groups = TempUserGroup.find :all # Edit the root asset root_asset.update_attributes(@@root_asset_attributes) if @@root_asset_attributes # Create asset types asset_type_ids = create_asset_types(@@asset_types, @@asset_type_icon_filenames) # Create the asset tree assets = create_asset_tree(@@assets, asset_type_ids) # Give assets the same permissions as the root asset has user_groups_and_their_permissions = asset_permissions_for_user_groups(root_asset, user_groups) create_asset_permissions(assets, user_groups_and_their_permissions) # Create task types create_task_types(@@task_types) # Create form types create_form_types(@@form_types) end # Creates asset types and returns their names and ids in a hash: {'name' => id, ...} def self.create_asset_types(type_attributes, icon_filenames) # TempAssetTypeIcon.delete_all asset_type_icon_ids = create_asset_type_icons(icon_filenames) type_ids = {} for attributes in type_attributes icon_id = asset_type_icon_ids[attributes.delete(:icon_name)] attributes[:asset_type_icon_id] = icon_id fields = attributes.delete(:fields) type = TempAssetType.create!(attributes) type_ids[type.name] = type.id next unless fields #and not fields.empty? for field in fields TempAssetField.create!(field.merge(:asset_type_id => type.id)) end end return type_ids end # Creates asset type icons and returns their filenames and ids in a hash: {'filename' => id, ...} def self.create_asset_type_icons(icon_filenames) icons = [] icon_ids = {} for filename in icon_filenames icon = TempAssetTypeIcon.new icon.data = File.open(File.join(@@binary_data_dir, 'icons', "#{filename}.gif")).read icon.content_type = 'image/gif' icon.save! icon_ids[filename] = icon.id icons.push icon end # Remove duplicate icons if they are not used for existing_icon in TempAssetTypeIcon.find(:all, :conditions => ['id NOT IN (?)', icon_ids.values]) next if TempAssetType.count(:conditions => ['asset_type_icon_id = ?', existing_icon.id]) > 0 for icon in icons existing_icon.destroy and break if existing_icon.data == icon.data end end return icon_ids end # Creates asset tree from given attributes and returns a list of assets def self.create_asset_tree(asset_attributes, asset_type_ids) asset_attributes.map { |attributes| parent_code = attributes.delete(:parent_code) if parent_code parent = TempAsset.find_by_code(parent_code) attributes[:parent_id] = parent.id if parent end raise "Parent asset not found for asset: #{attributes[:code]} (#{attributes[:name]})" unless attributes[:parent_id].is_a?(Integer) type_name = attributes.delete(:type_name) attributes[:asset_type_id] = asset_type_ids[type_name] if type_name field_values = attributes.delete(:field_values) asset = TempAsset.create!(attributes) if asset.asset_type_id for field in TempAssetField.find_all_by_asset_type_id(asset.asset_type_id) value = field_values[field.name] TempAssetFieldValue.create_for_field!(field, :asset_id => asset.id, :value => value) end end asset } end # Finds existing asset permissions for user_groups in an asset def self.asset_permissions_for_user_groups(asset, user_groups) user_groups.map { |user_group| aug = TempAssetsUserGroup.find_by_asset_id_and_user_group_id(asset.id, user_group.id) aug_attributes = aug.attributes ['id', 'asset_id'].each {|a| aug_attributes.delete(a) } permission_profiles = TempDataPermissionProfile.find_all_by_assets_user_group_id(aug.id).map { |profile| attr = profile.attributes ['id', 'assets_user_group_id'].each {|a| attr.delete(a) } attr } [user_group, aug_attributes, permission_profiles] } end # Give assets the given permissions (constructed with asset_permissions_for_user_groups) def self.create_asset_permissions(assets, groups_and_their_permissions) for group, permissions, profiles in groups_and_their_permissions for asset in assets aug = TempAssetsUserGroup.create!(permissions.merge(:asset_id => asset.id)) for profile in profiles p = TempDataPermissionProfile.new(profile.merge(:assets_user_group_id => aug.id)) p.type = profile['type'] p.save! end end end end # Creates task types and their templates def self.create_task_types(task_types) for attributes in task_types filename = attributes.delete(:template_file) type = TempTaskType.create!(attributes) TempTaskTemplate.create_for_task_type(type, File.join(@@binary_data_dir, 'task_templates', filename)) end end # Creates form types and their templates def self.create_form_types(form_types) ids_of_created_types = [] for attributes in form_types filename = attributes.delete(:template_file) field_groups = attributes.delete(:field_groups) fields = attributes.delete(:fields) type = TempFormType.create!(attributes.merge(:ready => true)) # create form template TempFormTemplate.create_for_form_type(type, File.join(@@binary_data_dir, 'form_templates', filename)) # create form field groups group_ids = {} field_groups.each_pair { |place, name| group_ids[place] = TempFormFieldGroup.create!(:form_type_id => type.id, :name => name, :place => place).id } # create form fields for field in fields field[:name] = field[:user_field_name] unless field.has_key?(:name) field[:form_field_group_id] = group_ids[field.delete(:group)] if field.has_key?(:group) TempFormField.create!(field.merge(:form_type_id => type.id)) end ids_of_created_types.push type.id end # create html templates for created types unless ids_of_created_types.empty? for form_type in FormType.find(:all, :conditions => ['id IN (?)', ids_of_created_types]) form_type.create_html_template_and_images end end end def self.down # This direction is not supported raise ActiveRecord::IrreversibleMigration end end