Amit Patel (Open ERP) has proposed merging
lp:~openerp-dev/openobject-addons/trunk-intevent-mva-kanban-view-apa into
lp:openobject-addons.
Requested reviews:
OpenERP Core Team (openerp)
For more details, see:
https://code.launchpad.net/~openerp-dev/openobject-addons/trunk-intevent-mva-kanban-view-apa/+merge/96063
Hello,
[ADD]:event:added kanban view for event module.
Thanks,
Amit
--
https://code.launchpad.net/~openerp-dev/openobject-addons/trunk-intevent-mva-kanban-view-apa/+merge/96063
Your team OpenERP R&D Team is subscribed to branch
lp:~openerp-dev/openobject-addons/trunk-intevent-mva-kanban-view-apa.
=== modified file 'event/__openerp__.py'
--- event/__openerp__.py 2012-02-29 13:00:41 +0000
+++ event/__openerp__.py 2012-03-06 06:23:34 +0000
@@ -53,6 +53,7 @@
],
'demo_xml': ['event_demo.xml'],
'test': ['test/process/event_draft2done.yml'],
+ 'css': ['static/src/css/event.css'],
'installable': True,
'application': True,
'auto_install': False,
=== modified file 'event/event.py'
--- event/event.py 2012-03-01 11:39:44 +0000
+++ event/event.py 2012-03-06 06:23:34 +0000
@@ -23,6 +23,11 @@
from osv import fields, osv
from tools.translate import _
import decimal_precision as dp
+from crm import wizard
+import time
+
+wizard.mail_compose_message.SUPPORTED_MODELS.append('event.registration')
+
class event_type(osv.osv):
""" Event Type """
@@ -148,18 +153,41 @@
number = reg_done
elif field == 'register_prospect':
number = reg_draft
+ elif field == 'register_avail':
+ number = event.register_max-reg_open
res[event.id][field] = number
return res
-
+
+ def _subscribe_fnc(self, cr, uid, ids, fields, args, context=None):
+ """Get Confirm or uncofirm register value.
+ @param ids: List of Event registration type's id
+ @param fields: List of function fields(register_current and register_prospect).
+ @param context: A standard dictionary for contextual values
+ @return: Dictionary of function fields value.
+ """
+ register_pool = self.pool.get('event.registration')
+ res = {}
+ for event in self.browse(cr, uid, ids, context=context):
+ curr_reg_id = register_pool.search(cr,uid,[('user_id','=',uid),('event_id','=',event.id)])
+ if not curr_reg_id:res[event.id] = False
+ if curr_reg_id:
+ for reg in register_pool.browse(cr,uid,curr_reg_id,context=context):
+ if not reg.subscribe:
+ res[event.id]=False
+ else:
+ res[event.id]=True
+ return res
+
_columns = {
'name': fields.char('Name', size=64, required=True, translate=True, readonly=False, states={'done': [('readonly', True)]}),
'user_id': fields.many2one('res.users', 'Responsible User', readonly=False, states={'done': [('readonly', True)]}),
'type': fields.many2one('event.type', 'Type of Event', readonly=False, states={'done': [('readonly', True)]}),
'register_max': fields.integer('Maximum Registrations', help="You can for each event define a maximum registration level. If you have too much registrations you are not able to confirm your event. (put 0 to ignore this rule )", readonly=True, states={'draft': [('readonly', False)]}),
'register_min': fields.integer('Minimum Registrations', help="You can for each event define a minimum registration level. If you do not enough registrations you are not able to confirm your event. (put 0 to ignore this rule )", readonly=True, states={'draft': [('readonly', False)]}),
- 'register_current': fields.function(_get_register, string='Confirmed Registrations', multi='register_numbers'),
- 'register_prospect': fields.function(_get_register, string='Unconfirmed Registrations', multi='register_numbers'),
- 'register_attended': fields.function(_get_register, string='Attended Registrations', multi='register_numbers'),
+ 'register_current': fields.function(_get_register, string='Confirmed Registrations', multi='register_numbers',type='integer'),
+ 'register_prospect': fields.function(_get_register, string='Unconfirmed Registrations', multi='register_numbers',type='integer'),
+ 'register_avail': fields.function(_get_register, string='Available Registrations', multi='register_numbers',type='integer'),
+ 'register_attended': fields.function(_get_register, string='Attended Registrations', multi='register_numbers',type='integer'),
'registration_ids': fields.one2many('event.registration', 'event_id', 'Registrations', readonly=False, states={'done': [('readonly', True)]}),
'date_begin': fields.datetime('Start Date', required=True, readonly=True, states={'draft': [('readonly', False)]}),
'date_end': fields.datetime('End Date', required=True, readonly=True, states={'draft': [('readonly', False)]}),
@@ -182,6 +210,7 @@
type='many2one', relation='res.country', string='Country', readonly=False, states={'done': [('readonly', True)]}),
'note': fields.text('Description', readonly=False, states={'done': [('readonly', True)]}),
'company_id': fields.many2one('res.company', 'Company', required=False, change_default=True, readonly=False, states={'done': [('readonly', True)]}),
+ 'subscribe' : fields.function(_subscribe_fnc, type="boolean", string='Subscribe'),
}
_defaults = {
@@ -189,6 +218,35 @@
'company_id': lambda self,cr,uid,c: self.pool.get('res.company')._company_default_get(cr, uid, 'event.event', context=c),
'user_id': lambda obj, cr, uid, context: uid,
}
+
+ def subscribe_to_event(self,cr,uid,ids,context=None):
+ register_pool = self.pool.get('event.registration')
+ if self.browse(cr,uid,ids)[0].register_avail == 0:
+ raise osv.except_osv(_('Warning!'),_("Sorry, seat not availble.") )
+ curr_reg_id = register_pool.search(cr,uid,[('user_id','=',uid),('event_id','=',ids[0])])
+ if not curr_reg_id:
+ register_pool.create(cr, uid, {'state':'open',
+ 'event_id':ids[0],
+ 'subscribe':True,
+ })
+ else:
+ register_pool.write(cr, uid, curr_reg_id,{'state':'open','subscribe':True,
+ 'event_id':ids[0],
+ })
+
+ self.write(cr,uid,ids,{'subscribe':True})
+ return True
+
+ def unsubscribe_to_event(self,cr,uid,ids,context=None):
+ register_pool = self.pool.get('event.registration')
+ curr_reg_id = register_pool.search(cr,uid,[('user_id','=',uid),('event_id','=',ids[0])])
+ if curr_reg_id:
+ register_pool.write(cr, uid, curr_reg_id,{'state':'draft',
+ 'event_id':ids[0],
+ 'subscribe':False
+ })
+ self.write(cr,uid,ids,{'subscribe':False})
+ return True
def _check_closing_date(self, cr, uid, ids, context=None):
for event in self.browse(cr, uid, ids, context=context):
@@ -211,6 +269,7 @@
'register_max': type_info.default_registration_max,
}
return {'value': dic}
+
event_event()
class event_registration(osv.osv):
@@ -239,7 +298,8 @@
('open', 'Confirmed'),
('cancel', 'Cancelled'),
('done', 'Attended')], 'State',
- size=16, readonly=True)
+ size=16, readonly=True),
+ 'subscribe': fields.boolean('Subscribe'),
}
_defaults = {
=== modified file 'event/event_view.xml'
--- event/event_view.xml 2012-03-01 10:23:17 +0000
+++ event/event_view.xml 2012-03-06 06:23:34 +0000
@@ -196,8 +196,13 @@
<field name="arch" type="xml">
<search string="Events">
<group>
- <filter icon="terp-check" string="Unconfirmed" name="draft" domain="[('state','=','draft')]" help="Events in New state"/>
- <filter icon="terp-camera_test" string="Confirmed" domain="[('state','=','confirm')]" help="Confirmed events"/>
+ <!--<filter icon="terp-check" string="Unconfirmed" name="draft" domain="[('state','=','draft')]" help="Events in New state"/>-->
+ <!--<filter icon="terp-camera_test" string="Confirmed" domain="[('state','=','confirm')]" help="Confirmed events"/>-->
+ <!--<separator orientation="vertical"/>-->
+ <filter icon="terp-go-today" string="Up Coming"
+ name="upcoming"
+ domain="[('date_begin','>=', time.strftime('%%Y-%%m-%%d 00:00:00'))]"
+ help="Up Coming Events" />
<separator orientation="vertical"/>
<field name="name"/>
<field name="type" widget="selection"/>
@@ -221,7 +226,70 @@
</search>
</field>
</record>
-
+
+ <!-- Event Kanban View -->
+
+ <record model="ir.ui.view" id="view_event_kanban">
+ <field name="name">event.event.kanban</field>
+ <field name="model">event.event</field>
+ <field name="type">kanban</field>
+ <field name="arch" type="xml">
+ <kanban>
+ <field name="register_max"/>
+ <field name="type"/>
+ <field name="user_id"/>
+ <field name="register_current"/>
+ <field name="subscribe"/>
+ <field name="country_id"/>
+ <field name="date_begin"/>
+ <field name="register_avail"/>
+ <templates>
+ <t t-name="kanban-box">
+ <div class="oe_module_vignette">
+ <a type="edit" class="oe_module_icon">
+ <div class="oe_event_date "><t t-esc="record.date_begin.raw_value.getDate()"/></div>
+ <div class="oe_event_month_year">
+ <t t-esc="record.date_begin.raw_value.toString('MMM')"/>
+ <t t-esc="record.date_begin.raw_value.getFullYear()"/>
+ </div>
+ <div class="oe_event_time"><t t-esc="record.date_begin.raw_value.toString('hh:mm tt')"/></div>
+ </a>
+ <div class="oe_module_desc">
+ <h4><a type="edit"><field name="name"/></a></h4>
+ <p>
+ <t t-if="record.country_id.raw_value">@<field name="country_id"/><br/></t>
+ <t t-if="record.user_id.raw_value">Organized by <field name="user_id"/><br/></t>
+ <t t-if="record.register_avail.raw_value lte 10">
+ <t t-if="record.register_avail.raw_value != 0">
+ <i><b><field name="register_avail"/></b></i>
+ <i>
+ <t t-if="record.register_avail.raw_value > 1">seats </t>
+ <t t-if="record.register_avail.raw_value == 1 || !record.register_avail.raw_value > 1">seat </t>available.
+ </i>
+ </t>
+ </t>
+ </p>
+ <t t-if="record.register_avail.raw_value != 0">
+ <t t-if="!record.subscribe.raw_value">
+ <button type="object" name="subscribe_to_event" class="subscribe_button oe_event_button_subscribe">
+ <span>Subscribe</span>
+ <span class="subscribe">UnSubscribe</span>
+ </button>
+ </t>
+ </t>
+ <t t-if="record.subscribe.raw_value">
+ <button type="object" name="unsubscribe_to_event" class="unsubscribe_button oe_event_button_unsubscribe">
+ <span>UnSubscribe</span>
+ <span class="unsubscribe">Subscribe</span>
+ </button>
+ </t>
+ </div>
+ </div>
+ </t>
+ </templates>
+ </kanban>
+ </field>
+ </record>
<!-- Events Organisation/CONFIGURATION/EVENTS -->
<record model="ir.actions.act_window" id="action_event_view">
@@ -229,7 +297,8 @@
<field name="type">ir.actions.act_window</field>
<field name="res_model">event.event</field>
<field name="view_type">form</field>
- <field name="view_mode">calendar,tree,form,graph</field>
+ <field name="view_mode">kanban,calendar,tree,form,graph</field>
+ <field name="context">{"search_default_upcoming":1}</field>
<field name="search_view_id" ref="view_event_search"/>
<field name="help">Event is the low level object used by meeting and others documents that should be synchronized with mobile devices or calendar applications through caldav. Most of the users should work in the Calendar menu, and not in the list of events.</field>
</record>
=== added directory 'event/static/src/css'
=== added file 'event/static/src/css/event.css'
--- event/static/src/css/event.css 1970-01-01 00:00:00 +0000
+++ event/static/src/css/event.css 2012-03-06 06:23:34 +0000
@@ -0,0 +1,83 @@
+.oe_event_date{
+ border-top-left-radius:3px;
+ border-top-right-radius:3px;
+ font-size: 48px;
+ height: auto;
+ font-weight: bold;
+ text-align: center;
+ margin-bottom:-7px;
+ color: #FFFFFF;
+ -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.4);
+ background-color: #8A89BA;
+}
+.oe_event_time{
+ border-bottom-left-radius:3px;
+ border-bottom-right-radius:3px;
+ font-size: 12px;
+ text-align: center;
+ font-weight: bold;
+ color: #8A89BA;
+ -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.4);
+ background-color: #FFFFFF;
+}
+.oe_event_month_year{
+ border-bottom-left-radius:3px;
+ border-bottom-right-radius:3px;
+ font-size: 12px;
+ text-align: center;
+ font-weight: bold;
+ color: #FFFFFF;
+ background-color: #8A89BA;
+}
+div.oe_fold_column{
+ padding:0px !important;
+}
+.oe_event_button_subscribe{
+ display: block;
+ border: 1px solid #404040;
+ color: #404040;
+ font-size: 10px;
+ text-align: center;
+ -moz-border-radius: 3px;
+ -webkit-border-radius: 3px;
+ -o-border-radius: 3px;
+ -ms-border-radius: 3px;
+ border-radius: 3px;
+}
+.oe_event_button_unsubscribe{
+ display: block;
+ border: 1px solid #404040;
+ color: #FFFFFF;
+ background-color:#DC5F59;
+ font-size: 10px;
+ text-align: center;
+ -moz-border-radius: 3px;
+ -webkit-border-radius: 3px;
+ -o-border-radius: 3px;
+ -ms-border-radius: 3px;
+ border-radius: 3px;
+}
+.oe_event_button_subscribe:hover {
+ cursor: pointer;
+ background-color: #DC5F59;
+}
+.oe_event_button_unsubscribe:hover {
+ cursor: pointer;
+ background-color: #404040;
+}
+.subscribe, .subscribe_button:hover span {
+ display: none;
+ background-color: #DC5F59;
+}
+.subscribe_button:hover .subscribe {
+ display: inline;
+ background-color: #DC5F59;
+}
+.unsubscribe, .unsubscribe_button:hover span {
+ display: none;
+}
+.unsubscribe_button:hover .unsubscribe {
+ display: inline;
+ background-color: #404040;
+}
+
=== modified file 'event_sale/__openerp__.py'
--- event_sale/__openerp__.py 2012-02-28 10:59:06 +0000
+++ event_sale/__openerp__.py 2012-03-06 06:23:34 +0000
@@ -37,6 +37,7 @@
'depends': ['event','sale','sale_crm'],
'update_xml': [
'event_sale_view.xml',
+ 'event_demo.xml',
],
'test':['test/confirm.yml'],
'installable': True,
=== added file 'event_sale/event_demo.xml'
--- event_sale/event_demo.xml 1970-01-01 00:00:00 +0000
+++ event_sale/event_demo.xml 2012-03-06 06:23:34 +0000
@@ -0,0 +1,12 @@
+<?xml version="1.0"?>
+<openerp>
+ <data>
+
+
+ <record id="event_product" model="product.product">
+ <field name="name">technical training</field>
+ <field name="event_ok">True</field>
+ <field name="event_type_id">2</field>
+ </record>
+ </data>
+</openerp>
=== modified file 'event_sale/event_sale_view.xml'
--- event_sale/event_sale_view.xml 2012-02-28 16:38:23 +0000
+++ event_sale/event_sale_view.xml 2012-03-06 06:23:34 +0000
@@ -24,8 +24,8 @@
<field name="arch" type="xml">
<xpath expr="//field[@name='discount']" position="after">
<field name="event_id" colspan="3" domain="[('type', 'in', list(set((event_type_id,False))))]" attrs="{'invisible': [('event_ok', '=', False)],'required': [('event_ok', '!=', False)]}"/>
- <field name="event_type_id" invisible="1"/>
- <field name="event_ok" invisible="1"/>
+ <field name="event_type_id" />
+ <field name="event_ok"/>
</xpath>
</field>
</record>
=== added directory 'event_sale_layout'
=== added file 'event_sale_layout/__init__.py'
--- event_sale_layout/__init__.py 1970-01-01 00:00:00 +0000
+++ event_sale_layout/__init__.py 2012-03-06 06:23:34 +0000
@@ -0,0 +1,22 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+import event_sale_layout
=== added file 'event_sale_layout/__openerp__.py'
--- event_sale_layout/__openerp__.py 1970-01-01 00:00:00 +0000
+++ event_sale_layout/__openerp__.py 2012-03-06 06:23:34 +0000
@@ -0,0 +1,40 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+
+{
+ 'name': 'Events Sales layout',
+ 'version': '0.1',
+ 'category': 'Tools',
+ 'complexity': "easy",
+ 'description': """
+ change the layout to match with sale layout
+""",
+ 'author': 'OpenERP SA',
+ 'depends': ['event_sale','sale_layout'],
+ 'update_xml': [
+ 'event_sale_layout.xml',
+ ],
+ 'installable': True,
+ 'auto_install':True,
+ 'category': 'Hidden',
+}
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
=== added file 'event_sale_layout/event_sale_layout.xml'
--- event_sale_layout/event_sale_layout.xml 1970-01-01 00:00:00 +0000
+++ event_sale_layout/event_sale_layout.xml 2012-03-06 06:23:34 +0000
@@ -0,0 +1,18 @@
+<openerp>
+<data>
+ <record model="ir.ui.view" id="view_order_form_inherit_1">
+ <field name="name">event.sale.order</field>
+ <field name="model">sale.order</field>
+ <field name="type">form</field>
+ <field name="priority">10000</field>
+ <field name="inherit_id" ref="sale.view_order_form" />
+ <field name="arch" type="xml">
+ <xpath expr="//field[@name='discount']" position="after">
+ <field name="event_id" colspan="3" domain="[('type', 'in', list(set((event_type_id,False))))]" attrs="{'invisible': [('event_ok', '=', False)],'required': [('event_ok', '!=', False)]}"/>
+ <field name="event_type_id" invisible='1'/>
+ <field name="event_ok" invisible='1'/>
+ </xpath>
+ </field>
+ </record>
+</data>
+</openerp>
_______________________________________________
Mailing list: https://launchpad.net/~openerp-dev-gtk
Post to : [email protected]
Unsubscribe : https://launchpad.net/~openerp-dev-gtk
More help : https://help.launchpad.net/ListHelp