mumuki-domain 8.0.0 → 8.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (36) hide show
  1. checksums.yaml +4 -4
  2. data/app/models/assignment.rb +10 -5
  3. data/app/models/concerns/container.rb +8 -0
  4. data/app/models/concerns/with_expectations.rb +3 -7
  5. data/app/models/concerns/with_randomizations.rb +1 -2
  6. data/app/models/concerns/with_usages.rb +12 -0
  7. data/app/models/discussion.rb +4 -0
  8. data/app/models/exercise.rb +13 -3
  9. data/app/models/exercise/challenge.rb +4 -2
  10. data/app/models/exercise/problem.rb +5 -10
  11. data/app/models/indicator.rb +35 -0
  12. data/app/models/progress.rb +35 -0
  13. data/app/models/user.rb +10 -4
  14. data/db/migrate/20201130163114_add_banned_from_forum_to_users.rb +5 -0
  15. data/lib/mumuki/domain.rb +1 -0
  16. data/lib/mumuki/domain/extensions.rb +2 -0
  17. data/lib/mumuki/domain/extensions/array.rb +6 -4
  18. data/lib/mumuki/domain/extensions/hash.rb +4 -0
  19. data/lib/mumuki/domain/extensions/nil.rb +17 -0
  20. data/lib/mumuki/domain/extensions/string.rb +2 -9
  21. data/lib/mumuki/domain/extensions/symbol.rb +5 -0
  22. data/lib/mumuki/domain/helpers/organization.rb +1 -1
  23. data/lib/mumuki/domain/helpers/user.rb +22 -5
  24. data/lib/mumuki/domain/incognito.rb +9 -1
  25. data/lib/mumuki/domain/locales/activerecord/en.yml +1 -1
  26. data/lib/mumuki/domain/locales/activerecord/es-CL.yml +1 -1
  27. data/lib/mumuki/domain/locales/activerecord/es.yml +1 -1
  28. data/lib/mumuki/domain/locales/activerecord/pt.yml +1 -1
  29. data/lib/mumuki/domain/progress_transfer.rb +8 -0
  30. data/lib/mumuki/domain/progress_transfer/base.rb +44 -0
  31. data/lib/mumuki/domain/progress_transfer/copy.rb +9 -0
  32. data/lib/mumuki/domain/progress_transfer/move.rb +14 -0
  33. data/lib/mumuki/domain/status/submission/manual_evaluation_pending.rb +1 -1
  34. data/lib/mumuki/domain/status/submission/submission.rb +4 -0
  35. data/lib/mumuki/domain/version.rb +1 -1
  36. metadata +12 -5
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2e3057a4511ba66a280fe3f5bf53052a33161ecd9a45dfb6851d2dc21ea7ad20
4
- data.tar.gz: bb89fde6326417de9590369040b1d61a13ec35ea1abe8d365c0d21aa66777315
3
+ metadata.gz: 5ea9b10953e5031cfcfa680763efb0eac02e63b91219c3dbf71b0d30b5dd3250
4
+ data.tar.gz: 8fda448216e9d80cb4de41a7f43825882e043895705c66c1c6b9b4bc68c5bfec
5
5
  SHA512:
6
- metadata.gz: 586446caac1b0eeecf18d5754e1fb1120e1d0f5a87a4d386152f64af9d6f0b5f18b089676cc994c7f717baa3382b120d7ea71e011263e8761ad5b830dbfefb02
7
- data.tar.gz: 77d0ddcfaea1ffaae2d22e5cb7e9b30e08b3d6ef4d303fad9df0062294353dab7834f35fd8fdf339fa770cc233c293f6bf6173442262f11e98eef2521bf3d952
6
+ metadata.gz: f2f8f341502367fa4a7ba037eb086f0506c19fede8290aba4921430fb22e33cc338faf01bc85d23d9df89fca006dba97705e377f48c3eae789170291644562e5
7
+ data.tar.gz: e5044aa8475aba10ea9d1140eceefccd9fc36de384cf215007f4f239568aebf9f06583074249af630fff81db9da8d429604fa428db0c509a55c4f9092b25965d
@@ -23,6 +23,8 @@ class Assignment < Progress
23
23
 
