forked from michel/Coworking
89 lines
3.7 KiB
Python
89 lines
3.7 KiB
Python
|
# -*- coding: utf-8 -*-
|
||
|
|
||
|
""" relation module """
|
||
|
|
||
|
from datetime import datetime
|
||
|
from odoo import models, fields, api, _
|
||
|
from odoo.exceptions import ValidationError
|
||
|
|
||
|
class relation(models.Model):
|
||
|
""" relation model """
|
||
|
_name = 'coworking.relation'
|
||
|
_description = 'relation model definition'
|
||
|
_rec_name = 'title'
|
||
|
_order = 'id asc'
|
||
|
|
||
|
title = fields.Char(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 relation starts this week """
|
||
|
for relation in self:
|
||
|
date_start = fields.Datetime.from_string(relation.date_start)
|
||
|
week_start = date_start.isocalendar()[1]
|
||
|
relation.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 relation in self.search([]):
|
||
|
date_start = fields.Datetime.from_string(relation.date_start)
|
||
|
week_start = date_start.isocalendar()[1]
|
||
|
if datetime.now().isocalendar()[1] == week_start:
|
||
|
res_ids.append(relation.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 relation in self:
|
||
|
relation.participants_count = len(relation.participants_ids)
|
||
|
|
||
|
@api.constrains('statut', 'participants_ids')
|
||
|
def _check_if_confirmed(self):
|
||
|
"""Test si participants_ids est confirmed"""
|
||
|
for relation in self:
|
||
|
if relation.participants_ids and relation.statut == 'draft':
|
||
|
raise models.ValidationError(_('You can have subscribed people '
|
||
|
'if relation is not confirmed yet'))
|
||
|
|
||
|
@api.constrains('date_start', 'date_end')
|
||
|
def _check_dates(self):
|
||
|
"""Test si la modification de la date de début est infnérieure à la date de fin"""
|
||
|
if self.date_start > self.date_end:
|
||
|
raise ValidationError(_('End date most be supperior to to start date'))
|
||
|
|
||
|
@api.depends('date_start', 'date_end')
|
||
|
def _compute_duration(self):
|
||
|
for relation in self:
|
||
|
if relation.date_start and relation.date_end:
|
||
|
date_end_py = fields.Datetime.from_string(relation.date_end)
|
||
|
date_start_py = fields.Datetime.from_string(relation.date_start)
|
||
|
delta = date_end_py - date_start_py
|
||
|
relation.duration = delta.days * 24.0 + round(float(delta.seconds) / 3600.0)
|
||
|
else:
|
||
|
relation.duration = 0.0
|