Split project to move portal features to a new module named website_project. Portal users may now access their projects and tasks throught the website_portal My account page. The Backend portal menuitem is removed. Simplify the privacy settings of project, to be visible to portal users the project must be in 'portal' mode. Original authors: Vipul Bhatt, Florian Wintjens
296 lines
15 KiB
XML
296 lines
15 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<odoo>
|
|
<template id="portal_layout" name="Portal layout: project menu entry" inherit_id="website_portal.portal_layout" priority="28">
|
|
<xpath expr="//ul[contains(@class,'o_portal_submenu')]" position="inside">
|
|
<li t-if="project_count" t-att-class="page_name == 'project' and 'active' or ''">
|
|
<a href="/my/projects">Projects</a>
|
|
</li>
|
|
<li t-if="task_count" t-att-class="page_name == 'task' and 'active' or ''">
|
|
<a href="/my/tasks">Tasks</a>
|
|
</li>
|
|
</xpath>
|
|
</template>
|
|
|
|
<template id="portal_my_home" name="Portal My Home: project entries" inherit_id="website_portal.portal_my_home" priority="28">
|
|
<xpath expr="//div[contains(@class,'o_my_home_content')]" position="inside">
|
|
<h3 t-if="project_count" class="page-header">
|
|
<a href="/my/projects">Your Projects
|
|
<small class="ml8">
|
|
<span class='badge'><t t-esc="project_count"/></span>
|
|
</small>
|
|
</a>
|
|
</h3>
|
|
<h3 t-if="task_count" class="page-header">
|
|
<a href="/my/tasks">Your Tasks
|
|
<small class="ml8">
|
|
<span class='badge'><t t-esc="task_count"/></span>
|
|
</small>
|
|
</a>
|
|
</h3>
|
|
</xpath>
|
|
</template>
|
|
|
|
<template id="my_projects" name="My Projects">
|
|
<t t-call="website_portal.portal_layout">
|
|
<div class="row">
|
|
<h3 class="page-header">
|
|
Your Projects
|
|
<div class="dropdown pull-right mr8">
|
|
<button id="sortby" class="btn btn-default" type="button" data-toggle="dropdown">
|
|
<span class="fa fa-sort fa-lg" /> <span t-esc="sortings.get(sortby, {}).get('label', 'Newest')"/>
|
|
<span class="caret"></span>
|
|
</button>
|
|
<ul class="dropdown-menu" aria-labelledby="sortby">
|
|
<li t-foreach="sortings" t-as="option" t-attf-class="#{sortby == option and 'active'}">
|
|
<a t-att-href="default_url + '?' + keep_query('date_begin', 'date_end', sortby=option)"><span t-esc="sortings.get(option).get('label')"/></a>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
</h3>
|
|
</div>
|
|
<div class="panel panel-default">
|
|
<t t-if="not projects">
|
|
<div class="alert alert-warning mt8" role="alert">
|
|
There are no projects.
|
|
</div>
|
|
</t>
|
|
<table t-if="projects" class="table table-hover status_table">
|
|
<thead>
|
|
<tr class="active">
|
|
<th class="col-md-6">Name</th>
|
|
<th></th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr t-foreach="projects" t-as="project">
|
|
<td>
|
|
<a t-attf-href="/my/project/#{project.id}?{{ keep_query() }}"><span t-field="project.name"/></a>
|
|
</td>
|
|
<td>
|
|
<a t-if="project.use_tasks" t-attf-href="/my/tasks?project=#{project.id}">
|
|
<t t-esc="project.task_count" />
|
|
<t t-esc="project.label_tasks" />
|
|
</a>
|
|
</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
<div t-if="pager" class="o_portal_pager text-center">
|
|
<t t-call="website.pager"/>
|
|
</div>
|
|
</t>
|
|
</template>
|
|
|
|
<template id="my_project" name="My Project">
|
|
<t t-call="website.layout">
|
|
<div id="wrap">
|
|
<div class="container">
|
|
<div class="oe_structure">
|
|
<div class="row">
|
|
<div class="col-sm-4">
|
|
<ol class="breadcrumb mt8">
|
|
<li><a href="/my/home"><i class="fa fa-home"/></a></li>
|
|
<li><a t-attf-href="/my/projects?#{keep_query()}">My Projects</a></li>
|
|
<li><span t-field="project.name"/></li>
|
|
</ol>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="container">
|
|
<div class="panel panel-default">
|
|
<div class="panel-heading">
|
|
<div class="row">
|
|
<div class="col-md-12">
|
|
<h4>
|
|
Project - <span t-field="project.name"/>
|
|
</h4>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="panel-body">
|
|
<div class='row'>
|
|
<div class="col-md-6">
|
|
<t t-if="project.partner_id">
|
|
<strong>Customer</strong>
|
|
<div t-if="project.partner_id">
|
|
<address t-field="project.partner_id" t-field-options='{"widget": "contact", "fields": ["name", "email"]}'/>
|
|
</div>
|
|
</t>
|
|
<t t-if="project.user_id">
|
|
<strong>Project Manager</strong>
|
|
<div>
|
|
<address t-field="project.user_id" t-field-options='{"widget": "contact", "fields": ["name", "email", "phone"]}'/>
|
|
</div>
|
|
</t>
|
|
</div>
|
|
<div class="col-md-6">
|
|
<div class="pull-right">
|
|
<a t-attf-href="/my/tasks?project=#{project.id}" class="btn btn-default btn-lg">
|
|
<span class="fa fa-tasks" />
|
|
<span t-esc="project.task_count" />
|
|
<span t-field="project.label_tasks" />
|
|
</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="row mt32">
|
|
<div class="col-md-12">
|
|
<h4><strong>Message and communication history</strong></h4>
|
|
</div>
|
|
<div class="col-md-10 col-md-offset-1 mt16">
|
|
<t t-call="website_mail.message_thread">
|
|
<t t-set="object" t-value="project"/>
|
|
<t t-set="chatter_mode" t-value="'json'"/>
|
|
</t>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</t>
|
|
</template>
|
|
|
|
<template id="my_tasks" name="My Tasks">
|
|
<t t-call="website_portal.portal_layout">
|
|
<h3 class="page-header">
|
|
Your Tasks
|
|
<div class="dropdown pull-right mr8">
|
|
<button id="sortby" class="btn btn-default" type="button" data-toggle="dropdown">
|
|
<span class="fa fa-sort fa-lg" /> <span t-esc="sortings.get(sortby, {}).get('label', 'Newest')"/>
|
|
<span class="caret"></span>
|
|
</button>
|
|
<ul class="dropdown-menu" aria-labelledby="sortby">
|
|
<li t-foreach="sortings" t-as="option" t-att-class="sortby == option and 'active'">
|
|
<a t-attf-href="/my/tasks?{{ keep_query('date_begin', 'date_end', 'project', sortby=option) }}"><span t-esc="sortings.get(option).get('label')"/></a>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
<div class="dropdown pull-right mr8">
|
|
<button id="project_filters" class="btn btn-default" type="button" data-toggle="dropdown">
|
|
Projects: <span t-esc="project_filters.get(project, {}).get('label', 'All')"/>
|
|
<span class="caret"></span>
|
|
</button>
|
|
<ul class="dropdown-menu" aria-labelledby="project_filters">
|
|
<li t-foreach="project_filters" t-as="option" t-att-class="project == option and 'active'">
|
|
<a t-attf-href="/my/tasks?{{ keep_query('date_begin', 'date_end', 'sortby', project=option) }}"><span t-esc="project_filters.get(option).get('label')"/></a>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
</h3>
|
|
<div class="panel panel-default">
|
|
<t t-if="not tasks">
|
|
<div class="alert alert-warning mt8" role="alert">
|
|
There are no tasks.
|
|
</div>
|
|
</t>
|
|
<table t-if="tasks" class="table table-hover status_table">
|
|
<thead>
|
|
<tr class="active">
|
|
<th class="col-md-10">Task</th>
|
|
<th>Stage</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<t t-foreach="tasks" t-as="task">
|
|
<tr>
|
|
<td>
|
|
<a t-attf-href="/my/task/#{task.id}?{{ keep_query() }}"><span t-field="task.name"/></a>
|
|
</td>
|
|
<td>
|
|
<span class="label label-info" title="Current stage of the task" t-esc="task.stage_id.name" />
|
|
</td>
|
|
</tr>
|
|
</t>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
<div t-if="pager" class="o_portal_pager text-center">
|
|
<t t-call="website.pager"/>
|
|
</div>
|
|
</t>
|
|
</template>
|
|
|
|
<template id="my_task" name="My Task">
|
|
<t t-call="website.layout">
|
|
<div id="wrap">
|
|
<div class="container">
|
|
<div class="oe_structure">
|
|
<div class="row">
|
|
<div class="col-sm-6">
|
|
<ol class="breadcrumb mt8">
|
|
<li><a href="/my/home"><i class="fa fa-home"/></a></li>
|
|
<li><a t-attf-href="/my/tasks?#{keep_query()}">My Tasks</a></li>
|
|
<li><span t-field="task.name"/></li>
|
|
</ol>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="container">
|
|
<div class="panel panel-default">
|
|
<div class="panel-heading">
|
|
<div class="row">
|
|
<div class="col-md-12">
|
|
<h4>
|
|
Task - <span t-field="task.name"/>
|
|
<span t-field="task.stage_id.name" class="pull-right label label-info" title="Current stage of this task"/>
|
|
<a class="btn btn-info" t-att-href="'/web#return_label=Website&model=project.task&id=%s&view_type=form' % (task.id)" groups="project.group_project_user">Edit Task</a>
|
|
</h4>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="panel-body">
|
|
<div class="mb8" t-if="user.partner_id.id in task.sudo().project_id.message_partner_ids.ids">
|
|
<strong>Project:</strong> <a t-attf-href="/my/project/#{task.project_id.id}" t-field="task.project_id.name"/>
|
|
</div>
|
|
|
|
<div class='row'>
|
|
<div class="col-md-6">
|
|
<div class="mb8">
|
|
<strong>Date:</strong> <span t-field="task.create_date" t-field-options='{"widget": "date"}'/>
|
|
</div>
|
|
|
|
<div t-if="task.user_id">
|
|
<strong>Assigned to</strong>
|
|
<div>
|
|
<address t-field="task.user_id" t-field-options='{"widget": "contact", "fields": ["name", "email", "phone"]}'/>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="col-md-6">
|
|
<div class="mb8" t-if="task.date_deadline">
|
|
<strong>Deadline:</strong> <span t-field="task.date_deadline" t-field-options='{"widget": "date"}'/>
|
|
</div>
|
|
<div t-if="task.partner_id">
|
|
<strong>Reported by</strong>
|
|
<div>
|
|
<address t-field="task.partner_id" t-field-options='{"widget": "contact", "fields": ["name", "email"]}'/>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="container" t-if="task.description">
|
|
<p t-field="task.description" />
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="row mt32">
|
|
<div class="col-md-12">
|
|
<h4><strong>Message and communication history</strong></h4>
|
|
</div>
|
|
<div class="col-md-10 col-md-offset-1 mt16">
|
|
<t t-call="website_mail.message_thread">
|
|
<t t-set="object" t-value="task"/>
|
|
<t t-set="chatter_mode" t-value="'json'"/>
|
|
</t>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</t>
|
|
</template>
|
|
</odoo>
|