Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
V
VenJob
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Mai Hoang Thai Ha
VenJob
Commits
5aec5521
Commit
5aec5521
authored
Oct 26, 2021
by
Thai Ha
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
applied jobs search function
parent
57d07585
Show whitespace changes
Inline
Side-by-side
Showing
15 changed files
with
204 additions
and
20 deletions
+204
-20
('INNER JOIN cities_jobs ON cities_jobs.job_id = apply_jobs.job_id')
+32
-0
('INNER JOIN industries_jobs ON industries_jobs.job_id = apply_jobs.job_id')
+32
-0
app/controllers/admins_controller.rb
+47
-0
app/controllers/application_controller.rb
+0
-8
app/controllers/favorite_jobs_controller.rb
+2
-1
app/controllers/history_jobs_controller.rb
+2
-1
app/controllers/users_controller.rb
+0
-2
app/models/admin.rb
+1
-0
app/models/apply_job.rb
+5
-0
app/services/export_csv_service.rb
+20
-0
app/services/solr.rb
+0
-1
app/views/admins/applies.html.slim
+49
-0
config/locales/en.yml
+8
-0
config/routes.rb
+1
-0
lib/tasks/web_crawler.rake
+5
-7
No files found.
('INNER JOIN cities_jobs ON cities_jobs.job_id = apply_jobs.job_id')
0 → 100644
View file @
5aec5521
=> [[32m#<ApplyJob:0x0000556661e18800[0m
id: [1;34m74[0m,
job_id: [1;34m893[0m,
user_id: [1;34m2[0m,
created_at: [1;34;4mThu[0m, [1;34m07[0m [1;34;4mOct[0m [1;34m2021[0m [1;34m09[0m:[1;34m47[0m:[1;35m21.987489000[0m [1;34;4mUTC[0m [1;34m+00[0m:[1;34m00[0m,
updated_at: [1;34;4mThu[0m, [1;34m07[0m [1;34;4mOct[0m [1;34m2021[0m [1;34m09[0m:[1;34m47[0m:[1;35m22.006742000[0m [1;34;4mUTC[0m [1;34m+00[0m:[1;34m00[0m,
user_name: [31m[1;31m"[0m[31mMai Hoang Thai Ha`[1;31m"[0m[31m[0m,
email: [31m[1;31m"[0m[31mmessidauhoi@gmail.com[1;31m"[0m[31m[0m[32m>[0m,
[32m#<ApplyJob:0x0000556661e68b98[0m
id: [1;34m75[0m,
job_id: [1;34m893[0m,
user_id: [1;34m2[0m,
created_at: [1;34;4mFri[0m, [1;34m08[0m [1;34;4mOct[0m [1;34m2021[0m [1;34m09[0m:[1;34m05[0m:[1;35m41.687605000[0m [1;34;4mUTC[0m [1;34m+00[0m:[1;34m00[0m,
updated_at: [1;34;4mFri[0m, [1;34m08[0m [1;34;4mOct[0m [1;34m2021[0m [1;34m09[0m:[1;34m05[0m:[1;35m41.707387000[0m [1;34;4mUTC[0m [1;34m+00[0m:[1;34m00[0m,
user_name: [31m[1;31m"[0m[31mMai Hoang Thai Ha`[1;31m"[0m[31m[0m,
email: [31m[1;31m"[0m[31mmessidauhoi@gmail.com[1;31m"[0m[31m[0m[32m>[0m,
[32m#<ApplyJob:0x0000556661e68a80[0m
id: [1;34m76[0m,
job_id: [1;34m890[0m,
user_id: [1;34m6[0m,
created_at: [1;34;4mThu[0m, [1;34m21[0m [1;34;4mOct[0m [1;34m2021[0m [1;34m07[0m:[1;34m29[0m:[1;35m30.011249000[0m [1;34;4mUTC[0m [1;34m+00[0m:[1;34m00[0m,
updated_at: [1;34;4mThu[0m, [1;34m21[0m [1;34;4mOct[0m [1;34m2021[0m [1;34m07[0m:[1;34m29[0m:[1;35m30.023913000[0m [1;34;4mUTC[0m [1;34m+00[0m:[1;34m00[0m,
user_name: [31m[1;31m"[0m[31mMai Hoang Thai Ha`[1;31m"[0m[31m[0m,
email: [31m[1;31m"[0m[31mmhthaiha@gmail.com[1;31m"[0m[31m[0m[32m>[0m,
[32m#<ApplyJob:0x0000556661e688f0[0m
id: [1;34m77[0m,
job_id: [1;34m889[0m,
user_id: [1;34m6[0m,
created_at: [1;34;4mThu[0m, [1;34m21[0m [1;34;4mOct[0m [1;34m2021[0m [1;34m07[0m:[1;34m29[0m:[1;35m45.888611000[0m [1;34;4mUTC[0m [1;34m+00[0m:[1;34m00[0m,
updated_at: [1;34;4mThu[0m, [1;34m21[0m [1;34;4mOct[0m [1;34m2021[0m [1;34m07[0m:[1;34m29[0m:[1;35m45.899844000[0m [1;34;4mUTC[0m [1;34m+00[0m:[1;34m00[0m,
user_name: [31m[1;31m"[0m[31maasfasff [1;31m"[0m[31m[0m,
email: [31m[1;31m"[0m[31mmhthaiha@gmail.com[1;31m"[0m[31m[0m[32m>[0m]
('INNER JOIN industries_jobs ON industries_jobs.job_id = apply_jobs.job_id')
0 → 100644
View file @
5aec5521
=> [[32m#<ApplyJob:0x00005572d6d6c498[0m
id: [1;34m74[0m,
job_id: [1;34m893[0m,
user_id: [1;34m2[0m,
created_at: [1;34;4mThu[0m, [1;34m07[0m [1;34;4mOct[0m [1;34m2021[0m [1;34m09[0m:[1;34m47[0m:[1;35m21.987489000[0m [1;34;4mUTC[0m [1;34m+00[0m:[1;34m00[0m,
updated_at: [1;34;4mThu[0m, [1;34m07[0m [1;34;4mOct[0m [1;34m2021[0m [1;34m09[0m:[1;34m47[0m:[1;35m22.006742000[0m [1;34;4mUTC[0m [1;34m+00[0m:[1;34m00[0m,
user_name: [31m[1;31m"[0m[31mMai Hoang Thai Ha`[1;31m"[0m[31m[0m,
email: [31m[1;31m"[0m[31mmessidauhoi@gmail.com[1;31m"[0m[31m[0m[32m>[0m,
[32m#<ApplyJob:0x00005572d6d6c3d0[0m
id: [1;34m75[0m,
job_id: [1;34m893[0m,
user_id: [1;34m2[0m,
created_at: [1;34;4mFri[0m, [1;34m08[0m [1;34;4mOct[0m [1;34m2021[0m [1;34m09[0m:[1;34m05[0m:[1;35m41.687605000[0m [1;34;4mUTC[0m [1;34m+00[0m:[1;34m00[0m,
updated_at: [1;34;4mFri[0m, [1;34m08[0m [1;34;4mOct[0m [1;34m2021[0m [1;34m09[0m:[1;34m05[0m:[1;35m41.707387000[0m [1;34;4mUTC[0m [1;34m+00[0m:[1;34m00[0m,
user_name: [31m[1;31m"[0m[31mMai Hoang Thai Ha`[1;31m"[0m[31m[0m,
email: [31m[1;31m"[0m[31mmessidauhoi@gmail.com[1;31m"[0m[31m[0m[32m>[0m,
[32m#<ApplyJob:0x00005572d6d6c308[0m
id: [1;34m76[0m,
job_id: [1;34m890[0m,
user_id: [1;34m6[0m,
created_at: [1;34;4mThu[0m, [1;34m21[0m [1;34;4mOct[0m [1;34m2021[0m [1;34m07[0m:[1;34m29[0m:[1;35m30.011249000[0m [1;34;4mUTC[0m [1;34m+00[0m:[1;34m00[0m,
updated_at: [1;34;4mThu[0m, [1;34m21[0m [1;34;4mOct[0m [1;34m2021[0m [1;34m07[0m:[1;34m29[0m:[1;35m30.023913000[0m [1;34;4mUTC[0m [1;34m+00[0m:[1;34m00[0m,
user_name: [31m[1;31m"[0m[31mMai Hoang Thai Ha`[1;31m"[0m[31m[0m,
email: [31m[1;31m"[0m[31mmhthaiha@gmail.com[1;31m"[0m[31m[0m[32m>[0m,
[32m#<ApplyJob:0x00005572d6d6c240[0m
id: [1;34m77[0m,
job_id: [1;34m889[0m,
user_id: [1;34m6[0m,
created_at: [1;34;4mThu[0m, [1;34m21[0m [1;34;4mOct[0m [1;34m2021[0m [1;34m07[0m:[1;34m29[0m:[1;35m45.888611000[0m [1;34;4mUTC[0m [1;34m+00[0m:[1;34m00[0m,
updated_at: [1;34;4mThu[0m, [1;34m21[0m [1;34;4mOct[0m [1;34m2021[0m [1;34m07[0m:[1;34m29[0m:[1;35m45.899844000[0m [1;34;4mUTC[0m [1;34m+00[0m:[1;34m00[0m,
user_name: [31m[1;31m"[0m[31maasfasff [1;31m"[0m[31m[0m,
email: [31m[1;31m"[0m[31mmhthaiha@gmail.com[1;31m"[0m[31m[0m[32m>[0m]
app/controllers/admins_controller.rb
View file @
5aec5521
...
...
@@ -2,7 +2,54 @@ class AdminsController < ApplicationController
before_action
:authenticate_admin!
def
applies
@city
=
City
.
all
.
map
{
|
c
|
[
c
.
name
,
c
.
id
]
}
@industry
=
Industry
.
all
.
map
{
|
i
|
[
i
.
name
,
i
.
id
]
}
search
return
:applies
if
params
[
:search
]
redirect_to
admin_export_csv_path
(
format: :csv
,
params:
applied_params
)
if
params
[
:csv
]
end
def
export_csv
date
=
DateTime
.
current
.
to_formatted_s
(
:number
)
search
csv
=
ExportCsvService
.
new
(
@apply_jobs
,
Admin
::
CSV_ATTRIBUTES
)
respond_to
do
|
format
|
format
.
csv
{
send_data
csv
.
perform
,
filename:
"
#{
date
}
_applied.csv"
}
end
end
private
def
search
if
applied_params
.
present?
date_value
params_query
@apply_jobs
=
Kaminari
.
paginate_array
(
@query
).
page
(
params
[
:page
]).
per
(
Job
::
JOB_PER_PAGE
)
else
@apply_jobs
=
ApplyJob
.
includes
(
:job
,
cv_attachment: :blob
).
all
.
page
(
params
[
:page
]).
per
(
Job
::
JOB_PER_PAGE
)
end
end
def
date_value
return
unless
applied_params
[
:date_start
].
present?
&&
params
[
:date_end
].
present?
@d_start
=
Date
.
parse
(
applied_params
[
:date_start
]).
beginning_of_day
@d_end
=
Date
.
parse
(
applied_params
[
:date_end
]).
end_of_day
end
def
params_query
search_params
=
{
apply_jobs:
{
email:
applied_params
[
:email
],
created_at:
(
@d_start
..
@d_end
if
@d_start
&&
@d_end
)
},
cities_jobs:
{
city_id:
applied_params
[
:city
]
},
industries_jobs:
{
industry_id:
applied_params
[
:industry
]
}
}
.
transform_values
{
|
v
|
v
.
delete_if
{
|
_
,
value
|
value
.
blank?
}
}
mapping
=
search_params
.
delete_if
{
|
_
,
value
|
value
.
blank?
}
@query
=
ApplyJob
.
admin_queries
.
where
(
mapping
).
uniq
end
def
applied_params
params
.
permit
(
:email
,
:city
,
:industry
,
:date_start
,
:date_end
)
end
end
app/controllers/application_controller.rb
View file @
5aec5521
...
...
@@ -5,7 +5,6 @@ class ApplicationController < ActionController::Base
before_action
:configure_permitted_parameters
,
if: :devise_controller?
protected
def
configure_permitted_parameters
...
...
@@ -15,13 +14,6 @@ class ApplicationController < ActionController::Base
private
def
logged_in_user
unless
user_signed_in?
flash
[
:danger
]
=
'Please log in.'
redirect_to
new_user_session_path
end
end
def
salary_search
@salary_range
=
[
0
,
3_000_000
,
7_000_000
,
10_000_000
,
15_000_000
,
20_000_000
,
30_000_000
]
end
...
...
app/controllers/favorite_jobs_controller.rb
View file @
5aec5521
class
FavoriteJobsController
<
ApplicationController
before_action
:logged_in_user
# before_action :logged_in_user
before_action
:authenticate_user!
before_action
:load_job
,
only:
%i[create destroy]
def
index
...
...
app/controllers/history_jobs_controller.rb
View file @
5aec5521
class
HistoryJobsController
<
ApplicationController
before_action
:logged_in_user
# before_action :logged_in_user
before_action
:authenticate_user!
def
index
@history_jobs
=
current_user
.
history_jobs
.
eager_load
(
job:
%i[cities cities_jobs company]
)
...
...
app/controllers/users_controller.rb
View file @
5aec5521
class
UsersController
<
ApplicationController
# before_action :logged_in_user
def
show
@user
=
current_user
end
...
...
app/models/admin.rb
View file @
5aec5521
class
Admin
<
ApplicationRecord
CSV_ATTRIBUTES
=
%w[id job_id user_id created_at updated_at user_name email]
.
freeze
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
devise
:database_authenticatable
,
:registerable
,
...
...
app/models/apply_job.rb
View file @
5aec5521
...
...
@@ -15,4 +15,9 @@ class ApplyJob < ApplicationRecord
size:
{
less_than:
5
.
megabytes
,
message:
'should be less than 5MB'
}
def
self
.
admin_queries
includes
(
:job
,
cv_attachment: :blob
)
.
joins
(
'INNER JOIN cities_jobs ON cities_jobs.job_id = apply_jobs.job_id'
)
.
joins
(
'INNER JOIN industries_jobs ON industries_jobs.job_id = apply_jobs.job_id'
)
end
end
app/services/export_csv_service.rb
0 → 100644
View file @
5aec5521
class
ExportCsvService
def
initialize
(
object
,
attributes
)
@attributes
=
attributes
@object
=
object
@header
=
attributes
.
map
{
|
attr
|
I18n
.
t
(
"header_csv.
#{
attr
}
"
)
}
end
def
perform
CSV
.
generate
do
|
csv
|
csv
<<
header
object
.
each
do
|
object
|
csv
<<
attributes
.
map
{
|
attr
|
object
.
public_send
(
attr
)
}
end
end
end
private
attr_reader
:attributes
,
:object
,
:header
end
app/services/solr.rb
View file @
5aec5521
...
...
@@ -22,7 +22,6 @@ class Solr
end
jobs_index
.
each
do
|
add_jobs
|
# byebug
@solr
.
add
(
add_jobs
)
rescue
Exception
next
...
...
app/views/admins/applies.html.slim
View file @
5aec5521
-
provide
(
:title
,
'All applies jobs'
)
/ search
.container.mt-5
=
form_with
(
url:
admin_applies_jobs_path
,
method: :get
,
local:
true
)
do
|
f
|
.row.mb-2.form-group
.col-2
=
f
.
label
:email
,
'Email'
,
class:
'form-label'
.col-10
=
f
.
text_field
:email
,
class:
'form-control'
,
value:
params
[
:email
]
.row.mb-2.form-group
.col-2
=
f
.
label
:city
,
'City'
.col-10
=
f
.
select
:city
,
@city
,
selected:
params
[
:city
],
include_blank:
'Select city'
,
class
:"form-select bg-light h-100"
/ = f.select :city, @city, {include_blank: 'Select city'}, {class: 'form-select bg-light h-100'}
/ =f.select :sex, %w{ Male Female }, :prompt => "Gender..."
.row.mb-2.form-group
.col-2
=
f
.
label
:industry
,
'Industry'
,
class:
'form-label'
.col-10
=
f
.
select
:industry
,
@industry
,
selected:
params
[
:industry
],
include_blank:
'Select industry'
,
class
:'form-select bg-light h-100'
.row.mb-2.form-group
.col-6
.row
.col-4
=
f
.
label
:date_start
,
'From'
,
class:
'form-label'
.col-8
=
f
.
date_field
:date_start
,
value:
params
[
:date_start
],
class:
'form-control'
.col-6
.row
.col-4
=
f
.
label
:date_end
,
'To'
,
class:
'form-label'
.col-8
=
f
.
date_field
:date_end
,
value:
params
[
:date_end
],
class:
'form-control'
.row
.col-6.d-flex.justify-content-center
=
f
.
submit
'Search'
,
name:
'search'
,
class:
'btn btn-primary w-50 my-4 btn-height'
,
data:
{
disable_with:
false
}
.col-6.d-flex.justify-content-center
=
f
.
submit
'Export'
,
name:
'csv'
,
class:
'btn btn-primary w-50 my-4 btn-height'
,
data:
{
disable_with:
false
}
/ = link_to 'Export csv', admin_export_csv_path(format: :csv), class: 'btn btn-primary w-50 my-4 btn-height'
.container
h2
.my-5.text-center
|
All applies jobs
...
...
config/locales/en.yml
View file @
5aec5521
...
...
@@ -31,3 +31,11 @@
en
:
hello
:
"
Hello
world"
header_csv
:
id
:
ID
job_id
:
Job ID
user_id
:
User ID
created_at
:
Applied at
updated_at
:
Updated at
user_name
:
User name
email
:
Email
config/routes.rb
View file @
5aec5521
...
...
@@ -42,4 +42,5 @@ Rails.application.routes.draw do
post
'/done'
,
to:
'applies#create'
,
as: :done_job
get
'/history'
,
to:
'history_jobs#index'
,
as: :history_jobs
get
'/admin/applies'
,
to:
'admins#applies'
,
as: :admin_applies_jobs
get
'/admin/export'
,
to:
'admins#export_csv'
,
as: :admin_export_csv
end
lib/tasks/web_crawler.rake
View file @
5aec5521
...
...
@@ -65,20 +65,18 @@ namespace :crawler do
# salary
if
salary
.
include?
(
'USD'
)
parsed
=
parse_salary
(
salary
.
remove
(
'USD'
,
','
),
23_000
)
if
parsed
.
length
==
1
min_salary
=
parsed
[
0
]
max_salary
=
parsed
[
0
]
max_salary
=
if
parsed
.
length
==
1
parsed
[
0
]
else
min_salary
=
parsed
[
0
]
max_salary
=
parsed
[
1
]
parsed
[
1
]
end
elsif
salary
.
include?
(
'VND'
)
parsed
=
parse_salary
(
salary
.
remove
(
'tr'
,
'VND'
),
1_000_000
)
if
parsed
.
length
==
1
min_salary
=
parsed
[
0
]
max_salary
=
parsed
[
0
]
max_salary
=
if
parsed
.
length
==
1
parsed
[
0
]
else
min_salary
=
parsed
[
0
]
max_salary
=
parsed
[
1
]
end
else
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment