[FIX] website_hr_recruitment: fix apply fields
Previously, it wasn't possible to add fields to the form
using the web editor on the apply page.
This commit also set the "job_details" field on the hr.job
model as a translatable field.
Related commit: 0a8c3e7451
task-2990154
closes odoo/odoo#101808
X-original-commit: af4c7188a6928a033d0a4ef30f759049d8c59a8c
Signed-off-by: Kevin Baptiste <kba@odoo.com>
This commit is contained in:
@@ -2,12 +2,27 @@
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
|
||||
from odoo import fields, models
|
||||
from odoo.tools import mute_logger
|
||||
from odoo.tools.translate import html_translate
|
||||
|
||||
|
||||
class Job(models.Model):
|
||||
_inherit = "hr.job"
|
||||
_name = 'hr.job'
|
||||
_inherit = ['hr.job', 'website.seo.metadata', 'website.published.multi.mixin']
|
||||
|
||||
job_details = fields.Html('Process Details',
|
||||
@mute_logger('odoo.addons.base.models.ir_qweb')
|
||||
def _get_default_website_description(self):
|
||||
return self.env['ir.qweb']._render("website_hr_recruitment.default_website_description", raise_if_not_found=False)
|
||||
|
||||
website_published = fields.Boolean(help='Set if the application is published on the website of the company.')
|
||||
website_description = fields.Html(
|
||||
'Website description', translate=html_translate,
|
||||
default=_get_default_website_description, prefetch=False,
|
||||
sanitize_overridable=True,
|
||||
sanitize_attributes=False, sanitize_form=False)
|
||||
job_details = fields.Html(
|
||||
'Process Details',
|
||||
translate=True,
|
||||
help="Complementary information that will appear on the job submission page",
|
||||
default="""
|
||||
<span class="text-muted small">Time to Answer</span>
|
||||
@@ -18,3 +33,15 @@ class Job(models.Model):
|
||||
<span class="text-muted small">Days to get an Offer</span>
|
||||
<h6>4 Days after Interview</h6>
|
||||
""")
|
||||
|
||||
def _compute_website_url(self):
|
||||
super(Job, self)._compute_website_url()
|
||||
for job in self:
|
||||
job.website_url = "/jobs/detail/%s" % job.id
|
||||
|
||||
def set_open(self):
|
||||
self.write({'website_published': False})
|
||||
return super(Job, self).set_open()
|
||||
|
||||
def get_backend_menu_id(self):
|
||||
return self.env.ref('hr_recruitment.menu_hr_recruitment_root').id
|
||||
|
||||
@@ -4,8 +4,6 @@
|
||||
from werkzeug import urls
|
||||
|
||||
from odoo import api, fields, models, _
|
||||
from odoo.tools import mute_logger
|
||||
from odoo.tools.translate import html_translate
|
||||
|
||||
|
||||
class RecruitmentSource(models.Model):
|
||||
@@ -43,32 +41,3 @@ class Applicant(models.Model):
|
||||
if stage:
|
||||
values['stage_id'] = stage.id
|
||||
return values
|
||||
|
||||
|
||||
class Job(models.Model):
|
||||
|
||||
_name = 'hr.job'
|
||||
_inherit = ['hr.job', 'website.seo.metadata', 'website.published.multi.mixin']
|
||||
|
||||
@mute_logger('odoo.addons.base.models.ir_qweb')
|
||||
def _get_default_website_description(self):
|
||||
return self.env['ir.qweb']._render("website_hr_recruitment.default_website_description", raise_if_not_found=False)
|
||||
|
||||
website_published = fields.Boolean(help='Set if the application is published on the website of the company.')
|
||||
website_description = fields.Html(
|
||||
'Website description', translate=html_translate,
|
||||
default=_get_default_website_description, prefetch=False,
|
||||
sanitize_overridable=True,
|
||||
sanitize_attributes=False, sanitize_form=False)
|
||||
|
||||
def _compute_website_url(self):
|
||||
super(Job, self)._compute_website_url()
|
||||
for job in self:
|
||||
job.website_url = "/jobs/detail/%s" % job.id
|
||||
|
||||
def set_open(self):
|
||||
self.write({'website_published': False})
|
||||
return super(Job, self).set_open()
|
||||
|
||||
def get_backend_menu_id(self):
|
||||
return self.env.ref('hr_recruitment.menu_hr_recruitment_root').id
|
||||
|
||||
@@ -135,164 +135,166 @@
|
||||
Job Application Form
|
||||
</h1>
|
||||
<span class="hidden" data-for="hr_recruitment_form" t-att-data-values="{'department_id': job and job.department_id.id or '', 'job_id': job and job.id or ''}" />
|
||||
<div id="jobs_section">
|
||||
<section id="forms" class="s_website_form" data-vcss="001" data-snippet="s_website_form">
|
||||
<div class="container">
|
||||
<form id="hr_recruitment_form" action="/website/form/" method="post"
|
||||
enctype="multipart/form-data" class="o_mark_required row"
|
||||
data-mark="*" data-model_name="hr.applicant"
|
||||
data-success-mode="redirect" data-success-page="/job-thank-you"
|
||||
hide-change-model="true">
|
||||
<section class="col-8 s_website_form_rows row s_col_no_bgcolor">
|
||||
<div class="col-12 mb-0 py-2 s_website_form_field s_website_form_required s_website_form_model_required"
|
||||
data-type="char" data-name="Field">
|
||||
<div class="row s_col_no_resize s_col_no_bgcolor">
|
||||
<label class="col-4 col-sm-auto s_website_form_label" style="width: 200px" for="recruitment1">
|
||||
<span class="s_website_form_label_content">Your Name</span>
|
||||
<span class="s_website_form_mark"> *</span>
|
||||
</label>
|
||||
<div class="col-sm">
|
||||
<input id="recruitment1" type="text"
|
||||
class="form-control s_website_form_input"
|
||||
name="partner_name" required=""
|
||||
data-fill-with="name"/>
|
||||
<div id="jobs_section" class="container">
|
||||
<div class="row">
|
||||
<section id="forms" class="col-12 col-md-9 s_website_form" data-vcss="001" data-snippet="s_website_form">
|
||||
<div class="container">
|
||||
<form id="hr_recruitment_form" action="/website/form/" method="post"
|
||||
enctype="multipart/form-data" class="o_mark_required row"
|
||||
data-mark="*" data-model_name="hr.applicant"
|
||||
data-success-mode="redirect" data-success-page="/job-thank-you"
|
||||
hide-change-model="true">
|
||||
<div class="s_website_form_rows row s_col_no_bgcolor">
|
||||
<div class="col-12 mb-0 py-2 s_website_form_field s_website_form_required s_website_form_model_required"
|
||||
data-type="char" data-name="Field">
|
||||
<div class="row s_col_no_resize s_col_no_bgcolor">
|
||||
<label class="col-4 col-sm-auto s_website_form_label" style="width: 200px" for="recruitment1">
|
||||
<span class="s_website_form_label_content">Your Name</span>
|
||||
<span class="s_website_form_mark"> *</span>
|
||||
</label>
|
||||
<div class="col-sm">
|
||||
<input id="recruitment1" type="text"
|
||||
class="form-control s_website_form_input"
|
||||
name="partner_name" required=""
|
||||
data-fill-with="name"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-12 mb-0 py-2 s_website_form_field s_website_form_required"
|
||||
data-type="email" data-name="Field">
|
||||
<div class="row s_col_no_resize s_col_no_bgcolor">
|
||||
<label class="col-4 col-sm-auto s_website_form_label" style="width: 200px" for="recruitment2">
|
||||
<span class="s_website_form_label_content">Your Email</span>
|
||||
<span class="s_website_form_mark"> *</span>
|
||||
</label>
|
||||
<div class="col-sm">
|
||||
<input id="recruitment2" type="email"
|
||||
class="form-control s_website_form_input"
|
||||
name="email_from" required=""
|
||||
data-fill-with="email"/>
|
||||
<div class="col-12 mb-0 py-2 s_website_form_field s_website_form_required"
|
||||
data-type="email" data-name="Field">
|
||||
<div class="row s_col_no_resize s_col_no_bgcolor">
|
||||
<label class="col-4 col-sm-auto s_website_form_label" style="width: 200px" for="recruitment2">
|
||||
<span class="s_website_form_label_content">Your Email</span>
|
||||
<span class="s_website_form_mark"> *</span>
|
||||
</label>
|
||||
<div class="col-sm">
|
||||
<input id="recruitment2" type="email"
|
||||
class="form-control s_website_form_input"
|
||||
name="email_from" required=""
|
||||
data-fill-with="email"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-12 mb-0 py-2 s_website_form_field s_website_form_required"
|
||||
data-type="char" data-name="Field">
|
||||
<div class="row s_col_no_resize s_col_no_bgcolor">
|
||||
<label class="col-4 col-sm-auto s_website_form_label" style="width: 200px" for="recruitment3">
|
||||
<span class="s_website_form_label_content">Your Phone Number</span>
|
||||
<span class="s_website_form_mark"> *</span>
|
||||
</label>
|
||||
<div class="col-sm">
|
||||
<input id="recruitment3" type="tel"
|
||||
class="form-control s_website_form_input"
|
||||
name="partner_mobile" required=""
|
||||
data-fill-with="phone"/>
|
||||
<div class="col-12 mb-0 py-2 s_website_form_field s_website_form_required"
|
||||
data-type="char" data-name="Field">
|
||||
<div class="row s_col_no_resize s_col_no_bgcolor">
|
||||
<label class="col-4 col-sm-auto s_website_form_label" style="width: 200px" for="recruitment3">
|
||||
<span class="s_website_form_label_content">Your Phone Number</span>
|
||||
<span class="s_website_form_mark"> *</span>
|
||||
</label>
|
||||
<div class="col-sm">
|
||||
<input id="recruitment3" type="tel"
|
||||
class="form-control s_website_form_input"
|
||||
name="partner_mobile" required=""
|
||||
data-fill-with="phone"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-12 mb-0 py-2 s_website_form_field s_website_form_required"
|
||||
data-type="char" data-name="Field">
|
||||
<div class="row s_col_no_resize s_col_no_bgcolor">
|
||||
<label class="col-4 col-sm-auto s_website_form_label" style="width: 200px" for="recruitment4">
|
||||
<span class="s_website_form_label_content">LinkedIn Profile</span>
|
||||
</label>
|
||||
<div class="col-sm" style="position: relative">
|
||||
<i class="fa fa-linkedin fa-2x m-1 o_linkedin_icon"></i>
|
||||
<input id="recruitment4" type="text"
|
||||
class="form-control s_website_form_input pl64"
|
||||
placeholder="e.g. https://www.linkedin.com/in/fpodoo/"
|
||||
style="padding-left: 40px"
|
||||
name="linkedin_profile"
|
||||
data-fill-with="linkedin_profile"/>
|
||||
<div class="col-12 mb-0 py-2 s_website_form_field s_website_form_required"
|
||||
data-type="char" data-name="Field">
|
||||
<div class="row s_col_no_resize s_col_no_bgcolor">
|
||||
<label class="col-4 col-sm-auto s_website_form_label" style="width: 200px" for="recruitment4">
|
||||
<span class="s_website_form_label_content">LinkedIn Profile</span>
|
||||
</label>
|
||||
<div class="col-sm" style="position: relative">
|
||||
<i class="fa fa-linkedin fa-2x m-1 o_linkedin_icon"></i>
|
||||
<input id="recruitment4" type="text"
|
||||
class="form-control s_website_form_input pl64"
|
||||
placeholder="e.g. https://www.linkedin.com/in/fpodoo/"
|
||||
style="padding-left: 40px"
|
||||
name="linkedin_profile"
|
||||
data-fill-with="linkedin_profile"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-12 mb-0 py-2 s_website_form_field s_website_form_custom"
|
||||
data-type="binary" data-name="Field">
|
||||
<div class="row s_col_no_resize s_col_no_bgcolor">
|
||||
<label class="col-4 col-sm-auto s_website_form_label" style="width: 200px" for="recruitment6">
|
||||
<span class="s_website_form_label_content">Resume</span>
|
||||
</label>
|
||||
<div class="col-sm">
|
||||
<input id="recruitment6" type="file"
|
||||
class="form-control s_website_form_input o_resume_input"
|
||||
name="Resume"/>
|
||||
<div class="col-12 mb-0 py-2 s_website_form_field s_website_form_custom"
|
||||
data-type="binary" data-name="Field">
|
||||
<div class="row s_col_no_resize s_col_no_bgcolor">
|
||||
<label class="col-4 col-sm-auto s_website_form_label" style="width: 200px" for="recruitment6">
|
||||
<span class="s_website_form_label_content">Resume</span>
|
||||
</label>
|
||||
<div class="col-sm">
|
||||
<input id="recruitment6" type="file"
|
||||
class="form-control s_website_form_input o_resume_input"
|
||||
name="Resume"/>
|
||||
</div>
|
||||
</div>
|
||||
<span class="text-muted" style="margin-left: 200px; font-size: 0.8rem">The resume is optional if you have a Linkedin profile</span>
|
||||
</div>
|
||||
<div class="col-12 mb-0 py-2 s_website_form_field"
|
||||
data-type="text" data-name="Field">
|
||||
<div class="row s_col_no_resize s_col_no_bgcolor">
|
||||
<label class="col-4 col-sm-auto s_website_form_label" style="width: 200px" for="recruitment5">
|
||||
<span class="s_website_form_label_content">Short Introduction</span>
|
||||
</label>
|
||||
<div class="col-sm">
|
||||
<textarea id="recruitment5"
|
||||
class="form-control s_website_form_input"
|
||||
placeholder="Optional introduction, or any question you might have about the job…"
|
||||
name="description" rows="5"></textarea>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<span class="text-muted" style="margin-left: 200px; font-size: 0.8rem">The resume is optional if you have a Linkedin profile</span>
|
||||
</div>
|
||||
<div class="col-12 mb-0 py-2 s_website_form_field"
|
||||
data-type="text" data-name="Field">
|
||||
<div class="row s_col_no_resize s_col_no_bgcolor">
|
||||
<label class="col-4 col-sm-auto s_website_form_label" style="width: 200px" for="recruitment5">
|
||||
<span class="s_website_form_label_content">Short Introduction</span>
|
||||
</label>
|
||||
<div class="col-sm">
|
||||
<textarea id="recruitment5"
|
||||
class="form-control s_website_form_input"
|
||||
placeholder="Optional introduction, or any question you might have about the job…"
|
||||
name="description" rows="5"></textarea>
|
||||
<div class="col-12 mb-0 py-2 s_website_form_field s_website_form_dnone">
|
||||
<div class="row s_col_no_resize s_col_no_bgcolor">
|
||||
<label class="col-4 col-sm-auto s_website_form_label" style="width: 200px" for="recruitment7">
|
||||
<span class="s_website_form_label_content">Job</span>
|
||||
</label>
|
||||
<div class="col-sm">
|
||||
<input id="recruitment7" type="hidden"
|
||||
class="form-control s_website_form_input"
|
||||
name="job_id"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-12 mb-0 py-2 s_website_form_field s_website_form_dnone">
|
||||
<div class="row s_col_no_resize s_col_no_bgcolor">
|
||||
<label class="col-4 col-sm-auto s_website_form_label" style="width: 200px" for="recruitment7">
|
||||
<span class="s_website_form_label_content">Job</span>
|
||||
</label>
|
||||
<div class="col-sm">
|
||||
<input id="recruitment7" type="hidden"
|
||||
class="form-control s_website_form_input"
|
||||
name="job_id"/>
|
||||
<div class="col-12 mb-0 py-2 s_website_form_field s_website_form_dnone">
|
||||
<div class="row s_col_no_resize s_col_no_bgcolor">
|
||||
<label class="col-4 col-sm-auto s_website_form_label" style="width: 200px" for="recruitment8">
|
||||
<span class="s_website_form_label_content">Department</span>
|
||||
</label>
|
||||
<div class="col-sm">
|
||||
<input id="recruitment8" type="hidden"
|
||||
class="form-control s_website_form_input"
|
||||
name="department_id"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-12 mb-0 py-2 s_website_form_field s_website_form_dnone">
|
||||
<div class="row s_col_no_resize s_col_no_bgcolor">
|
||||
<label class="col-4 col-sm-auto s_website_form_label" style="width: 200px" for="recruitment8">
|
||||
<span class="s_website_form_label_content">Department</span>
|
||||
</label>
|
||||
<div class="col-sm">
|
||||
<input id="recruitment8" type="hidden"
|
||||
class="form-control s_website_form_input"
|
||||
name="department_id"/>
|
||||
</div>
|
||||
<div class="col-12 s_website_form_submit mb64" data-name="Submit Button">
|
||||
<div style="width: 200px" class="s_website_form_label"/>
|
||||
<a href="#" role="button" class="btn btn-primary btn-lg s_website_form_send">I'm feeling lucky</a>
|
||||
<span id="s_website_form_result"></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-12 s_website_form_submit mb64" data-name="Submit Button">
|
||||
<div style="width: 200px" class="s_website_form_label"/>
|
||||
<a href="#" role="button" class="btn btn-primary btn-lg s_website_form_send">I'm feeling lucky</a>
|
||||
<span id="s_website_form_result"></span>
|
||||
</div>
|
||||
</section>
|
||||
<section class="col-3 ms-5">
|
||||
<a role="button" t-attf-href="/jobs/detail/#{job.id}" class="btn btn-outline-primary btn-lg mb16 o_apply_description_link">
|
||||
<i class="fa fa-arrow-left"></i> Job Description
|
||||
</a>
|
||||
<div t-if="job.name" class="d-flex flex-column align-items-baseline">
|
||||
<span class="text-muted small">Job</span>
|
||||
<h6 t-field="job.name"/>
|
||||
</div>
|
||||
<div t-if="job.address_id" class="d-flex flex-column align-items-baseline">
|
||||
<span class="text-muted small">Location</span>
|
||||
<h6 t-field="job.address_id" t-options='{
|
||||
"fields": ["city"],
|
||||
"no_tag_br": True
|
||||
}'/>
|
||||
</div>
|
||||
<div t-if="job.department_id" class="d-flex flex-column align-items-baseline">
|
||||
<span class="text-muted small">Department</span>
|
||||
<h6 t-field="job.department_id"/>
|
||||
</div>
|
||||
<div t-if="job.contract_type_id" class="d-flex flex-column align-items-baseline">
|
||||
<span class="text-muted small">Employment Type</span>
|
||||
<h6 t-field="job.contract_type_id"/>
|
||||
</div>
|
||||
<hr t-if="job.job_details" class="w-50 my-3"/>
|
||||
<div t-field="job.job_details"/>
|
||||
</section>
|
||||
</form>
|
||||
</div>
|
||||
</section>
|
||||
</form>
|
||||
</div>
|
||||
</section>
|
||||
<section class="col-12 col-md-3 ps-5">
|
||||
<a role="button" t-attf-href="/jobs/detail/#{job.id}" class="btn btn-outline-primary btn-lg mb16 o_apply_description_link">
|
||||
<i class="fa fa-arrow-left"></i> Job Description
|
||||
</a>
|
||||
<div t-if="job.name" class="d-flex flex-column align-items-baseline">
|
||||
<span class="text-muted small">Job</span>
|
||||
<h6 t-field="job.name"/>
|
||||
</div>
|
||||
<div t-if="job.address_id" class="d-flex flex-column align-items-baseline">
|
||||
<span class="text-muted small">Location</span>
|
||||
<h6 t-field="job.address_id" t-options='{
|
||||
"fields": ["city"],
|
||||
"no_tag_br": True
|
||||
}'/>
|
||||
</div>
|
||||
<div t-if="job.department_id" class="d-flex flex-column align-items-baseline">
|
||||
<span class="text-muted small">Department</span>
|
||||
<h6 t-field="job.department_id"/>
|
||||
</div>
|
||||
<div t-if="job.contract_type_id" class="d-flex flex-column align-items-baseline">
|
||||
<span class="text-muted small">Employment Type</span>
|
||||
<h6 t-field="job.contract_type_id"/>
|
||||
</div>
|
||||
<hr t-if="job.job_details" class="w-50 my-3"/>
|
||||
<div t-field="job.job_details"/>
|
||||
</section>
|
||||
</div>
|
||||
</div>
|
||||
<div class="oe_structure mt-2"/>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user