[ADD] idea: added a kanban view

bzr revid: tde@openerp.com-20130618080820-18bhrsq3flfacpjl
This commit is contained in:
Thibault Delavallée 2013-06-18 10:08:20 +02:00
parent 145befd3e7
commit f470535b0e
6 changed files with 181 additions and 66 deletions

View File

@ -41,6 +41,7 @@ Once installed, check the menu 'Ideas' in the 'Tools' main menu.""",
'security/idea.xml',
'security/ir.model.access.csv',
'views/idea.xml',
'views/category.xml',
'data/idea_workflow.xml',
],
'demo': [
@ -49,7 +50,9 @@ Once installed, check the menu 'Ideas' in the 'Tools' main menu.""",
'installable': True,
'application': True,
'images': [],
'css': [],
'css': [
'static/src/css/idea_idea.css',
],
'js': [],
'qweb': [],
}

View File

@ -2,16 +2,35 @@
<openerp>
<data>
<record model="idea.category" id="idea_category_sales">
<record model="idea.category" id="idea_cat_0">
<field name="name">Sales</field>
</record>
<record model="idea.category" id="idea_category_general">
<record model="idea.category" id="idea_cat_1">
<field name="name">Organization</field>
</record>
<record model="idea.category" id="idea_category_technical">
<record model="idea.category" id="idea_cat_2">
<field name="name">Technical</field>
</record>
<record model="idea.idea" id="idea_idea_1">
<field name="name">Name</field>
<field name="description">Description</field>
<field name="state">draft</field>
<field name="category_ids" eval="(4, ref('idea.idea_cat_0'))"/>
</record>
<record model="idea.idea" id="idea_idea_2">
<field name="name">Name2</field>
<field name="description">Description</field>
<field name="state">draft</field>
<field name="category_ids" eval="(4, ref('idea.idea_cat_1'))"/>
</record>
<record model="idea.idea" id="idea_idea_3">
<field name="name">Name3</field>
<field name="description">Description</field>
<field name="state">draft</field>
<field name="category_ids" eval="(4, ref('idea.idea_cat_2'))"/>
</record>
</data>
</openerp>

View File

@ -28,7 +28,7 @@ VoteValues = [('-1', 'Not Voted'), ('0', 'Very Bad'), ('25', 'Bad'), \
DefaultVoteValue = '50'
class idea_category(osv.osv):
class IdeaCategory(osv.Model):
""" Category of Idea """
_name = "idea.category"
_description = "Idea Category"
@ -43,13 +43,18 @@ class idea_category(osv.osv):
]
class idea_idea(osv.osv):
class IdeaIdea(osv.Model):
""" Model of an Idea """
_name = 'idea.idea'
_description = 'Propose and Share your Ideas'
_rec_name = 'name'
_order = 'name asc'
# _inherit = ['mail.thread']
def _get_state_list(self, cr, uid, context=None):
return [('draft', 'New'),
('open', 'Accepted'),
('cancel', 'Refused'),
('close', 'Done')]
_columns = {
'create_uid': fields.many2one('res.users', 'Creator', required=True, readonly=True),
@ -61,19 +66,48 @@ class idea_idea(osv.osv):
help='Content of the idea'),
'category_ids': fields.many2many('idea.category', string='Tags', readonly=True,
states={'draft': [('readonly', False)]}),
'state': fields.selection([('draft', 'New'),
('open', 'Accepted'),
('cancel', 'Refused'),
('close', 'Done')],
'Status', readonly=True, track_visibility='onchange'),
'state': fields.selection(_get_state_list, string='Status',
readonly=True, track_visibility='onchange'),
}
_sql_constraints = [
('name', 'unique(name)', 'The name of the idea must be unique')
]
_defaults = {
'state': lambda *a: 'draft',
'state': lambda self, cr, uid, ctx=None: self._get_state_list(cr, uid, ctx)[0][0],
}
#------------------------------------------------------
# Technical stuff
#------------------------------------------------------
def read_group(self, cr, uid, domain, fields, groupby, offset=0, limit=None, context=None, orderby=False):
""" Override read_group to always display all states. """
# Default result structure
states = self._get_state_list(cr, uid, context=context)
read_group_all_states = [{
'__context': {'group_by': groupby[1:]},
'__domain': domain + [('state', '=', state_value)],
'state': state_value,
'state_count': 0,
} for state_value, state_name in states]
# Get standard results
read_group_res = super(IdeaIdea, self).read_group(cr, uid, domain, fields, groupby, offset, limit, context, orderby)
# Update standard results with default results
result = []
for state_value, state_name in states:
res = filter(lambda x: x['state'] == state_value, read_group_res)
if not res:
res = filter(lambda x: x['state'] == state_value, read_group_all_states)
res[0]['state'] = [state_value, state_name]
result.append(res[0])
return result
#------------------------------------------------------
# Workflow / Actions
#------------------------------------------------------
def idea_cancel(self, cr, uid, ids, context=None):
return self.write(cr, uid, ids, {'state': 'cancel'}, context=context)

