mumuki-domain 9.14.1 → 9.18.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b312037c43def7204d8591702f2002340539b6f66df217e4bf8b35e5a0392785
4
- data.tar.gz: f417d2c02346fcd6e2460c246d38f0a9c4eb1ac8a5162bf72bbe00f983326bec
3
+ metadata.gz: 58b906585eb037f9120720bf77a34555343051e1aa2c87636a86208604247c2d
4
+ data.tar.gz: ac72f7c3a8e36c388fe4cbf0c7e1e3a51620c9a2a6a333222a033dfa56ab3176
5
5
  SHA512:
6
- metadata.gz: 5786a0b215fee7332099994a47e13b24d2f8a66647ede57aaa67bdcdd2e77433e471d8dc5f7ef48369bea06fb2636f900ed365d24b3b1549f0cef3c48d316f25
7
- data.tar.gz: 282e425ad11463f7c0945b323327f17addc7997e60f191a034b07317907e0156918fcd667786f4905b89682abe9bb2090148fab392aebd9f99c6c0ab1320be2b
6
+ metadata.gz: 254fa485adb9816805590f4fc60877b8e1626f152d7e335e419ac5402079ec9bd4f30a5fd85cab712e694c10f8aeb0a9829d762bd1ec01323ccec9525981d930
7
+ data.tar.gz: 5ef6dd8ed07d02d17c9c6049371bcd50a1235e7958d9a68ea41940121ff72c2f81c17beb9b9a69b2b5d70fc4c811df0bd1181cd18ebc28efbd9676d922d8d1a1
@@ -43,20 +43,6 @@ class Assignment < Progress
43
43
  after_initialize :set_default_top_submission_status
44
44
  before_save :award_experience_points!, :update_top_submission!, if: :submission_status_changed?
45
45
  after_save :dirty_parent_by_submission!, if: :completion_changed?
46
- before_validation :set_current_organization!, unless: :organization
47
-
48
- # TODO: Momentary as some assignments may not have an associated organization
49
- def set_current_organization!
50
- self.organization = Organization.current
51
- end
52
-
53
- def recontextualize!(new_organization = Organization.current)
54
- if organization != new_organization
55
- dirty_parent_by_submission! if organization.present? && exercise.used_in?(organization)
56
- self.organization = new_organization
57
- self.parent_id = nil
58
- end
59
- end
60
46
 
61
47
  def set_default_top_submission_status
62
48
  self.top_submission_status ||= 0
@@ -123,7 +109,7 @@ class Assignment < Progress
123
109
  end
124
110
 
125
111
  def content=(content)
126
- if content.present? && exercise.solvable?
112
+ if exercise.solvable?
127
113
  self.solution = exercise.single_choice? ? exercise.choice_index_for(content) : content
128
114
  end
129
115
  end
data/app/models/exam.rb CHANGED
@@ -49,7 +49,7 @@ class Exam < ApplicationRecord
49
49
  end
50
50
 
51
51
  def accessible_for?(user)
52
- authorized?(user) && enabled_for?(user)
52
+ (authorized?(user) && enabled_for?(user)) || user&.teacher_of?(course)
53
53
  end
54
54
 
55
55
  def timed?
@@ -38,6 +38,10 @@ class ExamRegistration::AuthorizationCriterion
38
38
  def meets_authorization_criteria?(authorization_request)
39
39
  meets_criterion? authorization_request.user, authorization_request.organization
40
40
  end
41
+
42
+ def authorization_criteria_matcher
43
+ criterion_matcher
44
+ end
41
45
  end
42
46
 
43
47
  class ExamRegistration::AuthorizationCriterion::None < ExamRegistration::AuthorizationCriterion
@@ -52,6 +56,10 @@ class ExamRegistration::AuthorizationCriterion::None < ExamRegistration::Authori
52
56
  def meets_criterion?(_user, _organization)
53
57
  true
54
58
  end
59
+
60
+ def criterion_matcher
61
+ {}
62
+ end
55
63
  end
56
64
 
