Um pouco de arquitetura, historia e experiências.
Fazendo companhias um lugar melhor. Um app por vez.
Odoo é uma plataforma de codigo aberto de aplicativos de gestão empresárial.
2005
2010
Então, o sonho começou a se tornar realidade. Começamos a ter pistas de que o que fizemos poderia mudar o mundo
2013
2014
Fonte: https://www.odoo.com/blog/odoo-news-5/post/the-odoo-story-56
O que tornou o Odoo grande? Comunidade!
# -*- coding: utf-8 -*-
# © 2016 Daniel Torres
# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html
# Import odoo community association
from oca import indio
Associação da comunidade Odoo, ou OCA, é uma organização sem fins lucrativos cuja a missão é promover o uso generalizado do Odoo e apoiar o desenvolvimento colaborativo de recursos do Odoo.
Talk is cheap, show me the code!
– Linus Torvalds
Siga as regras
Faça pelos outros para que eles façam por voce;
“Gaste o seu tempo de espera revendo as contribuições dos outros “[...] As coisas mais interessantes que aprendi sobre programação em geral e especificamente em Odoo era por ter o meu código revisto ou revendo o código de outras pessoas.” – Holger Brunn, membro da comunidade.
Problemas:
class ProjectTask(models.Model):
name = fields.Char('Name')
date_start = fields.Date('Date Start')
date_end = fields.Date('Date End')
stage_id = fields.One2many('Stage', 'project.task.stage')
...
@api.onchange('user_id')
def _onchange_user(self):
if self.user_id:
self.date_start = fields.Datetime.now()
@api.multi
def copy(self, default=None):
...
@api.constrains('date_start', 'date_end')
def _check_dates(self):
if any(self.filtered(lambda task: task.date_start and
task.date_end and task.date_start > task.date_end)):
return ValidationError(
_('Error !))
<record id="act_project_project_2_project_task_all" model="ir.actions.act_window">
<field name="name">Tasks</field>
<field name="res_model">project.task</field>
<field name="view_mode">kanban,tree,form,calendar,pivot,graph</field>
</record>
<menuitem action="action_view_task" id="menu_action_view_task" parent="project.menu_project_management" sequence="5"/>
<record id="view_task_tree2" model="ir.ui.view">
<field name="name">project.task.tree</field>
<field name="model">project.task</field>
<field eval="2" name="priority"/>
<field name="arch" type="xml">
<tree decoration-bf="message_needaction==True" decoration-danger="date_deadline and (date_deadline<current_date)" string="Tasks">
<field name="message_needaction" invisible="1"/>
<field name="sequence" invisible="not context.get('seq_visible', False)"/>
<field name="name"/>
<field name="project_id" invisible="context.get('user_invisible', False)"/>
<field name="user_id" invisible="context.get('user_invisible', False)"/>
<field name="planned_hours" invisible="context.get('set_visible',False)" groups="project.group_time_work_estimation_tasks"/>
<field name="date_deadline" invisible="context.get('deadline_visible',True)"/>
<field name="stage_id" invisible="context.get('set_visible',False)"/>
</tree>
</field>
</record>
[...]
class website_user_tasks(http.Controller):
def _prepare_tasks(self, **kw):
my_tasks = request.env['project.task'].search([
('user_id', '=', request.uid)
])
return my_tasks
@http.route(['/my/tasks'], type='http', auth="user", website=True)
def tasks(self, **post):
tasks = {'tasks': self._prepare_tasks()}
return request.website.render("website_user_tasks.tasks_only", tasks)
<template id="tasks" name="Minhas Tarefas">
<h3 >Suas Tarefas</h3>
<t t-if="not tasks">
<p>Nao existem tarefas disponiveis.</p>
</t>
<t t-if="tasks">
<div class="table-responsive">
<table class="table table-hover o_my_status_table">
<thead>
<tr class="active">
<th>Task Code#</th>
<th>Nome</th>
<th>Inicio</th>
<th>Fim</th>
<th>Situacao</th>
</tr>
</thead>
<t t-foreach="tasks" t-as="task">
<tr>
<td><span t-field="task.id"/></td>
<td><span t-field="task.name"/></td>
<td><span t-field="task.date_start"/></td>
<td><span t-field="task.date_end"/></td>
<td><span t-field="task.stage_id"/></td>
</tr>
</t>
</table>
</div>
</t>
</template>