ecoportal-api-v2 0.8.8 → 0.8.12

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.
Files changed (57) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +85 -3
  3. data/lib/ecoportal/api/common/content/array_model.rb +8 -6
  4. data/lib/ecoportal/api/common/content/collection_model.rb +45 -20
  5. data/lib/ecoportal/api/common/content/doc_helpers.rb +2 -2
  6. data/lib/ecoportal/api/common/content/double_model.rb +94 -5
  7. data/lib/ecoportal/api/common/content/hash_diff_patch.rb +44 -22
  8. data/lib/ecoportal/api/common/content/model_helpers.rb +36 -0
  9. data/lib/ecoportal/api/common/content.rb +1 -0
  10. data/lib/ecoportal/api/v2/page/component/action.rb +17 -8
  11. data/lib/ecoportal/api/v2/page/component/action_field.rb +37 -2
  12. data/lib/ecoportal/api/v2/page/component/chart_field/benchmark.rb +9 -7
  13. data/lib/ecoportal/api/v2/page/component/chart_field/config.rb +23 -0
  14. data/lib/ecoportal/api/v2/page/component/chart_field/frequency.rb +3 -4
  15. data/lib/ecoportal/api/v2/page/component/chart_field/heatmap.rb +1 -3
  16. data/lib/ecoportal/api/v2/page/component/chart_field/indicator.rb +4 -5
  17. data/lib/ecoportal/api/v2/page/component/chart_field/multiseries.rb +3 -5
  18. data/lib/ecoportal/api/v2/page/component/chart_field/sankey.rb +1 -3
  19. data/lib/ecoportal/api/v2/page/component/chart_field/serie.rb +3 -4
  20. data/lib/ecoportal/api/v2/page/component/chart_field/series_config.rb +5 -7
  21. data/lib/ecoportal/api/v2/page/component/chart_field.rb +39 -5
  22. data/lib/ecoportal/api/v2/page/component/chart_fr_field.rb +7 -5
  23. data/lib/ecoportal/api/v2/page/component/checklist_field.rb +1 -1
  24. data/lib/ecoportal/api/v2/page/component/checklist_item.rb +7 -5
  25. data/lib/ecoportal/api/v2/page/component/date_field.rb +71 -4
  26. data/lib/ecoportal/api/v2/page/component/file.rb +14 -3
  27. data/lib/ecoportal/api/v2/page/component/files_field.rb +37 -1
  28. data/lib/ecoportal/api/v2/page/component/gauge_field.rb +2 -2
  29. data/lib/ecoportal/api/v2/page/component/gauge_stop.rb +5 -5
  30. data/lib/ecoportal/api/v2/page/component/geo_coordinates.rb +13 -0
  31. data/lib/ecoportal/api/v2/page/component/geo_field.rb +4 -1
  32. data/lib/ecoportal/api/v2/page/component/image.rb +2 -1
  33. data/lib/ecoportal/api/v2/page/component/images_field.rb +57 -1
  34. data/lib/ecoportal/api/v2/page/component/number_field.rb +1 -0
  35. data/lib/ecoportal/api/v2/page/component/people_field.rb +115 -5
  36. data/lib/ecoportal/api/v2/page/component/people_viewable_field.rb +14 -0
  37. data/lib/ecoportal/api/v2/page/component/plain_text_field.rb +34 -2
  38. data/lib/ecoportal/api/v2/page/component/reference_field.rb +32 -3
  39. data/lib/ecoportal/api/v2/page/component/selection_field.rb +59 -3
  40. data/lib/ecoportal/api/v2/page/component/selection_option.rb +6 -4
  41. data/lib/ecoportal/api/v2/page/component/signature_field.rb +3 -2
  42. data/lib/ecoportal/api/v2/page/component/tag_field.rb +31 -1
  43. data/lib/ecoportal/api/v2/page/component.rb +44 -10
  44. data/lib/ecoportal/api/v2/page/components.rb +8 -3
  45. data/lib/ecoportal/api/v2/page/permission_flags.rb +67 -0
  46. data/lib/ecoportal/api/v2/page/permit.rb +2 -1
  47. data/lib/ecoportal/api/v2/page/section.rb +70 -9
  48. data/lib/ecoportal/api/v2/page/sections.rb +64 -6
  49. data/lib/ecoportal/api/v2/page/stage.rb +11 -7
  50. data/lib/ecoportal/api/v2/page/stages.rb +2 -2
  51. data/lib/ecoportal/api/v2/page.rb +18 -2
  52. data/lib/ecoportal/api/v2/pages/page_stage.rb +13 -1
  53. data/lib/ecoportal/api/v2/pages.rb +3 -0
  54. data/lib/ecoportal/api/v2/registers/search_results.rb +13 -0
  55. data/lib/ecoportal/api/v2/registers.rb +15 -2
  56. data/lib/ecoportal/api/v2_version.rb +1 -1
  57. metadata +8 -2
