diff --git a/hotel/__manifest__.py b/hotel/__manifest__.py index d9475dd00..f1e827455 100644 --- a/hotel/__manifest__.py +++ b/hotel/__manifest__.py @@ -9,7 +9,7 @@ Darío Lodeiros,\ Jose Luis Algara,\ Alexandre Díaz,\ - Q. Barriuso,', + Pablo Quesada,', 'category': 'Generic Modules/Hotel Management', 'website': 'https://github.com/hootel/hootel', 'depends': [ @@ -22,6 +22,7 @@ 'license': "AGPL-3", 'demo': ['data/hotel_demo.xml'], 'data': [ + 'data/hotel_data.xml', 'security/hotel_security.xml', 'security/ir.model.access.csv', 'wizard/massive_changes.xml', @@ -34,6 +35,9 @@ 'wizard/massive_price_reservation_days.xml', 'wizard/folio_make_invoice_advance_views.xml', 'data/hotel_sequence.xml', + 'views/inherited_res_company_views.xml', + 'views/inherited_res_users_views.xml', + 'views/hotel_property_views.xml', 'views/hotel_floor_views.xml', 'views/hotel_folio_views.xml', 'views/inherited_res_partner_views.xml', @@ -56,6 +60,7 @@ 'views/hotel_checkin_partner_views.xml', 'views/hotel_board_service_room_type_views.xml', 'views/hotel_cancelation_rule_views.xml', + 'views/inherited_webclient_templates.xml', 'data/cron_jobs.xml', 'data/records.xml', 'data/email_template_cancel.xml', @@ -65,5 +70,8 @@ 'report/hotel_folio_templates.xml', 'report/hotel_folio.xml' ], + 'qweb': [ + 'static/src/xml/*.xml', + ], 'installable': True } diff --git a/hotel/data/hotel_data.xml b/hotel/data/hotel_data.xml new file mode 100644 index 000000000..a6d0c1df9 --- /dev/null +++ b/hotel/data/hotel_data.xml @@ -0,0 +1,16 @@ + + + + + + + My Hotel + + + + + + + + + \ No newline at end of file diff --git a/hotel/models/__init__.py b/hotel/models/__init__.py index b56e8af46..d0664b9a5 100644 --- a/hotel/models/__init__.py +++ b/hotel/models/__init__.py @@ -2,8 +2,11 @@ # Copyright 2018 Dario Lodeiros # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +from . import inherited_ir_http from . import inherited_payment_return from . import hotel_board_service_room_type +from . import hotel_property +from . import inherited_res_users from . import hotel_floor from . import hotel_folio from . import hotel_reservation diff --git a/hotel/models/hotel_property.py b/hotel/models/hotel_property.py new file mode 100644 index 000000000..0128d50e4 --- /dev/null +++ b/hotel/models/hotel_property.py @@ -0,0 +1,17 @@ +# Copyright 2019 Pablo Quesada +# Copyright 2019 Dario Lodeiros +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import models, api, fields + + +class HotelProperty(models.Model): + _name = 'hotel.property' + _description = 'Hotel' + _inherits = {'res.partner': 'partner_id'} + + partner_id = fields.Many2one('res.partner', 'Hotel Property', + required=True, delegate=True, ondelete='cascade') + company_id = fields.Many2one('res.company', help='The company that owns or operates this hotel.') + user_ids = fields.Many2many('res.users', 'hotel_property_users_rel', 'hotel_id', 'user_id', + string='Accepted Users') diff --git a/hotel/models/inherited_ir_http.py b/hotel/models/inherited_ir_http.py new file mode 100644 index 000000000..f15ca02a4 --- /dev/null +++ b/hotel/models/inherited_ir_http.py @@ -0,0 +1,20 @@ +# Copyright 2019 Pablo Quesada +# Copyright 2019 Dario Lodeiros +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import models +from odoo.http import request + + +class IrHttp(models.AbstractModel): + _inherit = 'ir.http' + + def session_info(self): + res = super().session_info() + user = request.env.user + display_switch_hotel_menu = len(user.hotel_ids) > 1 + res['hotel_id'] = request.env.user.hotel_id.id if request.session.uid else None + res['user_hotels'] = {'current_hotel': (user.hotel_id.id, user.hotel_id.name), + 'allowed_hotels': [(hotel.id, hotel.name) for hotel in + user.hotel_ids]} if display_switch_hotel_menu else False + return res diff --git a/hotel/models/inherited_res_company.py b/hotel/models/inherited_res_company.py index 7173b6635..0eb942f7a 100644 --- a/hotel/models/inherited_res_company.py +++ b/hotel/models/inherited_res_company.py @@ -7,6 +7,8 @@ from odoo import models, fields class ResCompany(models.Model): _inherit = 'res.company' + hotel_ids = fields.One2many('hotel.property', 'company_id', 'Hotels') + additional_hours = fields.Integer('Additional Hours', help="Provide the min hours value for \ check in, checkout days, whatever \ diff --git a/hotel/models/inherited_res_users.py b/hotel/models/inherited_res_users.py new file mode 100644 index 000000000..0adb77138 --- /dev/null +++ b/hotel/models/inherited_res_users.py @@ -0,0 +1,17 @@ +# Copyright 2019 Pablo Quesada +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +from odoo import models, api, fields + + +class ResUsers(models.Model): + _inherit = 'res.users' + + @api.model + def _get_default_hotel(self): + return self.env.user.hotel_id + + hotel_id = fields.Many2one('hotel.property', string='Hotel', default=_get_default_hotel, + help='The hotel this user is currently working for.', + context={'user_preference': True}) + hotel_ids = fields.Many2many('hotel.property', 'hotel_property_users_rel', 'user_id', 'hotel_id', + string='Hotels', default=_get_default_hotel) diff --git a/hotel/static/src/js/widgets/switch_hotel_menu.js b/hotel/static/src/js/widgets/switch_hotel_menu.js new file mode 100644 index 000000000..fdc5562ef --- /dev/null +++ b/hotel/static/src/js/widgets/switch_hotel_menu.js @@ -0,0 +1,61 @@ +odoo.define('hotel.SwitchHotelMenu', function(require) { +"use strict"; + +var config = require('web.config'); +var core = require('web.core'); +var session = require('web.session'); +var SystrayMenu = require('web.SystrayMenu'); +var Widget = require('web.Widget'); + +var _t = core._t; + +var SwitchHotelMenu = Widget.extend({ + template: 'hotel.SwitchHotelMenu', + willStart: function() { + this.isMobile = config.device.isMobile; + if (!session.user_hotels) { + return $.Deferred().reject(); + } + return this._super(); + }, + start: function() { + var self = this; + this.$el.on('click', '.dropdown-menu li a[data-menu]', _.debounce(function(ev) { + ev.preventDefault(); + var hotel_id = $(ev.currentTarget).data('hotel-id'); + self._rpc({ + model: 'res.users', + method: 'write', + args: [[session.uid], {'hotel_id': hotel_id}], + }) + .then(function() { + location.reload(); + }); + }, 1500, true)); + + var hotels_list = ''; + if (this.isMobile) { + hotels_list = '
  • ' + _t('Tap on the list to change hotel') + '
  • '; + } + else { + self.$('.oe_topbar_name').text(session.user_hotels.current_hotel[1]); + } + _.each(session.user_hotels.allowed_hotels, function(hotel) { + var a = ''; + if (hotel[0] === session.user_hotels.current_hotel[0]) { + a = ''; + } else { + a = ''; + } + hotels_list += '
  • ' + a + hotel[1] + '
  • '; + }); + self.$('.dropdown-menu').html(hotels_list); + return this._super(); + }, +}); + +SystrayMenu.Items.push(SwitchHotelMenu); + +return SwitchHotelMenu; + +}); diff --git a/hotel/static/src/xml/hotel_base_templates.xml b/hotel/static/src/xml/hotel_base_templates.xml new file mode 100644 index 000000000..0a9895114 --- /dev/null +++ b/hotel/static/src/xml/hotel_base_templates.xml @@ -0,0 +1,12 @@ + diff --git a/hotel/views/hotel_property_views.xml b/hotel/views/hotel_property_views.xml new file mode 100644 index 000000000..de6761bf4 --- /dev/null +++ b/hotel/views/hotel_property_views.xml @@ -0,0 +1,50 @@ + + + + + + + hotel_property_views_form + hotel.property + +
    + + +
    +
    +
    + + + hotel_property_views_tree + hotel.property + + + + + + + + + + + + Hotel Property + hotel.property + form + tree,form + + +
    diff --git a/hotel/views/inherited_res_company_views.xml b/hotel/views/inherited_res_company_views.xml new file mode 100644 index 000000000..aea69d8b9 --- /dev/null +++ b/hotel/views/inherited_res_company_views.xml @@ -0,0 +1,20 @@ + + + + + + view.company.form + res.company + + + + + + + + + + + + + diff --git a/hotel/views/inherited_res_users_views.xml b/hotel/views/inherited_res_users_views.xml new file mode 100644 index 000000000..45b3cbcc9 --- /dev/null +++ b/hotel/views/inherited_res_users_views.xml @@ -0,0 +1,17 @@ + + + + + res.users + + + + + + + + + + + + diff --git a/hotel/views/inherited_webclient_templates.xml b/hotel/views/inherited_webclient_templates.xml new file mode 100644 index 000000000..10f1dea10 --- /dev/null +++ b/hotel/views/inherited_webclient_templates.xml @@ -0,0 +1,10 @@ + + + + + +