57
65
  class ExamRegistration::AuthorizationCriterion::PassedExercises < ExamRegistration::AuthorizationCriterion
@@ -62,4 +70,8 @@ class ExamRegistration::AuthorizationCriterion::PassedExercises < ExamRegistrati
62
70
  def meets_criterion?(user, organization)
63
71
  user.passed_submissions_count_in(organization) >= value
64
72
  end
73
+
74
+ def criterion_matcher
75
+ { 'stats.passed': { '$gte': value.to_f } }
76
+ end
65
77
  end
@@ -12,7 +12,7 @@ class ExamRegistration < ApplicationRecord
12
12
 
13
13
  before_save :ensure_valid_authorization_criterion!
14
14
 
15
- delegate :meets_authorization_criteria?, :process_request!, to: :authorization_criterion
15
+ delegate :meets_authorization_criteria?, :process_request!, :authorization_criteria_matcher, to: :authorization_criterion
16
16
 
17
17
  alias_attribute :name, :description
18
18
 
@@ -76,6 +76,18 @@ class ExamRegistration < ApplicationRecord
76
76
  authorization_criterion.meets_criterion?(user, organization)
77
77
  end
78
78
 
79
+ def available_exams
80
+ return exams unless limited_authorization_requests?
81
+ counts = authorization_request_ids_counts
82
+ exams.select do |it|
83
+ counts[it.id].to_i < authorization_requests_limit
84
+ end
85
+ end
86
+
87
+ def limited_authorization_requests?
88
+ authorization_requests_limit.present?
89
+ end
90
+
79
91
  def multiple_options?
80
92
  exams.count > 1
81
93
  end
@@ -84,9 +96,39 @@ class ExamRegistration < ApplicationRecord
84
96
  end_time.past?
85
97
  end
86
98
 
99
+ def request_authorization!(user, exam)
100
+ with_available_exam exam do
101
+ authorization_requests.find_or_create_by! user: user do |it|
102
+ it.assign_attributes organization: organization, exam: exam
103
+ end
104
+ end
105
+ end
106
+
107
+ def update_authorization_request_by_id!(request_id, exam)
108
+ with_available_exam exam do
109
+ authorization_requests.update request_id, exam: exam
110
+ end
111
+ end
112
+
113
+ def authorization_request_ids_counts
114
+ authorization_requests.group(:exam_id).count
115
+ end
116
+
117
+ def exam_available?(exam)
118
+ available_exams.include? exam
119
+ end
120
+
121
+ def with_available_exam(exam, &block)
122
+ transaction do
123
+ raise Mumuki::Domain::GoneError unless exam_available?(exam)
124
+ block.call
125
+ end
126
+ end
127
+
87
128
  private
88
129
 
89
130
  def notify_registree!(registree)
90
131
  Notification.create_and_notify_via_email! organization: organization, user: registree, subject: :exam_registration, target: self
91
132
  end
133
+
92
134
  end
@@ -21,7 +21,7 @@ class Organization < ApplicationRecord
21
21
 
22
22
  belongs_to :book
23
23
  has_many :usages
24
-
24
+ has_many :exam_registrations
25
25
  has_many :certificate_programs
26
26
 
27
27
  validates_presence_of :contact_email, :locale, :time_zone
@@ -23,7 +23,8 @@ class OrganizationAccessMode::Base
23
23
 
24
24
  def discuss_here?
25
25
  organization.forum_enabled? && user.discusser_of?(organization) &&
26
- user.trusted_as_discusser_in?(organization) && !user.banned_from_forum?
26
+ user.trusted_as_discusser_in?(organization) && !user.banned_from_forum? &&
27
+ !user.currently_in_exam?
27
28
  end
28
29
 
29
30
  def show_discussion_element?
data/app/models/user.rb CHANGED
@@ -158,6 +158,7 @@ class User < ApplicationRecord
158
158
  end
159
159
 
160
160
  def detach!(role, course)
161
+ make_ex_student_of! course.slug if student_of?(course.slug) && solved_any_exercises?(course.organization)
161
162
  remove_permission! role, course.slug
