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.
 
 
 
 
 

124 lines
5.4 KiB

# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Dhanya Babu (<https://www.cybrosys.com>)
#
# This program is free software: you can modify
# it under the terms of the GNU Affero General Public License (AGPL) as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
#
###############################################################################
from datetime import timedelta
from odoo import api, exceptions, fields, models, _
class OpenAcademySession(models.Model):
"""creating sessions"""
_name = 'openacademy.session'
_description = "OpenAcademy Sessions"
name = fields.Char(string='Name', required=True,
help='Name of the session')
start_date = fields.Date(string='Start Date', default=fields.Date.today(),
help='Start date of the session')
duration = fields.Float(string='Duration', digits=(6, 2),
help="Duration in days")
seats = fields.Integer(string="Number of seats", help='Total seats')
instructor_id = fields.Many2one('res.partner', string='Instructor',
help='Instructor name')
course_id = fields.Many2one('openacademy.course', string='Course',
ondelete='cascade', required=True,
help='Course name')
attendee_ids = fields.Many2many('res.partner', string="Attendees",
help='Attendees')
active = fields.Boolean(string='Active', default=True,
help='Check this box to indicate if'
' the session is currently active.')
taken_seats = fields.Float(string="Taken seats",
compute='_compute_taken_seats',
help='Taken seats')
end_date = fields.Date(string="End Date", store=True,
compute='_compute_get_end_date',
inverse='_compute_set_end_date', help='End date')
attendees_count = fields.Integer(
string="Attendees count", compute='_compute_attendees_count',
store=True, help='Attendees count')
color = fields.Integer(string='Colour', help='Colour')
@api.depends('seats', 'attendee_ids')
def _compute_taken_seats(self):
"""Computing number of seats"""
for record in self:
if not record.seats:
record.taken_seats = 0.0
else:
record.taken_seats = 100.0 * len(
record.attendee_ids) / record.seats
@api.onchange('seats', 'attendee_ids')
def _onchange_seats(self):
"""verifying number of seats
If number of seats less than zero it will display warning"""
if self.seats < 0:
return {
'warning': {
'title': _("Incorrect 'seats' value"),
'message': _(
"The number of available seats may not be negative"),
},
}
if self.seats < len(self.attendee_ids):
return {
'warning': {
'title': "Too many attendees",
'message': "Increase seats or remove excess attendees",
},
}
def _compute_get_end_date(self):
"""compute the value of end_date based on the values of
start_date and duration"""
for record in self:
if not (record.start_date and record.duration):
record.end_date = record.start_date
continue
# Add duration to start_date, but: Monday + 5 days = Saturday, so
# subtract one second to get on Friday instead
duration = timedelta(days=record.duration, seconds=-1)
record.end_date = record.start_date + duration
def _compute_set_end_date(self):
"""compute the value of duration """
for record in self:
if not (record.start_date and record.end_date):
continue
# Compute the difference between dates,
# but: Friday - Monday = 4 days,
# so add one day to get 5 days instead
record.duration = (record.end_date - record.start_date).days + 1
@api.depends('attendee_ids')
def _compute_attendees_count(self):
"""compute number of attendees"""
for record in self:
record.attendees_count = len(record.attendee_ids)
@api.constrains('instructor_id', 'attendee_ids')
def _check_instructor_not_in_attendees(self):
"""Check instructor is in attendee"""
for record in self:
if record.instructor_id and record.instructor_id in record.attendee_ids:
raise exceptions.ValidationError(
"A session's instructor can't be an attendee")