odoo/addons/hr_timesheet_ical/wizard/wizard_ical.py

131 lines
5.1 KiB
Python

import re
import urllib2
import datetime
from schoolbell.calendar import icalendar
import wizard
import pooler
CALENDAR_URL = 'http://127.0.0.1:7180'
def _employee_get(self,cr,uid,context={}):
ids = self.pool.get('hr.employee').search(cr, uid, [('user_id','=', uid)])
if ids:
return ids[0]
return False
class RequestHandler(object):
def __init__(self):
self.auth_handler = urllib2.HTTPBasicAuthHandler()
self.opener = urllib2.build_opener(self.auth_handler)
def addAuthentication(self, username, password):
self.auth_handler.add_password('zope', CALENDAR_URL, username, password)
def get_url(url, auth_data={}):
req = RequestHandler()
if auth_data:
req.addAuthentication(auth_data['user'], auth_data['pass'])
return req.opener.open(url).read()
def _start_date(uid, y, z):
today = datetime.date.today()
monday = today - datetime.timedelta(days=today.weekday())
return monday.strftime('%Y-%m-%d')
def _end_date(uid, y, z):
today = datetime.date.today()
friday = today + datetime.timedelta(days=4-today.weekday())
return friday.strftime('%Y-%m-%d')
ical_form = """<?xml version="1.0" ?>
<form string="Chose the dates">
<field name="startdate" />
<field name="enddate" />
<field name="user_id" colspan="3"/>
</form>"""
ical_fields = {
'startdate' : dict(string='Start date', type='date', required=True, default=_start_date),
'enddate' : dict(string='End date', type='date', required=True, default=_end_date),
'user_id' : dict(string=u'User', type='many2one', relation='res.users', required=True, default=lambda x,y,z:x),
}
success_form = """<?xml version="1.0" ?>
<form string="Import successful">
<separator string="Import successful" />
</form>"""
success_fields = {}
project_re = re.compile(r"^ *\[?(\d{1,4}\.?\d{0,3})\]? *(.*)", re.UNICODE)
class wizard_import_icalendar(wizard.interface):
def import_ical(self, cr, uid, data, context):
employee_id = _employee_get(pooler.get_pool(cr.dbname).get('hr.attendance'), cr, data['form']['user_id'])
if not employee_id:
raise wizard.except_wizard('No employee found for the user', 'Login ID: %s' % data['form']['user_id'])
first, end = [datetime.date(*(map(int, x.split('-')))) for x in [data['form']['startdate'], data['form']['enddate']]]
end = min(end, datetime.date.today())
try:
user_obj = pooler.get_pool(cr.dbname).get('res.users')
user = user_obj.read(cr, uid, [data['form']['user_id']])
events = icalendar.read_icalendar(get_url('%s/persons/%s/calendar.ics' % (CALENDAR_URL, user[0]['login']), {'user': 'manager', 'pass': 'schoolbell'}))
except urllib2.HTTPError, e:
raise wizard.except_wizard('Erreur HTTP', '%s - %s' % (e.code, e.msg))
except IndexError:
raise wizard.except_wizard('No user login found', 'Login ID: %s' % data['form']['user_id'])
event_obj = pooler.get_pool(cr.dbname).get('res.partner.event')
timesheet_line_obj = pooler.get_pool(cr.dbname).get('hr.analytic.timesheet')
analytic_account_obj = pooler.get_pool(cr.dbname).get('account.analytic.account')
for event in [e for e in events if first <= e.dtstart.date() <= end]:
project_search = project_re.search(event.title)
if not project_search:
continue
else:
project_code, summary = project_search.groups()
account_id = analytic_account_obj.name_search(cr, uid, project_code)
if account_id:
account_id = account_id[0][0]
timesheet_line_id = timesheet_line_obj.search(cr, uid, [('event_ical_id', '=', event.unique_id)])
if not timesheet_line_id:
unit_id = timesheet_line_obj.default_get(cr, uid, ['product_uom_id','product_id'], {'user_id' : data['form']['user_id']})
amount = timesheet_line_obj.on_change_unit_amount(cr, uid, [], unit_id['product_id'], event.duration.seconds / 3600.0, unit_id['product_uom_id'])
if amount:
amount = amount['value']['amount']
timesheet_line_obj.create(cr, uid, {'name' : summary, 'date' : event.dtstart.strftime('%Y-%m-%d'), 'unit_amount' : event.duration.seconds / 3600.0,
'user_id' :vdata['form']['user_id'], 'account_id' : account_id, 'amount' : amount,
'event_ical_id' : event.unique_id},
{'user_id' : data['form']['user_id']})
event_id = event_obj.search(cr, uid, [('event_ical_id', '=', event.unique_id)])
if not event_id:
account = pooler.get_pool(cr.dbname).get('account.analytic.account').read(cr, uid, [account_id], ['partner_id', 'contact_id'])
if account:
event_obj.create(cr, uid,
{'name' : summary,
'description' : event.description,
'partner_id' : account[0]['partner_id'][0],
'project_id' : account_id,
'user_id' : data['form']['user_id'],
'date' : event.dtstart.strftime('%Y-%m-%d %H:%M'),
'event_ical_id' : event.unique_id})
return {}
states = {
'init' : {
'actions' : [],
'result' : {'type' : 'form', 'arch' : ical_form, 'fields' : ical_fields, 'state' : (('import', 'Import'), ('end', 'Cancel'))}
},
'import' : {
'actions' : [import_ical],
'result' : {'type' : 'form', 'arch' : success_form, 'fields' : success_fields, 'state' : (('end', 'Quit'),)}
},
}
wizard_import_icalendar('hr.ical_import')