|
from odoo import models, fields, api
|
|
from odoo.exceptions import UserError, ValidationError,Warning
|
|
from psycopg2 import sql, DatabaseError
|
|
|
|
from werkzeug import utils
|
|
|
|
|
|
import os.path
|
|
from google.oauth2 import service_account
|
|
from googleapiclient.discovery import build
|
|
from datetime import datetime, timedelta
|
|
import json
|
|
|
|
# IF YOU MODIFY THE SCOPE DELETE THE TOKEN.TXT FILE
|
|
SCOPES = ['https://www.googleapis.com/auth/calendar']
|
|
SERVICE_ACCOUNT_FILE = '/usr/lib/python3/dist-packages/odoo/kalachakra_module/kalachakra/models/creds.json' # You should make it an environment variable
|
|
SUBJECT = 'kalachakra-srv@kalachakra-351613.iam.gserviceaccount.com'
|
|
|
|
|
|
class EventTagCategory(models.Model):
|
|
_inherit = "event.tag.category"
|
|
_description = 'Event tag category'
|
|
|
|
calendar_id=fields.Char('google calendar id')
|
|
|
|
class KalachakraEvent(models.Model):
|
|
_inherit = "event.event"
|
|
_description = 'Event'
|
|
|
|
calendar_id=fields.Char('calendar id')
|
|
calendar_event_id=fields.Char('event id')
|
|
free_participation=fields.Boolean('Free participation')
|
|
participation_product_id=fields.Many2one('product.product',string='participation product')
|
|
participation_standard_price=fields.Monetary('Standard Price',currency_field='currency_id')
|
|
participation_member_price=fields.Monetary('Member price',currency_field='currency_id')
|
|
participation_super_member_price=fields.Monetary('Super member price',currency_field='currency_id')
|
|
subscription_product_id=fields.Many2one('product.product',string='subscription product')
|
|
subscription_standard_price=fields.Monetary('Standard Price',currency_field='currency_id')
|
|
subscription_member_price=fields.Monetary('Member price',currency_field='currency_id')
|
|
subscription_super_member_price=fields.Monetary('Super member price',currency_field='currency_id')
|
|
|
|
recurring_event=fields.Boolean('Recurring event')
|
|
recurring_event_newsletter_id=fields.Many2one('mailing.list',string='Recurring event Newsletter')
|
|
online_event=fields.Boolean('Online event')
|
|
online_link=fields.Char('link')
|
|
online_id=fields.Char('id')
|
|
online_password=fields.Char('password')
|
|
duration=fields.Integer('duration', compute="_compute_duration")
|
|
|
|
def _compute_duration(self):
|
|
for rec in self:
|
|
duration = rec.date_end-rec.date_begin
|
|
rec.duration = duration.days
|
|
|
|
|
|
booking_event = fields.Boolean(string="Booking event", tracking=True)
|
|
question_ids=fields.One2many(
|
|
'event.question',
|
|
'event_id',
|
|
string='Questions'
|
|
|
|
)
|
|
booking_option_ids=fields.One2many('booking.option','event_id','booking options')
|
|
booking_price=fields.Monetary('Price',currency_field='currency_id')
|
|
booking_member_price=fields.Monetary('Member price',currency_field='currency_id')
|
|
booking_super_member_price=fields.Monetary('Super member price',currency_field='currency_id')
|
|
booking_down_payment=fields.Monetary('Down payment',currency_field='currency_id')
|
|
booking_product_id=fields.Many2one('product.product',string='booking product',domain="[('booking_product','=','True')]")
|
|
|
|
@api.onchange('event_type_id')
|
|
def onchange_state(self):
|
|
self.booking_event=self.event_type_id.booking_event
|
|
|
|
booking_option=self.env['booking.option'].search([('event_type_id','=',int(self.event_type_id))])
|
|
if booking_option:
|
|
#on supprime les options existantes:
|
|
self.booking_option_ids=False
|
|
|
|
#on rappatrie les options du modèle
|
|
for option in booking_option:
|
|
vals={}
|
|
vals['event_id']=self.id
|
|
vals['booking_option_id']=option.booking_option_id
|
|
vals['booking_option_price']=option.booking_option_price
|
|
vals['currency_id']=option.currency_id
|
|
self.booking_option_ids = [(0, 0, vals)]
|
|
|
|
|
|
if self.event_type_id.booking_questionnaire_id:
|
|
|
|
#on supprime les question existantes:
|
|
self.question_ids=False
|
|
questions=self.env['booking.question'].search([('questionnaire_id','=',int(self.event_type_id.booking_questionnaire_id))])
|
|
#on rappatrie les question
|
|
for question in questions:
|
|
vals={}
|
|
vals['event_id']=self.id
|
|
vals['sequence']=question.sequence
|
|
vals['question']=question.question
|
|
|
|
self.question_ids = [(0, 0, vals)]
|
|
|
|
|
|
@api.model
|
|
def _default_currency(self):
|
|
company = self.env['res.company']._company_default_get(
|
|
'event.event')
|
|
return company.currency_id
|
|
|
|
currency_id = fields.Many2one(
|
|
'res.currency',
|
|
string='Currency',
|
|
required=True,
|
|
track_visibility='onchange',
|
|
ondelete='restrict',
|
|
default=_default_currency
|
|
)
|
|
|
|
|
|
def add_event_to_google_agenda(self):
|
|
|
|
|
|
credentials = service_account.Credentials.from_service_account_file(SERVICE_ACCOUNT_FILE, scopes=SCOPES)
|
|
delegated_credentials = credentials.with_subject(SUBJECT)
|
|
service = build('calendar', 'v3', credentials=delegated_credentials)
|
|
|
|
d = datetime.utcnow().date()
|
|
tomorrow = datetime(d.year, d.month, d.day, 10)+timedelta(days=1)
|
|
start = tomorrow.isoformat()
|
|
end = (tomorrow + timedelta(hours=1)).isoformat()
|
|
|
|
start=self.date_begin.isoformat()
|
|
end=self.date_end.isoformat()
|
|
diff_date=self.date_end-self.date_begin
|
|
if diff_date.days>0:
|
|
date_param=self.date_begin.strftime('%Y-%m-%d')+'-'+self.date_end.strftime('%Y-%m-%d')+'-'+str(self.id)
|
|
else:
|
|
date_param=self.date_begin.strftime('%Y-%m-%d')+'-'+str(self.id)
|
|
|
|
name_param=self.name.replace(' ','-')
|
|
name_param=name_param.replace('\'','-')
|
|
description='<a href="'+self.env['ir.config_parameter'].get_param('web.base.url')+'/event/'+name_param+'-'+date_param+'/register">Click here to register</a>'
|
|
#str(self.date_begin.year())+'-'+str(self.date_begin.month())+'-'+self.date_begin.day()
|
|
|
|
body={"summary": self.name,
|
|
"description": description,
|
|
"start": {"dateTime": start, "timeZone": 'Europe/Paris'},
|
|
"end": {"dateTime": end, "timeZone": 'Europe/Paris'},
|
|
}
|
|
|
|
#recherche de l'id calendar lié à l'étiquette de l'événément
|
|
calendar_id=self.tag_ids.category_id.calendar_id
|
|
if calendar_id:
|
|
event = service.events().insert(calendarId=calendar_id, body=body).execute()
|
|
|
|
self.calendar_event_id=event['id']
|
|
self.calendar_id=calendar_id
|
|
else:
|
|
raise Warning('no calendar id, please check configuration tags')
|
|
|
|
def remove_event_to_google_agenda(self):
|
|
credentials = service_account.Credentials.from_service_account_file(SERVICE_ACCOUNT_FILE, scopes=SCOPES)
|
|
delegated_credentials = credentials.with_subject(SUBJECT)
|
|
service = build('calendar', 'v3', credentials=delegated_credentials)
|
|
|
|
|
|
event = service.events().get(calendarId=self.calendar_id, eventId=self.calendar_event_id).execute()
|
|
#raise Warning(json.dumps(event, indent = 4) )
|
|
if event['status'] != "cancelled" :
|
|
service.events().delete(calendarId=self.calendar_id, eventId=self.calendar_event_id).execute()
|
|
|
|
self.calendar_event_id=False
|
|
self.calendar_id=False
|
|
|
|
|
|
|