[IMP] hr,hr_skills: give more visibility to skills
UX changes to improve the visibility of skills related features in hr applications: - install skills by default with HR - custom button for skills history - new skills demo data - inline create for skill type form - better skill add ux for employee - no skills --> redirect to skill types form task 3334909 closes odoo/odoo#122509 Related: odoo/upgrade#4848 Related: odoo/enterprise#43235 Signed-off-by: Sofie Gvaladze (sgv) <sgv@odoo.com>
This commit is contained in:
@@ -7,7 +7,7 @@
|
||||
<field name="arch" type="xml">
|
||||
<notebook position="inside">
|
||||
<page string="Skills">
|
||||
<div class="row">
|
||||
<div class="row ms-2">
|
||||
<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"/>
|
||||
|
||||
@@ -36,11 +36,12 @@ This module introduces skills and resume management for employees.
|
||||
'data/hr.resume.line.csv',
|
||||
],
|
||||
'installable': True,
|
||||
'auto_install': True,
|
||||
'application': True,
|
||||
'assets': {
|
||||
'web.assets_backend': [
|
||||
'hr_skills/static/src/fields/skills_one2many.xml',
|
||||
'hr_skills/static/src/fields/*',
|
||||
'hr_skills/static/src/fields/skills_one2many/*',
|
||||
'hr_skills/static/src/fields/**/*',
|
||||
'hr_skills/static/src/scss/*.scss',
|
||||
'hr_skills/static/src/views/*.js',
|
||||
'hr_skills/static/src/xml/**/*',
|
||||
|
||||
@@ -1,9 +1,5 @@
|
||||
id,employee_id:id,skill_id:id,skill_type_id:id,skill_level_id:id
|
||||
employee_skill_admin_spark,hr.employee_admin,hr_skill_spark,hr_skill_type_dev,hr_skill_level_intermediate
|
||||
employee_skill_admin_flute,hr.employee_admin,hr_skill_flute,hr_skill_type_music,hr_skill_level_l2
|
||||
employee_skill_admin_singing,hr.employee_admin,hr_skill_singing,hr_skill_type_music,hr_skill_level_l1
|
||||
employee_skill_admin_violin,hr.employee_admin,hr_skill_violin,hr_skill_type_music,hr_skill_level_l2
|
||||
employee_skill_admin_piano,hr.employee_admin,hr_skill_piano,hr_skill_type_music,hr_skill_level_l2
|
||||
employee_skill_admin_french,hr.employee_admin,hr_skill_french,hr_skill_type_lang,hr_skill_level_a1
|
||||
employee_skill_admin_english,hr.employee_admin,hr_skill_english,hr_skill_type_lang,hr_skill_level_a2
|
||||
employee_skill_al_analytics,hr.employee_al,hr_skill_analytics,hr_skill_type_marketing,hr_skill_level_ml3
|
||||
@@ -14,10 +10,6 @@ employee_skill_al_french,hr.employee_al,hr_skill_french,hr_skill_type_lang,hr_sk
|
||||
employee_skill_al_nosql,hr.employee_al,hr_skill_nosql,hr_skill_type_dev,hr_skill_level_beginner
|
||||
employee_skill_al_django,hr.employee_al,hr_skill_django,hr_skill_type_dev,hr_skill_level_advanced
|
||||
employee_skill_al_python,hr.employee_al,hr_skill_python,hr_skill_type_dev,hr_skill_level_advanced
|
||||
employee_skill_mit_piano,hr.employee_mit,hr_skill_piano,hr_skill_type_music,hr_skill_level_l3
|
||||
employee_skill_mit_singing,hr.employee_mit,hr_skill_singing,hr_skill_type_music,hr_skill_level_l2
|
||||
employee_skill_mit_violin,hr.employee_mit,hr_skill_violin,hr_skill_type_music,hr_skill_level_l4
|
||||
employee_skill_mit_flute,hr.employee_mit,hr_skill_flute,hr_skill_type_music,hr_skill_level_l2
|
||||
employee_skill_mit_email,hr.employee_mit,hr_skill_email,hr_skill_type_marketing,hr_skill_level_ml2
|
||||
employee_skill_mit_public,hr.employee_mit,hr_skill_public,hr_skill_type_marketing,hr_skill_level_ml3
|
||||
employee_skill_mit_cms,hr.employee_mit,hr_skill_cms,hr_skill_type_marketing,hr_skill_level_ml1
|
||||
@@ -28,44 +20,30 @@ employee_skill_niv_public,hr.employee_niv,hr_skill_public,hr_skill_type_marketin
|
||||
employee_skill_niv_c,hr.employee_niv,hr_skill_c,hr_skill_type_dev,hr_skill_level_expert
|
||||
employee_skill_niv_android,hr.employee_niv,hr_skill_android,hr_skill_type_dev,hr_skill_level_intermediate
|
||||
employee_skill_niv_nosql,hr.employee_niv,hr_skill_nosql,hr_skill_type_dev,hr_skill_level_beginner
|
||||
employee_skill_niv_flute,hr.employee_niv,hr_skill_flute,hr_skill_type_music,hr_skill_level_l4
|
||||
employee_skill_niv_singing,hr.employee_niv,hr_skill_singing,hr_skill_type_music,hr_skill_level_l4
|
||||
employee_skill_stw_com,hr.employee_stw,hr_skill_com,hr_skill_type_marketing,hr_skill_level_ml4
|
||||
employee_skill_stw_digital_ad,hr.employee_stw,hr_skill_digital_ad,hr_skill_type_marketing,hr_skill_level_ml2
|
||||
employee_skill_chs_digital_ad,hr.employee_chs,hr_skill_digital_ad,hr_skill_type_marketing,hr_skill_level_ml3
|
||||
employee_skill_chs_email,hr.employee_chs,hr_skill_email,hr_skill_type_marketing,hr_skill_level_ml3
|
||||
employee_skill_chs_arabic,hr.employee_chs,hr_skill_arabic,hr_skill_type_lang,hr_skill_level_c1
|
||||
employee_skill_chs_piano,hr.employee_chs,hr_skill_piano,hr_skill_type_music,hr_skill_level_l4
|
||||
employee_skill_qdp_com,hr.employee_qdp,hr_skill_com,hr_skill_type_marketing,hr_skill_level_ml4
|
||||
employee_skill_qdp_email,hr.employee_qdp,hr_skill_email,hr_skill_type_marketing,hr_skill_level_ml4
|
||||
employee_skill_qdp_analytics,hr.employee_qdp,hr_skill_analytics,hr_skill_type_marketing,hr_skill_level_ml2
|
||||
employee_skill_qdp_nosql,hr.employee_qdp,hr_skill_nosql,hr_skill_type_dev,hr_skill_level_advanced
|
||||
employee_skill_qdp_js,hr.employee_qdp,hr_skill_js,hr_skill_type_dev,hr_skill_level_expert
|
||||
employee_skill_qdp_flute,hr.employee_qdp,hr_skill_flute,hr_skill_type_music,hr_skill_level_l1
|
||||
employee_skill_qdp_violin,hr.employee_qdp,hr_skill_violin,hr_skill_type_music,hr_skill_level_l4
|
||||
employee_skill_qdp_singing,hr.employee_qdp,hr_skill_singing,hr_skill_type_music,hr_skill_level_l4
|
||||
employee_skill_qdp_bengali,hr.employee_qdp,hr_skill_bengali,hr_skill_type_lang,hr_skill_level_b2
|
||||
employee_skill_qdp_english,hr.employee_qdp,hr_skill_english,hr_skill_type_lang,hr_skill_level_b1
|
||||
employee_skill_fme_spark,hr.employee_fme,hr_skill_spark,hr_skill_type_dev,hr_skill_level_beginner
|
||||
employee_skill_fme_com,hr.employee_fme,hr_skill_com,hr_skill_type_marketing,hr_skill_level_ml2
|
||||
employee_skill_fpi_django,hr.employee_fpi,hr_skill_django,hr_skill_type_dev,hr_skill_level_expert
|
||||
employee_skill_fpi_violin,hr.employee_fpi,hr_skill_violin,hr_skill_type_music,hr_skill_level_l1
|
||||
employee_skill_fpi_piano,hr.employee_fpi,hr_skill_piano,hr_skill_type_music,hr_skill_level_l1
|
||||
employee_skill_fpi_singing,hr.employee_fpi,hr_skill_singing,hr_skill_type_music,hr_skill_level_l4
|
||||
employee_skill_fpi_flute,hr.employee_fpi,hr_skill_flute,hr_skill_type_music,hr_skill_level_l2
|
||||
employee_skill_fpi_cms,hr.employee_fpi,hr_skill_cms,hr_skill_type_marketing,hr_skill_level_ml1
|
||||
employee_skill_jth_hadoop,hr.employee_jth,hr_skill_hadoop,hr_skill_type_dev,hr_skill_level_expert
|
||||
employee_skill_jth_nosql,hr.employee_jth,hr_skill_nosql,hr_skill_type_dev,hr_skill_level_elementary
|
||||
employee_skill_jth_c,hr.employee_jth,hr_skill_c,hr_skill_type_dev,hr_skill_level_intermediate
|
||||
employee_skill_ngh_violin,hr.employee_ngh,hr_skill_violin,hr_skill_type_music,hr_skill_level_l4
|
||||
employee_skill_ngh_piano,hr.employee_ngh,hr_skill_piano,hr_skill_type_music,hr_skill_level_l1
|
||||
employee_skill_ngh_flute,hr.employee_ngh,hr_skill_flute,hr_skill_type_music,hr_skill_level_l4
|
||||
employee_skill_vad_sql,hr.employee_vad,hr_skill_sql,hr_skill_type_dev,hr_skill_level_intermediate
|
||||
employee_skill_vad_js,hr.employee_vad,hr_skill_js,hr_skill_type_dev,hr_skill_level_elementary
|
||||
employee_skill_vad_spark,hr.employee_vad,hr_skill_spark,hr_skill_type_dev,hr_skill_level_expert
|
||||
employee_skill_vad_python,hr.employee_vad,hr_skill_python,hr_skill_type_dev,hr_skill_level_expert
|
||||
employee_skill_vad_french,hr.employee_vad,hr_skill_french,hr_skill_type_lang,hr_skill_level_a2
|
||||
employee_skill_vad_singing,hr.employee_vad,hr_skill_singing,hr_skill_type_music,hr_skill_level_l2
|
||||
employee_skill_vad_public,hr.employee_vad,hr_skill_public,hr_skill_type_marketing,hr_skill_level_ml1
|
||||
employee_skill_vad_cms,hr.employee_vad,hr_skill_cms,hr_skill_type_marketing,hr_skill_level_ml3
|
||||
employee_skill_vad_analytics,hr.employee_vad,hr_skill_analytics,hr_skill_type_marketing,hr_skill_level_ml1
|
||||
@@ -75,35 +53,20 @@ employee_skill_han_python,hr.employee_han,hr_skill_python,hr_skill_type_dev,hr_s
|
||||
employee_skill_han_react,hr.employee_han,hr_skill_react,hr_skill_type_dev,hr_skill_level_advanced
|
||||
employee_skill_han_analytics,hr.employee_han,hr_skill_analytics,hr_skill_type_marketing,hr_skill_level_ml1
|
||||
employee_skill_han_digital_ad,hr.employee_han,hr_skill_digital_ad,hr_skill_type_marketing,hr_skill_level_ml4
|
||||
employee_skill_han_violin,hr.employee_han,hr_skill_violin,hr_skill_type_music,hr_skill_level_l1
|
||||
employee_skill_han_flute,hr.employee_han,hr_skill_flute,hr_skill_type_music,hr_skill_level_l1
|
||||
employee_skill_han_piano,hr.employee_han,hr_skill_piano,hr_skill_type_music,hr_skill_level_l3
|
||||
employee_skill_jve_cms,hr.employee_jve,hr_skill_cms,hr_skill_type_marketing,hr_skill_level_ml1
|
||||
employee_skill_jve_email,hr.employee_jve,hr_skill_email,hr_skill_type_marketing,hr_skill_level_ml1
|
||||
employee_skill_jve_digital_ad,hr.employee_jve,hr_skill_digital_ad,hr_skill_type_marketing,hr_skill_level_ml1
|
||||
employee_skill_jve_com,hr.employee_jve,hr_skill_com,hr_skill_type_marketing,hr_skill_level_ml4
|
||||
employee_skill_jve_violin,hr.employee_jve,hr_skill_violin,hr_skill_type_music,hr_skill_level_l2
|
||||
employee_skill_jve_singing,hr.employee_jve,hr_skill_singing,hr_skill_type_music,hr_skill_level_l3
|
||||
employee_skill_jve_flute,hr.employee_jve,hr_skill_flute,hr_skill_type_music,hr_skill_level_l4
|
||||
employee_skill_jve_piano,hr.employee_jve,hr_skill_piano,hr_skill_type_music,hr_skill_level_l3
|
||||
employee_skill_jve_french,hr.employee_jve,hr_skill_french,hr_skill_type_lang,hr_skill_level_b1
|
||||
employee_skill_jve_spark,hr.employee_jve,hr_skill_spark,hr_skill_type_dev,hr_skill_level_expert
|
||||
employee_skill_jve_c,hr.employee_jve,hr_skill_c,hr_skill_type_dev,hr_skill_level_elementary
|
||||
employee_skill_jve_js,hr.employee_jve,hr_skill_js,hr_skill_type_dev,hr_skill_level_expert
|
||||
employee_skill_jve_hadoop,hr.employee_jve,hr_skill_hadoop,hr_skill_type_dev,hr_skill_level_advanced
|
||||
employee_skill_jep_piano,hr.employee_jep,hr_skill_piano,hr_skill_type_music,hr_skill_level_l1
|
||||
employee_skill_jep_flute,hr.employee_jep,hr_skill_flute,hr_skill_type_music,hr_skill_level_l4
|
||||
employee_skill_jep_singing,hr.employee_jep,hr_skill_singing,hr_skill_type_music,hr_skill_level_l4
|
||||
employee_skill_jep_violin,hr.employee_jep,hr_skill_violin,hr_skill_type_music,hr_skill_level_l4
|
||||
employee_skill_jod_singing,hr.employee_jod,hr_skill_singing,hr_skill_type_music,hr_skill_level_l4
|
||||
employee_skill_jod_violin,hr.employee_jod,hr_skill_violin,hr_skill_type_music,hr_skill_level_l4
|
||||
employee_skill_jod_filipino,hr.employee_jod,hr_skill_filipino,hr_skill_type_lang,hr_skill_level_c1
|
||||
employee_skill_jod_spark,hr.employee_jod,hr_skill_spark,hr_skill_type_dev,hr_skill_level_advanced
|
||||
employee_skill_jod_sql,hr.employee_jod,hr_skill_sql,hr_skill_type_dev,hr_skill_level_expert
|
||||
employee_skill_jod_analytics,hr.employee_jod,hr_skill_analytics,hr_skill_type_marketing,hr_skill_level_ml1
|
||||
employee_skill_jod_public,hr.employee_jod,hr_skill_public,hr_skill_type_marketing,hr_skill_level_ml2
|
||||
employee_skill_jog_violin,hr.employee_jog,hr_skill_violin,hr_skill_type_music,hr_skill_level_l4
|
||||
employee_skill_jog_singing,hr.employee_jog,hr_skill_singing,hr_skill_type_music,hr_skill_level_l1
|
||||
employee_skill_jog_public,hr.employee_jog,hr_skill_public,hr_skill_type_marketing,hr_skill_level_ml1
|
||||
employee_skill_jog_cms,hr.employee_jog,hr_skill_cms,hr_skill_type_marketing,hr_skill_level_ml1
|
||||
employee_skill_jog_filipino,hr.employee_jog,hr_skill_filipino,hr_skill_type_lang,hr_skill_level_c1
|
||||
@@ -117,13 +80,9 @@ employee_skill_jgo_analytics,hr.employee_jgo,hr_skill_analytics,hr_skill_type_ma
|
||||
employee_skill_jgo_com,hr.employee_jgo,hr_skill_com,hr_skill_type_marketing,hr_skill_level_ml1
|
||||
employee_skill_lur_english,hr.employee_lur,hr_skill_english,hr_skill_type_lang,hr_skill_level_c2
|
||||
employee_skill_lur_french,hr.employee_lur,hr_skill_french,hr_skill_type_lang,hr_skill_level_a1
|
||||
employee_skill_lur_singing,hr.employee_lur,hr_skill_singing,hr_skill_type_music,hr_skill_level_l3
|
||||
employee_skill_hne_spanish,hr.employee_hne,hr_skill_spanish,hr_skill_type_lang,hr_skill_level_c1
|
||||
employee_skill_hne_cms,hr.employee_hne,hr_skill_cms,hr_skill_type_marketing,hr_skill_level_ml4
|
||||
employee_skill_hne_public,hr.employee_hne,hr_skill_public,hr_skill_type_marketing,hr_skill_level_ml3
|
||||
employee_skill_hne_com,hr.employee_hne,hr_skill_com,hr_skill_type_marketing,hr_skill_level_ml4
|
||||
employee_skill_hne_digital_ad,hr.employee_hne,hr_skill_digital_ad,hr_skill_type_marketing,hr_skill_level_ml3
|
||||
employee_skill_hne_singing,hr.employee_hne,hr_skill_singing,hr_skill_type_music,hr_skill_level_l2
|
||||
employee_skill_hne_flute,hr.employee_hne,hr_skill_flute,hr_skill_type_music,hr_skill_level_l3
|
||||
employee_skill_hne_piano,hr.employee_hne,hr_skill_piano,hr_skill_type_music,hr_skill_level_l4
|
||||
employee_skill_hne_sql,hr.employee_hne,hr_skill_sql,hr_skill_type_dev,hr_skill_level_expert
|
||||
|
||||
|
@@ -4,19 +4,24 @@
|
||||
|
||||
<!--Skill Types-->
|
||||
<record id="hr_skill_type_dev" model="hr.skill.type">
|
||||
<field name="name">Dev</field>
|
||||
<field name="name">Programming Languages</field>
|
||||
</record>
|
||||
<record id="hr_skill_type_music" model="hr.skill.type">
|
||||
<field name="name">Music</field>
|
||||
<record id="hr_skill_type_it" model="hr.skill.type">
|
||||
<field name="name">IT</field>
|
||||
</record>
|
||||
<record id="hr_skill_type_marketing" model="hr.skill.type">
|
||||
<field name="name">Marketing</field>
|
||||
</record>
|
||||
<record id="hr_skill_type_softskill" model="hr.skill.type">
|
||||
<field name="name">Soft Skills</field>
|
||||
</record>
|
||||
|
||||
<!--Skill Levels-->
|
||||
<!--Languages -->
|
||||
<record id="hr_skill_level_a1" model="hr.skill.level">
|
||||
<field name="name">A1</field>
|
||||
<field name="level_progress">10</field>
|
||||
<field name="default_level">1</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_lang"/>
|
||||
</record>
|
||||
<record id="hr_skill_level_a2" model="hr.skill.level">
|
||||
@@ -45,8 +50,10 @@
|
||||
<field name="skill_type_id" ref="hr_skill_type_lang"/>
|
||||
</record>
|
||||
|
||||
<!--Programming-->
|
||||
<record id="hr_skill_level_beginner" model="hr.skill.level">
|
||||
<field name="name">Beginner</field>
|
||||
<field name="default_level">1</field>
|
||||
<field name="level_progress">15</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_dev"/>
|
||||
</record>
|
||||
@@ -71,29 +78,10 @@
|
||||
<field name="skill_type_id" ref="hr_skill_type_dev"/>
|
||||
</record>
|
||||
|
||||
<record id="hr_skill_level_l1" model="hr.skill.level">
|
||||
<field name="name">L1</field>
|
||||
<field name="level_progress">25</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_music"/>
|
||||
</record>
|
||||
<record id="hr_skill_level_l2" model="hr.skill.level">
|
||||
<field name="name">L2</field>
|
||||
<field name="level_progress">50</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_music"/>
|
||||
</record>
|
||||
<record id="hr_skill_level_l3" model="hr.skill.level">
|
||||
<field name="name">L3</field>
|
||||
<field name="level_progress">75</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_music"/>
|
||||
</record>
|
||||
<record id="hr_skill_level_l4" model="hr.skill.level">
|
||||
<field name="name">L4</field>
|
||||
<field name="level_progress">100</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_music"/>
|
||||
</record>
|
||||
|
||||
<!--Marketing-->
|
||||
<record id="hr_skill_level_ml1" model="hr.skill.level">
|
||||
<field name="name">L1</field>
|
||||
<field name="default_level">1</field>
|
||||
<field name="level_progress">25</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_marketing"/>
|
||||
</record>
|
||||
@@ -113,7 +101,63 @@
|
||||
<field name="skill_type_id" ref="hr_skill_type_marketing"/>
|
||||
</record>
|
||||
|
||||
<!-- **** Skills **** -->
|
||||
<!--Soft Skills-->
|
||||
<record id="hr_skill_level_beginner_softskill" model="hr.skill.level">
|
||||
<field name="name">Beginner</field>
|
||||
<field name="default_level">1</field>
|
||||
<field name="level_progress">15</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_softskill"/>
|
||||
</record>
|
||||
<record id="hr_skill_level_elementary_softskill" model="hr.skill.level">
|
||||
<field name="name">Elementary</field>
|
||||
<field name="level_progress">25</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_softskill"/>
|
||||
</record>
|
||||
<record id="hr_skill_level_intermediate_softskill" model="hr.skill.level">
|
||||
<field name="name">Intermediate</field>
|
||||
<field name="level_progress">50</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_softskill"/>
|
||||
</record>
|
||||
<record id="hr_skill_level_advanced_softskill" model="hr.skill.level">
|
||||
<field name="name">Advanced</field>
|
||||
<field name="level_progress">80</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_softskill"/>
|
||||
</record>
|
||||
<record id="hr_skill_level_expert_softskill" model="hr.skill.level">
|
||||
<field name="name">Expert</field>
|
||||
<field name="level_progress">100</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_softskill"/>
|
||||
</record>
|
||||
|
||||
<!--IT-->
|
||||
<record id="hr_skill_level_beginner_it" model="hr.skill.level">
|
||||
<field name="name">Beginner</field>
|
||||
<field name="default_level">1</field>
|
||||
<field name="level_progress">15</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_it"/>
|
||||
</record>
|
||||
<record id="hr_skill_level_elementary_it" model="hr.skill.level">
|
||||
<field name="name">Elementary</field>
|
||||
<field name="level_progress">25</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_it"/>
|
||||
</record>
|
||||
<record id="hr_skill_level_intermediate_it" model="hr.skill.level">
|
||||
<field name="name">Intermediate</field>
|
||||
<field name="level_progress">50</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_it"/>
|
||||
</record>
|
||||
<record id="hr_skill_level_advanced_it" model="hr.skill.level">
|
||||
<field name="name">Advanced</field>
|
||||
<field name="level_progress">80</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_it"/>
|
||||
</record>
|
||||
<record id="hr_skill_level_expert_it" model="hr.skill.level">
|
||||
<field name="name">Expert</field>
|
||||
<field name="level_progress">100</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_it"/>
|
||||
</record>
|
||||
|
||||
<!-- Skills -->
|
||||
<!-- Languages -->
|
||||
<record id="hr_skill_french" model="hr.skill">
|
||||
<field name="name">French</field>
|
||||
@@ -143,8 +187,64 @@
|
||||
<field name="name">Bengali</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_lang"/>
|
||||
</record>
|
||||
<record id="hr_skill_mandarin_chinese" model="hr.skill">
|
||||
<field name="name">Mandarin Chinese</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_lang"/>
|
||||
</record>
|
||||
<record id="hr_skill_wu_chinese" model="hr.skill">
|
||||
<field name="name">Wu Chinese</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_lang"/>
|
||||
</record>
|
||||
<record id="hr_skill_hindi" model="hr.skill">
|
||||
<field name="name">Hindi</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_lang"/>
|
||||
</record>
|
||||
<record id="hr_skill_russian" model="hr.skill">
|
||||
<field name="name">Russian</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_lang"/>
|
||||
</record>
|
||||
<record id="hr_skill_portuguese" model="hr.skill">
|
||||
<field name="name">Portuguese</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_lang"/>
|
||||
</record>
|
||||
<record id="hr_skill_indonesian" model="hr.skill">
|
||||
<field name="name">Indonesian</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_lang"/>
|
||||
</record>
|
||||
<record id="hr_skill_urdu" model="hr.skill">
|
||||
<field name="name">Urdu</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_lang"/>
|
||||
</record>
|
||||
<record id="hr_skill_japanese" model="hr.skill">
|
||||
<field name="name">Japanese</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_lang"/>
|
||||
</record>
|
||||
<record id="hr_skill_punjabi" model="hr.skill">
|
||||
<field name="name">Punjabi</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_lang"/>
|
||||
</record>
|
||||
<record id="hr_skill_javanese" model="hr.skill">
|
||||
<field name="name">Javanese</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_lang"/>
|
||||
</record>
|
||||
<record id="hr_skill_telugu" model="hr.skill">
|
||||
<field name="name">Telugu</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_lang"/>
|
||||
</record>
|
||||
<record id="hr_skill_turkish" model="hr.skill">
|
||||
<field name="name">Turkish</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_lang"/>
|
||||
</record>
|
||||
<record id="hr_skill_korean" model="hr.skill">
|
||||
<field name="name">Korean</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_lang"/>
|
||||
</record>
|
||||
<record id="hr_skill_marathi" model="hr.skill">
|
||||
<field name="name">Marathi</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_lang"/>
|
||||
</record>
|
||||
|
||||
<!-- Dev -->
|
||||
<!-- Programming -->
|
||||
<record id="hr_skill_js" model="hr.skill">
|
||||
<field name="name">Javascript</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_dev"/>
|
||||
@@ -185,23 +285,69 @@
|
||||
<field name="name">NoSQL</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_dev"/>
|
||||
</record>
|
||||
|
||||
<!-- Music -->
|
||||
<record id="hr_skill_piano" model="hr.skill">
|
||||
<field name="name">Piano</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_music"/>
|
||||
<record id="hr_skill_go" model="hr.skill">
|
||||
<field name="name">Go</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_dev"/>
|
||||
</record>
|
||||
<record id="hr_skill_violin" model="hr.skill">
|
||||
<field name="name">Violin</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_music"/>
|
||||
<record id="hr_skill_java" model="hr.skill">
|
||||
<field name="name">Java</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_dev"/>
|
||||
</record>
|
||||
<record id="hr_skill_singing" model="hr.skill">
|
||||
<field name="name">Singing</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_music"/>
|
||||
<record id="hr_skill_kotlin" model="hr.skill">
|
||||
<field name="name">Kotlin</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_dev"/>
|
||||
</record>
|
||||
<record id="hr_skill_flute" model="hr.skill">
|
||||
<field name="name">Flute</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_music"/>
|
||||
<record id="hr_skill_php" model="hr.skill">
|
||||
<field name="name">PHP</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_dev"/>
|
||||
</record>
|
||||
<record id="hr_skill_csharp" model="hr.skill">
|
||||
<field name="name">C#</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_dev"/>
|
||||
</record>
|
||||
<record id="hr_skill_swift" model="hr.skill">
|
||||
<field name="name">Swift</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_dev"/>
|
||||
</record>
|
||||
<record id="hr_skill_r" model="hr.skill">
|
||||
<field name="name">R</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_dev"/>
|
||||
</record>
|
||||
<record id="hr_skill_ruby" model="hr.skill">
|
||||
<field name="name">Ruby</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_dev"/>
|
||||
</record>
|
||||
<record id="hr_skill_matlab" model="hr.skill">
|
||||
<field name="name">Matlab</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_dev"/>
|
||||
</record>
|
||||
<record id="hr_skill_typescript" model="hr.skill">
|
||||
<field name="name">TypeScript</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_dev"/>
|
||||
</record>
|
||||
<record id="hr_skill_scala" model="hr.skill">
|
||||
<field name="name">Scala</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_dev"/>
|
||||
</record>
|
||||
<record id="hr_skill_html" model="hr.skill">
|
||||
<field name="name">HTML</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_dev"/>
|
||||
</record>
|
||||
<record id="hr_skill_css" model="hr.skill">
|
||||
<field name="name">CSS</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_dev"/>
|
||||
</record>
|
||||
<record id="hr_skill_nosql" model="hr.skill">
|
||||
<field name="name">NoSQL</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_dev"/>
|
||||
</record>
|
||||
<record id="hr_skill_rust" model="hr.skill">
|
||||
<field name="name">Rust</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_dev"/>
|
||||
</record>
|
||||
<record id="hr_skill_perl" model="hr.skill">
|
||||
<field name="name">Perl</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_dev"/>
|
||||
</record>
|
||||
|
||||
<!-- Marketing -->
|
||||
@@ -230,6 +376,146 @@
|
||||
<field name="skill_type_id" ref="hr_skill_type_marketing"/>
|
||||
</record>
|
||||
|
||||
<!-- Soft Skills -->
|
||||
<record id="hr_skill_communication" model="hr.skill">
|
||||
<field name="name">Communication</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_softskill"/>
|
||||
</record>
|
||||
<record id="hr_skill_teamwork" model="hr.skill">
|
||||
<field name="name">Teamwork</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_softskill"/>
|
||||
</record>
|
||||
<record id="hr_skill_problem_solving" model="hr.skill">
|
||||
<field name="name">Problem-Solving</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_softskill"/>
|
||||
</record>
|
||||
<record id="hr_skill_time_management" model="hr.skill">
|
||||
<field name="name">Time Management</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_softskill"/>
|
||||
</record>
|
||||
<record id="hr_skill_critical_thinking" model="hr.skill">
|
||||
<field name="name">Critical Thinking</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_softskill"/>
|
||||
</record>
|
||||
<record id="hr_skill_decision_making" model="hr.skill">
|
||||
<field name="name">Decision-Making</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_softskill"/>
|
||||
</record>
|
||||
<record id="hr_skill_organizational" model="hr.skill">
|
||||
<field name="name">Organizational</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_softskill"/>
|
||||
</record>
|
||||
<record id="hr_skill_stress_management" model="hr.skill">
|
||||
<field name="name">Stress management</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_softskill"/>
|
||||
</record>
|
||||
<record id="hr_skill_adaptability" model="hr.skill">
|
||||
<field name="name">Adaptability</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_softskill"/>
|
||||
</record>
|
||||
<record id="hr_skill_conflict_management" model="hr.skill">
|
||||
<field name="name">Conflict Management</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_softskill"/>
|
||||
</record>
|
||||
<record id="hr_skill_leadership" model="hr.skill">
|
||||
<field name="name">Leadership</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_softskill"/>
|
||||
</record>
|
||||
<record id="hr_skill_creativity" model="hr.skill">
|
||||
<field name="name">Creativity</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_softskill"/>
|
||||
</record>
|
||||
<record id="hr_skill_resourcefulness" model="hr.skill">
|
||||
<field name="name">Resourcefulness</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_softskill"/>
|
||||
</record>
|
||||
<record id="hr_skill_persuasion" model="hr.skill">
|
||||
<field name="name">Persuasion</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_softskill"/>
|
||||
</record>
|
||||
<record id="hr_skill_openness_to_criticism" model="hr.skill">
|
||||
<field name="name">Openness to criticism</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_softskill"/>
|
||||
</record>
|
||||
|
||||
<!-- IT -->
|
||||
<record id="hr_skill_web_development" model="hr.skill">
|
||||
<field name="name">Web Development</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_it"/>
|
||||
</record>
|
||||
<record id="hr_skill_database_management" model="hr.skill">
|
||||
<field name="name">Database Management</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_it"/>
|
||||
</record>
|
||||
<record id="hr_skill_cloud_computing" model="hr.skill">
|
||||
<field name="name">Cloud computing</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_it"/>
|
||||
</record>
|
||||
<record id="hr_skill_network_administration" model="hr.skill">
|
||||
<field name="name">Network administration</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_it"/>
|
||||
</record>
|
||||
<record id="hr_skill_cybersecurity" model="hr.skill">
|
||||
<field name="name">Cybersecurity</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_it"/>
|
||||
</record>
|
||||
<record id="hr_skill_devops" model="hr.skill">
|
||||
<field name="name">DevOps</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_it"/>
|
||||
</record>
|
||||
<record id="hr_skill_machine_learning" model="hr.skill">
|
||||
<field name="name">Machine Learning (AI)</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_it"/>
|
||||
</record>
|
||||
<record id="hr_skill_data_analysis" model="hr.skill">
|
||||
<field name="name">Data analysis/visualization</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_it"/>
|
||||
</record>
|
||||
<record id="hr_skill_agile_scrum" model="hr.skill">
|
||||
<field name="name">Agile and Scrum methodologies</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_it"/>
|
||||
</record>
|
||||
<record id="hr_skill_mobile_app_development" model="hr.skill">
|
||||
<field name="name">Mobile app development</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_it"/>
|
||||
</record>
|
||||
<record id="hr_skill_project_management" model="hr.skill">
|
||||
<field name="name">Project Management</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_it"/>
|
||||
</record>
|
||||
<record id="hr_skill_system_administration" model="hr.skill">
|
||||
<field name="name">System Administration (Linux, Windows)</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_it"/>
|
||||
</record>
|
||||
<record id="hr_skill_virtualization_containerization" model="hr.skill">
|
||||
<field name="name">Virtualization and Containerization</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_it"/>
|
||||
</record>
|
||||
<record id="hr_skill_it_support" model="hr.skill">
|
||||
<field name="name">IT support</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_it"/>
|
||||
</record>
|
||||
<record id="hr_skill_it_infrastructure_architecture" model="hr.skill">
|
||||
<field name="name">IT infrastructure and architecture</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_it"/>
|
||||
</record>
|
||||
<record id="hr_skill_it_service_management" model="hr.skill">
|
||||
<field name="name">IT service management (ITSM)</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_it"/>
|
||||
</record>
|
||||
<record id="hr_skill_big_data_technologies" model="hr.skill">
|
||||
<field name="name">Big data technologies (Hadoop,Spark)</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_it"/>
|
||||
</record>
|
||||
<record id="hr_skill_iot_embedded_systems" model="hr.skill">
|
||||
<field name="name">IoT and embedded systems</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_it"/>
|
||||
</record>
|
||||
<record id="hr_skill_it_governance_compliance" model="hr.skill">
|
||||
<field name="name">IT governance and compliance (GDPR,HIPAA,...)</field>
|
||||
<field name="skill_type_id" ref="hr_skill_type_it"/>
|
||||
</record>
|
||||
|
||||
<!-- Resume -->
|
||||
<record id="employee_resume_line_admin_1" model="hr.resume.line">
|
||||
<field name="employee_id" ref="hr.employee_admin"/>
|
||||
|
||||
@@ -1,17 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<record id="action_open_skills_log_employee" model="ir.actions.server">
|
||||
<field name="name">Skill History Report</field>
|
||||
<field name="model_id" ref="hr.model_hr_employee"/>
|
||||
<field name="binding_model_id" ref="hr.model_hr_employee"/>
|
||||
<field name="binding_view_types">form</field>
|
||||
<field name="state">code</field>
|
||||
<field name="code">
|
||||
action = env['ir.actions.act_window']._for_xml_id('hr_skills.action_hr_employee_skill_log_employee')
|
||||
action['domain'] = [('employee_id', '=', record.id)]
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="action_open_skills_log_department" model="ir.actions.server">
|
||||
<field name="name">Skill History Report</field>
|
||||
<field name="model_id" ref="hr.model_hr_department"/>
|
||||
|
||||
@@ -15,7 +15,9 @@ class EmployeeSkill(models.Model):
|
||||
employee_id = fields.Many2one('hr.employee', required=True, ondelete='cascade')
|
||||
skill_id = fields.Many2one('hr.skill', compute='_compute_skill_id', store=True, domain="[('skill_type_id', '=', skill_type_id)]", readonly=False, required=True, ondelete='cascade')
|
||||
skill_level_id = fields.Many2one('hr.skill.level', compute='_compute_skill_level_id', domain="[('skill_type_id', '=', skill_type_id)]", store=True, readonly=False, required=True, ondelete='cascade')
|
||||
skill_type_id = fields.Many2one('hr.skill.type', required=True, ondelete='cascade')
|
||||
skill_type_id = fields.Many2one('hr.skill.type',
|
||||
default=lambda self: self.env['hr.skill.type'].search([], limit=1),
|
||||
required=True, ondelete='cascade')
|
||||
level_progress = fields.Integer(related='skill_level_id.level_progress')
|
||||
|
||||
_sql_constraints = [
|
||||
@@ -37,7 +39,9 @@ class EmployeeSkill(models.Model):
|
||||
@api.depends('skill_type_id')
|
||||
def _compute_skill_id(self):
|
||||
for record in self:
|
||||
if record.skill_id.skill_type_id != record.skill_type_id:
|
||||
if record.skill_type_id:
|
||||
record.skill_id = record.skill_type_id.skill_ids[0] if record.skill_type_id.skill_ids else False
|
||||
else:
|
||||
record.skill_id = False
|
||||
|
||||
@api.depends('skill_id')
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
|
||||
from odoo import api, fields, models, _
|
||||
from odoo.exceptions import ValidationError
|
||||
|
||||
|
||||
class SkillLevel(models.Model):
|
||||
@@ -29,28 +28,14 @@ class SkillLevel(models.Model):
|
||||
|
||||
@api.model_create_multi
|
||||
def create(self, vals_list):
|
||||
levels = super().create(vals_list)
|
||||
levels.skill_type_id._set_default_level()
|
||||
return levels
|
||||
skill_levels = super().create(vals_list)
|
||||
for level in skill_levels:
|
||||
if level.default_level:
|
||||
level.skill_type_id.skill_level_ids.filtered(lambda r: r.id != level.id).default_level = False
|
||||
return skill_levels
|
||||
|
||||
def write(self, values):
|
||||
levels = super().write(values)
|
||||
self.skill_type_id._set_default_level()
|
||||
return levels
|
||||
|
||||
def unlink(self):
|
||||
skill_types = self.skill_type_id
|
||||
res = super().unlink()
|
||||
skill_types._set_default_level()
|
||||
def write(self, vals):
|
||||
res = super().write(vals)
|
||||
if vals.get('default_level'):
|
||||
self.skill_type_id.skill_level_ids.filtered(lambda r: r.id != self.id).default_level = False
|
||||
return res
|
||||
|
||||
@api.constrains('default_level', 'skill_type_id')
|
||||
def _constrains_default_level(self):
|
||||
for skill_type in set(self.mapped('skill_type_id')):
|
||||
if len(skill_type.skill_level_ids.filtered('default_level')) > 1:
|
||||
raise ValidationError(_('Only one default level is allowed per skill type.'))
|
||||
|
||||
def action_set_default(self):
|
||||
self.ensure_one()
|
||||
self.skill_type_id.skill_level_ids.with_context(no_skill_level_check=True).default_level = False
|
||||
self.default_level = True
|
||||
|
||||
@@ -12,11 +12,3 @@ class SkillType(models.Model):
|
||||
name = fields.Char(required=True)
|
||||
skill_ids = fields.One2many('hr.skill', 'skill_type_id', string="Skills")
|
||||
skill_level_ids = fields.One2many('hr.skill.level', 'skill_type_id', string="Levels")
|
||||
|
||||
def _set_default_level(self):
|
||||
if self.env.context.get('no_skill_level_check'):
|
||||
return
|
||||
|
||||
for types in self:
|
||||
if not types.skill_level_ids.filtered('default_level'):
|
||||
types.skill_level_ids[:1].default_level = True
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
<record id="hr_employee_skill_report_view_list" model="ir.ui.view">
|
||||
<field name="model">hr.employee.skill.report</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree expand="1">
|
||||
<tree expand="0">
|
||||
<field name="employee_id" widget="many2one_avatar_user"/>
|
||||
<field name="skill_type_id"/>
|
||||
<field name="skill_id"/>
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
/** @odoo-module **/
|
||||
|
||||
import { registry } from "@web/core/registry";
|
||||
import { X2ManyField, x2ManyField } from "@web/views/fields/x2many/x2many_field";
|
||||
|
||||
|
||||
export class AutoSaveSkillTypeField extends X2ManyField {
|
||||
async onAdd({ context, editable } = {}) {
|
||||
await this.props.record.model.root.save();
|
||||
await super.onAdd({ context, editable });
|
||||
}
|
||||
}
|
||||
|
||||
export const autoSaveSkillTypeField = {
|
||||
...x2ManyField,
|
||||
component: AutoSaveSkillTypeField,
|
||||
};
|
||||
|
||||
registry.category("fields").add("auto_save_skill_type", autoSaveSkillTypeField);
|
||||
@@ -0,0 +1,18 @@
|
||||
/** @odoo-module */
|
||||
|
||||
import { registry } from '@web/core/registry';
|
||||
import { ListBooleanToggleField, listBooleanToggleField } from "@web/views/fields/boolean_toggle/list_boolean_toggle_field";
|
||||
|
||||
export class ListBooleanToggleLoadField extends ListBooleanToggleField {
|
||||
async onChange(value) {
|
||||
await super.onChange(value);
|
||||
return this.env.model.load();
|
||||
}
|
||||
}
|
||||
|
||||
export const listBooleanToggleLoadField = {
|
||||
...listBooleanToggleField,
|
||||
component: ListBooleanToggleLoadField,
|
||||
};
|
||||
|
||||
registry.category("fields").add("boolean_toggle_load", listBooleanToggleLoadField);
|
||||
@@ -0,0 +1,11 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<templates xml:space="preserve">
|
||||
<t t-name="hr_skills.X2ManyFieldDialog" t-inherit="web.X2ManyFieldDialog" t-inherit-mode="primary" owl="1">
|
||||
<xpath expr="//button[hasclass('o_form_button_save')]" position="replace">
|
||||
<button class="btn btn-primary o_form_button_save" t-on-click="() => this.save()" data-hotkey="c">Select & Close</button>
|
||||
</xpath>
|
||||
<xpath expr="//button[hasclass('o_form_button_save_new')]" position="replace">
|
||||
<button class="btn btn-primary o_form_button_save_new" t-on-click="saveAndNew" data-hotkey="n">Select & New</button>
|
||||
</xpath>
|
||||
</t>
|
||||
</templates>
|
||||
+2
-2
@@ -4,8 +4,8 @@ import { registry } from "@web/core/registry";
|
||||
|
||||
import { formatDate } from "@web/core/l10n/dates";
|
||||
|
||||
import { SkillsX2ManyField, skillsX2ManyField } from "./skills_one2many";
|
||||
import { CommonSkillsListRenderer } from "../views/skills_list_renderer";
|
||||
import { SkillsX2ManyField, skillsX2ManyField } from "../skills_one2many/skills_one2many";
|
||||
import { CommonSkillsListRenderer } from "../../views/skills_list_renderer";
|
||||
|
||||
export class ResumeListRenderer extends CommonSkillsListRenderer {
|
||||
get groupBy() {
|
||||
+9
@@ -4,6 +4,14 @@
|
||||
<xpath expr="//table" position="attributes">
|
||||
<attribute name="t-attf-class" add="table-borderless {{ !showTable ? 'd-none' : ''}}" remove="table-striped" separator=" "/>
|
||||
</xpath>
|
||||
<xpath expr="//table" position="after">
|
||||
<t t-if="!showTable">
|
||||
<button t-on-click="props.onAdd" class="btn btn-secondary ms-4 mt-3" role="button" t-if="isEditable">
|
||||
Create a new entry
|
||||
</button>
|
||||
</t>
|
||||
</xpath>
|
||||
<xpath expr="//div[@name='skills_header']" position="replace"/>
|
||||
<xpath expr="//thead/tr" position="replace">
|
||||
<tr>
|
||||
<th style="width: 32px; min-width: 32px;"></th>
|
||||
@@ -11,6 +19,7 @@
|
||||
<th t-if="isEditable" class="o_list_actions_header" style="width: 32px; min-width: 32px"></th>
|
||||
</tr>
|
||||
</xpath>
|
||||
<xpath expr="//div[@name='no_skills']" position="replace"/>
|
||||
</t>
|
||||
|
||||
<t t-name="hr_skills.ResumeListRenderer.Rows" t-inherit-mode="primary" t-inherit="hr_skills.SkillsListRenderer.Rows">
|
||||
@@ -1,49 +0,0 @@
|
||||
/** @odoo-module */
|
||||
|
||||
import { X2ManyField, x2ManyField } from "@web/views/fields/x2many/x2many_field";
|
||||
import { registry } from "@web/core/registry";
|
||||
|
||||
import { CommonSkillsListRenderer } from "../views/skills_list_renderer";
|
||||
|
||||
|
||||
export class SkillsListRenderer extends CommonSkillsListRenderer {
|
||||
get groupBy() {
|
||||
return 'skill_type_id';
|
||||
}
|
||||
|
||||
calculateColumnWidth(column) {
|
||||
if (column.name != 'skill_level_id') {
|
||||
return {
|
||||
type: 'absolute',
|
||||
value: '90px',
|
||||
}
|
||||
}
|
||||
|
||||
return super.calculateColumnWidth(column);
|
||||
}
|
||||
}
|
||||
SkillsListRenderer.template = 'hr_skills.SkillsListRenderer';
|
||||
|
||||
export class SkillsX2ManyField extends X2ManyField {
|
||||
async onAdd({ context, editable } = {}) {
|
||||
const employeeId = this.props.record.resId;
|
||||
return super.onAdd({
|
||||
editable,
|
||||
context: {
|
||||
...context,
|
||||
default_employee_id: employeeId,
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
SkillsX2ManyField.components = {
|
||||
...X2ManyField.components,
|
||||
ListRenderer: SkillsListRenderer,
|
||||
};
|
||||
|
||||
export const skillsX2ManyField = {
|
||||
...x2ManyField,
|
||||
component: SkillsX2ManyField,
|
||||
};
|
||||
|
||||
registry.category("fields").add("skills_one2many", skillsX2ManyField);
|
||||
@@ -0,0 +1,114 @@
|
||||
/** @odoo-module */
|
||||
|
||||
import { X2ManyField, x2ManyField } from "@web/views/fields/x2many/x2many_field";
|
||||
import {
|
||||
useX2ManyCrud,
|
||||
useOpenX2ManyRecord,
|
||||
} from "@web/views/fields/relational_utils";
|
||||
import { registry } from "@web/core/registry";
|
||||
import { _t } from "@web/core/l10n/translation";
|
||||
import { CommonSkillsListRenderer } from "../../views/skills_list_renderer";
|
||||
import { useService } from '@web/core/utils/hooks';
|
||||
import { onWillStart } from "@odoo/owl";
|
||||
|
||||
|
||||
export class SkillsListRenderer extends CommonSkillsListRenderer {
|
||||
setup() {
|
||||
super.setup();
|
||||
this.orm = useService('orm');
|
||||
this.action = useService("action");
|
||||
|
||||
onWillStart(async () => {
|
||||
const res = await this.orm.searchCount('hr.skill', []);
|
||||
this.anySkills = res > 0;
|
||||
});
|
||||
}
|
||||
|
||||
get groupBy() {
|
||||
return 'skill_type_id';
|
||||
}
|
||||
|
||||
async skillTypesAction() {
|
||||
return this.actionService.doAction("hr_skills.hr_skill_type_action");
|
||||
}
|
||||
|
||||
async openSkillsReport() {
|
||||
// fetch id through employee or public.employee
|
||||
const id = this.env.model.root.data.id || this.env.model.root.data.employee_id[0];
|
||||
- this.actionService.doAction({
|
||||
type: "ir.actions.act_window",
|
||||
name: _t("Skills Report"),
|
||||
res_model: "hr.employee.skill.log",
|
||||
view_mode: "graph,tree",
|
||||
views: [[false, "graph"], [false, "tree"]],
|
||||
context: {
|
||||
'fill_temporal': 0,
|
||||
},
|
||||
target: "current",
|
||||
domain: [['employee_id', '=', id]],
|
||||
});
|
||||
}
|
||||
|
||||
calculateColumnWidth(column) {
|
||||
if (column.name != 'skill_level_id') {
|
||||
return {
|
||||
type: 'absolute',
|
||||
value: '90px',
|
||||
}
|
||||
}
|
||||
|
||||
return super.calculateColumnWidth(column);
|
||||
}
|
||||
}
|
||||
SkillsListRenderer.template = 'hr_skills.SkillsListRenderer';
|
||||
|
||||
export class SkillsX2ManyField extends X2ManyField {
|
||||
setup() {
|
||||
super.setup()
|
||||
const { saveRecord, updateRecord } = useX2ManyCrud(
|
||||
() => this.list,
|
||||
this.isMany2Many
|
||||
);
|
||||
|
||||
const openRecord = useOpenX2ManyRecord({
|
||||
resModel: this.list.resModel,
|
||||
activeField: this.activeField,
|
||||
activeActions: this.activeActions,
|
||||
getList: () => this.list,
|
||||
saveRecord: async (record) => {
|
||||
await saveRecord(record);
|
||||
await this.props.record.save();
|
||||
},
|
||||
updateRecord: updateRecord,
|
||||
withParentId: this.props.widget !== "many2many",
|
||||
});
|
||||
|
||||
this._openRecord = (params) => {
|
||||
params.title = _t("Select Skills");
|
||||
openRecord({...params});
|
||||
};
|
||||
}
|
||||
|
||||
async onAdd({ context, editable } = {}) {
|
||||
const employeeId = this.props.record.resId;
|
||||
return super.onAdd({
|
||||
editable,
|
||||
context: {
|
||||
...context,
|
||||
default_employee_id: employeeId,
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
SkillsX2ManyField.components = {
|
||||
...X2ManyField.components,
|
||||
ListRenderer: SkillsListRenderer,
|
||||
};
|
||||
|
||||
export const skillsX2ManyField = {
|
||||
...x2ManyField,
|
||||
component: SkillsX2ManyField,
|
||||
};
|
||||
|
||||
registry.category("fields").add("skills_one2many", skillsX2ManyField);
|
||||
+1
@@ -21,3 +21,4 @@ table.o_skill_table, .o_hr_skills_dialog_form {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+31
-3
@@ -7,11 +7,39 @@
|
||||
<xpath expr="//thead" position="attributes">
|
||||
<attribute name="style">visibility: collapse;</attribute>
|
||||
</xpath>
|
||||
<xpath expr="//table" position="before">
|
||||
<div name="skills_header" class="text-uppercase fw-bolder small ms-3" style="margin-top: 2rem; box-shadow: 0 1px 0 #e6e6e6">
|
||||
Skills <a t-on-click="openSkillsReport" class="fa fa-line-chart ms-1" ></a>
|
||||
</div>
|
||||
</xpath>
|
||||
<xpath expr="//table" position="after">
|
||||
<t t-if="!showTable">
|
||||
<button t-on-click="props.onAdd" class="btn btn-secondary ms-4 mt-3" role="button" t-if="isEditable">
|
||||
Create a new entry
|
||||
</button>
|
||||
<t t-if="!anySkills">
|
||||
<div name="no_skills" class="ms-3 mt-3">
|
||||
<p>
|
||||
There are no skills defined in the library.<br/>
|
||||
Why not try adding some ?
|
||||
</p>
|
||||
<button t-on-click="skillTypesAction"
|
||||
class="btn btn-secondary ms-4 mt-3 text-center"
|
||||
role="button" t-if="isEditable">
|
||||
Create new Skills
|
||||
</button>
|
||||
</div>
|
||||
</t>
|
||||
<t t-else="">
|
||||
<div name="skills_available" class="ms-3 mt-3">
|
||||
<p class="mt-3">You can add skills from our library to the employee profile.<br/>
|
||||
If skills are missing, they can be created by an HR officer.</p>
|
||||
<div class="ms-5">
|
||||
<button t-on-click="props.onAdd"
|
||||
class="btn btn-secondary ms-4 mt-3 text-center"
|
||||
role="button" t-if="isEditable">
|
||||
Pick a skill from the list
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</t>
|
||||
</t>
|
||||
</xpath>
|
||||
</t>
|
||||
@@ -10,3 +10,33 @@
|
||||
overflow-x: hidden!important;
|
||||
}
|
||||
}
|
||||
|
||||
.o_hr_skill_type_form {
|
||||
th[data-name="level_progress"] div span {
|
||||
text-align: left !important;
|
||||
}
|
||||
}
|
||||
|
||||
.o_list_renderer {
|
||||
.o_list_table {
|
||||
.o_data_row:not(.o_selected_row) .o_data_cell {
|
||||
&.o_boolean_toggle_load_cell {
|
||||
> .o_field_widget:not(.o_readonly_modifier) .form-check {
|
||||
pointer-events: auto;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.o_skill_level_tree{
|
||||
.o_list_renderer .o_list_table thead .o_list_number_th{
|
||||
text-align: start !important;
|
||||
}
|
||||
.o_progressbar_value .o_input {
|
||||
width: 0 !important;
|
||||
}
|
||||
.flex-row-reverse {
|
||||
flex-direction: inherit !important;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -73,7 +73,7 @@ registry.category("web_tour.tours").add('hr_skills_tour', {
|
||||
},
|
||||
{
|
||||
content: "Add a new Skill",
|
||||
trigger: ".o_field_skills_one2many button:contains('Create a new entry')",
|
||||
trigger: ".o_field_skills_one2many button:contains('Pick a skill from the list')",
|
||||
},
|
||||
{
|
||||
content: "Select Music",
|
||||
|
||||
@@ -83,13 +83,12 @@
|
||||
|
||||
</div>
|
||||
<div class="o_hr_skills_editable o_hr_skills_group o_group_skills col-lg-5 d-flex flex-column">
|
||||
<separator string="Skills" class="mb-4"/>
|
||||
<field mode="tree" nolabel="1" name="employee_skill_ids" widget="skills_one2many">
|
||||
<field mode="tree" nolabel="1" name="employee_skill_ids" widget="skills_one2many" class="mt-2">
|
||||
<tree>
|
||||
<field name="skill_type_id" column_invisible="True"/>
|
||||
<field name="skill_id"/>
|
||||
<field name="skill_level_id"/>
|
||||
<field name="level_progress" widget="progressbar"/>
|
||||
<field name="skill_type_id" optional="hidden"/>
|
||||
</tree>
|
||||
</field>
|
||||
</div>
|
||||
@@ -124,10 +123,10 @@
|
||||
</field>
|
||||
</div>
|
||||
<div class="o_hr_skills_group o_group_skills col-lg-5 d-flex flex-column">
|
||||
<separator string="Skills" class="mb-4" invisible="not employee_skill_ids"/>
|
||||
<field mode="tree" nolabel="1" name="employee_skill_ids" widget="skills_one2many">
|
||||
<field name="employee_id" invisible="1"/>
|
||||
<field mode="tree" nolabel="1" name="employee_skill_ids" invisible="not employee_skill_ids" widget="skills_one2many">
|
||||
<tree>
|
||||
<field name="skill_type_id" column_invisible="True"/>
|
||||
<field name="skill_type_id" optional="hidden"/>
|
||||
<field name="skill_id"/>
|
||||
<field name="skill_level_id"/>
|
||||
<field name="level_progress" widget="progressbar"/>
|
||||
@@ -159,7 +158,7 @@
|
||||
<field name="description"/>
|
||||
<field name="date_start"/>
|
||||
<field name="date_end"/>
|
||||
<field name="display_type" column_invisible="True"/>
|
||||
<field name="display_type" invisible="1"/>
|
||||
</tree>
|
||||
</field>
|
||||
</div>
|
||||
@@ -167,7 +166,7 @@
|
||||
<separator string="Skills"/>
|
||||
<field mode="tree" nolabel="1" name="employee_skill_ids" widget="skills_one2many" readonly="not can_edit">
|
||||
<tree>
|
||||
<field name="skill_type_id" column_invisible="True"/>
|
||||
<field name="skill_type_id" optional="hidden"/>
|
||||
<field name="skill_id"/>
|
||||
<field name="skill_level_id"/>
|
||||
<field name="level_progress" widget="progressbar"/>
|
||||
@@ -224,11 +223,10 @@
|
||||
<field name="name">hr.skill.level.tree</field>
|
||||
<field name="model">hr.skill.level</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="Skill Levels">
|
||||
<tree string="Skill Levels" class="o_skill_level_tree" editable="bottom">
|
||||
<field name="name"/>
|
||||
<field name="level_progress" widget="progressbar"/>
|
||||
<field name="default_level"/>
|
||||
<button string="Set Default" type="object" name="action_set_default" invisible="default_level"/>
|
||||
<field name="level_progress" widget="progressbar" options="{'editable': true}"/>
|
||||
<field name="default_level" widget="boolean_toggle_load"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
@@ -271,18 +269,18 @@
|
||||
<field name="skill_type_id" widget="radio" />
|
||||
</group>
|
||||
<group>
|
||||
<field name="skill_id" options="{'no_open': True, 'no_create_edit': True}"
|
||||
<field name="skill_id" options="{'no_open': True, 'no_create': True}"
|
||||
context="{'default_skill_type_id': skill_type_id}"
|
||||
domain="[('skill_type_id', '=', skill_type_id)]"
|
||||
invisible="not skill_type_id"/>
|
||||
<label for="skill_level_id"
|
||||
invisible="not skill_id or not skill_type_id"/>
|
||||
<div class="o_row"
|
||||
invisible="not skill_id or not skill_type_id">
|
||||
invisible="not (skill_id or skill_type_id)"/>
|
||||
<div class="o_row" invisible="not (skill_id or skill_type_id)">
|
||||
<span class="ps-0" style="flex:1">
|
||||
<field name="skill_level_id"
|
||||
readonly="not skill_id"
|
||||
context="{'from_skill_level_dropdown': True, 'default_skill_type_id': skill_type_id}" />
|
||||
readonly="not skill_id"
|
||||
options="{'no_open': True, 'no_create': True}"
|
||||
context="{'from_skill_level_dropdown': True, 'default_skill_type_id': skill_type_id}" />
|
||||
</span>
|
||||
<span style="flex:1">
|
||||
<field name="level_progress" widget="progressbar" class="o_hr_skills_progress" invisible="not skill_level_id" />
|
||||
@@ -359,7 +357,7 @@
|
||||
</field>
|
||||
<group string="Levels">
|
||||
</group>
|
||||
<field name="skill_level_ids" nolabel="1" context="{'default_skill_type_id': id}"/>
|
||||
<field name="skill_level_ids" nolabel="1" widget="auto_save_skill_type" context="{'default_skill_type_id': id}"/>
|
||||
</sheet>
|
||||
</form>
|
||||
</field>
|
||||
|
||||
Reference in New Issue
Block a user