[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:
Dossogne Bertrand
2022-10-03 08:04:58 +02:00
parent 0eac5ac75f
commit 239e617a97
3 changed files with 173 additions and 175 deletions
+29 -2
View File
@@ -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>