19.0 vanilla

This commit is contained in:
Ernad Husremovic 2026-03-09 09:31:00 +01:00
parent a1137a1456
commit e1d89e11e3
2789 changed files with 1093187 additions and 605897 deletions

View file

@ -7,32 +7,39 @@
<form string="Skills" class="o_hr_skills_dialog_form">
<sheet>
<group>
<group>
<field name="applicant_id" invisible="1"/>
<field name="skill_type_id" widget="radio" />
</group>
<group>
<field name="skill_id" options="{'no_open': True, 'no_create_edit': True}"
context="{'default_skill_type_id': skill_type_id}"
domain="[('skill_type_id', '=', skill_type_id)]"
attrs="{'invisible': [('skill_type_id', '=', False)]}"/>
<label for="skill_level_id"
attrs="{'invisible': ['|', ('skill_id', '=', False), ('skill_type_id', '=', False)]}"/>
<div class="o_row"
attrs="{'invisible': ['|', ('skill_id', '=', False), ('skill_type_id', '=', False)]}">
<span class="ps-0" style="flex:1">
<field name="skill_level_id"
attrs="{'readonly': [('skill_id', '=', False)]}"
context="{'from_skill_level_dropdown': True}" />
</span>
<span style="flex:1">
<field name="level_progress" widget="progressbar" class="o_hr_skills_progress" attrs="{'invisible': [('skill_level_id', '=', False)]}" />
</span>
</div>
</group>
<field name="applicant_id" invisible="1"/>
<field name="skill_type_id" widget="selection_badge" string="Category"/>
<field name="skill_id" widget="selection_badge"
context="{'default_skill_type_id': skill_type_id}"
domain="[('skill_type_id', '=', skill_type_id)]"
invisible="not skill_type_id"
/>
<field name="skill_level_id"
readonly="not skill_id" widget="selection_badge"
invisible="levels_count &lt;= 1"
options="{'no_open': True, 'no_create': True}"
context="{'default_skill_type_id': skill_type_id}"
/>
<label for="valid_from" string="Valid from" invisible="not is_certification"/>
<div class="d-flex flex-row gap-3 align-items-baseline" invisible="not is_certification">
<field name="valid_from" style="width: 12ch" />
<label for="valid_to" string="To"/>
<field name="valid_to" placeholder="indefinite" style="width: 12ch"/>
</div>
</group>
<div class="alert alert-warning ps-3" role="alert" invisible="not display_warning_message">
The end date must be after the start date.
</div>
</sheet>
</form>
</field>
</record>
<menuitem
id="hr_recruitment_skill_type_menu"
name="Skill Types"
action="hr_skills.hr_skill_type_action"
parent="hr_recruitment.menu_hr_recruitment_config_employees"
sequence="35"
/>
</odoo>

View file

