voluntary_recruiting 0.0.1 → 0.1.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/controllers/candidatures_controller.rb +3 -2
- data/app/controllers/vacancies_controller.rb +6 -5
- data/app/models/candidature.rb +7 -4
- data/app/models/state_machines/candidature.rb +8 -6
- data/app/models/vacancy.rb +64 -10
- data/app/views/candidatures/_form.html.erb +4 -6
- data/app/views/vacancies/_form.html.erb +52 -9
- data/app/views/vacancies/show.html.erb +1 -1
- data/app/views/workflow/project_owner/_candidatures.html.erb +1 -2
- data/config/locales/resources/candidature/en.yml +6 -1
- data/config/locales/resources/vacancy/en.yml +6 -1
- data/db/migrate/20151012141951_add_timespan_to_vacancy.rb +19 -0
- data/lib/voluntary_recruiting/controller/project_owner_controller.rb +9 -1
- data/lib/voluntary_recruiting/version.rb +1 -1
- metadata +6 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c15d4b2c1d7fc57914c9e1595fb99c484a4cff30
|
4
|
+
data.tar.gz: 443f3fe702622964d81122c9a1d37fc8c68fb272
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1af84f578a3606ca7323d310a576a15dfa60a4f7e6d901587f485d3cdd34eeddd3ba23e9b1e87ce08d4223ef24b2eba7cf8ff291ee385a9f3269cbba64537cd3
|
7
|
+
data.tar.gz: 6472041859cf05dcd96559c421eed238ca481e68f68a4526ccea53c4d6c0864c8873406a738790d866cd9facdb0d7eab8815a27617eeca6fede4474e561d2c9b
|
@@ -34,6 +34,7 @@ class CandidaturesController < ApplicationController
|
|
34
34
|
@candidature = Candidature.new(params[:candidature])
|
35
35
|
@candidature.resource_type = 'User'
|
36
36
|
@candidature.resource_id = current_user.id
|
37
|
+
@candidature.user_id = current_user.id
|
37
38
|
|
38
39
|
if @candidature.save
|
39
40
|
redirect_to @candidature, notice: t('general.form.successfully_created')
|
@@ -75,10 +76,10 @@ class CandidaturesController < ApplicationController
|
|
75
76
|
private
|
76
77
|
|
77
78
|
def find_candidature
|
78
|
-
@candidature = Candidature.includes(:vacancy, :resource, :comments).
|
79
|
+
@candidature = Candidature.includes(:vacancy, :resource, :comments).find(params[:id])
|
79
80
|
end
|
80
81
|
|
81
82
|
def find_vacancy
|
82
|
-
@vacancy = params[:vacancy_id].present? ? Vacancy.
|
83
|
+
@vacancy = params[:vacancy_id].present? ? Vacancy.find(params[:vacancy_id]) : nil
|
83
84
|
end
|
84
85
|
end
|
@@ -10,7 +10,7 @@ class VacanciesController < ApplicationController
|
|
10
10
|
respond_to :html, :js, :json
|
11
11
|
|
12
12
|
def index
|
13
|
-
@vacancies = @project ? @project.vacancies : Vacancy.all
|
13
|
+
@vacancies = @project ? @project.vacancies : Vacancy.where(type: nil).all
|
14
14
|
end
|
15
15
|
|
16
16
|
def show
|
@@ -25,6 +25,7 @@ class VacanciesController < ApplicationController
|
|
25
25
|
|
26
26
|
def create
|
27
27
|
@vacancy = Vacancy.new(params[:vacancy])
|
28
|
+
@vacancy.resource_type = 'User'
|
28
29
|
|
29
30
|
if @vacancy.project.user_id == current_user.id
|
30
31
|
@vacancy.do_open
|
@@ -41,11 +42,11 @@ class VacanciesController < ApplicationController
|
|
41
42
|
end
|
42
43
|
|
43
44
|
def edit
|
44
|
-
@vacancy = Vacancy.
|
45
|
+
@vacancy = Vacancy.find(params[:id])
|
45
46
|
end
|
46
47
|
|
47
48
|
def update
|
48
|
-
@vacancy = Vacancy.
|
49
|
+
@vacancy = Vacancy.find(params[:id])
|
49
50
|
|
50
51
|
if @vacancy.update_attributes(params[:vacancy])
|
51
52
|
redirect_to @vacancy, notice: t('general.form.successfully_updated')
|
@@ -55,7 +56,7 @@ class VacanciesController < ApplicationController
|
|
55
56
|
end
|
56
57
|
|
57
58
|
def destroy
|
58
|
-
@vacancy = Vacancy.
|
59
|
+
@vacancy = Vacancy.find(params[:id])
|
59
60
|
@vacancy.destroy
|
60
61
|
redirect_to vacancies_url, notice: t('general.form.destroyed')
|
61
62
|
end
|
@@ -79,7 +80,7 @@ class VacanciesController < ApplicationController
|
|
79
80
|
|
80
81
|
@vacancy = Vacancy
|
81
82
|
@vacancy = @vacancy.includes(:project, :candidatures, :comments) if action_name == 'show'
|
82
|
-
@vacancy = @vacancy.
|
83
|
+
@vacancy = @vacancy.find(params[:id])
|
83
84
|
end
|
84
85
|
|
85
86
|
def find_project
|
data/app/models/candidature.rb
CHANGED
@@ -11,14 +11,11 @@ class Candidature < ActiveRecord::Base
|
|
11
11
|
|
12
12
|
validates :vacancy_id, presence: true
|
13
13
|
validates :offeror_id, presence: true
|
14
|
-
validates :resource_id, presence: true, uniqueness: { scope: [:resource_type, :vacancy_id] }
|
14
|
+
validates :resource_id, presence: true, uniqueness: { scope: [:resource_type, :vacancy_id] }, if: 'validate_resource_id?'
|
15
15
|
#validates :name, presence: true, uniqueness: { scope: :vacancy_id }
|
16
16
|
|
17
17
|
attr_accessible :vacancy, :vacancy_id, :name, :text
|
18
18
|
|
19
|
-
extend FriendlyId
|
20
|
-
friendly_id :name, use: :slugged
|
21
|
-
|
22
19
|
before_validation :set_offeror
|
23
20
|
|
24
21
|
# association shortcuts
|
@@ -30,6 +27,12 @@ class Candidature < ActiveRecord::Base
|
|
30
27
|
project.product
|
31
28
|
end
|
32
29
|
|
30
|
+
protected
|
31
|
+
|
32
|
+
def validate_resource_id?
|
33
|
+
true
|
34
|
+
end
|
35
|
+
|
33
36
|
private
|
34
37
|
|
35
38
|
def set_offeror
|
@@ -30,12 +30,14 @@ module StateMachines::Candidature
|
|
30
30
|
after_transition do |object, transition|
|
31
31
|
case transition.to
|
32
32
|
when 'accepted'
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
33
|
+
if object.vacancy.create_project_user?
|
34
|
+
ProjectUser.find_or_create_by_project_id_and_vacancy_id_and_user_id!(
|
35
|
+
project_id: object.vacancy.project_id, vacancy_id: object.vacancy_id,
|
36
|
+
user_id: object.resource_id
|
37
|
+
)
|
38
|
+
end
|
37
39
|
|
38
|
-
if object.vacancy.limit == object.vacancy.
|
40
|
+
if object.vacancy.limit == object.vacancy.calculate_accepted_candidatures_amount
|
39
41
|
object.vacancy.close! unless object.vacancy.closed?
|
40
42
|
end
|
41
43
|
when 'denied'
|
@@ -48,7 +50,7 @@ module StateMachines::Candidature
|
|
48
50
|
|
49
51
|
# state validations
|
50
52
|
def candidatures_limit_not_reached
|
51
|
-
if vacancy.limit == vacancy.
|
53
|
+
if vacancy.limit == vacancy.calculate_accepted_candidatures_amount
|
52
54
|
errors[:state] << I18n.t('activerecord.errors.models.vacancy.attributes.limit.reached')
|
53
55
|
end
|
54
56
|
end
|
data/app/models/vacancy.rb
CHANGED
@@ -13,23 +13,77 @@ class Vacancy < ActiveRecord::Base
|
|
13
13
|
accepts_nested_attributes_for :candidatures, allow_destroy: true, reject_if: ->(t) { t['name'].blank? }
|
14
14
|
scope :open, -> { where(state: 'open') }
|
15
15
|
|
16
|
-
|
16
|
+
validates :resource_type, presence: true
|
17
17
|
validates :project_id, presence: true
|
18
18
|
validates :offeror_id, presence: true
|
19
|
-
validates :name, presence: true
|
20
|
-
validates :text, presence: true
|
21
|
-
validates :limit, presence: true
|
22
|
-
|
23
|
-
attr_accessible :project_id, :name, :text, :limit, :candidatures_attributes
|
24
|
-
|
25
|
-
extend FriendlyId
|
19
|
+
validates :name, presence: true
|
26
20
|
|
27
|
-
|
21
|
+
attr_accessible :project_id, :name, :text, :limit, :timezone, :from_raw, :to_raw, :resource_type, :candidatures_attributes
|
28
22
|
|
29
23
|
before_validation :set_defaults
|
30
24
|
|
31
25
|
def candidatures_left
|
32
|
-
limit
|
26
|
+
if limit
|
27
|
+
limit - candidatures.accepted.count
|
28
|
+
else
|
29
|
+
'∞'
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def from_raw
|
34
|
+
timezone && from ? from.in_time_zone(timezone).strftime('%Y-%m-%d %H:%M:%S') : ''
|
35
|
+
end
|
36
|
+
|
37
|
+
def from_raw=(value)
|
38
|
+
if timezone && value.present?
|
39
|
+
datetime = Time.zone.parse(value)
|
40
|
+
args = [
|
41
|
+
datetime.strftime('%Y').to_i, datetime.strftime('%m').to_i, datetime.strftime('%d').to_i,
|
42
|
+
datetime.strftime('%H').to_i, datetime.strftime('%M').to_i, datetime.strftime('%S').to_i
|
43
|
+
]
|
44
|
+
timezone_was = Time.zone
|
45
|
+
Time.zone = timezone
|
46
|
+
self.from = Time.zone.local *args
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def to_raw
|
51
|
+
timezone && to ? to.in_time_zone(timezone).strftime('%Y-%m-%d %H:%M:%S') : ''
|
52
|
+
end
|
53
|
+
|
54
|
+
def to_raw=(value)
|
55
|
+
if timezone && value.present?
|
56
|
+
datetime = Time.zone.parse(value)
|
57
|
+
args = [
|
58
|
+
datetime.strftime('%Y').to_i, datetime.strftime('%m').to_i, datetime.strftime('%d').to_i,
|
59
|
+
datetime.strftime('%H').to_i, datetime.strftime('%M').to_i, datetime.strftime('%S').to_i
|
60
|
+
]
|
61
|
+
timezone_was = Time.zone
|
62
|
+
Time.zone = timezone
|
63
|
+
self.to = Time.zone.local *args
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def ended?
|
68
|
+
if from.present? && Time.now < from
|
69
|
+
false
|
70
|
+
elsif from.blank? && to.present? && Time.now < to
|
71
|
+
false
|
72
|
+
elsif from.blank? && to.present?
|
73
|
+
true
|
74
|
+
elsif from.blank?
|
75
|
+
false
|
76
|
+
else
|
77
|
+
true
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def calculate_accepted_candidatures_amount
|
82
|
+
candidatures.accepted.count
|
83
|
+
end
|
84
|
+
|
85
|
+
def create_project_user?
|
86
|
+
true
|
33
87
|
end
|
34
88
|
|
35
89
|
protected
|
@@ -1,13 +1,11 @@
|
|
1
1
|
<%= simple_form_for(@candidature) do |f| %>
|
2
2
|
<%= render partial: 'shared/form/error_messages', locals: { resource: @candidature } %>
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
<%= f.input :text, input_html: {style: 'width: 500px; height:300px;'} %>
|
8
|
-
</div>
|
4
|
+
<%= @candidature.vacancy ? f.hidden_field(:vacancy_id) : f.association(:vacancy) %>
|
5
|
+
<%= f.input :name %>
|
6
|
+
<%= f.input :text, input_html: {style: 'width: 500px; height:300px;'} %>
|
9
7
|
|
10
|
-
<div class="form-
|
8
|
+
<div class="form-group">
|
11
9
|
<%= f.button :submit %>
|
12
10
|
</div>
|
13
11
|
<% end %>
|
@@ -1,15 +1,58 @@
|
|
1
|
-
<%= simple_form_for(@vacancy, html: {class: 'form-horizontal'}) do |f| %>
|
1
|
+
<%= simple_form_for(@vacancy, html: { class: 'form-horizontal' }, wrapper: :horizontal_form) do |f| %>
|
2
2
|
<%= render partial: 'shared/form/error_messages', locals: { resource: @vacancy } %>
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
4
|
+
<%= @vacancy.project ? f.hidden_field(:project_id) : f.association(:project) %>
|
5
|
+
|
6
|
+
<%= f.input :name %>
|
7
|
+
<%= f.input :text, input_html: {style: 'width: 500px; height:300px;'} %>
|
8
|
+
<%= f.input :limit %>
|
9
|
+
|
10
|
+
<div class="form-group string optional vacancy_timezone">
|
11
|
+
<label class="string optional control-label col-sm-3 control-label" for="vacancy_timezone">
|
12
|
+
<%= t('attributes.timezone') %>
|
13
|
+
</label>
|
14
|
+
<div class="col-sm-9">
|
15
|
+
<%= time_zone_select @vacancy, :timezone, nil, {}, id: 'vacancy_timezone', name: 'vacancy[timezone]', class: 'form-control' %>
|
16
|
+
</div>
|
10
17
|
</div>
|
11
18
|
|
12
|
-
<div class="form-
|
13
|
-
|
19
|
+
<div class="form-group string optional vacancy_from">
|
20
|
+
<label class="string optional control-label col-sm-3 control-label" for="vacancy_from">
|
21
|
+
<%= t('activerecord.attributes.vacancy.from') %>
|
22
|
+
</label>
|
23
|
+
<div class="col-sm-9">
|
24
|
+
<div class="datetime_picker" class="input-append date">
|
25
|
+
<%= text_field_tag :from_raw, @vacancy.from_raw, name: 'vacancy[from_raw]', 'data-format' => 'yyyy-MM-dd hh:mm:ss' %>
|
26
|
+
<span class="add-on">
|
27
|
+
<i data-time-icon="icon-time" data-date-icon="icon-calendar">
|
28
|
+
</i>
|
29
|
+
</span>
|
30
|
+
</div>
|
31
|
+
</div>
|
32
|
+
</div>
|
33
|
+
|
34
|
+
<div class="form-group string optional vacancy_to">
|
35
|
+
<label class="string optional control-label col-sm-3 control-label" for="vacancy_to">
|
36
|
+
<%= t('activerecord.attributes.vacancy.to') %>
|
37
|
+
</label>
|
38
|
+
<div class="col-sm-9">
|
39
|
+
<div class="datetime_picker" class="input-append date">
|
40
|
+
<%= text_field_tag :to_raw, @vacancy.to_raw, name: 'vacancy[to_raw]', 'data-format' => 'yyyy-MM-dd hh:mm:ss' %>
|
41
|
+
<span class="add-on">
|
42
|
+
<i data-time-icon="icon-time" data-date-icon="icon-calendar">
|
43
|
+
</i>
|
44
|
+
</span>
|
45
|
+
</div>
|
46
|
+
</div>
|
47
|
+
</div>
|
48
|
+
|
49
|
+
<div class="form-group">
|
50
|
+
<div class="col-sm-offset-3 col-sm-9">
|
51
|
+
<%= f.button :submit %>
|
52
|
+
</div>
|
14
53
|
</div>
|
15
54
|
<% end %>
|
55
|
+
|
56
|
+
<% content_for :document_ready do %>
|
57
|
+
$('#vacancy_timezone').val('<%= @vacancy.timezone %>')
|
58
|
+
<% end %>
|
@@ -5,7 +5,7 @@
|
|
5
5
|
|
6
6
|
<dl class="dl-horizontal">
|
7
7
|
<%= show_associations :project %>
|
8
|
-
<%= show_attribute :limit, value: "#{@vacancy.
|
8
|
+
<%= show_attribute :limit, value: "#{@vacancy.calculate_accepted_candidatures_amount} / #{@vacancy.limit ? @vacancy.limit : '∞'}" %>
|
9
9
|
<%= show_attribute :state %>
|
10
10
|
<%= show_actions %>
|
11
11
|
</dl>
|
@@ -18,8 +18,7 @@
|
|
18
18
|
<%= render partial: 'shared/collection/table', locals: {
|
19
19
|
type: 'candidatures', collection: @candidatures[state],
|
20
20
|
columns: {
|
21
|
-
'project_id' => 'vacancy.project', 'vacancy_id' => '', '
|
22
|
-
'resource_id' => ''
|
21
|
+
'project_id' => 'vacancy.project', 'vacancy_id' => '', 'resource_id' => ''
|
23
22
|
},
|
24
23
|
options: {show_title: false, append_new_link: false }
|
25
24
|
} %>
|
@@ -0,0 +1,19 @@
|
|
1
|
+
class AddTimespanToVacancy < ActiveRecord::Migration
|
2
|
+
def up
|
3
|
+
add_column :vacancies, :timezone, :string
|
4
|
+
add_column :vacancies, :from, :datetime
|
5
|
+
add_column :vacancies, :to, :datetime
|
6
|
+
remove_index :vacancies, name: 'index_vacancies_on_project_id_and_name'
|
7
|
+
add_column :candidatures, :user_id, :integer
|
8
|
+
|
9
|
+
Candidature.where(resource_type: 'User').update_all('user_id = resource_id')
|
10
|
+
end
|
11
|
+
|
12
|
+
def down
|
13
|
+
remove_column :vacancies, :timezone
|
14
|
+
remove_column :vacancies, :from
|
15
|
+
remove_column :vacancies, :to
|
16
|
+
add_index :vacancies, [:project_id, :name], unique: true
|
17
|
+
remove_column :candidatures, :user_id
|
18
|
+
end
|
19
|
+
end
|
@@ -15,7 +15,15 @@ module VoluntaryRecruiting
|
|
15
15
|
# eval("@#{controller}[state] = current_user.offeror_#{controller}.where(state: state).limit(5)")
|
16
16
|
collection = controller.to_s.classify.constantize.where(
|
17
17
|
query, user_id: current_user.id, state: state
|
18
|
-
)
|
18
|
+
)
|
19
|
+
|
20
|
+
if controller == :vacancies
|
21
|
+
collection = collection.where(type: nil)
|
22
|
+
elsif controller == :candidatures
|
23
|
+
collection = collection.where(resource_type: 'User')
|
24
|
+
end
|
25
|
+
|
26
|
+
collection.order('created_at DESC').limit(10)
|
19
27
|
eval("@#{controller}[state] = collection")
|
20
28
|
end
|
21
29
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: voluntary_recruiting
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mathias Gawlista
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-10-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: voluntary
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0.
|
19
|
+
version: '0.7'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 0.
|
26
|
+
version: '0.7'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: letter_opener
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -262,7 +262,7 @@ dependencies:
|
|
262
262
|
- - "~>"
|
263
263
|
- !ruby/object:Gem::Version
|
264
264
|
version: 0.7.1
|
265
|
-
description:
|
265
|
+
description: "#Crowdsourcing gem voluntary's recruiting plugin: http://bit.ly/vrec-0-1-0"
|
266
266
|
email:
|
267
267
|
- gawlista@gmail.com
|
268
268
|
executables: []
|
@@ -298,6 +298,7 @@ files:
|
|
298
298
|
- config/locales/resources/vacancy/en.yml
|
299
299
|
- config/routes.rb
|
300
300
|
- db/migrate/20150711124651_add_recruiting.rb
|
301
|
+
- db/migrate/20151012141951_add_timespan_to_vacancy.rb
|
301
302
|
- lib/tasks/voluntary_recruiting_tasks.rake
|
302
303
|
- lib/voluntary_recruiting.rb
|
303
304
|
- lib/voluntary_recruiting/ability.rb
|