View File

@ -0,0 +1,21 @@
.openerp .oe_kanban_view .oe_kanban_idea_idea {
width: 200px;
}
.openerp .oe_kanban_view .oe_kanban_idea_idea .oe_avatars {
text-align: right;
margin: -5px 0 -10px 0;
}
.openerp .oe_kanban_view .oe_kanban_idea_idea .oe_avatars img {
width: 30px;
height: 30px;
padding-left: 0px;
margin-top: 3px;
-moz-border-radius: 2px;
-webkit-border-radius: 2px;
border-radius: 2px;
-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);
}

View File

@ -0,0 +1,56 @@
<?xml version="1.0"?>
<openerp>
<data>
<!-- VIEWS DEFINITION
-->
<record model="ir.ui.view" id="view_idea_category_search">
<field name="name">idea.category.search</field>
<field name="model">idea.category</field>
<field name="arch" type="xml">
<search string="Ideas Categories">
<field name="name" string="Category"/>
</search>
</field>
</record>
<record model="ir.ui.view" id="view_idea_category_form">
<field name="name">idea.category.form</field>
<field name="model">idea.category</field>
<field name="arch" type="xml">
<form string="Category of Ideas" version="7.0">
<group>
<field name="name"/>
</group>
</form>
</field>
</record>
<record model="ir.ui.view" id="view_idea_category_tree">
<field name="name">idea.category.tree</field>
<field name="model">idea.category</field>
<field name="field_parent"></field>
<field name="arch" type="xml">
<tree string="Category of ideas">
<field name="name"/>
</tree>
</field>
</record>
<record model="ir.actions.act_window" id="action_idea_category">
<field name="name">Categories</field>
<field name="res_model">idea.category</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="search_view_id" ref="view_idea_category_search"/>
</record>
<!-- MENUS
-->
<menuitem name="Categories" parent="menu_ideas"
id="menu_idea_category" action="action_idea_category" sequence="20"/>
</data>
</openerp>

View File

