first commit
2
addons/Dine360_Chennora/__init__.py
Normal file
@ -0,0 +1,2 @@
|
||||
# Meta module for Dine360 Chennora
|
||||
from .hooks import uninstall_hook
|
||||
27
addons/Dine360_Chennora/__manifest__.py
Normal file
@ -0,0 +1,27 @@
|
||||
{
|
||||
'name': 'Dine360 Restaurant Suite',
|
||||
'version': '1.0.0',
|
||||
'license': 'LGPL-3',
|
||||
'category': 'Website',
|
||||
'summary': 'Installs all Dine360 Restaurant modules',
|
||||
'author': 'Dine360',
|
||||
'depends': [
|
||||
'dine360_dashboard',
|
||||
'dine360_restaurant',
|
||||
'dine360_theme_chennora',
|
||||
'dine360_kds',
|
||||
'dine360_reservation',
|
||||
],
|
||||
'uninstall_hook': 'uninstall_hook',
|
||||
'data': [
|
||||
'views/apps_kanban_menu.xml',
|
||||
],
|
||||
'assets': {
|
||||
'web.assets_backend': [
|
||||
'Dine360_Chennora/static/src/css/apps_kanban_fix.css',
|
||||
],
|
||||
},
|
||||
'installable': True,
|
||||
'application': True,
|
||||
}
|
||||
|
||||
BIN
addons/Dine360_Chennora/__pycache__/__init__.cpython-310.pyc
Normal file
BIN
addons/Dine360_Chennora/__pycache__/hooks.cpython-310.pyc
Normal file
26
addons/Dine360_Chennora/hooks.py
Normal file
@ -0,0 +1,26 @@
|
||||
from odoo import api, SUPERUSER_ID
|
||||
|
||||
def uninstall_hook(cr, registry):
|
||||
"""
|
||||
Synchronized uninstallation: When Dine360 Restaurant Suite is uninstalled,
|
||||
automatically trigger uninstallation for all its core sub-modules.
|
||||
"""
|
||||
env = api.Environment(cr, SUPERUSER_ID, {})
|
||||
modules_to_uninstall = [
|
||||
'dine360_dashboard',
|
||||
'dine360_restaurant',
|
||||
'dine360_theme_chennora',
|
||||
'dine360_kds',
|
||||
'dine360_reservation'
|
||||
]
|
||||
|
||||
# Search for these modules if they are installed
|
||||
modules = env['ir.module.module'].search([
|
||||
('name', 'in', modules_to_uninstall),
|
||||
('state', '=', 'installed')
|
||||
])
|
||||
|
||||
if modules:
|
||||
# Mark modules for uninstallation
|
||||
# button_immediate_uninstall will trigger the full process including registry reload
|
||||
modules.button_immediate_uninstall()
|
||||
BIN
addons/Dine360_Chennora/static/description/icon.png
Normal file
|
After Width: | Height: | Size: 22 KiB |
31
addons/Dine360_Chennora/static/src/css/apps_kanban_fix.css
Normal file
@ -0,0 +1,31 @@
|
||||
/* Fix Apps kanban icon sizing and dropdown overlap */
|
||||
.o_modules_kanban .oe_module_vignette,
|
||||
.o_modules_kanban .o_kanban_record {
|
||||
overflow: visible;
|
||||
}
|
||||
|
||||
.o_modules_kanban .o_kanban_record {
|
||||
position: relative;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
.o_modules_kanban .oe_module_icon {
|
||||
width: 64px;
|
||||
height: 64px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.o_modules_kanban .oe_module_icon img {
|
||||
width: 64px;
|
||||
height: 64px;
|
||||
object-fit: contain;
|
||||
}
|
||||
|
||||
.o_modules_kanban .oe_module_vignette .dropdown-menu {
|
||||
right: 0;
|
||||
left: auto;
|
||||
min-width: 160px;
|
||||
z-index: 1060;
|
||||
}
|
||||
15
addons/Dine360_Chennora/views/apps_kanban_menu.xml
Normal file
@ -0,0 +1,15 @@
|
||||
<odoo>
|
||||
<data>
|
||||
<template id="dine360_apps_kanban_menu" inherit_id="base.module_view_kanban" name="Dine360 Apps Kanban Menu">
|
||||
<xpath expr="//t[@t-name='kanban-menu']" position="replace">
|
||||
<t t-name="kanban-menu">
|
||||
<t t-set="installed" t-value="record.state.raw_value == 'installed'"/>
|
||||
<a type="edit" class="dropdown-item">Module Info</a>
|
||||
<a t-if="record.website.raw_value" role="menuitem" class="dropdown-item o-hidden-ios" t-att-href="record.website.raw_value" target="_blank">Learn More</a>
|
||||
<a t-if="installed" name="button_immediate_upgrade" type="object" role="menuitem" class="dropdown-item" groups="base.group_system">Upgrade</a>
|
||||
<a t-if="installed" name="button_uninstall_wizard" type="object" role="menuitem" class="dropdown-item" groups="base.group_system">Uninstall</a>
|
||||
</t>
|
||||
</xpath>
|
||||
</template>
|
||||
</data>
|
||||
</odoo>
|
||||
3
addons/dine360_dashboard/__init__.py
Normal file
@ -0,0 +1,3 @@
|
||||
# dine360_dashboard/__init__.py
|
||||
from . import controllers
|
||||
|
||||
37
addons/dine360_dashboard/__manifest__.py
Normal file
@ -0,0 +1,37 @@
|
||||
{
|
||||
'name': 'Dine360 Dashboard',
|
||||
'version': '1.0.1',
|
||||
'license': 'LGPL-3',
|
||||
'category': 'Website',
|
||||
'summary': 'Redirect login to home and show icon grid',
|
||||
'depends': ['base', 'web', 'auth_signup', 'website', 'website_sale'],
|
||||
'data': [
|
||||
'views/home_template.xml',
|
||||
'views/login_templates.xml',
|
||||
'views/web_title_template.xml',
|
||||
'views/website_logo.xml',
|
||||
'views/shop_template.xml',
|
||||
'data/branding_data.xml',
|
||||
],
|
||||
'assets': {
|
||||
'web.assets_backend': [
|
||||
'dine360_dashboard/static/src/css/theme_variables.css',
|
||||
'dine360_dashboard/static/src/css/home_menu.css',
|
||||
'dine360_dashboard/static/src/js/chennora_title.js',
|
||||
],
|
||||
'web.assets_frontend': [
|
||||
'dine360_dashboard/static/src/css/theme_variables.css',
|
||||
'dine360_dashboard/static/src/css/login_style.css',
|
||||
'dine360_dashboard/static/src/css/website_style.css',
|
||||
'dine360_dashboard/static/src/css/shop_style.css',
|
||||
],
|
||||
'web.assets_common': [
|
||||
'dine360_dashboard/static/src/css/theme_variables.css',
|
||||
],
|
||||
'point_of_sale._assets_pos': [
|
||||
'dine360_dashboard/static/src/css/pos_style.css',
|
||||
],
|
||||
},
|
||||
'installable': True,
|
||||
'application': True,
|
||||
}
|
||||
BIN
addons/dine360_dashboard/__pycache__/__init__.cpython-310.pyc
Normal file
4
addons/dine360_dashboard/controllers/__init__.py
Normal file
@ -0,0 +1,4 @@
|
||||
# dine360_dashboard/controllers/__init__.py
|
||||
from . import main
|
||||
from . import cors
|
||||
|
||||
15
addons/dine360_dashboard/controllers/cors.py
Normal file
@ -0,0 +1,15 @@
|
||||
from odoo import http
|
||||
from odoo.http import request
|
||||
import json
|
||||
|
||||
class CorsHandler(http.Controller):
|
||||
# This specifically targets the authentication endpoint for CORS
|
||||
@http.route('/web/session/authenticate', type='json', auth="none", cors="*")
|
||||
def authenticate_cors(self, db, login, password, base_location=None):
|
||||
request.session.authenticate(db, login, password)
|
||||
return request.env['ir.http'].session_info()
|
||||
|
||||
# Generic search_read for the dashboard apps
|
||||
@http.route('/web/dataset/call_kw', type='json', auth="user", cors="*")
|
||||
def call_kw_cors(self, model, method, args, kwargs, path=None):
|
||||
return request.env[model].with_user(request.uid).call_kw(method, args, kwargs)
|
||||
73
addons/dine360_dashboard/controllers/main.py
Normal file
@ -0,0 +1,73 @@
|
||||
from odoo import http
|
||||
from odoo.http import request
|
||||
from odoo.addons.web.controllers.home import Home
|
||||
|
||||
class CustomHome(Home):
|
||||
@http.route('/web/login', type='http', auth="public", website=True)
|
||||
def web_login(self, *args, **kw):
|
||||
response = super(CustomHome, self).web_login(*args, **kw)
|
||||
if request.params.get('login_success') and request.session.uid:
|
||||
return request.redirect('/')
|
||||
return response
|
||||
|
||||
from odoo.addons.website.controllers.main import Website
|
||||
|
||||
class ImageHome(Website):
|
||||
@http.route('/', type='http', auth='public', website=True, sitemap=True)
|
||||
def index(self, **kwargs):
|
||||
if not request.session.uid:
|
||||
return request.render('website.homepage')
|
||||
|
||||
# Remove sudo() to respect Odoo's standard menu group restrictions
|
||||
menus = request.env['ir.ui.menu'].search([
|
||||
('parent_id', '=', False)
|
||||
], order='sequence')
|
||||
|
||||
# User role checks
|
||||
is_admin = request.env.user.has_group('base.group_system') or request.env.user.has_group('dine360_restaurant.group_restaurant_admin')
|
||||
is_kitchen = request.env.user.has_group('dine360_restaurant.group_restaurant_kitchen')
|
||||
|
||||
filtered_menus = []
|
||||
seen_names = set()
|
||||
for menu in menus:
|
||||
# 1. Hide "Apps" for non-admins (usually name is 'Apps' or xmlid has base.menu_management)
|
||||
if (menu.name == 'Apps' or (menu.web_icon and menu.web_icon.startswith('base,'))) and not is_admin:
|
||||
continue
|
||||
|
||||
# 2. Hide "Kitchen (KDS)" for Waiters (only show for Kitchen Staff or Admin)
|
||||
if 'Kitchen' in menu.name or 'KDS' in menu.name:
|
||||
if not (is_kitchen or is_admin):
|
||||
continue
|
||||
|
||||
# 3. De-duplicate by name to prevent double icons (like Kitchen showing twice)
|
||||
if menu.name in seen_names:
|
||||
continue
|
||||
seen_names.add(menu.name)
|
||||
|
||||
filtered_menus.append(menu)
|
||||
|
||||
# Low Stock Alerts (Ingredients)
|
||||
low_stock_products = []
|
||||
try:
|
||||
# Try to get low stock products if the model and method exist
|
||||
ProductTemplate = request.env['product.template'].sudo()
|
||||
if hasattr(ProductTemplate, 'get_low_stock_products'):
|
||||
low_stock_products = ProductTemplate.get_low_stock_products(limit=5)
|
||||
except Exception:
|
||||
# Fallback if module is not yet fully loaded or method missing
|
||||
low_stock_products = []
|
||||
|
||||
|
||||
|
||||
return request.render('dine360_dashboard.image_home_template', {
|
||||
'menus': filtered_menus,
|
||||
'user_id': request.env.user,
|
||||
'low_stock_products': low_stock_products
|
||||
})
|
||||
|
||||
|
||||
|
||||
@http.route('/home', type='http', auth="public", website=True, sitemap=True)
|
||||
def website_home(self, **kw):
|
||||
# Explicit route for standard Website Homepage
|
||||
return request.render('website.homepage')
|
||||
15
addons/dine360_dashboard/data/branding_data.xml
Normal file
@ -0,0 +1,15 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<data noupdate="1">
|
||||
<record id="base_title_param" model="ir.config_parameter">
|
||||
<field name="key">web.base_title</field>
|
||||
<field name="value">Chennora</field>
|
||||
</record>
|
||||
</data>
|
||||
<data>
|
||||
<record id="base.main_company" model="res.company">
|
||||
<field name="phone">+1(647)856-2878</field>
|
||||
</record>
|
||||
</data>
|
||||
</odoo>
|
||||
|
||||
BIN
addons/dine360_dashboard/static/description/icon.png
Normal file
|
After Width: | Height: | Size: 29 KiB |
176
addons/dine360_dashboard/static/src/css/home_menu.css
Normal file
@ -0,0 +1,176 @@
|
||||
/* Main background */
|
||||
body.o_home_dashboard,
|
||||
#wrapwrap.o_home_dashboard,
|
||||
.o_home_menu_background {
|
||||
background: linear-gradient(rgb(0 0 0 / 83%), rgb(0 0 0 / 83%)),
|
||||
url('/dine360_dashboard/static/src/img/dashboard_bg.png') no-repeat center center !important;
|
||||
background-size: cover !important;
|
||||
background-attachment: fixed !important;
|
||||
min-height: 100vh !important;
|
||||
padding: 0 !important;
|
||||
margin: 0 !important;
|
||||
font-family: 'Inter', 'Segoe UI', Roboto, sans-serif !important;
|
||||
position: relative !important;
|
||||
}
|
||||
|
||||
#wrapwrap.o_home_dashboard #wrap {
|
||||
background: transparent !important;
|
||||
}
|
||||
|
||||
.o_apps {
|
||||
display: flex !important;
|
||||
flex-wrap: wrap !important;
|
||||
justify-content: center !important;
|
||||
gap: 40px 50px !important;
|
||||
max-width: 1000px !important;
|
||||
margin: 0 auto !important;
|
||||
padding: 20px !important;
|
||||
}
|
||||
|
||||
.o_app {
|
||||
display: flex !important;
|
||||
flex-direction: column !important;
|
||||
align-items: center !important;
|
||||
text-decoration: none !important;
|
||||
transition: transform 0.3s cubic-bezier(0.34, 1.56, 0.64, 1) !important;
|
||||
width: 120px !important;
|
||||
}
|
||||
|
||||
.o_app_icon_container {
|
||||
background: #ffffff !important;
|
||||
width: 90px !important;
|
||||
height: 90px !important;
|
||||
display: flex !important;
|
||||
align-items: center !important;
|
||||
justify-content: center !important;
|
||||
border-radius: 24px !important;
|
||||
box-shadow:
|
||||
0 4px 6px -1px rgba(0, 0, 0, 0.05),
|
||||
0 2px 4px -1px rgba(0, 0, 0, 0.03) !important;
|
||||
margin-bottom: 12px !important;
|
||||
position: relative !important;
|
||||
overflow: hidden;
|
||||
border: 1px solid rgba(0, 0, 0, 0.03) !important;
|
||||
transition: all 0.4s ease !important;
|
||||
}
|
||||
|
||||
.o_app:hover .o_app_icon_container {
|
||||
transform: translateY(-10px) rotate(2deg) !important;
|
||||
background: #ffffff !important;
|
||||
border-bottom: 2px solid #d6111e !important;
|
||||
box-shadow:
|
||||
0 20px 25px -5px rgba(214, 17, 30, 0.2),
|
||||
0 10px 10px -5px rgba(23, 20, 34, 0.1) !important;
|
||||
}
|
||||
|
||||
.o_app_icon_container::before {
|
||||
content: "";
|
||||
--pos-accent-red: #d6111e;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background: linear-gradient(135deg, rgba(255, 255, 255, 0.4) 0%, rgba(255, 255, 255, 0) 50%);
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
.o_app_icon {
|
||||
width: 56px !important;
|
||||
height: 56px !important;
|
||||
object-fit: contain !important;
|
||||
z-index: 2;
|
||||
transition: transform 0.3s ease !important;
|
||||
}
|
||||
|
||||
.o_app:hover .o_app_icon {
|
||||
transform: scale(1.1) !important;
|
||||
}
|
||||
|
||||
.o_app_name {
|
||||
color: #ffffff !important;
|
||||
font-size: 14px !important;
|
||||
font-weight: 500 !important;
|
||||
text-align: center !important;
|
||||
letter-spacing: -0.2px !important;
|
||||
transition: color 0.3s ease !important;
|
||||
}
|
||||
|
||||
.o_app:hover .o_app_name {
|
||||
color: #d6111e !important;
|
||||
font-weight: 700 !important;
|
||||
}
|
||||
|
||||
.o_home_top_bar {
|
||||
position: fixed !important;
|
||||
top: 25px !important;
|
||||
left: 0;
|
||||
right: 0;
|
||||
display: flex !important;
|
||||
justify-content: center !important;
|
||||
z-index: 1000 !important;
|
||||
}
|
||||
|
||||
.o_top_bar_island {
|
||||
display: flex !important;
|
||||
align-items: center !important;
|
||||
gap: 12px !important;
|
||||
padding: 10px 25px !important;
|
||||
background: rgba(0, 0, 0, 0.9) !important;
|
||||
backdrop-filter: blur(15px) !important;
|
||||
-webkit-backdrop-filter: blur(15px);
|
||||
border-radius: 50px !important;
|
||||
border-color: #d6111e !important;
|
||||
box-shadow: 0 0 0 3px rgba(214, 17, 30, 0.15) !important;
|
||||
box-shadow: 0 12px 25px rgba(214, 17, 30, 0.3) !important;
|
||||
}
|
||||
|
||||
.o_top_item {
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
color: #ffffff !important;
|
||||
transition: all 0.3s ease;
|
||||
cursor: pointer;
|
||||
position: relative;
|
||||
text-decoration: none !important;
|
||||
}
|
||||
|
||||
.o_top_item:hover {
|
||||
color: #d6111e !important;
|
||||
transform: translateY(-3px);
|
||||
}
|
||||
|
||||
.o_bar_divider {
|
||||
width: 1px;
|
||||
height: 24px;
|
||||
background: rgba(255, 255, 255, 0.2);
|
||||
margin: 0 10px;
|
||||
}
|
||||
|
||||
.o_ai_icon {
|
||||
font-weight: 800;
|
||||
color: #d6111e !important;
|
||||
}
|
||||
|
||||
.badge_dot {
|
||||
position: absolute !important;
|
||||
top: 8px;
|
||||
right: 8px;
|
||||
width: 8px;
|
||||
height: 8px;
|
||||
background: #d6111e !important;
|
||||
border-radius: 50% !important;
|
||||
border: 2px solid white !important;
|
||||
}
|
||||
|
||||
.o_user_avatar {
|
||||
width: 35px !important;
|
||||
height: 35px !important;
|
||||
border-radius: 12px !important;
|
||||
background: #d6111e !important;
|
||||
color: white !important;
|
||||
font-weight: bold !important;
|
||||
}
|
||||
263
addons/dine360_dashboard/static/src/css/login_style.css
Normal file
@ -0,0 +1,263 @@
|
||||
/* Container: Full Screen Split */
|
||||
.o_login_main_wrapper {
|
||||
display: flex !important;
|
||||
height: 100vh !important;
|
||||
width: 100vw !important;
|
||||
overflow: hidden;
|
||||
background: url('/dine360_theme_chennora/static/src/img/chen-banner-2.webp') !important;
|
||||
background-repeat: no-repeat !important;
|
||||
background-position: center center !important;
|
||||
background-size: cover !important;
|
||||
}
|
||||
|
||||
/* Left Side: Background Image and Branding */
|
||||
.o_login_left_side {
|
||||
flex: 1.5 !important;
|
||||
display: flex !important;
|
||||
align-items: center !important;
|
||||
justify-content: center !important;
|
||||
padding: 60px !important;
|
||||
position: relative;
|
||||
/* Dark overlay on image for text readability */
|
||||
/* background: linear-gradient(rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0.5)),
|
||||
url('/dine360_dashboard/static/src/img/login_bg.png') no-repeat center center !important;
|
||||
background-size: cover !important; */
|
||||
color: white !important;
|
||||
}
|
||||
|
||||
.o_login_content {
|
||||
text-align: center;
|
||||
max-width: 80%;
|
||||
}
|
||||
|
||||
.o_login_content h1 {
|
||||
font-size: 3.8rem !important;
|
||||
font-weight: 800 !important;
|
||||
margin-bottom: 20px;
|
||||
text-shadow: 2px 4px 15px rgba(0, 0, 0, 0.6) !important;
|
||||
}
|
||||
|
||||
.o_login_content p {
|
||||
font-size: 1.4rem !important;
|
||||
opacity: 0.9;
|
||||
}
|
||||
|
||||
/* Right Side: Form Section */
|
||||
.o_login_right_side {
|
||||
flex: 1 !important;
|
||||
/* background: #ffffff !important; */
|
||||
display: flex !important;
|
||||
justify-content: center !important;
|
||||
align-items: center !important;
|
||||
padding: 40px !important;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.o_login_card_wrapper {
|
||||
width: 60%
|
||||
}
|
||||
|
||||
/* Glassmorphism Card UI */
|
||||
.o_login_card {
|
||||
width: 100% !important;
|
||||
max-width: 450px !important;
|
||||
padding: 40px !important;
|
||||
background: rgba(255, 255, 255, 0.05) !important;
|
||||
backdrop-filter: blur(15px) !important;
|
||||
-webkit-backdrop-filter: blur(15px) !important;
|
||||
border-radius: 20px !important;
|
||||
box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.5) !important;
|
||||
border: 1px solid rgba(255, 255, 255, 0.1) !important;
|
||||
z-index: 2;
|
||||
}
|
||||
|
||||
/* Header Text Gradient */
|
||||
.o_login_header_text h3 {
|
||||
font-size: 2rem !important;
|
||||
font-weight: 800 !important;
|
||||
margin-bottom: 10px;
|
||||
color: #d6111e !important;
|
||||
}
|
||||
|
||||
/* Logo */
|
||||
.o_login_logo_container {
|
||||
text-align: center;
|
||||
margin-bottom: 30px;
|
||||
}
|
||||
|
||||
.o_login_logo_container img {
|
||||
max-height: 120px;
|
||||
/* Larger logo */
|
||||
width: auto;
|
||||
filter: drop-shadow(0 0 10px rgba(255, 255, 255, 0.2));
|
||||
}
|
||||
|
||||
/* Form Inputs */
|
||||
.form-control:focus {
|
||||
border-color: #FECD4F !important;
|
||||
box-shadow: 0 0 0 3px rgba(254, 205, 79, 0.2) !important;
|
||||
background: #ffffff !important;
|
||||
}
|
||||
|
||||
.o_login_form_container label {
|
||||
color: #ffffff !important;
|
||||
margin-bottom: 8px;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.o_login_form_container a,
|
||||
.o_login_form_container .btn-link {
|
||||
color: #ffffff !important;
|
||||
}
|
||||
|
||||
.form-control {
|
||||
background: rgba(255, 255, 255, 0.05) !important;
|
||||
border: 1px solid rgba(255, 255, 255, 0.1) !important;
|
||||
border-radius: 12px !important;
|
||||
padding: 12px 15px !important;
|
||||
height: auto !important;
|
||||
color: white !important;
|
||||
}
|
||||
|
||||
.form-control::placeholder {
|
||||
color: rgba(255, 255, 255, 0.3) !important;
|
||||
}
|
||||
|
||||
/* Login Button with Gradient */
|
||||
.oe_login_buttons .btn-primary {
|
||||
background: #FECD4F !important;
|
||||
border: none !important;
|
||||
border-radius: 12px !important;
|
||||
padding: 14px !important;
|
||||
font-weight: 700 !important;
|
||||
font-size: 1rem !important;
|
||||
color: #04121D !important;
|
||||
width: 100% !important;
|
||||
transition: all 0.3s ease !important;
|
||||
box-shadow: 0 4px 15px rgba(254, 205, 79, 0.3) !important;
|
||||
}
|
||||
|
||||
.oe_login_buttons .btn-primary:hover {
|
||||
background: #04121D !important;
|
||||
color: #FECD4F !important;
|
||||
transform: translateY(-2px);
|
||||
box-shadow: 0 8px 20px rgba(254, 205, 79, 0.4) !important;
|
||||
}
|
||||
|
||||
|
||||
/* Responsive Handling */
|
||||
@media (max-width: 992px) {
|
||||
.o_login_main_wrapper {
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.o_login_left_side {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
.o_login_right_side {
|
||||
background: #0f172a !important;
|
||||
/* Keep dark background on mobile */
|
||||
}
|
||||
}
|
||||
|
||||
/* Hide Website Header/Footer ONLY on Login, Signup, Reset Password */
|
||||
body.o_custom_login_body header,
|
||||
body.o_custom_login_body footer,
|
||||
body.o_custom_login_body .o_footer_copyright,
|
||||
body.o_custom_login_body #o_main_nav,
|
||||
body.o_custom_login_body .o_header_standard,
|
||||
body.o_custom_login_body #wrapwrap>header,
|
||||
body.o_custom_login_body #wrapwrap>footer {
|
||||
display: none !important;
|
||||
height: 0 !important;
|
||||
width: 0 !important;
|
||||
visibility: hidden !important;
|
||||
opacity: 0 !important;
|
||||
position: absolute !important;
|
||||
pointer-events: none !important;
|
||||
}
|
||||
|
||||
/* Ensure wrapwrap doesn't have padding/margin from header on these pages */
|
||||
body.o_custom_login_body #wrapwrap {
|
||||
padding-top: 0 !important;
|
||||
margin-top: 0 !important;
|
||||
}
|
||||
|
||||
/* Ensure the wrapper covers the entire screen, ignoring website container constraints */
|
||||
body.o_custom_login_body .o_login_main_wrapper {
|
||||
position: fixed !important;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100vw !important;
|
||||
height: 100vh !important;
|
||||
z-index: 9999;
|
||||
/* Ensure it stays on top */
|
||||
margin: 0 !important;
|
||||
padding: 0 !important;
|
||||
}
|
||||
|
||||
/* Custom Footer */
|
||||
.o_login_footer_custom {
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
right: 0;
|
||||
width: 50%;
|
||||
/* Only on the right side which is 50% usually, or just right side */
|
||||
text-align: center;
|
||||
padding: 15px;
|
||||
background: transparent;
|
||||
color: #6c757d;
|
||||
z-index: 10;
|
||||
font-size: 0.9rem;
|
||||
}
|
||||
|
||||
@media (max-width: 992px) {
|
||||
.o_login_footer_custom {
|
||||
width: 100%;
|
||||
color: white;
|
||||
/* Visible on gradient background */
|
||||
}
|
||||
}
|
||||
|
||||
.o_login_footer_custom a {
|
||||
color: #d6111e;
|
||||
text-decoration: none;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.o_login_footer_custom a:hover {
|
||||
color: #171422;
|
||||
}
|
||||
|
||||
|
||||
/* website login screen */
|
||||
.oe_website_login_container {
|
||||
display: flex !important;
|
||||
justify-content: center !important;
|
||||
align-items: center !important;
|
||||
height: 100vh !important;
|
||||
/* width: 100vw !important; */
|
||||
overflow: hidden !important;
|
||||
background: linear-gradient(rgba(0, 0, 0, 0.6), rgba(0, 0, 0, 0.6)), url('/dine360_theme_chennora/static/src/img/chen-banner-2.webp') no-repeat center center !important;
|
||||
background-size: cover !important;
|
||||
}
|
||||
|
||||
.oe_website_login_container .oe_login_form,
|
||||
.oe_website_login_container .oe_signup_form,
|
||||
.oe_website_login_container .oe_reset_password_form {
|
||||
width: 60% !important;
|
||||
padding: 40px !important;
|
||||
background: rgba(255, 255, 255, 0.05) !important;
|
||||
backdrop-filter: blur(15px) !important;
|
||||
-webkit-backdrop-filter: blur(15px) !important;
|
||||
border-radius: 20px !important;
|
||||
box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.5) !important;
|
||||
border: 1px solid rgba(255, 255, 255, 0.1) !important;
|
||||
z-index: 2;
|
||||
max-width: 400px;
|
||||
}
|
||||
.oe_website_login_container label,
|
||||
.oe_website_login_container a {
|
||||
color: #ffffff !important;
|
||||
}
|
||||
302
addons/dine360_dashboard/static/src/css/pos_style.css
Normal file
@ -0,0 +1,302 @@
|
||||
/* ========================================
|
||||
CHENNORA RUSH MODE - POS THEME (ULTRA PREMIUM)
|
||||
======================================== */
|
||||
|
||||
:root {
|
||||
--pos-primary: #171422;
|
||||
/* Secondary Dark */
|
||||
--pos-secondary: #d6111e;
|
||||
/* Main Teal */
|
||||
--pos-accent-orange: #e66421;
|
||||
/* Biryani Orange */
|
||||
--pos-accent-gold: #cc9900;
|
||||
/* Tandoor Gold */
|
||||
--pos-accent-red: #d6111e;
|
||||
/* Main Teal */
|
||||
--pos-bg-main: #f8fafc;
|
||||
/* Ultra light gray */
|
||||
--pos-card-dark: #1a1d23;
|
||||
/* Dark Card Background */
|
||||
--pos-text-light: #ffffff;
|
||||
--pos-text-dark: #111827;
|
||||
--border-radius-xl: 24px;
|
||||
--border-radius-lg: 16px;
|
||||
}
|
||||
|
||||
/* 1. Main POS Layout Swapping */
|
||||
/* Standard Odoo: Leftpane = Cart, Rightpane = Products */
|
||||
/* Goal: Food List on Left, Orders/Calculations on Right */
|
||||
/* .pos .pos-content,
|
||||
.pos .product-screen {
|
||||
display: flex !important;
|
||||
flex-direction: row-reverse !important; */
|
||||
/* SWAP Panes */
|
||||
/* height: calc(100vh - 85px) !important;
|
||||
} */
|
||||
|
||||
.pos .leftpane,
|
||||
.pos .order-container {
|
||||
/* The Cart Section - Move to Right */
|
||||
width: 480px !important;
|
||||
border-left: 2px solid #f1f5f9 !important;
|
||||
border-right: none !important;
|
||||
background: #ffffff !important;
|
||||
display: flex !important;
|
||||
flex-direction: column !important;
|
||||
flex: none !important;
|
||||
height: 37.9vh !important;
|
||||
}
|
||||
|
||||
.product-screen {
|
||||
display: flex !important;
|
||||
flex-direction: row-reverse !important;
|
||||
}
|
||||
|
||||
.pos .rightpane,
|
||||
.pos .product-list-container {
|
||||
/* The Product Section - Move to Left */
|
||||
flex: 1 !important;
|
||||
background: #f8fafc !important;
|
||||
}
|
||||
|
||||
/* 2. Header & Branding */
|
||||
.pos .pos-topheader {
|
||||
background: #171422 !important;
|
||||
border-bottom: 2px solid #d6111e !important;
|
||||
color: #fff !important;
|
||||
height: 85px !important;
|
||||
display: flex !important;
|
||||
align-items: center !important;
|
||||
padding: 0 30px !important;
|
||||
}
|
||||
|
||||
/* Logo from Odoo Settings */
|
||||
.pos .pos-logo {
|
||||
display: flex !important;
|
||||
align-items: center !important;
|
||||
gap: 15px !important;
|
||||
margin-right: 50px !important;
|
||||
width: auto !important;
|
||||
}
|
||||
|
||||
.pos .pos-logo img,
|
||||
.pos .pos-logo {
|
||||
content: url('/web/binary/company_logo') !important;
|
||||
height: 55px !important;
|
||||
width: auto !important;
|
||||
object-fit: contain !important;
|
||||
}
|
||||
|
||||
/* "Rush Mode" Label next to logo */
|
||||
.pos .pos-logo::after {
|
||||
content: "RUSH MODE";
|
||||
font-size: 14px;
|
||||
font-weight: 800;
|
||||
color: #ef4444;
|
||||
letter-spacing: 2px;
|
||||
border-left: 2px solid #e5e7eb;
|
||||
padding-left: 20px;
|
||||
margin-left: 10px;
|
||||
}
|
||||
|
||||
/* 3. Search Bar - Teal Theme */
|
||||
.pos .search-bar {
|
||||
background: #e0f2f1 !important;
|
||||
border-radius: var(--border-radius-lg) !important;
|
||||
margin: 0 !important;
|
||||
width: 380px !important;
|
||||
height: 50px !important;
|
||||
display: flex !important;
|
||||
align-items: center !important;
|
||||
padding: 0 20px !important;
|
||||
}
|
||||
|
||||
.pos .search-bar input {
|
||||
background: transparent !important;
|
||||
border: none !important;
|
||||
font-weight: 800 !important;
|
||||
color: #00695c !important;
|
||||
font-size: 16px !important;
|
||||
text-transform: uppercase !important;
|
||||
}
|
||||
|
||||
/* 4. Category Bar - Fix Truncation */
|
||||
.pos .category-list {
|
||||
display: flex !important;
|
||||
gap: 12px !important;
|
||||
padding: 15px 30px !important;
|
||||
background: #ffffff !important;
|
||||
border-bottom: 2px solid #f1f5f9 !important;
|
||||
}
|
||||
|
||||
.pos .category-button {
|
||||
border-radius: var(--border-radius-lg) !important;
|
||||
font-weight: 900 !important;
|
||||
text-transform: uppercase !important;
|
||||
padding: 12px 30px !important;
|
||||
font-size: 14px !important;
|
||||
border: none !important;
|
||||
min-width: 140px !important;
|
||||
/* STOP MAI... truncation */
|
||||
white-space: nowrap !important;
|
||||
background: #f1f5f9 !important;
|
||||
color: #475569 !important;
|
||||
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05) !important;
|
||||
}
|
||||
|
||||
.pos .category-button.active {
|
||||
background: #d6111e !important;
|
||||
color: #ffffff !important;
|
||||
}
|
||||
|
||||
/* Dynamic Colors for specific indexes */
|
||||
.pos .category-button:nth-child(2) {
|
||||
background: var(--pos-accent-orange) !important;
|
||||
color: white !important;
|
||||
}
|
||||
|
||||
.pos .category-button:nth-child(3) {
|
||||
background: var(--pos-accent-gold) !important;
|
||||
color: white !important;
|
||||
}
|
||||
|
||||
/* 5. Product Cards - Dark Premium */
|
||||
.pos .product-list-container {
|
||||
background: #f8fafc !important;
|
||||
}
|
||||
|
||||
.pos .product-list {
|
||||
display: flex !important;
|
||||
flex-wrap: wrap !important;
|
||||
padding: 25px !important;
|
||||
gap: 25px !important;
|
||||
}
|
||||
|
||||
.pos .product {
|
||||
background: #171422 !important;
|
||||
border-radius: var(--border-radius-lg) !important;
|
||||
width: 210px !important;
|
||||
height: 230px !important;
|
||||
flex: 0 0 auto !important;
|
||||
flex-shrink: 0 !important;
|
||||
border: none !important;
|
||||
box-shadow: 0 2px 4px rgba(42, 106, 126, 0.05) !important;
|
||||
transition: all 0.3s ease !important;
|
||||
position: relative !important;
|
||||
overflow: hidden !important;
|
||||
}
|
||||
|
||||
.pos .product:hover {
|
||||
transform: translateY(-8px) scale(1.02) !important;
|
||||
}
|
||||
|
||||
.pos .product .product-img {
|
||||
width: 100% !important;
|
||||
height: 150px !important;
|
||||
object-fit: cover !important;
|
||||
}
|
||||
|
||||
.product-img img {
|
||||
width: 100% !important;
|
||||
height: 100% !important;
|
||||
/* object-fit: cover !important; */
|
||||
}
|
||||
|
||||
.pos .product .product-name {
|
||||
color: #ffffff !important;
|
||||
font-size: 16px !important;
|
||||
font-weight: 700 !important;
|
||||
padding: 12px 15px 5px 15px !important;
|
||||
background: transparent !important;
|
||||
}
|
||||
|
||||
.pos .product .price-tag {
|
||||
background: transparent !important;
|
||||
color: #ffffff !important;
|
||||
font-size: 15px !important;
|
||||
font-weight: 600 !important;
|
||||
position: relative !important;
|
||||
bottom: 5px !important;
|
||||
left: 15px !important;
|
||||
top: auto !important;
|
||||
right: auto !important;
|
||||
padding: 0 !important;
|
||||
}
|
||||
|
||||
/* 6. Order (Cart) Styling - Now on Right */
|
||||
.pos .order-container {
|
||||
background: #ffffff !important;
|
||||
padding: 10px 0 !important;
|
||||
}
|
||||
|
||||
.pos .orderline {
|
||||
border-radius: var(--border-radius-lg) !important;
|
||||
border: 2px solid #f1f5f9 !important;
|
||||
margin: 8px 20px !important;
|
||||
padding: 15px !important;
|
||||
background: white !important;
|
||||
transition: all 0.2s ease !important;
|
||||
}
|
||||
|
||||
.pos .orderline.selected {
|
||||
border: 2px solid var(--pos-secondary) !important;
|
||||
background: #f0fdf4 !important;
|
||||
box-shadow: 0 4px 12px rgba(16, 185, 129, 0.1) !important;
|
||||
}
|
||||
|
||||
.pos .orderline .product-name {
|
||||
font-weight: 900 !important;
|
||||
font-size: 17px !important;
|
||||
color: #111827 !important;
|
||||
}
|
||||
|
||||
/* 7. Summary & Pay Button */
|
||||
.pos .order-summary {
|
||||
background: #ffffff !important;
|
||||
padding: 25px 30px !important;
|
||||
border-top: 2px dashed #e2e8f0 !important;
|
||||
}
|
||||
|
||||
.pos .summary .total {
|
||||
color: var(--pos-secondary) !important;
|
||||
font-size: 40px !important;
|
||||
font-weight: 900 !important;
|
||||
letter-spacing: -1px;
|
||||
}
|
||||
|
||||
.pos .action-pad .button.pay {
|
||||
background: var(--pos-secondary) !important;
|
||||
color: white !important;
|
||||
border-radius: var(--border-radius-lg) !important;
|
||||
margin: 20px !important;
|
||||
height: 75px !important;
|
||||
font-size: 24px !important;
|
||||
font-weight: 900 !important;
|
||||
text-transform: uppercase !important;
|
||||
display: flex !important;
|
||||
align-items: center !important;
|
||||
justify-content: center !important;
|
||||
box-shadow: 0 12px 25px rgba(214, 17, 30, 0.3) !important;
|
||||
border: none !important;
|
||||
}
|
||||
|
||||
.pos .action-pad .button.pay::after {
|
||||
content: "\2794";
|
||||
margin-left: 15px;
|
||||
font-size: 30px;
|
||||
}
|
||||
|
||||
/* 8. Numpad styling */
|
||||
.pos .numpad {
|
||||
background: #f8fafc !important;
|
||||
padding: 20px !important;
|
||||
}
|
||||
|
||||
.pos .numpad button {
|
||||
border-radius: 12px !important;
|
||||
border: 1px solid #e2e8f0 !important;
|
||||
background: white !important;
|
||||
height: 55px !important;
|
||||
font-weight: 700 !important;
|
||||
font-size: 14px !important;
|
||||
}
|
||||
312
addons/dine360_dashboard/static/src/css/shop_style.css
Normal file
@ -0,0 +1,312 @@
|
||||
/* ========================================
|
||||
SHOP PAGE - LEFT SIDEBAR FILTER STYLING
|
||||
======================================== */
|
||||
|
||||
/* Ensure Shop Page Layout with Sidebar */
|
||||
#wrapwrap.oe_website_sale {
|
||||
background: #ffffff !important;
|
||||
}
|
||||
|
||||
/* Main Shop Container - Two Column Layout */
|
||||
.oe_website_sale #products_grid_before {
|
||||
display: block !important;
|
||||
visibility: visible !important;
|
||||
opacity: 1 !important;
|
||||
width: 100% !important;
|
||||
}
|
||||
|
||||
/* Left Sidebar Filter Section */
|
||||
.oe_website_sale #o_shop_collapse_category,
|
||||
.oe_website_sale .o_wsale_products_searchbar_form,
|
||||
.oe_website_sale #wsale_products_categories_collapse {
|
||||
display: block !important;
|
||||
visibility: visible !important;
|
||||
opacity: 1 !important;
|
||||
}
|
||||
|
||||
/* Shop Layout Container */
|
||||
.oe_website_sale .container,
|
||||
.oe_website_sale .container-fluid {
|
||||
max-width: 1400px;
|
||||
margin: 0 auto;
|
||||
padding: 20px;
|
||||
}
|
||||
|
||||
/* Row with Sidebar and Products */
|
||||
.oe_website_sale .row {
|
||||
display: flex !important;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
/* Left Sidebar Column (Categories/Filters) */
|
||||
.oe_website_sale #products_grid_before,
|
||||
.oe_website_sale .col-lg-3,
|
||||
.oe_website_sale aside {
|
||||
flex: 0 0 280px !important;
|
||||
max-width: 280px !important;
|
||||
display: block !important;
|
||||
visibility: visible !important;
|
||||
padding-right: 20px;
|
||||
}
|
||||
|
||||
/* Right Products Column */
|
||||
.oe_website_sale #products_grid,
|
||||
.oe_website_sale .col-lg-9 {
|
||||
flex: 1 !important;
|
||||
max-width: calc(100% - 280px) !important;
|
||||
}
|
||||
|
||||
/* Filter Sidebar Styling */
|
||||
.oe_website_sale #products_grid_before {
|
||||
background: rgba(255, 255, 255, 0.95) !important;
|
||||
border-radius: 16px !important;
|
||||
padding: 20px !important;
|
||||
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.08) !important;
|
||||
backdrop-filter: blur(10px);
|
||||
border: 1px solid rgba(0, 0, 0, 0.05);
|
||||
}
|
||||
|
||||
/* Category Filter Section */
|
||||
.oe_website_sale .o_wsale_products_searchbar_form,
|
||||
.oe_website_sale #wsale_products_categories_collapse {
|
||||
margin-bottom: 25px;
|
||||
}
|
||||
|
||||
/* Category Filter Title */
|
||||
.oe_website_sale #products_grid_before h5,
|
||||
.oe_website_sale #products_grid_before .h5,
|
||||
.oe_website_sale #products_grid_before h6 {
|
||||
color: var(--secondary-color, #2BB1A5) !important;
|
||||
font-weight: 700 !important;
|
||||
font-size: 1.1rem !important;
|
||||
margin-bottom: 15px !important;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.5px;
|
||||
}
|
||||
|
||||
/* Category List Items */
|
||||
.oe_website_sale #products_grid_before ul,
|
||||
.oe_website_sale #products_grid_before .list-group {
|
||||
list-style: none;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.oe_website_sale #products_grid_before li,
|
||||
.oe_website_sale #products_grid_before .list-group-item {
|
||||
background: transparent !important;
|
||||
border: none !important;
|
||||
padding: 10px 15px !important;
|
||||
margin-bottom: 5px !important;
|
||||
border-radius: 10px !important;
|
||||
transition: all 0.2s ease !important;
|
||||
}
|
||||
|
||||
.oe_website_sale #products_grid_before li a,
|
||||
.oe_website_sale #products_grid_before .list-group-item a {
|
||||
color: #4a5568 !important;
|
||||
text-decoration: none !important;
|
||||
font-weight: 500 !important;
|
||||
display: block;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.oe_website_sale #products_grid_before li:hover,
|
||||
.oe_website_sale #products_grid_before .list-group-item:hover {
|
||||
background: #2bb1a5 !important;
|
||||
transform: translateX(5px);
|
||||
}
|
||||
|
||||
.oe_website_sale #products_grid_before li:hover a,
|
||||
.oe_website_sale #products_grid_before .list-group-item:hover a {
|
||||
color: #ffffff !important;
|
||||
}
|
||||
|
||||
/* Active Category */
|
||||
.oe_website_sale #products_grid_before li.active,
|
||||
.oe_website_sale #products_grid_before .list-group-item.active {
|
||||
background: transparent !important;
|
||||
box-shadow: none !important;
|
||||
}
|
||||
|
||||
.oe_website_sale #products_grid_before li.active a,
|
||||
.oe_website_sale #products_grid_before .list-group-item.active a {
|
||||
color: #000000 !important;
|
||||
font-weight: 700 !important;
|
||||
}
|
||||
|
||||
/* Search Bar in Sidebar */
|
||||
.oe_website_sale #products_grid_before .form-control,
|
||||
.oe_website_sale #products_grid_before input[type="text"],
|
||||
.oe_website_sale #products_grid_before input[type="search"] {
|
||||
border-radius: 10px !important;
|
||||
border: 1px solid #e2e8f0 !important;
|
||||
padding: 10px 15px !important;
|
||||
background: #f8f9fa !important;
|
||||
transition: all 0.2s ease;
|
||||
}
|
||||
|
||||
.oe_website_sale #products_grid_before .form-control:focus,
|
||||
.oe_website_sale #products_grid_before input:focus {
|
||||
border-color: var(--secondary-color, #2BB1A5) !important;
|
||||
background: #ffffff !important;
|
||||
box-shadow: 0 0 0 3px rgba(43, 177, 165, 0.15) !important;
|
||||
outline: none;
|
||||
}
|
||||
|
||||
/* Filter Buttons */
|
||||
.oe_website_sale #products_grid_before .btn,
|
||||
.oe_website_sale #products_grid_before button {
|
||||
border-radius: 10px !important;
|
||||
padding: 8px 20px !important;
|
||||
font-weight: 600 !important;
|
||||
transition: all 0.2s ease;
|
||||
}
|
||||
|
||||
.oe_website_sale #products_grid_before .btn-primary {
|
||||
background: #2BB1A5 !important;
|
||||
border: none !important;
|
||||
color: #ffffff !important;
|
||||
box-shadow: 0 4px 12px rgba(43, 177, 165, 0.3) !important;
|
||||
}
|
||||
|
||||
.oe_website_sale #products_grid_before .btn-primary:hover {
|
||||
transform: translateY(-2px);
|
||||
box-shadow: 0 8px 15px rgba(43, 177, 165, 0.4) !important;
|
||||
}
|
||||
|
||||
/* Attribute Filters (Color, Size, etc.) */
|
||||
.oe_website_sale #products_grid_before .css_attribute_color {
|
||||
display: inline-block;
|
||||
width: 30px;
|
||||
height: 30px;
|
||||
border-radius: 50%;
|
||||
margin: 5px;
|
||||
border: 2px solid #e2e8f0;
|
||||
cursor: pointer;
|
||||
transition: all 0.2s ease;
|
||||
}
|
||||
|
||||
.oe_website_sale #products_grid_before .css_attribute_color:hover,
|
||||
.oe_website_sale #products_grid_before .css_attribute_color.active {
|
||||
border-color: var(--secondary-color, #2BB1A5);
|
||||
transform: scale(1.1);
|
||||
box-shadow: 0 2px 8px rgba(43, 177, 165, 0.3);
|
||||
}
|
||||
|
||||
/* Price Range Filter */
|
||||
.oe_website_sale #products_grid_before .o_wsale_price_filter {
|
||||
margin-top: 20px;
|
||||
}
|
||||
|
||||
.oe_website_sale #products_grid_before .o_wsale_price_filter input[type="range"] {
|
||||
width: 100%;
|
||||
accent-color: var(--secondary-color, #2BB1A5);
|
||||
}
|
||||
|
||||
/* Collapse/Expand Buttons */
|
||||
.oe_website_sale #products_grid_before .btn-link {
|
||||
color: var(--secondary-color, #2BB1A5) !important;
|
||||
text-decoration: none !important;
|
||||
font-weight: 600 !important;
|
||||
}
|
||||
|
||||
.oe_website_sale #products_grid_before .btn-link:hover {
|
||||
color: var(--primary-color, #171422) !important;
|
||||
}
|
||||
|
||||
/* Mobile Responsive */
|
||||
@media (max-width: 991px) {
|
||||
|
||||
.oe_website_sale #products_grid_before,
|
||||
.oe_website_sale .col-lg-3,
|
||||
.oe_website_sale aside {
|
||||
flex: 0 0 100% !important;
|
||||
max-width: 100% !important;
|
||||
margin-bottom: 20px;
|
||||
padding-right: 0;
|
||||
}
|
||||
|
||||
.oe_website_sale #products_grid,
|
||||
.oe_website_sale .col-lg-9 {
|
||||
flex: 0 0 100% !important;
|
||||
max-width: 100% !important;
|
||||
}
|
||||
}
|
||||
|
||||
/* Ensure visibility of all filter elements */
|
||||
.oe_website_sale .o_wsale_products_searchbar_form,
|
||||
.oe_website_sale .o_wsale_products_categories,
|
||||
.oe_website_sale #wsale_products_categories_collapse,
|
||||
.oe_website_sale .o_wsale_products_attributes,
|
||||
.oe_website_sale .o_wsale_products_price {
|
||||
display: block !important;
|
||||
visibility: visible !important;
|
||||
opacity: 1 !important;
|
||||
}
|
||||
|
||||
/* Category Navigation */
|
||||
.oe_website_sale .o_wsale_products_categories ul.o_wsale_categories_list {
|
||||
padding-left: 0 !important;
|
||||
}
|
||||
|
||||
.oe_website_sale .o_wsale_products_categories ul.o_wsale_categories_list li {
|
||||
list-style: none;
|
||||
}
|
||||
|
||||
/* Attribute Filters Section */
|
||||
.oe_website_sale .o_wsale_products_attributes {
|
||||
margin-top: 20px;
|
||||
}
|
||||
|
||||
.oe_website_sale .o_wsale_products_attributes .o_wsale_attribute {
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.oe_website_sale .o_wsale_products_attributes .o_wsale_attribute label {
|
||||
display: block;
|
||||
margin-bottom: 10px;
|
||||
color: #4a5568;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
/* Clear Filters Button */
|
||||
.oe_website_sale .o_wsale_clear_filters {
|
||||
margin-top: 20px;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.oe_website_sale .o_wsale_clear_filters .btn {
|
||||
width: 100%;
|
||||
background: #f8f9fa !important;
|
||||
border: 1px solid #e2e8f0 !important;
|
||||
color: #4a5568 !important;
|
||||
}
|
||||
|
||||
.oe_website_sale .o_wsale_clear_filters .btn:hover {
|
||||
background: #ffffff !important;
|
||||
border-color: var(--secondary-color, #2BB1A5) !important;
|
||||
color: var(--secondary-color, #2BB1A5) !important;
|
||||
}
|
||||
|
||||
.css_quantity input {
|
||||
max-width: 20px !important;
|
||||
}
|
||||
|
||||
/* Product Details Quantity Input Fix */
|
||||
.css_quantity input.quantity {
|
||||
color: #000000 !important;
|
||||
background-color: #ffffff !important;
|
||||
opacity: 1 !important;
|
||||
width: 60px !important;
|
||||
max-width: 60px !important;
|
||||
height: 45px !important;
|
||||
line-height: 45px !important;
|
||||
font-weight: 600 !important;
|
||||
font-size: 18px !important;
|
||||
padding: 0 !important;
|
||||
text-align: center !important;
|
||||
border: 1px solid #000000 !important;
|
||||
display: inline-block !important;
|
||||
visibility: visible !important;
|
||||
}
|
||||
599
addons/dine360_dashboard/static/src/css/theme_variables.css
Normal file
@ -0,0 +1,599 @@
|
||||
/* ========================================
|
||||
ODOO THEME COLOR VARIABLES
|
||||
Primary Color: #ec0000 (Dine360 Red)
|
||||
Secondary Color: #000000 (Black)
|
||||
======================================== */
|
||||
|
||||
:root {
|
||||
/* Primary Brand Colors */
|
||||
--primary-color: #d6111e;
|
||||
--primary-dark: #8B0A0E;
|
||||
--primary-light: #E57373;
|
||||
--primary-lighter: #FFCDD2;
|
||||
|
||||
/* Secondary/Accent Color */
|
||||
--secondary-color: #171422;
|
||||
--secondary-dark: #000000;
|
||||
--secondary-light: #2d293d;
|
||||
|
||||
/* Gradient Combinations Removed - Using Solid Colors */
|
||||
--gradient-primary: #d6111e;
|
||||
--gradient-primary-hover: #8B0A0E;
|
||||
|
||||
/* Home Page Background */
|
||||
--bg-gradient-main: #ffffff;
|
||||
|
||||
/* UI Element Colors */
|
||||
--btn-primary-bg: #d6111e;
|
||||
--link-color: #171422;
|
||||
--link-hover: #d6111e;
|
||||
|
||||
/* Status Colors */
|
||||
--success-color: #171422;
|
||||
--warning-color: #FECD4F;
|
||||
--danger-color: #d6111e;
|
||||
--info-color: #2d293d;
|
||||
|
||||
/* Shadows */
|
||||
--shadow-primary: 0 4px 15px rgba(214, 17, 30, 0.2);
|
||||
--shadow-primary-hover: 0 8px 20px rgba(214, 17, 30, 0.3);
|
||||
--shadow-card: 0 10px 30px rgba(23, 20, 34, 0.08);
|
||||
}
|
||||
|
||||
/* ::selection - Text Selection Color */
|
||||
::selection {
|
||||
background: var(--primary-color) !important;
|
||||
color: #fff !important;
|
||||
}
|
||||
|
||||
/* Scrollbar Styling (Webkit) */
|
||||
::-webkit-scrollbar-thumb {
|
||||
background: var(--secondary-color) !important;
|
||||
border-radius: 10px;
|
||||
}
|
||||
|
||||
::-webkit-scrollbar-track {
|
||||
background: #f1f1f1;
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------
|
||||
GLOBAL UI OVERRIDES (HOME PAGE STYLE)
|
||||
--------------------------------------------------------- */
|
||||
|
||||
/* Global Background & Font */
|
||||
body,
|
||||
.o_web_client {
|
||||
background: var(--bg-gradient-main) !important;
|
||||
font-family: 'Inter', 'Segoe UI', Roboto, sans-serif !important;
|
||||
font-size: 15px !important;
|
||||
/* Increased Font Size for Readability */
|
||||
background-attachment: fixed !important;
|
||||
background-size: cover !important;
|
||||
}
|
||||
|
||||
/*
|
||||
REMOVED AGGRESSIVE LAYOUT OVERRIDES
|
||||
(o_action_manager, o_view_controller overrides deleted to restore Odoo default structural behavior)
|
||||
*/
|
||||
|
||||
/* ---------------------------------------------------------
|
||||
NAVBAR & SIDEBAR (CONTROL PANEL)
|
||||
--------------------------------------------------------- */
|
||||
|
||||
/* Top Navbar - Glassmorphism */
|
||||
.o_main_navbar {
|
||||
background: #ffffff !important;
|
||||
border-bottom: 2px solid var(--primary-color) !important;
|
||||
box-shadow: 0 4px 15px rgba(0, 0, 0, 0.03) !important;
|
||||
color: #2c3e50 !important;
|
||||
}
|
||||
|
||||
.o_main_navbar .o_menu_brand {
|
||||
color: var(--secondary-color) !important;
|
||||
font-weight: 800 !important;
|
||||
font-size: 1.4rem !important;
|
||||
letter-spacing: -0.5px;
|
||||
}
|
||||
|
||||
.o_main_navbar .o_menu_sections .o_nav_entry,
|
||||
.o_main_navbar .o_menu_systray .o_nav_entry {
|
||||
color: white !important;
|
||||
font-size: 14px !important;
|
||||
font-weight: 600 !important;
|
||||
}
|
||||
|
||||
.o_main_navbar .o_menu_sections .o_nav_entry:hover,
|
||||
.o_main_navbar .o_menu_systray .o_nav_entry:hover {
|
||||
background: var(--primary-color) !important;
|
||||
}
|
||||
|
||||
/* Control Panel (Search, Filter Bar) */
|
||||
.o_control_panel {
|
||||
background: #fdfdfd !important;
|
||||
border-bottom: 1px solid rgba(0, 0, 0, 0.05) !important;
|
||||
}
|
||||
|
||||
/* Breadcrumbs */
|
||||
.breadcrumb-item a {
|
||||
color: #d6111e !important;
|
||||
font-weight: 700 !important;
|
||||
font-size: 18px !important;
|
||||
/* Larger headers */
|
||||
}
|
||||
|
||||
.breadcrumb-item.active {
|
||||
color: #718096 !important;
|
||||
font-weight: 600 !important;
|
||||
font-size: 18px !important;
|
||||
}
|
||||
|
||||
/* Search Bar Input */
|
||||
.o_searchview {
|
||||
background: #f8f9fa !important;
|
||||
border: 1px solid #e2e8f0 !important;
|
||||
border-radius: 10px !important;
|
||||
padding: 6px 15px !important;
|
||||
}
|
||||
|
||||
.o_searchview .o_searchview_input {
|
||||
background: transparent !important;
|
||||
font-size: 14px !important;
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------
|
||||
TABLES (LIST VIEW)
|
||||
--------------------------------------------------------- */
|
||||
|
||||
.o_list_view .o_list_table {
|
||||
background: transparent !important;
|
||||
}
|
||||
|
||||
/* Table Header */
|
||||
.o_list_view .o_list_table thead {
|
||||
background: rgba(248, 249, 250, 0.8) !important;
|
||||
color: #4a5568 !important;
|
||||
border-bottom: 2px solid var(--secondary-color) !important;
|
||||
}
|
||||
|
||||
.o_list_view .o_list_table thead th {
|
||||
border: none !important;
|
||||
text-transform: uppercase;
|
||||
font-size: 0.75rem;
|
||||
letter-spacing: 0.05em;
|
||||
font-weight: 700 !important;
|
||||
padding: 12px 10px !important;
|
||||
}
|
||||
|
||||
/* Table Rows */
|
||||
.o_list_view .o_list_table tbody tr.o_data_row {
|
||||
transition: all 0.2s ease !important;
|
||||
border-bottom: 1px solid rgba(0, 0, 0, 0.03) !important;
|
||||
}
|
||||
|
||||
.o_list_view .o_list_table tbody tr.o_data_row:hover {
|
||||
background-color: rgba(214, 17, 30, 0.05) !important;
|
||||
/* Light Red Hover */
|
||||
transform: scale(1.002);
|
||||
box-shadow: 0 4px 10px rgba(0, 0, 0, 0.02);
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------
|
||||
KANBAN CARDS
|
||||
--------------------------------------------------------- */
|
||||
|
||||
.o_kanban_view .o_kanban_record {
|
||||
background: #fff !important;
|
||||
border: 1px solid rgba(0, 0, 0, 0.04) !important;
|
||||
border-radius: 16px !important;
|
||||
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.02) !important;
|
||||
margin-bottom: 10px !important;
|
||||
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1) !important;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
/* Hover Effect for Cards */
|
||||
.o_kanban_view .o_kanban_record:hover {
|
||||
transform: translateY(-5px) !important;
|
||||
box-shadow: 0 15px 30px rgba(0, 0, 0, 0.08) !important;
|
||||
border-color: var(--primary-color) !important;
|
||||
}
|
||||
|
||||
/* Card Header/Title */
|
||||
.o_kanban_record .o_kanban_record_title,
|
||||
.o_kanban_record strong {
|
||||
color: #2d3748 !important;
|
||||
font-weight: 700 !important;
|
||||
font-size: 1.05rem !important;
|
||||
}
|
||||
|
||||
/* Kanban Group Headers */
|
||||
.o_kanban_view .o_kanban_group_header {
|
||||
background: transparent !important;
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------
|
||||
BUTTONS & FORM ELEMENTS
|
||||
--------------------------------------------------------- */
|
||||
|
||||
/* Gradient Buttons */
|
||||
.btn-primary,
|
||||
.o_form_button_save,
|
||||
.o_form_button_create {
|
||||
background: var(--gradient-primary) !important;
|
||||
border: none !important;
|
||||
border-radius: 10px !important;
|
||||
padding: 8px 20px !important;
|
||||
font-weight: 600 !important;
|
||||
letter-spacing: 0.3px;
|
||||
box-shadow: 0 4px 12px rgba(214, 17, 30, 0.3) !important;
|
||||
color: #fff !important;
|
||||
}
|
||||
|
||||
.btn-primary:hover,
|
||||
.o_form_button_save:hover,
|
||||
.o_form_button_create:hover {
|
||||
background: var(--gradient-primary-hover) !important;
|
||||
transform: translateY(-2px);
|
||||
box-shadow: 0 8px 15px rgba(214, 17, 30, 0.4) !important;
|
||||
}
|
||||
|
||||
/* Secondary Buttons */
|
||||
.btn-secondary {
|
||||
background: #fff !important;
|
||||
border: 1px solid #e2e8f0 !important;
|
||||
color: #4a5568 !important;
|
||||
border-radius: 10px !important;
|
||||
}
|
||||
|
||||
.btn-secondary:hover {
|
||||
background: #f7fafc !important;
|
||||
color: var(--secondary-color) !important;
|
||||
border-color: var(--secondary-color) !important;
|
||||
}
|
||||
|
||||
/* Form Inputs */
|
||||
.o_form_view .o_input {
|
||||
border-radius: 8px !important;
|
||||
border: 1px solid #e2e8f0 !important;
|
||||
padding: 8px 12px !important;
|
||||
background-color: #fcfcfc !important;
|
||||
}
|
||||
|
||||
.o_form_view .o_input:focus {
|
||||
border-color: var(--secondary-color) !important;
|
||||
background-color: #fff !important;
|
||||
box-shadow: 0 0 0 3px rgba(214, 17, 30, 0.15) !important;
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------
|
||||
COMPONENT OVERRIDES
|
||||
--------------------------------------------------------- */
|
||||
|
||||
/* Primary Buttons */
|
||||
.btn-primary,
|
||||
.o_form_button_save,
|
||||
.o_form_button_create,
|
||||
.o_button_import {
|
||||
background: var(--gradient-primary) !important;
|
||||
border: none !important;
|
||||
border-radius: 10px !important;
|
||||
padding: 8px 20px !important;
|
||||
font-weight: 600 !important;
|
||||
letter-spacing: 0.3px;
|
||||
box-shadow: 0 4px 12px rgba(214, 17, 30, 0.3) !important;
|
||||
}
|
||||
|
||||
.btn-primary:hover,
|
||||
.o_form_button_save:hover,
|
||||
.o_form_button_create:hover,
|
||||
.o_button_import:hover {
|
||||
background: var(--gradient-primary-hover) !important;
|
||||
transform: translateY(-2px);
|
||||
box-shadow: 0 8px 15px rgba(214, 17, 30, 0.4) !important;
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------
|
||||
DASHBOARD SPECIFIC UI UPDATES (But safer for global)
|
||||
--------------------------------------------------------- */
|
||||
|
||||
/* Top Menu Tabs */
|
||||
.o_main_navbar .o_menu_sections .dropdown-item,
|
||||
.o_main_navbar .o_menu_sections .o_nav_entry {
|
||||
background: transparent !important;
|
||||
color: var(--primary-color) !important;
|
||||
font-weight: 600 !important;
|
||||
border-radius: 8px !important;
|
||||
margin: 0 4px !important;
|
||||
}
|
||||
|
||||
/* Active Tab / Hover State */
|
||||
.o_main_navbar .o_menu_sections .o_nav_entry:hover,
|
||||
.o_main_navbar .o_menu_sections .show .dropdown-toggle {
|
||||
background-color: #ffffff !important;
|
||||
/* Yellow Active Background */
|
||||
color: #d6111e !important;
|
||||
border-bottom: 2px solid #d6111e !important;
|
||||
}
|
||||
|
||||
/* Dashboard Sidebar (Finance/Logistics) */
|
||||
.o_notebook .nav.nav-tabs,
|
||||
.o_dashboard_view .o_group_selector {
|
||||
background: rgba(255, 255, 255, 0.6) !important;
|
||||
backdrop-filter: blur(10px);
|
||||
border-right: 1px solid rgba(0, 0, 0, 0.05);
|
||||
padding: 15px !important;
|
||||
}
|
||||
|
||||
.o_notebook .nav-link,
|
||||
.o_dashboard_view .o_group_selector li {
|
||||
color: var(--secondary-color) !important;
|
||||
/* Teal Text */
|
||||
border: none !important;
|
||||
border-radius: 10px !important;
|
||||
margin-bottom: 8px !important;
|
||||
padding: 10px 15px !important;
|
||||
font-weight: 500 !important;
|
||||
transition: all 0.2s ease;
|
||||
}
|
||||
|
||||
.o_notebook .nav-link.active,
|
||||
.o_dashboard_view .o_group_selector li.selected {
|
||||
background: var(--gradient-primary) !important;
|
||||
color: #fff !important;
|
||||
box-shadow: 0 4px 10px rgba(214, 17, 30, 0.3) !important;
|
||||
}
|
||||
|
||||
/* Dashboard KPI Cards (Invoiced, Average Invoice, DSO) */
|
||||
.o_dashboard_view .o_group .o_aggregate,
|
||||
.o_group .o_group_col_6 {
|
||||
background: #fff !important;
|
||||
border-radius: 15px !important;
|
||||
padding: 20px !important;
|
||||
box-shadow: 0 5px 20px rgba(0, 0, 0, 0.05) !important;
|
||||
border: 1px solid rgba(0, 0, 0, 0.02) !important;
|
||||
transition: transform 0.3s ease !important;
|
||||
margin-bottom: 20px !important;
|
||||
}
|
||||
|
||||
.o_dashboard_view .o_group .o_aggregate:hover {
|
||||
transform: translateY(-5px) !important;
|
||||
box-shadow: 0 10px 25px rgba(214, 17, 30, 0.15) !important;
|
||||
border-color: var(--secondary-color) !important;
|
||||
}
|
||||
|
||||
/* Value Text in Cards */
|
||||
.o_dashboard_view .o_group .o_aggregate .o_value {
|
||||
color: var(--secondary-color) !important;
|
||||
font-weight: 800 !important;
|
||||
font-size: 2rem !important;
|
||||
}
|
||||
|
||||
.o_dashboard_view .o_group .o_aggregate label {
|
||||
color: #718096 !important;
|
||||
font-size: 0.9rem !important;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 1px;
|
||||
}
|
||||
|
||||
/* Charts Background */
|
||||
.o_graph_view {
|
||||
background: transparent !important;
|
||||
}
|
||||
|
||||
.o_graph_canvas_container canvas {
|
||||
background: rgba(255, 255, 255, 0.5) !important;
|
||||
border-radius: 15px;
|
||||
padding: 10px;
|
||||
}
|
||||
|
||||
/* Links */
|
||||
a,
|
||||
.o_form_uri,
|
||||
.oe_link,
|
||||
.btn-link {
|
||||
color: var(--secondary-color) !important;
|
||||
/* Switched to teal for better readibility on white */
|
||||
}
|
||||
|
||||
a:hover,
|
||||
.o_form_uri:hover,
|
||||
.oe_link:hover,
|
||||
.btn-link:hover {
|
||||
color: var(--primary-dark) !important;
|
||||
}
|
||||
|
||||
/* Nav & Menu Active States */
|
||||
.nav-link.active,
|
||||
.o_menu_sections .dropdown-item.active,
|
||||
.o_menu_brand:hover {
|
||||
color: var(--secondary-color) !important;
|
||||
border-bottom-color: var(--secondary-color) !important;
|
||||
}
|
||||
|
||||
/* Badges */
|
||||
.badge-primary,
|
||||
.o_tag {
|
||||
background-color: var(--primary-color) !important;
|
||||
color: #fff !important;
|
||||
}
|
||||
|
||||
/* Progress bars */
|
||||
.progress-bar {
|
||||
background-color: var(--secondary-color) !important;
|
||||
}
|
||||
|
||||
/* Checkboxes and Radios */
|
||||
.custom-control-input:checked~.custom-control-label::before,
|
||||
.o_checkbox input:checked+label::before {
|
||||
background-color: var(--secondary-color) !important;
|
||||
border-color: var(--secondary-color) !important;
|
||||
}
|
||||
|
||||
/* Form Controls - Focus using Secondary (Teal) like Login Page */
|
||||
.form-control:focus,
|
||||
.o_input:focus,
|
||||
.o_searchview_input:focus {
|
||||
border-color: var(--secondary-color) !important;
|
||||
box-shadow: 0 0 0 0.2rem rgba(214, 17, 30, 0.25) !important;
|
||||
}
|
||||
|
||||
/* Loading Bar */
|
||||
.o_loading {
|
||||
background-color: var(--primary-color) !important;
|
||||
}
|
||||
|
||||
/* Backend View Headers */
|
||||
.o_list_view .o_list_table thead,
|
||||
.o_kanban_view .o_kanban_group_header {
|
||||
background-color: #f8f9fa;
|
||||
border-bottom: 2px solid var(--primary-color) !important;
|
||||
color: #4a5568 !important;
|
||||
font-weight: 600 !important;
|
||||
padding: 10px !important;
|
||||
}
|
||||
|
||||
/* Kanban Records Selected */
|
||||
.o_kanban_record.o_kanban_record_selected {
|
||||
box-shadow: 0 0 0 2px var(--primary-color) !important;
|
||||
}
|
||||
|
||||
/* Pagination */
|
||||
.page-item.active .page-link {
|
||||
background-color: var(--secondary-color) !important;
|
||||
border-color: var(--secondary-color) !important;
|
||||
}
|
||||
|
||||
/* Switcher/Toggle */
|
||||
.o_switch.custom-switch .custom-control-input:checked~.custom-control-label::before {
|
||||
background-color: var(--secondary-color) !important;
|
||||
}
|
||||
|
||||
/* Calendar Today */
|
||||
.fc-day-today {
|
||||
background-color: rgba(254, 205, 79, 0.1) !important;
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------
|
||||
HEADER SUBMENU DROPDOWN NAVIGATION
|
||||
--------------------------------------------------------- */
|
||||
|
||||
/* Dropdown Container */
|
||||
.dropdown-menu {
|
||||
background: #ffffff !important;
|
||||
border: 1px solid #e2e8f0 !important;
|
||||
border-radius: 12px !important;
|
||||
box-shadow: 0 20px 50px rgba(0, 0, 0, 0.15) !important;
|
||||
padding: 8px !important;
|
||||
margin-top: 5px !important;
|
||||
z-index: 10000 !important;
|
||||
/* Raised to be above most backend elements */
|
||||
}
|
||||
|
||||
/* Fix for Dropdowns being hidden in List Views (Editable rows) */
|
||||
.o_list_view .o_list_table {
|
||||
overflow: visible !important;
|
||||
}
|
||||
|
||||
.o_list_view .o_list_table tbody tr,
|
||||
.o_list_view .o_list_table tbody td {
|
||||
overflow: visible !important;
|
||||
}
|
||||
|
||||
/* Ensure Autocomplete stays in front */
|
||||
.ui-autocomplete,
|
||||
.o_autocomplete_dropdown,
|
||||
.dropdown-menu.show {
|
||||
z-index: 10001 !important;
|
||||
}
|
||||
|
||||
|
||||
.o_main_navbar .o_menu_sections .o_nav_entry.active,
|
||||
.o_main_navbar .o_menu_sections .dropdown-toggle {
|
||||
background-color: none !important;
|
||||
}
|
||||
|
||||
|
||||
.o_main_navbar .o_menu_sections .o_nav_entry.active,
|
||||
.o_main_navbar .o_menu_sections .dropdown-toggle.active {
|
||||
background-color: var(--primary-color) !important;
|
||||
}
|
||||
|
||||
.o_main_navbar .o_menu_brand,
|
||||
.o_main_navbar .o_navbar_apps_menu .dropdown-toggle,
|
||||
.o_main_navbar .o_nav_entry,
|
||||
.o_main_navbar .dropdown-toggle {
|
||||
color: var(--secondary-color) !important;
|
||||
font-size: 1.1rem !important;
|
||||
transition: all 0.2s ease !important;
|
||||
}
|
||||
|
||||
/* Navbar Icons */
|
||||
.o_main_navbar .o_menu_systray .o_nav_entry i,
|
||||
.o_main_navbar .o_menu_apps .o_app_drawer i,
|
||||
.o_main_navbar .o_menu_sections .fa {
|
||||
color: var(--secondary-color) !important;
|
||||
font-size: 1.1rem !important;
|
||||
transition: all 0.2s ease !important;
|
||||
}
|
||||
|
||||
.o_main_navbar .o_menu_systray .o_nav_entry:hover i,
|
||||
.o_main_navbar .o_menu_apps .o_app_drawer:hover i {
|
||||
color: var(--primary-dark) !important;
|
||||
transform: scale(1.1);
|
||||
text-shadow: 0 2px 10px rgba(214, 17, 30, 0.5);
|
||||
}
|
||||
|
||||
/* Dropdown Items */
|
||||
.dropdown-item {
|
||||
color: #4a5568 !important;
|
||||
padding: 10px 15px !important;
|
||||
border-radius: 8px !important;
|
||||
font-weight: 500 !important;
|
||||
transition: all 0.2s ease !important;
|
||||
margin-bottom: 2px !important;
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
/* Dropdown Item Hover */
|
||||
.dropdown-item:hover,
|
||||
.dropdown-item:focus {
|
||||
background: var(--gradient-primary) !important;
|
||||
color: #fff !important;
|
||||
box-shadow: 0 4px 10px rgba(214, 17, 30, 0.2);
|
||||
}
|
||||
|
||||
/* Dropdown Header/Divider */
|
||||
.dropdown-divider {
|
||||
border-top: 1px solid rgba(0, 0, 0, 0.06) !important;
|
||||
margin: 8px 0 !important;
|
||||
}
|
||||
|
||||
.dropdown-header {
|
||||
color: var(--secondary-color) !important;
|
||||
font-weight: 700 !important;
|
||||
text-transform: uppercase;
|
||||
font-size: 0.75rem !important;
|
||||
letter-spacing: 0.05em;
|
||||
padding: 8px 15px !important;
|
||||
background: transparent !important;
|
||||
}
|
||||
|
||||
/* Active Dropdown Item */
|
||||
.dropdown-item.active,
|
||||
.dropdown-item:active {
|
||||
background: var(--gradient-primary) !important;
|
||||
color: #fff !important;
|
||||
}
|
||||
|
||||
.o_main_navbar .o_menu_sections .o_nav_entry,
|
||||
.o_main_navbar .o_menu_sections .dropdown-toggle {
|
||||
background: #ffffff;
|
||||
border-bottom: 2px solid #d6111e;
|
||||
}
|
||||
|
||||
.list-group-item.active {
|
||||
z-index: 2;
|
||||
color: #fff;
|
||||
background-color: #d6111e;
|
||||
border-color: #d6111e;
|
||||
}
|
||||
138
addons/dine360_dashboard/static/src/css/website_style.css
Normal file
@ -0,0 +1,138 @@
|
||||
/* Custom Website Header Styling */
|
||||
|
||||
/* Force Header Background to Black */
|
||||
header#top,
|
||||
body .o_header_standard,
|
||||
body header.o_header_standard,
|
||||
body .navbar,
|
||||
body #o_main_nav {
|
||||
background-color: #111 !important;
|
||||
/* background: #171422 !important; */
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
/* Navbar Links / Menu Items */
|
||||
header#top .navbar-nav .nav-link,
|
||||
header#top .nav-link,
|
||||
body .o_header_standard .nav-link,
|
||||
body .navbar .nav-link,
|
||||
body #o_main_nav .nav-link {
|
||||
color: #ffffff !important;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
/* Navbar Icons (Search, Cart, User, etc.) */
|
||||
header#top i,
|
||||
header#top .fa,
|
||||
body .o_header_standard i,
|
||||
body .o_header_standard .fa,
|
||||
body .navbar i,
|
||||
body .navbar .fa {
|
||||
color: #ffffff !important;
|
||||
}
|
||||
|
||||
/* Brand / Logo Text (if text logo) */
|
||||
header#top .navbar-brand,
|
||||
body .o_header_standard .navbar-brand {
|
||||
color: #ffffff !important;
|
||||
}
|
||||
|
||||
/* Hover States - Using Theme Teal */
|
||||
header#top .nav-link:hover,
|
||||
body .o_header_standard .nav-link:hover,
|
||||
header#top i:hover,
|
||||
body .o_header_standard i:hover {
|
||||
color: #2BB1A5 !important;
|
||||
}
|
||||
|
||||
/* Active States - Using Theme Gold */
|
||||
header#top .nav-link.active,
|
||||
body .o_header_standard .nav-link.active {
|
||||
color: #2BB1A5 !important;
|
||||
}
|
||||
|
||||
/* Dropdown Menu overrides (ensure visibility) */
|
||||
header#top .dropdown-menu,
|
||||
body .o_header_standard .dropdown-menu {
|
||||
background-color: #171422 !important;
|
||||
border: 1px solid rgba(43, 177, 165, 0.2);
|
||||
}
|
||||
|
||||
header#top .dropdown-item,
|
||||
body .o_header_standard .dropdown-item {
|
||||
color: #ffffff !important;
|
||||
}
|
||||
|
||||
header#top .dropdown-item:hover,
|
||||
body .o_header_standard .dropdown-item:hover {
|
||||
background-color: #2BB1A5 !important;
|
||||
color: #ffffff !important;
|
||||
}
|
||||
|
||||
/* Header Cart & Search Icon Adjustments */
|
||||
.o_wsale_my_cart,
|
||||
.o_nav_item_search,
|
||||
.o_nav_item_cart,
|
||||
header .navbar-nav .nav-item a[href="/shop/cart"],
|
||||
header .navbar-nav .nav-item a.o_navlink_background_hover {
|
||||
transition: all 0.3s ease !important;
|
||||
}
|
||||
|
||||
/* Hover background for Search and Cart icons */
|
||||
.o_wsale_my_cart:hover,
|
||||
.o_nav_item_search:hover,
|
||||
.o_nav_item_cart:hover,
|
||||
header .navbar-nav .nav-item a[href="/shop/cart"]:hover,
|
||||
header .o_search_button:hover {
|
||||
background-color: #FECD4F !important;
|
||||
border-radius: 50px !important;
|
||||
}
|
||||
|
||||
/* Ensure icons turn dark on yellow background hover */
|
||||
.o_wsale_my_cart:hover i,
|
||||
.o_nav_item_search:hover i,
|
||||
.o_nav_item_cart:hover i,
|
||||
header .navbar-nav .nav-item a[href="/shop/cart"]:hover i,
|
||||
header .o_search_button:hover i {
|
||||
color: #111 !important;
|
||||
}
|
||||
|
||||
/* Cart Count Badge Color */
|
||||
.o_wsale_my_cart .badge,
|
||||
.o_wsale_my_cart .o_wsale_cart_quantity,
|
||||
header .navbar-nav .nav-item .badge-pill,
|
||||
header .navbar-nav .nav-item .badge {
|
||||
background-color: #2BB1A5 !important;
|
||||
color: #ffffff !important;
|
||||
border: none !important;
|
||||
}
|
||||
|
||||
/* Header Action Buttons */
|
||||
header .btn,
|
||||
header .btn-primary,
|
||||
header .o_header_cta_btn,
|
||||
header .btn-contact,
|
||||
header a.btn[href="/contactus"],
|
||||
header a.btn[href*="contact"] {
|
||||
background-color: #FECD4F !important;
|
||||
color: #04121D !important;
|
||||
border: none !important;
|
||||
border-radius: 8px !important;
|
||||
padding: 10px 25px !important;
|
||||
font-weight: 700 !important;
|
||||
text-transform: uppercase !important;
|
||||
transition: all 0.3s ease !important;
|
||||
box-shadow: 0 4px 10px rgba(254, 205, 79, 0.3) !important;
|
||||
text-decoration: none !important;
|
||||
}
|
||||
|
||||
header .btn:hover,
|
||||
header .btn-primary:hover,
|
||||
header .o_header_cta_btn:hover,
|
||||
header .btn-contact:hover,
|
||||
header a.btn[href="/contactus"]:hover,
|
||||
header a.btn[href*="contact"]:hover {
|
||||
background-color: #FECD4F !important;
|
||||
color: #FECD4F !important;
|
||||
transform: translateY(-2px) !important;
|
||||
}
|
||||
BIN
addons/dine360_dashboard/static/src/img/dashboard_bg.png
Normal file
|
After Width: | Height: | Size: 1014 KiB |
BIN
addons/dine360_dashboard/static/src/img/login_bg.png
Normal file
|
After Width: | Height: | Size: 760 KiB |
11
addons/dine360_dashboard/static/src/js/chennora_title.js
Normal file
@ -0,0 +1,11 @@
|
||||
/** @odoo-module **/
|
||||
|
||||
import { WebClient } from "@web/webclient/webclient";
|
||||
import { patch } from "@web/core/utils/patch";
|
||||
|
||||
patch(WebClient.prototype, {
|
||||
setup() {
|
||||
super.setup();
|
||||
this.title.setParts({ brand: "Chennora" });
|
||||
}
|
||||
});
|
||||
110
addons/dine360_dashboard/views/home_template.xml
Normal file
@ -0,0 +1,110 @@
|
||||
<odoo>
|
||||
<template id="image_home_template" name="Home Page Icons">
|
||||
<t t-call="web.frontend_layout">
|
||||
<t t-set="no_footer" t-value="True"/>
|
||||
<t t-set="no_header" t-value="True"/>
|
||||
<t t-set="pageName" t-value="'home_dashboard'"/>
|
||||
<link rel="stylesheet" type="text/css" href="/dine360_dashboard/static/src/css/home_menu.css?v=1.1"/>
|
||||
|
||||
<div class="o_home_menu_background">
|
||||
<!-- Top Bar -->
|
||||
<div class="o_home_top_bar">
|
||||
<div class="o_top_bar_island">
|
||||
<a href="/" class="o_top_item" title="Chennora Home" style="width: auto; padding: 0 10px;">
|
||||
<img t-attf-src="/web/binary/company_logo" style="height: 24px; width: auto; object-fit: contain;"/>
|
||||
</a>
|
||||
<div class="o_bar_divider" style="margin: 0 5px;"></div>
|
||||
|
||||
<a href="/" class="o_top_item" title="View Website">
|
||||
<i class="fa fa-globe"/>
|
||||
</a>
|
||||
|
||||
<a href="#" class="o_top_item" title="AI Assistant">
|
||||
<span class="o_ai_icon">AI</span>
|
||||
</a>
|
||||
|
||||
<a href="#" class="o_top_item" title="Search">
|
||||
<i class="fa fa-search"/>
|
||||
</a>
|
||||
|
||||
<a href="/web#action=mail.action_discuss" class="o_top_item" title="Messages">
|
||||
<i class="fa fa-comments-o"/>
|
||||
<span class="badge_dot"/>
|
||||
</a>
|
||||
|
||||
<!-- Only show Settings for Admins -->
|
||||
<t t-set="is_admin" t-value="user_id.has_group('base.group_system') or user_id.has_group('dine360_restaurant.group_restaurant_admin')"/>
|
||||
<t t-if="is_admin">
|
||||
<a href="/web#action=base.action_res_config_general_settings" class="o_top_item" title="Settings">
|
||||
<i class="fa fa-sliders"/>
|
||||
</a>
|
||||
</t>
|
||||
|
||||
<div class="o_bar_divider"></div>
|
||||
|
||||
|
||||
<div class="o_user_avatar_container">
|
||||
<a href="/web#action=base.action_res_users_my" class="o_user_avatar" style="display:flex; align-items:center; justify-content:center; text-decoration:none;">
|
||||
<t t-esc="user_id.name[0] if user_id else 'U'"/>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="container" style="padding-top: 100px;">
|
||||
<!-- Low Stock Alert Section -->
|
||||
<t t-if="low_stock_products">
|
||||
<div class="o_low_stock_alert mb-5" style="background: rgba(220, 53, 69, 0.1); border: 1px solid rgba(220, 53, 69, 0.2); border-radius: 12px; padding: 15px 25px;">
|
||||
<div class="d-flex align-items-center mb-2">
|
||||
<i class="fa fa-exclamation-triangle me-2" style="color: #dc3545; font-size: 1.2rem;"></i>
|
||||
<h5 class="mb-0 fw-bold" style="color: #dc3545;">Low Stock Alert!</h5>
|
||||
<a href="/web#action=stock.product_template_action_product" class="ms-auto text-decoration-none small fw-bold" style="color: #dc3545;">
|
||||
Manage Inventory <i class="fa fa-arrow-right ms-1"></i>
|
||||
</a>
|
||||
|
||||
</div>
|
||||
<div class="d-flex flex-wrap gap-2">
|
||||
<t t-foreach="low_stock_products" t-as="product">
|
||||
<div class="badge rounded-pill bg-white border px-3 py-2 shadow-sm" style="color: #333;">
|
||||
<span class="fw-bold" t-esc="product.name"/>:
|
||||
<span class="text-danger fw-bold" t-esc="product.qty_available"/>
|
||||
<span class="text-muted" t-esc="product.uom_id.name"/>
|
||||
</div>
|
||||
</t>
|
||||
</div>
|
||||
</div>
|
||||
</t>
|
||||
|
||||
<div class="o_apps">
|
||||
|
||||
<t t-foreach="menus" t-as="menu">
|
||||
<t t-set="app_url" t-value="'/web#menu_id=' + str(menu.id)"/>
|
||||
<!-- Check if it is the Website app by checking the icon module or name -->
|
||||
<t t-if="(menu.web_icon and menu.web_icon.startswith('website,')) or menu.name == 'Website'">
|
||||
<t t-set="app_url" t-value="'/home'"/>
|
||||
</t>
|
||||
<a t-att-href="app_url" class="o_app">
|
||||
<div class="o_app_icon_container">
|
||||
<t t-if="menu.web_icon">
|
||||
<t t-set="icon_data" t-value="menu.web_icon.split(',')"/>
|
||||
<img t-attf-src="/{{icon_data[0]}}/{{icon_data[1]}}"
|
||||
class="o_app_icon" loading="lazy"
|
||||
onerror="this.style.display='none'; this.nextElementSibling.style.display='block';"/>
|
||||
<div class="o_app_icon fa fa-cube" style="font-size: 40px; color: #7c7bad; display: none;"/>
|
||||
</t>
|
||||
<t t-else="">
|
||||
<div class="o_app_icon fa fa-cube" style="font-size: 40px; color: #7c7bad;"/>
|
||||
</t>
|
||||
</div>
|
||||
<div class="o_app_name">
|
||||
<t t-esc="menu.name"/>
|
||||
</div>
|
||||
</a>
|
||||
</t>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</t>
|
||||
</template>
|
||||
</odoo>
|
||||
|
||||
45
addons/dine360_dashboard/views/login_templates.xml
Normal file
@ -0,0 +1,45 @@
|
||||
<odoo>
|
||||
<template id="custom_login_layout" inherit_id="web.login_layout" name="Custom Login Layout" priority="10">
|
||||
<xpath expr="//t[@t-call='web.frontend_layout']" position="inside">
|
||||
<t t-set="body_classname" t-value="'o_custom_login_body'"/>
|
||||
<t t-set="no_header" t-value="True"/>
|
||||
<t t-set="no_footer" t-value="True"/>
|
||||
<t t-set="head">
|
||||
<link rel="stylesheet" type="text/css" href="/dine360_dashboard/static/src/css/login_style.css"/>
|
||||
</t>
|
||||
</xpath>
|
||||
|
||||
<xpath expr="//div[contains(@class,'container')]" position="replace">
|
||||
<div class="o_login_main_wrapper">
|
||||
<div class="o_login_left_side">
|
||||
<!-- Space for right alignment -->
|
||||
</div>
|
||||
|
||||
<div class="o_login_right_side">
|
||||
<div class="o_login_card">
|
||||
<div class="o_login_logo_container">
|
||||
<img t-attf-src="/web/binary/company_logo{{ '?db=' + request.db if request.db else '' }}" alt="Logo"/>
|
||||
</div>
|
||||
|
||||
<div class="o_login_header_text text-center">
|
||||
<h3>Login</h3>
|
||||
<p style="color: rgba(255, 255, 255, 0.6) !important;">Welcome back! Please enter your details.</p>
|
||||
</div>
|
||||
|
||||
<div class="o_login_form_container">
|
||||
<t t-out="0"/>
|
||||
</div>
|
||||
|
||||
<div class="o_login_footer text-center mt-4">
|
||||
<a href="/web/database/selector" t-if="not disable_database_manager" class="small text-decoration-none" style="color: rgba(255, 255, 255, 0.5) !important;">Manage Databases</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="o_login_footer_custom">
|
||||
<p>Powered by <a href="https://metatroncubesolutions.com/" target="_blank">Metatron Cube Solutions</a></p>
|
||||
</div>
|
||||
</div>
|
||||
</xpath>
|
||||
</template>
|
||||
</odoo>
|
||||
17
addons/dine360_dashboard/views/shop_template.xml
Normal file
@ -0,0 +1,17 @@
|
||||
<odoo>
|
||||
<!-- Ensure Shop Filter Sidebar is Visible -->
|
||||
<template id="products_categories_inherit" inherit_id="website_sale.products_categories" name="Show Categories Sidebar">
|
||||
<!-- Force display of categories sidebar -->
|
||||
<!-- <xpath expr="//div[@id='products_grid_before']" position="attributes">
|
||||
<attribute name="class">col-lg-3 d-block</attribute>
|
||||
<attribute name="style">display: block !important; visibility: visible !important;</attribute>
|
||||
</xpath> -->
|
||||
</template>
|
||||
|
||||
<!-- Ensure Products Grid Takes Remaining Space -->
|
||||
<!-- <template id="products_grid_inherit" inherit_id="website_sale.products" name="Adjust Products Grid">
|
||||
<xpath expr="//div[@id='products_grid']" position="attributes">
|
||||
<attribute name="class">col-lg-9</attribute>
|
||||
</xpath>
|
||||
</template> -->
|
||||
</odoo>
|
||||
27
addons/dine360_dashboard/views/web_title_template.xml
Normal file
@ -0,0 +1,27 @@
|
||||
<odoo>
|
||||
<template id="chennora_web_layout" inherit_id="web.layout" name="Chennora Title">
|
||||
<xpath expr="//title" position="replace">
|
||||
<title>Chennora</title>
|
||||
</xpath>
|
||||
<xpath expr="//link[@rel='shortcut icon']" position="replace">
|
||||
<link rel="shortcut icon" href="/dine360_theme_chennora/static/description/icon.png" type="image/x-icon"/>
|
||||
</xpath>
|
||||
<xpath expr="//link[@rel='icon']" position="replace">
|
||||
<link rel="icon" href="/dine360_theme_chennora/static/description/icon.png" type="image/png"/>
|
||||
</xpath>
|
||||
|
||||
<xpath expr="//body" position="inside">
|
||||
<t t-if="not request.env.user._is_public()">
|
||||
<a href="/" class="o_dashboard_return_btn d-print-none" title="Back to Dashboard"
|
||||
style="position: fixed; bottom: 20px; right: 20px; z-index: 99999;
|
||||
background-color: #d6111e; color: #ffff !important; padding: 12px 24px;
|
||||
border-radius: 50px; text-decoration: none; font-weight: bold;
|
||||
box-shadow: 0 4px 15px rgba(0,0,0,0.2); display: flex; align-items: center;
|
||||
gap: 8px; transition: all 0.3s ease; border: 2px solid #ffffffff !important; font-family: sans-serif;">
|
||||
<i class="fa fa-th-large" style="font-size: 18px;"></i>
|
||||
<span>Back to Dashboard</span>
|
||||
</a>
|
||||
</t>
|
||||
</xpath>
|
||||
</template>
|
||||
</odoo>
|
||||
14
addons/dine360_dashboard/views/website_logo.xml
Normal file
@ -0,0 +1,14 @@
|
||||
<odoo>
|
||||
<data>
|
||||
<!--
|
||||
Override the Shared Brand Placeholder
|
||||
Using a generic selector '//span' because strict field matching failed.
|
||||
This template typically contains a single span or img for the logo.
|
||||
-->
|
||||
<template id="custom_website_logo_placeholder" inherit_id="website.placeholder_header_brand" name="Custom Website Logo Placeholder">
|
||||
<xpath expr="/*" position="replace">
|
||||
<img src="/web/binary/company_logo" t-att-alt="website.name" class="img-fluid" style="height: 3rem;"/>
|
||||
</xpath>
|
||||
</template>
|
||||
</data>
|
||||
</odoo>
|
||||
2
addons/dine360_theme_chennora/__init__.py
Normal file
@ -0,0 +1,2 @@
|
||||
from . import controllers
|
||||
from . import models
|
||||
39
addons/dine360_theme_chennora/__manifest__.py
Normal file
@ -0,0 +1,39 @@
|
||||
{
|
||||
'name': 'Dine360 Theme Chennora',
|
||||
'description': 'Custom theme for Dine360 Chennora website',
|
||||
'category': 'Theme/Website',
|
||||
'version': '1.0',
|
||||
'author': 'Dine360',
|
||||
'depends': ['website', 'website_sale', 'website_crm'],
|
||||
'data': [
|
||||
'views/layout.xml', # Header, Footer, and Global Layout changes
|
||||
'views/pages.xml', # specific page content (Home, About, etc.)
|
||||
'views/about_page.xml', # About Page
|
||||
'views/contact_page.xml',# Contact Page
|
||||
'views/faq_page.xml', # FAQ Page
|
||||
'views/blog_page.xml', # Blog Page
|
||||
'views/blog_detail_page.xml', # Blog Detail Page
|
||||
'views/shop_page.xml', # Shop Page
|
||||
'views/product_details_page.xml', # Customized Product Details Page
|
||||
'views/product_views.xml', # Product Form custom fields
|
||||
'views/snippets.xml', # Custom Building Blocks
|
||||
'views/options.xml', # Options for snippets (if any)
|
||||
'data/website_data.xml', # Data for creating pages
|
||||
],
|
||||
'assets': {
|
||||
'web.assets_frontend': [
|
||||
'dine360_theme_chennora/static/src/scss/primary_variables.scss',
|
||||
'dine360_theme_chennora/static/src/scss/theme.scss',
|
||||
'dine360_theme_chennora/static/src/scss/shop.scss',
|
||||
'dine360_theme_chennora/static/src/js/deal_switcher.js',
|
||||
'dine360_theme_chennora/static/src/js/category_slider.js',
|
||||
],
|
||||
},
|
||||
'images': [
|
||||
'static/description/cover.png',
|
||||
],
|
||||
'installable': True,
|
||||
'application': True,
|
||||
'license': 'LGPL-3',
|
||||
}
|
||||
|
||||
1
addons/dine360_theme_chennora/controllers/__init__.py
Normal file
@ -0,0 +1 @@
|
||||
from . import main
|
||||
92
addons/dine360_theme_chennora/controllers/main.py
Normal file
@ -0,0 +1,92 @@
|
||||
from odoo import http
|
||||
from odoo.http import request
|
||||
|
||||
class ContactController(http.Controller):
|
||||
@http.route('/contactus/submit', type='http', auth="public", website=True, csrf=True)
|
||||
def contact_submit(self, **post):
|
||||
name = post.get('name')
|
||||
email = post.get('email_from')
|
||||
phone = post.get('phone')
|
||||
subject = post.get('subject')
|
||||
message = post.get('description')
|
||||
|
||||
# Format the email content
|
||||
email_content = f"""
|
||||
<div style="font-family: Arial, sans-serif; padding: 20px; border: 1px solid #ddd; border-radius: 8px;">
|
||||
<h2 style="color: #2BB1A5; border-bottom: 2px solid #FECD4F; padding-bottom: 10px;">New Contact Form Submission</h2>
|
||||
<table style="width: 100%; border-collapse: collapse; margin-top: 15px;">
|
||||
<tr>
|
||||
<td style="padding: 8px; font-weight: bold; width: 30%;">Full Name:</td>
|
||||
<td style="padding: 8px;">{name}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="padding: 8px; font-weight: bold;">Email:</td>
|
||||
<td style="padding: 8px;">{email}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="padding: 8px; font-weight: bold;">Phone:</td>
|
||||
<td style="padding: 8px;">{phone}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="padding: 8px; font-weight: bold;">Subject:</td>
|
||||
<td style="padding: 8px;">{subject}</td>
|
||||
</tr>
|
||||
</table>
|
||||
<div style="margin-top: 20px; padding: 15px; background-color: #F8F9FA; border-left: 4px solid #2BB1A5;">
|
||||
<strong style="display: block; margin-bottom: 10px;">Message:</strong>
|
||||
<div style="white-space: pre-wrap;">{message}</div>
|
||||
</div>
|
||||
</div>
|
||||
"""
|
||||
|
||||
mail_values = {
|
||||
'subject': f"Contact Form: {subject or 'Inquiry'} from {name}",
|
||||
'body_html': email_content,
|
||||
'email_to': 'alaguraj0361@gmail.com',
|
||||
'email_from': request.env.user.company_id.email or 'noreply@chennora.com',
|
||||
'reply_to': email,
|
||||
}
|
||||
|
||||
# Create and send the mail
|
||||
try:
|
||||
mail = request.env['mail.mail'].sudo().create(mail_values)
|
||||
mail.send()
|
||||
except Exception as e:
|
||||
# You might want to log the error
|
||||
pass
|
||||
|
||||
return request.render('dine360_theme_chennora.contact_thank_you')
|
||||
|
||||
class BlogController(http.Controller):
|
||||
@http.route(['/blog'], type='http', auth='public', website=True)
|
||||
def blog_list(self, **post):
|
||||
blog_posts = request.env['chennora.blog.post'].sudo().search([('active', '=', True)])
|
||||
return request.render('dine360_theme_chennora.blog_page', {
|
||||
'blog_posts': blog_posts,
|
||||
})
|
||||
|
||||
@http.route(['/blog/<string:slug>'], type='http', auth='public', website=True)
|
||||
def blog_detail(self, slug, **post):
|
||||
blog_post = request.env['chennora.blog.post'].sudo().search([('slug', '=', slug), ('active', '=', True)], limit=1)
|
||||
if not blog_post:
|
||||
return request.not_found()
|
||||
|
||||
recent_posts = request.env['chennora.blog.post'].sudo().search([('active', '=', True), ('id', '!=', blog_post.id)], limit=3)
|
||||
|
||||
# Get dynamic categories and counts
|
||||
all_posts = request.env['chennora.blog.post'].sudo().search([('active', '=', True)])
|
||||
categories = {}
|
||||
for p in all_posts:
|
||||
if p.category:
|
||||
categories[p.category] = categories.get(p.category, 0) + 1
|
||||
|
||||
return request.render('dine360_theme_chennora.blog_detail_layout', {
|
||||
'blog_title': blog_post.title,
|
||||
'blog_img': blog_post.image,
|
||||
'blog_date': blog_post.date.strftime('%B %d, %Y') if blog_post.date else '',
|
||||
'blog_category': blog_post.category,
|
||||
'blog_content': blog_post.content,
|
||||
'recent_posts': recent_posts,
|
||||
'categories': categories,
|
||||
})
|
||||
|
||||
30
addons/dine360_theme_chennora/data/website_data.xml
Normal file
@ -0,0 +1,30 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<data noupdate="1">
|
||||
<!-- Create the /about page explicitly and link it to the standard About Us view
|
||||
which our theme modifies in views/pages.xml -->
|
||||
<record id="about_page_chennora" model="website.page">
|
||||
<field name="url">/about</field>
|
||||
<field name="is_published">True</field>
|
||||
<field name="view_id" ref="dine360_theme_chennora.about_page"/>
|
||||
<field name="name">About Us</field>
|
||||
<field name="website_indexed" eval="True"/>
|
||||
</record>
|
||||
|
||||
<record id="faq_page_chennora" model="website.page">
|
||||
<field name="url">/faq</field>
|
||||
<field name="is_published">True</field>
|
||||
<field name="view_id" ref="dine360_theme_chennora.faq_page"/>
|
||||
<field name="name">FAQ</field>
|
||||
<field name="website_indexed" eval="True"/>
|
||||
</record>
|
||||
|
||||
<record id="blog_page_chennora" model="website.page">
|
||||
<field name="url">/blog</field>
|
||||
<field name="is_published">True</field>
|
||||
<field name="view_id" ref="dine360_theme_chennora.blog_page"/>
|
||||
<field name="name">Blog</field>
|
||||
<field name="website_indexed" eval="True"/>
|
||||
</record>
|
||||
</data>
|
||||
</odoo>
|
||||
742
addons/dine360_theme_chennora/full_import.py
Normal file
@ -0,0 +1,742 @@
|
||||
|
||||
from datetime import datetime
|
||||
|
||||
blog_posts = [
|
||||
{
|
||||
"slug": "dining-with-family-chennora-is-the-perfect-spot-for-a-south-indian-feast",
|
||||
"title": "Dining with Family? Here’s Why Chennora is the Perfect Spot for a South Indian Feast",
|
||||
"category": "Tradition",
|
||||
"excerpt": "Dining out with family is more than just a meal—it’s about creating memorable moments and enjoying delicious food together.",
|
||||
"image": "/dine360_theme_chennora/static/src/img/blog-detail-1.webp",
|
||||
"date": "2026-03-27",
|
||||
"content": """<div class="hilight-text mt-4 mb-4 wow fadeInUp">
|
||||
<p class="pb-2 ">Dining out with family is more than just a meal—it’s about creating memorable moments and enjoying
|
||||
delicious food
|
||||
together. If you’re looking for a place that serves authentic South Indian cuisine in a family-friendly environment,
|
||||
look no further than Chennora Indian Kitchen Bar in Brampton.</p>
|
||||
<p >From crispy dosas to flavorful biryanis, Chennora offers a diverse menu that caters to both kids and
|
||||
adults. Here’s
|
||||
why it’s the perfect restaurant for your next family feast!</p></div>
|
||||
<h3 class="pb-2">1. A Menu That Pleases Everyone</h3>
|
||||
<p class="pb-2">One of the biggest challenges when dining with family is finding food that everyone loves. At Chennora,
|
||||
we offer a
|
||||
wide range of dishes that cater to different tastes and dietary preferences.</p>
|
||||
<ul class="pb-2">
|
||||
<li>• <b>For Spice Lovers:</b> Chettinad Chicken Curry, Mutton Sukka, and Andhra-style spicy starters.</li>
|
||||
<li>• <b>For Kids & Mild Tastes:</b> Butter Chicken, Paneer Butter Masala, and Nutella Dosa.</li>
|
||||
<li>• <b>For Vegetarians:</b> Masala Dosa, Ghee Podi Idli, and Veg Kuruma.</li>
|
||||
</ul>
|
||||
<p class="pb-4">Whether you’re a vegetarian, meat lover, or Indo-Chinese fan, we’ve got something for you!</p>
|
||||
|
||||
<h3 class="pb-2">2. Authentic Tamil Nadu Flavors</h3>
|
||||
<p class="pb-2">At Chennora, we stay true to tradition by using authentic South Indian spices, fresh ingredients, and
|
||||
age-old cooking
|
||||
techniques. Every dish is prepared by expert chefs who bring the flavors of Chennai straight to your table.</p>
|
||||
<p class="pb-2"><b>Signature Dishes to Try:</b></p>
|
||||
<ul class="pb-4">
|
||||
<li>• Seeraga Samba Mutton Biryani – A unique Tamil Nadu-style biryani with aromatic rice.</li>
|
||||
<li>• Madurai Mutton Bone Soup – A nutritious and flavorful start to your meal.</li>
|
||||
<li>• Kothu Parotta – A street-style delicacy that is both spicy and satisfying.</li>
|
||||
</ul>
|
||||
<h3 class="pb-2">3. Warm & Cozy Family-Friendly Ambiance</h3>
|
||||
<p class="pb-2">We believe that a great dining experience goes beyond food—it’s also about comfort and atmosphere. At
|
||||
Chennora, we
|
||||
offer:</p>
|
||||
<ul class="pb-2">
|
||||
<li>• Spacious seating for families & groups</li>
|
||||
<li>• Warm lighting & cozy interiors</li>
|
||||
<li>• Kid-friendly options & a welcoming staff</li>
|
||||
</ul>
|
||||
<p class="pb-4">Whether it’s a casual dinner, birthday celebration, or a weekend family outing, Chennora is the perfect
|
||||
setting to
|
||||
enjoy a meal together.</p>
|
||||
<h3 class="pb-2">4. Pocket-Friendly Prices & Great Value Meals</h3>
|
||||
<p>Eating out with family shouldn’t break the bank! At Chennora, we offer affordable meals with generous portions so you
|
||||
get the best value for your money.</p>
|
||||
<p><b>Customer Favorites:</b></p>
|
||||
<ul class="pb-4">
|
||||
<li>• <b>Family Combo Deals –</b> A mix of dosas, curries, and desserts at special prices.</li>
|
||||
<li>• <b>Lunch Specials –</b> Perfectly portioned meals with a variety of flavors.</li>
|
||||
<li>• <b>Kids’ Specials –</b> Nutella Dosa, Mini Idlis, and Paneer Tikka for the little ones.</li>
|
||||
</ul>
|
||||
<h3 class="pb-2">5. Convenient Location & Easy Takeout Options</h3>
|
||||
<p class="pb-2">We know that family outings can be hectic, so we make it easy for you!</p>
|
||||
<ul class="pb-4">
|
||||
<li>• Located in the heart of Brampton with ample parking.</li>
|
||||
<li>• Takeout & Online Ordering available for a hassle-free experience.</li>
|
||||
<li>• Fast & friendly service so you spend less time waiting and more time enjoying!</li>
|
||||
</ul>
|
||||
<h3 class="pb-2">Conclusion – Plan Your Family Feast Today!</h3>
|
||||
<p class="pb-2">At Chennora Indian Kitchen Bar, we make family dining fun, flavorful, and unforgettable. Whether you’re
|
||||
craving a
|
||||
traditional Tamil Nadu meal or a quick biryani fix, we’ve got you covered.</p>
|
||||
<p class="pb-2"><i class="bi bi-geo-alt-fill"></i> Visit Us At: Unit 66, 11665 McVean Dr, Brampton</p>
|
||||
<p class="pb-2"><i class="bi bi-telephone-fill"></i> Call Us: +1(647) 856-2878</p>
|
||||
<p class="pb-2"><i class="bi bi-globe"></i> Order Online: www.chennora.com</p>
|
||||
<p class="pb-2"><b>Ready for a South Indian feast with your family? Visit Chennora today! </b></p>"""
|
||||
},
|
||||
{
|
||||
"slug": "5-must-try-south-indian-dishes-at-chennora-that-will-leave-you-craving-more",
|
||||
"title": "5 Must-Try South Indian Dishes at Chennora That Will Leave You Craving More",
|
||||
"category": "Food",
|
||||
"excerpt": "If you’re a fan of bold spices, rich flavors, and comforting meals, South Indian cuisine is a must-try!",
|
||||
"image": "/dine360_theme_chennora/static/src/img/blog-detail-2.webp",
|
||||
"date": "2026-03-28",
|
||||
"content": """<div class="hilight-text mt-4 mb-4 wow fadeInUp">
|
||||
<p class="pb-2">If you’re a fan of bold spices, rich flavors, and comforting meals, South Indian cuisine is a must-try! At Chennora
|
||||
Indian Kitchen Bar in Brampton, you’ll find an authentic taste of Tamil Nadu with dishes that are both delicious and
|
||||
satisfying.</p>
|
||||
<p>From crispy dosas to aromatic biryani, here are the top 5 must-try South Indian dishes at Chennora that will keep you
|
||||
coming back for more!</p></div>
|
||||
|
||||
<h3 class="pb-2">1. Crispy Masala Dosa – The Classic Favorite</h3>
|
||||
<h6 class="pb-2">Why You’ll Love It:</h6>
|
||||
<p class="pb-2">A golden, paper-thin crepe made from fermented rice and lentil batter, filled with spicy potato masala and served
|
||||
with coconut chutney and sambar.</p>
|
||||
<h6 class="pb-2">Best Pairing:</h6>
|
||||
<p class="pb-2">Enjoy it with Chennai-style filter coffee for the ultimate South Indian breakfast experience!</p>
|
||||
<p class="pb-4"><b>Perfect for:</b> Light eaters, vegetarians, and dosa lovers!</p>
|
||||
|
||||
<h3 class="pb-2">2. Chettinad Chicken Curry – Spicy & Aromatic</h3>
|
||||
<h6 class="pb-2">Why You’ll Love It:</h6>
|
||||
<p class="pb-2">A bold and fiery South Indian chicken curry made with a special blend of Chettinad spices, black pepper, and coconut.
|
||||
</p>
|
||||
<h6 class="pb-2">Best Pairing:</h6>
|
||||
<p class="pb-2">Tastes heavenly with steamed rice or Malabar parotta.</p>
|
||||
<p class="pb-4"><b>Perfect for:</b> Spicy food lovers and meat enthusiasts!</p>
|
||||
|
||||
<h3 class="pb-2">3. Seeraga Samba Mutton Biryani – A South Indian Delight</h3>
|
||||
<h6 class="pb-2">Why You’ll Love It:</h6>
|
||||
<p class="pb-2">Unlike traditional basmati biryani, this version uses Seeraga Samba rice, a fragrant small-grain rice that absorbs
|
||||
flavors beautifully. Slow-cooked with succulent mutton, caramelized onions, and aromatic spices, it’s a dish you
|
||||
can’t miss!</p>
|
||||
<h6 class="pb-2">Best Pairing:</h6>
|
||||
<p class="pb-2">Goes well with onion raita and a side of spicy mutton gravy.</p>
|
||||
<p class="pb-4"><b>Perfect for:</b> Biryani lovers and those looking for a unique twist on a classic dish!</p>
|
||||
|
||||
<h3 class="pb-2">4. Chicken Kothu Parotta – The Ultimate Comfort Food</h3>
|
||||
<h6 class="pb-2">Why You’ll Love It:</h6>
|
||||
<p class="pb-2">Shredded flaky parottas stir-fried with chicken, eggs, onions, and special masala, creating a flavorful and
|
||||
comforting dish.</p>
|
||||
<h6 class="pb-2">Best Pairing:</h6>
|
||||
<p class="pb-2">Enjoy it with a side of raita or spicy salna curry.</p>
|
||||
<p class="pb-4"><b>Perfect for:</b> Late-night cravings and street food lovers!</p>
|
||||
|
||||
<h3 class="pb-2">5. Ghee Podi Idli – A Burst of Flavor in Every Bite</h3>
|
||||
<h6 class="pb-2">Why You’ll Love It:</h6>
|
||||
<p class="pb-2">Soft idlis tossed in aromatic podi (gunpowder spice mix) and drizzled with pure ghee, creating a flavorful and
|
||||
melt-in-your-mouth experience.</p>
|
||||
<h6 class="pb-2">Best Pairing:</h6>
|
||||
<p class="pb-2">Tastes amazing with coconut chutney and a cup of Madras coffee.</p>
|
||||
<p class="pb-4"><b>Perfect for:</b> A quick snack or a light meal!</p>
|
||||
|
||||
<h3 class="pb-2">Conclusion – Plan Your Family Feast Today!</h3>
|
||||
<p class="pb-2">At Chennora Indian Kitchen Bar, every dish is made with authentic spices and fresh ingredients, bringing you the true
|
||||
flavors of South India right here in Brampton.</p>
|
||||
<p class="pb-2"><i class="bi bi-geo-alt-fill"></i> Visit Us At: Unit 66, 11665 McVean Dr, Brampton</p>
|
||||
<p class="pb-2"><i class="bi bi-telephone-fill"></i> Call Us: +1(647) 856-2878</p>
|
||||
<p class="pb-2"><i class="bi bi-globe"></i> Order Online: www.chennora.com</p>
|
||||
<p class="pb-2">Whether you’re a first-time visitor or a regular customer, these must-try dishes will leave you craving more. Come
|
||||
and experience the best of South Indian cuisine at Chennora today!</p>"""
|
||||
},
|
||||
{
|
||||
"slug": "top-south-indian-cuisine-restaurants-near-me",
|
||||
"title": "Why Chennora is Brampton’s Go-To Spot for Authentic South Indian Cuisine",
|
||||
"category": "Tradition",
|
||||
"excerpt": "Craving a taste of authentic South Indian food in Brampton? Look no further than Chennora Indian Kitchen Bar.",
|
||||
"image": "/dine360_theme_chennora/static/src/img/blog-detail-3.webp",
|
||||
"date": "2026-03-29",
|
||||
"content": """<div class="hilight-text mt-4 mb-4 wow fadeInUp">
|
||||
<p class="pb-2">Craving a taste of authentic South Indian food in Brampton? Look no further than Chennora Indian
|
||||
Kitchen Bar,
|
||||
where the essence of Chennai meets the rich culinary traditions of Tamil Nadu. From crispy dosas to fragrant
|
||||
biryanis, every dish is crafted with traditional spices, fresh ingredients, and homely love.
|
||||
</p>
|
||||
<p>But what makes Chennora the best South Indian restaurant in Brampton? Let’s dive into the flavors, ambiance, and
|
||||
experience that set it apart.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<h3 class="pb-2">1. Authentic Flavors Straight from Tamil Nadu</h3>
|
||||
<p class="pb-2">Chennora isn’t just a restaurant—it’s an experience. Every bite transports you to the streets of
|
||||
Chennai, where food
|
||||
isn’t just a meal, but an emotion.</p>
|
||||
<h6 class="pb-2">Signature Dishes You Can’t Miss:</h6>
|
||||
<ul class="pb-2">
|
||||
<li>• <b>Crispy Masala Dosa –</b> Stuffed with perfectly spiced potato masala and served with coconut chutney & sambar
|
||||
</li>
|
||||
<li>• <b>Madurai Mutton Sukka –</b> A fiery mutton dish packed with South Indian spices</li>
|
||||
<li>• <b>Seeraga Samba Mutton Biryani –</b> Unlike regular basmati biryani, this aromatic dish is slow-cooked for an
|
||||
intense flavor</li>
|
||||
<li>• <b>Chettinad Chicken Curry –</b> A classic Tamil Nadu favorite, rich in bold flavors and spices</li>
|
||||
</ul>
|
||||
<p class="pb-4">By using traditional cooking techniques and authentic Indian spices, Chennora ensures that every dish
|
||||
reflects the
|
||||
true taste of South India.</p>
|
||||
|
||||
<h3 class="pb-2">2. A Menu for Every Food Lover – From Veg to Non-Veg</h3>
|
||||
<p class="pb-2">Whether you’re a vegetarian, meat lover, or spice enthusiast, Chennora’s diverse menu has something for
|
||||
everyone.</p>
|
||||
<h6 class="pb-2">Vegetarian Delights:</h6>
|
||||
<ul class="pb-2">
|
||||
<li>• <b>Ghee Podi Idli –</b> Soft idlis tossed in aromatic gunpowder</li>
|
||||
<li>• <b>Paneer 65 –</b> A spicy Indo-Chinese fusion snack</li>
|
||||
<li>• <b>Veg Kuruma –</b> A coconut-based curry perfect with parottas</li>
|
||||
</ul>
|
||||
|
||||
<h6 class="pb-2">Non-Vegetarian Specialties:</h6>
|
||||
<ul class="pb-2">
|
||||
<li>• <b>Chicken Kothu Parotta –</b> Shredded parotta stir-fried with eggs and chicken</li>
|
||||
<li>• <b>Prawn Thokku –</b> A mouthwatering coastal seafood dish</li>
|
||||
<li>• <b>Mutton Varuval –</b> Spicy dry mutton fry, a South Indian delicacy</li>
|
||||
</ul>
|
||||
<p class="pb-4">With each dish prepared fresh upon order, you’ll experience food at its finest.</p>
|
||||
|
||||
<h3 class="pb-2">3. Traditional Cooking Methods for Authentic Taste</h3>
|
||||
<p class="pb-2">What makes Chennora different from other Indian restaurants in Brampton? The commitment to authenticity
|
||||
and
|
||||
tradition.</p>
|
||||
<ul class="pb-2">
|
||||
<li>• <b>Seeraga Samba Biryani Preparation:</b> Slow-cooked to perfection for a rich, aromatic experience</li>
|
||||
<li>• <b>Stone-Ground Chutneys:</b> Coconut and tomato chutneys made the traditional way</li>
|
||||
<li>• <b>Freshly Made Dosas:</b> Each dosa is made on a hot griddle for the perfect crispness</li>
|
||||
</ul>
|
||||
<p class="pb-4">Every dish is crafted without shortcuts, ensuring that you get restaurant-quality food with a homemade
|
||||
touch.</p>
|
||||
|
||||
<h3 class="pb-2">4. Perfect Blend of South Indian & Indo-Chinese Flavors</h3>
|
||||
<p class="pb-2">If you love fusion food, Chennora brings the best Indo-Chinese flavors straight to your plate.</p>
|
||||
<h6 class="pb-2">Popular Indo-Chinese Dishes at Chennora:</h6>
|
||||
<ul class="pb-2">
|
||||
<li>• <b>Gobi Manchurian –</b> Cauliflower fritters tossed in a spicy sauce</li>
|
||||
<li>• <b>Chilli Chicken –</b> Tender chicken cooked with Indo-Chinese spices</li>
|
||||
<li>• <b>Schezwan Fried Rice –</b> Spicy, tangy, and packed with flavor</li>
|
||||
</ul>
|
||||
<p class="pb-4">This perfect balance of Indian spice and Chinese flavors makes Chennora a must-visit spot for food
|
||||
lovers.</p>
|
||||
|
||||
<h3 class="pb-2">5. A Cozy Ambience & Friendly Hospitality</h3>
|
||||
<p class="pb-2">A great dining experience isn’t just about food—it’s about ambiance and hospitality.</p>
|
||||
<h6 class="pb-2">Why Customers Love Dining at Chennora:</h6>
|
||||
<ul class="pb-2">
|
||||
<li>• Warm & inviting South Indian decor</li>
|
||||
<li>• Friendly staff who treat every guest like family</li>
|
||||
<li>• Quick service, whether you’re dining in or ordering takeout</li>
|
||||
</ul>
|
||||
<p class="pb-4">Located conveniently in Brampton, it’s the perfect spot for family dinners, casual hangouts, and even
|
||||
special
|
||||
celebrations.</p>
|
||||
|
||||
<h3 class="pb-2">6. Catering & Party Orders – Bring Chennora to Your Home!</h3>
|
||||
<p class="pb-2">Hosting a party or special event? Chennora offers catering services to make your event memorable.</p>
|
||||
<h6 class="pb-2">Catering Menu Includes:</h6>
|
||||
<ul class="pb-2">
|
||||
<li>• Starters like Onion Pakoda & Chicken 65</li>
|
||||
<li>• Signature Biryani Selections</li>
|
||||
<li>• South Indian classics like Idli, Dosa & Parotta</li>
|
||||
</ul>
|
||||
<p class="pb-4">Whether it's a corporate event, wedding, or birthday, Chennora ensures restaurant-quality food at your
|
||||
doorstep.</p>
|
||||
|
||||
<h3 class="pb-2">7. Convenient Takeout & Delivery Options</h3>
|
||||
<p class="pb-2">Can’t visit? No worries! Chennora offers easy online ordering with quick takeout and delivery options.
|
||||
</p>
|
||||
<p class="pb-2"><i class="bi bi-geo-alt-fill"></i> Visit Us At: Unit 66, 11665 McVean Dr, Brampton</p>
|
||||
<p class="pb-2"><i class="bi bi-telephone-fill"></i> Call Us: +1(647) 856-2878</p>
|
||||
<p class="pb-2"><i class="bi bi-globe"></i> Order Online: www.chennora.com</p>
|
||||
<p class="pb-2">Enjoy your favorite South Indian dishes from the comfort of your home.</p>"""
|
||||
},
|
||||
{
|
||||
"slug": "the-rise-of-south-indian-food-in-canada-why-everyone’s-loving-it",
|
||||
"title": "The Rise of South Indian Food in Canada: Why Everyone’s Loving It",
|
||||
"category": "Cuisine",
|
||||
"excerpt": "Over the past decade, Canada has witnessed an incredible shift in its culinary landscape.",
|
||||
"image": "/dine360_theme_chennora/static/src/img/rise-big-img.webp",
|
||||
"date": "2026-11-17",
|
||||
"content": """<div class="hilight-text mt-4 mb-4 wow fadeInUp">
|
||||
<p class="pb-2">Over the past decade, Canada has witnessed an incredible shift in its culinary landscape. While Indian cuisine has always been popular, something interesting is happening now — South Indian food, especially Tamil cuisine, is rising faster than ever.</p>
|
||||
<p class="pb-2">From crispy dosas and idlis to aromatic biryanis and flavour-rich curries, Canadians are exploring flavours that were once lesser-known. Chennora stands at the front of this movement, bringing authentic Tamil flavours to Brampton with a bold, modern twist. But why exactly is South Indian food becoming so popular?</p>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<h3 class="pb-2">1. Canada Loves Healthy, Light, Flavorful Food</h3>
|
||||
<p class="pb-2">South Indian cuisine naturally aligns with what modern Canadians prefer:</p>
|
||||
<ul class="pb-2">
|
||||
<li>• Fermented foods</li>
|
||||
<li>• Low-oil cooking styles</li>
|
||||
<li>• Rice- and lentil-based dishes</li>
|
||||
<li>• High-protein vegetarian meals</li>
|
||||
<li>• Gut-friendly flavours</li>
|
||||
</ul>
|
||||
<p class="pb-2">Dishes like idli, dosa, uttapam, sambar and Rasam check all the boxes for a health-conscious audience.</p>
|
||||
<p class="pb-2">In fact, nutritionists often classify South Indian cuisine as:</p>
|
||||
<ul class="pb-2">
|
||||
<li>• “highly digestible”</li>
|
||||
<li>• “fermentation-rich”</li>
|
||||
<li>• “naturally balanced”</li>
|
||||
</ul>
|
||||
<p class="pb-4">No wonder Canadians love it!</p>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<h3 class="pb-2">2. Fermented Foods Are Trending Worldwide</h3>
|
||||
<p class="pb-2">Health trends today highlight:</p>
|
||||
<ul class="pb-2">
|
||||
<li>• gut health</li>
|
||||
<li>• probiotics</li>
|
||||
<li>• natural fermentation</li>
|
||||
</ul>
|
||||
<p class="pb-2">South Indian staples like dosa & idli batter are made through <b>24+ hours of natural fermentation</b>, making them:</p>
|
||||
<ul class="pb-4">
|
||||
<li>• easier to digest</li>
|
||||
<li>• probiotic-rich</li>
|
||||
<li>• great for metabolism</li>
|
||||
</ul>
|
||||
<p class="pb-4">This aligns perfectly with Canada’s growing wellness culture.</p>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<h3 class="pb-2">3. Canadians Are Becoming More Adventurous With Food</h3>
|
||||
<p class="pb-2">With multiculturalism at its peak, Canadians increasingly explore new cuisines. South Indian food offers:</p>
|
||||
<ul class="pb-2">
|
||||
<li>• textures (crispy, fluffy, creamy, spicy)</li>
|
||||
<li>• flavours (tangy, aromatic, fiery, coconut-rich)</li>
|
||||
<li>• experiences (dosa served like a giant cone, biryani served aromatic & layered)</li>
|
||||
</ul>
|
||||
<p class="pb-4">For many, eating a dosa or biryani isn’t just a meal — it’s an experience.</p>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<h3 class="pb-2">4. Tamil Diaspora Is Growing in GTA</h3>
|
||||
<p class="pb-2">The Tamil community in Toronto, Mississauga, Brampton, and Scarborough has grown significantly. With that comes:</p>
|
||||
<ul class="pb-4">
|
||||
<li>• authentic restaurants</li>
|
||||
<li>• specialty spice stores</li>
|
||||
<li>• cultural festivals</li>
|
||||
<li>• growing curiosity from non-Tamil audiences</li>
|
||||
</ul>
|
||||
<p class="pb-4">Chennora is part of this growing cultural wave, offering dishes that reflect real Tamil flavours — not commercialized or toned down versions.</p>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<h3 class="pb-2">5. The Popularity of Vegan & Vegetarian Dining</h3>
|
||||
<p class="pb-2">South Indian cuisine is uniquely the <b>only major Indian cuisine that’s naturally 70% vegetarian</b>. </p>
|
||||
<p class="pb-2">Dishes like:</p>
|
||||
<ul class="pb-4">
|
||||
<li>• sambar</li>
|
||||
<li>• rasam</li>
|
||||
<li>• vegetable kurma</li>
|
||||
<li>• lemon rice</li>
|
||||
<li>• coconut chutney</li>
|
||||
<li>• pongal</li>
|
||||
</ul>
|
||||
<p class="pb-2">fit beautifully into Canada’s vegan-friendly, plant-powered dining trend. </p>
|
||||
<p class="pb-2">Many guests are surprised how satisfying and flavourful Tamil vegetarian food can be.</p>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<h3 class="pb-2">6. Comfort Food Appeal: Biryani, Dosa, and More</h3>
|
||||
<p class="pb-2">Three dishes are leading the popularity wave:</p>
|
||||
<ul class="pb-1">
|
||||
<li>• <b>DOSA –</b> Crispy, golden, customizable — dosa is a crowd favourite.</li>
|
||||
<li>• <b>BIRYANI –</b> South Indian biryani is aromatic, layered and deeply flavour-rich.</li>
|
||||
<li>• <b>CURRIES –</b> South Indian curries offer:</li>
|
||||
</ul>
|
||||
<ul class="pb-4 pt-0">
|
||||
<li>• coconut bases</li>
|
||||
<li>• lentil bases</li>
|
||||
<li>• tangy tamarind</li>
|
||||
<li>• bright flavours</li>
|
||||
</ul>
|
||||
<p class="pb-4">People who once only knew “butter chicken” now explore an entire new range.</p>
|
||||
</div>
|
||||
<h3 class="pb-1 mt-3">7. Restaurants Like Chennora Are Changing the Game</h3>
|
||||
<div class="row mt-2">
|
||||
<div class="col-md-6">
|
||||
<p class="pb-2">Chennora isn’t just a restaurant; it’s a <b>modern Tamil dining experience</b>.</p>
|
||||
<p class="pb-2"> It blends:</p>
|
||||
<ul class="pb-4">
|
||||
<li>• authentic flavours</li>
|
||||
<li>• modern décor</li>
|
||||
<li>• music and nightlife energy</li>
|
||||
<li>• bar pairings</li>
|
||||
<li>• celebration-friendly ambiance</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<p class="pb-2">This makes South Indian cuisine appealing to:</p>
|
||||
<ul class="pb-2">
|
||||
<li>• families</li>
|
||||
<li>• youth</li>
|
||||
<li>• food explorers</li>
|
||||
<li>• group celebrations</li>
|
||||
<li>• cocktail lovers</li>
|
||||
<li>• cultural enthusiasts</li>
|
||||
</ul>
|
||||
<p class="pb-4">By elevating the dining atmosphere, Chennora introduces Tamil cuisine to wider audiences.</p>
|
||||
</div>
|
||||
<h3 class="pb-2">Conclusion</h3>
|
||||
<p class="pb-2">South Indian cuisine is rising fast in Canada because it checks every box: flavour, health, comfort, experience, and cultural authenticity. And restaurants like Chennora are bringing these flavours forward in a vibrant, modern way that appeals to everyone.</p>
|
||||
<p class="pb-4">From crispy dosas to aromatic biryanis — Canadian diners are falling in love. And it’s only the beginning.</p>
|
||||
<p class="pb-2"><i class="bi bi-geo-alt-fill"></i> Visit Us At: Unit 66, 11665 McVean Dr, Brampton</p>
|
||||
<p class="pb-2"><i class="bi bi-telephone-fill"></i> Call Us: +1(647) 856-2878</p>
|
||||
<p class="pb-2"><i class="bi bi-globe"></i> Order Online: www.chennora.com</p>
|
||||
<p class="pb-2">Enjoy your favorite South Indian dishes from the comfort of your home.</p>"""
|
||||
},
|
||||
{
|
||||
"slug": "the-science-of-south-indian-cooking-fermentation-spices-perfect-flavour-balance",
|
||||
"title": "The Science of South Indian Cooking: Fermentation, Spices & Perfect Flavour Balance",
|
||||
"category": "South Indian Cooking",
|
||||
"excerpt": "South Indian cuisine isn’t just delicious — it’s one of the most scientifically intelligent culinary systems in the world.",
|
||||
"image": "/dine360_theme_chennora/static/src/img/science-big-img.webp",
|
||||
"date": "2026-11-17",
|
||||
"content": """<div class="hilight-text mt-4 mb-4 wow fadeInUp">
|
||||
<p class="pb-2">South Indian cuisine isn’t just delicious — it’s one of the most scientifically intelligent culinary systems in the world. Every dosa, idli, biryani, or curry you enjoy at Chennora is built on techniques rooted in chemistry, biology, and sensory science. This blog explores the science behind flavour: fermentation, spices, seasonings, aromatics, heat balance, texture creation, and how these come together in perfect harmony.</p>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<h3 class="pb-2">1. Fermentation: The Secret Behind Dosa & Idli</h3>
|
||||
<p class="pb-2">South Indian cuisine’s identity begins with <b>fermentation</b>.</p>
|
||||
<p class="pb-2">Why ferment food? Fermentation naturally:</p>
|
||||
<ul class="pb-2">
|
||||
<li>• creates probiotics</li>
|
||||
<li>• improves gut health</li>
|
||||
<li>• increases nutrient absorption</li>
|
||||
<li>• enhances flavour</li>
|
||||
<li>• makes food more digestible</li>
|
||||
</ul>
|
||||
<p class="pb-2">Dosa and idli batter ferments for 12–24 hours. This transforms:</p>
|
||||
<ul class="pb-2">
|
||||
<li>• rice + lentils into</li>
|
||||
<li>• a light, airy, gut-friendly base.</li>
|
||||
</ul>
|
||||
<p class="pb-2">When cooked, these fermented batters create:</p>
|
||||
<ul class="pb-2">
|
||||
<li>• crispy dosas</li>
|
||||
<li>• fluffy idlis</li>
|
||||
<li>• soft uttapams</li>
|
||||
</ul>
|
||||
<p class="pb-4">It’s science meeting tradition.</p>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<h3 class="pb-2">2. The Tempering Technique (Tadka): Aroma Chemistry</h3>
|
||||
<p class="pb-2">Tempering (tadka) is when spices are heated in hot oil or ghee to release essential oils. This process triggers:</p>
|
||||
<ul class="pb-2">
|
||||
<li>• flavour molecule activation</li>
|
||||
<li>• aroma release</li>
|
||||
<li>• deeper colour</li>
|
||||
<li>• enhanced nutrient availability</li>
|
||||
</ul>
|
||||
<p class="pb-2">Common spices used:</p>
|
||||
<ul class="pb-2">
|
||||
<li>• mustard seeds</li>
|
||||
<li>• curry leaves</li>
|
||||
<li>• cumin</li>
|
||||
<li>• dried chilies</li>
|
||||
<li>• urad dal</li>
|
||||
</ul>
|
||||
<p class="pb-2">When they hit hot oil. </p>
|
||||
<ul class="pb-2">
|
||||
<li>• flavours explode</li>
|
||||
<li>• aroma fills the air.</li>
|
||||
</ul>
|
||||
<p> This signature fragrance is what Chennora guests recognise instantly.</p>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<h3 class="pb-2 pt-2">3. Spice Science: Heat, Aroma, Balance</h3>
|
||||
<p class="pb-2">Spices in South Indian cooking don’t just add heat — they create functional flavour.</p>
|
||||
<p class="pb-2">Example:</p>
|
||||
<ul class="pb-2">
|
||||
<li>• <b>Tamarind</b> → acidity for balance</li>
|
||||
<li>• <b>Coconut</b> → natural sweetness, cooling effect</li>
|
||||
<li>• <b>Curry leaves</b> → essential oils with medicinal benefit</li>
|
||||
<li>• <b>Black pepper</b> → heat + metabolism boost</li>
|
||||
<li>• <b>Turmeric</b> → anti-inflammatory properties</li>
|
||||
<li>• <b>Asafoetida (hing)</b> → digestion enhancement</li>
|
||||
</ul>
|
||||
<p class="pb-2">Each spice has purpose.</p>
|
||||
<p class="pb-4">Each combination is intentional.</p>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<h3 class="pb-2">4. The Magic of Coconut</h3>
|
||||
<p class="pb-2">Coconut is used in:</p>
|
||||
<ul class="pb-2">
|
||||
<li>• chutney</li>
|
||||
<li>• curries</li>
|
||||
<li>• desserts</li>
|
||||
<li>• tempering</li>
|
||||
<li>• garnishes</li>
|
||||
</ul>
|
||||
<p class="pb-2">Scientifically, coconut:</p>
|
||||
<ul class="pb-4">
|
||||
<li>• adds healthy fats</li>
|
||||
<li>• enhances absorption of fat-soluble spices</li>
|
||||
<li>• balances the heat of chilies</li>
|
||||
<li>• creates creamy textures without dairy</li>
|
||||
</ul>
|
||||
<p class="pb-4">South Indian cuisine’s reliance on coconut is both cultural and scientific.</p>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<h3 class="pb-2">5. Rice + Lentil System: A Complete Nutrition Model</h3>
|
||||
<p class="pb-2">Unlike wheat-based cuisines, South Indian food builds protein and energy with:</p>
|
||||
<ul class="pb-2">
|
||||
<li>• rice</li>
|
||||
<li>• lentils</li>
|
||||
<li>• legumes</li>
|
||||
</ul>
|
||||
<p class="pb-2">Together, they create:</p>
|
||||
<ul class="pb-2">
|
||||
<li>• complete amino acid profile</li>
|
||||
<li>• sustained energy release</li>
|
||||
<li>• easier digestion</li>
|
||||
</ul>
|
||||
<p class="pb-4">Dosa, idli, pongal, sambar — all share this powerful nutrition system.</p>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<h3 class="pb-2">6. Heat Balance: How Spice Levels Are Managed</h3>
|
||||
<p class="pb-2">Contrary to myth, South Indian cuisine isn’t just “spicy”. It’s strategic. Heat is balanced through:</p>
|
||||
<p class="pb-2">Heat is balanced through:</p>
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<ul class="pb-2">
|
||||
<li>• coconut</li>
|
||||
<li>• yogurt</li>
|
||||
<li>• ghee</li>
|
||||
<li>• jaggery</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<ul class="pb-2">
|
||||
<li>• tamarind</li>
|
||||
<li>• lentils</li>
|
||||
<li>• rice</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<p class="pb-4">This layering ensures each bite is fiery, tangy, sweet, creamy and aromatic — all at once.</p>
|
||||
</div>
|
||||
<h3 class="pb-2">7. Why South Indian Food Feels “Comforting”</h3>
|
||||
<p class="pb-2">Scientifically, comfort food triggers:</p>
|
||||
<ul class="pb-2">
|
||||
<li>• serotonin (mood boost)</li>
|
||||
<li>• warmth</li>
|
||||
<li>• softness</li>
|
||||
<li>• nostalgia across cultures</li>
|
||||
</ul>
|
||||
<p class="pb-2">South Indian dishes — sambar, rasam, pongal, dosa — are designed with:</p>
|
||||
<ul class="pb-2">
|
||||
<li>• warm spices</li>
|
||||
<li>• soft textures</li>
|
||||
<li>• soothing aromas</li>
|
||||
</ul>
|
||||
<p class="pb-4">This makes them universally comforting, even for first-time diners.</p>
|
||||
<h3 class="pb-2">Conclusion</h3>
|
||||
<p class="pb-2">The magic of South Indian cooking isn’t accidental - it’s scientific mastery. Fermentation, tempering, spice chemistry, rice-lentil balance and aromatics combine to create a cuisine that is nutritious, flavour-rich and emotionally satisfying. At Chennora, every dosa, biryani, curry and chutney follows this timeless science - delivered with modern presentation and flavour precision.</p>
|
||||
<p class="pb-2"><i class="bi bi-geo-alt-fill"></i> Visit Us At: Unit 66, 11665 McVean Dr, Brampton</p>
|
||||
<p class="pb-2"><i class="bi bi-telephone-fill"></i> Call Us: +1(647) 856-2878</p>
|
||||
<p class="pb-2"><i class="bi bi-globe"></i> Order Online: www.chennora.com</p>
|
||||
<p class="pb-2">Enjoy your favorite South Indian dishes from the comfort of your home.</p>"""
|
||||
},
|
||||
{
|
||||
"slug": "what-type-of-food-does-chennora-brampton-serve",
|
||||
"title": "What Type of Food Does Chennora Brampton Serve?",
|
||||
"category": "Restaurant Guide",
|
||||
"excerpt": "Chennora Brampton is a family-friendly Indian kitchen and bar serving North Indian curries, tandoor grills, and snacks.",
|
||||
"image": "/dine360_theme_chennora/static/src/img/serve-big-img.webp",
|
||||
"date": "2026-11-22",
|
||||
"content": """<div class="hilight-text mt-4 mb-4 wow fadeInUp">
|
||||
<p class="pb-2">If you're in Brampton and craving authentic Indian cuisine, you've probably searched for a spot that feels both exciting and comforting. Somewhere you can grab a cozy family dinner, enjoy drinks with friends, or order in on a busy weekday night. That's exactly where Chennora Brampton comes into the picture.</p>
|
||||
<p class="pb-2">This guide breaks down what type of food Chennora Indian Kitchen Bar serves, how it fits into Brampton's food scene, and why it's becoming a go-to choice near McVean Dr.</p>
|
||||
</div>
|
||||
<h3 class="pb-2">Meet Chennora Brampton on McVean Dr</h3>
|
||||
<p class="pb-2">Tucked into Unit 66, 11665 McVean Dr, Brampton, Chennora Indian Kitchen Bar is one of those places you hear about from a friend first.</p>
|
||||
<p class="pb-2">When you walk in, you're not hit with stiff, formal vibes. Instead, you get warm lighting, comfortable seating, and the kind of buzz you expect from a neighbourhood Brampton Indian restaurant where families, couples, and coworkers all feel at home.</p>
|
||||
<p class="pb-5">To get a sense of what's cooking right now, you can always browse the latest<a href="https://chennora.com/indian-food-menu-brampton" target="_blank"><b> Chennora menu online.</b></a></p>
|
||||
<h3 class="pb-2">What Type of Food Does Chennora Indian Kitchen Bar Serve?</h3>
|
||||
<p class="pb-2">Think of it as a mix of:</p>
|
||||
<ul class="pb-3">
|
||||
<li>• Classic North Indian comfort dishes</li>
|
||||
<li>• South Indian–inspired and street-style snacks</li>
|
||||
<li>• Tandoor grills and sizzling plates</li>
|
||||
<li>• Bar bites made to share over drinks</li>
|
||||
<li>• Plenty of vegetarian-friendly options</li>
|
||||
</ul>
|
||||
<h3 class="pb-2">North Indian Favourites and Comfort Curries</h3>
|
||||
<p class="pb-2">If you grew up on North Indian food — or just fell in love with it in the GTA — this part of Chennora Brampton will feel like a hug.</p>
|
||||
<ul class="pb-3">
|
||||
<li>• Creamy, tomato-based gravies</li>
|
||||
<li>• Onion- and yogurt-based curries with layered spices</li>
|
||||
<li>• Paneer (Indian cottage cheese) dishes for vegetarians</li>
|
||||
<li>• Chicken, lamb, or goat options for meat lovers</li>
|
||||
</ul>
|
||||
<h3 class="pb-2">South Indian–Inspired Dishes and Street-Style Snacks</h3>
|
||||
<p class="pb-2">While North Indian mains tend to steal the spotlight, a lot of people head to Chennora Brampton for the snacks and starters.</p>
|
||||
<ul class="pb-2">
|
||||
<li>• Crispy, fried snacks that pair well with drinks</li>
|
||||
<li>• Tangy, chutney-loaded plates inspired by Indian street food</li>
|
||||
<li>• South Indian–inspired bites with spices and textures that wake up your taste buds</li>
|
||||
</ul>
|
||||
<h3 class="pb-2">Tandoor Grills, Bar Bites, and Sharing Plates</h3>
|
||||
<p class="pb-2">Because Chennora Brampton is also a bar, grilled items and bar-style food are a big part of the experience.</p>
|
||||
<ul class="pb-2">
|
||||
<li>• Juicy, marinated meats cooked at high heat</li>
|
||||
<li>• Smoky, charred edges with tender centers</li>
|
||||
<li>• Grilled paneer or veggie options for non-meat eaters</li>
|
||||
<li>• Tandoor-baked breads that are soft, chewy, and slightly smoky</li>
|
||||
</ul>
|
||||
<h3 class="pb-2">Drinks, Mocktails, and the Bar Side of Chennora Brampton</h3>
|
||||
<p class="pb-2">Food is the main attraction, but the bar is a big part of what makes Chennora Brampton different from a typical takeout spot.</p>
|
||||
<ul class="pb-3">
|
||||
<li>• A range of cocktails and mixed drinks</li>
|
||||
<li>• Non-alcoholic mocktails for designated drivers</li>
|
||||
</ul>
|
||||
<h3 class="pb-2">Why Brampton Locals Keep Coming Back</h3>
|
||||
<p class="pb-2">A few reasons keep coming up in local conversations:</p>
|
||||
<ul class="pb-3">
|
||||
<li>• <b>Location that makes sense</b></li>
|
||||
<li>• <b>Versatility</b></li>
|
||||
<li>• <b>Comfort food with a modern feel</b></li>
|
||||
</ul>
|
||||
<h3 class="pb-2">Planning Your Visit to Chennora Brampton</h3>
|
||||
<p class="pb-2"><b>Location:</b> Unit 66, 11665 McVean Dr, Brampton, Ontario</p>
|
||||
<p class="pb-2"><i class="bi bi-telephone-fill"></i> Call Us: +1(647) 856-2878</p>
|
||||
<p class="pb-2"><i class="bi bi-globe"></i> Order Online: www.chennora.com</p>"""
|
||||
},
|
||||
{
|
||||
"slug": "how-authentic-is-chennoras-south-indian-food-in-brampton",
|
||||
"title": "How Authentic Is Chennora's South Indian Food in Brampton?",
|
||||
"category": "Food Authenticity",
|
||||
"excerpt": "Explore Chennora in Brampton for authentic South Indian dosas, idlis, vadas, and home-style flavours.",
|
||||
"image": "/dine360_theme_chennora/static/src/img/south-big-img.webp",
|
||||
"date": "2026-11-22",
|
||||
"content": """<div class="hilight-text mt-4 mb-4 wow fadeInUp">
|
||||
<p class="pb-2">You type "South Indian food in Brampton" into Google, scroll past a few ads, open a couple of tabs and then pause at Chennora Indian Kitchen Bar. The photos look legit. The dosas look crispy. The idlis look fluffy. But is it actually authentic or just "regular Indian"?</p>
|
||||
<p class="pb-2">Let's break it down honestly — from ingredients to flavours to the overall experience — and see how Chennora's South Indian food in Brampton really stacks up.</p>
|
||||
</div>
|
||||
<h3 class="pb-2">What Does "Authentic" South Indian Food Even Mean?</h3>
|
||||
<p class="pb-2">When we talk about authentic South Indian cuisine, we're usually looking for a few key things:</p>
|
||||
<ul class="pb-2">
|
||||
<li>• Proper use of rice and lentils</li>
|
||||
<li>• Long, natural fermentation for dosa and idli batter</li>
|
||||
<li>• Real ghee and fresh curry leaves</li>
|
||||
<li>• Sambar that tastes like it simmered — not microwaved</li>
|
||||
<li>• Chutneys made fresh, not poured from a jar</li>
|
||||
</ul>
|
||||
<h3 class="pb-2">Chennora's Story: South India to Brampton</h3>
|
||||
<p class="pb-2">Chennora isn't a random chain; it's a local Brampton restaurant with roots in South Indian flavours. The team behind Chennora has put clear focus on bringing authentic South Indian cuisine into a casual, family-friendly setting.</p>
|
||||
<h3 class="pb-2">The Little Details That Make Food Taste Like Home</h3>
|
||||
<p class="pb-2">Authenticity often hides in the details — things you won't see on a poster, but you'll taste in a single bite.</p>
|
||||
<p class="pb-2"><b>1. Batter, Fermentation & Texture</b></p>
|
||||
<p class="pb-2">At Chennora, dosas tend to have that crisp edge and soft center you're looking for, and idlis are usually soft and spongy — a good sign that fermentation wasn't skipped.</p>
|
||||
|
||||
<p class="pb-2"><b>2. Sambar That Actually Tastes Like Sambar</b></p>
|
||||
<p class="pb-3">Chennora's sambar has that "home-style" depth and aroma that's closer to what many South Indian families are used to.</p>
|
||||
|
||||
<p class="pb-2"><b>3. Real Chutneys</b></p>
|
||||
<p class="pb-5">At Chennora, you'll usually find more than just one generic "white chutney." That's another sign of authenticity.</p>
|
||||
|
||||
<h3 class="pb-2">Dosa, Idli, Vada & More – How Do They Compare?</h3>
|
||||
<p class="pb-2"><b>Dosa in Brampton:</b> Chennora's dosas are thin, crisp, and golden, exactly what South Indian families expect.</p>
|
||||
<p class="pb-2"><b>Idli Vada in Brampton:</b> Idlis are soft and medu vadas have a proper crunch.</p>
|
||||
|
||||
<h3 class="pb-2">Practical Stuff Brampton Locals Actually Care About</h3>
|
||||
<p class="pb-2"><b>Ordering & Takeout:</b> You can place orders through their <a href="https://online.chennora.com/" target="_blank"><b>Order Now page</b></a>.</p>
|
||||
<p class="pb-2"><b>Family-Friendly Vibes:</b> Comfortable for kids and grandparents.</p>
|
||||
|
||||
<h3 class="pb-2">Conclusion</h3>
|
||||
<p class="pb-2">If you're craving South Indian food in Brampton that feels real — not "just okay" — Chennora is absolutely worth a visit.</p>"""
|
||||
},
|
||||
{
|
||||
"slug": "how-authentic-is-chennoras-dosa-and-what-varieties-should-you-try-in-brampton",
|
||||
"title": "How Authentic Is Chennora's Dosa — And What Varieties Should You Try in Brampton?",
|
||||
"category": "Food Authenticity",
|
||||
"excerpt": "Explore authentic dosa varieties at Chennora Brampton - from classic masala to special fusion options.",
|
||||
"image": "/dine360_theme_chennora/static/src/img/dosa-big-img.webp",
|
||||
"date": "2026-11-26",
|
||||
"content": """<div class="hilight-text mt-4 mb-4 wow fadeInUp">
|
||||
<p class="pb-2">Dosa Cravings in Brampton? You're Not Alone</p>
|
||||
<p class="pb-2">If you live anywhere in the northeast part of Brampton — near McVean Dr, Castlemore, or up toward Mayfield — you've probably had this moment craving a hot, crispy dosa.</p>
|
||||
<p class="pb-2">This guide digs into how authentic the dosas are at Chennora Brampton, and which varieties are genuinely worth your time.</p>
|
||||
</div>
|
||||
<h3 class="pb-2">So How Authentic Is the Dosa at Chennora Brampton?</h3>
|
||||
<p class="pb-2"><b>The Batter: Where Real Dosa Begins</b></p>
|
||||
<p class="pb-2">At Chennora Brampton, the dosa batter tastes like it's been fermented properly, giving that gentle tang and light texture.</p>
|
||||
<h3 class="pb-2">Classic Dosa Varieties to Try First</h3>
|
||||
<p class="pb-2"><b>1. Plain Dosa & Ghee Roast:</b> A Plain Dosa lets the batter speak for itself. Ghee Roast adds a nutty aroma and extra crispiness.</p>
|
||||
<p class="pb-2"><b>2. Masala Dosa:</b> The comfort classic with well-spiced potato filling.</p>
|
||||
<h3 class="pb-2">Special & Fusion Dosas</h3>
|
||||
<ul class="pb-2">
|
||||
<li>• Onion Dosa – with caramelized onions</li>
|
||||
<li>• Mysore Masala Dosa – spicier version with red chutney</li>
|
||||
<li>• Cheese or Paneer Dosa – popular with kids</li>
|
||||
</ul>
|
||||
<h3 class="pb-2">Final Thoughts</h3>
|
||||
<p class="pb-2">Whether you're driving down from Springdale or meeting friends halfway, Chennora Brampton is an easy yes for your next dosa night.</p>"""
|
||||
},
|
||||
{
|
||||
"slug": "what-are-the-top-5-dishes-at-chennora-brampton-and-what-makes-them-special",
|
||||
"title": "What Are the Top 5 Dishes at Chennora Brampton — And What Makes Them Special?",
|
||||
"category": "Top 5 must-try",
|
||||
"excerpt": "Explore the top 5 must-try dishes at Chennora Brampton - authentic South Indian dosa, idli, vada, biryani and tiffin combos.",
|
||||
"image": "/dine360_theme_chennora/static/src/img/top5-big-img.webp",
|
||||
"date": "2026-11-26",
|
||||
"content": """<div class="hilight-text mt-4 mb-4 wow fadeInUp">
|
||||
<p class="pb-2">Craving Real South Indian Food in Brampton? Start at Chennora</p>
|
||||
<p class="pb-2">Chennora Brampton has quietly become that go-to spot for people who crave real South Indian food.</p>
|
||||
</div>
|
||||
<h3 class="pb-2">Dish #1: Masala Dosa – The Icon</h3>
|
||||
<p class="pb-2">Crisp, golden-brown crepe with gently spiced potato filling. It's thin, crunchy, and served with fresh sambar and chutneys.</p>
|
||||
<h3 class="pb-2">Dish #2: Soft, Fluffy Idli</h3>
|
||||
<p class="pb-2">Steamed rice and lentil cakes that are soft, light, and easy to digest. At Chennora, they are like little white pillows.</p>
|
||||
<h3 class="pb-2">Dish #3: Medu Vada – Crispy and Golden</h3>
|
||||
<p class="pb-2">Savoury lentil fritters with a crunch on the outside and softness on the inside.</p>
|
||||
<h3 class="pb-2">Dish #4: Biryani That Tastes Like Home</h3>
|
||||
<p class="pb-2">Fragrant basmati rice with balanced spices and well-marinated meat or veg.</p>
|
||||
<h3 class="pb-2">Dish #5: South Indian Tiffin Combos</h3>
|
||||
<p class="pb-2">The best way to sample everything: idli, vada, mini dosa, sambar, and chutneys all on one plate.</p>
|
||||
<h3 class="pb-2">Final Thoughts</h3>
|
||||
<p class="pb-4">These five dishes are what keep people saying, "Let's just go to Chennora Brampton tonight."</p>"""
|
||||
},
|
||||
{
|
||||
"slug": "your-new-favourite-spot-for-premium-south-indian-food-in-brampton",
|
||||
"title": "Your New Favourite Spot for Premium South Indian Food in Brampton",
|
||||
"category": "New Favourite Spot",
|
||||
"excerpt": "Craving authentic South Indian food? Chennora brings premium dosas, fluffy idlis, and spicy biryanis right to Brampton.",
|
||||
"image": "/dine360_theme_chennora/static/src/img/fav-big-img.webp",
|
||||
"date": "2026-12-05",
|
||||
"content": """<div class="hilight-text mt-4 mb-4 wow fadeInUp">
|
||||
<p class="pb-2">Your Search for Premium South Indian Food in Brampton Might Be Over</p>
|
||||
<p class="pb-2">Chennora Brampton is a fresh, premium spot focused on truly authentic flavours and a beautiful dining experience.</p>
|
||||
</div>
|
||||
<h3 class="pb-2">Why Chennora Stands Out</h3>
|
||||
<ul class="pb-2">
|
||||
<li>• Authentic recipes that respect regional roots</li>
|
||||
<li>• Premium ingredients and fresh batters</li>
|
||||
<li>• Beautiful ambiance and warm service</li>
|
||||
</ul>
|
||||
<h3 class="pb-2">The Best Filter Coffee in Brampton</h3>
|
||||
<p class="pb-2">Strong, smooth, and brewed slowly in a traditional filter with frothy milk. The perfect finish to any meal.</p>
|
||||
<h3 class="pb-2">Conclusion</h3>
|
||||
<p class="pb-4">Brampton finally has its own serious contender for premium South Indian food. You no longer have to drive to Mississauga for that perfect dosa!</p>"""
|
||||
}
|
||||
]
|
||||
|
||||
for p in blog_posts:
|
||||
vals = {
|
||||
'title': p['title'],
|
||||
'slug': p['slug'],
|
||||
'category': p['category'],
|
||||
'excerpt': p['excerpt'],
|
||||
'image': p['image'],
|
||||
'date': p['date'],
|
||||
'content': p['content'],
|
||||
}
|
||||
existing = env['chennora.blog.post'].search([('slug', '=', p['slug'])])
|
||||
if existing:
|
||||
existing.write(vals)
|
||||
print(f"Updated: {p['title']}")
|
||||
else:
|
||||
env['chennora.blog.post'].create(vals)
|
||||
print(f"Created: {p['title']}")
|
||||
|
||||
env.cr.commit()
|
||||
print("Import completed successfully!")
|
||||
3
addons/dine360_theme_chennora/models/__init__.py
Normal file
@ -0,0 +1,3 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from . import product_template
|
||||
from . import blog_post
|
||||
36
addons/dine360_theme_chennora/models/blog_post.py
Normal file
@ -0,0 +1,36 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from odoo import models, fields, api
|
||||
from datetime import datetime
|
||||
|
||||
class ChennoraBlogPost(models.Model):
|
||||
_name = 'chennora.blog.post'
|
||||
_description = 'Chennora Blog Post'
|
||||
_order = 'date desc, id desc'
|
||||
|
||||
title = fields.Char(string='Title', required=True)
|
||||
slug = fields.Char(string='URL Slug', required=True, help="Used in the URL e.g. 'my-first-post'")
|
||||
category = fields.Char(string='Category', default='Restaurant Spotlight')
|
||||
excerpt = fields.Text(string='Excerpt', help="Short summary for the blog card")
|
||||
content = fields.Html(string='Content', sanitize=True)
|
||||
image = fields.Char(string='Image URL', default='/dine360_theme_chennora/static/src/img/blog-1.png')
|
||||
date = fields.Date(string='Publish Date', default=fields.Date.context_today)
|
||||
active = fields.Boolean(default=True)
|
||||
|
||||
# Computed fields for the blog card date badge
|
||||
day = fields.Char(compute='_compute_date_parts', store=True)
|
||||
month = fields.Char(compute='_compute_date_parts', store=True)
|
||||
|
||||
_sql_constraints = [
|
||||
('slug_unique', 'unique(slug)', 'The slug must be unique!')
|
||||
]
|
||||
|
||||
@api.depends('date')
|
||||
def _compute_date_parts(self):
|
||||
for record in self:
|
||||
if record.date:
|
||||
dt = fields.Date.from_string(record.date)
|
||||
record.day = dt.strftime('%d')
|
||||
record.month = dt.strftime('%b').upper()
|
||||
else:
|
||||
record.day = ''
|
||||
record.month = ''
|
||||
7
addons/dine360_theme_chennora/models/product_template.py
Normal file
@ -0,0 +1,7 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from odoo import models, fields
|
||||
|
||||
class ProductTemplate(models.Model):
|
||||
_inherit = 'product.template'
|
||||
|
||||
is_popular_deal = fields.Boolean(string='Is Popular Deal', default=False, help='Check this to show this product in Popular Deals section on Homepage')
|
||||
BIN
addons/dine360_theme_chennora/static/description/cover.png
Normal file
|
After Width: | Height: | Size: 11 MiB |
BIN
addons/dine360_theme_chennora/static/description/icon.png
Normal file
|
After Width: | Height: | Size: 25 KiB |
BIN
addons/dine360_theme_chennora/static/src/img/about-banner-bg.png
Normal file
|
After Width: | Height: | Size: 132 KiB |
|
After Width: | Height: | Size: 132 KiB |
|
After Width: | Height: | Size: 56 KiB |
|
After Width: | Height: | Size: 569 KiB |
BIN
addons/dine360_theme_chennora/static/src/img/about-leaves.png
Normal file
|
After Width: | Height: | Size: 56 KiB |
|
After Width: | Height: | Size: 53 KiB |
BIN
addons/dine360_theme_chennora/static/src/img/about-lemon.png
Normal file
|
After Width: | Height: | Size: 53 KiB |
BIN
addons/dine360_theme_chennora/static/src/img/about-main-dish.png
Normal file
|
After Width: | Height: | Size: 643 KiB |
BIN
addons/dine360_theme_chennora/static/src/img/about-new-basil.png
Normal file
|
After Width: | Height: | Size: 56 KiB |
BIN
addons/dine360_theme_chennora/static/src/img/about-new-lemon.png
Normal file
|
After Width: | Height: | Size: 53 KiB |
BIN
addons/dine360_theme_chennora/static/src/img/about-new-main.png
Normal file
|
After Width: | Height: | Size: 643 KiB |
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 13 KiB |
BIN
addons/dine360_theme_chennora/static/src/img/about-platter.png
Normal file
|
After Width: | Height: | Size: 481 KiB |
BIN
addons/dine360_theme_chennora/static/src/img/blog-1.png
Normal file
|
After Width: | Height: | Size: 183 KiB |
BIN
addons/dine360_theme_chennora/static/src/img/blog-2.png
Normal file
|
After Width: | Height: | Size: 178 KiB |
BIN
addons/dine360_theme_chennora/static/src/img/blog-3.png
Normal file
|
After Width: | Height: | Size: 186 KiB |
BIN
addons/dine360_theme_chennora/static/src/img/cat-beverages.png
Normal file
|
After Width: | Height: | Size: 648 KiB |
BIN
addons/dine360_theme_chennora/static/src/img/cat-biryani.png
Normal file
|
After Width: | Height: | Size: 897 KiB |
BIN
addons/dine360_theme_chennora/static/src/img/cat-curries.png
Normal file
|
After Width: | Height: | Size: 906 KiB |
BIN
addons/dine360_theme_chennora/static/src/img/cat-desserts.png
Normal file
|
After Width: | Height: | Size: 752 KiB |
BIN
addons/dine360_theme_chennora/static/src/img/cat-dosa.png
Normal file
|
After Width: | Height: | Size: 883 KiB |
BIN
addons/dine360_theme_chennora/static/src/img/chen-banner-1.webp
Normal file
|
After Width: | Height: | Size: 80 KiB |
BIN
addons/dine360_theme_chennora/static/src/img/chen-banner-2.webp
Normal file
|
After Width: | Height: | Size: 64 KiB |
BIN
addons/dine360_theme_chennora/static/src/img/chen-banner-3.webp
Normal file
|
After Width: | Height: | Size: 95 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 396 KiB |
|
After Width: | Height: | Size: 5.8 KiB |
|
After Width: | Height: | Size: 49 KiB |
|
After Width: | Height: | Size: 103 KiB |
|
After Width: | Height: | Size: 541 KiB |
|
After Width: | Height: | Size: 541 KiB |
BIN
addons/dine360_theme_chennora/static/src/img/crispy-gobi-65.png
Normal file
|
After Width: | Height: | Size: 86 KiB |
BIN
addons/dine360_theme_chennora/static/src/img/deal-coffee.png
Normal file
|
After Width: | Height: | Size: 281 KiB |
BIN
addons/dine360_theme_chennora/static/src/img/deal-dosa.png
Normal file
|
After Width: | Height: | Size: 434 KiB |
BIN
addons/dine360_theme_chennora/static/src/img/deal-kothu.png
Normal file
|
After Width: | Height: | Size: 367 KiB |
BIN
addons/dine360_theme_chennora/static/src/img/deal-nuggets.png
Normal file
|
After Width: | Height: | Size: 407 KiB |
BIN
addons/dine360_theme_chennora/static/src/img/faq-banner-bg.png
Normal file
|
After Width: | Height: | Size: 132 KiB |
BIN
addons/dine360_theme_chennora/static/src/img/faq-new-1.png
Normal file
|
After Width: | Height: | Size: 865 KiB |
BIN
addons/dine360_theme_chennora/static/src/img/faq-new-2.png
Normal file
|
After Width: | Height: | Size: 623 KiB |
BIN
addons/dine360_theme_chennora/static/src/img/faq-new-3.png
Normal file
|
After Width: | Height: | Size: 865 KiB |
BIN
addons/dine360_theme_chennora/static/src/img/faq-slide-1.png
Normal file
|
After Width: | Height: | Size: 371 KiB |
BIN
addons/dine360_theme_chennora/static/src/img/faq-slide-2.png
Normal file
|
After Width: | Height: | Size: 341 KiB |
BIN
addons/dine360_theme_chennora/static/src/img/faq-slide-3.png
Normal file
|
After Width: | Height: | Size: 346 KiB |
|
After Width: | Height: | Size: 98 KiB |
|
After Width: | Height: | Size: 50 KiB |
BIN
addons/dine360_theme_chennora/static/src/img/gallery-1.png
Normal file
|
After Width: | Height: | Size: 288 KiB |
BIN
addons/dine360_theme_chennora/static/src/img/gallery-2.png
Normal file
|
After Width: | Height: | Size: 332 KiB |
BIN
addons/dine360_theme_chennora/static/src/img/gallery-3.png
Normal file
|
After Width: | Height: | Size: 355 KiB |
BIN
addons/dine360_theme_chennora/static/src/img/subtitle-icon.png
Normal file
|
After Width: | Height: | Size: 760 B |