[TYPO] cleaning

bzr revid: jke@openerp.com-20131220160818-56skpmvbzub6mn1r
This commit is contained in:
jke-openerp 2013-12-20 17:08:18 +01:00
parent 0659fff17d
commit c274b28f4a
11 changed files with 64 additions and 313 deletions

View File

@ -21,6 +21,3 @@
import calendar
import controllers
#import res_config
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -144,8 +144,6 @@ class calendar_attendee(osv.osv):
if idate:
#returns the datetime as UTC, because it is stored as it in the database
return datetime.strptime(idate.split('.')[0], '%Y-%m-%d %H:%M:%S').replace(tzinfo=pytz.timezone('UTC'))
#return datetime.strptime(idate, DEFAULT_SERVER_DATETIME_FORMAT).replace(tzinfo=pytz.timezone('UTC'))
return False
try:
@ -171,9 +169,7 @@ class calendar_attendee(osv.osv):
if event_obj.alarm_ids:
for alarm in event_obj.alarm_ids:
# computes alarm data
valarm = event.add('valarm')
# Compute trigger data
interval = alarm.interval
occurs = 'before'
duration = alarm.duration
@ -188,7 +184,6 @@ class calendar_attendee(osv.osv):
delta = timedelta(minutes=duration)
trigger.value = delta
# Compute other details
valarm.add('DESCRIPTION').value = alarm.name or 'OpenERP'
for attendee in event_obj.attendee_ids:
@ -226,6 +221,7 @@ class calendar_attendee(osv.osv):
if attendee.email and email_from:
ics_file = self.get_ics_file(cr, uid, attendee.event_id, context=context)
#Local_context used to custom bullet before attendee, and to generate link accept/decline/view
local_context['color'] = color
local_context['action_id'] = self.pool.get('ir.actions.act_window').search(cr, uid, [('view_id','=',act_id)], context=context)[0]
local_context['dbname'] = cr.dbname
@ -251,69 +247,9 @@ class calendar_attendee(osv.osv):
return res
def ORI_send_mail_to_attendees(self, cr, uid, ids, email_from=tools.config.get('email_from', False), template_xmlid='crm_email_template_meeting_invitation', context=None):
"""
Send mail for event invitation to event attendees.
@param email_from: email address for user sending the mail
"""
res = False
mail_id = []
data_pool = self.pool.get('ir.model.data')
mail_pool = self.pool.get('mail.mail')
template_pool = self.pool.get('email.template')
local_context = context.copy()
color = {
'needsAction' : 'grey',
'accepted' :'green',
'tentative' :'#FFFF00',
'declined':'red'
}
if not isinstance(ids, (tuple, list)):
ids = [ids]
for attendee in self.browse(cr, uid, ids, context=context):
dummy,template_id = data_pool.get_object_reference(cr, uid, 'calendar', template_xmlid)
dummy,act_id = data_pool.get_object_reference(cr, uid, 'calendar', "view_crm_meeting_calendar")
body = template_pool.browse(cr, uid, template_id, context=context).body_html
if attendee.email and email_from:
ics_file = self.get_ics_file(cr, uid, attendee.event_id, context=context)
local_context['att_obj'] = attendee
local_context['color'] = color
local_context['action_id'] = self.pool.get('ir.actions.act_window').search(cr, uid, [('view_id','=',act_id)], context=context)[0]
local_context['dbname'] = cr.dbname
local_context['base_url'] = self.pool.get('ir.config_parameter').get_param(cr, uid, 'web.base.url', default='http://localhost:8069', context=context)
vals = template_pool.generate_email(cr, uid, template_id, attendee.event_id.id, context=local_context)
if ics_file:
vals['attachment_ids'] = [(0,0,{'name': 'invitation.ics',
'datas_fname': 'invitation.ics',
'datas': str(ics_file).encode('base64')})]
vals['model'] = None #We don't want to have the mail in the tchatter while in queue!
vals['auto_delete'] = True #We don't need mail after it has been sended !
if (vals['email_to']== attendee.partner_id.email):
vals['email_to'] = ''
vals['recipient_ids'] = [(4,attendee.partner_id.id),]
if not attendee.partner_id.opt_out:
if 'partner_to' in vals:
del vals['partner_to'] #hack between mail.mail and template.mail -> tde
mail_id.append(mail_pool.create(cr, SUPERUSER_ID, vals, context=context))
if mail_id:
try:
res = mail_pool.send(cr, uid, mail_id, context=context)
except Exception as e:
print e
return res
def onchange_user_id(self, cr, uid, ids, user_id, *args, **argv):
"""
Make entry on email and availbility on change of user_id field.
Make entry on email and availability on change of user_id field.
@param ids: list of attendee's IDs
@param user_id: changed value of User id
@return: dictionary of values which put value in email and availability fields
@ -492,15 +428,7 @@ class calendar_alarm_manager(osv.osv):
alarm_type.append('email')
if one_date - timedelta(minutes=event_maxdelta) < datetime.now() + timedelta(seconds=in_the_next_X_seconds): #if an alarm is possible for this date
print "ALARMIDS = ", event.alarm_ids
for alarm in event.alarm_ids:
print "type = ",alarm.type
print "after = ",after
print "cond 0 =", alarm.type in alarm_type
print "cond 1 = ", one_date - timedelta(minutes=alarm.duration_minutes), " < ", datetime.now() + timedelta(seconds=in_the_next_X_seconds)
#print "cond 2", one_date - timedelta(minutes=alarm.duration_minutes), " > ",datetime.strptime(after.split('.')[0], "%Y-%m-%d %H:%M:%S")
if alarm.type in alarm_type and \
one_date - timedelta(minutes=alarm.duration_minutes) < datetime.now() + timedelta(seconds=in_the_next_X_seconds) and \
(not after or one_date - timedelta(minutes=alarm.duration_minutes) > datetime.strptime(after.split('.')[0], "%Y-%m-%d %H:%M:%S")):
@ -509,10 +437,7 @@ class calendar_alarm_manager(osv.osv):
'event_id' : event.id,
'notify_at' : one_date - timedelta(minutes=alarm.duration_minutes),
}
print "ALERT ADDED : ", alert
res.append(alert)
else:
print "Not in condition..."
return res
@ -535,10 +460,12 @@ class calendar_alarm_manager(osv.osv):
cron_interval = cron.interval_number
if not cron_interval:
raise ("Cron delay for " + self._name + " not calculated :( !")
raise ("Cron delay for " + self._name + " can not be calculated :( !")
all_events = self.get_next_potential_limit_alarm(cr,uid,cron_interval,notif=False,context=context)
#TODO : look to reuse some code of get_next_event
for event in all_events: #.values()
max_delta = all_events[event]['max_duration'];
curEvent = self.pool.get('crm.meeting').browse(cr,uid,event,context=context)
@ -554,7 +481,7 @@ class calendar_alarm_manager(osv.osv):
if not bFound: #if it's the first alarm for this recurrent event
bFound = True
if bFound and not LastFound: #if the precendent event had alarm but not this one, we can stop the search fot this event
if bFound and not LastFound: #if the precedent event had an alarm but not this one, we can stop the search for this event
break
else:
in_date_format = datetime.strptime(curEvent.date, '%Y-%m-%d %H:%M:%S');
@ -565,13 +492,10 @@ class calendar_alarm_manager(osv.osv):
def get_next_event(self,cr,uid,context=None):
ajax_check_every_seconds = 300
partner = self.pool.get('res.users').browse(cr,uid,uid,context=context).partner_id;
all_notif = []
all_events = self.get_next_potential_limit_alarm(cr,uid,ajax_check_every_seconds,partner_id=partner.id,mail=False,context=context)
print all_events
for event in all_events: #.values()
max_delta = all_events[event]['max_duration'];
@ -587,7 +511,7 @@ class calendar_alarm_manager(osv.osv):
all_notif.append(self.do_notif_reminder(cr,uid,alert,context=context))
if not bFound: #if it's the first alarm for this recurrent event
bFound = True
if bFound and not LastFound: #if the precendent event had alarm but not this one, we can stop the search fot this event
if bFound and not LastFound: #if the precedent event had alarm but not this one, we can stop the search fot this event
break
else:
in_date_format = datetime.strptime(curEvent.date, '%Y-%m-%d %H:%M:%S');
@ -618,7 +542,7 @@ class calendar_alarm_manager(osv.osv):
'tentative' :'#FFFF00',
'declined':'red'
}
#TODO : look to reuse code from send_mail_to_attendees
for attendee in event.attendee_ids:
dummy,template_id = data_pool.get_object_reference(cr, uid, 'calendar', 'crm_email_template_meeting_reminder')
dummy,act_id = data_pool.get_object_reference(cr, uid, 'calendar', "view_crm_meeting_calendar")
@ -668,8 +592,8 @@ class calendar_alarm_manager(osv.osv):
'event_id' : event.id,
'title' : event.name,
'message' : message,
'timer' : delta, #Now - event_date - alaram.duration_minute
'notify_at' : alert['notify_at'].strftime("%Y-%m-%d %H:%M:%S"), #Now - event_date - alaram.duration_minute
'timer' : delta,
'notify_at' : alert['notify_at'].strftime("%Y-%m-%d %H:%M:%S"),
}
@ -815,7 +739,6 @@ class crm_meeting(osv.Model):
for ev in all_events:
rset1._exdate.append(todate(ev.recurrent_id_date))
#rset1.rdate(pytz.UTC.localize(datetime.strptime(ev.date, "%Y-%m-%d %H:%M:%S")))
return [d.astimezone(pytz.UTC) for d in rset1]
@ -942,8 +865,6 @@ class crm_meeting(osv.Model):
},
}
_columns = {
# 'create_date': fields.datetime('Creation Date', readonly=True),
# 'write_date': fields.datetime('Write Date', readonly=True),
'id': fields.integer('ID', readonly=True),
@ -964,17 +885,11 @@ class crm_meeting(osv.Model):
'class': fields.selection([('public', 'Public'), ('private', 'Private'), ('confidential', 'Public for Employees')], 'Privacy', states={'done': [('readonly', True)]}),
'location': fields.char('Location', size=264, help="Location of Event", track_visibility='onchange', states={'done': [('readonly', True)]}),
'show_as': fields.selection([('free', 'Free'), ('busy', 'Busy')], 'Show Time as', states={'done': [('readonly', True)]}),
#'state': fields.selection([('tentative', 'Uncertain'),('cancelled', 'Cancelled'),('confirmed', 'Confirmed'),],'Status', readonly=True, track_visibility='onchange'),
#FIELD FOR RECURRENCY
#'exdate': fields.text('Exception Date/Times', help="This property defines the list of date/time exceptions for a recurring calendar component."),
'rrule': fields.function(_get_rulestring, type='char', size=124, fnct_inv=_rrule_write, store=True, string='Recurrent Rule'),
'rrule_type': fields.selection([('daily', 'Day(s)'),('weekly', 'Week(s)'),('monthly', 'Month(s)'),('yearly', 'Year(s)')], 'Recurrency', states={'done': [('readonly', True)]}, help="Let the event automatically repeat at that interval"),
'recurrency': fields.boolean('Recurrent', help="Recurrent Meeting"),
'recurrent_id': fields.integer('Recurrent ID'),
'recurrent_id_date': fields.datetime('Recurrent ID date'),
#'recurrence_end_date': fields.function(_get_recurrence_end_date, type='datetime', store=True, string='Recurrence end date',priority=30),
'vtimezone': fields.selection(_tz_get, size=64, string='Timezone'),
'end_type' : fields.selection([('count', 'Number of repetitions'), ('end_date','End date')], 'Recurrence Termination'),
'interval': fields.integer('Repeat Every', help="Repeat every (Days/Week/Month/Year)"),
@ -999,7 +914,6 @@ class crm_meeting(osv.Model):
'categ_ids': fields.many2many('crm.meeting.type', 'meeting_category_rel', 'event_id', 'type_id', 'Tags'),
'attendee_ids': fields.one2many('calendar.attendee', 'event_id', 'Attendees', ondelete='cascade'),
#'attendee_ids': fields.many2many('calendar.attendee', 'crmmeeting_attendee_rel', 'crmmeeting_id', 'attendee_id', 'Attendees', ondelete='cascade'),
'partner_ids': fields.many2many('res.partner', string='Attendees', states={'done': [('readonly', True)]}),
'alarm_ids': fields.many2many('calendar.alarm', string='Reminders',ondelete="restrict"),
}
@ -1050,11 +964,9 @@ class crm_meeting(osv.Model):
start = datetime.strptime(start_date.split(' ')[0].split('T')[0], "%Y-%m-%d")
duration = 24.0
value['duration'] = duration
# change start_date's time to 00:00:00 in the user's timezone
user = self.pool.get('res.users').browse(cr, uid, uid)
tz = pytz.timezone(user.tz) if user.tz else pytz.utc
start = pytz.utc.localize(start).astimezone(tz) # convert start in user's timezone
#start = start.replace(hour=0, minute=0, second=0) # remove time
start = start.astimezone(pytz.utc) # convert start back to utc
value['date'] = start.strftime("%Y-%m-%d") + ' 00:00:00'
else:
@ -1095,7 +1007,6 @@ class crm_meeting(osv.Model):
attendees[att.partner_id.id] = True
new_attendees = []
new_att_partner_ids = []
# mail_to = ""
for partner in event.partner_ids:
if partner.id in attendees:
continue
@ -1111,16 +1022,12 @@ class crm_meeting(osv.Model):
values['state']='accepted'
att_id = self.pool.get('calendar.attendee').create(cr, uid,values, context=context)
# if partner.email:
# mail_to = mail_to + " " + partner.email
new_attendees.append(att_id)
new_att_partner_ids.append(partner.id)
if not current_user.email or current_user.email != partner.email :
mail_from = current_user.email or tools.config.get('email_from', False)
print "Send mail... from ",mail_from, " to ",att_id
if self.pool.get('calendar.attendee')._send_mail_to_attendees(cr, uid, att_id, email_from = mail_from, context=context):
self.message_post(cr, uid, event.id, body=_("An invitation email has been sent to attendee %s") % (partner.name,),subtype="calendar.subtype_invitation", context=context)
@ -1142,7 +1049,7 @@ class crm_meeting(osv.Model):
attendee_ids_to_remove =self.pool.get("calendar.attendee").search(cr,uid,[('partner_id.id','in',partner_ids_to_remove),('event_id.id','=',event.id)],context=context)
if attendee_ids_to_remove:
self.pool.get("calendar.attendee").unlink(cr, uid, attendee_ids_to_remove, context)
## NEED TO UNSUBSCRIBE ?
# NEED TO UNSUBSCRIBE ?
res[event.id] = {
'new_attendee_ids' : new_attendees ,
@ -1169,8 +1076,6 @@ class crm_meeting(osv.Model):
if not ev.recurrency or not ev.rrule:
result.append(ev.id)
continue
# event_date = datetime.strptime(data['date'], "%Y-%m-%d %H:%M:%S")
# event_date = pytz.UTC.localize(event_date)
rdates = self.get_recurrent_date_by_event(cr, uid, ev, context=context)
@ -1218,7 +1123,6 @@ class crm_meeting(osv.Model):
# idval = real_id2calendar_id(data['id'], r_date.strftime("%Y-%m-%d %H:%M:%S"))
idval = '%d-%s' % (ev.id, r_date.strftime("%Y%m%d%H%M%S"))
result.append(idval)
if isinstance(select, (str, int, long)):
return ids and ids[0] or False
@ -1336,21 +1240,6 @@ class crm_meeting(osv.Model):
return data
#def _get_data(self, cr, uid, id, context=None):
# return self.read(cr, uid, id,['date', 'date_deadline'])
# def need_to_update(self, event_id, vals):
# split_id = str(event_id).split("-")
# if len(split_id) < 2:
# return False
# else:
# date_start = vals.get('date', '')
# try:
# date_start = datetime.strptime(date_start, '%Y-%m-%d %H:%M:%S').strftime("%Y%m%d%H%M%S")
# return date_start == split_id[1]
# except Exception:
# return True
def message_get_subscription_data(self, cr, uid, ids, user_pid=None, context=None):
res = {}
for virtual_id in ids:
@ -1373,7 +1262,6 @@ class crm_meeting(osv.Model):
return res
def check_partners_email(self, cr, uid, partner_ids, context=None):
##TODO : REFACTOR !
""" Verify that selected partner_ids have an email_address defined.
Otherwise throw a warning. """
partner_wo_email_lst = []
@ -1390,6 +1278,7 @@ class crm_meeting(osv.Model):
'message': warning_msg,
}
}
# ----------------------------------------
# OpenChatter
# ----------------------------------------
@ -1460,12 +1349,6 @@ class crm_meeting(osv.Model):
if arg[0] in ('date', unicode('date')) and arg[1]==">=":
if context.get('virtual_id', True):
new_args += ['|','&',('recurrency','=',1),('end_date', arg[1], arg[2])]
# new_args += ['|','&',('recurrency','=',1),('date_deadline', arg[1], arg[2])]
elif arg[0] in ('date', unicode('date')):
if context.get('virtual_id', True):
print ''
#new_args += ['|','&',('recurrency','=',1),('end_date', arg[1], arg[2])]
# new_args += ['|','&',('recurrency','=',1),('date_deadline', arg[1], arg[2])]
elif arg[0] == "id":
new_id = get_real_ids(arg[2])
new_arg = (arg[0], arg[1], new_id)
@ -1543,10 +1426,6 @@ class crm_meeting(osv.Model):
date_new = event_id.split('-')[1]
date_new = time.strftime("%Y%m%dT%H%M%SZ", time.strptime(date_new, "%Y%m%d%H%M%S"))
#exdate = (data['exdate'] and (data['exdate'] + ',') or '') + date_new
#res = super(crm_meeting, self).write(cr, uid, [real_event_id], {'exdate': exdate})
context.update({'active_id': new_id, 'active_ids': [new_id]})
continue
@ -1576,8 +1455,7 @@ class crm_meeting(osv.Model):
current_user = self.pool.get('res.users').browse(cr, uid, uid, context=context)
if self.pool.get('calendar.attendee')._send_mail_to_attendees(cr, uid, mail_to_ids, template_xmlid='crm_email_template_meeting_changedate',email_from=current_user.email, context=context):
self.message_post(cr, uid, the_id, body=_("A email has been send to specify that the date has been changed !"),subtype="calendar.subtype_invitation", context=context)
else:
print 'Send mail return false'
return res or True and False
def create(self, cr, uid, vals, context=None):
@ -1620,12 +1498,11 @@ class crm_meeting(osv.Model):
context = {}
fields2 = fields and fields[:] or None
EXTRAFIELDS = ('class','user_id','duration', 'date','rrule', 'vtimezone')#, 'exdate')
EXTRAFIELDS = ('class','user_id','duration', 'date','rrule', 'vtimezone')
for f in EXTRAFIELDS:
if fields and (f not in fields):
fields2.append(f)
# FIXME This whole id mangling has to go!
if isinstance(ids, (str, int, long)):
select = [ids]
else:
@ -1644,9 +1521,6 @@ class crm_meeting(osv.Model):
res = real_data[real_id].copy()
ls = calendar_id2real_id(calendar_id, with_date=res and res.get('duration', 0) or 0)
if not isinstance(ls, (str, int, long)) and len(ls) >= 2:
#recurrent_dates = [d.strftime("%Y-%m-%d %H:%M:%S") for d in get_recurrent_dates(res['rrule'], res['date'], res['exdate'],res['vtimezone'], context=context)]
#if not (ls[1] in recurrent_dates or ls[1] in res['exdate']): #when update a recurrent event
res['date'] = ls[1]
res['date_deadline'] = ls[2]
res['id'] = calendar_id
@ -1686,7 +1560,6 @@ class crm_meeting(osv.Model):
domain = ['|', ('id', '=', parent_event_id), ('recurrent_id', '=', parent_event_id)]
count = self.search(cr, uid, domain, context=context)
print "Count = ",count
return len(count)
def get_linked_ids(self,cr,uid,event_id,show_unactive=True,context=None):
@ -1702,21 +1575,8 @@ class crm_meeting(osv.Model):
domain += ['|',('active', '=', True), ('active', '=', False)]
return super(crm_meeting, self).search(cr, uid, domain, context=context)
# def delete(self,cr,uid,ids,context=None):
# if not isinstance(ids, list):
# ids = [ids]
# all_ids = []
# for id_to_unlink in ids:
# all_ids += self.get_linked_ids(cr, uid, id_to_unlink, context=context)
# print "in deleTe functIon === ids : %s, all_ids : %s" % (ids,all_ids)
# all_ids = list(set(all_ids))
# res = super(crm_meeting, self).unlink(cr, uid, all_ids, context=context)
# return all_ids
def unlink(self, cr, uid, ids,unlink_level=0, context=None):
print "IN UNLINK !!!"
if not isinstance(ids, list):
ids = [ids]
res = False

View File

@ -13,8 +13,8 @@
<field name="email">another_partner@example.com</field>
</record>
<record id="res_user_another" model="res.users">
<field name="name" >Another User</field>
<field name="login" >Another Login</field>
<field name="name" >Second Demo User</field>
<field name="login" >Second Demo User</field>
<field name="partner_id" ref="res_partner_another"/>
<field name="company_id" ref="base.main_company" />
</record>

View File

@ -308,7 +308,7 @@
<menuitem id="menu_calendar_configuration" name="Calendar" parent="base.menu_custom" groups="base.group_no_one"/>
<menuitem id="menu_crm_meeting_type" parent="menu_calendar_configuration" action="action_crm_meeting_type" groups="base.group_no_one"/>
<!-- called in js from '/js/base_calendar.js' -->
<record id="action_crm_meeting_notify" model="ir.actions.act_window">
<field name="name">Meetings</field>
<field name="res_model">crm.meeting</field>

View File

@ -19,14 +19,13 @@ class meeting_invitation(http.Controller):
if not attendee_id:
# if token is not match
error_message = """Invalid Invitation Token."""
elif request.session.uid and request.session.login != 'anonymous':
# if valid session but user is not match
attendee = attendee_pool.browse(cr, openerp.SUPERUSER_ID, attendee_id[0])
user = registry.get('res.users').browse(cr, openerp.SUPERUSER_ID, request.session.uid)
if attendee.partner_id.user_id.id != user.id:
#error_message = """Invitation cannot be forwarded via email. This event/meeting belongs to %s and you are logged in as %s. Please ask organizer to add you.""" % (attendee.email, user.email)
#error_message = "attendee.partner_id.user_id.id != user.id: ", attendee.partner_id.user_id.id ," VS ", user.id
print "ErRRRRRRRRRROOOOOOOrrrrrr"
# elif request.session.uid and request.session.login != 'anonymous':
# # if valid session but user is not match
# attendee = attendee_pool.browse(cr, openerp.SUPERUSER_ID, attendee_id[0])
# user = registry.get('res.users').browse(cr, openerp.SUPERUSER_ID, request.session.uid)
# if attendee.partner_id.user_id.id != user.id:
# error_message = """Invitation cannot be forwarded via email. This event/meeting belongs to %s and you are logged in as %s. Please ask organizer to add you.""" % (attendee.email, user.email)
if error_message:
raise BadRequest(error_message)
return True
@ -74,7 +73,8 @@ class meeting_invitation(http.Controller):
'modules': simplejson.dumps(webmain.module_boot(db)),
'init': "s.calendar.event('%s', '%s', '%s', '%s' , '%s');" % (db, action, id, 'form', json.dumps(attendee_data)),
}
# Function used, in RPC to check every 5 minutes, if notification to do for an event or not
@http.route('/calendar/NextNotify', type='json', auth="none")
def NextNotify(self, type=''):
registry = openerp.modules.registry.RegistryManager.get(request.session.db)

View File

@ -1,23 +0,0 @@
.. _calendar_attendee:
calendar.attendee:
=================
Fields
++++++
- ``access_token`` :
unique value(token) for every new attendee.
Methods
+++++++
- ``do_accept``:
REF : post message in chatter when attendee accepted an invitation.
- ``do_decline``:
REF : post message in chatter when attendee declined an invitation.
calendar.event:
===============
Methods
+++++++
- ``new_invitation_token``:
generate a unique token for every new attendee.

View File

@ -1,29 +0,0 @@
.. _changelog:
Changelog
=========
Email Template of Meeting Invitation:
+++++++++++++++++++++++++++++++++++++
- remove static code of HTML design of email of meeting invitation
- added new better layout of email of meeting invitation using MAKO Template.
Web controller:
+++++++++++++++
- ``accept`` :
handle request ('meeting_invitation/accept') ,when accepted an invitation it change the status of invitation as accepted , user do need to login in system.
- ``declined``:
handle request ('meeting_invitation/decline') ,when declined an invitation it change the status of invitation as declined , user do need to login in system.
- ``view``:
handle request ('meeting_invitation/view') ,when user click on accept,declined link button , it redirect user to form view if user is already login and if user has not been login it redirect to a simple qweb template to inform user has accepted/declined a meeting ,if user click on directly in openerp it redirect user to a meeting calendar view , if user is not login then it redirect to a qweb template.
- ``check_security``:
check token is valid and user is not allow to accept/decline invitation mail of other user from email template URL.
Web Widget:
+++++++++++
- ``Field Many2Many_invite``(widget):
display a status button in left side of every invited attendees of meeting , in many2many.
Qweb Template:
++++++++++++++
- added template ,to directly allow any invited user to accept , decline a meeting , if user do not need to login in the system to accept or decline an invitation.

View File

@ -1,38 +0,0 @@
.. _crm_meeting:
Fields:
+++++++
- ``is_attendee`` :
function field , that defined whether loged in user is attendee or not.
- ``attendee_status``:
function field , that defined login user status, either accepted, declined or needs-action.
- ``event_time``:
function field, defined an event_time in user's tz.
Methods:
++++++++
- ``_find_user_attendee``:
return attendee if attendee is internal user else false.
- ``_compute_time``:
compute a time from date_start and duration with user's tz.
- ``search``:
search a current user's meetings
- ``do_accept/do_decline``:
trigger when ,user accept/decline from the meeting form view.
- ``get_attendee``:
get detail of attendees meeting.
- ``get_interval``:
call from email template that return formate of date, as per value pass from the email template.
views:
++++++
- ``do_accept``:
Accept button in meeting form view that is allow a user to accept a meeting ,that is visible to only attendee and if attendee state is other than accepted.
- ``do_decline``:
Decline button in meeting form view that is allow a user to accept a meeting ,that is visible to only attendee and if attendee state is other than declined.
- ``chatter(message_ids)``:
show a log of meeting.
security:
+++++++++
- added record rule to restrict an user to show personal invitation on meeting , so user can't change other's status , from invitation tab.

View File

@ -2,25 +2,20 @@
width : 13px;
height : 13px;
margin-bottom : -4px;
display : inline-block;
display : inline-block;
}
.openerp .needsAction , .tentative,.text-core .text-tag .custom-edit, .text-core .text-tag .tentative {
background : url(/web/static/src/img/icons/gtk-normal.png) no-repeat;
background-size : 11px 11px;
background-size : 11px 11px;
}
.openerp .accepted , .text-core .text-tag .accepted {
background : url(/web/static/src/img/icons/gtk-yes.png) no-repeat;
background-size : 11px 11px;
background-size : 11px 11px;
}
.openerp .declined , .text-core .text-tag .declined {
background : url(/web/static/src/img/icons/gtk-no.png) no-repeat;
background-size : 11px 11px;
background-size : 11px 11px;
}
.openerp a.oe_invitation {
cursor:default !important;
}
@ -71,11 +66,9 @@
height: 30px;
width : 100px;
}
span.no-wrap {
white-space:nowrap
}
.cal_tab {
margin: 20 0 20 0;
}

View File

@ -144,16 +144,18 @@ class google_service(osv.osv_memory):
def _do_request(self,cr,uid,uri,params={},headers={},type='POST', context=None):
res = False
# print "#########################################"
# print "### URI : %s ###" % (uri)
# print "### HEADERS : %s ###" % (headers)
# print "### METHOD : %s ###" % (type)
# if type=='GET':
# print "### PARAMS : %s ###" % urllib.urlencode(params)
# else:
# print "### PARAMS : %s ###" % (params)
# print "#########################################"
######################
### FOR DEBUG ###
######################
# print "#########################################"
# print "### URI : %s ###" % (uri)
# print "### HEADERS : %s ###" % (headers)
# print "### METHOD : %s ###" % (type)
# if type=='GET':
# print "### PARAMS : %s ###" % urllib.urlencode(params)
# else:
# print "### PARAMS : %s ###" % (params)
# print "#########################################"
try:
if type.upper() == 'GET' or type.upper() == 'DELETE':

View File

@ -164,9 +164,7 @@ class google_calendar(osv.osv):
data['access_token'] = self.get_token(cr,uid,context)
response = gs_pool._do_request(cr, uid, url, data, headers, type='GET', context=context)
#TO_CHECK : , if http fail, no event, do DELETE ?
return response
def update_recurrent_event_exclu(self, cr, uid,instance_id,event_ori_google_id,event_new, context=None):
@ -371,7 +369,7 @@ class google_calendar(osv.osv):
all_new_event_from_google = all_event_from_google.copy()
# Select all events from OpenERP which have been already synchronized in gmail
#events_ids = crm_meeting.search(cr, uid,[('partner_ids', 'in', myPartnerID),('google_internal_event_id', '!=', False),('oe_update_date','!=', False)],order='google_internal_event_id',context=context_novirtual)
# events_ids = crm_meeting.search(cr, uid,[('partner_ids', 'in', myPartnerID),('google_internal_event_id', '!=', False),('oe_update_date','!=', False)],order='google_internal_event_id',context=context_novirtual)
my_att_ids = att_obj.search(cr, uid,[('partner_id', '=', myPartnerID),('google_internal_event_id', '!=', False)], context=context_novirtual)
event_to_synchronize = {}
for att in att_obj.browse(cr,uid,my_att_ids,context=context):
@ -508,25 +506,22 @@ class google_calendar(osv.osv):
event_to_synchronize[base_event] = sorted(event_to_synchronize[base_event].iteritems(),key=operator.itemgetter(0))
for current_event in event_to_synchronize[base_event]:
cr.commit()
event = current_event[1]
event = current_event[1]
#############
### DEBUG ###
#############
if event['td_action'] and event['td_action'] != 'None':
print " Real Event %s (%s)" % (current_event[0],event['OE_event_id'])
print " Found OE:%5s vs GG: %5s" % (event['OE_found'],event['GG_found'])
print " Recurrence OE:%5s vs GG: %5s" % (event['OE_isRecurrence'],event['GG_isRecurrence'])
print " Instance OE:%5s vs GG: %5s" % (event['OE_isInstance'],event['GG_isInstance'])
print " Synchro OE: %10s " % (event['OE_synchro'])
print " Update OE: %10s " % (event['OE_update'])
print " Update GG: %10s " % (event['GG_update'])
print " Status OE:%5s vs GG: %5s" % (event['OE_status'],event['GG_status'])
print " Action %s" % (event['td_action'])
print " Source %s" % (event['td_source'])
print " comment %s" % (event['td_comment'])
# if event['td_action'] and event['td_action'] != 'None':
# print " Real Event %s (%s)" % (current_event[0],event['OE_event_id'])
# print " Found OE:%5s vs GG: %5s" % (event['OE_found'],event['GG_found'])
# print " Recurrence OE:%5s vs GG: %5s" % (event['OE_isRecurrence'],event['GG_isRecurrence'])
# print " Instance OE:%5s vs GG: %5s" % (event['OE_isInstance'],event['GG_isInstance'])
# print " Synchro OE: %10s " % (event['OE_synchro'])
# print " Update OE: %10s " % (event['OE_update'])
# print " Update GG: %10s " % (event['GG_update'])
# print " Status OE:%5s vs GG: %5s" % (event['OE_status'],event['GG_status'])
# print " Action %s" % (event['td_action'])
# print " Source %s" % (event['td_source'])
# print " comment %s" % (event['td_comment'])
context['curr_attendee'] = event.get('OE_attendee_id',False)
@ -549,7 +544,7 @@ class google_calendar(osv.osv):
self.pool.get('calendar.attendee').write(cr,uid,attendee_record_id, {'oe_synchro_date':meeting.oe_update_date,'google_internal_event_id': event['GG_event']['id']},context=context_tmp)
elif actSrc == 'OE':
raise "Should be never here, creation for OE is done before update !"
#Add to batch
#TODO Add to batch
elif actToDo == 'UPDATE':
if actSrc == 'GG':
self.update_from_google(cr, uid, event['OE_event'], event['GG_event'], 'write', context)
@ -701,21 +696,14 @@ class res_users(osv.osv):
class crm_meeting(osv.osv):
_inherit = "crm.meeting"
#
# def create(self, cr, uid, vals, context=None):
# if context is None:
# context = {}
# context_tmp = context.copy()
# context_tmp['NewMeeting'] = True
# return super(crm_meeting, self).create(cr, uid, vals, context=context_tmp)
def write(self, cr, uid, ids, vals, context=None):
if context is None:
context= {}
sync_fields = set(['name', 'description', 'date', 'date_closed', 'date_deadline', 'attendee_ids', 'location', 'class'])
if (set(vals.keys()) & sync_fields) and 'oe_update_date' not in vals.keys() and 'NewMeeting' not in context:
vals['oe_update_date'] = datetime.now()
return super(crm_meeting, self).write(cr, uid, ids, vals, context=context)
def copy(self, cr, uid, id, default=None, context=None):
@ -733,7 +721,7 @@ class crm_meeting(osv.osv):
'oe_update_date': fields.datetime('OpenERP Update Date'),
}
# If attendees are updated, we need to specify that next synchro need an action
class calendar_attendee(osv.osv):
_inherit = 'calendar.attendee'
@ -751,7 +739,8 @@ class calendar_attendee(osv.osv):
for id in ids:
ref = vals.get('event_id',self.browse(cr,uid,id,context=context).event_id.id)
#No update the date when attendee come from update_from_google
# If attendees are updated, we need to specify that next synchro need an action
# Except if come from an update_from_google
if not context.get('curr_attendee', False) and not context.get('NewMeeting', False):
self.pool.get('crm.meeting').write(cr, uid, ref, {'oe_update_date':datetime.now()},context)