deisy hace 6 años
commit
290081683b

+ 5 - 0
__init__.py

@@ -0,0 +1,5 @@
+# -*- coding: utf-8 -*-
+
+from . import project
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

BIN
__init__.pyc


+ 30 - 0
__openerp__.py

@@ -0,0 +1,30 @@
+# -*- coding: utf-8 -*-
+{
+    'name': 'Custom Project Management',
+    'version': '1.1',
+    'author': 'Eiru',
+    'category': 'Project Management',
+    'sequence': 8,
+    'summary': 'Projects, Tasks',
+    'depends': [
+        'project',
+        'web_kanban',
+    ],
+    'data': [
+        'views/menu.xml',
+        'views/project.xml',
+        'views/task.xml',
+        'views/activity.xml',
+        'views/category.xml',
+        'views/account.xml',
+        'template.xml',
+        'security/ir.model.access.csv',
+    ],
+    'qweb' : [
+        'static/src/xml/*.xml',
+    ],
+    'installable': True,
+    'auto_install': False,
+    'application': True,
+}
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

+ 170 - 0
project.py

@@ -0,0 +1,170 @@
+# -*- coding: utf-8 -*-
+
+from openerp import models, api, fields, _
+from datetime import datetime
+from openerp.exceptions import ValidationError
+import json
+
+
+class project_task_activity(models.Model):
+    _name = 'project.task.activity'
+    _order = "sequence"
+
+    task_id = fields.Many2one(
+        'project.task',
+        string='Task',
+        required=True, ondelete='cascade')
+    project_id = fields.Many2one(
+        'project.project',
+        string='Project',
+        related='task_id.project_id', store=True)
+    company_id = fields.Many2one(
+        'res.company',
+        string='Compañía',
+        related='task_id.company_id', readonly=True, store=True)
+    name = fields.Char('Name', required=True)
+    user_id = fields.Many2one('res.users', 'Responsible')
+    planned_date = fields.Datetime('Fecha Inicial',default=datetime.today())
+    done_date = fields.Datetime('Fecha Final')
+    duration= fields.Char(compute='_get_duration', string='Duracion')
+    description = fields.Text('Description')
+    sequence = fields.Integer(
+        'Sequence',
+        help="Gives the sequence order when selecting an activitiy.",
+        default=10)
+    is_done = fields.Boolean('Done?')
+    state= fields.Selection(
+        [('pending', 'Pendiente'), ('done', 'Realizado'), ('cancel', 'Cancelado')],
+        'State', required=True)
+    hex_value=fields.Char(string='Color', compute='_get_state_value')
+
+    _defaults = {
+        'user_id': lambda obj, cr, uid, ctx=None: uid,
+        'state':'pending',
+        'hex_value': '#FA5858',
+    }
+
+    @api.multi
+    @api.onchange('state')
+    def _get_state_value(self):
+        for record in self:
+            if record.state=='pending':
+                record.hex_value='#FA5858'
+
+            if record.state=='done':
+                record.hex_value='#58ACFA'
+
+            if record.state=='cancel':
+                record.hex_value='#A4A4A4'
+
+    @api.multi
+    def unlink(self):
+        res = super(project_task_activity,self).unlink()
+        #  res= self.env.cr.execute("DELETE FROM project_task_activity  WHERE id= %s" % (self.id))
+        return res
+
+    @api.onchange('done_date')
+    def _get_duration(self):
+        res={}
+    	if self.done_date and self.planned_date:
+            d1 = datetime.strptime(self.planned_date, "%Y-%m-%d %H:%M:%S")
+            d2 = datetime.strptime(self.done_date, "%Y-%m-%d %H:%M:%S")
+            if d2<d1:
+                raise ValidationError('La fecha final no puede ser menor que la fecha de inicio')
+            else:
+                x = str(d2-d1)
+                self.duration=x
+                res={'duration':self.duration}
+        return {'value':res}
+
+
+    @api.one
+    def action_done(self):
+        if self.state == 'pending':
+            self.state = 'done'
+            self.done_date = datetime.today()
+            self.hex_value='#58ACFA'
+        else:
+            self.state = 'pending'
+            self.done_date = False
+            self.hex_value='#FA5858'
+
+    @api.one
+    def action_cancel(self):
+        self.state = 'cancel'
+        self.hex_value='#A4A4A4'
+
+
+class project_task(models.Model):
+    _inherit = 'project.task'
+
+    activity_ids = fields.One2many(
+        'project.task.activity', 'task_id', 'Activity', copy=True)
+    activities_progress = fields.Char(
+        string=_("Progress"),
+        compute='_get_activities_progress')
+
+
+    @api.one
+    @api.depends('activity_ids.state')
+    def _get_activities_progress(self):
+        res = []
+        for activity in self.activity_ids:
+            if activity.state == 'done':
+                res.insert(0, {'tooltip': activity.name, 'value': 1})
+            elif activity.state != 'cancel':
+                res.insert(0, {'tooltip': activity.name, 'value': 0})
+        self.activities_progress = json.dumps(res)
+
+
+class project(models.Model):
+    _inherit = 'project.project'
+
+    activity_ids = fields.One2many(
+        'project.task.activity',
+        string='Activity', compute='_get_task_activity')
+    activities_todo = fields.Float(
+        string='Activities to do', compute='_get_activities_todo')
+    activities_done = fields.Float(
+        string='Activities done', compute='_get_activities_done')
+    progress_activities = fields.Float(
+        string=_("Progress"),
+        compute='_get_progress_activities')
+
+    @api.one
+    def _get_task_activity(self):
+        self.activity_ids = self.env['project.task.activity'].search(
+            [('project_id', '=', self.id)])
+
+    @api.one
+    def _get_activities_todo(self):
+        self.activities_todo = len(
+            self.activity_ids.filtered(lambda x: x.state != 'cancel'))
+
+    @api.one
+    def _get_activities_done(self):
+        self.activities_done = len(
+            self.activity_ids.filtered(lambda x: x.state == 'done'))
+
+    @api.one
+    def _get_progress_activities(self):
+        self.progress_activities = 0
+        if self.activity_ids:
+            if self.activities_todo != 0:
+                self.progress_activities = round(
+                    100 * (self.activities_done / self.activities_todo), 1)
+
+    @api.model
+    def create(self, vals):
+
+        vals['type'] = 'template'
+        print vals
+
+        project_id = super(project, self).create(vals)
+        return project_id
+
+
+class project_category(models.Model):
+    _inherit = 'project.category'
+
+    hex_value=fields.Char(string='Color')

BIN
project.pyc


+ 2 - 0
security/ir.model.access.csv

@@ -0,0 +1,2 @@
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_project_task_activity,project.task.activity,model_project_task_activity,,1,1,1,1

BIN
static/description/icon.png


+ 12 - 0
static/src/css/custom.css

@@ -0,0 +1,12 @@
+.hola .oe_kanban_groups_records{
+  background: #FF0000 !important;
+
+}
+
+.oe_kanban_column_cards{
+  margin-left: 6% !important;
+}
+
+.dropdown-menu{
+  position:relative;
+}

+ 689 - 0
static/src/css/kanban.css