@ -7,26 +7,45 @@
<field name="arch" type="xml">
<notebook position="inside">
<page string="Skills">
<div class="row">
<div class="o_hr_skills_editable o_hr_skills_group o_group_skills col-lg-5 d-flex flex-column">
<field name="id" invisible="1"/>
<field name="is_interviewer" invisible="1"/>
<field mode="tree" nolabel="1" name="applicant_skill_ids" widget="skills_one2many"
context="{'default_applicant_id': id}" attrs="{'readonly': [('is_interviewer', '=', True)]}">
<tree>
<field name="skill_type_id" invisible="1"/>
<field name="skill_id"/>
<field name="skill_level_id"/>
<field name="level_progress" widget="progressbar"/>
</tree>
</field>
</div>
<div class="o_hr_skills_editable o_hr_skills_group o_group_skills">
<field name="id" invisible="1"/>
<group>
<group>
<field mode="list" nolabel="1" name="current_applicant_skill_ids" widget="skills_one2many"
context="{'default_applicant_id': id, 'no_timeline': True}" >
<list
class="o_applicant_skills"
decoration-muted="valid_to and valid_to &lt; context_today().strftime('%Y-%m-%d')"
decoration-danger="valid_to and valid_to &lt;= (context_today() + relativedelta(days=7)).strftime('%Y-%m-%d') and valid_to &gt; context_today().strftime('%Y-%m-%d')"
decoration-warning="valid_to and valid_to &lt;= (context_today() + relativedelta(months=1)).strftime('%Y-%m-%d') and valid_to &gt; (context_today() + relativedelta(days=7)).strftime('%Y-%m-%d')">
<field name="skill_type_id" optional="hidden"/>
<field name="skill_id"/>
<field name="skill_level_id"/>
<field name="level_progress" widget="progressbar"/>
<field name="valid_to" column_invisible="1"/>
</list>
</field>
</group>
<group>
<field name="matching_score" invisible="is_pool_applicant" nolabel="1" widget="skill_match_gauge_field" options="{'max_value': 100}" />
</group>
</group>
</div>
</page>
</notebook>
</field>
</record>
<record id="action_find_matching_job" model="ir.actions.act_window">
<field name="name">Matching Positions</field>
<field name="res_model">hr.job</field>
<field name="view_mode">list</field>
<field name="target">current</field>
<field name="binding_model_id" ref="hr_recruitment.model_hr_applicant"/>
<field name="binding_view_types">form</field>
<field name="context">{'active_applicant_id': active_id,}</field>
</record>
<record id="hr_applicant_view_search_bis" model="ir.ui.view">
<field name="name">hr.applicant.view.search.inherit.skills.bis</field>
<field name="model">hr.applicant</field>
@ -35,9 +54,6 @@
<xpath expr="//field[@name='email_from']" position="after">
<field name="applicant_skill_ids"/>
</xpath>
<filter name="refuse_reason_id" position="after">
<filter string="Skills" name="groupby_skills" context="{'group_by': 'skill_ids'}"/>
</filter>
</field>
</record>
@ -54,4 +70,50 @@
</filter>
</field>
</record>
<record id="crm_case_tree_view_job" model="ir.ui.view">
<field name="name">hr.applicant.view.list.inherit.hr.recruitment.skills</field>
<field name="model">hr.applicant</field>
<field name="inherit_id" ref="hr_recruitment.crm_case_tree_view_job"/>
<field name="mode">extension</field>
<field name="arch" type="xml">
<field name="stage_id" position="after">
<field name="matching_score" string="Matching" widget="progressbar" options="{'overflow_class': 'bg-success'}" invisible="not matching_score"/>
</field>
</field>
</record>
<record id="crm_case_tree_view_inherit_hr_recruitment_skills" model="ir.ui.view">
<field name="name">hr.applicant.view.tree.inherit.skills</field>
<field name="model">hr.applicant</field>
<field name="inherit_id" ref="hr_recruitment_skills.crm_case_tree_view_job"/>
<field name="mode">primary</field>
<field name="arch" type="xml">
<xpath expr="//list" position="attributes">
<attribute name="class" add="o_search_matching_applicant" separator=" "/>
</xpath>
<xpath expr="//list" position="inside">
<header>
<button name="action_add_to_job" string="Move to this Job Position" type="object" class="btn-secondary"/>
</header>
</xpath>
<field name="application_status" position="attributes">
<attribute name="optional">hide</attribute>
</field>
<field name="priority" position="attributes">
<attribute name="optional">hide</attribute>
</field>
<field name="partner_phone" position="attributes">
<attribute name="optional">hide</attribute>
</field>
<field name="categ_ids" position="attributes">
<attribute name="optional">hide</attribute>
</field>
<field name="partner_name" position="after">
<xpath expr="//field[@name='matching_score']" position="move"/>
<field name="matching_skill_ids" widget="many2many_tags"/>
<field name="missing_skill_ids" widget="many2many_tags"/>
</field>
</field>
</record>
</odoo>

View file

@ -0,0 +1,35 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="hr_job_list_inherit_hr_recruitment_skills" model="ir.ui.view">
<field name="name">hr.job.view.list.inherit</field>
<field name="model">hr.job</field>
<field name="inherit_id" ref="hr_recruitment.hr_job_view_tree_inherit"/>
<field name="arch" type="xml">
<field name="department_id" position="after">
<field name="applicant_matching_score" widget="progressbar"
groups="hr_recruitment.group_hr_recruitment_interviewer"
invisible="not applicant_matching_score" column_invisible="not context.get('active_applicant_id')"/>
</field>
</field>
</record>
<record id="view_hr_job_form" model="ir.ui.view">
<field name="name">hr.job.view.form.inherit.hr.recruitment.skills</field>
<field name="model">hr.job</field>
<field name="inherit_id" ref="hr_skills.view_hr_job_form"/>
<field name="arch" type="xml">
<xpath expr="//group[@id='job_skills']/field[@name='current_job_skill_ids']" position="attributes">
<attribute name="groups">!hr.group_hr_user,!hr_recruitment.group_hr_recruitment_interviewer</attribute>
</xpath>
</field>
</record>
<record id="action_applicant_search_applicant" model="ir.actions.server">
<field name="name">Search Matching Applicants</field>
<field name="model_id" ref="hr_recruitment.model_hr_job"/>
<field name="binding_model_id" ref="hr_recruitment.model_hr_job"/>
<field name="binding_view_types">form</field>
<field name="state">code</field>
<field name="code">action = records.action_search_matching_applicants()</field>
</record>
</odoo>