mumuki-domain 9.8.1 → 9.9.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/application_record.rb +1 -1
- data/app/models/assignment.rb +8 -13
- data/app/models/concerns/onomastic.rb +37 -0
- data/app/models/concerns/with_messages.rb +1 -1
- data/app/models/concerns/with_notifications.rb +1 -2
- data/app/models/concerns/with_reminders.rb +1 -1
- data/app/models/concerns/with_responsible_moderator.rb +1 -1
- data/app/models/concerns/with_soft_deletion.rb +1 -1
- data/app/models/concerns/with_terms_acceptance.rb +1 -2
- data/app/models/concerns/with_timed_enablement.rb +1 -1
- data/app/models/course.rb +2 -2
- data/app/models/discussion.rb +3 -3
- data/app/models/exam.rb +3 -3
- data/app/models/exam_authorization.rb +1 -1
- data/app/models/exam_registration.rb +1 -1
- data/app/models/exercise.rb +0 -8
- data/app/models/exercise/playground.rb +2 -1
- data/app/models/exercise/problem.rb +1 -1
- data/app/models/message.rb +42 -16
- data/app/models/organization.rb +1 -1
- data/app/models/user.rb +2 -13
- data/db/migrate/20210707143002_add_assignment_id_to_message.rb +5 -0
- data/lib/mumuki/domain/factories/exercise_factory.rb +9 -1
- data/lib/mumuki/domain/helpers/user.rb +0 -6
- data/lib/mumuki/domain/organization/profile.rb +1 -1
- data/lib/mumuki/domain/organization/settings.rb +2 -2
- data/lib/mumuki/domain/submission/persistent_submission.rb +1 -1
- data/lib/mumuki/domain/submission/query.rb +1 -1
- data/lib/mumuki/domain/submission/question.rb +0 -1
- data/lib/mumuki/domain/submission/try.rb +1 -0
- data/lib/mumuki/domain/version.rb +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: bae661db3a1a6f210ac27b6d998846fde5a4968acdbcec182db4cca7d9dd4245
|
|
4
|
+
data.tar.gz: 8ed2e95b7d1b21768062735e1fe8c5fbb55fe50e0c17821ae6e3baf8a9d50b5c
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: b0f931e47808ff51e1cabe419e31a3d59ad9a3d3cf61f6ef66ff9b3e2026bc3db6441f5352002fad29d047ad23fa5030bede82b0d6a7b8e07b58875a236a1827
|
|
7
|
+
data.tar.gz: 2da409d2e2c0e606457e6f78e72d97ec7ac8ba9ca0c20b12cffc3d48e9d4d72e131e7379ff2ceb60c1aa124f4ec5db30e653fca12812b0bb4ef4db3398d72d32
|
|
@@ -152,7 +152,7 @@ class ApplicationRecord < ActiveRecord::Base
|
|
|
152
152
|
def self.active_between(start_date_field, end_date_field, **options)
|
|
153
153
|
define_singleton_method(:active) do |actually_filter=true|
|
|
154
154
|
if actually_filter
|
|
155
|
-
self.where("(#{start_date_field} IS NULL OR #{start_date_field} < :now) AND (#{end_date_field} IS NULL OR #{end_date_field} > :now)", now: Time.
|
|
155
|
+
self.where("(#{start_date_field} IS NULL OR #{start_date_field} < :now) AND (#{end_date_field} IS NULL OR #{end_date_field} > :now)", now: Time.current)
|
|
156
156
|
else
|
|
157
157
|
all
|
|
158
158
|
end
|
data/app/models/assignment.rb
CHANGED
|
@@ -7,11 +7,7 @@ class Assignment < Progress
|
|
|
7
7
|
|
|
8
8
|
belongs_to :exercise
|
|
9
9
|
has_one :guide, through: :exercise
|
|
10
|
-
has_many :messages,
|
|
11
|
-
-> { where.not(submission_id: nil).order(date: :desc) },
|
|
12
|
-
foreign_key: :submission_id,
|
|
13
|
-
primary_key: :submission_id,
|
|
14
|
-
dependent: :destroy
|
|
10
|
+
has_many :messages, -> { order(date: :desc) }, dependent: :destroy
|
|
15
11
|
|
|
16
12
|
belongs_to :organization
|
|
17
13
|
belongs_to :submitter, class_name: 'User'
|
|
@@ -28,13 +24,13 @@ class Assignment < Progress
|
|
|
28
24
|
alias_attribute :status, :submission_status
|
|
29
25
|
alias_attribute :attempts_count, :attemps_count
|
|
30
26
|
|
|
31
|
-
scope :by_exercise_ids, -> (exercise_ids)
|
|
27
|
+
scope :by_exercise_ids, -> (exercise_ids) do
|
|
32
28
|
where(exercise_id: exercise_ids) if exercise_ids
|
|
33
|
-
|
|
29
|
+
end
|
|
34
30
|
|
|
35
|
-
scope :by_usernames, -> (usernames)
|
|
31
|
+
scope :by_usernames, -> (usernames) do
|
|
36
32
|
joins(:submitter).where('users.name' => usernames) if usernames
|
|
37
|
-
|
|
33
|
+
end
|
|
38
34
|
|
|
39
35
|
defaults do
|
|
40
36
|
self.query_results = []
|
|
@@ -86,11 +82,10 @@ class Assignment < Progress
|
|
|
86
82
|
end
|
|
87
83
|
end
|
|
88
84
|
|
|
89
|
-
def
|
|
85
|
+
def save_submission!(submission)
|
|
90
86
|
transaction do
|
|
91
|
-
messages.destroy_all if submission_id.present?
|
|
92
87
|
update! submission_id: submission.id
|
|
93
|
-
update! submitted_at:
|
|
88
|
+
update! submitted_at: Time.current
|
|
94
89
|
update_submissions_count!
|
|
95
90
|
update_last_submission!
|
|
96
91
|
end
|
|
@@ -286,6 +281,6 @@ class Assignment < Progress
|
|
|
286
281
|
end
|
|
287
282
|
|
|
288
283
|
def update_last_submission!
|
|
289
|
-
submitter.update!(last_submission_date:
|
|
284
|
+
submitter.update!(last_submission_date: Time.current, last_exercise: exercise)
|
|
290
285
|
end
|
|
291
286
|
end
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
module Onomastic
|
|
2
|
+
extend ActiveSupport::Concern
|
|
3
|
+
|
|
4
|
+
included do
|
|
5
|
+
alias_method :name, :full_name
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def formal_first_name
|
|
9
|
+
verified_first_name.presence || first_name
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def formal_last_name
|
|
13
|
+
verified_last_name.presence || last_name
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def has_verified_full_name?
|
|
17
|
+
verified_first_name? && verified_last_name?
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def formal_full_name
|
|
21
|
+
join_names formal_first_name, formal_last_name
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def full_name
|
|
25
|
+
join_names first_name, last_name
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def verified_full_name
|
|
29
|
+
join_names verified_first_name, verified_last_name
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
private
|
|
33
|
+
|
|
34
|
+
def join_names(first, last)
|
|
35
|
+
"#{first} #{last}".strip
|
|
36
|
+
end
|
|
37
|
+
end
|
|
@@ -7,8 +7,7 @@ module WithNotifications
|
|
|
7
7
|
|
|
8
8
|
def unread_notifications
|
|
9
9
|
# TODO: message and discussion should trigger a notification instead of being one
|
|
10
|
-
|
|
11
|
-
all = notifications.where(read: false) + unread_discussions
|
|
10
|
+
all = notifications.where(read: false) + unread_messages + unread_discussions
|
|
12
11
|
all.sort_by(&:created_at).reverse
|
|
13
12
|
end
|
|
14
13
|
|
|
@@ -34,7 +34,7 @@ module WithResponsibleModerator
|
|
|
34
34
|
private
|
|
35
35
|
|
|
36
36
|
def responsible!(moderator)
|
|
37
|
-
update! responsible_moderator_at: Time.
|
|
37
|
+
update! responsible_moderator_at: Time.current, responsible_moderator_by: moderator
|
|
38
38
|
end
|
|
39
39
|
|
|
40
40
|
def no_responsible!
|
|
@@ -58,8 +58,7 @@ module WithTermsAcceptance
|
|
|
58
58
|
end
|
|
59
59
|
|
|
60
60
|
def accept_terms!(terms)
|
|
61
|
-
update! unaccepted_terms_scopes_in(terms).to_h { |scope| [term_acceptance_field_for(scope), Time.
|
|
61
|
+
update! unaccepted_terms_scopes_in(terms).to_h { |scope| [term_acceptance_field_for(scope), Time.current] }
|
|
62
62
|
end
|
|
63
63
|
|
|
64
64
|
end
|
|
65
|
-
|
data/app/models/course.rb
CHANGED
|
@@ -14,7 +14,7 @@ class Course < ApplicationRecord
|
|
|
14
14
|
resource_fields :slug, :shifts, :code, :days, :period, :description, :period_start, :period_end
|
|
15
15
|
|
|
16
16
|
def current_invitation
|
|
17
|
-
invitations.where('expiration_date > ?', Time.
|
|
17
|
+
invitations.where('expiration_date > ?', Time.current).first
|
|
18
18
|
end
|
|
19
19
|
|
|
20
20
|
def import_from_resource_h!(resource_h)
|
|
@@ -49,7 +49,7 @@ class Course < ApplicationRecord
|
|
|
49
49
|
period =~ /^(\d{4})?/
|
|
50
50
|
year = $1.to_i
|
|
51
51
|
|
|
52
|
-
return nil unless year.between? 2014, (
|
|
52
|
+
return nil unless year.between? 2014, (Time.current.year + 1)
|
|
53
53
|
|
|
54
54
|
self.period_start = DateTime.new(year).beginning_of_year
|
|
55
55
|
self.period_end = DateTime.new(year).end_of_year
|
data/app/models/discussion.rb
CHANGED
|
@@ -42,7 +42,7 @@ class Discussion < ApplicationRecord
|
|
|
42
42
|
end
|
|
43
43
|
|
|
44
44
|
def visible_messages
|
|
45
|
-
messages.
|
|
45
|
+
messages.visible
|
|
46
46
|
end
|
|
47
47
|
|
|
48
48
|
def try_solve!
|
|
@@ -54,7 +54,7 @@ class Discussion < ApplicationRecord
|
|
|
54
54
|
def navigable_content_in(_)
|
|
55
55
|
nil
|
|
56
56
|
end
|
|
57
|
-
|
|
57
|
+
|
|
58
58
|
def target
|
|
59
59
|
self
|
|
60
60
|
end
|
|
@@ -128,7 +128,7 @@ class Discussion < ApplicationRecord
|
|
|
128
128
|
if reachable_status_for?(user, status)
|
|
129
129
|
update! status: status,
|
|
130
130
|
status_updated_by: user,
|
|
131
|
-
status_updated_at: Time.
|
|
131
|
+
status_updated_at: Time.current
|
|
132
132
|
|
|
133
133
|
no_responsible! if responsible?(user)
|
|
134
134
|
end
|
data/app/models/exam.rb
CHANGED
|
@@ -32,7 +32,7 @@ class Exam < ApplicationRecord
|
|
|
32
32
|
end
|
|
33
33
|
|
|
34
34
|
def enabled_for?(user)
|
|
35
|
-
enabled_range_for(user).cover?
|
|
35
|
+
enabled_range_for(user).cover? Time.current
|
|
36
36
|
end
|
|
37
37
|
|
|
38
38
|
def in_progress_for?(user)
|
|
@@ -179,8 +179,8 @@ class Exam < ApplicationRecord
|
|
|
179
179
|
exam[:organization_id] = Organization.current.id
|
|
180
180
|
exam[:course_id] = Course.locate!(exam[:course].to_s).id
|
|
181
181
|
exam[:users] = User.where(uid: exam[:uids])
|
|
182
|
-
exam[:start_time] = exam[:start_time].
|
|
183
|
-
exam[:end_time] = exam[:end_time].
|
|
182
|
+
exam[:start_time] = exam[:start_time].in_time_zone
|
|
183
|
+
exam[:end_time] = exam[:end_time].in_time_zone
|
|
184
184
|
exam[:classroom_id] = exam[:eid] if exam[:eid].present?
|
|
185
185
|
end
|
|
186
186
|
|
|
@@ -17,7 +17,7 @@ class ExamRegistration < ApplicationRecord
|
|
|
17
17
|
|
|
18
18
|
alias_attribute :name, :description
|
|
19
19
|
|
|
20
|
-
scope :should_process, -> { where(processed: false).where(arel_table[:end_time].lt(Time.
|
|
20
|
+
scope :should_process, -> { where(processed: false).where(arel_table[:end_time].lt(Time.current)) }
|
|
21
21
|
|
|
22
22
|
def authorization_criterion
|
|
23
23
|
@authorization_criterion ||= ExamRegistration::AuthorizationCriterion.parse(authorization_criterion_type, authorization_criterion_value)
|
data/app/models/exercise.rb
CHANGED
|
@@ -168,14 +168,6 @@ class Exercise < ApplicationRecord
|
|
|
168
168
|
Exercise.find(id)
|
|
169
169
|
end
|
|
170
170
|
|
|
171
|
-
def messages_path_for(user)
|
|
172
|
-
"api/guides/#{guide.slug}/#{bibliotheca_id}/student/#{URI.escape user.uid}/messages?language=#{language}"
|
|
173
|
-
end
|
|
174
|
-
|
|
175
|
-
def messages_url_for(user)
|
|
176
|
-
Mumukit::Platform.classroom_api.organic_url_for(Organization.current, messages_path_for(user))
|
|
177
|
-
end
|
|
178
|
-
|
|
179
171
|
def description_context
|
|
180
172
|
splitted_description.first.markdownified
|
|
181
173
|
end
|
|
@@ -3,8 +3,9 @@ class Playground < QueriableChallenge
|
|
|
3
3
|
|
|
4
4
|
name_model_as Exercise
|
|
5
5
|
|
|
6
|
-
def
|
|
6
|
+
def save_query_submission!(assignment, submission)
|
|
7
7
|
assignment.running!
|
|
8
|
+
assignment.save_submission! submission
|
|
8
9
|
end
|
|
9
10
|
|
|
10
11
|
def save_query_results!(assignment)
|
data/app/models/message.rb
CHANGED
|
@@ -2,18 +2,48 @@ class Message < ApplicationRecord
|
|
|
2
2
|
include WithSoftDeletion
|
|
3
3
|
|
|
4
4
|
belongs_to :discussion, optional: true
|
|
5
|
-
belongs_to :assignment,
|
|
5
|
+
belongs_to :assignment, optional: true
|
|
6
6
|
belongs_to :approved_by, class_name: 'User', optional: true
|
|
7
7
|
|
|
8
8
|
has_one :exercise, through: :assignment
|
|
9
9
|
|
|
10
10
|
validates_presence_of :content, :sender
|
|
11
|
-
|
|
11
|
+
validate :ensure_contextualized
|
|
12
12
|
|
|
13
13
|
after_save :update_counters_cache!
|
|
14
14
|
|
|
15
15
|
markdown_on :content
|
|
16
16
|
|
|
17
|
+
# Visible messages are those that can be publicly seen
|
|
18
|
+
# in forums. non-direct messages are never visible.
|
|
19
|
+
scope :visible, -> () do
|
|
20
|
+
where.not(deletion_motive: :self_deleted)
|
|
21
|
+
.or(where(deletion_motive: nil))
|
|
22
|
+
.where(assignment_id: nil)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def contextualization
|
|
26
|
+
direct? ? assignment : discussion
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def contextualized?
|
|
30
|
+
assignment_id.present? ^ discussion_id.present?
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# Whether this message is stale, that is, it
|
|
34
|
+
# targets a submission that is not the latest one.
|
|
35
|
+
#
|
|
36
|
+
# Only direct messages may become stale.
|
|
37
|
+
def stale?
|
|
38
|
+
direct? && assignment.submission_id != submission_id
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# Whether this message is direct, that is, whether it comes from rise-hand feature.
|
|
42
|
+
# Forum messages are non-direct.
|
|
43
|
+
def direct?
|
|
44
|
+
submission_id.present?
|
|
45
|
+
end
|
|
46
|
+
|
|
17
47
|
def notify!
|
|
18
48
|
Mumukit::Nuntius.notify! 'student-messages', to_resource_h unless Organization.silenced?
|
|
19
49
|
end
|
|
@@ -85,33 +115,29 @@ class Message < ApplicationRecord
|
|
|
85
115
|
self
|
|
86
116
|
end
|
|
87
117
|
|
|
88
|
-
def self.parse_json(json)
|
|
89
|
-
message = json.delete 'message'
|
|
90
|
-
json
|
|
91
|
-
.except('uid', 'exercise_id')
|
|
92
|
-
.merge(message)
|
|
93
|
-
end
|
|
94
|
-
|
|
95
118
|
def self.read_all!
|
|
96
119
|
update_all read: true
|
|
97
120
|
end
|
|
98
121
|
|
|
99
|
-
def self.import_from_resource_h!(
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
Assignment.find_by(submission_id: message_data.delete('submission_id'))&.receive_answer! message_data
|
|
122
|
+
def self.import_from_resource_h!(resource_h)
|
|
123
|
+
if resource_h['submission_id'].present?
|
|
124
|
+
assignment = Assignment.find_by(submission_id: resource_h['submission_id'])
|
|
125
|
+
assignment&.receive_answer! sender: resource_h['message']['sender'],
|
|
126
|
+
content: resource_h['message']['content']
|
|
105
127
|
end
|
|
106
128
|
end
|
|
107
129
|
|
|
108
130
|
private
|
|
109
131
|
|
|
110
132
|
def approve!(user)
|
|
111
|
-
update! approved: true, approved_at: Time.
|
|
133
|
+
update! approved: true, approved_at: Time.current, approved_by: user
|
|
112
134
|
end
|
|
113
135
|
|
|
114
136
|
def disapprove!
|
|
115
137
|
update! approved: false, approved_at: nil, approved_by: nil
|
|
116
138
|
end
|
|
139
|
+
|
|
140
|
+
def ensure_contextualized
|
|
141
|
+
errors.add(:base, :not_properly_contextualized) unless contextualized?
|
|
142
|
+
end
|
|
117
143
|
end
|
data/app/models/organization.rb
CHANGED
|
@@ -23,7 +23,7 @@ class Organization < ApplicationRecord
|
|
|
23
23
|
|
|
24
24
|
has_many :certificate_programs
|
|
25
25
|
|
|
26
|
-
validates_presence_of :contact_email, :locale
|
|
26
|
+
validates_presence_of :contact_email, :locale, :time_zone
|
|
27
27
|
validates_presence_of :welcome_email_template, if: :greet_new_users?
|
|
28
28
|
validates :name, uniqueness: true,
|
|
29
29
|
presence: true,
|
data/app/models/user.rb
CHANGED
|
@@ -9,6 +9,7 @@ class User < ApplicationRecord
|
|
|
9
9
|
Disabling,
|
|
10
10
|
WithTermsAcceptance,
|
|
11
11
|
WithPreferences,
|
|
12
|
+
Onomastic,
|
|
12
13
|
Mumuki::Domain::Helpers::User
|
|
13
14
|
|
|
14
15
|
serialize :permissions, Mumukit::Auth::Permissions
|
|
@@ -251,7 +252,7 @@ class User < ApplicationRecord
|
|
|
251
252
|
|
|
252
253
|
def age
|
|
253
254
|
if birthdate.present?
|
|
254
|
-
@age ||= Time.
|
|
255
|
+
@age ||= Time.current.round_years_since(birthdate.in_time_zone)
|
|
255
256
|
end
|
|
256
257
|
end
|
|
257
258
|
|
|
@@ -288,18 +289,6 @@ class User < ApplicationRecord
|
|
|
288
289
|
end
|
|
289
290
|
end
|
|
290
291
|
|
|
291
|
-
def formal_first_name
|
|
292
|
-
verified_first_name.presence || first_name
|
|
293
|
-
end
|
|
294
|
-
|
|
295
|
-
def formal_last_name
|
|
296
|
-
verified_last_name.presence || last_name
|
|
297
|
-
end
|
|
298
|
-
|
|
299
|
-
def formal_full_name
|
|
300
|
-
"#{formal_first_name} #{formal_last_name}"
|
|
301
|
-
end
|
|
302
|
-
|
|
303
292
|
def certificates_in_organization(organization = Organization.current)
|
|
304
293
|
certificates.where certificate_program: CertificateProgram.where(organization: organization)
|
|
305
294
|
end
|
|
@@ -28,12 +28,20 @@ FactoryBot.define do
|
|
|
28
28
|
end
|
|
29
29
|
|
|
30
30
|
factory :exercise_base do
|
|
31
|
+
transient do
|
|
32
|
+
indexed { false }
|
|
33
|
+
end
|
|
34
|
+
|
|
31
35
|
language { guide ? guide.language : create(:language) }
|
|
32
36
|
sequence(:bibliotheca_id) { |n| n }
|
|
33
37
|
sequence(:number) { |n| n }
|
|
34
38
|
|
|
35
39
|
locale { :en }
|
|
36
40
|
guide
|
|
41
|
+
|
|
42
|
+
after(:build) do |exercise, evaluator|
|
|
43
|
+
exercise.guide = create(:indexed_guide) if evaluator.indexed
|
|
44
|
+
end
|
|
37
45
|
end
|
|
38
46
|
|
|
39
47
|
factory :challenge, parent: :exercise_base do
|
|
@@ -73,7 +81,7 @@ FactoryBot.define do
|
|
|
73
81
|
factory :exercise, parent: :problem
|
|
74
82
|
|
|
75
83
|
factory :indexed_exercise, parent: :exercise do
|
|
76
|
-
|
|
84
|
+
indexed { true }
|
|
77
85
|
end
|
|
78
86
|
|
|
79
87
|
factory :x_equal_5_exercise, parent: :exercise do
|
|
@@ -61,12 +61,6 @@ module Mumuki::Domain::Helpers::User
|
|
|
61
61
|
|
|
62
62
|
## Profile
|
|
63
63
|
|
|
64
|
-
def full_name
|
|
65
|
-
"#{first_name} #{last_name}".strip
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
alias_method :name, :full_name
|
|
69
|
-
|
|
70
64
|
def profile_completed?
|
|
71
65
|
self.class.profile_fields.map { |it| self[it] }.all? &:present?
|
|
72
66
|
end
|
|
@@ -32,11 +32,11 @@ class Mumuki::Domain::Organization::Settings < Mumukit::Platform::Model
|
|
|
32
32
|
end
|
|
33
33
|
|
|
34
34
|
def disabled_from=(disabled_from)
|
|
35
|
-
@disabled_from = disabled_from&.
|
|
35
|
+
@disabled_from = disabled_from&.in_time_zone
|
|
36
36
|
end
|
|
37
37
|
|
|
38
38
|
def in_preparation_until=(in_preparation_until)
|
|
39
|
-
@in_preparation_until = in_preparation_until&.
|
|
39
|
+
@in_preparation_until = in_preparation_until&.in_time_zone
|
|
40
40
|
end
|
|
41
41
|
|
|
42
42
|
def disabled?
|
|
@@ -8,6 +8,7 @@ class Mumuki::Domain::Submission::Try < Mumuki::Domain::Submission::ConsoleSubmi
|
|
|
8
8
|
def save_submission!(assignment)
|
|
9
9
|
assignment.query_results = [] if cookie.blank?
|
|
10
10
|
assignment.queries = cookie.insert_last(query)
|
|
11
|
+
assignment.save_submission! self
|
|
11
12
|
assignment.save!
|
|
12
13
|
end
|
|
13
14
|
|
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: 9.
|
|
4
|
+
version: 9.9.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: 2021-07-
|
|
11
|
+
date: 2021-07-15 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: rails
|
|
@@ -264,6 +264,7 @@ files:
|
|
|
264
264
|
- app/models/concerns/navigation/parent_navigation.rb
|
|
265
265
|
- app/models/concerns/navigation/siblings_navigation.rb
|
|
266
266
|
- app/models/concerns/navigation/terminal_navigation.rb
|
|
267
|
+
- app/models/concerns/onomastic.rb
|
|
267
268
|
- app/models/concerns/submittable/confirmable.rb
|
|
268
269
|
- app/models/concerns/submittable/queriable.rb
|
|
269
270
|
- app/models/concerns/submittable/questionable.rb
|
|
@@ -670,6 +671,7 @@ files:
|
|
|
670
671
|
- db/migrate/20210330175706_create_exam_registration_user_join_table.rb
|
|
671
672
|
- db/migrate/20210512200453_add_processed_flag_to_exam_registration.rb
|
|
672
673
|
- db/migrate/20210518100153_rename_last_moderator_access.rb
|
|
674
|
+
- db/migrate/20210707143002_add_assignment_id_to_message.rb
|
|
673
675
|
- lib/mumuki/domain.rb
|
|
674
676
|
- lib/mumuki/domain/area.rb
|
|
675
677
|
- lib/mumuki/domain/engine.rb
|