@@ -0,0 +1,689 @@
+.openerp .oe_kanban_view {
+  background: white;
+  height: inherit;
+}
+.openerp .oe_kanban_view.oe_background_grey > table.oe_kanban_groups {
+  background-color: #eee;
+}
+.openerp .oe_kanban_view .oe_kanban_column_higlight {
+  background: #eeddf6 !important;
+}
+.openerp .oe_kanban_view .oe_view_nocontent {
+  position: relative;
+  max-width: none;
+  height: 100%;
+}
+.openerp .oe_kanban_view .oe_view_nocontent .oe_view_nocontent_content {
+  margin-left: 90px;
+  margin-top: 5px;
+  max-width: 700px;
+}
+.openerp .oe_kanban_view .oe_view_nocontent .oe_view_nocontent_bg {
+  background: #eee;
+  opacity: 0.7;
+  position: absolute;
+  top: 0;
+  bottom: 0;
+  left: 0;
+  right: 0;
+  z-index: -1;
+}
+.openerp .oe_kanban_view.oe_kanban_grouped .oe_kanban_dummy_cell {
+  background: url(/web/static/src/img/form_sheetbg.png);
+  width: 100%;
+}
+.openerp .oe_kanban_view .oe_kanban_group_length {
+  text-align: center;
+  display: none;
+}
+.openerp .oe_kanban_view .oe_kanban_group_length .oe_tag {
+  position: relative;
+  top: 8px;
+  font-weight: bold;
+}
+.openerp .oe_kanban_view .oe_kanban_header:hover .oe_kanban_group_length {
+  display: none;
+}
+.openerp .oe_kanban_view .ui-sortable-placeholder {
+  border: 1px solid rgba(0, 0, 0, 0.1);
+  visibility: visible !important;
+}
+.openerp .oe_kanban_view .ui-sortable-helper {
+  -moz-box-shadow: 0 1px 10px rgba(0, 0, 0, 0.3);
+  -webkit-box-shadow: 0 1px 10px rgba(0, 0, 0, 0.3);
+  -box-shadow: 0 1px 10px rgba(0, 0, 0, 0.3);
+  -moz-transform: rotate(3deg);
+  -webkit-transform: rotate(3deg);
+  -o-transform: rotate(3deg);
+  -ms-transform: rotate(3deg);
+  -webkit-transition: -webkit-transform 100ms linear;
+  -moz-transition: -moz-transform 100ms linear;
+  transition: transform 100ms linear;
+}
+.openerp .oe_kanban_view .oe_kanban_left {
+  float: left;
+}
+.openerp .oe_kanban_view .oe_kanban_right {
+  float: right;
+}
+.openerp .oe_kanban_view .oe_kanban_clear {
+  clear: both;
+}
+.openerp .oe_kanban_view .oe_kanban_content {
+  word-wrap: break-word;
+}
+.openerp .oe_kanban_view .oe_kanban_content .oe_star_on, .openerp .oe_kanban_view .oe_kanban_content .oe_star_off {
+  color: #ccc;
+  text-shadow: 0 0 2px black;
+  vertical-align: top;
+  position: relative;
+  top: -8px;
+}
+.openerp .oe_kanban_view .oe_kanban_content .oe_star_on:hover, .openerp .oe_kanban_view .oe_kanban_content .oe_star_off:hover {
+  text-decoration: none;
+}
+.openerp .oe_kanban_view .oe_kanban_content .oe_star_on {
+  color: gold;
+}
+.openerp .oe_kanban_view .oe_kanban_content div:first-child {
+  margin-right: 16px;
+}
+.openerp .oe_kanban_view .oe_kanban_button_new {
+  color: white;
+  background: #DC5F59;
+}
+.openerp .oe_kanban_view .oe_kanban_groups {
+  height: inherit;
+}
+.openerp .oe_kanban_view .oe_kanban_groups_records {
+  height: 100%;
+}
+.openerp .oe_kanban_view.oe_kanban_grouped_by_m2o .oe_kanban_group_title {
+  cursor: move;
+}
+.openerp .oe_kanban_view .oe_kanban_header .oe_dropdown_kanban {
+  float: right;
+}
+.openerp .oe_kanban_view .oe_kanban_header .oe_dropdown_kanban > span {
+  visibility: hidden;
+}
+.openerp .oe_kanban_view .oe_kanban_header:hover .oe_dropdown_kanban > span {
+  visibility: visible;
+}
+.openerp .oe_kanban_view .oe_kanban_header .oe_dropdown_menu {
+  font-weight: normal;
+  font-size: 13px;
+}
+.openerp .oe_kanban_view .oe_kanban_group_title {
+  position: relative;
+  font-size: 16px;
+  font-weight: bold;
+  color: #333333;
+  text-shadow: 0 1px 0 white;
+  margin-right: 30px;
+  width: 200px;
+}
+.openerp .oe_kanban_view .oe_kanban_group_title .oe_kanban_group_title_text {
+  margin-right: 4px;
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+}
+.openerp .oe_kanban_view .oe_fold_column .oe_kanban_group_length {
+  position: absolute;
+  top: -1px;
+  right: -14px;
+  float: right;
+  display: block;
+}
+.openerp .oe_kanban_view.oe_kanban_grouped .oe_kanban_column, .openerp .oe_kanban_view.oe_kanban_grouped .oe_kanban_group_header {
+  width: 185px;
+  min-width: 185px;
+}
+.openerp .oe_kanban_view.oe_kanban_grouped .oe_kanban_column.oe_kanban_group_folded, .openerp .oe_kanban_view.oe_kanban_grouped .oe_kanban_group_header.oe_kanban_group_folded {
+  width: auto;
+  min-width: 30px;
+}
+.openerp .oe_kanban_view .oe_kanban_column, .openerp .oe_kanban_view .oe_kanban_group_header {
+  vertical-align: top;
+  padding: 5px 5px 5px 4px;
+}
+.openerp .oe_kanban_view .oe_kanban_column ul, .openerp .oe_kanban_view .oe_kanban_column li, .openerp .oe_kanban_view .oe_kanban_group_header ul, .openerp .oe_kanban_view .oe_kanban_group_header li {
+  margin: 0;
+  padding: 0;
+  list-style-type: none;
+}
+.openerp .oe_kanban_view .oe_kanban_group_header.oe_kanban_no_group {
+  padding: 0px;
+}
+.openerp .oe_kanban_view.oe_kanban_grouped .oe_kanban_column, .openerp .oe_kanban_view .oe_kanban_group_header {
+  background: #f0eeee;
+  border-left: 1px solid #f0f8f8;
+  border-right: 1px solid #b9b9b9;
+}
+.openerp .oe_kanban_view .oe_form .oe_kanban_column {
+  padding: 0px;
+  background: #ffffff;
+}
+.openerp .oe_kanban_view.oe_kanban_grouped .oe_kanban_column, .openerp .oe_kanban_view.oe_kanban_grouped .oe_kanban_column_cards {
+  height: 100%;
+}
+.openerp .oe_kanban_view .oe_kanban_aggregates {
+  padding: 0;
+  margin: 0px;
+}
+.openerp .oe_kanban_view .oe_kanban_group_folded .oe_kanban_group_title, .openerp .oe_kanban_view .oe_kanban_group_folded.oe_kanban_column *, .openerp .oe_kanban_view .oe_kanban_group_folded .oe_kanban_aggregates, .openerp .oe_kanban_view .oe_kanban_group_folded .oe_kanban_add {
+  display: none;
+}
+.openerp .oe_kanban_view .oe_kanban_group_folded .oe_kanban_group_title_vertical, .openerp .oe_kanban_view .oe_kanban_group_folded .oe_kanban_group_length {
+  display: block;
+}
+.openerp .oe_kanban_view .oe_kanban_group_folded .oe_dropdown_kanban {
+  left: -5px;
+}
+.openerp .oe_kanban_view .oe_kanban_group_folded .oe_kanban_folded_column_cards {
+  visibility: visible;
+  display: block !important;
+  height: 100%;
+}
+.openerp .oe_kanban_view .oe_kanban_group_title_undefined {
+  color: #666666;
+}
+.openerp .oe_kanban_view .oe_kanban_group_title_vertical {
+  -webkit-transform: rotate(90deg);
+  -moz-transform: rotate(90deg);
+  -o-transform: rotate(90deg);
+  -ms-transform: rotate(90deg);
+  transform: rotate(90deg);
+  width: 30px;
+  font-size: 24px;
+  white-space: nowrap;
+  display: none;
+  position: relative;
+  opacity: 0.75;
+  top: 26px;
+}
+.openerp .oe_kanban_view .oe_kanban_add, .openerp .oe_kanban_view .oe_kanban_header .oe_dropdown_toggle {
+  margin-left: 4px;
+  cursor: pointer;
+  position: relative;
+  z-index: 1;
+}
+.openerp .oe_kanban_view .oe_kanban_add {
+  top: -8px;
+}
+.openerp .oe_kanban_view .oe_kanban_header .oe_dropdown_toggle {
+  top: -2px;
+  height: 14px;
+}
+.openerp .oe_kanban_view .oe_kanban_card, .openerp .oe_kanban_view .oe_dropdown_toggle {
+  cursor: pointer;
+  display: inline-block;
+}
+.openerp .oe_kanban_view .oe_kanban_add {
+  float: right;
+}
+.openerp .oe_kanban_view .oe_kanban_quick_create_buttons {
+  margin: 4px 0;
+}
+.openerp .oe_kanban_view .oe_kanban_no_group .oe_kanban_quick_create {
+  width: 185px;
+  padding: 10px;
+}
+.openerp .oe_kanban_view .oe_kanban_quick_create {
+  z-index: 2;
+}
+.openerp .oe_kanban_view .oe_kanban_quick_create input {
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+  outline: none;
+  border: 1px solid transparent;
+  display: block;
+  margin-bottom: 8px;
+  font-size: 13px;
+  width: 100%;
+  -moz-box-shadow: none;
+  -webkit-box-shadow: none;
+  -box-shadow: none;
+}
+.openerp .oe_kanban_view .oe_kanban_quick_create input:focus {
+  border: 1px solid #A6A6FE;
+  -moz-box-shadow: 0px 0px 7px rgba(0, 133, 255, 0.3) inset;
+  -webkit-box-shadow: 0px 0px 7px rgba(0, 133, 255, 0.3) inset;
+  -box-shadow: 0px 0px 7px rgba(0, 133, 255, 0.3) inset;
+}
+.openerp .oe_kanban_view .oe_kanban_vignette {
+  padding: 8px;
+  min-height: 100px;
+}
+.openerp .oe_kanban_view .oe_kanban_image {
+  display: inline-block;
+  vertical-align: top;
+  width: 64px;
+  height: 64px;
+  text-align: center;
+  overflow: hidden;
+  -moz-border-radius: 3px;
+  -webkit-border-radius: 3px;
+  border-radius: 3px;
+  -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.4);
+  -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.4);
+  -box-shadow: 0 1px 4px rgba(0, 0, 0, 0.4);
+}
+.openerp .oe_kanban_view .oe_kanban_details {
+  display: inline-block;
+  vertical-align: top;
+  width: 240px;
+  font-size: 13px;
+  padding: 0 5px;
+  color: #4c4c4c;
+}
+.openerp .oe_kanban_view .oe_kanban_details h4 {
+  margin: 0 0 4px 0;
+}
+.openerp .oe_kanban_view .oe_kanban_details .oe_tag {
+  display: inline-block;
+  margin: 0 2px 2px 0;
+}
+.openerp .oe_kanban_view .oe_kanban_record {
+  position: relative;
+  display: block;
+  min-height: 20px;
+  margin: 0;
+  -moz-border-radius: 4px;
+  -webkit-border-radius: 4px;
+  border-radius: 4px;
+}
+.openerp .oe_kanban_view .oe_kanban_record:last-child {
+  margin-bottom: 0;
+}
+.openerp .oe_kanban_view .oe_kanban_record .oe_kanban_title {
+  font-weight: bold;
+  margin: 2px 4px;
+}
+.openerp .oe_kanban_view .oe_kanban_record .oe_kanban_alias {
+  margin: 0px 0 8px 0;
+}
+.openerp .oe_kanban_view.oe_kanban_grouped .oe_kanban_record {
+  margin-bottom: 4px;
+}
+.openerp .oe_kanban_view .oe_kanban_avatar_smallbox {
+  height: 40px;
+  width: 40px;
+  border: 1px solid;
+  border-color: #e5e5e5 #dbdbdb #d2d2d2;
+  -moz-border-radius: 3px;
+  -webkit-border-radius: 3px;
+  border-radius: 3px;
+  -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);
+  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);
+  -box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);
+}
+.openerp .oe_kanban_view .oe_kanban_box {
+  background: #FFF;
+  border: 2px solid #CCC;
+  border-radius: 4px;
+  -moz-border-radius: 4px;
+  -webkit-border-radius: 4px;
+  margin-bottom: 5px;
+}
+.openerp .oe_kanban_view .oe_kanban_box_header {
+  border-bottom: 1px solid #CCC;
+}
+.openerp .oe_kanban_view .oe_kanban_title {
+  font-size: 95%;
+  font-weight: bold;
+  padding: 0 4px 0 4px;
+}
+.openerp .oe_kanban_view .oe_kanban_small {
+  font-size: 80%;
+  font-weight: normal;
+}
+.openerp .oe_kanban_view .oe_kanban_show_more {
+  clear: both;
+  text-align: center;
+}
+.openerp .oe_kanban_view.oe_kanban_grouped .oe_kanban_show_more .oe_button {
+  width: 100%;
+}
+.openerp .oe_kanban_view.oe_kanban_ungrouped .oe_kanban_column .oe_kanban_record {
+  display: inline-block;
+  padding: 2px;
+  vertical-align: top;
+  box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  -webkit-box-sizing: border-box;
+}
+.openerp .oe_kanban_view .oe_kanban_action_button {
+  height: 22px;
+  margin: 0;
+}
+.openerp .oe_kanban_view .oe_kanban_action_a {
+  text-decoration: none;
+}
+.openerp .oe_kanban_view .oe_kanban_action_a:hover {
+  text-decoration: none;
+}
+.openerp .oe_kanban_view .oe_kanban_table {
+  width: 100%;
+  border: none;
+  border-collapse: collapse;
+  margin: 0;
+  padding: 0;
+}
+.openerp .oe_kanban_view .oe_kanban_table tr td {
+  padding: 0;
+}
+.openerp .oe_kanban_view .oe_kanban_table tr td.oe_kanban_title {
+  padding: 2px;
+}
+.openerp .oe_kanban_view .oe_kanban_box_content {
+  padding: 4px;
+  font-size: 90%;
+}
+.openerp .oe_kanban_view .oe_kanban_button {
+  border: 1px solid #8ec1da;
+  background-color: #ddeef6;
+  border-radius: 3px;
+  -moz-border-radius: 3px;
+  -webkit-border-radius: 3px;
+  color: #000000;
+  text-shadow: 0 1px #fff;
+  padding: 0 4px;
+  font-size: 85%;
+  margin: 1px;
+}
+.openerp .oe_kanban_view a.oe_kanban_button:hover, .openerp .oe_kanban_view .openerp button.oe_kanban_button:hover {
+  background-color: #eeddf6;
+}
+.openerp .oe_kanban_view .oe_kanban_buttons_set {
+  border-top: 1px dotted;
+  white-space: nowrap;
+  padding-top: 2px;
+  position: relative;
+  clear: both;
+}
+.openerp .oe_kanban_view .oe_kanban_buttons_set a {
+  padding: 2px;
+}
+.openerp .oe_kanban_view .oe_kanban_box_show_onclick {
+  display: none;
+}
+.openerp .oe_kanban_view .oe_kanban_draghandle {
+  cursor: move;
+}
+.openerp .oe_kanban_view .oe_kanban_color_border {
+  border-color: #CCCCCC;
+}
+.openerp .oe_kanban_view .oe_kanban_color_border {
+  border-color: #CCCCCC;
+}
+.openerp .oe_kanban_view .oe_kanban_tooltip ul, .openerp .oe_kanban_view ul.oe_kanban_tooltip {
+  padding: 0 0 4px 0;
+  margin: 5px 0 0 15px;
+  list-style: circle;
+}
+.openerp .oe_kanban_view .oe_kanban_highlight {
+  border-radius: 2px;
+  -moz-border-radius: 2px;
+  -webkit-border-radius: 2px;
+  padding: 1px 5px;
+  margin: 1px 4px;
+  white-space: nowrap;
+  display: inline-block;
+  line-height: 1em;
+}
+.openerp .oe_kanban_view .oe_kanban_card, .openerp .oe_kanban_view .oe_kanban_quick_create {
+  margin-bottom: 4px;
+  position: relative;
+  display: block;
+  background: white;
+  border: 1px solid rgba(0, 0, 0, 0.16);
+  border-bottom-color: rgba(0, 0, 0, 0.3);
+  padding: 5px;
+  display: block;
+  -webkit-transition: -webkit-transform, -webkit-box-shadow, border 200ms linear;
+  -moz-border-radius: 4px;
+  -webkit-border-radius: 4px;
+  border-radius: 4px;
+}
+.openerp .oe_kanban_view .oe_kanban_card:not(.ui-sortable-helper):hover, .openerp .oe_kanban_view .oe_kanban_quick_create:not(.ui-sortable-helper):hover {
+  border: 1px solid #7C7BAD;
+  -moz-box-shadow: 0 0 4px #7C7BAD;
+  -webkit-box-shadow: 0 0 4px #7C7BAD;
+  -box-shadow: 0 0 4px #7C7BAD;
+}
+.openerp .oe_kanban_view .oe_kanban_card:not(.ui-sortable-helper):hover .oe_dropdown_kanban > span, .openerp .oe_kanban_view .oe_kanban_quick_create:not(.ui-sortable-helper):hover .oe_dropdown_kanban > span {
+  visibility: visible;
+}
+.openerp .oe_kanban_view .oe_kanban_card h3, .openerp .oe_kanban_view .oe_kanban_quick_create h3 {
+  margin: 0 16px 0 0;
+  color: #4c4c4c;
+  text-decoration: none;
+}
+.openerp .oe_kanban_view .oe_kanban_card h3:hover, .openerp .oe_kanban_view .oe_kanban_quick_create h3:hover {
+  text-decoration: none;
+}
+.openerp .oe_kanban_view .oe_kanban_card .oe_dropdown_kanban .oe_kanban_project_times li, .openerp .oe_kanban_view .oe_kanban_quick_create .oe_dropdown_kanban .oe_kanban_project_times li {
+  float: left;
+}
+.openerp .oe_kanban_view .oe_kanban_star {
+  float: left;
+  position: inline-block;
+  margin: 0 4px 0 0;
+}
+.openerp .oe_kanban_view .oe_kanban_avatar {
+  -moz-border-radius: 3px;
+  -webkit-border-radius: 3px;
+  border-radius: 3px;
+  -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);
+  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);
+  -box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);
+}
+.openerp .oe_kanban_view .oe_kanban_footer_left {
+  margin-top: 2px;
+}
+.openerp .oe_kanban_view .oe_kanban_footer_left > span {
+  margin-top: 2px;
+  display: inline-block;
+  background: #E6E6E6;
+  border: 1px solid #B9B9B9;
+  color: #666;
+  padding: 0 2px;
+  line-height: 16px;
+  -moz-border-radius: 3px;
+  -webkit-border-radius: 3px;
+  border-radius: 3px;
+}
+.openerp .oe_kanban_view .oe_kanban_footer_left > span .oe_e {
+  line-height: 12px;
+  font-size: 22px;
+}
+.openerp .oe_kanban_view .oe_kanban_footer_left .oe_tags {
+  margin-right: 0;
+}
+.openerp .oe_kanban_view .oe_kanban_footer_left .oe_tags .oe_tag {
+  display: inline-block;
+  padding: 0 2px;
+  line-height: 14px;
+}
+.openerp .oe_kanban_view .oe_kanban_footer_left .oe_kanban_mail_new {
+  line-height: 18px;
+  background-color: #8a89ba;
+  color: white;
+  font-weight: bold;
+  position: relative;
+  top: -1px;
+}
+.openerp .oe_kanban_view .oe_kanban_bottom_right {
+  float: right;
+  position: relative;
+  top: 2px;
+}
+.openerp .oe_kanban_view .oe_kanban_text_red {
+  color: #A61300;
+  font-weight: bold;
+  -moz-border-radius: 4px;
+  -webkit-border-radius: 4px;
+  border-radius: 4px;
+}
+.openerp .oe_kanban_view .oe_kanban_ellipsis {
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+.openerp .oe_kanban_view .oe_dropdown_kanban {
+  float: right;
+  cursor: pointer;
+  margin-top: -6px;
+}
+.openerp .oe_kanban_view .oe_dropdown_kanban:hover {
+  text-decoration: none;
+}
+.openerp .oe_kanban_view .oe_dropdown_kanban .oe_dropdown_menu {
+  left: 0;
+  top: 28px;
+  min-width: 160px;
+  padding: 2px;
+}
+.openerp .oe_kanban_view .oe_dropdown_kanban .oe_dropdown_menu > li {
+  padding: 3px;
+}
+.openerp .oe_kanban_view .oe_dropdown_kanban.oe_opened > span {
+  visibility: visible;
+}
+.openerp .oe_kanban_view .oe_dropdown_kanban > span {
+  visibility: hidden;
+}
+.openerp .oe_kanban_view .oe_kanban_colorpicker {
+  white-space: nowrap;
+}
+.openerp .oe_kanban_view .oe_kanban_colorpicker li {
+  float: left;
+  margin: 0;
+  padding: 0;
+}
+.openerp .oe_kanban_view .oe_kanban_colorpicker li a {
+  display: inline-block;
+  width: 16px;
+  height: 16px;
+  border: 1px solid white;
+}
+.openerp .oe_kanban_view .oe_kanban_colorpicker li a:hover {
+  border: 1px solid gray !important;
+}
+.openerp .oe_kanban_view .oe_kanban_colorpicker li:first-child a {
+  border: 1px solid #ccc;
+}
+.openerp .oe_kanban_view .oe_kanban_color_0 {
+  background-color: #FFFFFF;
+  color: #5a5a5a;
+}
+.openerp .oe_kanban_view .oe_kanban_color_1 {
+  background-color: #CCCCCC;
+  color: #424242;
+}
+.openerp .oe_kanban_view .oe_kanban_color_2 {
+  background-color: #FFC7C7;
+  color: #7a3737;
+}
+.openerp .oe_kanban_view .oe_kanban_color_3 {
+  background-color: #FFF1C7;
+  color: #756832;
+}
+.openerp .oe_kanban_view .oe_kanban_color_4 {
+  background-color: #E3FFC7;
+  color: #5d6937;
+}
+.openerp .oe_kanban_view .oe_kanban_color_5 {
+  background-color: #C7FFD5;
+  color: #1a7759;
+}
+.openerp .oe_kanban_view .oe_kanban_color_6 {
+  background-color: #C7FFFF;
+  color: #1a5d83;
+}
+.openerp .oe_kanban_view .oe_kanban_color_7 {
+  background-color: #C7D5FF;
+  color: #3b3e75;
+}
+.openerp .oe_kanban_view .oe_kanban_color_8 {
+  background-color: #E3C7FF;
+  color: #4c3668;
+}
+.openerp .oe_kanban_view .oe_kanban_color_9 {
+  background-color: #FFC7F1;
+  color: #6d2c70;
+}
+
+.openerp .oe_form .oe_kanban_view .oe_kanban_column, .openerp .oe_form .oe_kanban_view .oe_kanban_group_header {
+  padding: 0px;
+  background: #ffffff;
+}
+
+.openerp .oe_popup_form .oe_kanban_buttons .oe_highlight {
+  color: #404040;
+  background: none;
+}
+.openerp .oe_popup_form .oe_kanban_buttons button.oe_highlight {
+  background-color: #efefef;
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#efefef), to(#d8d8d8));
+  background-image: -webkit-linear-gradient(top, #efefef, #d8d8d8);
+  background-image: -moz-linear-gradient(top, #efefef, #d8d8d8);
+  background-image: -ms-linear-gradient(top, #efefef, #d8d8d8);
+  background-image: -o-linear-gradient(top, #efefef, #d8d8d8);
+  background-image: linear-gradient(to bottom, #efefef, #d8d8d8);
+  -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 1px rgba(255, 255, 255, 0.8) inset;
+  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 1px rgba(255, 255, 255, 0.8) inset;
+  -box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 1px rgba(255, 255, 255, 0.8) inset;
+}
+.openerp .oe_popup_form .oe_kanban_buttons button.oe_highlight:active {
+  background-color: #e3e3e3;
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#e3e3e3), to(#f6f6f6));
+  background-image: -webkit-linear-gradient(top, #e3e3e3, #f6f6f6);
+  background-image: -moz-linear-gradient(top, #e3e3e3, #f6f6f6);
+  background-image: -ms-linear-gradient(top, #e3e3e3, #f6f6f6);
+  background-image: -o-linear-gradient(top, #e3e3e3, #f6f6f6);
+  background-image: linear-gradient(to bottom, #e3e3e3, #f6f6f6);
+  -moz-box-shadow: none;
+  -webkit-box-shadow: none;
+  -box-shadow: none;
+}
+.openerp .oe_popup_form .oe_kanban_buttons button.oe_highlight:hover {
+  background-color: #f6f6f6;
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#f6f6f6), to(#e3e3e3));
+  background-image: -webkit-linear-gradient(top, #f6f6f6, #e3e3e3);
+  background-image: -moz-linear-gradient(top, #f6f6f6, #e3e3e3);
+  background-image: -ms-linear-gradient(top, #f6f6f6, #e3e3e3);
+  background-image: -o-linear-gradient(top, #f6f6f6, #e3e3e3);
+  background-image: linear-gradient(to bottom, #f6f6f6, #e3e3e3);
+  -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 1px rgba(255, 255, 255, 0.8) inset;
+  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 1px rgba(255, 255, 255, 0.8) inset;
+  -box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 1px rgba(255, 255, 255, 0.8) inset;
+}
+
+.openerp_ie .oe_kanban_view .oe_kanban_group_header .oe_kanban_group_title_vertical {
+  display: none !important;
+}
+.openerp_ie .oe_kanban_view .oe_kanban_group_header.oe_kanban_group_folded .oe_kanban_group_title_vertical {
+  display: inline-block !important;
+}
+.openerp_ie .oe_kanban_view .oe_kanban_group_title_vertical {
+  background: #f0eeee;
+}
+.openerp_ie .oe_kanban_view.oe_kanban_grouped .oe_kanban_group_header {
+  height: 1%;
+}
+
+@media print {
+  .openerp .oe_kanban_groups button {
+    visibility: hidden;
+  }
+  .openerp .oe_kanban_groups a[data-type=object], .openerp .oe_kanban_groups a[data-type=delete] {
+    visibility: hidden;
+  }
+  .openerp .oe_kanban_view .oe_kanban_group_title {
+    text-shadow: none !important;
+  }
+}

BIN
static/src/image/fondo5.jpg


BIN
static/src/image/fondo7.jpeg


+ 141 - 0
static/src/js/project_kanban.js

@@ -0,0 +1,141 @@
+openerp.custom_project = function(instance) {
+  var QWeb = instance.web.qweb;
+
+  instance.web_calendar.CalendarView = instance.web_calendar.CalendarView.extend({
+    remove_event: function(id) {
+      var self = this;
+
+      function do_it() {
+        return $.when(self.dataset.unlink([Number(id)])).then(function() {
+          self.$calendar.fullCalendar('removeEvents', id);
+        });
+      }
+
+      if (this.options.confirm_on_delete) {
+        if (confirm(_t("Está seguro que desea eliminar esta actividad?"))) {
+          return do_it();
+        }
+      } else
+        return do_it();
+    },
+    event_data_transform: function(event) {
+      var res = this._super.apply(this, arguments);
+      //This would go off when there is no color set for hex_value. You could control this too.
+      if (res && res.hasOwnProperty('className')) {
+        //If you would uncomment the next line it would use the default colour that is set for the user. (default behaviour from Odoo calendars)
+        // res.className = res.className.substring(0, res.className.indexOf(' calendar_color_'));
+        // res.backgroundColor = '#DBDBDB';
+        if (res.title.indexOf('false') > -1) {
+          res.title = res.title.substring(0, res.title.indexOf(','));
+        }
+      }
+      if (event.hex_value && res.title) {
+        res.backgroundColor = event.hex_value;
+        res.title = res.title.substring(0, res.title.indexOf(', ' + event.hex_value));
+      }
+      return res;
+    }
+  });
+
+  instance.web_kanban.KanbanRecord = instance.web_kanban.KanbanRecord.extend({
+    on_card_clicked: function() {
+      if (this.view.dataset.model === 'project.task') {
+        var self = this;
+        var id = self.values.id.value;
+
+        this.do_action({
+          name: 'Tareas',
+          type: 'ir.actions.act_window',
+          res_model: 'project.task',
+          view_mode: 'form',
+          view_type: 'form',
+          target: 'new',
+          views: [
+            [1576, 'form']
+          ],
+          res_id: id,
+          flags: {
+            'form': {
+              'action_buttons': 'True'
+            }
+          }
+        });
+      } else {
+        this._super.apply(this, arguments);
+      }
+    },
+  });
+  instance.web_kanban.KanbanGroup.include({
+    hide_menu: function() {
+      this.$el.find(".oe_dropdown_toggle ul.oe_dropdown_menu li").find('a:contains("Editar")').parent().hide();
+      this.$el.find(".oe_dropdown_toggle ul.oe_dropdown_menu li").find('a:contains("Suprimir")').parent().hide();
+    },
+
+    start: function() {
+      var self = this;
+
+      self._super.apply(self, arguments);
+      if (self.dataset.model == 'project.task') {
+        this.hide_menu();
+      }
+    }
+  });
+  instance.web_kanban.KanbanView.include({
+
+    // set_background: function() {
+    //   this.$el.find('.oe_kanban_groups_records').css('background', 'url("/custom_project/static/src/image/fondo7.jpeg")');
+    //   this.$el.find('.oe_kanban_groups_records').css('background-repeat', 'round');
+    // },
+    //
+    // start: function() {
+    //   var self = this;
+    //
+    //   self._super.apply(self, arguments);
+    //   if (self.dataset.model == 'project.project') {
+    //     this.set_background();
+    //   }
+    // },
+
+    postprocess_m2m_tags: function() {
+      var self = this;
+      if (!this.many2manys.length) {
+        return;
+      }
+      var relations = {};
+      this.groups.forEach(function(group) {
+        group.records.forEach(function(record) {
+          self.many2manys.forEach(function(name) {
+            var field = record.record[name];
+            var $el = record.$('.oe_form_field.oe_tags[name=' + name + ']').empty();
+            if (!relations[field.relation]) {
+              relations[field.relation] = {
+                ids: [],
+                elements: {},
+                context: self.m2m_context[name]
+              };
+            }
+            var rel = relations[field.relation];
+            field.raw_value.forEach(function(id) {
+              rel.ids.push(id);
+              if (!rel.elements[id]) {
+                rel.elements[id] = [];
+              }
+              rel.elements[id].push($el[0]);
+            });
+          });
+        });
+      });
+      _.each(relations, function(rel, rel_name) {
+        var dataset = new instance.web.DataSetSearch(self, rel_name, self.dataset.get_context(rel.context));
+        var defer = $.Deferred();
+        var f = new openerp.Model('project.category');
+        var fields = ['id', 'name', 'hex_value'];
+        f.query(fields).filter().all().then(function(results) {
+          _.each(results, function(item) {
+            $(rel.elements[item.id]).append('<span class="oe_tag" style="background:' + item.hex_value + '">' + _.str.escapeHTML(item.name) + '</span>');
+          });
+        });
+      });
+    }
+  });
+}

+ 57 - 0
static/src/xml/project_kanban.xml

@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<template xml:space="preserve">
+<t t-name="NewKanban">
+    <td class="oe_kanban_group_header">
+        <t t-if="widget.view.group_by">
+            <t t-set="parent" t-value="(widget.getParent())"/>
+            <div class="oe_kanban_header oe_semantic_html_override">
+                <t t-if="widget.view._is_quick_create_enabled()">
+                    <div class="oe_kanban_add oe_e" title="Quick create">]</div>
+                </t>
+                <div class="oe_dropdown_toggle oe_dropdown_kanban">
+                    <div class="oe_kanban_group_length">
+                        <span class="oe_tag">
+                            <t t-if="widget.group.get('length') &gt; 99"> 99+ </t><t t-if="widget.group.get('length') &lt;= 99"> <t t-esc="widget.group.get('length')"/> </t>
+                        </span>
+                    </div>
+                    <span class="oe_e">í</span>
+                    <ul class="oe_dropdown_menu oe_kanban_group_dropdown2">
+                        <li><a data-action="toggle_fold" href="#">Fold</a></li>
+                        <t t-if="widget.view.grouped_by_m2o and widget.value">
+                            <li t-if="parent &amp;&amp; parent.is_action_enabled('group_edit')"><a data-action="edit" href="#">Edit</a></li>
+                            <li t-if="parent &amp;&amp; parent.is_action_enabled('group_delete')"><a data-action="delete" href="#">Delete</a></li>
+                            <li t-if="parent &amp;&amp; parent.is_action_enabled('group_delete')"><a data-action="delete" href="#">Hola</a></li>
+                        </t>
+                    </ul>
+                </div>
+                <div class="oe_fold_column">
+                    <div t-attf-class="oe_kanban_group_title #{widget.undefined_title ? 'oe_kanban_group_title_undefined' : ''}">
+                        <div class="oe_kanban_group_length oe_tag">
+                            <t t-if="widget.group.get('length') &gt; 99"> 99+ </t><t t-if="widget.group.get('length') &lt;= 99"> <t t-esc="widget.group.get('length')"/> </t>
+                        </div>
+                        <div class="oe_kanban_group_title_text" t-att-title="widget.title"><t t-esc="widget.title"/></div>
+                    </div>
+                    <ul t-if="widget.group.get('length') &gt; 0" class="oe_kanban_aggregates">
+                        <li t-foreach="widget.aggregates" t-as="aggregate">
+                            <span><t t-esc="aggregate"/>:</span> <t t-esc="aggregate_value"/>
+                        </li>
+                    </ul>
+                </div>
+                <span t-if="widget.title" class="oe_kanban_group_title_vertical">
+                    <t t-esc="widget.title"/>
+                </span>
+            </div>
+        </t>
+        <t t-if="! widget.view.group_by &amp;&amp; widget.view._is_quick_create_enabled()">
+            <span class="oe_kanban_no_group_qc_placeholder"/>
+        </t>
+    </td>
+</t>
+
+    <script>
+      $(document).ready(function(){
+      jQuery(".oe_dropdown_toggle ul.oe_dropdown_menu li").find('a:contains("Editar")').parent().hide();
+      }
+    </script>
+
+</template>

+ 13 - 0
template.xml

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<openerp>
+    <data>
+        <template id="assets_backend" name="project assets" inherit_id="web.assets_backend">
+              <xpath expr="." position="inside">
+                  <link rel="stylesheet" href="/custom_project/static/src/css/custom.css"/>
+
+                  <script type="text/javascript" src="/custom_project/static/src/js/project_kanban.js"></script>
+              </xpath>
+        </template>
+
+    </data>
+</openerp>

+ 15 - 0
views/account.xml

@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<openerp>
+    <data>
+        <record id="new_contract_view" model="ir.ui.view">
+            <field name="name">account.analytic.account</field>
+            <field name="model">account.analytic.account</field>
+            <field name="inherit_id" ref="analytic.view_account_analytic_account_form"/>
+            <field name="arch" type="xml">
+                  <xpath expr="//field[@name='template_id']" position="attributes" >
+                    <attribute name="invisible">True</attribute>
+                  </xpath>
+            </field>
+          </record>
+      </data>
+</openerp>

+ 118 - 0
views/activity.xml

@@ -0,0 +1,118 @@
+<?xml version="1.0" encoding="utf-8"?>
+<openerp>
+  <data>
+    <record id="view_project_task_activity_search" model="ir.ui.view">
+      <field name="name">project.task_activity.search</field>
+      <field name="model">project.task.activity</field>
+      <field name="arch" type="xml">
+        <search string="Activity">
+          <field name="name"/>
+          <field name="user_id"/>
+          <field name="task_id"/>
+          <field name="project_id"/>
+          <field name="company_id"/>
+          <field name="state"/>
+          <filter string="Realizado" domain="[('state', '=', 'done')]"/>
+          <filter string="Pendiente" domain="[('state', '=', 'pending')]"/>
+          <filter string="Cancelado" domain="[('state', '=', 'cancel')]"/>
+        <br/>
+          <filter string="Creado hoy" domain="[('planned_date', '&gt;=', datetime.datetime.now().strftime('%Y-%m-%d 00:00:00')),('planned_date', '&lt;=',datetime.datetime.now().strftime('%Y-%m-%d 23:23:59'))]"/>
+          <filter string="Finalizado hoy" domain="[('done_date', '&gt;=', datetime.datetime.now().strftime('%Y-%m-%d 00:00:00')),('done_date', '&lt;=',datetime.datetime.now().strftime('%Y-%m-%d 23:23:59'))]"/>
+          <group expand="0" string="Group By..">
+            <filter string="Project" help="Proyecto" context="{'group_by':'project_id'}"/>
+            <filter string="Estado" help="Estado" context="{'group_by':'state'}"/>
+            <filter string="Responsable" help="Responsable" context="{'group_by':'user_id'}"/>
+          </group>
+        </search>
+      </field>
+    </record>
+
+    <record id="view_project_task_activity_form" model="ir.ui.view">
+      <field name="name">project.task_activity.form</field>
+      <field name="model">project.task.activity</field>
+      <field name="arch" type="xml">
+        <form>
+          <group>
+            <field name="name"/>
+            <field name="user_id" required="True"/>
+            <field name="planned_date"/>
+            <field name="done_date"/>
+            <field name="duration"/>
+          </group>
+          <group>
+            <field name="task_id"/>
+            <field name="project_id"/>
+            <field name="company_id"/>
+            <field name="state"/>
+            <field name="description"/>
+          </group>
+        </form>
+      </field>
+    </record>
+
+    <record id="view_project_task_activity_calendar" model="ir.ui.view">
+      <field name="name">Calendario de Actividades</field>
+      <field name="model">project.task.activity</field>
+      <field eval="2" name="priority"/>
+      <field name="arch" type="xml">
+        <calendar color="user_id" date_start="planned_date" date_stop="done_date" string="Actividades" event_open_popup="%(view_project_task_activity_form)s">
+          <field name="name"/>
+          <field name="hex_value"/>
+        </calendar>
+      </field>
+    </record>
+
+    <record id="view_project_task_activity_tree" model="ir.ui.view">
+      <field name="name">project.task_activity.tree</field>
+      <field name="model">project.task.activity</field>
+      <field name="arch" type="xml">
+        <tree colors="gray:state == 'cancel';blue:state == 'pending'">
+          <field name="name"/>
+          <field name="user_id"/>
+          <field name="planned_date"/>
+          <field name="done_date"/>
+          <field name="state"/>
+          <field name="description"/>
+        </tree>
+      </field>
+    </record>
+    <record id="activity_calendar" model="ir.actions.act_window">
+      <field name="name">Actividades</field>
+      <field name="res_model">project.task.activity</field>
+      <field name="view_mode">calendar,form,tree</field>
+      <field name="view_id" ref="view_project_task_activity_calendar"/>
+      <field name="help" type="html">
+        <p class="oe_view_nocontent_create">
+          Click to schedule a new meeting.
+        </p>
+        <p>
+          The calendario is shared between employees and fully integrated with other applications such as the employee holidays or the business opportunities.
+        </p>
+      </field>
+    </record>
+
+    <record model="ir.actions.act_window.view" id="action_calendar_activity">
+      <field name="act_window_id" ref="activity_calendar"/>
+      <field name="sequence" eval="1"/>
+      <field name="view_mode">calendar</field>
+      <field name="view_id" ref="view_project_task_activity_calendar"/>
+    </record>
+
+    <record model="ir.actions.act_window.view" id="action_calendar_form">
+      <field name="act_window_id" ref="activity_calendar"/>
+      <field name="sequence" eval="3"/>
+      <field name="view_mode">form</field>
+      <field name="view_id" ref="view_project_task_activity_form"/>
+    </record>
+
+    <record model="ir.actions.act_window.view" id="action_calendar_tree">
+      <field name="act_window_id" ref="activity_calendar"/>
+      <field name="sequence" eval="3"/>
+      <field name="view_mode">tree</field>
+      <field name="view_id" ref="view_project_task_activity_tree"/>
+    </record>
+
+    <menuitem name="Calendario de Actividades" id="mail_menu_calendario" parent="mail.mail_my_stuff" sequence="10" action="activity_calendar"/>
+
+  </data>
+</openerp>

+ 15 - 0
views/category.xml

@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<openerp>
+    <data>
+        <record id="project_category_form2" model="ir.ui.view">
+            <field name="name">project.category</field>
+            <field name="model">project.category</field>
+            <field name="inherit_id" ref="project.project_category_form_view"/>
+            <field name="arch" type="xml">
+              <field name="name" position="after">
+              <field name="hex_value" widget="color"/>
+            </field>
+            </field>
+        </record>
+      </data>
+    </openerp>

+ 33 - 0
views/menu.xml

@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+
+<openerp>
+    <data>
+
+        <record id="action_activity" model="ir.actions.act_window">
+            <field name="name">Actividades</field>
+            <field name="res_model">project.task.activity</field>
+            <field name="view_type">form</field>
+            <field name="view_mode">tree,calendar,form</field>
+            <field name="view_id" ref=""/>
+            <field name="search_view_id" ref=""/>
+            <field name="domain">[]</field>
+        </record>
+
+        <menuitem
+            name="Actividades"
+            id="menu_activities"
+            sequence="10"
+            action="action_activity"
+            parent="project.menu_project_management"
+
+            />
+
+            <record model="ir.actions.act_window" id="project.view_task_search_form">
+                <field name="name">Actividades</field>
+            <field name="view_mode">kanban,tree,form</field>
+                <field name="res_model">project.task</field>
+          </record>
+
+    </data>
+</openerp>

+ 117 - 0
views/project.xml

@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="utf-8"?>
+<openerp>
+    <data>
+        <record id="new_project_view" model="ir.ui.view">
+            <field name="name">project.project</field>
+            <field name="model">project.project</field>
+            <field name="inherit_id" ref="project.edit_project"/>
+            <field name="arch" type="xml">
+                <xpath expr="//form[@string='Project']" position="replace" >
+                  <form string="Projects">
+                  <header>
+                  <button name="set_open" string="Re-open project" type="object" states="pending" class="oe_highlight" groups="base.group_user"/>
+                  <button name="set_done" string="Close Project" type="object" states="open,pending" groups="base.group_user"/>
+                  <button name="set_open" string="Re-open project" type="object" states="cancelled,close" groups="base.group_user"/>
+                  <button name="set_pending" string="Pending" type="object" states="open" groups="base.group_user"/>
+                  <button name="set_cancel" string="Cancel Project" type="object" states="open,pending" groups="base.group_user"/>
+                  <field name="state" widget="statusbar" statusbar_visible="open,close" statusbar_colors='{"pending":"blue"}' readonly="1"/>
+              </header>
+                  <sheet string="Project">
+                  <div class="oe_title">
+                      <label for="name" class="oe_edit_only" string="Project Name"/>
+                      <h1>
+                          <field name="name" string="Project Name"/>
+                      </h1>
+                      <div name="options_active">
+                          <field name="use_tasks" class="oe_inline"/>
+                          <label for="use_tasks" string="Use Tasks"/>
+                      </div>
+                  </div>
+
+                  <field name="activity_ids" invisible="1"/>
+
+                  <div class="oe_right oe_button_box" name="buttons" groups="base.group_user">
+                       <button class="oe_inline oe_stat_button" type="action" attrs="{'invisible':[('use_tasks','=', 0)]}"
+                          name="%(project.act_project_project_2_project_task_all)d" icon="fa-tasks">
+                          <field string="Tasks" name="task_count" widget="statinfo"/>
+                      </button>
+                      <button  class="oe_inline oe_stat_button" name="attachment_tree_view"  type="object" icon="fa-files-o">
+                          <field string="Documents" name="doc_count" widget="statinfo"/>
+                      </button>
+                      <button class="oe_inline oe_stat_button" type="action" attrs="{'invisible':[('activity_ids','=', [])]}" name="%(custom_project.action_activity)d"
+                      context="{'search_default_project_id': active_id,'search_default_group_task_id': 1}">
+                              <field string="Activities" name="progress_activities" widget="percentpie"/>
+                      </button>
+                  </div>
+                  <group>
+                      <group col="4">
+                          <field name="user_id" string="Project Manager"
+                                  attrs="{'readonly':[('state','in',['close', 'cancelled'])]}"
+                                  context="{'default_groups_ref': ['base.group_user', 'base.group_partner_manager', 'project.group_project_manager']}"/>
+                          <newline/>
+                      </group>
+                          <!-- <p attrs="{'invisible': [('analytic_account_id','=',False)]}">
+                              To invoice or setup invoicing and renewal options, go to the related contract:
+                              <field name="analytic_account_id" readonly="1" required="0" class="oe_inline" nolabel="1"/>.
+                          </p> -->
+                  </group>
+                  <notebook>
+                      <page string="Team" name="team">
+                          <field colspan="4" name="members" widget="many2many_kanban" context="{'default_groups_ref': ['base.group_user', 'base.group_partner_manager', 'project.group_project_user']}">
+                              <kanban quick_create="false" create="true" delete="true">
+                                  <field name="name"/>
+                                  <templates>
+                                      <t t-name="kanban-box">
+                                          <div style="position: relative">
+                                              <a t-if="! read_only_mode" type="delete" style="position: absolute; right: 0; padding: 4px; diplay: inline-block">X</a>
+                                              <div class="oe_module_vignette">
+                                                  <img t-att-src="kanban_image('res.users', 'image_small', record.id.value)" class="oe_avatar oe_kanban_avatar_smallbox"/>
+                                                  <div class="oe_module_desc">
+                                                      <field name="name"/>
+                                                  </div>
+                                              </div>
+                                          </div>
+                                      </t>
+                                  </templates>
+                              </kanban>
+                          </field>
+                      </page>
+                      <page string="Other Info">
+                          <group string="Miscellaneous" name="misc">
+                              <field name="date_start" string="Start Date"/>
+                              <field name="date" string="End Date"/>
+                              <field name="sequence" groups="base.group_no_one"/>
+                              <field name="active" attrs="{'invisible':[('state','in',['open', 'pending', 'template'])]}"/>
+                          </group>
+                      </page>
+                      <page string="Project Stages" attrs="{'invisible': [('use_tasks', '=', False)]}" name="project_stages">
+                           <field name="type_ids"/>
+                      </page>
+                  </notebook>
+              </sheet>
+            </form>
+            </xpath>
+            </field>
+        </record>
+
+        <record id="view_project_kanban" model="ir.ui.view">
+             <field name="name">project.kanban</field>
+             <field name="model">project.project</field>
+             <field name="inherit_id" ref="project.view_project_kanban"/>
+             <field name="arch" type="xml">
+                 <field name="doc_count" position="after">
+                     <field name="progress_activities"/>
+                     <field name="activity_ids" invisible="1"/>
+                 </field>
+                 <div class="text-center oe_kanban_alias" position="after">
+                     <div class="oe_kanban_project" style="width:130px; height: 80px; margin: 0 auto; min-height: 80px;" attrs="{'invisible':[('activity_ids', '=', [])]}">
+                         <field name="progress_activities"  widget="gauge" />
+                     </div>
+                 </div>
+
+             </field>
+         </record>
+
+
+      </data>
+    </openerp>

+ 72 - 0
views/task.xml

@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="utf-8"?>
+<openerp>
+  <data>
+
+    <record id="view_project_task_form" model="ir.ui.view">
+      <field name="name">project.task.form</field>
+      <field name="model">project.task</field>
+      <field name="inherit_id" ref="project.view_task_form2"/>
+      <field name="arch" type="xml">
+        <xpath expr="//field[@name='partner_id']" position="replace">
+          <field name="partner_id" invisible="1"/>
+        </xpath>
+        <xpath expr="//field[@name='date_last_stage_update']" position="replace">
+          <field name="date_last_stage_update" string="Última actualización de la etapa" readonly="1"/>
+        </xpath>
+        <field name="work_ids" position="before">
+          <label for="activity_ids" string="Activities"/>
+          <field name="activity_ids">
+            <tree editable="top" colors="gray:state == 'cancel';blue:state == 'pending'">
+              <field name="sequence" widget="handle"/>
+              <field name="name"/>
+              <field name="user_id" required="True"/>
+              <field name="planned_date"/>
+              <field name="done_date"/>
+              <field name="state"/>
+              <field name="hex_value" invisible="1"/>
+              <button name="action_done" string="Done" type="object" icon="gtk-go-forward" help="Done" attrs="{'invisible':[('state','!=','pending'),('state','!=','cancel')]}"/>
+              <button name="action_done" string="Pending" type="object" icon="gtk-go-back" help="Pending" attrs="{'invisible':[('state','!=','done')]}"/>
+              <button name="action_cancel" string="Cancel" type="object" icon="gtk-cancel" help="Cancel" attrs="{'invisible':[('state','=','cancel')]}"/>
+              <field name="description"/>
+            </tree>
+          </field>
+        </field>
+      </field>
+    </record>
+
+    <record id="view_project_task_kanban" model="ir.ui.view">
+      <field name="name">project.task.kanban</field>
+      <field name="model">project.task</field>
+      <field name="inherit_id" ref="project.view_task_kanban"/>
+      <field name="arch" type="xml">
+        <field name="categ_ids" position="after">
+          <field name="activities_progress"/>
+          <field name="activity_ids" invisible="1"/>
+        </field>
+        <xpath expr="//div[@class='pull-left']" position="before">
+          <div class="pull-left" groups="base.group_user">
+            <field name="activities_progress" attrs="{'invisible':[('activity_ids', '=', [])]}" widget="sparkline_bar"/>
+          </div>
+        </xpath>
+        <xpath expr="//ul[@class='oe_dropdown_menu']" position="replace">
+          <ul class="oe_dropdown_menu">
+            <t t-if="widget.view.is_action_enabled('edit')">
+              <li>
+                <a type="edit">Edit...</a>
+              </li>
+            </t>
+            <t t-if="widget.view.is_action_enabled('delete')">
+              <li>
+                <a type="delete">Delete</a>
+              </li>
+            </t>
+            <li><ul class="oe_kanban_colorpicker" data-field="color"/></li>
+          </ul>
+        </xpath>
+        <xpath expr="//field[@name='categ_ids']" position="attributes">
+          <attribute name="widget">many2many_tags</attribute>
+        </xpath>
+      </field>
+    </record>
+  </data>
+</openerp>