redmine_remotes 0.15.5 → 0.16.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/app/controllers/project_remote_issues_controller/create.rb +1 -1
- data/app/controllers/project_remote_issues_controller/update.rb +1 -1
- data/app/controllers/remote_issue_statuses_controller.rb +14 -1
- data/app/models/remote_issue_status.rb +6 -0
- data/app/tableless_models/redmine_remotes/issue_fetch/base/local_issue.rb +82 -0
- data/app/tableless_models/redmine_remotes/issue_fetch/base/provider_issue.rb +22 -0
- data/app/tableless_models/redmine_remotes/issue_fetch/base/remote_issue.rb +23 -0
- data/app/tableless_models/redmine_remotes/issue_fetch/base.rb +47 -0
- data/app/tableless_models/redmine_remotes/issue_fetch/create/local_issue.rb +25 -0
- data/app/tableless_models/redmine_remotes/issue_fetch/create/remote_issue.rb +25 -0
- data/app/tableless_models/redmine_remotes/issue_fetch/create.rb +46 -0
- data/app/tableless_models/redmine_remotes/issue_fetch/update/local_issue.rb +19 -0
- data/app/tableless_models/redmine_remotes/issue_fetch/update/remote_issue.rb +19 -0
- data/app/tableless_models/redmine_remotes/issue_fetch/update.rb +20 -0
- data/config/locales/en.yml +7 -0
- data/config/locales/pt-BR.yml +8 -1
- data/lib/redmine_remotes/jobs/fetch_issues.rb +1 -1
- data/lib/redmine_remotes/version.rb +1 -1
- metadata +12 -12
- data/app/models/remote_issue_fetch/base/_local_issue.rb +0 -77
- data/app/models/remote_issue_fetch/base/_provider_issue.rb +0 -18
- data/app/models/remote_issue_fetch/base/_remote_issue.rb +0 -19
- data/app/models/remote_issue_fetch/base.rb +0 -45
- data/app/models/remote_issue_fetch/create/_local_issue.rb +0 -21
- data/app/models/remote_issue_fetch/create/_remote_issue.rb +0 -21
- data/app/models/remote_issue_fetch/create.rb +0 -44
- data/app/models/remote_issue_fetch/update/_local_issue.rb +0 -15
- data/app/models/remote_issue_fetch/update/_remote_issue.rb +0 -15
- data/app/models/remote_issue_fetch/update.rb +0 -18
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '08af38aa84220415817925bc4d43800241483e63af58ee400db473c0703e6056'
|
4
|
+
data.tar.gz: ebc18a12269acbd0a96e483b0292b44969b73f4c40cdb237dde72c82bca70c2b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e1df465e2f09a973aaef13ee09c62ff6fbed22159d13b84b2b97fceaed35633364fb2a07f9fa7cce77f824503fa6a7d5d95e5a1a82bd213c5188a76096c74826
|
7
|
+
data.tar.gz: 390421bd835ad593c9bf28dafe09a8ffd80ed64eb27f9a6f4f5b2a3dda05ec932284c4bdddce9b5538f37499ad9b505f68fa8afcde176dd81e6f535b24f4e211
|
@@ -8,9 +8,22 @@ class RemoteIssueStatusesController < ApplicationController
|
|
8
8
|
layout 'nonproject_modules'
|
9
9
|
require_permission PERMISSIONS
|
10
10
|
|
11
|
+
SEARCH_COLUMNS = %i[remote_name local_issue_status local_tracker remote_tracker].freeze
|
12
|
+
before_action :localize_options
|
13
|
+
|
11
14
|
active_scaffold :remote_issue_status do |conf|
|
12
|
-
|
15
|
+
conf.actions.swap :search, :field_search
|
16
|
+
SEARCH_COLUMNS.each do |column|
|
13
17
|
conf.columns[column].form_ui = :select
|
14
18
|
end
|
19
|
+
conf.field_search.columns = SEARCH_COLUMNS
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def localize_options
|
25
|
+
active_scaffold_config.columns[:remote_name].options = {
|
26
|
+
options: ::RemoteIssueStatus.remote_name_options
|
27
|
+
}
|
15
28
|
end
|
16
29
|
end
|
@@ -13,4 +13,10 @@ class RemoteIssueStatus < ActiveRecord::Base
|
|
13
13
|
validates :remote_tracker, presence: true
|
14
14
|
validates :local_tracker, presence: true
|
15
15
|
validates :local_issue_status, presence: true
|
16
|
+
|
17
|
+
class << self
|
18
|
+
def remote_name_options
|
19
|
+
all.pluck(:remote_name).map { |v| [v.upcase, v] }
|
20
|
+
end
|
21
|
+
end
|
16
22
|
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RedmineRemotes
|
4
|
+
module IssueFetch
|
5
|
+
class Base < ::EacRailsUtils::Models::Tableless
|
6
|
+
module LocalIssue
|
7
|
+
private
|
8
|
+
|
9
|
+
DESCRIPTION_SECTION_SEPARATOR = "\n\n"
|
10
|
+
|
11
|
+
def save_local_issue
|
12
|
+
save_local_issue_except_create_on && save_local_issue_created_on
|
13
|
+
end
|
14
|
+
|
15
|
+
def save_local_issue_created_on
|
16
|
+
local_issue_provider_attributes[:created_on].if_present do |created_on|
|
17
|
+
if created_on.present? && local_issue.created_on != created_on
|
18
|
+
local_issue.update_column( # rubocop:disable Rails/SkipsModelValidations
|
19
|
+
:created_on, created_on
|
20
|
+
)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
true
|
25
|
+
end
|
26
|
+
|
27
|
+
def save_local_issue_except_create_on
|
28
|
+
local_issue_provider_attributes.except(:created_on)
|
29
|
+
.each { |attr, value| local_issue.send("#{attr}=", value) }
|
30
|
+
return true if local_issue.save
|
31
|
+
|
32
|
+
fetch_record_errors(local_issue, default_column: default_error_column)
|
33
|
+
false
|
34
|
+
end
|
35
|
+
|
36
|
+
def local_issue_provider_attributes
|
37
|
+
{
|
38
|
+
subject: local_issue_subject, author: local_issue_author, status: local_issue_status,
|
39
|
+
description: local_issue_description,
|
40
|
+
created_on: provider_issue.created_on
|
41
|
+
}
|
42
|
+
end
|
43
|
+
|
44
|
+
def local_issue_subject
|
45
|
+
"[#{provider_issue.code}] #{provider_issue.subject}".truncate(100)
|
46
|
+
end
|
47
|
+
|
48
|
+
def local_issue_author_uncached
|
49
|
+
return nil if provider_issue.blank?
|
50
|
+
|
51
|
+
::RemoteUser.find_local_user(
|
52
|
+
provider_issue.author_login,
|
53
|
+
remote_tracker,
|
54
|
+
true
|
55
|
+
)
|
56
|
+
end
|
57
|
+
|
58
|
+
def local_issue_status
|
59
|
+
remote_tracker.try(:find_local_issue_status, local_tracker, provider_issue.status_name,
|
60
|
+
true)
|
61
|
+
end
|
62
|
+
|
63
|
+
def local_issue_description
|
64
|
+
[local_issue_extra_description(:before), provider_issue.description,
|
65
|
+
local_issue_extra_description(:after), local_issue_import_footer]
|
66
|
+
.reject(&:blank?).map(&:strip).join("\n\n----\n\n") + "\n"
|
67
|
+
end
|
68
|
+
|
69
|
+
def local_issue_extra_description(position)
|
70
|
+
extra = provider_issue.try("extra_description_#{position}").if_present('')
|
71
|
+
extra = extra.map { |k, v| "* *#{k}:* #{v}" } if extra.is_a?(::Hash)
|
72
|
+
extra = extra.map { |v| "#{v}\n" }.join if extra.is_a?(::Enumerable)
|
73
|
+
extra.to_s
|
74
|
+
end
|
75
|
+
|
76
|
+
def local_issue_import_footer
|
77
|
+
"_Demanda remota importada de #{provider_issue.human_view_url}._"
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RedmineRemotes
|
4
|
+
module IssueFetch
|
5
|
+
class Base < ::EacRailsUtils::Models::Tableless
|
6
|
+
module ProviderIssue
|
7
|
+
private
|
8
|
+
|
9
|
+
def provider_issue_uncached
|
10
|
+
return nil if [remote_tracker, issue_remote_code].any?(&:blank?)
|
11
|
+
|
12
|
+
remote_tracker.find_remote_issue(issue_remote_code)
|
13
|
+
rescue ::Avmtrf1::RestProvider::Response => e
|
14
|
+
errors.add(default_error_column,
|
15
|
+
"Requisição a \"#{e.url}\" retornou com status #{e.status}")
|
16
|
+
::Rails.logger.warn(e.body_str)
|
17
|
+
nil
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RedmineRemotes
|
4
|
+
module IssueFetch
|
5
|
+
class Base < ::EacRailsUtils::Models::Tableless
|
6
|
+
module RemoteIssue
|
7
|
+
private
|
8
|
+
|
9
|
+
def fetched_at_uncached
|
10
|
+
::Time.zone.now
|
11
|
+
end
|
12
|
+
|
13
|
+
def save_remote_issue
|
14
|
+
remote_issue.fetched_at = fetched_at
|
15
|
+
return true if remote_issue.save
|
16
|
+
|
17
|
+
fetch_record_errors(remote_issue, default_column: default_error_column)
|
18
|
+
false
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'eac_rails_utils/models/fetch_errors'
|
4
|
+
require 'eac_ruby_utils/core_ext'
|
5
|
+
|
6
|
+
module RedmineRemotes
|
7
|
+
module IssueFetch
|
8
|
+
class Base < ::EacRailsUtils::Models::Tableless
|
9
|
+
enable_simple_cache
|
10
|
+
require_sub __FILE__, include_modules: true
|
11
|
+
include ::EacRailsUtils::Models::FetchErrors
|
12
|
+
|
13
|
+
validates :fetched_at, presence: true
|
14
|
+
validates :local_tracker, presence: true
|
15
|
+
validates :remote_tracker, presence: true
|
16
|
+
validates :issue_remote_code, presence: true
|
17
|
+
|
18
|
+
validate :author_present
|
19
|
+
validate :provider_issue_present
|
20
|
+
|
21
|
+
def author_present
|
22
|
+
return if provider_issue.blank?
|
23
|
+
return if local_issue_author.present?
|
24
|
+
|
25
|
+
errors.add(:remote_code,
|
26
|
+
"Usuário local não encontrado para \"#{provider_issue.author_login}\"")
|
27
|
+
end
|
28
|
+
|
29
|
+
def provider_issue_present
|
30
|
+
return if issue_remote_code.blank?
|
31
|
+
return if provider_issue.present?
|
32
|
+
|
33
|
+
errors.add(:remote_code,
|
34
|
+
"Demanda remota não encontrada com o código \"#{issue_remote_code}\"")
|
35
|
+
end
|
36
|
+
|
37
|
+
def save
|
38
|
+
::Issue.transaction do
|
39
|
+
return false unless valid?
|
40
|
+
return false unless save_local_issue
|
41
|
+
return false unless save_remote_issue
|
42
|
+
end
|
43
|
+
true
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RedmineRemotes
|
4
|
+
module IssueFetch
|
5
|
+
class Create < ::RedmineRemotes::IssueFetch::Base
|
6
|
+
module LocalIssue
|
7
|
+
private
|
8
|
+
|
9
|
+
def local_issue_provider_attributes
|
10
|
+
super.merge(
|
11
|
+
project: project, tracker: local_tracker, priority: local_issue_priority
|
12
|
+
)
|
13
|
+
end
|
14
|
+
|
15
|
+
def local_issue_uncached
|
16
|
+
remote_issue_by_remote_code.if_present(&:local_issue) || ::Issue.new
|
17
|
+
end
|
18
|
+
|
19
|
+
def local_issue_priority
|
20
|
+
::IssuePriority.default
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RedmineRemotes
|
4
|
+
module IssueFetch
|
5
|
+
class Create < ::RedmineRemotes::IssueFetch::Base
|
6
|
+
module RemoteIssue
|
7
|
+
private
|
8
|
+
|
9
|
+
def remote_issue_uncached
|
10
|
+
remote_issue_by_remote_code.if_blank do
|
11
|
+
::RemoteIssue.new(remote_tracker: remote_tracker, remote_code: issue_remote_code,
|
12
|
+
local_issue: local_issue)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def remote_issue_by_remote_code_uncached
|
17
|
+
::RemoteIssue.find_by(
|
18
|
+
remote_tracker: remote_tracker,
|
19
|
+
remote_code: ::RemoteIssue.remote_code_sanitize(issue_remote_code)
|
20
|
+
)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RedmineRemotes
|
4
|
+
module IssueFetch
|
5
|
+
class Create < ::RedmineRemotes::IssueFetch::Base
|
6
|
+
require_sub __FILE__, include_modules: true
|
7
|
+
|
8
|
+
attribute :issue_remote_code, ::String
|
9
|
+
attribute :local_tracker_id, ::Integer
|
10
|
+
attribute :project_id, ::Integer
|
11
|
+
attribute :remote_tracker_id, ::Integer
|
12
|
+
|
13
|
+
belongs_to :local_tracker, class_name: 'Tracker'
|
14
|
+
belongs_to :project, class_name: 'Project'
|
15
|
+
belongs_to :remote_tracker, class_name: 'RemoteTracker'
|
16
|
+
|
17
|
+
validates :project, presence: true
|
18
|
+
|
19
|
+
validate :tracker_in_project
|
20
|
+
|
21
|
+
def default_error_column
|
22
|
+
:issue_remote_code
|
23
|
+
end
|
24
|
+
|
25
|
+
def save
|
26
|
+
remote_issue_by_remote_code.present? ? update : super
|
27
|
+
end
|
28
|
+
|
29
|
+
def tracker_in_project
|
30
|
+
return unless local_tracker.present? && project.present?
|
31
|
+
return if project.trackers.include?(local_tracker)
|
32
|
+
|
33
|
+
errors.add(:local_tracker, 'is not a tracker of project')
|
34
|
+
end
|
35
|
+
|
36
|
+
def update
|
37
|
+
update_record = ::RedmineRemotes::IssueFetch::Update
|
38
|
+
.new(remote_issue: remote_issue_by_remote_code)
|
39
|
+
return true if update_record.save
|
40
|
+
|
41
|
+
fetch_record_errors(update_record, default_column: default_error_column)
|
42
|
+
false
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RedmineRemotes
|
4
|
+
module IssueFetch
|
5
|
+
class Update < ::RedmineRemotes::IssueFetch::Base
|
6
|
+
module LocalIssue
|
7
|
+
private
|
8
|
+
|
9
|
+
def local_issue
|
10
|
+
remote_issue.local_issue
|
11
|
+
end
|
12
|
+
|
13
|
+
def local_tracker
|
14
|
+
local_issue.if_present(&:tracker)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RedmineRemotes
|
4
|
+
module IssueFetch
|
5
|
+
class Update < ::RedmineRemotes::IssueFetch::Base
|
6
|
+
module RemoteIssue
|
7
|
+
private
|
8
|
+
|
9
|
+
def issue_remote_code
|
10
|
+
remote_issue.remote_code
|
11
|
+
end
|
12
|
+
|
13
|
+
def remote_tracker
|
14
|
+
remote_issue.remote_tracker
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'eac_ruby_utils/core_ext'
|
4
|
+
|
5
|
+
module RedmineRemotes
|
6
|
+
module IssueFetch
|
7
|
+
class Update < ::RedmineRemotes::IssueFetch::Base
|
8
|
+
require_sub __FILE__, include_modules: true
|
9
|
+
|
10
|
+
attribute :remote_issue_id, ::Integer
|
11
|
+
belongs_to :remote_issue
|
12
|
+
|
13
|
+
validates :remote_issue, presence: true
|
14
|
+
|
15
|
+
def default_error_column
|
16
|
+
:remote_issue_id
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
data/config/locales/en.yml
CHANGED
@@ -1,4 +1,9 @@
|
|
1
1
|
en:
|
2
|
+
activerecord:
|
3
|
+
models:
|
4
|
+
remote_issue_status:
|
5
|
+
one: Remote issue status
|
6
|
+
other: Remote issue statuses
|
2
7
|
eac_ruby_utils:
|
3
8
|
listable:
|
4
9
|
remote_tracker:
|
@@ -13,8 +18,10 @@ en:
|
|
13
18
|
label: Alternative "description" field
|
14
19
|
field_issue_remote_code: Remote issue's code
|
15
20
|
field_local_issue: Local issue
|
21
|
+
field_local_issue_status: Local issue status
|
16
22
|
field_local_tracker: Local tracker
|
17
23
|
field_remote_code: Remote code
|
24
|
+
field_remote_name: Local issue status's name
|
18
25
|
field_remote_tracker: Remote tracker
|
19
26
|
label_remote_issues: Remote issues
|
20
27
|
label_remote_trackers: Remote trackers
|
data/config/locales/pt-BR.yml
CHANGED
@@ -1,4 +1,9 @@
|
|
1
1
|
pt-BR:
|
2
|
+
activerecord:
|
3
|
+
models:
|
4
|
+
remote_issue_status:
|
5
|
+
one: Situação de demanda remota
|
6
|
+
other: Situações de demandas remotas
|
2
7
|
eac_ruby_utils:
|
3
8
|
listable:
|
4
9
|
remote_tracker:
|
@@ -13,8 +18,10 @@ pt-BR:
|
|
13
18
|
label: Campo "descrição" alternativo
|
14
19
|
field_issue_remote_code: Código da demanda remota
|
15
20
|
field_local_issue: Demanda local
|
16
|
-
|
21
|
+
field_local_issue_status: Situação de demanda local
|
22
|
+
field_local_tracker: Tipo de demanda local
|
17
23
|
field_remote_code: Código remoto
|
24
|
+
field_remote_name: Nome da situação de demanda remota
|
18
25
|
field_remote_tracker: Tracker remoto
|
19
26
|
label_remote_issues: Demandas remotas
|
20
27
|
label_remote_trackers: Trackers remotos
|
@@ -19,7 +19,7 @@ module RedmineRemotes
|
|
19
19
|
def fetch_issue(remote_issue)
|
20
20
|
::Rails.logger.info 'Fetching remote issue ' \
|
21
21
|
"\"#{remote_issue}|\##{remote_issue.local_issue.id}\""
|
22
|
-
record = ::
|
22
|
+
record = ::RedmineRemotes::IssueFetch::Update.new(
|
23
23
|
remote_issue: remote_issue
|
24
24
|
)
|
25
25
|
return if record.save
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: redmine_remotes
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.16.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Eduardo Henrique Bogoni
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-03-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: aranha-parsers
|
@@ -154,16 +154,6 @@ files:
|
|
154
154
|
- app/controllers/remote_trackers_controller.rb
|
155
155
|
- app/controllers/remote_users_controller.rb
|
156
156
|
- app/models/remote_issue.rb
|
157
|
-
- app/models/remote_issue_fetch/base.rb
|
158
|
-
- app/models/remote_issue_fetch/base/_local_issue.rb
|
159
|
-
- app/models/remote_issue_fetch/base/_provider_issue.rb
|
160
|
-
- app/models/remote_issue_fetch/base/_remote_issue.rb
|
161
|
-
- app/models/remote_issue_fetch/create.rb
|
162
|
-
- app/models/remote_issue_fetch/create/_local_issue.rb
|
163
|
-
- app/models/remote_issue_fetch/create/_remote_issue.rb
|
164
|
-
- app/models/remote_issue_fetch/update.rb
|
165
|
-
- app/models/remote_issue_fetch/update/_local_issue.rb
|
166
|
-
- app/models/remote_issue_fetch/update/_remote_issue.rb
|
167
157
|
- app/models/remote_issue_status.rb
|
168
158
|
- app/models/remote_tracker.rb
|
169
159
|
- app/models/remote_tracker/find_issue_local_status.rb
|
@@ -175,6 +165,16 @@ files:
|
|
175
165
|
- app/models/remote_tracker_setting.rb
|
176
166
|
- app/models/remote_user.rb
|
177
167
|
- app/models/remote_user/find_local_user.rb
|
168
|
+
- app/tableless_models/redmine_remotes/issue_fetch/base.rb
|
169
|
+
- app/tableless_models/redmine_remotes/issue_fetch/base/local_issue.rb
|
170
|
+
- app/tableless_models/redmine_remotes/issue_fetch/base/provider_issue.rb
|
171
|
+
- app/tableless_models/redmine_remotes/issue_fetch/base/remote_issue.rb
|
172
|
+
- app/tableless_models/redmine_remotes/issue_fetch/create.rb
|
173
|
+
- app/tableless_models/redmine_remotes/issue_fetch/create/local_issue.rb
|
174
|
+
- app/tableless_models/redmine_remotes/issue_fetch/create/remote_issue.rb
|
175
|
+
- app/tableless_models/redmine_remotes/issue_fetch/update.rb
|
176
|
+
- app/tableless_models/redmine_remotes/issue_fetch/update/local_issue.rb
|
177
|
+
- app/tableless_models/redmine_remotes/issue_fetch/update/remote_issue.rb
|
178
178
|
- app/views/project_remote_issues/_issues.html.erb
|
179
179
|
- app/views/project_remote_issues/_trackers.html.erb
|
180
180
|
- app/views/project_remote_issues/index.html.erb
|
@@ -1,77 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module RemoteIssueFetch
|
4
|
-
class Base < ::EacRailsUtils::Models::Tableless
|
5
|
-
private
|
6
|
-
|
7
|
-
DESCRIPTION_SECTION_SEPARATOR = "\n\n"
|
8
|
-
|
9
|
-
def save_local_issue
|
10
|
-
save_local_issue_except_create_on && save_local_issue_created_on
|
11
|
-
end
|
12
|
-
|
13
|
-
def save_local_issue_created_on
|
14
|
-
local_issue_provider_attributes[:created_on].if_present do |created_on|
|
15
|
-
if created_on.present? && local_issue.created_on != created_on
|
16
|
-
local_issue.update_column( # rubocop:disable Rails/SkipsModelValidations
|
17
|
-
:created_on, created_on
|
18
|
-
)
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
true
|
23
|
-
end
|
24
|
-
|
25
|
-
def save_local_issue_except_create_on
|
26
|
-
local_issue_provider_attributes.except(:created_on)
|
27
|
-
.each { |attr, value| local_issue.send("#{attr}=", value) }
|
28
|
-
return true if local_issue.save
|
29
|
-
|
30
|
-
fetch_record_errors(local_issue, default_column: default_error_column)
|
31
|
-
false
|
32
|
-
end
|
33
|
-
|
34
|
-
def local_issue_provider_attributes
|
35
|
-
{
|
36
|
-
subject: local_issue_subject, author: local_issue_author, status: local_issue_status,
|
37
|
-
description: local_issue_description,
|
38
|
-
created_on: provider_issue.created_on
|
39
|
-
}
|
40
|
-
end
|
41
|
-
|
42
|
-
def local_issue_subject
|
43
|
-
"[#{provider_issue.code}] #{provider_issue.subject}".truncate(100)
|
44
|
-
end
|
45
|
-
|
46
|
-
def local_issue_author_uncached
|
47
|
-
return nil if provider_issue.blank?
|
48
|
-
|
49
|
-
::RemoteUser.find_local_user(
|
50
|
-
provider_issue.author_login,
|
51
|
-
remote_tracker,
|
52
|
-
true
|
53
|
-
)
|
54
|
-
end
|
55
|
-
|
56
|
-
def local_issue_status
|
57
|
-
remote_tracker.try(:find_local_issue_status, local_tracker, provider_issue.status_name, true)
|
58
|
-
end
|
59
|
-
|
60
|
-
def local_issue_description
|
61
|
-
[local_issue_extra_description(:before), provider_issue.description,
|
62
|
-
local_issue_extra_description(:after), local_issue_import_footer]
|
63
|
-
.reject(&:blank?).map(&:strip).join("\n\n----\n\n") + "\n"
|
64
|
-
end
|
65
|
-
|
66
|
-
def local_issue_extra_description(position)
|
67
|
-
extra = provider_issue.try("extra_description_#{position}").if_present('')
|
68
|
-
extra = extra.map { |k, v| "* *#{k}:* #{v}" } if extra.is_a?(::Hash)
|
69
|
-
extra = extra.map { |v| "#{v}\n" }.join if extra.is_a?(::Enumerable)
|
70
|
-
extra.to_s
|
71
|
-
end
|
72
|
-
|
73
|
-
def local_issue_import_footer
|
74
|
-
"_Demanda remota importada de #{provider_issue.human_view_url}._"
|
75
|
-
end
|
76
|
-
end
|
77
|
-
end
|
@@ -1,18 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module RemoteIssueFetch
|
4
|
-
class Base < ::EacRailsUtils::Models::Tableless
|
5
|
-
private
|
6
|
-
|
7
|
-
def provider_issue_uncached
|
8
|
-
return nil if [remote_tracker, issue_remote_code].any?(&:blank?)
|
9
|
-
|
10
|
-
remote_tracker.find_remote_issue(issue_remote_code)
|
11
|
-
rescue ::Avmtrf1::RestProvider::Response => e
|
12
|
-
errors.add(default_error_column,
|
13
|
-
"Requisição a \"#{e.url}\" retornou com status #{e.status}")
|
14
|
-
::Rails.logger.warn(e.body)
|
15
|
-
nil
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
@@ -1,19 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module RemoteIssueFetch
|
4
|
-
class Base < ::EacRailsUtils::Models::Tableless
|
5
|
-
private
|
6
|
-
|
7
|
-
def fetched_at_uncached
|
8
|
-
::Time.zone.now
|
9
|
-
end
|
10
|
-
|
11
|
-
def save_remote_issue
|
12
|
-
remote_issue.fetched_at = fetched_at
|
13
|
-
return true if remote_issue.save
|
14
|
-
|
15
|
-
fetch_record_errors(remote_issue, default_column: default_error_column)
|
16
|
-
false
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
@@ -1,45 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'eac_rails_utils/models/fetch_errors'
|
4
|
-
require 'eac_ruby_utils/core_ext'
|
5
|
-
|
6
|
-
module RemoteIssueFetch
|
7
|
-
class Base < ::EacRailsUtils::Models::Tableless
|
8
|
-
enable_simple_cache
|
9
|
-
require_sub __FILE__
|
10
|
-
include ::EacRailsUtils::Models::FetchErrors
|
11
|
-
|
12
|
-
validates :fetched_at, presence: true
|
13
|
-
validates :local_tracker, presence: true
|
14
|
-
validates :remote_tracker, presence: true
|
15
|
-
validates :issue_remote_code, presence: true
|
16
|
-
|
17
|
-
validate :author_present
|
18
|
-
validate :provider_issue_present
|
19
|
-
|
20
|
-
def author_present
|
21
|
-
return if provider_issue.blank?
|
22
|
-
return if local_issue_author.present?
|
23
|
-
|
24
|
-
errors.add(:remote_code,
|
25
|
-
"Usuário local não encontrado para \"#{provider_issue.author_login}\"")
|
26
|
-
end
|
27
|
-
|
28
|
-
def provider_issue_present
|
29
|
-
return if issue_remote_code.blank?
|
30
|
-
return if provider_issue.present?
|
31
|
-
|
32
|
-
errors.add(:remote_code,
|
33
|
-
"Demanda remota não encontrada com o código \"#{issue_remote_code}\"")
|
34
|
-
end
|
35
|
-
|
36
|
-
def save
|
37
|
-
::Issue.transaction do
|
38
|
-
return false unless valid?
|
39
|
-
return false unless save_local_issue
|
40
|
-
return false unless save_remote_issue
|
41
|
-
end
|
42
|
-
true
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
@@ -1,21 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module RemoteIssueFetch
|
4
|
-
class Create < ::RemoteIssueFetch::Base
|
5
|
-
private
|
6
|
-
|
7
|
-
def local_issue_provider_attributes
|
8
|
-
super.merge(
|
9
|
-
project: project, tracker: local_tracker, priority: local_issue_priority
|
10
|
-
)
|
11
|
-
end
|
12
|
-
|
13
|
-
def local_issue_uncached
|
14
|
-
remote_issue_by_remote_code.if_present(&:local_issue) || ::Issue.new
|
15
|
-
end
|
16
|
-
|
17
|
-
def local_issue_priority
|
18
|
-
::IssuePriority.default
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
@@ -1,21 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module RemoteIssueFetch
|
4
|
-
class Create < ::RemoteIssueFetch::Base
|
5
|
-
private
|
6
|
-
|
7
|
-
def remote_issue_uncached
|
8
|
-
remote_issue_by_remote_code.if_blank do
|
9
|
-
::RemoteIssue.new(remote_tracker: remote_tracker, remote_code: issue_remote_code,
|
10
|
-
local_issue: local_issue)
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
def remote_issue_by_remote_code_uncached
|
15
|
-
::RemoteIssue.find_by(
|
16
|
-
remote_tracker: remote_tracker,
|
17
|
-
remote_code: ::RemoteIssue.remote_code_sanitize(issue_remote_code)
|
18
|
-
)
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
@@ -1,44 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module RemoteIssueFetch
|
4
|
-
class Create < ::RemoteIssueFetch::Base
|
5
|
-
require_sub __FILE__
|
6
|
-
|
7
|
-
attribute :issue_remote_code, ::String
|
8
|
-
attribute :local_tracker_id, ::Integer
|
9
|
-
attribute :project_id, ::Integer
|
10
|
-
attribute :remote_tracker_id, ::Integer
|
11
|
-
|
12
|
-
belongs_to :local_tracker, class_name: 'Tracker'
|
13
|
-
belongs_to :project, class_name: 'Project'
|
14
|
-
belongs_to :remote_tracker, class_name: 'RemoteTracker'
|
15
|
-
|
16
|
-
validates :project, presence: true
|
17
|
-
|
18
|
-
validate :tracker_in_project
|
19
|
-
|
20
|
-
def default_error_column
|
21
|
-
:issue_remote_code
|
22
|
-
end
|
23
|
-
|
24
|
-
def save
|
25
|
-
remote_issue_by_remote_code.present? ? update : super
|
26
|
-
end
|
27
|
-
|
28
|
-
def tracker_in_project
|
29
|
-
return unless local_tracker.present? && project.present?
|
30
|
-
return if project.trackers.include?(local_tracker)
|
31
|
-
|
32
|
-
errors.add(:local_tracker, 'is not a tracker of project')
|
33
|
-
end
|
34
|
-
|
35
|
-
def update
|
36
|
-
update_record = ::RemoteIssueFetch::Update
|
37
|
-
.new(remote_issue: remote_issue_by_remote_code)
|
38
|
-
return true if update_record.save
|
39
|
-
|
40
|
-
fetch_record_errors(update_record, default_column: default_error_column)
|
41
|
-
false
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
@@ -1,18 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'eac_ruby_utils/core_ext'
|
4
|
-
|
5
|
-
module RemoteIssueFetch
|
6
|
-
class Update < ::RemoteIssueFetch::Base
|
7
|
-
require_sub __FILE__
|
8
|
-
|
9
|
-
attribute :remote_issue_id, ::Integer
|
10
|
-
belongs_to :remote_issue
|
11
|
-
|
12
|
-
validates :remote_issue, presence: true
|
13
|
-
|
14
|
-
def default_error_column
|
15
|
-
:remote_issue_id
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|