24
24
  delegate :completed?, :solved?, to: :submission_status
25
25
 
26
+ delegate :content_available_in?, to: :parent
27
+
26
28
  alias_attribute :status, :submission_status
27
29
  alias_attribute :attempts_count, :attemps_count
28
30
 
@@ -52,10 +54,10 @@ class Assignment < Progress
52
54
  self.organization = Organization.current
53
55
  end
54
56
 
55
- def recontextualize!
56
- if organization != Organization.current
57
+ def recontextualize!(new_organization = Organization.current)
58
+ if organization != new_organization
57
59
  dirty_parent_by_submission! if organization.present? && exercise.used_in?(organization)
58
- self.organization = Organization.current
60
+ self.organization = new_organization
59
61
  self.parent_id = nil
60
62
  end
61
63
  end
@@ -126,7 +128,7 @@ class Assignment < Progress
126
128
  end
127
129
 
128
130
  def content=(content)
129
- if content.present?
131
+ if exercise.solvable?
130
132
  self.solution = exercise.single_choice? ? exercise.choice_index_for(content) : content
131
133
  end
132
134
  end
@@ -263,6 +265,10 @@ class Assignment < Progress
263
265
 
264
266
  private
265
267
 
268
+ def duplicates_key
269
+ { exercise: exercise, submitter: submitter }
270
+ end
271
+
266
272
  def update_submissions_count!
