diff --git a/addons/event/__openerp__.py b/addons/event/__openerp__.py index 06252001c83..ea0e4316ef5 100644 --- a/addons/event/__openerp__.py +++ b/addons/event/__openerp__.py @@ -53,6 +53,7 @@ Note that: ], 'demo_xml': ['event_demo.xml'], 'test': ['test/process/event_draft2done.yml'], + 'css': ['static/src/css/event.css'], 'installable': True, 'application': True, 'auto_install': False, diff --git a/addons/event/event.py b/addons/event/event.py index 133d29281f1..1b92b995239 100644 --- a/addons/event/event.py +++ b/addons/event/event.py @@ -148,8 +148,30 @@ class event_event(osv.osv): 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)]}), @@ -158,6 +180,7 @@ class event_event(osv.osv): '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_avail': fields.function(_get_register, string='Available Registrations', multi='register_numbers',type='integer'), 'register_prospect': fields.function(_get_register, string='Unconfirmed Registrations', multi='register_numbers'), 'register_attended': fields.function(_get_register, string='Attended Registrations', multi='register_numbers'), 'registration_ids': fields.one2many('event.registration', 'event_id', 'Registrations', readonly=False, states={'done': [('readonly', True)]}), @@ -182,6 +205,7 @@ class event_event(osv.osv): 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 +213,33 @@ class event_event(osv.osv): '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') + 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): @@ -239,7 +290,8 @@ class event_registration(osv.osv): ('open', 'Confirmed'), ('cancel', 'Cancelled'), ('done', 'Attended')], 'State', - size=16, readonly=True) + size=16, readonly=True), + 'subscribe': fields.boolean('Subscribe'), } _defaults = { diff --git a/addons/event/event_view.xml b/addons/event/event_view.xml index 88be188080e..5aacf7a2845 100644 --- a/addons/event/event_view.xml +++ b/addons/event/event_view.xml @@ -156,6 +156,70 @@ + + + + + event.event.kanban + event.event + kanban + + + + + + + + + + + + +
+ +
+
+ + +
+
+
+
+

+

+ @
+ Organized by
+ + + + + seats + seat available. + + + +

+ + + + + + + + +
+
+
+
+
+
+
@@ -199,6 +263,10 @@ + @@ -229,7 +297,8 @@ ir.actions.act_window event.event form - calendar,tree,form,graph + kanban,calendar,tree,form,graph + {"search_default_upcoming":1} 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. diff --git a/addons/event/static/src/css/event.css b/addons/event/static/src/css/event.css new file mode 100644 index 00000000000..f3d60fcee26 --- /dev/null +++ b/addons/event/static/src/css/event.css @@ -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; +} +