diff --git a/meeting_room_booking/__init__.py b/meeting_room_booking/__init__.py new file mode 100644 index 0000000000..bd269b77eb --- /dev/null +++ b/meeting_room_booking/__init__.py @@ -0,0 +1,3 @@ +from . import models +from . import views +from . import security diff --git a/meeting_room_booking/__manifest__.py b/meeting_room_booking/__manifest__.py new file mode 100644 index 0000000000..109394736d --- /dev/null +++ b/meeting_room_booking/__manifest__.py @@ -0,0 +1,20 @@ +{ + 'name': 'Meeting Room Booking', + 'version': '18.0.1.0.0', + 'summary': 'App to manage and book meeting rooms', + 'description': 'Manage meeting room booking', + 'author': 'imheart', + 'website': 'www.example-test-test.com', + 'category': 'Productivity', + 'license': 'LGPL-3', + 'depends': ['base',], + 'data': [ + 'security/ir.model.access.csv', + 'views/room_views.xml', + 'views/booking_views.xml', + 'views/actions.xml', + 'views/menus.xml', + ], + 'installable': True, + 'application': True, +} \ No newline at end of file diff --git a/meeting_room_booking/models/__init__.py b/meeting_room_booking/models/__init__.py new file mode 100644 index 0000000000..9cb9680561 --- /dev/null +++ b/meeting_room_booking/models/__init__.py @@ -0,0 +1,2 @@ +from . import room +from . import booking \ No newline at end of file diff --git a/meeting_room_booking/models/booking.py b/meeting_room_booking/models/booking.py new file mode 100644 index 0000000000..00e3f212be --- /dev/null +++ b/meeting_room_booking/models/booking.py @@ -0,0 +1,31 @@ +from odoo import api, fields, models +from odoo.exceptions import ValidationError + +""" +This module handles meeting room booking functionalities. +""" + +class MeetingRoomBooking(models.Model): + _name = 'meeting.booking' + _description = 'Meeting Room Booking' + + name = fields.Char(string='Booking Reference', required=True, default='New') + room_id = fields.Many2one(comodel_name='meeting.room', string='Room', required=True) + start_time = fields.Datetime(string='Start Time',required=True) + end_time = fields.Datetime(string='End Time', required=True) + booked_by = fields.Many2one(comodel_name='res.users', string='Booked by', default=lambda self: self.env.user) + + @api.constrains('start_time', 'end_time', 'room_id') + def _check_double_booking(self): + for booking in self: + if booking.start_time >= booking.end_time: + raise ValidationError('Start Time must be less than End Time.') + + overlapping_bookings = self.search([ + ('room_id', '=', booking.room_id.id), + ('id', '!=', booking.id), + ('start_time', '<', booking.end_time), + ('end_time', '>', booking.start_time) + ]) + if overlapping_bookings: + raise ValidationError('The selected room is already booked for the specified time.') \ No newline at end of file diff --git a/meeting_room_booking/models/room.py b/meeting_room_booking/models/room.py new file mode 100644 index 0000000000..3c6399df29 --- /dev/null +++ b/meeting_room_booking/models/room.py @@ -0,0 +1,12 @@ +from odoo import models, fields + +class MeetingRoom(models.Model): + _name = 'meeting.room' + _description = 'Meeting Room' + + + name = fields.Char(string='Room Name', required=True) + capacity = fields.Integer(string='Capacity', required=True) + location = fields.Char(string='Location', required=True) + availability = fields.Boolean(string='Available', default=True) + diff --git a/meeting_room_booking/security/ir.model.access.csv b/meeting_room_booking/security/ir.model.access.csv new file mode 100644 index 0000000000..b856471fd9 --- /dev/null +++ b/meeting_room_booking/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_meeting_room,access_meeting_room,model_meeting_room,base.group_user,1,1,1,1 +access_meeting_booking,access_meeting_booking,model_meeting_booking,base.group_user,1,1,1,1 \ No newline at end of file diff --git a/meeting_room_booking/static/description/icon.png b/meeting_room_booking/static/description/icon.png new file mode 100644 index 0000000000..213e8d62fd Binary files /dev/null and b/meeting_room_booking/static/description/icon.png differ diff --git a/meeting_room_booking/views/actions.xml b/meeting_room_booking/views/actions.xml new file mode 100644 index 0000000000..b03108bd2e --- /dev/null +++ b/meeting_room_booking/views/actions.xml @@ -0,0 +1,16 @@ + + + + + Rooms + meeting.room + list,form + + + + Bookings + meeting.booking + list,form + + + diff --git a/meeting_room_booking/views/booking_views.xml b/meeting_room_booking/views/booking_views.xml new file mode 100644 index 0000000000..9f42afb9aa --- /dev/null +++ b/meeting_room_booking/views/booking_views.xml @@ -0,0 +1,36 @@ + + + + + meeting.booking.tree + meeting.booking + + + + + + + + + + + + + meeting.booking.form + meeting.booking + +
+ + + + + + + + + +
+
+
+
+
diff --git a/meeting_room_booking/views/menus.xml b/meeting_room_booking/views/menus.xml new file mode 100644 index 0000000000..6f62d6ea02 --- /dev/null +++ b/meeting_room_booking/views/menus.xml @@ -0,0 +1,21 @@ + + + + + + + + + + diff --git a/meeting_room_booking/views/room_views.xml b/meeting_room_booking/views/room_views.xml new file mode 100644 index 0000000000..9a2485cba7 --- /dev/null +++ b/meeting_room_booking/views/room_views.xml @@ -0,0 +1,35 @@ + + + + + meeting.room.tree + meeting.room + + + + + + + + + + + + meeting.room.form + meeting.room + +
+ + + + + + + + +
+
+
+
+
+