From b43503f50babce5ba5e376c245181026bae72dab Mon Sep 17 00:00:00 2001 From: assk-odoo Date: Tue, 20 Jan 2026 16:40:31 +0530 Subject: [PATCH] WIP --- service_event_base/__init__.py | 1 + service_event_base/__manifest__.py | 20 +++++++ service_event_base/data/data.xml | 18 +++++++ service_event_base/models/__init__.py | 5 ++ .../models/event_registration.py | 36 +++++++++++++ service_event_base/models/event_service.py | 49 ++++++++++++++++++ .../security/ir.model.access.csv | 3 ++ .../static/description/image.jpeg | Bin 0 -> 3158 bytes .../views/service_event_base.xml | 26 ++++++++++ 9 files changed, 158 insertions(+) create mode 100644 service_event_base/__init__.py create mode 100644 service_event_base/__manifest__.py create mode 100644 service_event_base/data/data.xml create mode 100644 service_event_base/models/__init__.py create mode 100644 service_event_base/models/event_registration.py create mode 100644 service_event_base/models/event_service.py create mode 100644 service_event_base/security/ir.model.access.csv create mode 100644 service_event_base/static/description/image.jpeg create mode 100644 service_event_base/views/service_event_base.xml diff --git a/service_event_base/__init__.py b/service_event_base/__init__.py new file mode 100644 index 0000000..0650744 --- /dev/null +++ b/service_event_base/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/service_event_base/__manifest__.py b/service_event_base/__manifest__.py new file mode 100644 index 0000000..dcd04d0 --- /dev/null +++ b/service_event_base/__manifest__.py @@ -0,0 +1,20 @@ +{ + 'name': 'Event & Service Management - Base', + 'version': '1.0', + 'category': 'Services', + 'sequence': 2, + 'summary': 'for event and service booking system', + 'description': """Event/Service management.""", + 'depends': ['base','mail','event'], + 'data': [ + 'security/ir.model.access.csv', + 'views/service_event_base.xml', + # 'views/service_event_category_views.xml', + # 'views/service_event_registration_views.xml', + # 'views/service_event_views.xml', + ], + 'author': 'sujal asodariya', + 'installable': True, + 'application': True, + 'license': 'LGPL-3', +} diff --git a/service_event_base/data/data.xml b/service_event_base/data/data.xml new file mode 100644 index 0000000..c21accd --- /dev/null +++ b/service_event_base/data/data.xml @@ -0,0 +1,18 @@ + + + + + + + + \ No newline at end of file diff --git a/service_event_base/models/__init__.py b/service_event_base/models/__init__.py new file mode 100644 index 0000000..645f9b6 --- /dev/null +++ b/service_event_base/models/__init__.py @@ -0,0 +1,5 @@ +# from . import event_category +from . import event_registration +from . import event_service +# from . import event_tag + diff --git a/service_event_base/models/event_registration.py b/service_event_base/models/event_registration.py new file mode 100644 index 0000000..27bdc75 --- /dev/null +++ b/service_event_base/models/event_registration.py @@ -0,0 +1,36 @@ +from odoo import api, fields, models, _ +from odoo.exceptions import ValidationError + + +class EventRegistration(models.Model): + _name = 'event.registrations' + _description = 'Event Registration' + + name = fields.Char('Name', required=True) + state = fields.Selection([ + ('draft', 'Draft'), + ('confirmed', 'Confirmed'), + ('cancelled', 'Cancelled') + ], 'Status', default='draft', required=True) + active = fields.Boolean('Active', default=True) + + booking_date = fields.Datetime('Booking Date', default=fields.Datetime.now) + booking_amount = fields.Monetary('Booking Amount', currency_field='currency_id', compute='_compute_booking_amount', store=True, readonly=True) + + service_id = fields.Many2one('event.service', 'Event Service', ondelete='cascade', required=True) + partner_id = fields.Many2one('res.partner', 'Partner', index=True) + currency_id = fields.Many2one('res.currency', 'Currency', related='service_id.currency_id', readonly=True) + company_id = fields.Many2one('res.company', 'Company', related='service_id.company_id', store=True, readonly=True) + + # Compute fields + @api.depends('service_id') + def _compute_booking_amount(self): + for record in self: + record.booking_amount = record.service_id.price + + # Python constrains + @api.constrains('booking_date') + def _check_booking_date(self): + for record in self: + if record.booking_date and record.booking_date < fields.Datetime.now(): + raise ValidationError(_("Booking date cannot be in the previous one.")) diff --git a/service_event_base/models/event_service.py b/service_event_base/models/event_service.py new file mode 100644 index 0000000..01c7d8c --- /dev/null +++ b/service_event_base/models/event_service.py @@ -0,0 +1,49 @@ +from odoo import api, fields, models, _ +from odoo.exceptions import ValidationError + + +class EventService(models.Model): + _name = 'event.service' + _description = 'Event Management Service' + + name = fields.Char('Event Name', required=True) + description = fields.Html('Description') + price = fields.Monetary('Price', currency_field='currency_id') + active = fields.Boolean('Active', default=True) + start_date = fields.Datetime('Start Date') + end_date = fields.Datetime('End Date') + + event_type_id = fields.Many2one('event.type', 'Event Type', ondelete='set null', index=True) + company_id = fields.Many2one('res.company', required=True, default=lambda self: self.env.company) + booking_ids = fields.One2many('event.registrations', 'service_id', 'Bookings') + + currency_id = fields.Many2one('res.currency', 'Currency', default=lambda self: self.company_id.currency_id, readonly=True) + + @api.constrains('start_date', 'end_date') + def _check_dates(self): + for record in self: + if record.start_date and record.end_date and record.end_date <= record.start_date: + raise ValidationError(_('End date must be after start date.')) + + @api.constrains('price') + def _check_price(self): + for record in self: + if record.price < 0: + raise ValidationError(_('Price must be zero or positive.')) + + @api.onchange('price') + def _onchange_price(self): + if self.price and self.price < 0: + self.price = 0 + return { + 'warning': { + 'title': _('Invalid Price'), + 'message': _('Price cannot be negative.'), + } + } + + @api.model_create_multi + def create(self, vals_list): + records = super().create(vals_list) + #logic here write + return records diff --git a/service_event_base/security/ir.model.access.csv b/service_event_base/security/ir.model.access.csv new file mode 100644 index 0000000..20ab511 --- /dev/null +++ b/service_event_base/security/ir.model.access.csv @@ -0,0 +1,3 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_event_management_user,access.event.service.user,model_event_service,base.group_user,1,1,1,1 +access_event_registrations_user,access.event.registrations.user,model_event_registrations,base.group_user,1,1,1,1 diff --git a/service_event_base/static/description/image.jpeg b/service_event_base/static/description/image.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..a8b61ce07e2448d922fc6bc2922f7dd4bfd79786 GIT binary patch literal 3158 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 literal 0 HcmV?d00001 diff --git a/service_event_base/views/service_event_base.xml b/service_event_base/views/service_event_base.xml new file mode 100644 index 0000000..4f13532 --- /dev/null +++ b/service_event_base/views/service_event_base.xml @@ -0,0 +1,26 @@ + + + + + Service Events + event.service + list + +

+ No service events found +

+
+
+ + + + +