Commit a36f5919a60355800a301dd74e4bd04c7d64ca5c
1 parent
ea767f36
Exists in
master
and in
28 other branches
Adds form required for community admission
Showing
8 changed files
with
135 additions
and
10 deletions
Show diff stats
plugins/custom_forms/db/migrate/20131107125327_add_admission_to_form.rb
0 → 100644
@@ -0,0 +1,18 @@ | @@ -0,0 +1,18 @@ | ||
1 | +class AddAdmissionToForm < ActiveRecord::Migration | ||
2 | + def self.up | ||
3 | + change_table :custom_forms_plugin_forms do |t| | ||
4 | + t.boolean :for_admission, :default => false | ||
5 | + end | ||
6 | + | ||
7 | + CustomFormsPlugin::Form.find_each do |f| | ||
8 | + f.for_admission = false | ||
9 | + f.save! | ||
10 | + end | ||
11 | + end | ||
12 | + | ||
13 | + def self.down | ||
14 | + change_table :custom_forms_plugin_forms do |t| | ||
15 | + t.remove :for_admission | ||
16 | + end | ||
17 | + end | ||
18 | +end |
plugins/custom_forms/lib/custom_forms_plugin/admission_survey.rb
0 → 100644
@@ -0,0 +1,24 @@ | @@ -0,0 +1,24 @@ | ||
1 | +class CustomFormsPlugin::AdmissionSurvey < CustomFormsPlugin::MembershipSurvey | ||
2 | + | ||
3 | + def perform | ||
4 | + super | ||
5 | + requestor.add_member(target) | ||
6 | + end | ||
7 | + | ||
8 | + def title | ||
9 | + _("Admission survey") | ||
10 | + end | ||
11 | + | ||
12 | + def information | ||
13 | + {:message => _('%{requestor} wants you to fill in some information before joining.')} | ||
14 | + end | ||
15 | + | ||
16 | + def target_notification_message | ||
17 | + _('Before joining %{requestor}, the administrators of this organization | ||
18 | + wants you to fill in some further information.') % {:requestor => requestor.name} | ||
19 | + end | ||
20 | + | ||
21 | + def target_notification_description | ||
22 | + _('%{requestor} wants you to fill in some further information.') % {:requestor => requestor.name} | ||
23 | + end | ||
24 | +end |
plugins/custom_forms/lib/custom_forms_plugin/form.rb
@@ -18,9 +18,10 @@ class CustomFormsPlugin::Form < Noosfero::Plugin::ActiveRecord | @@ -18,9 +18,10 @@ class CustomFormsPlugin::Form < Noosfero::Plugin::ActiveRecord | ||
18 | end | 18 | end |
19 | 19 | ||
20 | named_scope :from, lambda {|profile| {:conditions => {:profile_id => profile.id}}} | 20 | named_scope :from, lambda {|profile| {:conditions => {:profile_id => profile.id}}} |
21 | - named_scope :on_memberships, {:conditions => {:on_membership => true}} | 21 | + named_scope :on_memberships, {:conditions => {:on_membership => true, :for_admission => false}} |
22 | + named_scope :for_admissions, {:conditions => {:for_admission => true}} | ||
22 | =begin | 23 | =begin |
23 | - named_scope :accessible_to lambda do |profile| | 24 | + named_scope :accessible_to lambda do |profile| |
24 | #TODO should verify is profile is associated with the form owner | 25 | #TODO should verify is profile is associated with the form owner |
25 | profile_associated = ??? | 26 | profile_associated = ??? |
26 | {:conditions => [" | 27 | {:conditions => [" |
@@ -60,7 +61,7 @@ class CustomFormsPlugin::Form < Noosfero::Plugin::ActiveRecord | @@ -60,7 +61,7 @@ class CustomFormsPlugin::Form < Noosfero::Plugin::ActiveRecord | ||
60 | elsif access.kind_of?(Array) | 61 | elsif access.kind_of?(Array) |
61 | access.each do |value| | 62 | access.each do |value| |
62 | if !value.kind_of?(Integer) || !Profile.exists?(value) | 63 | if !value.kind_of?(Integer) || !Profile.exists?(value) |
63 | - errors.add(:access, _('There is no profile with the provided id.')) | 64 | + errors.add(:access, _('There is no profile with the provided id.')) |
64 | break | 65 | break |
65 | end | 66 | end |
66 | end | 67 | end |
plugins/custom_forms/lib/ext/role_assignment_trigger.rb
@@ -13,7 +13,26 @@ module RoleAssignmentTrigger | @@ -13,7 +13,26 @@ module RoleAssignmentTrigger | ||
13 | end | 13 | end |
14 | end | 14 | end |
15 | end | 15 | end |
16 | - | 16 | + |
17 | + before_validation_on_create do |ra| | ||
18 | + proceed_creation = true | ||
19 | + if ra.resource.kind_of?(Profile) | ||
20 | + profile = ra.resource | ||
21 | + person = ra.accessor | ||
22 | + ok = !profile.nil? && !person.nil? && profile.environment.present? | ||
23 | + if ok && profile.environment.plugin_enabled?(CustomFormsPlugin) && !person.is_member_of?(profile) | ||
24 | + CustomFormsPlugin::Form.from(profile).for_admissions.each do |form| | ||
25 | + admission_task_pending = person.tasks.pending.select {|task| task.kind_of?(CustomFormsPlugin::AdmissionSurvey) && task.form_id == form.id }.present? | ||
26 | + admission_task_finished = person.tasks.finished.select {|task| task.kind_of?(CustomFormsPlugin::AdmissionSurvey) && task.form_id == form.id }.present? | ||
27 | + | ||
28 | + CustomFormsPlugin::AdmissionSurvey.create!(:requestor => profile, :target => person, :form_id => form.id) unless admission_task_finished || admission_task_pending | ||
29 | + proceed_creation = false unless admission_task_finished | ||
30 | + end | ||
31 | + end | ||
32 | + end | ||
33 | + proceed_creation | ||
34 | + end | ||
35 | + | ||
17 | after_destroy do |ra| | 36 | after_destroy do |ra| |
18 | if ra.resource.kind_of?(Profile) | 37 | if ra.resource.kind_of?(Profile) |
19 | profile = ra.resource | 38 | profile = ra.resource |
@@ -24,6 +43,10 @@ module RoleAssignmentTrigger | @@ -24,6 +43,10 @@ module RoleAssignmentTrigger | ||
24 | task = person.tasks.pending.select {|task| task.kind_of?(CustomFormsPlugin::MembershipSurvey) && task.form_id == form.id}.first | 43 | task = person.tasks.pending.select {|task| task.kind_of?(CustomFormsPlugin::MembershipSurvey) && task.form_id == form.id}.first |
25 | task.cancel if task | 44 | task.cancel if task |
26 | end | 45 | end |
46 | + CustomFormsPlugin::Form.from(profile).for_admissions.each do |form| | ||
47 | + task = person.tasks.pending.select {|task| task.kind_of?(CustomFormsPlugin::MembershipSurvey) && task.form_id == form.id}.first | ||
48 | + task.cancel if task | ||
49 | + end | ||
27 | end | 50 | end |
28 | end | 51 | end |
29 | end | 52 | end |
plugins/custom_forms/test/unit/custom_forms_plugin/admission_survey_test.rb
0 → 100644
@@ -0,0 +1,14 @@ | @@ -0,0 +1,14 @@ | ||
1 | +require File.dirname(__FILE__) + '/../../../../../test/test_helper' | ||
2 | + | ||
3 | +class CustomFormsPlugin::MembershipSurveyTest < ActiveSupport::TestCase | ||
4 | + should 'add member to community on perform' do | ||
5 | + profile = fast_create(Community) | ||
6 | + person = fast_create(Person) | ||
7 | + form = CustomFormsPlugin::Form.create!(:name => 'Simple Form', :profile => profile) | ||
8 | + task = CustomFormsPlugin::AdmissionSurvey.create!(:form_id => form.id, :target => person, :requestor => profile) | ||
9 | + | ||
10 | + assert_difference person.memberships, :count, 1 do | ||
11 | + task.finish | ||
12 | + end | ||
13 | + end | ||
14 | +end |
plugins/custom_forms/test/unit/custom_forms_plugin/form_test.rb
@@ -188,4 +188,27 @@ class CustomFormsPlugin::FormTest < ActiveSupport::TestCase | @@ -188,4 +188,27 @@ class CustomFormsPlugin::FormTest < ActiveSupport::TestCase | ||
188 | assert_equal form.fields, [url_field, license_field] | 188 | assert_equal form.fields, [url_field, license_field] |
189 | end | 189 | end |
190 | 190 | ||
191 | + should 'have a named_scope that retrieves all forms required for membership' do | ||
192 | + profile = fast_create(Profile) | ||
193 | + f1 = CustomFormsPlugin::Form.create!(:name => 'For admission 1', :profile => profile, :for_admission => true) | ||
194 | + f2 = CustomFormsPlugin::Form.create!(:name => 'For admission 2', :profile => profile, :for_admission => true) | ||
195 | + f3 = CustomFormsPlugin::Form.create!(:name => 'Not for admission', :profile => profile, :for_admission => false) | ||
196 | + scope = CustomFormsPlugin::Form.from(profile).for_admissions | ||
197 | + | ||
198 | + assert_equal ActiveRecord::NamedScope::Scope, scope.class | ||
199 | + assert_includes scope, f1 | ||
200 | + assert_includes scope, f2 | ||
201 | + assert_not_includes scope, f3 | ||
202 | + end | ||
203 | + | ||
204 | + should 'not include admission membership in on membership named scope' do | ||
205 | + profile = fast_create(Profile) | ||
206 | + f1 = CustomFormsPlugin::Form.create!(:name => 'On membership', :profile => profile, :on_membership => true) | ||
207 | + f2 = CustomFormsPlugin::Form.create!(:name => 'For admission', :profile => profile, :on_membership => true, :for_admission => true) | ||
208 | + scope = CustomFormsPlugin::Form.from(profile).on_memberships | ||
209 | + | ||
210 | + assert_equal ActiveRecord::NamedScope::Scope, scope.class | ||
211 | + assert_includes scope, f1 | ||
212 | + assert_not_includes scope, f2 | ||
213 | + end | ||
191 | end | 214 | end |
plugins/custom_forms/test/unit/ext/role_assingment_test.rb
@@ -27,25 +27,46 @@ class RoleAssignmentsTest < ActiveSupport::TestCase | @@ -27,25 +27,46 @@ class RoleAssignmentsTest < ActiveSupport::TestCase | ||
27 | end | 27 | end |
28 | end | 28 | end |
29 | 29 | ||
30 | - should 'cancel membership_surveys if membership is undone and task is active' do | 30 | + should 'cancel surveys if membership is undone and task is active' do |
31 | environment = Environment.default | 31 | environment = Environment.default |
32 | environment.enable_plugin(CustomFormsPlugin) | 32 | environment.enable_plugin(CustomFormsPlugin) |
33 | organization = fast_create(Organization) | 33 | organization = fast_create(Organization) |
34 | person = fast_create(Person) | 34 | person = fast_create(Person) |
35 | - form = CustomFormsPlugin::Form.create!(:profile => organization, :name => 'Form', :on_membership => true) | 35 | + form1 = CustomFormsPlugin::Form.create!(:profile => organization, :name => 'Form 1', :on_membership => true) |
36 | organization.add_member(person) | 36 | organization.add_member(person) |
37 | 37 | ||
38 | assert_difference CustomFormsPlugin::MembershipSurvey.pending, :count, -1 do | 38 | assert_difference CustomFormsPlugin::MembershipSurvey.pending, :count, -1 do |
39 | organization.remove_member(person) | 39 | organization.remove_member(person) |
40 | end | 40 | end |
41 | 41 | ||
42 | + form2 = CustomFormsPlugin::Form.create!(:profile => organization, :name => 'Form 2', :for_admission => true) | ||
42 | organization.add_member(person) | 43 | organization.add_member(person) |
43 | - task = CustomFormsPlugin::MembershipSurvey.last | ||
44 | - task.status = Task::Status::FINISHED | ||
45 | - task.save! | 44 | + |
45 | + assert_difference CustomFormsPlugin::AdmissionSurvey.pending, :count, -1 do | ||
46 | + organization.remove_member(person) | ||
47 | + end | ||
48 | + | ||
49 | + organization.add_member(person) | ||
50 | + tasks = CustomFormsPlugin::MembershipSurvey.all.last(2) | ||
51 | + tasks.each {|t| t.status = Task::Status::FINISHED } | ||
52 | + tasks.each {|t| t.save! } | ||
46 | assert_no_difference CustomFormsPlugin::MembershipSurvey.finished, :count do | 53 | assert_no_difference CustomFormsPlugin::MembershipSurvey.finished, :count do |
47 | organization.remove_member(person) | 54 | organization.remove_member(person) |
48 | end | 55 | end |
49 | end | 56 | end |
50 | -end | ||
51 | 57 | ||
58 | + should 'create admission survey when atempted membership' do | ||
59 | + environment = Environment.default | ||
60 | + environment.enable_plugin(CustomFormsPlugin) | ||
61 | + organization = fast_create(Organization) | ||
62 | + person = fast_create(Person) | ||
63 | + f1 = CustomFormsPlugin::Form.create!(:profile => organization, :name => 'Form 1', :for_admission => true) | ||
64 | + f2 = CustomFormsPlugin::Form.create!(:profile => organization, :name => 'Form 2', :for_admission => true) | ||
65 | + f3 = CustomFormsPlugin::Form.create!(:profile => organization, :name => 'Form 3', :for_admission => false) | ||
66 | + | ||
67 | + assert_difference CustomFormsPlugin::AdmissionSurvey, :count, 2 do | ||
68 | + organization.add_member(person) | ||
69 | + end | ||
70 | + assert !organization.members.include?(person) | ||
71 | + end | ||
72 | +end |
plugins/custom_forms/views/custom_forms_plugin_myprofile/_form.html.erb
@@ -11,6 +11,7 @@ | @@ -11,6 +11,7 @@ | ||
11 | )) %> | 11 | )) %> |
12 | <%= labelled_form_field _('Access'), f.select(:access, access_options(profile))%> | 12 | <%= labelled_form_field _('Access'), f.select(:access, access_options(profile))%> |
13 | <% if profile.organization? %> | 13 | <% if profile.organization? %> |
14 | + <%= labelled_form_field _('Required for membership approval'), f.check_box(:for_admission) %> | ||
14 | <%= labelled_form_field _('Triggered on membership'), f.check_box(:on_membership) %> | 15 | <%= labelled_form_field _('Triggered on membership'), f.check_box(:on_membership) %> |
15 | <% end %> | 16 | <% end %> |
16 | <%= labelled_form_field _('Description'), f.text_area(:description, :style => 'width: 100%') %> | 17 | <%= labelled_form_field _('Description'), f.text_area(:description, :style => 'width: 100%') %> |