Atul Patel(OpenERP) has proposed merging
lp:~openerp-dev/openobject-addons/trunk-event_improvements-atp into
lp:openobject-addons.
Requested reviews:
OpenERP Core Team (openerp)
For more details, see:
https://code.launchpad.net/~openerp-dev/openobject-addons/trunk-event_improvements-atp/+merge/104846
Hello,
1) Display Events image on Home Page Dashboard.
2) Add event_items one2many fields which contains product_id, qty, event price.
Add last end date(sales end) dates.
3) Improve dates in demo so we can have some upcoming events in the list
instead of all the past
events.
4) create event page view with google map on subscribe button.
5) Generate warning if more try to register 2 seats even if only 1 seat
available.
6) Add a textbox in kanban view to enter number of tickets to subscribe, by
default its value should
be 1.
--
https://code.launchpad.net/~openerp-dev/openobject-addons/trunk-event_improvements-atp/+merge/104846
Your team OpenERP R&D Team is subscribed to branch
lp:~openerp-dev/openobject-addons/trunk-event_improvements-atp.
=== modified file 'event/__openerp__.py'
--- event/__openerp__.py 2012-03-06 06:49:02 +0000
+++ event/__openerp__.py 2012-05-05 17:45:26 +0000
@@ -53,7 +53,9 @@
],
'demo_xml': ['event_demo.xml'],
'test': ['test/process/event_draft2done.yml'],
- 'css': ['static/src/css/event.css'],
+ 'css': ['static/src/css/*.css'],
+ 'js': ['static/src/js/event.js'],
+ 'qweb': ['static/src/xml/event_address.xml'],
'installable': True,
'application': True,
'auto_install': False,
=== modified file 'event/event.py'
--- event/event.py 2012-03-30 09:08:37 +0000
+++ event/event.py 2012-05-05 17:45:26 +0000
@@ -102,6 +102,23 @@
total_confirmed = self.event.register_current
if total_confirmed < self.event.register_min or total_confirmed > self.event.register_max and self.event.register_max!=0:
raise osv.except_osv(_('Error!'),_("The total of confirmed registration for the event '%s' does not meet the expected minimum/maximum. You should maybe reconsider those limits before going further") % (self.event.name))
+
+ def check_available_seats(self, cr, uid, ids, context=None):
+ if isinstance(ids, list):
+ ids = ids[0]
+ else:
+ ids = ids
+ total_confirmed = self.browse(cr, uid, ids, context=context).register_current
+ register_max = self.browse(cr, uid, ids, context=context).register_max
+ available_seats = register_max - total_confirmed
+ return available_seats
+
+ def check_registration_limits_before(self, cr, uid, ids, no_of_registration, context=None):
+ available_seats = self.check_available_seats(cr, uid, ids, context=context)
+ if available_seats and no_of_registration > available_seats:
+ raise osv.except_osv(_('Warning!'),_("Only %d Seats are Available!") % (available_seats))
+ elif available_seats == 0:
+ raise osv.except_osv(_('Warning!'),_("No Tickets Available!"))
def confirm_event(self, cr, uid, ids, context=None):
register_pool = self.pool.get('event.registration')
@@ -203,6 +220,7 @@
'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)]}),
'is_subscribed' : fields.function(_subscribe_fnc, type="boolean", string='Subscribed'),
+ 'location_id': fields.many2one('res.partner','Organization Address', readonly=False, states={'done': [('readonly', True)]}),
}
_defaults = {
@@ -214,11 +232,15 @@
def subscribe_to_event(self, cr, uid, ids, context=None):
register_pool = self.pool.get('event.registration')
user_pool = self.pool.get('res.users')
+ num_of_seats = int(context.get('ticket', 1))
+ self.check_registration_limits_before(cr, uid, ids, num_of_seats, context=context)
user = user_pool.browse(cr, uid, uid, context=context)
curr_reg_ids = register_pool.search(cr, uid, [('user_id', '=', user.id), ('event_id', '=' , ids[0])])
#the subscription is done with UID = 1 because in case we share the kanban view, we want anyone to be able to subscribe
if not curr_reg_ids:
- curr_reg_ids = [register_pool.create(cr, 1, {'event_id': ids[0] ,'email': user.user_email, 'name':user.name, 'user_id': user.id,})]
+ curr_reg_ids = [register_pool.create(cr, 1, {'event_id': ids[0] ,'email': user.user_email, 'name':user.name, 'user_id': user.id, 'nb_register': num_of_seats})]
+ else:
+ register_pool.write(cr, uid, curr_reg_ids, {'nb_register': num_of_seats}, context=context)
return register_pool.confirm_registration(cr, 1, curr_reg_ids, context=context)
def unsubscribe_to_event(self, cr, uid, ids, context=None):
@@ -236,7 +258,6 @@
_constraints = [
(_check_closing_date, 'Error ! Closing Date cannot be set before Beginning Date.', ['date_end']),
]
-
def onchange_event_type(self, cr, uid, ids, type_event, context=None):
if type_event:
type_info = self.pool.get('event.type').browse(cr,uid,type_event,context)
@@ -295,6 +316,10 @@
def registration_open(self, cr, uid, ids, context=None):
""" Open Registration
"""
+ event_obj = self.pool.get('event.event')
+ event_id = self.browse(cr, uid, ids, context=context)[0].event_id.id
+ no_of_registration = self.browse(cr, uid, ids, context=context)[0].nb_register
+ event_obj.check_registration_limits_before(cr, uid, event_id, no_of_registration, context=context)
res = self.confirm_registration(cr, uid, ids, context=context)
self.mail_user(cr, uid, ids, context=context)
return res
@@ -383,6 +408,5 @@
return {'value': data}
event_registration()
-
-
+
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
=== modified file 'event/event_demo.xml'
--- event/event_demo.xml 2012-03-29 13:00:46 +0000
+++ event/event_demo.xml 2012-05-05 17:45:26 +0000
@@ -38,16 +38,16 @@
<record id="event_1" model="event.event">
<field name="name">Opera of Verdi</field>
- <field eval="time.strftime('%Y-%m-05 18:00:00')" name="date_begin"/>
- <field eval="time.strftime('%Y-%m-05 21:00:00')" name="date_end"/>
+ <field eval="(DateTime.today()+ timedelta(days=1)).strftime('%Y-%m-%d 18:00:00')" name="date_begin"/>
+ <field eval="(DateTime.today()+ timedelta(days=2)).strftime('%Y-%m-%d 21:00:00')" name="date_end"/>
<field name="type" ref="event_type_1"/>
<field name="register_min">50</field>
<field name="register_max">350</field>
</record>
<record id="event_2" model="event.event">
<field name="name">Conference on ERP Business</field>
- <field eval="time.strftime('%Y-%m-05 14:00:00')" name="date_begin"/>
- <field eval="time.strftime('%Y-%m-05 16:30:00')" name="date_end"/>
+ <field eval="(DateTime.today()+ timedelta(days=2)).strftime('%Y-%m-%d 14:00:00')" name="date_begin"/>
+ <field eval="(DateTime.today()+ timedelta(days=2)).strftime('%Y-%m-%d 16:30:00')" name="date_end"/>
<field name="type" ref="event_type_2"/>
<field name="register_max">200</field>
</record>
=== modified file 'event/event_view.xml'
--- event/event_view.xml 2012-04-25 14:35:28 +0000
+++ event/event_view.xml 2012-05-05 17:45:26 +0000
@@ -2,7 +2,9 @@
<openerp>
<data>
- <menuitem name="Events" id="event_main_menu"/>
+ <menuitem name="Events" id="event_main_menu"
+ web_icon="images/icon.png"
+ web_icon_hover="images/icon.png"/>
<menuitem name="Events Organisation" id="base.menu_event_main" parent="event_main_menu" />
<!-- EVENTS -->
@@ -43,7 +45,7 @@
<menuitem name="Configuration" id="base.menu_marketing_config_root" parent="event_main_menu" sequence="30"/>
<menuitem name="Types of Events" id="menu_event_type" action="action_event_type" parent="base.menu_marketing_config_root" groups="base.group_no_one"/>
- <!-- Events Organisation/CONFIGURATION/EVENTS -->
+<!-- Events Organisation/CONFIGURATION/EVENTS -->
<record model="ir.ui.view" id="view_event_form">
<field name="name">Events</field>
@@ -131,6 +133,69 @@
</field>
</record>
+
+ <!-- Events Organisation/CONFIGURATION/EVENTS PAGE VIEW -->
+
+ <record model="ir.ui.view" id="view_event_page">
+ <field name="name">Events</field>
+ <field name="model">event.event</field>
+ <field name="type">form</field>
+ <field name="arch" type="xml">
+ <form string="Events" layout="manual">
+ <div class="oe_form_topbar" readonly="1">
+ <button string="Cancel Event" name="button_cancel" states="draft,confirm" type="object" icon="gtk-cancel"/>
+ <button string="Confirm Event" name="button_confirm" states="draft" type="object" icon="gtk-apply"/>
+ <button string="Event Done" name="button_done" states="confirm" type="object" icon="gtk-jump-to"/>
+ <button string="Set To Draft" name="button_draft" states="cancel,done" type="object" icon="gtk-convert"/>
+ <div class="oe_right">
+ <field name="state" nolabel="1" widget="statusbar" statusbar_visible="draft,open,done" statusbar_colors='{"pending":"blue"}'/>
+ </div>
+ </div>
+ <sheet string="Event Form" layout="auto">
+ <group col="2">
+ <group col="2">
+ <div class="oe_event_title">
+ <field name="name" nolabel="1" readonly="1"/>
+ </div>
+ <newline/>
+ <group colspan="4" name="venue">
+ <div class="oe_sub1"> Venue : </div>
+ <field name="location_id" nolabel="1" readonly="1"/>
+ </group>
+ </group>
+ <group>
+ <div id = "oe_mapbox" class="oe_mapbox"> </div><newline/>
+ <table>
+ <tr>
+ <td width="70px" class="oe_td_border">
+ Where
+ </td>
+ <td width="auto">
+ <field name="address_id" widget ="geo_address" nolabel="1"/>
+ </td>
+ <td width="210px">
+ <table align="right">
+ <tr>
+ <td class="oe_td_date_border">Start: </td><td><field name="date_begin" nolabel="1" readonly="1"/></td>
+ </tr>
+ <tr>
+ <td class="oe_td_date_border">End</td><td><field name="date_end" nolabel="1" readonly="1"/></td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+ </table>
+ </group>
+ </group>
+ <separator string="" colspan="4"/>
+ <label string="Event Details:" colspan="4"/>
+ <field name="note" colspan="4" nolabel="1" readonly="1"/>
+ </sheet>
+ </form>
+ </field>
+ </record>
+
<!-- Event tree view -->
<record model="ir.ui.view" id="view_event_tree">
@@ -203,7 +268,8 @@
</p>
<t t-if="record.register_avail.raw_value != 0">
<t t-if="!record.is_subscribed.raw_value">
- <button type="object" name="subscribe_to_event" class="subscribe_button oe_event_button_subscribe">
+ <input t-att-id="record.id.raw_value" type="text" name="subscribe" class="no_of_seats" value="1" onchange="document.getElementById('btn_sub' +this.id).setAttribute('data-context',JSON.stringify({'ticket':this.value}))"/>
+ <button t-att-id="'btn_sub'+record.id.raw_value" type="object" name="subscribe_to_event" class="subscribe_button oe_event_button_subscribe">
<span >Subscribe</span>
</button>
</t>
=== added file 'event/images/icon.png'
Binary files event/images/icon.png 1970-01-01 00:00:00 +0000 and event/images/icon.png 2012-05-05 17:45:26 +0000 differ
=== modified file 'event/static/src/css/event.css'
--- event/static/src/css/event.css 2012-03-20 10:38:46 +0000
+++ event/static/src/css/event.css 2012-05-05 17:45:26 +0000
@@ -64,6 +64,7 @@
-webkit-font-smoothing: antialiased;
outline: none;
}
+
.oe_event_button_unsubscribe {
display: inline-block;
border: 1px solid #AAA;
@@ -115,4 +116,40 @@
display: inline;
background-color: #DC5F59;
}
-
+ .no_of_seats{
+ width:25px;
+ }
+.oe_event_title{
+ font-size: 25px;
+}
+.oe_sub1
+{
+ float:left;
+ height:50px;
+ border-right: 1px solid black;
+ border-color: #DCDCDC;
+}
+.oe_mapbox
+{
+ width:auto;
+ height:200px;
+ margin-left:auto;
+ margin-right:auto;
+ text-align: right;
+
+}
+.oe_td_border
+{
+ width: 5em;
+ padding: 2px;
+ border-right: 1px solid black;
+ text-align: center;
+ border-color: #DCDCDC;
+
+
+}
+.oe_td_date_border
+{
+ border-right:1px solid black;
+ border-color: #DCDCDC;
+}
=== added directory 'event/static/src/js'
=== added file 'event/static/src/js/event.js'
--- event/static/src/js/event.js 1970-01-01 00:00:00 +0000
+++ event/static/src/js/event.js 2012-05-05 17:45:26 +0000
@@ -0,0 +1,54 @@
+openerp.event = function(instance){
+ instance.web.form.widgets.add('geo_address', 'instance.event.GeoAddress');
+ instance.event.GeoAddress = instance.web.form.AbstractField.extend(_.extend({}, {
+
+ init : function(){
+ this._super.apply(this,arguments);
+ },
+
+ start:function(){
+ },
+
+ set_input_id:function(id){
+ },
+ set_value:function(value){
+ var self = this;
+ this.get_address(value).done(function(value){
+ self.__parentedParent.$element.find(".oe_td_border").after(instance.web.qweb.render("address",{'record': value}));
+ var address = _.str.sprintf(' %(street)s, %(city)s, %(country_id[1])s', value);
+ return self.list_addresses(address);
+
+ });
+
+ },
+ get_address:function(value){
+ if (!value || value.length == 0){
+ return $.Deferred().reject();
+ }
+ return new instance.web.DataSet (this,this.field.relation, this.build_context()).read_ids(value[0],["street","city","country_id"]);
+ },
+
+ list_addresses: function(address){
+ var geocoder = new google.maps.Geocoder();
+ geocoder.geocode( { 'address': address}, function(results, status)
+ {
+ if (status == google.maps.GeocoderStatus.OK){
+ var lat = results[0].geometry.location.lat(),lng =results[0].geometry.location.lng();
+ var myOptions = {
+ zoom: 17,
+ center: new google.maps.LatLng(lat,lng),
+ mapTypeId: google.maps.MapTypeId.ROADMAP
+ }
+ return new google.maps.Marker({
+ map : new google.maps.Map(document.getElementById("oe_mapbox"),myOptions),
+ position: new google.maps.LatLng(lat,lng)
+ });
+ }
+ });
+
+ },
+ get_value:function(){
+ }
+
+ }));
+};
\ No newline at end of file
=== added directory 'event/static/src/xml'
=== added file 'event/static/src/xml/event_address.xml'
--- event/static/src/xml/event_address.xml 1970-01-01 00:00:00 +0000
+++ event/static/src/xml/event_address.xml 2012-05-05 17:45:26 +0000
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+ <template>
+ <td t-name="address">
+ <t t-esc="record.street"/> <br/>
+ <t t-esc="record.city"/> <br/>
+ <t t-esc="record.country_id[1]"/>
+ </td>
+ </template>
\ No newline at end of file
=== modified file 'event_sale/event_sale.py'
--- event_sale/event_sale.py 2012-02-28 16:38:23 +0000
+++ event_sale/event_sale.py 2012-05-05 17:45:26 +0000
@@ -19,6 +19,7 @@
#
##############################################################################
+import time
from osv import fields, osv
from tools.translate import _
@@ -34,6 +35,7 @@
product()
+
class sale_order_line(osv.osv):
_inherit = 'sale.order.line'
_columns = {
@@ -70,7 +72,6 @@
def button_confirm(self, cr, uid, ids, context=None):
'''
create registration with sale order
-
'''
registration_obj = self.pool.get('event.registration')
sale_obj = self.pool.get('sale.order')
@@ -92,4 +93,108 @@
message = _("The registration %s has been created from the Sale Order %s.") % (registration_id, order_line.order_id.name)
registration_obj.log(cr, uid, registration_id, message)
return super(sale_order_line, self).button_confirm(cr, uid, ids, context=context)
+
+class event_event(osv.osv):
+ _inherit = 'event.event'
+ _columns = {
+ 'event_item_ids': fields.one2many('event.items','event_id', 'Event Items'),
+ }
+
+ def order_now(self, cr, uid, ids, context=None):
+ res = {}
+ register_pool = self.pool.get('event.registration')
+ sale_order_line_pool = self.pool.get('sale.order.line')
+ sale_order = self.pool.get('sale.order')
+ partner_pool = self.pool.get("res.partner")
+ data_obj = self.pool.get("ir.model.data")
+ prod_pricelist_obj = self.pool.get('product.pricelist')
+ user = self.pool.get("res.users").browse(cr, uid, uid, context=context)
+ partner_ids = partner_pool.search(cr, uid, [('name', '=', user.name), ('email', '=', user.user_email)])
+ if not partner_ids:
+ # partner not found create new partner.....
+ new_partner_id = partner_pool.create(cr, uid, {'name': user.name, 'email': user.user_email})
+ partner_invoice_id = partner_pool.address_get(cr, uid, [new_partner_id], ['invoice'])['invoice']
+ partner_shipping_id = partner_pool.address_get(cr, uid, [new_partner_id], ['delivery'])['delivery']
+ else:
+ new_partner_id = partner_ids[0]
+ partner_invoice_id = partner_pool.address_get(cr, uid, [new_partner_id], ['invoice'])['invoice']
+ partner_shipping_id = partner_pool.address_get(cr, uid, [new_partner_id], ['delivery'])['delivery']
+ for event_id in self.browse(cr, uid, ids, context=context):
+ price_list = prod_pricelist_obj.search(cr,uid,[],context=context)[0]
+ new_sale_id = sale_order.create(cr, uid, {
+ 'date_order': event_id.date_begin,
+ 'pricelist_id': price_list,
+ 'partner_id': new_partner_id,
+ 'partner_invoice_id': partner_invoice_id,
+ 'partner_shipping_id': partner_shipping_id
+ })
+ if event_id.event_item_ids:
+ for items in event_id.event_item_ids:
+ product = items.product_id.id
+ sale_order_line = sale_order_line_pool.create(cr, uid, {
+ 'order_id': new_sale_id,
+ 'name': items.product_id.name,
+ 'product_uom_qty': items.qty,
+ 'product_id': items.product_id.id,
+ 'price_unit': items.price,
+ 'date_planned': items.sales_end_date,
+ }, context=context)
+ view_id = data_obj._get_id(cr, uid, 'sale', 'view_order_form')
+ if view_id:
+ res_id = data_obj.browse(cr, uid, view_id, context=context).res_id
+ res = {
+ 'name': _('Quotation'),
+ 'view_type': 'form',
+ 'view_mode': 'form',
+ 'res_model': 'sale.order',
+ 'res_id': new_sale_id,
+ 'views':[(res_id,'form'), (False, 'tree')],
+ 'type': 'ir.actions.act_window',
+ 'nodestroy': True,
+ 'target': 'current',
+ }
+ return res
+
+ def subscribe_to_event(self, cr, uid, ids, context=None):
+ res = {}
+ data_obj = self.pool.get("ir.model.data")
+ view_id = data_obj._get_id(cr, uid, 'event', 'view_event_page')
+ if view_id:
+ res_id = data_obj.browse(cr, uid, view_id, context=context).res_id
+ res = {
+ 'name': _('Event Page'),
+ 'view_type': 'form',
+ 'view_mode': 'form',
+ 'views':[(res_id,'form'), (False, 'tree')],
+ 'res_model': 'event.event',
+ 'res_id': ids[0],
+ 'type': 'ir.actions.act_window',
+ 'nodestroy': True,
+ 'target': 'current',
+ }
+ return res
+
+class event_items(osv.osv):
+ _name = "event.items"
+ _columns = {
+ 'product_id': fields.many2one('product.product', 'Product', required=True),
+ 'price': fields.integer('Price'),
+ #Need to convert this integer field in to dynamic selection.. TODO
+ # 'max_qty': fields.integer('Max.Quantity available'),
+ 'qty': fields.integer('Quantity'),
+ 'uom_id': fields.many2one('product.uom', 'UoM'),
+ 'discount': fields.integer('Discount'),
+ 'event_id': fields.many2one('event.event', 'Event'),
+ 'sales_end_date': fields.date('Sales End')
+ }
+ def onchange_product_id(self, cr, uid, ids, product, context=None):
+ product_obj = self.pool.get('product.product')
+ data = {}
+ if not product:
+ return {'value': data}
+ price = product_obj.browse(cr, uid, product).list_price
+ uom = product_obj.browse(cr, uid, product).uom_id.id
+ data['price'] = price
+ data['uom_id'] = uom
+ return {'value': data}
=== modified file 'event_sale/event_sale_view.xml'
--- event_sale/event_sale_view.xml 2012-04-25 14:35:28 +0000
+++ event_sale/event_sale_view.xml 2012-05-05 17:45:26 +0000
@@ -29,5 +29,69 @@
</xpath>
</field>
</record>
+
+ <record model="ir.ui.view" id="view_event_page_inherit">
+ <field name="name">Events Inherit</field>
+ <field name="model">event.event</field>
+ <field name="type">form</field>
+ <field name="inherit_id" ref="event.view_event_page"/>
+ <field name="arch" type="xml">
+ <xpath expr="//group[@name='venue']" position="after">
+ <field name="event_item_ids" nolabel="1">
+ <tree editable="top" string="Event Items">
+ <field name="product_id" readonly="1" />
+ <field name="sales_end_date" readonly="1"/>
+ <field name="price" readonly="1"/>
+ <!-- <field name="max_qty" readonly="1" groups="event.group_event_manager"/>-->
+ <field name="qty" attrs="{'readonly':[('product_id','=',False)]}" groups="event.group_event_user" />
+ </tree>
+ </field>
+ <newline/>
+ <div class="oe_right">
+ <button name="order_now" string="Order Now" type="object" icon="gtk-apply"/>
+ </div>
+ </xpath>
+ </field>
+ </record>
+
+
+ <record model="ir.ui.view" id="view_event_form_inherit">
+ <field name="name">Events Inherit</field>
+ <field name="model">event.event</field>
+ <field name="type">form</field>
+ <field name="inherit_id" ref="event.view_event_form"/>
+ <field name="arch" type="xml">
+ <xpath expr="//page[@string='Extra Info']" position="after">
+ <page string="Event Item">
+ <field name="event_item_ids" nolabel="1">
+ <tree editable="top" string="Event Items">
+ <field name="product_id" string="Ticket Type" domain="[('event_ok','=',True)]" on_change="onchange_product_id(product_id)"/>
+ <field name="sales_end_date" />
+ <field name="price"/>
+ <!-- <field name="max_qty" groups="event.group_event_manager"/> -->
+ <field name="qty" attrs="{'readonly':[('product_id','=',False)]}" groups="event.group_event_user"/>
+ </tree>
+ </field>
+ <newline/>
+ <div class="oe_right">
+ <button name="order_now" string="Order Now" type="object" icon="gtk-apply"/>
+ </div>
+ </page>
+ </xpath>
+ </field>
+ </record>
+
+ <record id="view_event_kanban_inherit" model="ir.ui.view">
+ <field name="name">event.inherit.kanban</field>
+ <field name="model">event.event</field>
+ <field name="type">kanban</field>
+ <field name="inherit_id" ref="event.view_event_kanban"/>
+ <field name="arch" type="xml">
+ <xpath expr="//div/t/t/input[@name='subscribe']" position="replace">
+ <input type="hidden"/>
+ </xpath>
+ </field>
+ </record>
+
</data>
</openerp>
=== added directory 'portal_event'
=== added file 'portal_event/__init__.py'
--- portal_event/__init__.py 1970-01-01 00:00:00 +0000
+++ portal_event/__init__.py 2012-05-05 17:45:26 +0000
@@ -0,0 +1,22 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2004-2011 OpenERP S.A (<http://www.openerp.com>).
+#
+# 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 portal_event
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
\ No newline at end of file
=== added file 'portal_event/__openerp__.py'
--- portal_event/__openerp__.py 1970-01-01 00:00:00 +0000
+++ portal_event/__openerp__.py 2012-05-05 17:45:26 +0000
@@ -0,0 +1,40 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2004-2011 OpenERP S.A (<http://www.openerp.com>).
+#
+# 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' : "Portal Event",
+ 'version' : "1.0",
+ 'depends' : ["portal", "event_sale"],
+ 'author' : "OpenERP SA",
+ 'category': 'Portal',
+ 'description': """
+This module defines 'portals' to customize the access to your OpenERP database
+for external users.
+ """,
+ 'update_xml': [
+ 'security/portal_event_security.xml',
+ 'security/ir.model.access.csv',
+ ],
+ 'website': 'http://www.openerp.com',
+ 'installable': True,
+}
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
\ No newline at end of file
=== added file 'portal_event/portal_event.py'
--- portal_event/portal_event.py 1970-01-01 00:00:00 +0000
+++ portal_event/portal_event.py 2012-05-05 17:45:26 +0000
@@ -0,0 +1,47 @@
+# -*- 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 time
+from osv import fields, osv
+from tools.translate import _
+
+class event_event(osv.osv):
+ _inherit = 'event.event'
+
+ def make_quotation(self, cr, uid, ids, context=None):
+ event_pool = self.pool.get('event.event')
+ register_pool = self.pool.get('event.registration')
+ sale_order_line_pool = self.pool.get('sale.order.line')
+ sale_order = self.pool.get('sale.order')
+ partner_pool = self.pool.get('res.partner')
+ prod_pricelist_obj = self.pool.get('product.pricelist')
+ res_users_obj = self.pool.get('res.users')
+ user = res_users_obj.browse(cr, uid, uid, context=context)
+ partner_ids = partner_pool.search(cr, uid, [('name', '=', user.name), ('email', '=', user.user_email)])
+ if partner_ids:
+ res_users_obj.write(cr, uid, user.id, {'partner_id': partner_ids[0]})
+ if not partner_ids:
+ raise osv.except_osv(_('Error !'),
+ _('There is no Partner defined ' \
+ 'for this event:'))
+ res = super(event_event,self).make_quotation(cr, uid, ids, context)
+
+ return res
=== added directory 'portal_event/security'
=== added file 'portal_event/security/ir.model.access.csv'
--- portal_event/security/ir.model.access.csv 1970-01-01 00:00:00 +0000
+++ portal_event/security/ir.model.access.csv 2012-05-05 17:45:26 +0000
@@ -0,0 +1,6 @@
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_event,event,event.model_event_event,portal_event.group_event_portal,1,0,0,0
+access_registration,registration,event.model_event_registration,portal_event.group_event_portal,1,0,0,0
+access_event_items,event.items,event.model_event_event,portal_event.group_event_portal,1,1,1,0
+access_product_product,product.product,product.model_product_product,portal_event.group_event_portal,1,0,0,0
+access_product_uom,product.uom,product.model_product_uom,portal_event.group_event_portal,1,0,0,0
\ No newline at end of file
=== added file 'portal_event/security/portal_event_security.xml'
--- portal_event/security/portal_event_security.xml 1970-01-01 00:00:00 +0000
+++ portal_event/security/portal_event_security.xml 2012-05-05 17:45:26 +0000
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<openerp>
+ <data>
+
+ <!-- Creating Portal Group -->
+
+ <record id="group_event_portal" model="res.groups">
+ <field name="name">Event Portal Groups</field>
+ <field ref="event.module_category_event_management" name="category_id"/>
+ </record>
+
+ <record id="portal_event" model="res.portal">
+ <field name="name">Portal User</field>
+ <field name="group_id" ref="group_event_portal"/>
+ </record>
+
+ <!-- Sale Portal Access Rules -->
+ <record id="portal_event_rule" model="ir.rule">
+ <field name="name">Personal Events</field>
+ <field ref="event.model_event_event" name="model_id"/>
+ <field name="domain_force">[]</field>
+ <field name="groups" eval="[(4, ref('group_event_portal'))]"/>
+ </record>
+
+ <record id="portal_registration_rule" model="ir.rule">
+ <field name="name">Personal Registrations</field>
+ <field ref="event.model_event_registration" name="model_id"/>
+ <field name="domain_force">[('partner_id.email','=',user.login)]</field>
+ <field name="groups" eval="[(4, ref('group_event_portal'))]"/>
+ </record>
+
+ </data>
+</openerp>
\ No newline at end of file
=== modified file 'sale/sale_view.xml'
--- sale/sale_view.xml 2012-05-03 10:29:10 +0000
+++ sale/sale_view.xml 2012-05-05 17:45:26 +0000
@@ -132,7 +132,7 @@
</group>
<notebook colspan="5">
<page string="Sales Order">
- <field name="partner_id" on_change="onchange_partner_id(partner_id)" domain="[('customer','=',True)]" context="{'search_default_customer':1}" required="1"/>
+ <field name="partner_id" on_change="onchange_partner_id(partner_id)" domain="[('customer','=',True)]" context="{'search_default_customer':1}" />
<field domain="[('parent_id','=',partner_id)]" name="partner_invoice_id" groups="sale.group_delivery_invoice_address" options='{"quick_create": false}'/>
<field domain="[('parent_id','=',partner_id)]" name="partner_shipping_id" groups="sale.group_delivery_invoice_address" options='{"quick_create": false}'/>
<field domain="[('type','=','sale')]" name="pricelist_id" groups="product.group_sale_pricelist" on_change="onchange_pricelist_id(pricelist_id,order_line)"/>
_______________________________________________
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