@@ -6,9 +6,9 @@ module Ecoportal
6
6
  class << self
7
7
  def new_doc(split: false)
8
8
  {
9
- "id" => new_uuid,
10
- "type" => split ? "split" : "content",
11
- "weight" => 9999
9
+ "id" => new_uuid,
10
+ "type" => split ? "split" : "content",
11
+ "weight" => 800
12
12
  }.tap do |out|
13
13
  component_ids = if split
14
14
  {
@@ -26,10 +26,11 @@ module Ecoportal
26
26
  end
27
27
 
28
28
  passkey :id
29
- passthrough :patch_ver, :weight, :type
29
+ passforced :patch_ver, default: 1
30
+ passthrough :weight, :type
30
31
  passthrough :heading, :left_heading, :right_heading
31
32
  passarray :component_ids, :left_component_ids, :right_component_ids
32
- passthrough :minimized
33
+ passboolean :minimized
33
34
 
34
35
  def split?
35
36
  doc && doc["type"] == "split"
@@ -44,10 +45,70 @@ module Ecoportal
44
45
  all_component_ids.include?(id)
45
46
  end
46
47
 
47
- def components
48
- fld_ids = all_component_ids
49
- root.components.values_at(*fld_ids).select.with_index do |fld, i|
50
- puts "Warning: field #{id} points to missing field #{fld_ids[i]}" if !fld
48
+ def components(side: nil)
49
+ case side
50
+ when :right
51
+ components_right
52
+ when :left
53
+ components_left
54
+ when NilClass
55
+ components_by_id(*all_component_ids)
56
+ else
57
+ raise "Side should be one of [nil, :right, :left]. Given: #{side}"
58
+ end
59
+ end
60
+
61
+ def components_left
62
+ raise "You are trying to retrieve side components in a Split Section" unless split?
63
+ components_by_id(*left_component_ids)
64
+ end
65
+
66
+ def components_right
67
+ raise "You are trying to retrieve side components in a Split Section" unless split?
68
+ components_by_id(*right_component_ids)
69
+ end
70
+
71
+ # Adds `field` to the section
72
+ # @note
73
+ # - To the specified `side`, when split section (default `:left`)
74
+ # - To the end if `after` is not specified
75
+ # - If `after` is specified, it searches field
76
+ # - On the specific `side`, if specified (and split section)
77
+ # - And adds the `field` after it, when found, or at the end if `after` is not found
78
+ # @param field [Ecoportal::API::V2::Page::Component] the field to be added.
79
+ def add_component(field, after: nil, side: nil)
80
+ raise "field should be a Ecoportal::API::V2::Page::Component. Given: #{field.class}" unless field.is_a?(Ecoportal::API::V2::Page::Component)
81
+ if field.section == self
82
+ raise "Field with id '#{field.id}' already belongs to this section"
83
+ elsif sec = field.section
84
+ # Field belongs to another section
85
+ raise "Field with id '#{field.id}' belongs to section '#{sec.heading || "Unnamed"}' (id: '#{sec.id}')"
86
+ end
87
+
88
+ if split?
89
+ ids_ary = side == :right ? right_component_ids : left_component_ids
90
+ fields = components(side: side || :left)
91
+ else
92
+ ids_ary = component_ids
93
+ fields = components
94
+ end
95
+ if after
96
+ after_fld = fields.find do |fld|
97
+ found = nil
98
+ found ||= !!after if after.is_a?(Ecoportal::API::V2::Page::Component)
99
+ found ||= fld.id == after
100
+ found ||= same_string?(fld.label, after)
101
+ end
102
+ end
103
+ ids_ary.insert_one(field.id, after: after_fld&.id)
104
+ self
105
+ end
106
+
107
+ private
108
+
109
+ def components_by_id(*ids)
110
+ root.components.values_at(*ids).select.with_index do |fld, i|
111
+ puts "Warning: field id #{ids[i]} points to missing field" if !fld
51
112
  fld && (!block_given? || yield(fld))
52
113
  end
53
114
  end
@@ -7,26 +7,84 @@ module Ecoportal
7
7
 
8
8
  self.klass = :section_class
9
9
 
10
+ # Creates a new `section`
10
11
  def add(name: nil, split: false, pos: NOT_USED, before: NOT_USED, after: NOT_USED)
11
12
  sec_doc = section_class.new_doc(split: split)
12
- upsert!(sec_doc, pos: pos, before: before, after: after) do |section|
13
+ upsert!(sec_doc) do |section| #, pos: pos, before: before, after: after) do |section|
13
14
  section.heading = name
14
- if prev = previous_section(section)
15
- section.weight = prev.weight
15
+ if weight = scope_weight(pos: pos, before: before, after: after)
16
+ section.weight = weight
16
17
  end
18
+ fix_weights!
17
19
  yield(section) if block_given?
18
- #fix_weights! # a server bug prevents to set the weight of existing sections
19
20
  end
20
21
  end
21
22
 
23
+ def get_by_type(type)
24
+ ordered.select do |sec|
25
+ sec.type == type
26
+ end
27
+ end
28
+
29
+ def get_by_heading(heading)
30
+ ordered.select do |sec|
31
+ value = heading == :unnamed ? nil : heading
32
+ same_string?(sec.heading, value)
33
+ end
34
+ end
35
+
36
+ # Gets all the sections between `sec1` and `sec2`
37
+ def between(sec1, sec2, included: false)
38
+ sorted_secs = ordered
39
+ pos1 = (sec1 = to_section(sec1)) && sorted_secs.index(sec1)
40
+ pos2 = (sec2 = to_section(sec2)) && sorted_secs.index(sec2)
41
+ if included
42
+ pos1 = pos1 ? pos1 : 0
43
+ pos2 = pos2 ? pos2 : -1
44
+ else
45
+ pos1 = pos1 ? (pos1 + 1) : 0
46
+ pos2 = pos2 ? (pos2 - 1) : -1
47
+ end
48
+ sorted_secs[pos1..pos2]
49
+ end
50
+
51
+ # Gets the sections ordered by `weight` (as they appear in the page)
22
52
  def ordered
23
- each_with_index.sort_by do |section, index|
53
+ self.sort_by.with_index do |section, index|
24
54
  (section.weight >= 9999) ? [index, index] : [section.weight, index]
25
- end.map(&:first)
55
+ end
26
56
  end
27
57
 
28
58
  private
29
59
 
60
+ def scope_weight(pos: NOT_USED, before: NOT_USED, after: NOT_USED)
61
+ case
62
+ when used_param?(pos)
63
+ if pos = to_section(pos)
64
+ pos.weight - 1
65
+ end
66
+ when used_param?(before)
67
+ if before = to_section(before)
68
+ before.weight - 1
69
+ end
70
+ when used_param?(after)
71
+ if after = to_section(after)
72
+ after.weight
73
+ end
74
+ end
75
+ end
76
+
77
+ def to_section(value)
78
+ case value
79
+ when Ecoportal::API::V2::Page::Section
80
+ value
81
+ when Numeric
82
+ ordered[value]
83
+ else
84
+ get_by_heading(value).first
85
+ end
86
+ end
87
+
30
88
  def fix_weights!
31
89
  ordered.each_with_index do |section, index|
32
90
  section.weight = index
@@ -4,14 +4,17 @@ module Ecoportal
4
4
  class Page
5
5
  class Stage < Common::Content::DoubleModel
6
6
  passkey :id
7
- passthrough :patch_ver
8
- passthrough :namem, :ordering
7
+ passforced :patch_ver, default: 1
8
+ passthrough :name, :ordering
9
9
  passarray :subtags, order_matters: false
10
10
  passarray :section_ids
11
- passthrough :complete, :status, :lock_after_completion
11
+ passthrough :status
12
+ passboolean :complete, :lock_after_completion
13
+
12
14
  embeds_many :permits, klass: "Ecoportal::API::V2::Page::Permit"
13
- passthrough :disable_direct_permissions
14
- passthrough :creator_enabled, :creator_editable, :creator_flags
15
+ passboolean :disable_direct_permissions
16
+ passboolean :creator_enabled, :creator_editable
17
+ embeds_one :creator_flags, klass: "Ecoportal::API::V2::Page::PermissionFlags"
15
18
  passthrough :can
16
19
 
17
20
  def sections
@@ -22,8 +25,9 @@ module Ecoportal
22
25
  end.sort_by {|sec| sec.weight}
23
26
  end
24
27
 
25
- def attach_section(section)
26
- section_ids.insert_one(section.id)
28
+ def add_section(*secs)
29
+ secs.each {|sec| section_ids.insert_one(sec.id)}
30
+ self
27
31
  end
28
32
 
29
33
  end
@@ -8,8 +8,8 @@ module Ecoportal
8
8
  self.klass = :stage_class
9
9
 
10
10
  def get_by_name(name)
11
- find do |stage|
12
- stage.name.strip.downcase == name.to_s.strip.downcase
11
+ self.find do |stage|
12
+ same_string?(stage.name, name)
13
13
  end
14
14
  end
15
15
 
@@ -2,9 +2,19 @@ module Ecoportal
2
2
  module API
3
3
  class V2
4
4
  class Page < Common::Content::DoubleModel
5
- ALLOWED_KEYS = %w[id patch_ver name template_id base_tags tags time_zone created_at updated_at can components sections stages]
5
+ ALLOWED_KEYS = [
6
+ "id", "patch_ver", "name", "template_id",
7
+ "base_tags", "tags",
8
+ "time_zone", "created_at", "updated_at",
9
+ "components", "sections", "stages",
10
+ "permits", "mould_counter", "mould",
11
+ "state", "task_priority",
12
+ "votes_enabled", "upvotes", "downvotes",
13
+ "force_errors", "subtags"
14
+ ]
15
+
6
16
  passkey :id
7
- passthrough :patch_ver
17
+ passforced :patch_ver, default: 1
8
18
  passthrough :name, :template_id
9
19
  passarray :base_tags, :tags, order_matters: false
10
20
  passthrough :time_zone
@@ -25,15 +35,21 @@ module Ecoportal
25
35
  hash["data"].select! do |key, value|
26
36
  ALLOWED_KEYS.include?(key)
27
37
  end
38
+ return nil if (hash["data"].keys - ["patch_ver"]).empty?
28
39
  end
29
40
  end
30
41
  end
31
42
 
43
+ def stages?
44
+ self.stages.count > 0
45
+ end
46
+
32
47
  end
33
48
  end
34
49
  end
35
50
  end
36
51
 
52
+ require 'ecoportal/api/v2/page/permission_flags'
37
53
  require 'ecoportal/api/v2/page/permit'
38
54
  require 'ecoportal/api/v2/page/component'
39
55
  require 'ecoportal/api/v2/page/components'
@@ -9,7 +9,19 @@ module Ecoportal
9
9
 
10
10
  embeds_many :permits, klass: "Ecoportal::API::V2::Page::Permit"
11
11
  passarray :force_errors, :subtags, order_matters: false
12
- #passthrough :evolution
12
+
13
+ # `id` of the stage we got the data of.
14
+ def current_stage_id
15
+ doc.dig("active_stage", "id") || doc["current_stage_id"]
16
+ end
17
+
18
+ # @return [Ecoportal::API::V2::Page::Stage]
19
+ def current_stage
20
+ if stage_id = current_stage_id
21
+ stages[stage_id]
22
+ end
23
+ end
24
+
13
25
  end
14
26
  end
15
27
  end
@@ -47,10 +47,13 @@ module Ecoportal
47
47
  end
48
48
 
49
49
  # Requests to update an existing page via api.
50
+ # @note It won't launch the update unless there are changes
50
51
  # @param doc [Hash, Page] data that at least contains an `id` (internal or external) of the target page.
51
52
  # @return [Response] an object with the api response.
52
53
  def update(doc)
53
54
  body = get_body(doc) # , level: "page"
55
+ # Launch only if there are changes
56
+ raise "Missing page object" unless body && body["page"]
54
57
  id = get_id(doc)
55
58
  client.patch("/pages/#{CGI.escape(id)}", data: body)
56
59
  end
@@ -0,0 +1,13 @@
1
+ module Ecoportal
2
+ module API
3
+ class V2
4
+ class Registers
5
+ class SearchResults < Common::Content::DoubleModel
6
+ passthrough :total, :total_before_filtering
7
+ passarray :tags, order_matters: false
8
+ embeds_many :results, klass: "Ecoportal::API::V2::Registers::PageResult"
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -9,6 +9,7 @@ module Ecoportal
9
9
 
10
10
  class_resolver :register_class, "Ecoportal::API::V2::Registers::Register"
11
11
  class_resolver :register_search_result_class, "Ecoportal::API::V2::Registers::PageResult"
12
+ class_resolver :register_search_results, "Ecoportal::API::V2::Registers::SearchResults"
12
13
 
13
14
  attr_reader :client
14
15
 
@@ -35,7 +36,12 @@ module Ecoportal
35
36
  # @param options [Hash] the search options
36
37
  # @option options [Hash<Symbol, String>] :query plain search (like the search box in register).
37
38
  # @option options [Hash<Symbol, Array<Object>>] :filters the set of filters.
39
+ # @option options [Boolean] if `true`, it only performs the first search and results `Ecoportal::API::V2::Registers::SearchResults`.
40
+ # @yield [result] something to do with search page-result.
41
+ # @yieldparam result [Ecoportal::V2::Registers::PageResult] a page result.
42
+ # @return [Ecoportal::API::V2::Registers, Ecoportal::API::V2::Registers::SearchResults]
38
43
  def search(register_id, options = {})
44
+ only_first = options.delete(:only_first)
39
45
  # supply a query string
40
46
  # or a filter array (copy/paste from dev tools in the browser)
41
47
  options = {query: nil, filters: []}.update(options)
@@ -49,6 +55,12 @@ module Ecoportal
49
55
  end
50
56
  end
51
57
 
58
+ if only_first
59
+ response = client.get("/registers/#{register_id}/search", params: options)
60
+ raise "Request failed - Status #{response.status}: #{response.body}" unless response.success?
61
+ return register_search_results.new(response.body["data"])
62
+ end
63
+
52
64
  cursor_id = nil
53
65
  results = 0
54
66
  loop do
@@ -70,8 +82,8 @@ module Ecoportal
70
82
  yield object
71
83
  end
72
84
 
73
- # break unless (cursor_id = data["cursor_id"])
74
- break if total == results
85
+ break if total <= results
86
+ break unless (cursor_id = data["cursor_id"])
75
87
  end
76
88
  self
77
89
  end
@@ -87,3 +99,4 @@ require 'ecoportal/api/v2/registers/register'
87
99
  require 'ecoportal/api/v2/registers/stage_result'
88
100
  require 'ecoportal/api/v2/registers/stages_result'
89
101
  require 'ecoportal/api/v2/registers/page_result'
102
+ require 'ecoportal/api/v2/registers/search_results'
@@ -1,5 +1,5 @@
1
1
  module Ecoportal
2
2
  module API
3
- GEM2_VERSION = "0.8.8"
3
+ GEM2_VERSION = "0.8.12"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ecoportal-api-v2
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.8
4
+ version: 0.8.12
5
5
  platform: ruby
6
6
  authors:
7
7
  - Oscar Segura
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-08-03 00:00:00.000000000 Z
11
+ date: 2021-08-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -176,6 +176,7 @@ files:
176
176
  - lib/ecoportal/api/common/content/doc_helpers.rb
177
177
  - lib/ecoportal/api/common/content/double_model.rb
178
178
  - lib/ecoportal/api/common/content/hash_diff_patch.rb
179
+ - lib/ecoportal/api/common/content/model_helpers.rb
179
180
  - lib/ecoportal/api/common/content/string_digest.rb
180
181
  - lib/ecoportal/api/common/content/wrapped_response.rb
181
182
  - lib/ecoportal/api/v2.rb
@@ -185,6 +186,7 @@ files:
185
186
  - lib/ecoportal/api/v2/page/component/action_field.rb
186
187
  - lib/ecoportal/api/v2/page/component/chart_field.rb
187
188
  - lib/ecoportal/api/v2/page/component/chart_field/benchmark.rb
189
+ - lib/ecoportal/api/v2/page/component/chart_field/config.rb
188
190
  - lib/ecoportal/api/v2/page/component/chart_field/frequency.rb
189
191
  - lib/ecoportal/api/v2/page/component/chart_field/heatmap.rb
190
192
  - lib/ecoportal/api/v2/page/component/chart_field/indicator.rb
@@ -200,12 +202,14 @@ files:
200
202
  - lib/ecoportal/api/v2/page/component/files_field.rb
201
203
  - lib/ecoportal/api/v2/page/component/gauge_field.rb
202
204
  - lib/ecoportal/api/v2/page/component/gauge_stop.rb
205
+ - lib/ecoportal/api/v2/page/component/geo_coordinates.rb
203
206
  - lib/ecoportal/api/v2/page/component/geo_field.rb
204
207
  - lib/ecoportal/api/v2/page/component/image.rb
205
208
  - lib/ecoportal/api/v2/page/component/images_field.rb
206
209
  - lib/ecoportal/api/v2/page/component/law_field.rb
207
210
  - lib/ecoportal/api/v2/page/component/number_field.rb
208
211
  - lib/ecoportal/api/v2/page/component/people_field.rb
212
+ - lib/ecoportal/api/v2/page/component/people_viewable_field.rb
209
213
  - lib/ecoportal/api/v2/page/component/plain_text_field.rb
210
214
  - lib/ecoportal/api/v2/page/component/reference_field.rb
211
215
  - lib/ecoportal/api/v2/page/component/rich_text_field.rb
@@ -214,6 +218,7 @@ files:
214
218
  - lib/ecoportal/api/v2/page/component/signature_field.rb
215
219
  - lib/ecoportal/api/v2/page/component/tag_field.rb
216
220
  - lib/ecoportal/api/v2/page/components.rb
221
+ - lib/ecoportal/api/v2/page/permission_flags.rb
217
222
  - lib/ecoportal/api/v2/page/permit.rb
218
223
  - lib/ecoportal/api/v2/page/section.rb
219
224
  - lib/ecoportal/api/v2/page/sections.rb
@@ -226,6 +231,7 @@ files:
226
231
  - lib/ecoportal/api/v2/registers.rb
227
232
  - lib/ecoportal/api/v2/registers/page_result.rb
228
233
  - lib/ecoportal/api/v2/registers/register.rb
234
+ - lib/ecoportal/api/v2/registers/search_results.rb
229
235
  - lib/ecoportal/api/v2/registers/stage_result.rb
230
236
  - lib/ecoportal/api/v2/registers/stages_result.rb
231
237
  - lib/ecoportal/api/v2/registers/template.rb