@ -1,4 +1,4 @@
from odoo import models , fields , api
from odoo import models , fields , api , _
from odoo.exceptions import UserError , ValidationError , Warning
from psycopg2 import sql , DatabaseError
from pytz import timezone
@ -47,6 +47,86 @@ class KalachakraEvent(models.Model):
online_id = fields . Char ( ' id ' )
online_password = fields . Char ( ' password ' )
duration = fields . Integer ( ' duration ' , compute = " _compute_duration " )
frequency = fields . Selection ( string = ' Frequency ' , selection = [ ( ' daily ' , ' Daily ' ) , ( ' weekly ' , ' Weekly ' ) ] )
weekly_day = fields . Selection ( string = ' Weekly day ' , selection = [ ( ' monday ' , ' Monday ' ) , ( ' tuesday ' , ' Tuesday ' ) , ( ' wednesday ' , ' Wednesday ' ) , ( ' thursday ' , ' Thursday ' ) , ( ' friday ' , ' Friday ' ) , ( ' saturday ' , ' Saturday ' ) , ( ' sunday ' , ' Sunday ' ) ] )
end_generation_date = fields . Datetime ( ' End generation date ' )
generated_events = fields . Boolean ( ' generated_ events ' , compute = ' _compute_generated_events ' )
#for event generated from a parent event
parent_event_id = fields . Many2one ( ' event.event ' , string = ' parent event ' , readonly = True )
def _compute_generated_events ( self ) :
for rec in self :
rec . generated_events = False
evt = rec . env [ ' event.event ' ] . search ( [ ( ' parent_event_id ' , ' = ' , int ( rec . id ) ) ] )
if evt : rec . generated_events = True
def remove_generated_events ( self ) :
evt = self . env [ ' event.event ' ] . search ( [ ( ' parent_event_id ' , ' = ' , int ( self . id ) ) ] )
if evt :
for e in evt :
e . remove_event_from_google_agenda ( )
e . unlink ( )
def generate_events ( self ) :
for rec in self :
if rec . duration > 1 : raise Warning ( ' action cancelled: the duration f the event is more than 1 days ! ' )
if rec . end_generation_date < datetime . now ( ) : raise Warning ( ' action cancelled: the end generation date must be in the future ! ' )
delta = rec . end_generation_date - rec . date_begin
if delta . days > 100 : raise Warning ( ' action cancelled: the duration f the event is more than 100 days ! ' )
if rec . frequency == ' daily ' : d = 1
if rec . frequency == ' weekly ' : d = 7
start_date_event = rec . date_begin + timedelta ( days = d )
end_date_event = rec . date_end + timedelta ( days = d )
while start_date_event < = rec . end_generation_date :
#avant de dupliquer l'événement on regarde si celui-ci n'a pas déjà été crée !
evt = self . env [ ' event.event ' ] . search ( [ ( ' date_begin ' , ' = ' , start_date_event ) , ( ' parent_event_id ' , ' = ' , int ( self . id ) ) ] )
if evt : raise Warning ( ' action cancelled: event already generated with this date : ' + str ( start_date_event ) )
dup = self . _create_event ( rec , start_date_event , end_date_event )
dup . add_event_to_google_agenda ( )
end_date_event = end_date_event + timedelta ( days = d )
start_date_event = start_date_event + timedelta ( days = d )
def _create_event ( self , rec , start_date_event , end_date_event ) :
vals = { }
vals [ ' name ' ] = rec . name
vals [ ' date_begin ' ] = start_date_event
vals [ ' date_end ' ] = end_date_event
vals [ ' description ' ] = rec . description
vals [ ' tag_ids ' ] = rec . tag_ids
vals [ ' is_published ' ] = True
vals [ ' free_participation ' ] = rec . free_participation
vals [ ' participation_product_id ' ] = rec . participation_product_id
vals [ ' participation_standard_price ' ] = rec . participation_standard_price
vals [ ' participation_member_price ' ] = rec . participation_member_price
vals [ ' participation_super_member_price ' ] = rec . participation_super_member_price
vals [ ' subscription_product_id ' ] = rec . subscription_product_id
vals [ ' subscription_standard_price ' ] = rec . subscription_standard_price
vals [ ' subscription_member_price ' ] = rec . subscription_member_price
vals [ ' subscription_super_member_price ' ] = rec . subscription_super_member_price
vals [ ' recurring_event ' ] = rec . recurring_event
vals [ ' recurring_event_newsletter_id ' ] = rec . recurring_event_newsletter_id
vals [ ' online_event ' ] = rec . online_event
vals [ ' online_link ' ] = rec . online_link
vals [ ' online_id ' ] = rec . online_id
vals [ ' online_password ' ] = rec . online_password
vals [ ' parent_event_id ' ] = rec . id
return self . env [ ' event.event ' ] . create ( vals )
def _compute_duration ( self ) :
for rec in self :
@ -124,9 +204,6 @@ class KalachakraEvent(models.Model):
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 ' ) )
@ -151,17 +228,19 @@ class KalachakraEvent(models.Model):
}
#recherche de l'id calendar lié à l'étiquette de l'événément
calendar_find = False
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 ( )
calendar_find = True
event = service . events ( ) . insert ( calendarId = tag . category_id . calendar_id , body = body ) . execute ( )
self . calendar_event_id = event [ ' id ' ]
self . calendar_id = tag . category_id . calendar_id
self . calendar_event_id = event [ ' id ' ]
self . calendar_id = calendar_id
if not calendar_find : raise Warning ( ' operation cancelled: no calendar id find, please selected a label wih category with a calendar_id ' )
def remove_event_to _google_agenda ( self ) :
def remove_event_from _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 )