267
273
  self.class.connection.execute(
268
274
  "update public.exercises
@@ -278,5 +284,4 @@ class Assignment < Progress
278
284
  def update_last_submission!
279
285
  submitter.update!(last_submission_date: DateTime.current, last_exercise: exercise)
280
286
  end
281
-
282
287
  end
@@ -20,6 +20,14 @@ module Container
20
20
  content.progress_for(user, organization)
21
21
  end
22
22
 
23
+ def navigable_content_in(organization = Organization.current)
24
+ content.usage_in_organization(organization)
25
+ end
26
+
27
+ def content_used_in?(organization)
28
+ navigable_content_in(organization).present?
29
+ end
30
+
23
31
  private
24
32
 
25
33
  # Generally we are calling progress_for for each sibling. That method needs the
@@ -18,16 +18,12 @@ module WithExpectations
18
18
  self[:expectations] = expectations.map(&:stringify_keys)
19
19
  end
20
20
 
21
- def own_expectations
21
+ def raw_expectations
22
22
  self[:expectations]
23
23
  end
24
24
 
25
- def own_custom_expectations
26
- self[:custom_expectations]
27
- end
28
-
29
25
  def ensure_expectations_format
30
- errors.add :own_expectations,
31
- :invalid_format unless own_expectations.to_a.all? { |it| Mulang::Expectation.valid? it }
26
+ errors.add :raw_expectations,
27
+ :invalid_format unless raw_expectations.to_a.all? { |it| Mulang::Expectation.valid? it }
32
28
  end
33
29
  end
@@ -35,8 +35,7 @@ module WithRandomizations
35
35
 
36
36
  def randomize_field(selector)
37
37
  define_method(selector) do |*args|
38
- return unless super(*args)
39
- randomizer.randomize!(super(*args), seed)
38
+ super(*args).randomize_with randomizer, seed
40
39
  end
41
40
  end
42
41
  end
@@ -16,6 +16,18 @@ module WithUsages
16
16
  item.is_a?(type) ? item : nil
17
17
  end
18
18
 
19
+ def navigable_content_in(organization = Organization.current)
20
+ self if used_in?(organization)
21
+ end
22
+
23
+ def content_used_in?(organization)
24
+ navigable_content_in(organization).present?
25
+ end
26
+
27
+ def used_in?(organization)
28
+ usage_in_organization(organization).present?
29
+ end
30
+
19
31
  class_methods do
20
32
  def aggregate_of(association)
21
33
  super
@@ -44,6 +44,10 @@ class Discussion < ApplicationRecord
44
44
  end
45
45
  end
46
46
 
47
+ def navigable_content_in(_)
48
+ nil
49
+ end
50
+
47
51
  def used_in?(organization)
48
52
  organization == self.organization
49
53
  end
@@ -1,5 +1,5 @@
1
1
  class Exercise < ApplicationRecord
2
- RANDOMIZED_FIELDS = [:default_content, :description, :extra, :hint, :test]
2
+ RANDOMIZED_FIELDS = [:default_content, :description, :extra, :hint, :test, :expectations, :custom_expectations]
3
3
  BASIC_RESOURCE_FIELDS = %i(
4
4
  name layout editor corollary teacher_info manual_evaluation locale
5
5
  choices assistance_rules randomizations tag_list extra_visible goal
@@ -47,6 +47,14 @@ class Exercise < ApplicationRecord
47
47
  guide.usage_in_organization(organization).present?
48
48
  end
49
49
 
50
+ def navigable_content_in(organization = Organization.current)
51
+ self if used_in?(organization)
52
+ end
53
+
54
+ def content_used_in?(organization)
55
+ navigable_content_in(organization).present?
56
+ end
57
+
50
58
  def structural_parent
51
59
  guide
52
60
  end
@@ -127,8 +135,6 @@ class Exercise < ApplicationRecord
127
135
  language_resource_h = language.to_embedded_resource_h if language != guide.language
128
136
  as_json(only: BASIC_RESOURCE_FIELDS)
129
137
  .merge(id: bibliotheca_id, language: language_resource_h, type: type.underscore)
130
- .merge(expectations: self[:expectations])
131
- .merge(custom_expectations: self[:custom_expectations])
132
138
  .merge(settings: self[:settings])
133
139
  .merge(RANDOMIZED_FIELDS.map { |it| [it, self[it]] }.to_h)
134
140
  .symbolize_keys
@@ -231,6 +237,10 @@ class Exercise < ApplicationRecord
231
237
  guide.pending_exercises(user)
232
238
  end
233
239
 
240
+ def solvable?
241
+ is_a? ::Problem
242
+ end
243
+
234
244
  private
235
245
 
236
246
  def evaluation_class
@@ -8,8 +8,10 @@ class Challenge < Exercise
8
8
  self.layout = self.class.default_layout
9
9
  end
10
10
 
11
- def extra(*)
12
- [guide.extra, super]
11
+ alias_method :own_extra, :extra
12
+
13
+ def extra
14
+ [guide.extra, own_extra]
13
15
  .compact
14
16
  .join("\n")
15
17
  .strip
@@ -21,20 +21,15 @@ class Problem < QueriableChallenge
21
21
  self.expectations = []
22
22
  end
23
23
 
24
+ alias_method :own_expectations, :expectations
25
+ alias_method :own_custom_expectations, :custom_expectations
26
+
24
27
  def expectations
25
- own_expectations + guide_expectations
28
+ own_expectations + guide.expectations
26
29
  end
27
30
 
28
31
  def custom_expectations
29
- "#{own_custom_expectations}\n#{guide_custom_expectations}"
30
- end
31
-
32
- def guide_expectations
33
- guide.expectations
34
- end
35
-
36
- def guide_custom_expectations
37
- guide.custom_expectations
32
+ "#{own_custom_expectations}\n#{guide.custom_expectations}"
38
33
  end
39
34
 
40
35
  def evaluation_criteria?
@@ -66,8 +66,43 @@ class Indicator < Progress
66
66
  where(content: content, organization: organization).delete_all
67
67
  end
68
68
 
69
+ def _move_to!(organization)
70
+ move_children_to!(organization)
71
+ super
72
+ end
73
+
74
+ def _copy_to!(organization)
75
+ progress_item = super
76
+ children.each { |it| it._copy_to! organization }
77
+ progress_item
78
+ end
79
+
80
+ def move_children_to!(organization)
81
+ children.update_all(organization_id: organization.id)
82
+
83
+ indicators.each { |it| it.move_children_to!(organization) }
84
+ end
85
+
86
+ def cascade_delete_children!
87
+ indicators.each(&:cascade_delete_children!)
88
+ children.delete_all(:delete_all)
89
+ end
90
+
91
+ def content_available_in?(organization)
92
+ content.usage_in_organization(organization).present?
93
+ end
94
+
95
+ def delete_duplicates_in!(organization)
96
+ duplicates_in(organization).each(&:cascade_delete_children!)
97
+ super
98
+ end
99
+
69
100
  private
70
101
 
102
+ def duplicates_key
103
+ { content: content, user: user }
104
+ end
105
+
71
106
  def children
72
107
  indicators.presence || assignments
73
108
  end
@@ -12,4 +12,39 @@ class Progress < ApplicationRecord
12
12
  def dirty_parent_by_submission!
13
13
  parent&.dirty_by_submission!
14
14
  end
15
+
16
+ def _copy_to!(organization)
17
+ dup.transfer_to!(organization)
18
+ end
19
+
20
+ def transfer_to!(organization)
21
+ update! organization: organization, parent: nil
22
+ self
23
+ end
24
+
25
+ alias_method :_move_to!, :transfer_to!
26
+
27
+ %w(copy move).each do |transfer_type|
28
+ define_method "#{transfer_type}_to!" do |organization|
29
+ "Mumuki::Domain::ProgressTransfer::#{transfer_type.camelize}".constantize.new(self, organization).execute!
30
+ end
31
+ end
32
+
33
+ def guide_indicator?
34
+ is_a?(Indicator) && content_type == 'Guide'
35
+ end
36
+
37
+ def has_duplicates_in?(organization)
38
+ duplicates_in(organization).present?
39
+ end
40
+
41
+ def delete_duplicates_in!(organization)
42
+ duplicates_in(organization).delete_all
43
+ end
44
+
45
+ private
46
+
47
+ def duplicates_in(organization)
48
+ self.class.where(duplicates_key.merge(organization: organization)).where.not(id: id)
49
+ end
15
50
  end
@@ -182,7 +182,7 @@ class User < ApplicationRecord
182
182
  # This is true only when this organization has the forum enabled and the user
183
183
  # has the discusser pseudo-permission and the discusser is trusted
184
184
  def can_discuss_in?(organization)
185
- organization.forum_enabled? && discusser_of?(organization) && trusted_as_discusser_in?(organization)
185
+ organization.forum_enabled? && discusser_of?(organization) && trusted_as_discusser_in?(organization) && !banned_from_forum?
186
186
  end
187
187
 
188
188
  def trusted_as_discusser_in?(organization)
@@ -243,9 +243,9 @@ class User < ApplicationRecord
243
243
  Organization.current? ? Organization.current : main_organization
244
244
  end
245
245
 
246
- def current_immersive_context_at(exercise)
246
+ def current_immersive_context_at(path_item)
247
247
  if Organization.current?
248
- immersive_organization_at(exercise) || Organization.current
248
+ immersive_organization_at(path_item) || Organization.current
249
249
  else
250
250
  main_organization
251
251
  end
@@ -259,13 +259,19 @@ class User < ApplicationRecord
259
259
  new_permissions: permissions.as_json
260
260
  }
261
261
  end
262
-
262
+
263
263
  def save_and_notify!
264
264
  save!
265
265
  notify_permissions_changed!
266
266
  self
267
267
  end
268
268
 
269
+ def current_immersive_context_and_content_at(path_item)
270
+ immersive_organization_with_content_at(path_item).tap do |orga, _|
271
+ return [Organization.current, path_item] unless orga.present?
272
+ end
273
+ end
274
+
269
275
  private
270
276
 
271
277
  def welcome_to_new_organizations!
@@ -0,0 +1,5 @@
1
+ class AddBannedFromForumToUsers < ActiveRecord::Migration[5.1]
2
+ def change
3
+ add_column :users, :banned_from_forum, :boolean
4
+ end
5
+ end
@@ -38,6 +38,7 @@ require_relative './domain/workspace'
38
38
  require_relative './domain/helpers'
39
39
  require_relative './domain/syncable'
40
40
  require_relative './domain/store'
41
+ require_relative './domain/progress_transfer'
41
42
 
42
43
  class Mumukit::Assistant
43
44
  def self.valid?(rules)
@@ -1,5 +1,7 @@
1
1
  require_relative './extensions/string'
2
+ require_relative './extensions/symbol'
2
3
  require_relative './extensions/array'
3
4
  require_relative './extensions/module'
4
5
  require_relative './extensions/hash'
6
+ require_relative './extensions/nil'
5
7
  require_relative './extensions/time'
@@ -15,10 +15,12 @@ class Array
15
15
  def single?
16
16
  size == 1
17
17
  end
18
- end
19
18
 
20
- class NilClass
21
- def insert_last(element)
22
- [element]
19
+ def multiple?
20
+ size > 1
21
+ end
22
+
23
+ def randomize_with(randomizer, seed)
24
+ map { |it| it.randomize_with randomizer, seed }
23
25
  end
24
26
  end
@@ -11,4 +11,8 @@ class Hash
11
11
  def markdownified(*keys, **options)
12
12
  map { |k, v| key.in?(keys) ? v.markdownified(options) : v }.to_h
13
13
  end
14
+
15
+ def randomize_with(randomizer, seed)
16
+ transform_values { |v| v.randomize_with randomizer, seed }
17
+ end
14
18
  end
@@ -0,0 +1,17 @@
1
+ class NilClass
2
+ def affable
3
+ end
4
+
5
+ def markdownified(**options)
6
+ end
7
+
8
+ def sanitized
9
+ end
10
+
11
+ def randomize_with(randomizer, seed)
12
+ end
13
+
14
+ def insert_last(element)
15
+ [element]
16
+ end
17
+ end
@@ -59,15 +59,8 @@ class String
59
59
  def sanitized
60
60
  Mumukit::ContentType::Sanitizer.sanitize self
61
61
  end
62
- end
63
-
64
- class NilClass
65
- def affable
66
- end
67
62
 
68
- def markdownified(**options)
69
- end
70
-
71
- def sanitized
63
+ def randomize_with(randomizer, seed)
64
+ randomizer.randomize!(self, seed)
72
65
  end
73
66
  end
@@ -0,0 +1,5 @@
1
+ class Symbol
2
+ def randomize_with(randomizer, seed)
3
+ self.to_s.randomize_with(randomizer, seed).to_sym
4
+ end
5
+ end
@@ -29,7 +29,7 @@ module Mumuki::Domain::Helpers::Organization
29
29
  end
30
30
 
31
31
  def immersed_in?(other)
32
- immersible? && other.immersive? && target_audience == other.target_audience
32
+ immersible? && other.immersive? && !other.disabled? && target_audience == other.target_audience
33
33
  end
34
34
 
35
35
  def switch!
@@ -101,12 +101,21 @@ module Mumuki::Domain::Helpers::User
101
101
  end
102
102
 
103
103
  def immersive_organizations_at(path_item, current = Organization.current)
104
- return [] unless current.immersible?
105
-
106
104
  usage_filter = path_item ? lambda { |it| path_item.used_in?(it) } : lambda { |_| true }
107
- student_granted_organizations
108
- .select { |it| current.immersed_in?(it) }
109
- .select(&usage_filter)
105
+ immersive_organizations_for(current).select(&usage_filter)
106
+ end
107
+
108
+ def immersive_organization_with_content_at(path_item, current = Organization.current)
109
+ orga = immersive_organizations_with_content_at(path_item, current).single
110
+ [orga, path_item&.navigable_content_in(orga)]
111
+ end
112
+
113
+ def immersive_organizations_with_content_at(path_item, current = Organization.current)
114
+ immersive_without_usage = immersive_organizations_for(current)
115
+ return immersive_without_usage unless path_item.present?
116
+
117
+ immersive_with_usage = immersive_without_usage.select { |it| path_item.content_used_in? it }
118
+ immersive_with_usage.empty? ? immersive_without_usage : immersive_with_usage
110
119
  end
111
120
 
112
121
  ## API Exposure
@@ -120,4 +129,12 @@ module Mumuki::Domain::Helpers::User
120
129
  [:first_name, :last_name, :gender, :birthdate]
121
130
  end
122
131
  end
132
+
133
+ private
134
+
135
+ def immersive_organizations_for(organization)
136
+ return [] unless organization.immersible?
137
+
138
+ student_granted_organizations.select { |it| organization.immersed_in?(it) }
139
+ end
123
140
  end
@@ -52,7 +52,15 @@ module Mumuki::Domain
52
52
  nil
53
53
  end
54
54
 
55
- def immersive_organizations_at(_)
55
+ def current_immersive_context_and_content_at(_)
56
+ [nil, nil]
57
+ end
58
+
59
+ def immersive_organizations_with_content_at(_, _ = nil)
60
+ []
61
+ end
62
+
63
+ def immersive_organizations_at(_, _ = nil)
56
64
  []
57
65
  end
58
66
 
@@ -15,7 +15,7 @@ en:
15
15
  attributes:
16
16
  randomizations:
17
17
  invalid_format: 'format is invalid'
18
- own_expectations:
18
+ raw_expectations:
19
19
  invalid_format: 'format is invalid'
20
20
  assistance_rules:
21
21
  invalid_format: 'format is invalid'
@@ -32,7 +32,7 @@ es-CL:
32
32
  attributes:
33
33
  randomizations:
34
34
  invalid_format: 'formato inválido'
35
- own_expectations:
35
+ raw_expectations:
36
36
  invalid_format: 'formato inválido'
37
37
  assistance_rules:
38
38
  invalid_format: 'formato inválido'
@@ -32,7 +32,7 @@ es:
32
32
  attributes:
33
33
  randomizations:
34
34
  invalid_format: 'formato inválido'
35
- own_expectations:
35
+ raw_expectations:
36
36
  invalid_format: 'formato inválido'
37
37
  assistance_rules:
38
38
  invalid_format: 'formato inválido'
@@ -15,7 +15,7 @@ pt:
15
15
  attributes:
16
16
  randomizations:
17
17
  invalid_format: 'o formato é inválido'
18
- own_expectations:
18
+ raw_expectations:
19
19
  invalid_format: 'o formato é inválido'
20
20
  assistance_rules:
21
21
  invalid_format: 'o formato é inválido'
@@ -0,0 +1,8 @@
1
+ module Mumuki::Domain
2
+ module ProgressTransfer
3
+ end
4
+ end
5
+
6
+ require_relative './progress_transfer/base'
7
+ require_relative './progress_transfer/move'
8
+ require_relative './progress_transfer/copy'
@@ -0,0 +1,44 @@
1
+ class Mumuki::Domain::ProgressTransfer::Base
2
+ attr_reader *%i(source_organization destination_organization progress_item transferred_item)
3
+
4
+ delegate :user, to: :progress_item
5
+
6
+ def initialize(progress_item, destination_organization)
7
+ @progress_item = progress_item
8
+ @destination_organization = destination_organization
9
+ end
10
+
11
+ def execute!
12
+ ActiveRecord::Base.transaction do
13
+ pre_transfer!
14
+ transfer!
15
+ post_transfer!
16
+ end
17
+ end
18
+
19
+ def pre_transfer!
20
+ validate_transferrable!
21
+ @source_organization = progress_item.organization
22
+ progress_item.delete_duplicates_in!(destination_organization)
23
+ end
24
+
25
+ def transfer!
26
+ @transferred_item = do_transfer!
27
+ end
28
+
29
+ def post_transfer!
30
+ transferred_item.dirty_parent_by_submission!
31
+ notify_transfer!
32
+ transferred_item
33
+ end
34
+
35
+ def validate_transferrable!
36
+ raise "Transferred progress' content must be available in destination!" unless progress_item.content_available_in?(destination_organization)
37
+ raise 'User must be student in destination organization' unless user.student_of?(destination_organization)
38
+ raise 'Transfer only supported for guide indicators' unless progress_item.guide_indicator?
39
+ end
40
+
41
+ def notify_transfer!
42
+ Mumukit::Nuntius.notify! 'progress-transfers', { from: source_organization.name, to: destination_organization.name, item_type: transferred_item.class.to_s, item_id: transferred_item.id, transfer_type: transfer_type }
43
+ end
44
+ end
@@ -0,0 +1,9 @@
1
+ class Mumuki::Domain::ProgressTransfer::Copy < Mumuki::Domain::ProgressTransfer::Base
2
+ def transfer_type
3
+ :copy
4
+ end
5
+
6
+ def do_transfer!
7
+ progress_item._copy_to!(destination_organization)
8
+ end
9
+ end
@@ -0,0 +1,14 @@
1
+ class Mumuki::Domain::ProgressTransfer::Move < Mumuki::Domain::ProgressTransfer::Base
2
+ def transfer_type
3
+ :move
4
+ end
5
+
6
+ def pre_transfer!
7
+ super
8
+ progress_item.dirty_parent_by_submission!
9
+ end
10
+
11
+ def do_transfer!
12
+ progress_item._move_to!(destination_organization)
13
+ end
14
+ end
@@ -10,6 +10,6 @@ module Mumuki::Domain::Status::Submission::ManualEvaluationPending
10
10
  end
11
11
 
12
12
  def self.iconize
13
- {class: :info, type: 'clock-o'}
13
+ {class: :info, type: 'clock'}
14
14
  end
15
15
  end
@@ -50,4 +50,8 @@ module Mumuki::Domain::Status::Submission
50
50
  def exp_given
51
51
  0
52
52
  end
53
+
54
+ def dup
55
+ self
56
+ end
53
57
  end
@@ -1,5 +1,5 @@
1
1
  module Mumuki
2
2
  module Domain
3
- VERSION = '8.0.0'
3
+ VERSION = '8.2.0'
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mumuki-domain
3
3
  version: !ruby/object:Gem::Version
4
- version: 8.0.0
4
+ version: 8.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Franco Leonardo Bulgarelli
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-11-20 00:00:00.000000000 Z
11
+ date: 2021-01-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -128,14 +128,14 @@ dependencies:
128
128
  requirements:
129
129
  - - "~>"
130
130
  - !ruby/object:Gem::Version
131
- version: '6.0'
131
+ version: '6.1'
132
132
  type: :runtime
133
133
  prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
136
  - - "~>"
137
137
  - !ruby/object:Gem::Version
138
- version: '6.0'
138
+ version: '6.1'
139
139
  - !ruby/object:Gem::Dependency
140
140
  name: mumukit-sync
141
141
  requirement: !ruby/object:Gem::Requirement
@@ -636,6 +636,7 @@ files:
636
636
  - db/migrate/20201026225312_add_organization_wins_page_flag.rb
637
637
  - db/migrate/20201027134205_add_immersible_to_organization.rb
638
638
  - db/migrate/20201027152806_create_terms.rb
639
+ - db/migrate/20201130163114_add_banned_from_forum_to_users.rb
639
640
  - lib/mumuki/domain.rb
640
641
  - lib/mumuki/domain/area.rb
641
642
  - lib/mumuki/domain/engine.rb
@@ -655,7 +656,9 @@ files:
655
656
  - lib/mumuki/domain/extensions/array.rb
656
657
  - lib/mumuki/domain/extensions/hash.rb
657
658
  - lib/mumuki/domain/extensions/module.rb
659
+ - lib/mumuki/domain/extensions/nil.rb
658
660
  - lib/mumuki/domain/extensions/string.rb
661
+ - lib/mumuki/domain/extensions/symbol.rb
659
662
  - lib/mumuki/domain/extensions/time.rb
660
663
  - lib/mumuki/domain/factories.rb
661
664
  - lib/mumuki/domain/factories/api_client_factory.rb
@@ -701,6 +704,10 @@ files:
701
704
  - lib/mumuki/domain/organization/profile.rb
702
705
  - lib/mumuki/domain/organization/settings.rb
703
706
  - lib/mumuki/domain/organization/theme.rb
707
+ - lib/mumuki/domain/progress_transfer.rb
708
+ - lib/mumuki/domain/progress_transfer/base.rb
709
+ - lib/mumuki/domain/progress_transfer/copy.rb
710
+ - lib/mumuki/domain/progress_transfer/move.rb
704
711
  - lib/mumuki/domain/seed.rb
705
712
  - lib/mumuki/domain/status.rb
706
713
  - lib/mumuki/domain/status/discussion/closed.rb
@@ -756,7 +763,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
756
763
  - !ruby/object:Gem::Version
757
764
  version: '0'
758
765
  requirements: []
759
- rubygems_version: 3.0.8
766
+ rubygems_version: 3.0.3
760
767
  signing_key:
761
768
  specification_version: 4
762
769
  summary: Mumuki Platform's Domain Model