Skip to content
Extraits de code Groupes Projets
Valider a6d19e9f rédigé par Thibaud - Le Filament's avatar Thibaud - Le Filament
Parcourir les fichiers

Merge branch '14.0' into 'geoloc_partner_for_api_exposition'

# Conflicts:
#   models/res_partner.py
parents 77dc55b6 9793c3b4
Aucune branche associée trouvée
Aucune étiquette associée trouvée
1 requête de fusion!1Draft: [IMP] Added geolocalisation with gouv_api dependancy
Ce commit fait partie de la requête de fusion !1. Les commentaires créés ici seront créés dans le contexte de cette requête de fusion.
......@@ -13,9 +13,12 @@
"datas/alterincub_area.xml",
"datas/alterincub_class_duration.xml",
"datas/alterincub_department.xml",
"datas/alterincub_education_level.xml",
"datas/alterincub_end_reason.xml",
"datas/alterincub_sector.xml",
"datas/alterincub_service_place.xml",
"datas/alterincub_situation_entrance.xml",
"datas/cron_age_range.xml",
# wizard
"wizard/alterincub_exit_project_wizard.xml",
# views
......@@ -24,12 +27,14 @@
"views/alterincub_class_duration.xml",
"views/alterincub_collective_day.xml",
"views/alterincub_department.xml",
"views/alterincub_education_level.xml",
"views/alterincub_end_reason.xml",
"views/alterincub_lot.xml",
"views/alterincub_price_list.xml",
"views/alterincub_program.xml",
"views/alterincub_sector.xml",
"views/alterincub_service_place.xml",
"views/alterincub_situation_entrance.xml",
"views/res_partner.xml",
"views/set_lat_long.xml",
# views menus
......
<?xml version="1.0" encoding="UTF-8" ?>
<!-- Copyright 2022 Le Filament
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -->
<odoo>
<data noupdate="1">
<record
id="alterincub_education_level_01"
model="alterincub.education.level"
forcecreate="0"
>
<field name="sequence">10</field>
<field name="name">CITE_0</field>
<field
name="description"
>Inférieur à l'école primaire, vous n'êtes jamais allé à l'école</field>
</record>
<record
id="alterincub_education_level_02"
model="alterincub.education.level"
forcecreate="0"
>
<field name="sequence">20</field>
<field name="name">CITE_1_2</field>
<field
name="description"
>Primaire, 6ème, 5ème, 4ème, 3ème (secondaire 1er cycle), Brevet des collèges, CAP, BEP, 2nde professionnelle (technique cycle court)</field>
</record>
<record
id="alterincub_education_level_03"
model="alterincub.education.level"
forcecreate="0"
>
<field name="sequence">30</field>
<field name="name">CITE_3_4</field>
<field
name="description"
>Baccalauréat général ou technologique, Bac Pro, Brevet professionnel (BP)</field>
</record>
<record
id="alterincub_education_level_04"
model="alterincub.education.level"
forcecreate="0"
>
<field name="sequence">40</field>
<field name="name">CITE_5_8</field>
<field
name="description"
>DEUG, BTS, DUT, Ecoles d'infirmières, Licence, Maîtrise, Grande école, Ecole d'ingénieur, Ecole de commerce, Master recherche ou professionnel, DEA, DESS, Doctorat</field>
</record>
</data>
</odoo>
<?xml version="1.0" encoding="UTF-8" ?>
<!-- Copyright 2022 Le Filament
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -->
<odoo>
<data noupdate="1">
<record
id="alterincub_situation_entrance_01"
model="alterincub.situation.entrance"
forcecreate="0"
>
<field name="sequence">10</field>
<field name="name">EMPLOI</field>
<field name="description">(y compris indépendant)</field>
</record>
<record
id="alterincub_situation_entrance_02"
model="alterincub.situation.entrance"
forcecreate="0"
>
<field name="sequence">20</field>
<field name="name">RECHERCHE_EMPLOI_MOINS_6_MOIS</field>
</record>
<record
id="alterincub_situation_entrance_03"
model="alterincub.situation.entrance"
forcecreate="0"
>
<field name="sequence">30</field>
<field name="name">RECHERCHE_EMPLOI_6_12_MOIS</field>
</record>
<record
id="alterincub_situation_entrance_04"
model="alterincub.situation.entrance"
forcecreate="0"
>
<field name="sequence">40</field>
<field name="name">RECHERCHE_EMPLOI_PLUS_12_MOIS</field>
</record>
<record
id="alterincub_situation_entrance_05"
model="alterincub.situation.entrance"
forcecreate="0"
>
<field name="sequence">50</field>
<field name="name">FORMATION</field>
<field name="description">En formation ou en enseignement</field>
</record>
<record
id="alterincub_situation_entrance_06"
model="alterincub.situation.entrance"
forcecreate="0"
>
<field name="sequence">60</field>
<field name="name">INACTIF</field>
<field
name="description"
>Inactif, ni en formation, ni en enseignement</field>
</record>
</data>
</odoo>
<?xml version="1.0" encoding="UTF-8" ?>
<!-- Copyright 2022 Le Filament
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -->
<odoo>
<data noupdate="1">
<record id="alterincub_age_range_cron" forcecreate="True" model="ir.cron">
<field name="name">AlterIncub - Partner : Calcul de la tranche d'âge</field>
<field eval="True" name="active" />
<field name="user_id" ref="base.user_root" />
<field name="interval_number">12</field>
<field name="interval_type">months</field>
<field name="numbercall">-1</field>
<field name="nextcall">2024-10-01 16:00:00</field>
<field name="model_id" ref="model_res_partner" />
<field name="state">code</field>
<field name="code">model.cron_age_range()</field>
</record>
</data>
</odoo>
......@@ -5,6 +5,7 @@ from . import alterincub_area
from . import alterincub_class
from . import alterincub_class_duration
from . import alterincub_collective_day
from . import alterincub_education_level
from . import alterincub_department
from . import alterincub_end_reason
from . import alterincub_lot
......@@ -12,4 +13,5 @@ from . import alterincub_price_list
from . import alterincub_program
from . import alterincub_sector
from . import alterincub_service_place
from . import alterincub_situration_entrance
from . import res_partner
# Copyright 2022 Le Filament (https://le-filament.com)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
from odoo import fields, models
class AlterincubEducationLevel(models.Model):
_name = "alterincub.education.level"
_description = "Niveau d'instruction"
# ------------------------------------------------------
# Fields declaration
# ------------------------------------------------------
name = fields.Char(
"Nom",
required=True,
)
active = fields.Boolean(
"Actif",
default=True,
)
description = fields.Char("Description")
sequence = fields.Integer()
# ------------------------------------------------------
# Computed fields / Search Fields
# ------------------------------------------------------
# ------------------------------------------------------
# Onchange / Constraints
# -----------------------------------------------------
# Copyright 2022 Le Filament (https://le-filament.com)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
from odoo import fields, models
class AlterincubSituationEntrance(models.Model):
_name = "alterincub.situation.entrance"
_description = "Situation à l'entrée"
# ------------------------------------------------------
# Fields declaration
# ------------------------------------------------------
name = fields.Char(
"Nom",
required=True,
)
active = fields.Boolean(
"Actif",
default=True,
)
description = fields.Char("Description")
sequence = fields.Integer()
# ------------------------------------------------------
# Computed fields / Search Fields
# ------------------------------------------------------
# ------------------------------------------------------
# Onchange / Constraints
# -----------------------------------------------------
......@@ -2,6 +2,8 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
import json
from dateutil.relativedelta import relativedelta
from odoo import _, api, fields, models
from odoo.exceptions import UserError
......@@ -159,6 +161,60 @@ class ResPartner(models.Model):
committee_backup = fields.Text("Retours comité")
# field to set readonly fields if not admin
is_alterincub_admin = fields.Boolean(compute="_compute_is_alterincub_admin")
# Contact fields
birthdate = fields.Date("Date de naissance")
age_range = fields.Selection(
selection=[
("under_25", "Moins de 25 ans"),
("25_35", "Entre 25 et 35 ans"),
("36_45", "Entre 36 et 45 ans"),
("over_45", "Plus de 45 ans"),
],
string="Tranche d'âge",
compute="_compute_age_range",
store=True,
)
nationality = fields.Selection(
selection=[
("ue", "UE"),
("not_ue", "HORS UE"),
("nd", "ND"),
],
string="Nationalité",
)
foreign_parents = fields.Selection(
selection=[
("yes", "Oui"),
("not", "Non"),
("nsp", "NSP"),
],
string="Parents étrangers",
)
educational_level = fields.Many2one(
comodel_name="alterincub.education.level",
string="Niveau d'instruction",
ondelete="restrict",
)
situation = fields.Many2one(
comodel_name="alterincub.situation.entrance",
string="Situation à l’entrée",
ondelete="restrict",
)
disability = fields.Selection(
selection=[
("yes", "Oui"),
("no", "Non"),
],
string="Reconnaissance handicap",
)
exclusion_risk = fields.Selection(
selection=[
("yes", "Oui"),
("not", "Non"),
("nsp", "NSP"),
],
string="Risque exclusion",
)
# ------------------------------------------------------
# SQL Constraints
......@@ -216,14 +272,35 @@ class ResPartner(models.Model):
if partner.contact_type == "project" and not partner.original_name:
partner.original_name = partner.name
@api.depends("street", "street2", "street3", "zip_id", "city", "zip", "country_id")
def _compute_geo_localize(self):
@api.depends("birthdate")
def _compute_age_range(self):
for partner in self:
partner.geo_localize()
if partner.birthdate:
age = relativedelta(fields.Date.today(), partner.birthdate).years
if age < 25:
partner.age_range = "under_25"
elif 25 <= age <= 35:
partner.age_range = "25_35"
elif 36 <= age <= 45:
partner.age_range = "36_45"
else:
partner.age_range = "over_45"
else:
partner.age_range = None
# ------------------------------------------------------
# Onchange / Constraints
# ------------------------------------------------------
@api.onchange("is_company")
def onchange_is_company(self):
"""
Set contact_type to False for person
"""
if not self.is_company:
self.contact_type = False
if self.is_incubated or self.is_provider:
self.type = "other"
@api.onchange("parent_id")
def onchange_parent_id(self):
"""
......@@ -232,7 +309,10 @@ class ResPartner(models.Model):
result = super().onchange_parent_id()
if self.env.context.get("default_parent_id"):
self.parent_id = self.env.context.get("default_parent_id")
if not self.parent_id:
self.type = "contact"
else:
self.type = "other"
return result
@api.onchange("street","street2","street3","zip","country_id","city")
......@@ -298,6 +378,16 @@ class ResPartner(models.Model):
}
)
# ------------------------------------------------------
# CRON methods
# ------------------------------------------------------
def cron_age_range(self):
"""
CRON permettant de recalculer les tranches d'âge
"""
partner_ids = self.search([("birthdate", "!=", False)])
partner_ids._compute_age_range()
# ------------------------------------------------------
# Business methods
# ------------------------------------------------------
......
......@@ -23,3 +23,7 @@ access_alterincub_program_manager,access_alterincub_program_manager,model_alteri
access_alterincub_sector_manager,access_alterincub_sector_manager,model_alterincub_sector,alterincub_partner.group_alterincub_list_manager,1,1,1,1
access_alterincub_service_place_manager,access_alterincub_service_place_manager,model_alterincub_service_place,alterincub_partner.group_alterincub_list_manager,1,1,1,1
access_alterincub_exit_project_wizard,access_alterincub_exit_project_wizard,model_alterincub_exit_project_wizard,base.group_user,1,1,1,1
access_alterincub_education_level,access_alterincub_education_level,model_alterincub_education_level,base.group_user,1,0,0,0
access_alterincub_education_level_manager,access_alterincub_education_level_manager,model_alterincub_education_level,alterincub_partner.group_alterincub_list_manager,1,1,1,1
access_alterincub_situation_entrance,access_alterincub_situation_entrance,model_alterincub_situation_entrance,base.group_user,1,0,0,0
access_alterincub_situation_entrance_manager,access_alterincub_situation_entrance_manager,model_alterincub_situation_entrance,alterincub_partner.group_alterincub_list_manager,1,1,1,1
<?xml version="1.0" encoding="utf-8" ?>
<!-- Copyright 2022 Le Filament
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -->
<odoo>
<data>
<!-- Tree view -->
<record id="alterincub_education_level_tree_view" model="ir.ui.view">
<field name="name">alterincub.education.level.tree</field>
<field name="model">alterincub.education.level</field>
<field name="arch" type="xml">
<tree string="Niveau d'instruction" editable="top">
<field name="sequence" widget="handle" />
<field name="name" />
<field name="description" />
</tree>
</field>
</record>
<!--
ACTIONS
-->
<record
id="alterincub_education_level_act_window"
model="ir.actions.act_window"
>
<field name="name">Niveaux d'éducation</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">alterincub.education.level</field>
<field name="view_mode">tree</field>
</record>
</data>
</odoo>
<?xml version="1.0" encoding="utf-8" ?>
<!-- Copyright 2022 Le Filament
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -->
<odoo>
<data>
<!-- Tree view -->
<record id="alterincub_situation_entrance_tree_view" model="ir.ui.view">
<field name="name">alterincub.situation.entrance.tree</field>
<field name="model">alterincub.situation.entrance</field>
<field name="arch" type="xml">
<tree string="Situation à l’entrée" editable="top">
<field name="sequence" widget="handle" />
<field name="name" />
<field name="description" />
</tree>
</field>
</record>
<!--
ACTIONS
-->
<record
id="alterincub_situation_entrance_act_window"
model="ir.actions.act_window"
>
<field name="name">Situation à l’entrée</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">alterincub.situation.entrance</field>
<field name="view_mode">tree</field>
</record>
</data>
</odoo>
......@@ -141,11 +141,18 @@
action="alterincub_partner.alterincub_end_reason_act_window"
/>
<menuitem
name="Durée de Promotion"
sequence="70"
id="menu_alterincub_class_duration"
name="Niveaux d'instruction"
sequence="80"
id="menu_alterincub_education_level"
parent="menu_alterincub_list_root"
action="alterincub_partner.alterincub_class_duration_act_window"
action="alterincub_partner.alterincub_education_level_act_window"
/>
<menuitem
name="Situations à l’entrée"
sequence="90"
id="menu_alterincub_situation_entrance"
parent="menu_alterincub_list_root"
action="alterincub_partner.alterincub_situation_entrance_act_window"
/>
</data>
</odoo>
......@@ -121,6 +121,9 @@
<xpath expr="//field[@name='parent_id']" position="attributes">
<attribute name="options">{'no_create': 1, 'no_edit': 1}</attribute>
<attribute name="domain">parent_id_domain</attribute>
<attribute
name="required"
>context.get('default_is_incubated') or context.get('default_is_provider')</attribute>
</xpath>
<!-- Type de contact -->
......@@ -141,30 +144,10 @@
</xpath>
<!-- Bloc gauche : Adresse -->
<!-- Autorise la modification d'adresse pour les porteurs de projet -->
<xpath expr="//field[@name='street']" position="attributes">
<attribute
name="attrs"
>{'readonly': [('type', '=', 'contact'),('parent_id', '!=', False),('is_incubated', '=', False)]}</attribute>
</xpath>
<xpath expr="//field[@name='street2']" position="attributes">
<attribute
name="attrs"
>{'readonly': [('type', '=', 'contact'),('parent_id', '!=', False),('is_incubated', '=', False)]}</attribute>
</xpath>
<xpath expr="//field[@name='city']" position="attributes">
<attribute
name="attrs"
>{'readonly': [('type', '=', 'contact'),('parent_id', '!=', False),('is_incubated', '=', False)]}</attribute>
</xpath>
<!-- Cache le champ Etat -->
<xpath expr="//field[@name='state_id']" position="attributes">
<attribute name="invisible">1</attribute>
</xpath>
<xpath expr="//field[@name='zip']" position="attributes">
<attribute
name="attrs"
>{'readonly': [('type', '=', 'contact'),('parent_id', '!=', False),('is_incubated', '=', False)]}</attribute>
</xpath>
<!-- Masque la TVA -->
<xpath expr="//field[@name='vat']" position="attributes">
<attribute name="invisible">1</attribute>
......@@ -282,6 +265,26 @@
/>
</group>
</group>
<!-- Données porteur de projet -->
<group
name="alterincub_project_datas"
attrs="{'invisible': [('is_incubated', '!=', True)]}"
string="Questionnaire FSE"
>
<group>
<field name="birthdate" />
<field name="age_range" />
<field name="nationality" />
<field name="foreign_parents" />
</group>
<group>
<field name="educational_level" widget="selection" />
<field name="situation" widget="selection" />
<field name="disability" />
<field name="exclusion_risk" />
</group>
</group>
</xpath>
<!-- Masque l'onglet Contacts pour les contacts -->
......@@ -808,7 +811,7 @@
>[('is_provider', '=', True),('is_company', '!=', True)]</field>
<field
name="context"
>{'default_is_company': False, 'default_is_provider': True}</field>
>{'default_is_company': False, 'default_is_provider': True,}</field>
</record>
</data>
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Veuillez vous inscrire ou vous pour commenter