mumuki-domain 7.7.3 → 7.8.0
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/models/concerns/navigation/siblings_navigation.rb +2 -2
- data/app/models/concerns/submittable/submittable.rb +1 -1
- data/app/models/concerns/with_assignments.rb +1 -1
- data/app/models/concerns/with_progress.rb +1 -1
- data/app/models/guide.rb +1 -1
- data/app/models/organization.rb +1 -0
- data/app/models/user.rb +44 -0
- data/db/migrate/20200804191643_add_incognito_mode_enabled_to_organization.rb +5 -0
- data/lib/mumuki/domain.rb +1 -0
- data/lib/mumuki/domain/incognito.rb +112 -0
- data/lib/mumuki/domain/organization/profile.rb +2 -1
- data/lib/mumuki/domain/organization/settings.rb +2 -1
- data/lib/mumuki/domain/submission/base.rb +5 -1
- data/lib/mumuki/domain/version.rb +1 -1
- metadata +8 -8
- data/lib/mumuki/domain/locales/activerecord/es-CL.yml +0 -59
- data/lib/mumuki/domain/locales/console_submission/es-CL.yml +0 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 14a6d0b035451e69ddc77479e3f32854ecae51ca0a3c6bc3031f8d68a4b7fcdd
|
|
4
|
+
data.tar.gz: a1dbea618e7a152e55417174cecf35a0338a464cd199b02114d524c65c7c23c5
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: d3e2039abf83cd21c0ef3d6b33bcfcef54db1dc7df1eb91fb771ab218076b484b34a4a7c034a1e945d5ab3f84e739fdffbdba05999e2bb1878430af4698e4678
|
|
7
|
+
data.tar.gz: 1cc3cb4565b4999bfac4f351fffb0d937c28db74c93e26a94267332b9c15ca8812f0bce4c19e2298169a957d008546bde95442a2ca7d798f9912b2bd3c9c39e8
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
module SiblingsNavigation
|
|
2
2
|
|
|
3
3
|
def next_for(user)
|
|
4
|
-
|
|
4
|
+
user.pending_siblings_at(self).select { |it| it.number > number }.sort_by(&:number).first
|
|
5
5
|
end
|
|
6
6
|
|
|
7
7
|
def restart(user)
|
|
8
|
-
|
|
8
|
+
user.pending_siblings_at(self).sort_by(&:number).first
|
|
9
9
|
end
|
|
10
10
|
|
|
11
11
|
def siblings
|
|
@@ -5,7 +5,7 @@ module Submittable
|
|
|
5
5
|
|
|
6
6
|
def find_assignment_and_submit!(user, submission)
|
|
7
7
|
assignment = assignment_for user
|
|
8
|
-
results =
|
|
8
|
+
results = user.run_submission! submission, assignment, evaluation_class.new
|
|
9
9
|
[assignment, results]
|
|
10
10
|
end
|
|
11
11
|
end
|
|
@@ -28,6 +28,6 @@ module WithAssignments
|
|
|
28
28
|
end
|
|
29
29
|
|
|
30
30
|
def assignment_for(user, organization=Organization.current)
|
|
31
|
-
find_assignment_for(user, organization) || user.
|
|
31
|
+
find_assignment_for(user, organization) || user.build_assignment(self, organization)
|
|
32
32
|
end
|
|
33
33
|
end
|
data/app/models/guide.rb
CHANGED
data/app/models/organization.rb
CHANGED
|
@@ -18,6 +18,7 @@ class Organization < ApplicationRecord
|
|
|
18
18
|
has_many :usages
|
|
19
19
|
|
|
20
20
|
validates_presence_of :contact_email, :locale
|
|
21
|
+
validates_presence_of :welcome_email_template, if: :greet_new_users?
|
|
21
22
|
validates :name, uniqueness: true,
|
|
22
23
|
presence: true,
|
|
23
24
|
format: { with: Mumukit::Platform::Organization.anchored_valid_name_regex }
|
data/app/models/user.rb
CHANGED
|
@@ -39,6 +39,8 @@ class User < ApplicationRecord
|
|
|
39
39
|
before_validation :set_uid!
|
|
40
40
|
validates :uid, presence: true
|
|
41
41
|
|
|
42
|
+
after_save :welcome_to_new_organizations!, if: :gained_access_to_new_orga?
|
|
43
|
+
|
|
42
44
|
resource_fields :uid, :social_id, :email, :permissions, :verified_first_name, :verified_last_name, *profile_fields
|
|
43
45
|
|
|
44
46
|
def last_lesson
|
|
@@ -189,8 +191,50 @@ class User < ApplicationRecord
|
|
|
189
191
|
name.split.map(&:first).map(&:capitalize).join(' ')
|
|
190
192
|
end
|
|
191
193
|
|
|
194
|
+
def progress_at(content, organization)
|
|
195
|
+
Indicator.find_or_initialize_by(user: self, organization: organization, content: content)
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
def build_assignment(exercise, organization)
|
|
199
|
+
assignments.build(exercise: exercise, organization: organization)
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
def pending_siblings_at(content)
|
|
203
|
+
content.pending_siblings_for(self)
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
def next_exercise_at(guide)
|
|
207
|
+
guide.pending_exercises(self).order('public.exercises.number asc').first
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
def run_submission!(submission, assignment, evaluation)
|
|
211
|
+
submission.run! assignment, evaluation
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
def incognito?
|
|
215
|
+
false
|
|
216
|
+
end
|
|
217
|
+
|
|
192
218
|
private
|
|
193
219
|
|
|
220
|
+
def welcome_to_new_organizations!
|
|
221
|
+
new_accessible_organizations.each do |organization|
|
|
222
|
+
UserMailer.welcome_email(self, organization).deliver_later if organization.greet_new_users?
|
|
223
|
+
end
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
def gained_access_to_new_orga?
|
|
227
|
+
new_accessible_organizations.present?
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
def new_accessible_organizations
|
|
231
|
+
return [] unless saved_change_to_permissions?
|
|
232
|
+
|
|
233
|
+
old, new = saved_change_to_permissions
|
|
234
|
+
new_organizations = (new.any_granted_organizations - old.any_granted_organizations).to_a
|
|
235
|
+
Organization.where(name: new_organizations)
|
|
236
|
+
end
|
|
237
|
+
|
|
194
238
|
def set_uid!
|
|
195
239
|
self.uid ||= email
|
|
196
240
|
end
|
data/lib/mumuki/domain.rb
CHANGED
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
module Mumuki::Domain
|
|
2
|
+
class IncognitoClass
|
|
3
|
+
|
|
4
|
+
def incognito?
|
|
5
|
+
true
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
# ============
|
|
9
|
+
# Permissions
|
|
10
|
+
# ============
|
|
11
|
+
|
|
12
|
+
def ensure_enabled!
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def has_student_granted_organizations?
|
|
16
|
+
false
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def teacher_here?
|
|
20
|
+
false
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def teacher_of?(*)
|
|
24
|
+
false
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def profile_completed?
|
|
28
|
+
true
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def writer?
|
|
32
|
+
false
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def moderator_here?
|
|
36
|
+
false
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def can_discuss_here?
|
|
40
|
+
false
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# ========
|
|
44
|
+
# Visiting
|
|
45
|
+
# ========
|
|
46
|
+
|
|
47
|
+
def visit!(*)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# ========
|
|
51
|
+
# Progress
|
|
52
|
+
# ========
|
|
53
|
+
|
|
54
|
+
def next_exercise_at(guide)
|
|
55
|
+
guide.exercises.first
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# def completed_containers_with_lookahead(*)
|
|
59
|
+
# raise 'Unsupported operation. Userless mode and progressive display modes are incompatible'
|
|
60
|
+
# end
|
|
61
|
+
|
|
62
|
+
def progress_at(content, organization)
|
|
63
|
+
Indicator.new content: content, organization: organization
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def build_assignment(exercise, organization)
|
|
67
|
+
Assignment.new exercise: exercise, organization: organization, submitter: self
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def pending_siblings_at(content)
|
|
71
|
+
[]
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
# ============
|
|
75
|
+
# ActiveRecord
|
|
76
|
+
# ============
|
|
77
|
+
|
|
78
|
+
def id
|
|
79
|
+
'<incognito>'
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def is_a?(other)
|
|
83
|
+
other.is_a?(Class) && other.name == 'User' || super
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def _read_attribute(key)
|
|
87
|
+
return id if key == 'id'
|
|
88
|
+
raise "unknown attribute #{key}"
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def self.primary_key
|
|
92
|
+
'id'
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
# ==========
|
|
96
|
+
# Evaluation
|
|
97
|
+
# ==========
|
|
98
|
+
|
|
99
|
+
def interpolations
|
|
100
|
+
[]
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def run_submission!(submission, assignment, evaluation)
|
|
104
|
+
results = submission.dry_run! assignment, evaluation
|
|
105
|
+
assignment.assign_attributes results
|
|
106
|
+
results
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
Incognito = IncognitoClass.new
|
|
112
|
+
end
|
|
@@ -21,12 +21,16 @@ class Mumuki::Domain::Submission::Base
|
|
|
21
21
|
|
|
22
22
|
def run!(assignment, evaluation)
|
|
23
23
|
save_submission! assignment
|
|
24
|
-
results =
|
|
24
|
+
results = dry_run! assignment, evaluation
|
|
25
25
|
save_results! results, assignment
|
|
26
26
|
notify_results! results, assignment
|
|
27
27
|
results
|
|
28
28
|
end
|
|
29
29
|
|
|
30
|
+
def dry_run!(assignment, evaluation)
|
|
31
|
+
evaluation.evaluate! assignment, self
|
|
32
|
+
end
|
|
33
|
+
|
|
30
34
|
def with_client_result(result)
|
|
31
35
|
self.client_result = result if result.present?
|
|
32
36
|
self
|
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.8.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-08-
|
|
11
|
+
date: 2020-08-28 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: rails
|
|
@@ -30,14 +30,14 @@ dependencies:
|
|
|
30
30
|
requirements:
|
|
31
31
|
- - "~>"
|
|
32
32
|
- !ruby/object:Gem::Version
|
|
33
|
-
version: '7.
|
|
33
|
+
version: '7.8'
|
|
34
34
|
type: :runtime
|
|
35
35
|
prerelease: false
|
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
|
37
37
|
requirements:
|
|
38
38
|
- - "~>"
|
|
39
39
|
- !ruby/object:Gem::Version
|
|
40
|
-
version: '7.
|
|
40
|
+
version: '7.8'
|
|
41
41
|
- !ruby/object:Gem::Dependency
|
|
42
42
|
name: mumukit-assistant
|
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -128,14 +128,14 @@ dependencies:
|
|
|
128
128
|
requirements:
|
|
129
129
|
- - "~>"
|
|
130
130
|
- !ruby/object:Gem::Version
|
|
131
|
-
version: '5.
|
|
131
|
+
version: '5.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: '5.
|
|
138
|
+
version: '5.1'
|
|
139
139
|
- !ruby/object:Gem::Dependency
|
|
140
140
|
name: mumukit-sync
|
|
141
141
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -613,6 +613,7 @@ files:
|
|
|
613
613
|
- db/migrate/20200728163038_add_requires_moderator_response_to_discussions.rb
|
|
614
614
|
- db/migrate/20200730221001_add_trusted_for_forum_to_user.rb
|
|
615
615
|
- db/migrate/20200731081757_add_last_moderator_access_fields_to_discussion.rb
|
|
616
|
+
- db/migrate/20200804191643_add_incognito_mode_enabled_to_organization.rb
|
|
616
617
|
- lib/mumuki/domain.rb
|
|
617
618
|
- lib/mumuki/domain/area.rb
|
|
618
619
|
- lib/mumuki/domain/engine.rb
|
|
@@ -657,12 +658,11 @@ files:
|
|
|
657
658
|
- lib/mumuki/domain/helpers/course.rb
|
|
658
659
|
- lib/mumuki/domain/helpers/organization.rb
|
|
659
660
|
- lib/mumuki/domain/helpers/user.rb
|
|
661
|
+
- lib/mumuki/domain/incognito.rb
|
|
660
662
|
- lib/mumuki/domain/locales/activerecord/en.yml
|
|
661
|
-
- lib/mumuki/domain/locales/activerecord/es-CL.yml
|
|
662
663
|
- lib/mumuki/domain/locales/activerecord/es.yml
|
|
663
664
|
- lib/mumuki/domain/locales/activerecord/pt.yml
|
|
664
665
|
- lib/mumuki/domain/locales/console_submission/en.yml
|
|
665
|
-
- lib/mumuki/domain/locales/console_submission/es-CL.yml
|
|
666
666
|
- lib/mumuki/domain/locales/console_submission/es.yml
|
|
667
667
|
- lib/mumuki/domain/locales/console_submission/pt.yml
|
|
668
668
|
- lib/mumuki/domain/organization.rb
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
es-CL:
|
|
3
|
-
activerecord:
|
|
4
|
-
attributes:
|
|
5
|
-
exercise:
|
|
6
|
-
description: Descripción
|
|
7
|
-
extra: Biblioteca
|
|
8
|
-
hint: Ayudas
|
|
9
|
-
language: Lenguaje
|
|
10
|
-
locale: Idioma
|
|
11
|
-
tag_list: Etiquetas
|
|
12
|
-
title: Título
|
|
13
|
-
guide:
|
|
14
|
-
description: Descripción
|
|
15
|
-
github_repository: Repositorio Github
|
|
16
|
-
language: Lenguaje
|
|
17
|
-
locale: Idioma
|
|
18
|
-
name: Nombre
|
|
19
|
-
submission:
|
|
20
|
-
content: Contenido
|
|
21
|
-
errors:
|
|
22
|
-
models:
|
|
23
|
-
guide:
|
|
24
|
-
attributes:
|
|
25
|
-
base:
|
|
26
|
-
in_use: 'La guía aún está siendo utilizada en la organización %{organization}'
|
|
27
|
-
topic:
|
|
28
|
-
attributes:
|
|
29
|
-
base:
|
|
30
|
-
in_use: 'El tema aún está siendo utilizado en la organización %{organization}'
|
|
31
|
-
exercise:
|
|
32
|
-
attributes:
|
|
33
|
-
randomizations:
|
|
34
|
-
invalid_format: 'formato inválido'
|
|
35
|
-
own_expectations:
|
|
36
|
-
invalid_format: 'formato inválido'
|
|
37
|
-
assistance_rules:
|
|
38
|
-
invalid_format: 'formato inválido'
|
|
39
|
-
name:
|
|
40
|
-
invalid_format: 'no debe contener /'
|
|
41
|
-
base:
|
|
42
|
-
evaluation_criteria_required: 'Tienes que proveer tests y/o expectativas'
|
|
43
|
-
organization:
|
|
44
|
-
attributes:
|
|
45
|
-
base:
|
|
46
|
-
consistent_public_login: 'Una organización pública no puede restringir los métodos de login'
|
|
47
|
-
invalid_activity_range: 'La fecha de inhabilitación no puede ser anterior a la de inicio del recorrido'
|
|
48
|
-
models:
|
|
49
|
-
exercise:
|
|
50
|
-
one: Ejercicio
|
|
51
|
-
other: Ejercicios
|
|
52
|
-
chapter:
|
|
53
|
-
one: Capítulo
|
|
54
|
-
other: Capítulos
|
|
55
|
-
guide: Guía
|
|
56
|
-
language: Lenguaje
|
|
57
|
-
submission:
|
|
58
|
-
one: Solución
|
|
59
|
-
other: Soluciones
|