123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249 |
- # Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
- class GroupHierarchy < ActiveRecord::Migration[6.1]
- def change
- # return if it's a new setup
- return if !Setting.exists?(name: 'system_init_done')
- rename_custom_object_attributes
- migrate_groups_table
- migrate_group_name
- update_name_last_column
- migrate_object_attributes
- change_group_field
- add_core_workflow_parent_id
- add_core_workflow_group_ids
- migrate_settings
- end
- def rename_custom_object_attributes
- MigrationHelper.rename_custom_object_attribute('Group', 'name_last')
- MigrationHelper.rename_custom_object_attribute('Group', 'parent_id')
- end
- def migrate_groups_table
- change_column :groups, :name, :string, limit: (160 * 6) + (2 * 5) # max depth of 6 and 5 delimiters inbetween
- add_column :groups, :name_last, :string, limit: 160, null: true # optional for now
- add_column :groups, :parent_id, :integer, null: true
- add_foreign_key :groups, :groups, column: :parent_id
- Group.reset_column_information
- end
- def migrate_group_name
- Group.all.each do |group|
- if group.name.exclude?('::')
- group.update!(name_last: group.name, updated_by_id: 1)
- next
- end
- try = 1
- new_name = group.name
- loop do
- new_name = group.name.gsub(%r{::}, '-' * try)
- break if !Group.exists?(name: new_name)
- try += 1
- end
- group.update!(name: new_name, name_last: new_name, updated_by_id: 1)
- end
- end
- def update_name_last_column
- change_column :groups, :name_last, :string, limit: 160, null: false
- Group.reset_column_information
- end
- def migrate_object_attributes
- name_attribute = ObjectManager::Attribute.for_object('Group').find_by(name: 'name')
- name_attribute.data_option = { type: 'text', maxlength: 255, readonly: 1 }
- name_attribute.screens = {}
- name_attribute.save!
- ObjectManager::Attribute.add(
- force: true,
- object: 'Group',
- name: 'name_last',
- display: 'Name',
- data_type: 'input',
- data_option: {
- type: 'text',
- maxlength: 150,
- null: false,
- },
- editable: false,
- active: true,
- screens: {
- create: {
- '-all-' => {
- null: false,
- },
- },
- edit: {
- '-all-' => {
- null: false,
- },
- },
- view: {
- '-all-' => {
- shown: true,
- },
- },
- },
- to_create: false,
- to_migrate: false,
- to_delete: false,
- position: 210,
- created_by_id: 1,
- updated_by_id: 1,
- )
- ObjectManager::Attribute.add(
- force: true,
- object: 'Group',
- name: 'parent_id',
- display: 'Parent group',
- data_type: 'tree_select',
- data_option: {
- default: '',
- null: true,
- relation: 'Group',
- nulloption: true,
- do_not_log: true,
- },
- editable: false,
- active: true,
- screens: {
- create: {
- '-all-' => {
- null: true,
- },
- },
- edit: {
- '-all-' => {
- null: true,
- },
- },
- },
- to_create: false,
- to_migrate: false,
- to_delete: false,
- position: 250,
- created_by_id: 1,
- updated_by_id: 1,
- )
- ObjectManager::Attribute.add(
- force: true,
- object: 'User',
- name: 'group_ids',
- display: 'Group permissions',
- data_type: 'group_permissions',
- data_option: {
- null: false,
- item_class: 'checkbox',
- permission: ['admin.user'],
- },
- editable: false,
- active: true,
- screens: {
- signup: {},
- invite_agent: {
- '-all-' => {
- null: false,
- },
- },
- invite_customer: {},
- edit: {
- '-all-' => {
- null: true,
- },
- },
- create: {
- '-all-' => {
- null: true,
- },
- },
- view: {
- '-all-' => {
- shown: false,
- },
- },
- },
- to_create: false,
- to_migrate: false,
- to_delete: false,
- position: 1700,
- created_by_id: 1,
- updated_by_id: 1,
- )
- ObjectManager::Attribute
- .get(
- object: 'User',
- name: 'role_ids',
- )
- .update!(display: 'Roles')
- end
- def change_group_field
- ObjectManager::Attribute.for_object('Ticket').find_by(name: 'group_id').update(data_type: 'tree_select')
- end
- def add_core_workflow_parent_id
- CoreWorkflow.create_if_not_exists(
- name: 'base - remove current and child groups from parent id',
- object: 'Group',
- condition_saved: {
- 'custom.module': {
- operator: 'match all modules',
- value: [
- 'CoreWorkflow::Custom::AdminGroupParentId',
- ],
- },
- },
- perform: {
- 'custom.module': {
- execute: ['CoreWorkflow::Custom::AdminGroupParentId']
- },
- },
- changeable: false,
- created_by_id: 1,
- updated_by_id: 1,
- )
- end
- def add_core_workflow_group_ids
- CoreWorkflow.create_if_not_exists(
- name: 'base - show group list for agents',
- condition_saved: {
- 'custom.module': {
- operator: 'match all modules',
- value: [
- 'CoreWorkflow::Custom::AdminShowGroupListForAgents',
- ],
- },
- },
- perform: {
- 'custom.module': {
- execute: ['CoreWorkflow::Custom::AdminShowGroupListForAgents']
- },
- },
- changeable: false,
- created_by_id: 1,
- updated_by_id: 1,
- )
- end
- def migrate_settings
- setting = Setting.find_by(name: 'customer_ticket_create_group_ids')
- return if setting.blank?
- setting.options['form'][0]['tag'] = 'tree_select'
- setting.save!
- end
- end
|