voluntary_recruiting 0.0.1 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|