mumuki-domain 7.10.1 → 7.11.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/app/models/application_record.rb +10 -0
- data/app/models/assignment.rb +13 -2
- data/app/models/avatar.rb +2 -0
- data/app/models/concerns/awardee.rb +27 -0
- data/app/models/concerns/contextualization.rb +6 -2
- data/app/models/concerns/with_description.rb +2 -5
- data/app/models/concerns/with_medal.rb +7 -0
- data/app/models/concerns/with_progress.rb +4 -0
- data/app/models/content.rb +3 -2
- data/app/models/discussion.rb +8 -1
- data/app/models/indicator.rb +14 -1
- data/app/models/medal.rb +3 -0
- data/app/models/organization.rb +51 -4
- data/app/models/usage.rb +5 -0
- data/app/models/user.rb +14 -9
- data/db/migrate/20200828152812_create_medals.rb +8 -0
- data/db/migrate/20200828162829_add_medal_to_content.rb +7 -0
- data/db/migrate/20200915123020_add_polymorphic_avatars_to_users.rb +6 -0
- data/db/migrate/20200915131621_add_once_completed_to_indicators.rb +5 -0
- data/db/migrate/20201009193949_add_status_updated_fields_to_discussion.rb +6 -0
- data/db/migrate/20201019191036_add_misplaced_flag_to_submission.rb +5 -0
- data/db/migrate/20201026222942_add_display_name_and_description_to_organizations.rb +6 -0
- data/db/migrate/20201026225312_add_organization_wins_page_flag.rb +5 -0
- data/db/migrate/20201027134205_add_immersible_to_organization.rb +5 -0
- data/lib/mumuki/domain/extensions/array.rb +13 -0
- data/lib/mumuki/domain/factories.rb +2 -1
- data/lib/mumuki/domain/factories/medal_factory.rb +6 -0
- data/lib/mumuki/domain/factories/organization_factory.rb +1 -0
- data/lib/mumuki/domain/helpers/organization.rb +4 -0
- data/lib/mumuki/domain/helpers/user.rb +17 -1
- data/lib/mumuki/domain/incognito.rb +8 -0
- data/lib/mumuki/domain/locales/activerecord/en.yml +2 -0
- data/lib/mumuki/domain/locales/activerecord/es.yml +2 -0
- data/lib/mumuki/domain/locales/defaults/en.yml +4 -0
- data/lib/mumuki/domain/locales/defaults/es-CL.yml +4 -0
- data/lib/mumuki/domain/locales/defaults/es.yml +4 -0
- data/lib/mumuki/domain/locales/defaults/pt.yml +4 -0
- data/lib/mumuki/domain/version.rb +1 -1
- metadata +19 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 17efbb5ea487285cf39720f0f3bcaab94641669a8f0ba83c78b8931c8ff949b2
|
4
|
+
data.tar.gz: a6213b8093643e8112ffc85609fbae72c871c343f9374e17ba024ee1b9eb73c3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 821da987d9bc224d803554e8f44f54c200f5dcc9fd38ad90a793e5fb640ad946cf059276a534d8004a84386f2ef75fa448b666b4054049b48dbfb8e76bcce32e
|
7
|
+
data.tar.gz: 4b92ea6a719cd03dc2b3c9e338cdb470b86a22f9764b0dff4a61f9a5173bee1d389de9d7396cf55b78cf23d63222ecaca6be6ccf14e2cc83d7de0cabc57a090b
|
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
[![Build Status](https://travis-ci.
|
1
|
+
[![Build Status](https://travis-ci.com/mumuki/mumuki-domain.svg?branch=master)](https://travis-ci.com/mumuki/mumuki-domain)
|
2
2
|
[![Code Climate](https://codeclimate.com/github/mumuki/mumuki-domain/badges/gpa.svg)](https://codeclimate.com/github/mumuki/mumuki-domain)
|
3
3
|
[![Test Coverage](https://codeclimate.com/github/mumuki/mumuki-domain/badges/coverage.svg)](https://codeclimate.com/github/mumuki/mumuki-domain)
|
4
4
|
[![Issue Count](https://codeclimate.com/github/mumuki/mumuki-domain/badges/issue_count.svg)](https://codeclimate.com/github/mumuki/mumuki-domain)
|
@@ -3,6 +3,16 @@ class ApplicationRecord < ActiveRecord::Base
|
|
3
3
|
|
4
4
|
delegate :whitelist_attributes, to: :class
|
5
5
|
|
6
|
+
def self.teaser_on(*args)
|
7
|
+
args.each do |selector|
|
8
|
+
teaser_selector = "#{selector}_teaser"
|
9
|
+
define_method teaser_selector do
|
10
|
+
send(selector)&.markdown_paragraphs&.first
|
11
|
+
end
|
12
|
+
markdown_on teaser_selector, skip_sanitization: true
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
6
16
|
def self.defaults(&block)
|
7
17
|
after_initialize :defaults, if: :new_record?
|
8
18
|
define_method :defaults, &block
|
data/app/models/assignment.rb
CHANGED
@@ -91,7 +91,14 @@ class Assignment < Progress
|
|
91
91
|
end
|
92
92
|
|
93
93
|
def notify!
|
94
|
-
|
94
|
+
unless Organization.silenced?
|
95
|
+
update_misplaced!(current_notification_contexts.size > 1)
|
96
|
+
Mumukit::Nuntius.notify! 'submissions', to_resource_h
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
def current_notification_contexts
|
101
|
+
[Organization.current, submitter.current_immersive_context_at(exercise)].uniq
|
95
102
|
end
|
96
103
|
|
97
104
|
def notify_to_accessible_organizations!
|
@@ -169,7 +176,7 @@ class Assignment < Progress
|
|
169
176
|
|
170
177
|
def to_resource_h
|
171
178
|
excluded_fields = %i(created_at exercise_id id organization_id parent_id solution submission_id
|
172
|
-
submission_status submitted_at submitter_id top_submission_status updated_at)
|
179
|
+
submission_status submitted_at submitter_id top_submission_status updated_at misplaced)
|
173
180
|
|
174
181
|
as_json(except: excluded_fields,
|
175
182
|
include: {
|
@@ -238,6 +245,10 @@ class Assignment < Progress
|
|
238
245
|
self.top_submission_status = submission_status unless submission_status.improved_by?(top_submission_status)
|
239
246
|
end
|
240
247
|
|
248
|
+
def update_misplaced!(value)
|
249
|
+
update! misplaced: value if value != misplaced?
|
250
|
+
end
|
251
|
+
|
241
252
|
private
|
242
253
|
|
243
254
|
def update_submissions_count!
|
data/app/models/avatar.rb
CHANGED
@@ -0,0 +1,27 @@
|
|
1
|
+
module Awardee
|
2
|
+
def acquired_medals(organization=Organization.current)
|
3
|
+
@acquired_medals ||= medals_for awarded_contents_in(organization)
|
4
|
+
end
|
5
|
+
|
6
|
+
def unacquired_medals(organization=Organization.current)
|
7
|
+
@unacquired_medals ||= medals_for unawarded_contents_in(organization)
|
8
|
+
end
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def medals_for(content)
|
13
|
+
content.map(&:medal)
|
14
|
+
end
|
15
|
+
|
16
|
+
def awarded_contents_in(organization)
|
17
|
+
awardable_contents_in(organization).first
|
18
|
+
end
|
19
|
+
|
20
|
+
def unawarded_contents_in(organization)
|
21
|
+
awardable_contents_in(organization).second
|
22
|
+
end
|
23
|
+
|
24
|
+
def awardable_contents_in(organization)
|
25
|
+
@awardable_contents_in ||= organization.awardable_contents.partition { |c| c.once_completed_for? self, organization }
|
26
|
+
end
|
27
|
+
end
|
@@ -51,7 +51,7 @@ module Contextualization
|
|
51
51
|
end
|
52
52
|
|
53
53
|
def single_visible_test_result?
|
54
|
-
test_results.
|
54
|
+
test_results.single? && visible_success_output?
|
55
55
|
end
|
56
56
|
|
57
57
|
def first_test_result
|
@@ -131,8 +131,12 @@ module Contextualization
|
|
131
131
|
.compact
|
132
132
|
.merge(
|
133
133
|
title: it[:title].affable,
|
134
|
-
result: it[:result]
|
134
|
+
result: it[:result],
|
135
135
|
status: it[:status])
|
136
136
|
end
|
137
137
|
end
|
138
|
+
|
139
|
+
def sanitized_affable_test_results
|
140
|
+
affable_test_results.each { |it| it[:result] = it[:result]&.sanitized }
|
141
|
+
end
|
138
142
|
end
|
@@ -2,11 +2,8 @@ module WithDescription
|
|
2
2
|
extend ActiveSupport::Concern
|
3
3
|
|
4
4
|
included do
|
5
|
-
markdown_on :description,
|
5
|
+
markdown_on :description, skip_sanitization: true
|
6
|
+
teaser_on :description
|
6
7
|
validates_presence_of :description
|
7
8
|
end
|
8
|
-
|
9
|
-
def description_teaser
|
10
|
-
description.markdown_paragraphs.first
|
11
|
-
end
|
12
9
|
end
|
@@ -23,6 +23,10 @@ module WithProgress
|
|
23
23
|
progress_for(user, organization).completed?
|
24
24
|
end
|
25
25
|
|
26
|
+
def once_completed_for?(user, organization)
|
27
|
+
progress_for(user, organization).once_completed?
|
28
|
+
end
|
29
|
+
|
26
30
|
private
|
27
31
|
|
28
32
|
def structural_children_changed?(old_structural_children)
|
data/app/models/content.rb
CHANGED
@@ -4,10 +4,11 @@ class Content < ApplicationRecord
|
|
4
4
|
include Mumuki::Domain::Syncable
|
5
5
|
include WithDescription
|
6
6
|
include WithLocale
|
7
|
-
include
|
8
|
-
include WithUsages
|
7
|
+
include WithMedal
|
9
8
|
include WithName
|
10
9
|
include WithProgress
|
10
|
+
include WithSlug
|
11
|
+
include WithUsages
|
11
12
|
|
12
13
|
def to_resource_h(*args)
|
13
14
|
to_expanded_resource_h(*args).compact
|
data/app/models/discussion.rb
CHANGED
@@ -4,7 +4,10 @@ class Discussion < ApplicationRecord
|
|
4
4
|
belongs_to :item, polymorphic: true
|
5
5
|
has_many :messages, -> { order(:created_at) }, dependent: :destroy
|
6
6
|
belongs_to :initiator, class_name: 'User'
|
7
|
+
|
7
8
|
belongs_to :last_moderator_access_by, class_name: 'User', optional: true
|
9
|
+
belongs_to :status_updated_by, class_name: 'User', optional: true
|
10
|
+
|
8
11
|
belongs_to :exercise, foreign_type: :exercise, foreign_key: 'item_id'
|
9
12
|
belongs_to :organization
|
10
13
|
has_many :subscriptions
|
@@ -106,7 +109,11 @@ class Discussion < ApplicationRecord
|
|
106
109
|
end
|
107
110
|
|
108
111
|
def update_status!(status, user)
|
109
|
-
|
112
|
+
if reachable_status_for?(user, status)
|
113
|
+
update! status: status,
|
114
|
+
status_updated_by: user,
|
115
|
+
status_updated_at: Time.now
|
116
|
+
end
|
110
117
|
end
|
111
118
|
|
112
119
|
def has_messages?
|
data/app/models/indicator.rb
CHANGED
@@ -37,6 +37,7 @@ class Indicator < Progress
|
|
37
37
|
def clean!
|
38
38
|
self.dirty_by_submission = false
|
39
39
|
self.dirty_by_content_change = false
|
40
|
+
self.once_completed ||= all_children_passed?
|
40
41
|
end
|
41
42
|
|
42
43
|
def refresh_children_count!
|
@@ -54,7 +55,15 @@ class Indicator < Progress
|
|
54
55
|
|
55
56
|
def completed?
|
56
57
|
rebuild!
|
57
|
-
|
58
|
+
all_children_passed?
|
59
|
+
end
|
60
|
+
|
61
|
+
def once_completed?
|
62
|
+
self.once_completed || completed?
|
63
|
+
end
|
64
|
+
|
65
|
+
def self.delete_all_for!(content, organization)
|
66
|
+
where(content: content, organization: organization).delete_all
|
58
67
|
end
|
59
68
|
|
60
69
|
private
|
@@ -74,4 +83,8 @@ class Indicator < Progress
|
|
74
83
|
def parent_content
|
75
84
|
content.usage_in_organization(organization).structural_parent
|
76
85
|
end
|
86
|
+
|
87
|
+
def all_children_passed?
|
88
|
+
children_passed_count == children_count
|
89
|
+
end
|
77
90
|
end
|
data/app/models/medal.rb
ADDED
data/app/models/organization.rb
CHANGED
@@ -11,10 +11,12 @@ class Organization < ApplicationRecord
|
|
11
11
|
serialize :settings, Mumuki::Domain::Organization::Settings
|
12
12
|
serialize :theme, Mumuki::Domain::Organization::Theme
|
13
13
|
|
14
|
-
markdown_on :description
|
14
|
+
markdown_on :description, :display_description, :page_description
|
15
|
+
teaser_on :display_description
|
15
16
|
|
16
17
|
validate :ensure_consistent_public_login
|
17
18
|
validate :ensure_valid_activity_range
|
19
|
+
validate :ensure_not_immersive_and_immersible
|
18
20
|
|
19
21
|
belongs_to :book
|
20
22
|
has_many :usages
|
@@ -97,11 +99,13 @@ class Organization < ApplicationRecord
|
|
97
99
|
end
|
98
100
|
|
99
101
|
def title_suffix
|
100
|
-
|
102
|
+
warn "Don't use title_suffix. Use page_name instead"
|
103
|
+
" - #{page_name}"
|
101
104
|
end
|
102
105
|
|
103
106
|
def site_name
|
104
|
-
|
107
|
+
warn "Don't use site_name. Use display_name instead"
|
108
|
+
name
|
105
109
|
end
|
106
110
|
|
107
111
|
# Tells if the given user can
|
@@ -130,12 +134,55 @@ class Organization < ApplicationRecord
|
|
130
134
|
update! progressive_display_lookahead: lookahead
|
131
135
|
end
|
132
136
|
|
137
|
+
def progressive_display_lookahead=(lookahead)
|
138
|
+
self[:progressive_display_lookahead] = lookahead.to_i.positive? ? lookahead : nil
|
139
|
+
end
|
140
|
+
|
141
|
+
# ==============
|
142
|
+
# Display fields
|
143
|
+
# ==============
|
144
|
+
|
133
145
|
def display_name
|
134
|
-
name.try { |it| it.gsub(/\W/, ' ').titleize }
|
146
|
+
self[:display_name].presence || name.try { |it| it.gsub(/\W/, ' ').titleize }
|
147
|
+
end
|
148
|
+
|
149
|
+
def display_description
|
150
|
+
self[:display_description].presence || I18n.t('defaults.organization.display_description', name: name)
|
151
|
+
end
|
152
|
+
|
153
|
+
# ===========
|
154
|
+
# Page fields
|
155
|
+
# ===========
|
156
|
+
|
157
|
+
# Since an organization has a single book, both concepts may be merged
|
158
|
+
# when describing a site. In such contexts, wins_page?
|
159
|
+
# control whether the book or the organization header fields are
|
160
|
+
# more important
|
161
|
+
|
162
|
+
def page_name
|
163
|
+
wins_page? ? display_name : book.name
|
164
|
+
end
|
165
|
+
|
166
|
+
def page_description
|
167
|
+
wins_page? ? display_description : book.description
|
168
|
+
end
|
169
|
+
|
170
|
+
def all_contents
|
171
|
+
Usage.where(organization: self)
|
172
|
+
.group_by(&:item_type)
|
173
|
+
.flat_map { |item_type, item| item_type.constantize.where(id: item.map(&:item_id)) }
|
174
|
+
end
|
175
|
+
|
176
|
+
def awardable_contents
|
177
|
+
gamification_enabled? ? all_contents.select(&:medal_id) : []
|
135
178
|
end
|
136
179
|
|
137
180
|
private
|
138
181
|
|
182
|
+
def ensure_not_immersive_and_immersible
|
183
|
+
errors.add(:immersible, :cannot_be_immersive) if immersible? && immersive?
|
184
|
+
end
|
185
|
+
|
139
186
|
def ensure_consistent_public_login
|
140
187
|
errors.add(:base, :consistent_public_login) if settings.customized_login_methods? && public?
|
141
188
|
end
|
data/app/models/usage.rb
CHANGED
@@ -8,6 +8,7 @@ class Usage < ApplicationRecord
|
|
8
8
|
|
9
9
|
before_save :set_slug
|
10
10
|
before_destroy :destroy_children_usages!
|
11
|
+
before_destroy :delete_associated_indicators!
|
11
12
|
|
12
13
|
def self.destroy_all_where(query)
|
13
14
|
where(query).destroy_all
|
@@ -27,6 +28,10 @@ class Usage < ApplicationRecord
|
|
27
28
|
|
28
29
|
private
|
29
30
|
|
31
|
+
def delete_associated_indicators!
|
32
|
+
Indicator.delete_all_for!(item, organization)
|
33
|
+
end
|
34
|
+
|
30
35
|
def set_slug
|
31
36
|
self.slug = item.slug
|
32
37
|
end
|
data/app/models/user.rb
CHANGED
@@ -4,6 +4,7 @@ class User < ApplicationRecord
|
|
4
4
|
WithUserNavigation,
|
5
5
|
WithReminders,
|
6
6
|
WithDiscussionCreation,
|
7
|
+
Awardee,
|
7
8
|
Disabling,
|
8
9
|
Mumuki::Domain::Helpers::User
|
9
10
|
|
@@ -31,7 +32,7 @@ class User < ApplicationRecord
|
|
31
32
|
has_many :exams, through: :exam_authorizations
|
32
33
|
|
33
34
|
enum gender: %i(female male other unspecified)
|
34
|
-
belongs_to :avatar, optional: true
|
35
|
+
belongs_to :avatar, polymorphic: true, optional: true
|
35
36
|
|
36
37
|
before_validation :set_uid!
|
37
38
|
validates :uid, presence: true
|
@@ -236,6 +237,18 @@ class User < ApplicationRecord
|
|
236
237
|
end
|
237
238
|
end
|
238
239
|
|
240
|
+
def current_organic_context
|
241
|
+
Organization.current? ? Organization.current : main_organization
|
242
|
+
end
|
243
|
+
|
244
|
+
def current_immersive_context_at(exercise)
|
245
|
+
if Organization.current?
|
246
|
+
immersive_organization_at(exercise) || Organization.current
|
247
|
+
else
|
248
|
+
main_organization
|
249
|
+
end
|
250
|
+
end
|
251
|
+
|
239
252
|
private
|
240
253
|
|
241
254
|
def welcome_to_new_organizations!
|
@@ -289,12 +302,4 @@ class User < ApplicationRecord
|
|
289
302
|
def self.buried_profile
|
290
303
|
(@buried_profile || {}).slice(:first_name, :last_name, :email)
|
291
304
|
end
|
292
|
-
|
293
|
-
def current_organic_context
|
294
|
-
if Organization.current?
|
295
|
-
Organization.current
|
296
|
-
else
|
297
|
-
main_organization
|
298
|
-
end
|
299
|
-
end
|
300
305
|
end
|
@@ -2,6 +2,19 @@ class Array
|
|
2
2
|
def insert_last(element)
|
3
3
|
self + [element]
|
4
4
|
end
|
5
|
+
|
6
|
+
def single
|
7
|
+
first if single?
|
8
|
+
end
|
9
|
+
|
10
|
+
def single!
|
11
|
+
raise 'There is more than one element' unless single?
|
12
|
+
first
|
13
|
+
end
|
14
|
+
|
15
|
+
def single?
|
16
|
+
size == 1
|
17
|
+
end
|
5
18
|
end
|
6
19
|
|
7
20
|
class NilClass
|
@@ -12,8 +12,9 @@ require_relative './factories/guide_factory'
|
|
12
12
|
require_relative './factories/invitation_factory'
|
13
13
|
require_relative './factories/lesson_factory'
|
14
14
|
require_relative './factories/login_settings_factory'
|
15
|
+
require_relative './factories/medal_factory'
|
15
16
|
require_relative './factories/message_factory'
|
16
17
|
require_relative './factories/organization_factory'
|
17
18
|
require_relative './factories/topic_factory'
|
18
|
-
require_relative './factories/user_factory'
|
19
19
|
require_relative './factories/usage_factory'
|
20
|
+
require_relative './factories/user_factory'
|
@@ -28,6 +28,10 @@ module Mumuki::Domain::Helpers::Organization
|
|
28
28
|
name == 'base'
|
29
29
|
end
|
30
30
|
|
31
|
+
def immersed_in?(other)
|
32
|
+
immersible? && other.immersive? && target_audience == other.target_audience
|
33
|
+
end
|
34
|
+
|
31
35
|
def switch!
|
32
36
|
Mumukit::Platform::Organization.switch! self
|
33
37
|
end
|
@@ -87,8 +87,24 @@ module Mumuki::Domain::Helpers::User
|
|
87
87
|
student_granted_organizations.first || any_granted_organizations.first
|
88
88
|
end
|
89
89
|
|
90
|
+
# Deprecated: use `immersive_organization_at` which
|
91
|
+
# properly looks for a single immersive organization taking
|
92
|
+
# current organization and path into account
|
90
93
|
def has_immersive_main_organization?
|
91
|
-
|
94
|
+
main_organization.try(&:immersive?).present?
|
95
|
+
end
|
96
|
+
|
97
|
+
def immersive_organization_at(path_item, current = Organization.current)
|
98
|
+
immersive_organizations_at(path_item, current).single
|
99
|
+
end
|
100
|
+
|
101
|
+
def immersive_organizations_at(path_item, current = Organization.current)
|
102
|
+
return [] unless current.immersible?
|
103
|
+
|
104
|
+
usage_filter = path_item ? lambda { |it| path_item.used_in?(it) } : lambda { |_| true }
|
105
|
+
student_granted_organizations
|
106
|
+
.select { |it| current.immersed_in?(it) }
|
107
|
+
.select(&usage_filter)
|
92
108
|
end
|
93
109
|
|
94
110
|
## API Exposure
|
@@ -28,3 +28,5 @@ en:
|
|
28
28
|
base:
|
29
29
|
consistent_public_login: 'A public organization can not restrict login methods'
|
30
30
|
invalid_activity_range: 'The organization activity range are not valid'
|
31
|
+
immersible:
|
32
|
+
cannot_be_immersive: 'An organization cannot be immersible and immersive at the same time'
|
@@ -45,6 +45,8 @@ es:
|
|
45
45
|
base:
|
46
46
|
consistent_public_login: 'Una organización pública no puede restringir los métodos de login'
|
47
47
|
invalid_activity_range: 'La fecha de deshabilitación no puede ser anterior a la de inicio del recorrido'
|
48
|
+
immersible:
|
49
|
+
cannot_be_immersive: 'Una organización no puede ser inmersible e inmersiva a la vez'
|
48
50
|
models:
|
49
51
|
exercise:
|
50
52
|
one: Ejercicio
|
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: 7.
|
4
|
+
version: 7.11.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-10-
|
11
|
+
date: 2020-10-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -252,6 +252,7 @@ files:
|
|
252
252
|
- app/models/chapter.rb
|
253
253
|
- app/models/complement.rb
|
254
254
|
- app/models/concerns/assistable.rb
|
255
|
+
- app/models/concerns/awardee.rb
|
255
256
|
- app/models/concerns/container.rb
|
256
257
|
- app/models/concerns/contextualization.rb
|
257
258
|
- app/models/concerns/disabling.rb
|
@@ -281,6 +282,7 @@ files:
|
|
281
282
|
- app/models/concerns/with_language.rb
|
282
283
|
- app/models/concerns/with_layout.rb
|
283
284
|
- app/models/concerns/with_locale.rb
|
285
|
+
- app/models/concerns/with_medal.rb
|
284
286
|
- app/models/concerns/with_messages.rb
|
285
287
|
- app/models/concerns/with_name.rb
|
286
288
|
- app/models/concerns/with_number.rb
|
@@ -315,6 +317,7 @@ files:
|
|
315
317
|
- app/models/invitation.rb
|
316
318
|
- app/models/language.rb
|
317
319
|
- app/models/lesson.rb
|
320
|
+
- app/models/medal.rb
|
318
321
|
- app/models/message.rb
|
319
322
|
- app/models/organization.rb
|
320
323
|
- app/models/progress.rb
|
@@ -620,6 +623,15 @@ files:
|
|
620
623
|
- db/migrate/20200730221001_add_trusted_for_forum_to_user.rb
|
621
624
|
- db/migrate/20200731081757_add_last_moderator_access_fields_to_discussion.rb
|
622
625
|
- db/migrate/20200804191643_add_incognito_mode_enabled_to_organization.rb
|
626
|
+
- db/migrate/20200828152812_create_medals.rb
|
627
|
+
- db/migrate/20200828162829_add_medal_to_content.rb
|
628
|
+
- db/migrate/20200915123020_add_polymorphic_avatars_to_users.rb
|
629
|
+
- db/migrate/20200915131621_add_once_completed_to_indicators.rb
|
630
|
+
- db/migrate/20201009193949_add_status_updated_fields_to_discussion.rb
|
631
|
+
- db/migrate/20201019191036_add_misplaced_flag_to_submission.rb
|
632
|
+
- db/migrate/20201026222942_add_display_name_and_description_to_organizations.rb
|
633
|
+
- db/migrate/20201026225312_add_organization_wins_page_flag.rb
|
634
|
+
- db/migrate/20201027134205_add_immersible_to_organization.rb
|
623
635
|
- lib/mumuki/domain.rb
|
624
636
|
- lib/mumuki/domain/area.rb
|
625
637
|
- lib/mumuki/domain/engine.rb
|
@@ -656,6 +668,7 @@ files:
|
|
656
668
|
- lib/mumuki/domain/factories/invitation_factory.rb
|
657
669
|
- lib/mumuki/domain/factories/lesson_factory.rb
|
658
670
|
- lib/mumuki/domain/factories/login_settings_factory.rb
|
671
|
+
- lib/mumuki/domain/factories/medal_factory.rb
|
659
672
|
- lib/mumuki/domain/factories/message_factory.rb
|
660
673
|
- lib/mumuki/domain/factories/organization_factory.rb
|
661
674
|
- lib/mumuki/domain/factories/topic_factory.rb
|
@@ -675,6 +688,10 @@ files:
|
|
675
688
|
- lib/mumuki/domain/locales/console_submission/es-CL.yml
|
676
689
|
- lib/mumuki/domain/locales/console_submission/es.yml
|
677
690
|
- lib/mumuki/domain/locales/console_submission/pt.yml
|
691
|
+
- lib/mumuki/domain/locales/defaults/en.yml
|
692
|
+
- lib/mumuki/domain/locales/defaults/es-CL.yml
|
693
|
+
- lib/mumuki/domain/locales/defaults/es.yml
|
694
|
+
- lib/mumuki/domain/locales/defaults/pt.yml
|
678
695
|
- lib/mumuki/domain/organization.rb
|
679
696
|
- lib/mumuki/domain/organization/profile.rb
|
680
697
|
- lib/mumuki/domain/organization/settings.rb
|