forked from opf/openproject
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbase_type_service.rb
More file actions
138 lines (113 loc) · 3.79 KB
/
Copy pathbase_type_service.rb
File metadata and controls
138 lines (113 loc) · 3.79 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
#-- encoding: UTF-8
#-- copyright
# OpenProject is a project management system.
# Copyright (C) 2012-2018 the OpenProject Foundation (OPF)
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License version 3.
#
# OpenProject is a fork of ChilittProject, which is a fork of Redmine. The copyright follows:
# Copyright (C) 2006-2017 Jean-Philippe Lang
# Copyright (C) 2010-2013 the ChiliProject Team
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
# See docs/COPYRIGHT.rdoc for more details.
#++
class BaseTypeService
include Shared::BlockService
include Concerns::Contracted
attr_accessor :contract_class
attr_accessor :type, :user
def initialize(type, user)
self.type = type
self.user = user
self.contract_class = ::Types::BaseContract
end
def call(params, options, &block)
result = update(params, options)
block_with_result(result, &block)
end
private
def update(params, options)
success = false
errors = type.errors
Type.transaction do
set_scalar_params(params)
# Only set attribute groups when it exists
# (Regression #28400)
unless params[:attribute_groups].nil?
set_attribute_groups(params)
end
set_active_custom_fields
success, errors = validate_and_save(type, user)
if success
after_type_save(params, options)
else
raise(ActiveRecord::Rollback)
end
end
ServiceResult.new(success: success,
errors: errors,
result: type)
rescue => e
ServiceResult.new(success: false).tap do |result|
result.errors.add(:base, e.message)
end
end
def set_scalar_params(params)
type.attributes = params.except(:attribute_groups)
end
def set_attribute_groups(params)
if params[:attribute_groups].empty?
type.reset_attribute_groups
else
type.attribute_groups = parse_attribute_groups_params(params)
end
end
def parse_attribute_groups_params(params)
return if params[:attribute_groups].nil?
transform_params_to_query(params[:attribute_groups])
end
def after_type_save(_params, _options)
# noop to be overwritten by subclasses
end
def transform_params_to_query(groups)
groups.each_with_index do |(name, attributes), index|
next unless attributes.is_a? Hash
query = Query.new_default(name: "Embedded table: #{name}")
::API::V3::UpdateQueryFromV3ParamsService
.new(query, user)
.call(attributes.with_indifferent_access)
query.show_hierarchies = false
groups[index][1] = [query]
end
end
##
# Syncs attribute group settings for custom fields with enabled custom fields
# for this type. If a custom field is not in a group, it is removed from the
# custom_field_ids list.
def set_active_custom_fields
active_cf_ids = []
type.attribute_groups.each do |group|
group.members.each do |attribute|
if CustomField.custom_field_attribute? attribute
active_cf_ids << attribute.gsub(/^custom_field_/, '').to_i
end
end
end
type.custom_field_ids = active_cf_ids.uniq
end
end