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
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							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")
 | |
| 
 |