@ -1,52 +1,35 @@
<?xml version="1.0"?>
<openerp>
<data>
<!-- Idea Categories Search View-->
<record model="ir.ui.view" id="view_idea_category_search">
<field name="name">idea.category.search</field>
<field name="model">idea.category</field>
<record model="ir.ui.view" id="view_idea_idea_kanban">
<field name="name">idea.idea.kanban</field>
<field name="model">idea.idea</field>
<field name="arch" type="xml">
<search string="Ideas Categories">
<field name="name" string="Category"/>
</search>
<kanban version="7.0" default_group_by="state" class="oe_background_grey">
<templates>
<t t-name="kanban-box">
<div t-attf-class="oe_kanban_card oe_kanban_idea_idea oe_kanban_global_click_edit">
<div class="oe_dropdown_toggle oe_dropdown_kanban"
groups="base.group_user">
<span class="oe_e">í</span>
<ul class="oe_dropdown_menu">
<t t-if="widget.view.is_action_enabled('delete')">
<li><a type="delete">Delete</a></li>
</t>
</ul>
</div>
<div class="oe_kanban_content">
<h4><field name="name"/></h4>
<field name="category_ids"/>
</div>
</div>
</t>
</templates>
</kanban>
</field>
</record>
<!-- Idea Category Form View -->
<record model="ir.ui.view" id="view_idea_category_form">
<field name="name">idea.category.form</field>
<field name="model">idea.category</field>
<field name="arch" type="xml">
<form string="Category of Ideas" version="7.0">
<group>
<field name="name"/>
</group>
</form>
</field>
</record>
<!-- Idea Category Tree View -->
<record model="ir.ui.view" id="view_idea_category_tree">
<field name="name">idea.category.tree</field>
<field name="model">idea.category</field>
<field name="field_parent"></field>
<field name="arch" type="xml">
<tree string="Category of ideas">
<field name="name"/>
</tree>
</field>
</record>
<!-- Idea Category Action -->
<record model="ir.actions.act_window" id="action_idea_category">
<field name="name">Categories</field>
<field name="res_model">idea.category</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="search_view_id" ref="view_idea_category_search"/>
</record>
<!-- New Idea Form View -->
<record model="ir.ui.view" id="view_idea_idea_form">
<field name="name">idea.idea.form</field>
<field name="model">idea.idea</field>
@ -70,7 +53,6 @@
</field>
</record>
<!-- New Idea Tree View -->
<record model="ir.ui.view" id="view_idea_idea_tree">
<field name="name">idea.idea.tree</field>
<field name="model">idea.idea</field>
@ -83,21 +65,23 @@
</field>
</record>
<!-- Search Idea -->
<record model="ir.ui.view" id="view_idea_idea_search">
<field name="name">idea.idea.search</field>
<field name="model">idea.idea</field>
<field name="arch" type="xml">
<search string="Ideas">
<field name="name" string="Idea"/>
<filter icon="terp-document-new" string="New" domain="[('state','=', 'draft')]" help="New Ideas"/>
<filter icon="terp-camera_test" string="In Progress" domain="[('state','=', 'open')]" help="Open Ideas"/>
<filter icon="terp-check" string="Accepted" domain="[('state','=','close')]" help="Accepted Ideas" />
<field name="category_ids"/>
<filter string="New" domain="[('state', '=', 'draft')]"
help="New Ideas"/>
<filter string="In Progress" domain="[('state','=', 'open')]"
help="Open Ideas"/>
<filter string="Accepted" domain="[('state','=', 'close')]"
help="Accepted Ideas" />
<group expand="0" string="Group By...">
<filter icon="terp-personal" string="Creator" help="By Creators" context="{'group_by':'create_uid'}"/>
<filter icon="terp-stock_symbol-selection" string="Category" help="By Idea Category" context="{'group_by':'category_ids'}"/>
<filter icon="terp-stock_effects-object-colorize" string="Status" help="By States" context="{'group_by':'state'}"/>
<filter string="Creator" help="By Creators" context="{'group_by': 'create_uid'}"/>
<filter string="Category" help="By Category" context="{'group_by': 'category_ids'}"/>
<filter string="Status" help="By States" context="{'group_by': 'state'}"/>
</group>
</search>
</field>
@ -107,7 +91,7 @@
<field name="name">Ideas</field>
<field name="res_model">idea.idea</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="view_mode">kanban,tree,form</field>
<field name="search_view_id" ref="view_idea_idea_search"/>
</record>
@ -124,8 +108,6 @@
<menuitem name="Ideas" parent="menu_ideas"
id="menu_idea_idea" action="action_idea_idea" sequence="10"/>
<menuitem name="Categories" parent="menu_ideas"
id="menu_idea_category" action="action_idea_category" sequence="20"/>
</data>
</openerp>