diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 97595bfd6..9c0d31434 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -378,6 +378,21 @@ class ApplicationController < ActionController::Base def model_index_render (object, _params) generic_objects = object.all + + if params[:full] + assets = {} + item_ids = [] + generic_objects.each {|item| + item_ids.push item.id + assets = item.assets(assets) + } + render json: { + record_ids: item_ids, + assets: assets, + }, status: :ok + return + end + generic_objects_with_associations = [] generic_objects.each {|item| generic_objects_with_associations.push item.attributes_with_associations diff --git a/app/controllers/calendars_controller.rb b/app/controllers/calendars_controller.rb index 7ecc83614..5a429d0bd 100644 --- a/app/controllers/calendars_controller.rb +++ b/app/controllers/calendars_controller.rb @@ -6,9 +6,8 @@ class CalendarsController < ApplicationController def index return if deny_if_not_role(Z_ROLENAME_ADMIN) - assets = {} - # calendars + assets = {} calendar_ids = [] Calendar.all.order(:name, :created_at).each {|calendar| calendar_ids.push calendar.id diff --git a/app/models/application_model.rb b/app/models/application_model.rb index 28e0c17a8..63dcb5b30 100644 --- a/app/models/application_model.rb +++ b/app/models/application_model.rb @@ -1131,6 +1131,48 @@ get assets of object list assets end +=begin + +get assets and record_ids of selector + + model = Model.find(123) + + assets = model.assets_of_selector('attribute_name_of_selector', assets) + +=end + + def assets_of_selector(selector, assets = {}) + + # get assets of condition + models = Models.all + send(selector).each {|item, content| + attribute = item.split(/\./) + next if !attribute[1] + attribute_class = attribute[0].to_classname.constantize + reflection = attribute[1].sub(/_id$/, '') + #reflection = reflection.to_sym + next if !models[attribute_class] + next if !models[attribute_class][:reflections] + next if !models[attribute_class][:reflections][reflection] + next if !models[attribute_class][:reflections][reflection].klass + attribute_ref_class = models[attribute_class][:reflections][reflection].klass + if content['value'].class == Array + content['value'].each {|item_id| + attribute_object = attribute_ref_class.find_by(id: item_id) + if attribute_object + assets = attribute_object.assets(assets) + end + } + else + attribute_object = attribute_ref_class.find_by(id: content['value']) + if attribute_object + assets = attribute_object.assets(assets) + end + end + } + assets + end + private def attachments_buffer diff --git a/app/models/calendar.rb b/app/models/calendar.rb index a91fa8bf5..d22f6bcbc 100644 --- a/app/models/calendar.rb +++ b/app/models/calendar.rb @@ -10,6 +10,8 @@ class Calendar < ApplicationModel after_update :sync_default, :min_one_check after_destroy :min_one_check + notify_clients_support + =begin set inital default calendar diff --git a/app/models/job.rb b/app/models/job.rb index 7d4a66bf7..70bb39b7b 100644 --- a/app/models/job.rb +++ b/app/models/job.rb @@ -1,6 +1,9 @@ # Copyright (C) 2012-2014 Zammad Foundation, http://zammad-foundation.org/ class Job < ApplicationModel + load 'job/assets.rb' + include Job::Assets + store :timeplan store :condition store :perform diff --git a/app/models/job/assets.rb b/app/models/job/assets.rb new file mode 100644 index 000000000..620fb3914 --- /dev/null +++ b/app/models/job/assets.rb @@ -0,0 +1,47 @@ +# Copyright (C) 2012-2014 Zammad Foundation, http://zammad-foundation.org/ + +class Job + module Assets + +=begin + +get all assets / related models for this job + + job = Job.find(123) + result = job.assets(assets_if_exists) + +returns + + result = { + :jobs => { + 123 => job_model_123, + 1234 => job_model_1234, + } + } + +=end + + def assets (data) + + if !data[ Job.to_app_model ] + data[ Job.to_app_model ] = {} + end + if !data[ User.to_app_model ] + data[ User.to_app_model ] = {} + end + if !data[ Job.to_app_model ][ id ] + data[ Job.to_app_model ][ id ] = attributes_with_associations + data = assets_of_selector('condition', data) + data = assets_of_selector('perform', data) + end + %w(created_by_id updated_by_id).each {|local_user_id| + next if !self[ local_user_id ] + next if data[ User.to_app_model ][ self[ local_user_id ] ] + user = User.lookup(id: self[ local_user_id ]) + next if !user + data = user.assets(data) + } + data + end + end +end diff --git a/app/models/overview.rb b/app/models/overview.rb index a56b585c9..abfedfd66 100644 --- a/app/models/overview.rb +++ b/app/models/overview.rb @@ -1,7 +1,10 @@ # Copyright (C) 2012-2014 Zammad Foundation, http://zammad-foundation.org/ class Overview < ApplicationModel - has_and_belongs_to_many :users, after_add: :cache_update, after_remove: :cache_update + load 'overview/assets.rb' + include Overview::Assets + + has_and_belongs_to_many :users, after_add: :cache_update, after_remove: :cache_update store :condition store :order store :view diff --git a/app/models/overview/assets.rb b/app/models/overview/assets.rb new file mode 100644 index 000000000..48d9da93e --- /dev/null +++ b/app/models/overview/assets.rb @@ -0,0 +1,56 @@ +# Copyright (C) 2012-2014 Zammad Foundation, http://zammad-foundation.org/ + +class Overview + module Assets + +=begin + +get all assets / related models for this overview + + overview = Overview.find(123) + result = overview.assets(assets_if_exists) + +returns + + result = { + :overviews => { + 123 => overview_model_123, + 1234 => overview_model_1234, + } + } + +=end + + def assets (data) + + if !data[ Overview.to_app_model ] + data[ Overview.to_app_model ] = {} + end + if !data[ User.to_app_model ] + data[ User.to_app_model ] = {} + end + if !data[ Overview.to_app_model ][ id ] + data[ Overview.to_app_model ][ id ] = attributes_with_associations + if user_ids + user_ids.each {|local_user_id| + next if data[ User.to_app_model ][ local_user_id ] + user = User.lookup(id: local_user_id) + next if !user + data = user.assets(data) + } + end + + data = assets_of_selector('condition', data) + + end + %w(created_by_id updated_by_id).each {|local_user_id| + next if !self[ local_user_id ] + next if data[ User.to_app_model ][ self[ local_user_id ] ] + user = User.lookup(id: self[ local_user_id ]) + next if !user + data = user.assets(data) + } + data + end + end +end diff --git a/app/models/sla.rb b/app/models/sla.rb index 950fe21e7..af0d2cb66 100644 --- a/app/models/sla.rb +++ b/app/models/sla.rb @@ -1,8 +1,14 @@ # Copyright (C) 2012-2014 Zammad Foundation, http://zammad-foundation.org/ class Sla < ApplicationModel + load 'sla/assets.rb' + include Sla::Assets + store :condition store :data validates :name, presence: true belongs_to :calendar + + notify_clients_support + end diff --git a/app/models/sla/assets.rb b/app/models/sla/assets.rb new file mode 100644 index 000000000..18756e399 --- /dev/null +++ b/app/models/sla/assets.rb @@ -0,0 +1,52 @@ +# Copyright (C) 2012-2014 Zammad Foundation, http://zammad-foundation.org/ + +class Sla + module Assets + +=begin + +get all assets / related models for this sla + + sla = Sla.find(123) + result = sla.assets(assets_if_exists) + +returns + + result = { + :slas => { + 123 => sla_model_123, + 1234 => sla_model_1234, + } + } + +=end + + def assets (data) + + if !data[ Sla.to_app_model ] + data[ Sla.to_app_model ] = {} + end + if !data[ User.to_app_model ] + data[ User.to_app_model ] = {} + end + if !data[ Sla.to_app_model ][ id ] + data[ Sla.to_app_model ][ id ] = attributes_with_associations + data = assets_of_selector('condition', data) + if calendar_id + calendar = Calendar.lookup(id: calendar_id) + if calendar + data = calendar.assets(data) + end + end + end + %w(created_by_id updated_by_id).each {|local_user_id| + next if !self[ local_user_id ] + next if data[ User.to_app_model ][ self[ local_user_id ] ] + user = User.lookup(id: self[ local_user_id ]) + next if !user + data = user.assets(data) + } + data + end + end +end diff --git a/db/migrate/20120101000010_create_ticket.rb b/db/migrate/20120101000010_create_ticket.rb index b2359d099..100e4f049 100644 --- a/db/migrate/20120101000010_create_ticket.rb +++ b/db/migrate/20120101000010_create_ticket.rb @@ -357,8 +357,8 @@ class CreateTicket < ActiveRecord::Migration t.column :update_time, :integer, null: true t.column :close_time, :integer, null: true t.column :condition, :string, limit: 5000, null: true - t.column :data, :string, limit: 5000, null: true - t.column :timezone, :string, limit: 50, null: true + t.column :data, :string, limit: 5000, null: true + t.column :timezone, :string, limit: 50, null: true t.column :active, :boolean, null: false, default: true t.column :updated_by_id, :integer, null: false t.column :created_by_id, :integer, null: false diff --git a/test/unit/assets_test.rb b/test/unit/assets_test.rb index 014057f81..134e9c416 100644 --- a/test/unit/assets_test.rb +++ b/test/unit/assets_test.rb @@ -4,7 +4,7 @@ require 'test_helper' class AssetsTest < ActiveSupport::TestCase test 'user' do - roles = Role.where( name: %w(Agent Admin) ) + roles = Role.where(name: %w(Agent Admin)) groups = Group.all org = Organization.create_or_update( name: 'some user org', @@ -278,4 +278,263 @@ class AssetsTest < ActiveSupport::TestCase #puts "ERROR: difference \n1: #{o1.inspect}\n2: #{o2.inspect}\ndiff: #{(o1.to_a - o2.to_a).inspect}" false end + + test 'overview' do + + UserInfo.current_user_id = 1 + roles = Role.where(name: %w(Customer)) + + user1 = User.create_or_update( + login: 'assets_overview1@example.org', + firstname: 'assets_overview1', + lastname: 'assets_overview1', + email: 'assets_overview1@example.org', + password: 'some_pass', + active: true, + roles: roles, + ) + user2 = User.create_or_update( + login: 'assets_overview2@example.org', + firstname: 'assets_overview2', + lastname: 'assets_overview2', + email: 'assets_overview2@example.org', + password: 'some_pass', + active: true, + roles: roles, + ) + user3 = User.create_or_update( + login: 'assets_overview3@example.org', + firstname: 'assets_overview3', + lastname: 'assets_overview3', + email: 'assets_overview3@example.org', + password: 'some_pass', + active: true, + roles: roles, + ) + user4 = User.create_or_update( + login: 'assets_overview4@example.org', + firstname: 'assets_overview4', + lastname: 'assets_overview4', + email: 'assets_overview4@example.org', + password: 'some_pass', + active: true, + roles: roles, + ) + user5 = User.create_or_update( + login: 'assets_overview5@example.org', + firstname: 'assets_overview5', + lastname: 'assets_overview5', + email: 'assets_overview5@example.org', + password: 'some_pass', + active: true, + roles: roles, + ) + + ticket_state1 = Ticket::State.find_by(name: 'new') + ticket_state2 = Ticket::State.find_by(name: 'open') + overview_role = Role.find_by(name: 'Agent') + overview = Overview.create_or_update( + name: 'my asset test', + link: 'my_asset_test', + prio: 1000, + role_id: overview_role.id, + user_ids: [ user4.id, user5.id ], + condition: { + 'ticket.state_id' => { + operator: 'is', + value: [ ticket_state1.id, ticket_state2.id ], + }, + 'ticket.owner_id' => { + operator: 'is', + pre_condition: 'specific', + value: user1.id, + value_completion: 'John Smith ' + }, + }, + order: { + by: 'created_at', + direction: 'ASC', + }, + view: { + d: %w(title customer group created_at), + s: %w(title customer group created_at), + m: %w(number title customer group created_at), + view_mode_default: 's', + }, + ) + assets = overview.assets({}) + assert(assets[:User][user1.id], 'check assets') + assert_not(assets[:User][user2.id], 'check assets') + assert_not(assets[:User][user3.id], 'check assets') + assert(assets[:User][user4.id], 'check assets') + assert(assets[:User][user5.id], 'check assets') + assert(assets[:TicketState][ticket_state1.id], 'check assets') + assert(assets[:TicketState][ticket_state2.id], 'check assets') + + overview = Overview.create_or_update( + name: 'my asset test', + link: 'my_asset_test', + prio: 1000, + role_id: overview_role.id, + user_ids: [ user4.id ], + condition: { + 'ticket.state_id' => { + operator: 'is', + value: ticket_state1.id, + }, + 'ticket.owner_id' => { + operator: 'is', + pre_condition: 'specific', + value: [user1.id, user2.id], + }, + }, + order: { + by: 'created_at', + direction: 'ASC', + }, + view: { + d: %w(title customer group created_at), + s: %w(title customer group created_at), + m: %w(number title customer group created_at), + view_mode_default: 's', + }, + ) + assets = overview.assets({}) + assert(assets[:User][user1.id], 'check assets') + assert(assets[:User][user2.id], 'check assets') + assert_not(assets[:User][user3.id], 'check assets') + assert(assets[:User][user4.id], 'check assets') + assert_not(assets[:User][user5.id], 'check assets') + assert(assets[:TicketState][ticket_state1.id], 'check assets') + assert_not(assets[:TicketState][ticket_state2.id], 'check assets') + + end + + test 'sla' do + + UserInfo.current_user_id = 1 + roles = Role.where(name: %w(Customer)) + + user1 = User.create_or_update( + login: 'assets_sla1@example.org', + firstname: 'assets_sla1', + lastname: 'assets_sla1', + email: 'assets_sla1@example.org', + password: 'some_pass', + active: true, + roles: roles, + ) + user2 = User.create_or_update( + login: 'assets_sla2@example.org', + firstname: 'assets_sla2', + lastname: 'assets_sla2', + email: 'assets_sla2@example.org', + password: 'some_pass', + active: true, + roles: roles, + ) + + calendar1 = Calendar.first + ticket_state1 = Ticket::State.find_by(name: 'new') + ticket_state2 = Ticket::State.find_by(name: 'open') + sla = Sla.create_or_update( + name: 'my asset test', + calendar_id: calendar1.id, + condition: { + 'ticket.state_id' => { + operator: 'is', + value: [ ticket_state1.id, ticket_state2.id ], + }, + 'ticket.owner_id' => { + operator: 'is', + pre_condition: 'specific', + value: user1.id, + value_completion: 'John Smith ' + }, + }, + ) + assets = sla.assets({}) + assert(assets[:User][user1.id], 'check assets') + assert_not(assets[:User][user2.id], 'check assets') + assert(assets[:TicketState][ticket_state1.id], 'check assets') + assert(assets[:TicketState][ticket_state2.id], 'check assets') + assert(assets[:Calendar][calendar1.id], 'check assets') + + end + + test 'job' do + + UserInfo.current_user_id = 1 + roles = Role.where(name: %w(Customer)) + + user1 = User.create_or_update( + login: 'assets_job1@example.org', + firstname: 'assets_job1', + lastname: 'assets_job1', + email: 'assets_job1@example.org', + password: 'some_pass', + active: true, + roles: roles, + ) + user2 = User.create_or_update( + login: 'assets_job2@example.org', + firstname: 'assets_job2', + lastname: 'assets_job2', + email: 'assets_job2@example.org', + password: 'some_pass', + active: true, + roles: roles, + ) + user3 = User.create_or_update( + login: 'assets_job3@example.org', + firstname: 'assets_job3', + lastname: 'assets_job3', + email: 'assets_job3@example.org', + password: 'some_pass', + active: true, + roles: roles, + ) + + ticket_state1 = Ticket::State.find_by(name: 'new') + ticket_state2 = Ticket::State.find_by(name: 'open') + ticket_priority2 = Ticket::Priority.find_by(name: '2 normal') + job = Job.create_or_update( + name: 'my job', + timeplan: { + mon: true, + }, + condition: { + 'ticket.state_id' => { + operator: 'is', + value: [ ticket_state1.id, ticket_state2.id ], + }, + 'ticket.owner_id' => { + operator: 'is', + pre_condition: 'specific', + value: user1.id, + value_completion: 'John Smith ' + }, + }, + perform: { + 'ticket.priority_id' => { + value: ticket_priority2.id, + }, + 'ticket.owner_id' => { + pre_condition: 'specific', + value: user2.id, + value_completion: 'metest123@znuny.com ' + }, + }, + disable_notification: true, + ) + assets = job.assets({}) + assert(assets[:User][user1.id], 'check assets') + assert(assets[:User][user2.id], 'check assets') + assert_not(assets[:User][user3.id], 'check assets') + assert(assets[:TicketState][ticket_state1.id], 'check assets') + assert(assets[:TicketState][ticket_state2.id], 'check assets') + assert(assets[:TicketPriority][ticket_priority2.id], 'check assets') + + end + end