When accessing the job positions page, country is detected automatically to filter only those jobs whose country match current one + the ones available in any country. However, when job positions have no specific country, they're being excluded due to the usage of an old API (expecting relational fields as `None` when they're empty), so only positions with country are being taken into account. This commit fixes the above by expecting the correct value (an empty recordset) when an address is not set. closes odoo/odoo#95454 X-original-commit: 65a285124bc0833c511905719da1712b0c747e24 Signed-off-by: Yannick Tivisse (yti) <yti@odoo.com>
102 lines
4.6 KiB
Python
102 lines
4.6 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from odoo import http, _
|
|
from odoo.addons.http_routing.models.ir_http import slug
|
|
from odoo.http import request
|
|
from werkzeug.exceptions import NotFound
|
|
|
|
|
|
class WebsiteHrRecruitment(http.Controller):
|
|
def sitemap_jobs(env, rule, qs):
|
|
if not qs or qs.lower() in '/jobs':
|
|
yield {'loc': '/jobs'}
|
|
|
|
@http.route([
|
|
'/jobs',
|
|
'/jobs/country/<model("res.country"):country>',
|
|
'/jobs/department/<model("hr.department"):department>',
|
|
'/jobs/country/<model("res.country"):country>/department/<model("hr.department"):department>',
|
|
'/jobs/office/<int:office_id>',
|
|
'/jobs/country/<model("res.country"):country>/office/<int:office_id>',
|
|
'/jobs/department/<model("hr.department"):department>/office/<int:office_id>',
|
|
'/jobs/country/<model("res.country"):country>/department/<model("hr.department"):department>/office/<int:office_id>',
|
|
], type='http', auth="public", website=True, sitemap=sitemap_jobs)
|
|
def jobs(self, country=None, department=None, office_id=None, **kwargs):
|
|
env = request.env(context=dict(request.env.context, show_address=True, no_tag_br=True))
|
|
|
|
Country = env['res.country']
|
|
Jobs = env['hr.job']
|
|
|
|
# List jobs available to current UID
|
|
domain = request.website.website_domain()
|
|
job_ids = Jobs.search(domain, order="is_published desc, sequence, no_of_recruitment desc").ids
|
|
# Browse jobs as superuser, because address is restricted
|
|
jobs = Jobs.sudo().browse(job_ids)
|
|
|
|
# Default search by user country
|
|
if not (country or department or office_id or kwargs.get('all_countries')):
|
|
country_code = request.geoip.get('country_code')
|
|
if country_code:
|
|
countries_ = Country.search([('code', '=', country_code)])
|
|
country = countries_[0] if countries_ else None
|
|
if not any(j for j in jobs if j.address_id and j.address_id.country_id == country):
|
|
country = False
|
|
|
|
# Filter job / office for country
|
|
if country and not kwargs.get('all_countries'):
|
|
jobs = [j for j in jobs if not j.address_id or j.address_id.country_id.id == country.id]
|
|
offices = set(j.address_id for j in jobs if not j.address_id or j.address_id.country_id.id == country.id)
|
|
else:
|
|
offices = set(j.address_id for j in jobs if j.address_id)
|
|
|
|
# Deduce departments and countries offices of those jobs
|
|
departments = set(j.department_id for j in jobs if j.department_id)
|
|
countries = set(o.country_id for o in offices if o.country_id)
|
|
|
|
if department:
|
|
jobs = [j for j in jobs if j.department_id and j.department_id.id == department.id]
|
|
if office_id and office_id in [x.id for x in offices]:
|
|
jobs = [j for j in jobs if j.address_id and j.address_id.id == office_id]
|
|
else:
|
|
office_id = False
|
|
|
|
# Render page
|
|
return request.render("website_hr_recruitment.index", {
|
|
'jobs': jobs,
|
|
'countries': countries,
|
|
'departments': departments,
|
|
'offices': offices,
|
|
'country_id': country,
|
|
'department_id': department,
|
|
'office_id': office_id,
|
|
})
|
|
|
|
@http.route('/jobs/add', type='http', auth="user", website=True)
|
|
def jobs_add(self, **kwargs):
|
|
# avoid branding of website_description by setting rendering_bundle in context
|
|
job = request.env['hr.job'].with_context(rendering_bundle=True).create({
|
|
'name': _('Job Title'),
|
|
})
|
|
return request.redirect(request.env["website"].get_client_action_url(f"/jobs/detail/{slug(job)}", True))
|
|
|
|
@http.route('''/jobs/detail/<model("hr.job"):job>''', type='http', auth="public", website=True, sitemap=True)
|
|
def jobs_detail(self, job, **kwargs):
|
|
return request.render("website_hr_recruitment.detail", {
|
|
'job': job,
|
|
'main_object': job,
|
|
})
|
|
|
|
@http.route('''/jobs/apply/<model("hr.job"):job>''', type='http', auth="public", website=True, sitemap=True)
|
|
def jobs_apply(self, job, **kwargs):
|
|
error = {}
|
|
default = {}
|
|
if 'website_hr_recruitment_error' in request.session:
|
|
error = request.session.pop('website_hr_recruitment_error')
|
|
default = request.session.pop('website_hr_recruitment_default')
|
|
return request.render("website_hr_recruitment.apply", {
|
|
'job': job,
|
|
'error': error,
|
|
'default': default,
|
|
})
|