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.
 
 
 
 
 

108 lines
4.9 KiB

# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# 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 (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
#############################################################################
import json
from werkzeug.urls import url_encode
from odoo import http, fields
from odoo.http import request
class MovieShow(http.Controller):
""" This class defines the HTTP routes and movie shows.
It provides functionality to render the movie template for user
interaction."""
@http.route(['/show'], type='http', auth="public", csrf=False, website=True)
def show_movies(self):
""" Function for rendering show page."""
movies = request.env['movie.movie'].search([('state', '=', 'ongoing')])
return http.request.render('show_booking_management.show_movie',
{'movies': movies})
@http.route(['/book_now/<int:movie_id>'], type='http', auth="public",
csrf=False, website=True)
def book_now(self, movie_id):
""" Function for rendering booking page while clicking the button book now."""
movie = request.env['movie.movie'].browse(movie_id)
return http.request.render('show_booking_management.book_movie',
{'movie': movie})
@http.route('/movie/book_ticket', type='http', auth='public', website=True,
methods=['POST'], csrf=False)
def book_ticket(self, **kwargs):
""" Function for submitting the form and rendering the seat selection chart."""
movie_id = request.env['movie.movie'].browse(
int(kwargs.get('movie_id')))
screen_id = request.env['movie.screen'].browse(
int(kwargs.get('screen')))
time_slot_id = request.env['time.slots'].browse(
int(kwargs.get('time_slots')))
booked_seats = request.env['movie.seats'].search([
('screen_id', '=', screen_id.id),
('time_slot_id', '=', int(kwargs.get('time_slots'))),
('date', '=', kwargs.get('show_date')),
('is_booked', '=', True)
]).mapped('seat')
return http.request.render(
'show_booking_management.seat_selection_template',
{'screen': screen_id, 'movie': movie_id,
'time_slot_id': time_slot_id, 'booked_seats': booked_seats,
'booked_seats_count': len(booked_seats),
'available_seats_count': screen_id.total_seat_count - len(booked_seats),
'booking_date': kwargs.get('show_date')})
@http.route('/movie/confirm_booking', type='http', auth='public',
website=True, methods=['POST'], csrf=True)
def confirm_booking(self, **post):
""" Function for confirming the seats selection and creating invoice."""
selected_seats = request.httprequest.form.getlist('selected_seats')
movie = request.env['movie.movie'].browse(int(post.get('movie_id')))
product = request.env.ref('show_booking_management.product_1')
invoice = request.env['account.move'].sudo().create({
'move_type': 'out_invoice',
'invoice_origin': 'Movie',
'partner_id': request.env.user.partner_id.id,
'invoice_date': fields.Date.today(),
'state': 'draft',
'invoice_line_ids': [(0, 0, {
'name': f"Ticket for {movie.name} on {post.get('booking_date')}",
'product_id': product.id,
'quantity': len(selected_seats),
'price_unit': movie.price,
})],
})
if invoice:
invoice.sudo().action_post()
access_token = invoice._portal_ensure_token()
booking_data = {
'invoice_id': invoice.id,
'movie_id': int(post.get('movie_id')),
'screen_id': int(post.get('screen_id')),
'time_slot_id': int(post.get('time_slot_id')),
'booking_date': post.get('booking_date'),
'selected_seats': selected_seats,
}
request.session['movie_booking_data'] = json.dumps(booking_data)
params = {
'access_token': access_token,
'payment_method_id': post.get('payment_method_id'),
}
return request.redirect(f'/my/invoices/{invoice.id}?{url_encode(params)}')