# -*- coding: utf-8 -*- """ Event module """ from datetime import datetime from odoo import models, fields, api, _ from odoo.exceptions import ValidationError class Event(models.Model): """ Event model """ _name = 'coworking.event' _description = 'Event model definition' _order = 'id asc' name = fields.Char('Title', required=True) manager_id = fields.Many2one('coworking.coworker', 'Manager', index=True, required=True, domain="[('coworker_type', 'in', ['staffer', 'member'])]") date_start = fields.Datetime(default=fields.Date.context_today, required=True) starts_this_week = fields.Integer(compute='_compute_starts_this_week', search='_search_starts_this_week') date_end = fields.Datetime(required=True) duration = fields.Float(compute='_compute_duration') description = fields.Text() statut = fields.Selection([('draft', 'Draft'), ('confirmed', 'Confirmed'), ('canceled', 'Canceled')], default='draft') participants_ids = fields.Many2many('coworking.coworker', string='Subscribers') participants_count = fields.Integer('Number of participants', compute='_compute_participants_count') @api.depends('date_start') def _compute_starts_this_week(self): """ Computes is event starts this week """ for event in self: date_start = fields.Datetime.from_string(event.date_start) week_start = date_start.isocalendar()[1] event.starts_this_week = (datetime.now().isocalendar()[1] == week_start) def _search_starts_this_week(self, operator, value): """ Searches function for starts_this_week """ res_ids = [] for event in self.search([]): date_start = fields.Datetime.from_string(event.date_start) week_start = date_start.isocalendar()[1] if datetime.now().isocalendar()[1] == week_start: res_ids.append(event.id) if operator == '=': operator = 'in'if value else 'not in' else: operator = 'not in'if value else 'in' return [('id', operator, res_ids)] @api.depends('participants_ids') def _compute_participants_count(self): """ Computes number of participants """ for event in self: event.participants_count = len(event.participants_ids) @api.constrains('statut', 'participants_ids') def _check_if_confirmed(self): """Test si participants_ids est confirmed""" for event in self: if event.participants_ids and event.statut == 'draft': raise models.ValidationError(_('You can have subscribed people ' 'if event is not confirmed yet')) @api.constrains('date_end') def _check_date_end(self): """Test si la modification de la date n'est pas postérieur à la date de début""" if self.date_start > self.date_end: raise ValidationError( _('Date most be supperior to to start date')) @api.constrains('date_start') def _check_date_start(self): """Test si la modification de la date de fin n'est pas anterieur à la date de début""" if self.date_end < self.date_start: raise ValidationError( _('Date most be inferior to to end date')) @api.depends('date_start', 'date_end') def _compute_duration(self): for event in self: if event.date_start and event.date_end: date_end_py = fields.Datetime.from_string(event.date_end) date_start_py = fields.Datetime.from_string(event.date_start) delta = date_end_py - date_start_py event.duration = delta.days * 24.0 + round(float(delta.seconds) / 3600.0) else: event.duration = 0.0