162
163
  save_and_notify!
163
164
  end
@@ -202,10 +203,6 @@ class User < ApplicationRecord
202
203
  sequence[0..count + lookahead - 1]
203
204
  end
204
205
 
205
- # Tells if the given user can discuss in an organization
206
- #
207
- # This is true only when this organization has the forum enabled and the user
208
- # has the discusser pseudo-permission and the discusser is trusted
209
206
  def can_discuss_in?(organization)
210
207
  organization.access_mode(self).discuss_here?
211
208
  end
@@ -0,0 +1,5 @@
1
+ class AddAuthorizationRequestsLimitToExamRegistration < ActiveRecord::Migration[5.1]
2
+ def change
3
+ add_column :exam_registrations, :authorization_requests_limit, :integer
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ FactoryBot.define do
2
+ factory :exam_authorization do
3
+ exam { create(:exam) }
4
+ end
5
+ end
@@ -9,6 +9,7 @@ require_relative './factories/complement_factory'
9
9
  require_relative './factories/course_factory'
10
10
  require_relative './factories/discussion_factory'
11
11
  require_relative './factories/exam_factory'
12
+ require_relative './factories/exam_authorization_factory'
12
13
  require_relative './factories/exam_authorization_request_factory'
13
14
  require_relative './factories/exam_registration_factory'
14
15
  require_relative './factories/exercise_factory'
@@ -52,8 +52,6 @@ class Mumuki::Domain::Submission::Base
52
52
  private
53
53
 
54
54
  def save_submission!(assignment)
55
- assignment.content = content
56
- assignment.recontextualize!
57
55
  assignment.save!
58
56
  end
59
57
 
@@ -1,5 +1,6 @@
1
1
  class Mumuki::Domain::Submission::PersistentSubmission < Mumuki::Domain::Submission::Base
2
2
  def save_submission!(assignment)
3
+ assignment.content = content
3
4
  assignment.running!
4
5
  super
5
6
  assignment.save_submission! self
@@ -1,5 +1,5 @@
1
1
  module Mumuki
2
2
  module Domain
3
- VERSION = '9.14.1'
3
+ VERSION = '9.18.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: 9.14.1
4
+ version: 9.18.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-09-07 00:00:00.000000000 Z
11
+ date: 2021-09-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -114,14 +114,14 @@ dependencies:
114
114
  requirements:
115
115
  - - "~>"
116
116
  - !ruby/object:Gem::Version
117
- version: '1.0'
117
+ version: '1.2'
118
118
  type: :runtime
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
122
  - - "~>"
123
123
  - !ruby/object:Gem::Version
124
- version: '1.0'
124
+ version: '1.2'
125
125
  - !ruby/object:Gem::Dependency
126
126
  name: mumukit-platform
127
127
  requirement: !ruby/object:Gem::Requirement
@@ -686,6 +686,7 @@ files:
686
686
  - db/migrate/20210707143002_add_assignment_id_to_message.rb
687
687
  - db/migrate/20210719145706_add_new_fields_to_notifications.rb
688
688
  - db/migrate/20210803175124_add_ignored_notifications_to_users.rb
689
+ - db/migrate/20210929223144_add_authorization_requests_limit_to_exam_registration.rb
689
690
  - lib/mumuki/domain.rb
690
691
  - lib/mumuki/domain/area.rb
691
692
  - lib/mumuki/domain/engine.rb
@@ -721,6 +722,7 @@ files:
721
722
  - lib/mumuki/domain/factories/complement_factory.rb
722
723
  - lib/mumuki/domain/factories/course_factory.rb
723
724
  - lib/mumuki/domain/factories/discussion_factory.rb
725
+ - lib/mumuki/domain/factories/exam_authorization_factory.rb
724
726
  - lib/mumuki/domain/factories/exam_authorization_request_factory.rb
725
727
  - lib/mumuki/domain/factories/exam_factory.rb
726
728
  - lib/mumuki/domain/factories/exam_registration_factory.rb