gestion des demandes d'évolution pour le centre kalachakra non géré dans les module booking et opendons
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

179 lines
7.3 KiB

from odoo import models, fields, api
from odoo.exceptions import UserError, ValidationError,Warning
from psycopg2 import sql, DatabaseError
from pytz import timezone
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)
start=self.date_begin.astimezone(timezone('Europe/Paris'))
end=self.date_end.astimezone(timezone('Europe/Paris'))
start=start.isoformat()
end=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
for tag in self.tag_ids:
if tag.category_id.calendar_id:
calendar_id=tag.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
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