[ADD] partner_profiles_portal: create add-on
This commit is contained in:
24
partner_profiles_portal/views/portal_home_template.xml
Normal file
24
partner_profiles_portal/views/portal_home_template.xml
Normal file
@@ -0,0 +1,24 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<template id="portal_my_home_profile_menu" name="Portal My Home: Profile Menu" inherit_id="portal.portal_layout" priority="40">
|
||||
<xpath expr="//div[hasclass('o_portal_my_details')]" position="replace">
|
||||
<div class="o_portal_my_details">
|
||||
<h4>Your Details </h4>
|
||||
<hr class="mt-1 mb-0" />
|
||||
<div class="mb8" t-field="user_id.partner_id" t-options="{"widget": "contact", "fields": ["email", "phone", "address", "name"]}" />
|
||||
<div name="profiles_management">
|
||||
<a t-attf-href="/my/account">
|
||||
<button class="btn btn-primary mb8">
|
||||
Modify my account
|
||||
</button>
|
||||
</a>
|
||||
<a t-attf-href="/my/profiles">
|
||||
<button class="btn btn-primary mb8">
|
||||
Consult my profiles
|
||||
</button>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</xpath>
|
||||
</template>
|
||||
</odoo>
|
@@ -0,0 +1,97 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<template id="portal_my_profiles" name="My Profiles">
|
||||
<t t-call="portal.portal_layout">
|
||||
<t t-set="breadcrumbs_searchbar" t-value="True" />
|
||||
|
||||
<t t-call="portal.portal_searchbar">
|
||||
<t t-set="title">Profiles</t>
|
||||
</t>
|
||||
<div class="oe_structure" id="oe_structure_portal_my_profiles_1" />
|
||||
<t t-if="not profiles">
|
||||
<div class="alert alert-warning mt8" role="alert">
|
||||
There are no profiles.
|
||||
</div>
|
||||
</t>
|
||||
<h3>
|
||||
<br />
|
||||
My profiles
|
||||
</h3>
|
||||
<t t-if="profiles" t-call="portal.portal_table">
|
||||
<thead>
|
||||
<tr class="active">
|
||||
<th>
|
||||
<span class='d-none d-md-inline'>Profile name</span>
|
||||
</th>
|
||||
<th class="text-right">Profile type</th>
|
||||
<th class="text-right">Position</th>
|
||||
<th class="text-right">Company</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr t-foreach="profiles" t-as="profile">
|
||||
<t t-if="not profile.is_company">
|
||||
<td>
|
||||
<a t-attf-href="/my/profile/#{profile.id}?{{ keep_query() }}">
|
||||
<span t-field="profile.name" />
|
||||
</a>
|
||||
</td>
|
||||
<td class="text-right">
|
||||
<span t-field="profile.partner_profile" />
|
||||
</td>
|
||||
<td class="text-right">
|
||||
<span t-field="profile.function" />
|
||||
</td>
|
||||
<td class="text-right">
|
||||
<span t-field="profile.parent_id" />
|
||||
</td>
|
||||
</t>
|
||||
</tr>
|
||||
</tbody>
|
||||
</t>
|
||||
<p style="font-style:italic; font-size:smaller">
|
||||
<b>Public profile :</b>
|
||||
profiles that might be available to tierce applications (annuary for instance).
|
||||
<br />
|
||||
<b>Position profiles :</b>
|
||||
profiles that indicate your belonging to an organization, and the role you have in.
|
||||
</p>
|
||||
<h3>
|
||||
<br />
|
||||
My organizations' profiles
|
||||
</h3>
|
||||
<t t-if="profiles" t-call="portal.portal_table">
|
||||
<thead>
|
||||
<tr class="active">
|
||||
<th>
|
||||
<span class='d-none d-md-inline'>Profile name</span>
|
||||
</th>
|
||||
<th class="text-right">Profile type</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr t-foreach="profiles" t-as="profile">
|
||||
<t t-if="profile.is_company">
|
||||
<td>
|
||||
<a t-attf-href="/my/profile/#{profile.id}?{{ keep_query() }}">
|
||||
<span t-field="profile.name" />
|
||||
</a>
|
||||
</td>
|
||||
<td class="text-right">
|
||||
<span t-field="profile.partner_profile" />
|
||||
</td>
|
||||
</t>
|
||||
</tr>
|
||||
</tbody>
|
||||
</t>
|
||||
<p style="font-style:italic; font-size:smaller">
|
||||
<b>Main profiles :</b>
|
||||
internal and private profiles, used for membership management and internal communication.
|
||||
<br />
|
||||
<b>Public profiles :</b>
|
||||
profiles that might be available to tierce applications (annuary for instance).
|
||||
</p>
|
||||
<div class="oe_structure" id="oe_structure_portal_my_profiles_2" />
|
||||
</t>
|
||||
</template>
|
||||
</odoo>
|
@@ -0,0 +1,189 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<template id="portal_my_profile" name="My Profile">
|
||||
<t t-call="portal.portal_layout">
|
||||
<t t-set="o_portal_fullwidth_alert" groups="profile.group_profile_user">
|
||||
<t t-call="portal.portal_back_in_edit_mode">
|
||||
<t t-set="backend_url" t-value="'/web#return_label=Website&model=res.partner&id=%s&view_type=form' % (profile.id)" />
|
||||
</t>
|
||||
</t>
|
||||
<t t-call="portal.portal_record_layout">
|
||||
<t t-set="card_header">
|
||||
<h5 class="mb-0">
|
||||
<strong>
|
||||
<span t-field="profile.name" />
|
||||
</strong>
|
||||
<small class="text-muted">
|
||||
-
|
||||
<span t-field="profile.partner_profile" />
|
||||
</small>
|
||||
</h5>
|
||||
<div t-if="profile.is_position_profile">
|
||||
<h5 class="mb-0">
|
||||
<span t-field="profile.parent_id" />
|
||||
</h5>
|
||||
<br />
|
||||
<ul class="col-12 col-md-6 pb-2" style="list-style-type:none">
|
||||
<li>
|
||||
<span t-field="profile.street" />
|
||||
</li>
|
||||
<li>
|
||||
<span t-field="profile.zip" />
|
||||
</li>
|
||||
<li>
|
||||
<span t-field="profile.city" />
|
||||
</li>
|
||||
<li>
|
||||
<span t-field="profile.country_id" />
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</t>
|
||||
<t t-set="card_body">
|
||||
<div class="oe_structure" id="oe_structure_portal_my_profile_1" />
|
||||
<!-- Body for Position partner profiles-->
|
||||
<div t-if="profile.is_position_profile">
|
||||
<form action="/my/profile/save" method="post">
|
||||
<input type="hidden" name="csrf_token" t-att-value="request.csrf_token()" />
|
||||
<div class="row o_portal_details">
|
||||
<div class="col-lg-12">
|
||||
<div class="col-lg-12">
|
||||
<div t-if="error_message" class="alert alert-danger" role="alert">
|
||||
<t t-foreach="error_message" t-as="err">
|
||||
<t t-esc="err" />
|
||||
<br />
|
||||
</t>
|
||||
</div>
|
||||
</div>
|
||||
<h3>
|
||||
<br />
|
||||
Job position
|
||||
</h3>
|
||||
<div class="row">
|
||||
<div t-attf-class="form-group #{error.get('function') and 'o_has_error' or ''} col-xl-12">
|
||||
<input type="text" name="function" t-attf-class="form-control #{error.get('function') and 'is-invalid' or ''}" t-att-value="function or profile.function" />
|
||||
</div>
|
||||
</div>
|
||||
<h3>
|
||||
<br />
|
||||
Contact information
|
||||
</h3>
|
||||
<div class="row">
|
||||
<div t-attf-class="form-group #{error.get('phone') and 'o_has_error' or ''} col-xl-6">
|
||||
<label class="col-form-label" for="phone">Phone</label>
|
||||
<input type="tel" name="phone" t-attf-class="form-control #{error.get('phone') and 'is-invalid' or ''}" t-att-value="phone or profile.phone" />
|
||||
</div>
|
||||
<div t-attf-class="form-group #{error.get('mobile') and 'o_has_error' or ''} col-xl-6">
|
||||
<label class="col-form-label" for="mobile">Mobile</label>
|
||||
<input type="tel" name="mobile" t-attf-class="form-control #{error.get('mobile') and 'is-invalid' or ''}" t-att-value="mobile or profile.mobile" />
|
||||
</div>
|
||||
<div t-attf-class="form-group #{error.get('email') and 'o_has_error' or ''} col-xl-6">
|
||||
<label class="col-form-label" for="email">Email</label>
|
||||
<input type="email" name="email" t-attf-class="form-control #{error.get('email') and 'is-invalid' or ''}" t-att-value="email or profile.email" />
|
||||
</div>
|
||||
<div t-attf-class="form-group #{error.get('website_url') and 'o_has_error' or ''}col-xl-6">
|
||||
<label class="col-form-label" for="website_url">Website</label>
|
||||
<input type="text" name="website_url" t-attf-class="form-control #{error.get('website') and 'is-invalid' or ''}" t-att-value="website_url or profile.website" />
|
||||
</div>
|
||||
</div>
|
||||
<input type="hidden" name="profile_id" t-att-value="profile_id" />
|
||||
<input type="hidden" name="redirect" t-att-value="redirect" />
|
||||
<div class="clearfix">
|
||||
<button type="submit" class="btn btn-primary float-right mb32 ">
|
||||
Save
|
||||
<span class="fa fa-long-arrow-right" />
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<!-- Body for Public partner profiles-->
|
||||
<div t-if="profile.is_main_profile or profile.is_public_profile">
|
||||
<form action="/my/profile/save" method="post">
|
||||
<input type="hidden" name="csrf_token" t-att-value="request.csrf_token()" />
|
||||
<div class="row o_portal_details">
|
||||
<div class="col-lg-12">
|
||||
<div name="errors" class="col-lg-12">
|
||||
<div t-if="error_message" class="alert alert-danger" role="alert">
|
||||
<t t-foreach="error_message" t-as="err">
|
||||
<t t-esc="err" />
|
||||
<br />
|
||||
</t>
|
||||
</div>
|
||||
</div>
|
||||
<div name="nickname" class="row">
|
||||
<div t-attf-class="form-group #{error.get('nickname') and 'o_has_error' or ''} col-xl-12">
|
||||
<label class="col-form-label" for="nickname">Name / Nickname</label>
|
||||
<input type="text" name="nickname" t-attf-class="form-control #{error.get('nickname') and 'is-invalid' or ''}" t-att-value="nickname or profile.name" />
|
||||
</div>
|
||||
</div>
|
||||
<h3>
|
||||
<br />
|
||||
Contact information
|
||||
</h3>
|
||||
<div name="contact_info_1" class="row">
|
||||
<div name="street" t-attf-class="form-group #{error.get('street') and 'o_has_error' or ''} col-xl-6">
|
||||
<label class="col-form-label" for="street">Street</label>
|
||||
<input type="text" name="street" t-attf-class="form-control #{error.get('street') and 'is-invalid' or ''}" t-att-value="street or profile.street" />
|
||||
</div>
|
||||
<div name="street2" t-attf-class="form-group #{error.get('street2') and 'o_has_error' or ''} col-xl-6">
|
||||
<label class="col-form-label" for="street2">Street 2</label>
|
||||
<input type="text" name="street2" t-attf-class="form-control #{error.get('street2') and 'is-invalid' or ''}" t-att-value="street2 or profile.street2" />
|
||||
</div>
|
||||
<div name="zip" t-attf-class="form-group #{error.get('zipcode') and 'o_has_error' or ''} col-xl-6">
|
||||
<label class="col-form-label" for="zipcode">Zip / Postal Code</label>
|
||||
<input type="text" name="zipcode" t-attf-class="form-control #{error.get('zipcode') and 'is-invalid' or ''}" t-att-value="zipcode or profile.zip" />
|
||||
</div>
|
||||
<div name="city" t-attf-class="form-group #{error.get('city') and 'o_has_error' or ''} col-xl-6">
|
||||
<label class="col-form-label" for="city">City</label>
|
||||
<input type="text" name="city" t-attf-class="form-control #{error.get('city') and 'is-invalid' or ''}" t-att-value="city or profile.city" />
|
||||
</div>
|
||||
<div name="country" t-attf-class="form-group #{error.get('country_id') and 'o_has_error' or ''} col-xl-6">
|
||||
<label class="col-form-label" for="country_id">Country</label>
|
||||
<select name="country_id" t-attf-class="form-control">
|
||||
<option value="">Country...</option>
|
||||
<t t-foreach="countries or []" t-as="country">
|
||||
<option t-att-value="country.id" t-att-selected="country.id == int(country_id) if country_id else country.id == profile.country_id.id">
|
||||
<t t-esc="country.name" />
|
||||
</option>
|
||||
</t>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div name="contact_info_2" class="row">
|
||||
<div name="phone" t-attf-class="form-group #{error.get('phone') and 'o_has_error' or ''} col-xl-6">
|
||||
<label class="col-form-label" for="phone">Phone</label>
|
||||
<input type="tel" name="phone" t-attf-class="form-control #{error.get('phone') and 'is-invalid' or ''}" t-att-value="phone or profile.phone" />
|
||||
</div>
|
||||
<div name="mobile" t-attf-class="form-group #{error.get('mobile') and 'o_has_error' or ''} col-xl-6">
|
||||
<label class="col-form-label" for="mobile">Mobile</label>
|
||||
<input type="tel" name="mobile" t-attf-class="form-control #{error.get('mobile') and 'is-invalid' or ''}" t-att-value="mobile or profile.mobile" />
|
||||
</div>
|
||||
<div name="email" t-attf-class="form-group #{error.get('email') and 'o_has_error' or ''} col-xl-6">
|
||||
<label class="col-form-label" for="email">Email</label>
|
||||
<input type="email" name="email" t-attf-class="form-control #{error.get('email') and 'is-invalid' or ''}" t-att-value="email or profile.email" />
|
||||
</div>
|
||||
<div name="website" t-attf-class="form-group #{error.get('website_url') and 'o_has_error' or ''} col-xl-6">
|
||||
<label class="col-form-label" for="website_url">Website</label>
|
||||
<input type="text" name="website_url" t-attf-class="form-control #{error.get('website_url') and 'is-invalid' or ''}" t-att-value="website_url or profile.website" />
|
||||
</div>
|
||||
</div>
|
||||
<input type="hidden" name="profile_id" t-att-value="profile_id" />
|
||||
<input type="hidden" name="redirect" t-att-value="redirect" />
|
||||
<div class="clearfix">
|
||||
<button type="submit" class="btn btn-primary float-right mb32 ">
|
||||
Save
|
||||
<span class="fa fa-long-arrow-right" />
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<div class="oe_structure" id="oe_structure_portal_my_profile_2" />
|
||||
</t>
|
||||
</t>
|
||||
</t>
|
||||
</template>
|
||||
</odoo>
|
32
partner_profiles_portal/views/res_partner_view.xml
Normal file
32
partner_profiles_portal/views/res_partner_view.xml
Normal file
@@ -0,0 +1,32 @@
|
||||
<?xml version="1.0"?>
|
||||
<odoo>
|
||||
<data>
|
||||
<record id="partner_profiles_form_view" model="ir.ui.view">
|
||||
<field name="name">Partner Profiles Form View</field>
|
||||
<field name="model">res.partner</field>
|
||||
<field name="inherit_id" ref="base.view_partner_form" />
|
||||
<field name="sequence">99</field>
|
||||
<field name="arch" type="xml">
|
||||
<!-- Main display -->
|
||||
<xpath expr="//group[@name='profile_status']" position="after">
|
||||
<group name="structure_access_rights" attrs="{'invisible': ['|', ('is_position_profile','=',False), ('parent_id','=',False)]}">
|
||||
<field name="edit_structure_main_profile" />
|
||||
<field name="edit_structure_public_profile" />
|
||||
</group>
|
||||
</xpath>
|
||||
|
||||
<!-- page Contacts & Adresses -->
|
||||
<xpath expr="//field[@name='child_ids']/form/sheet/group/group/field[@name='comment']" position="before">
|
||||
<field name="edit_structure_main_profile" attrs="{'invisible': [('is_position_profile','=',False)]}" />
|
||||
<field name="edit_structure_public_profile" attrs="{'invisible': [('is_position_profile','=',False)]}" />
|
||||
</xpath>
|
||||
|
||||
<!-- page Other Positions -->
|
||||
<xpath expr="//field[@name='other_contact_ids']/form/sheet/group/group/field[@name='parent_id']" position="after">
|
||||
<field name="edit_structure_main_profile" attrs="{'invisible': [('is_position_profile','=',False)]}" />
|
||||
<field name="edit_structure_public_profile" attrs="{'invisible': [('is_position_profile','=',False)]}" />
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
</data>
|
||||
</odoo>
|
Reference in New Issue
Block a user