Skip to content

[ADD] website airproof: add solution for website theme tutorial #764

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions website_airproof/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Odoo Tutorial : Build a website theme

This branch contains the code necessary for the creation of the website for our Airproof example.
Example used to illustrate the exercises given in the Odoo tutorial: Build a website theme.

Here is the final design of the 4 pages of Airproof that will be created throughout this tutorial.

**Home**
![Airproof home page](airproof-home-page.jpg)

**Contact page**
![Airproof contact page](airproof-contact-page.jpg)

**Shop page**
![Airproof shop page](airproof-shop-page.jpg)

**Product page**
![Airproof product page](airproof-product-page.jpg)
Empty file added website_airproof/__init__.py
Empty file.
49 changes: 49 additions & 0 deletions website_airproof/__manifest__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
{
'name': 'Airproof Theme',
'description': 'Airproof Theme - Drones, modelling, camera',
'category': 'Website/Theme',
# 'version': '18.0.1.0',
'author': 'PSBE Designers',
'license': 'LGPL-3',
'depends': ['website_sale', 'website_sale_wishlist', 'website_blog', 'website_mass_mailing'],
'data': [
# Options
'data/presets.xml',
# Menu
'data/menu.xml',
# Shapes
'data/shapes.xml',
# Pages
'data/pages/home.xml',
'data/pages/contact.xml',
# Frontend
'views/website_templates.xml',
'views/website_sale_templates.xml',
'views/website_sale_wishlist_templates.xml',
# Snippets
'views/snippets/options.xml',
'views/snippets/s_airproof_carousel.xml',
# Images
'data/images.xml',
],
'assets': {
'web._assets_primary_variables': [
'website_airproof/static/src/scss/primary_variables.scss',
],
'web._assets_frontend_helpers': [
('prepend', 'website_airproof/static/src/scss/bootstrap_overridden.scss'),
],
'web.assets_frontend': [
# SCSS
'website_airproof/static/src/scss/components/mouse_follower.scss',
'website_airproof/static/src/scss/layout/header.scss',
'website_airproof/static/src/scss/pages/product_page.scss',
'website_airproof/static/src/scss/pages/shop.scss',
'website_airproof/static/src/scss/snippets/caroussel.scss',
'website_airproof/static/src/scss/snippets/newsletter.scss',
'website_airproof/static/src/snippets/s_airproof_carousel/000.scss',
# JS
'website_airproof/static/src/js/mouse_follower.js',
],
},
}
Binary file added website_airproof/airproof-contact-page.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added website_airproof/airproof-home-page.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added website_airproof/airproof-product-page.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added website_airproof/airproof-shop-page.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
192 changes: 192 additions & 0 deletions website_airproof/data/images.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,192 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Branding -->
<!-- Set as the logo of the website -->
<record id="website.default_website" model="website">
<field name="logo" type="base64" file="website_airproof/static/src/img/content/branding/airproof-logo.svg"/>
</record>
<!-- Record the image of the logo -->
<record id="logo" model="ir.attachment">
<field name="name">Logo Airproof</field>
<field name="datas" type="base64" file="website_airproof/static/src/img/content/branding/airproof-logo.svg"/>
<field name="res_model">ir.ui.view</field>
<field name="public" eval="True"/>
</record>

<!-- ICONS -->
<record id="img_arrow_white" model="ir.attachment">
<field name="name">White arrow icon</field>
<field name="datas" type="base64" file="website_airproof/static/src/img/content/icons/arrow-white.svg"/>
<field name="res_model">ir.ui.view</field>
<field name="public" eval="True"/>
</record>
<record id="img_glasses" model="ir.attachment">
<field name="name">Glasses icon</field>
<field name="datas" type="base64" file="website_airproof/static/src/img/content/icons/glasses.svg"/>
<field name="res_model">ir.ui.view</field>
<field name="public" eval="True"/>
</record>
<record id="img_4k" model="ir.attachment">
<field name="name">4K icon</field>
<field name="datas" type="base64" file="website_airproof/static/src/img/content/icons/4k.svg"/>
<field name="res_model">ir.ui.view</field>
<field name="public" eval="True"/>
</record>
<record id="img_hand_drone" model="ir.attachment">
<field name="name">Hand with drone icon</field>
<field name="datas" type="base64" file="website_airproof/static/src/img/content/icons/hand-drone.svg"/>
<field name="res_model">ir.ui.view</field>
<field name="public" eval="True"/>
</record>
<record id="img_control" model="ir.attachment">
<field name="name">Control icon</field>
<field name="datas" type="base64" file="website_airproof/static/src/img/content/icons/control.svg"/>
<field name="res_model">ir.ui.view</field>
<field name="public" eval="True"/>
</record>
<record id="img_shopping" model="ir.attachment">
<field name="name">Shopping icon</field>
<field name="datas" type="base64" file="website_airproof/static/src/img/content/icons/shopping.svg"/>
<field name="res_model">ir.ui.view</field>
<field name="public" eval="True"/>
</record>
<record id="img_phone" model="ir.attachment">
<field name="name">Phone icon</field>
<field name="datas" type="base64" file="website_airproof/static/src/img/content/icons/phone.svg"/>
<field name="res_model">ir.ui.view</field>
<field name="public" eval="True"/>
</record>
<record id="img_envelop" model="ir.attachment">
<field name="name">Envelop icon</field>
<field name="datas" type="base64" file="website_airproof/static/src/img/content/icons/envelop.svg"/>
<field name="res_model">ir.ui.view</field>
<field name="public" eval="True"/>
</record>
<record id="img_arrow" model="ir.attachment">
<field name="name">Arrow icon</field>
<field name="datas" type="base64" file="website_airproof/static/src/img/content/icons/arrow.svg"/>
<field name="res_model">ir.ui.view</field>
<field name="public" eval="True"/>
</record>
<record id="img_arrow_small" model="ir.attachment">
<field name="name">Small arrow icon</field>
<field name="datas" type="base64" file="website_airproof/static/src/img/content/icons/arrow-small.svg"/>
<field name="res_model">ir.ui.view</field>
<field name="public" eval="True"/>
</record>
<record id="img_check" model="ir.attachment">
<field name="name">Check icon</field>
<field name="datas" type="base64" file="website_airproof/static/src/img/content/icons/check.svg"/>
<field name="res_model">ir.ui.view</field>
<field name="public" eval="True"/>
</record>
<record id="img_phone_black" model="ir.attachment">
<field name="name">Black Phone icon</field>
<field name="datas" type="base64" file="website_airproof/static/src/img/content/icons/phone-black.svg"/>
<field name="res_model">ir.ui.view</field>
<field name="public" eval="True"/>
</record>
<record id="img_envelop_black" model="ir.attachment">
<field name="name">Black Envelop icon</field>
<field name="datas" type="base64" file="website_airproof/static/src/img/content/icons/envelop-black.svg"/>
<field name="res_model">ir.ui.view</field>
<field name="public" eval="True"/>
</record>

<!-- MEGA-MENU -->
<record id="img_mini" model="ir.attachment">
<field name="name">Drone Airproof Mini</field>
<field name="datas" type="base64" file="website_airproof/static/src/img/content/airproof-mini.webp"/>
<field name="res_model">ir.ui.view</field>
<field name="public" eval="True"/>
</record>
<record id="img_pro" model="ir.attachment">
<field name="name">Drone Airproof Pro</field>
<field name="datas" type="base64" file="website_airproof/static/src/img/content/airproof-pro.webp"/>
<field name="res_model">ir.ui.view</field>
<field name="public" eval="True"/>
</record>
<record id="img_robin" model="ir.attachment">
<field name="name">Drone Airproof Robin</field>
<field name="datas" type="base64" file="website_airproof/static/src/img/content/airproof-robin.webp"/>
<field name="res_model">ir.ui.view</field>
<field name="public" eval="True"/>
</record>
<record id="img_falcon" model="ir.attachment">
<field name="name">Drone Airproof Falcon</field>
<field name="datas" type="base64" file="website_airproof/static/src/img/content/airproof-falcon.webp"/>
<field name="res_model">ir.ui.view</field>
<field name="public" eval="True"/>
</record>
<record id="img_eagle" model="ir.attachment">
<field name="name">Drone Airproof Eagle</field>
<field name="datas" type="base64" file="website_airproof/static/src/img/content/airproof-eagle.webp"/>
<field name="res_model">ir.ui.view</field>
<field name="public" eval="True"/>
</record>

<!-- HOMEPAGE -->
<!-- Add drone image in the library -->
<record id="img_accessories" model="ir.attachment">
<field name="name">Drone accessories picture</field>
<field name="datas" type="base64" file="website_airproof/static/src/img/content/accessories.webp"/>
<field name="res_model">ir.ui.view</field>
<field name="public" eval="True"/>
</record>
<record id="img_drone_robin" model="ir.attachment">
<field name="name">Drone Robin picture</field>
<field name="datas" type="base64" file="website_airproof/static/src/img/content/drone-robin.webp"/>
<field name="res_model">ir.ui.view</field>
<field name="public" eval="True"/>
</record>
<record id="img_school" model="ir.attachment">
<field name="name">Drone school picture</field>
<field name="datas" type="base64" file="website_airproof/static/src/img/content/school.webp"/>
<field name="res_model">ir.ui.view</field>
<field name="public" eval="True"/>
</record>
<record id="img_drone_flying" model="ir.attachment">
<field name="name">Drone flying picture</field>
<field name="datas" type="base64" file="website_airproof/static/src/img/content/drone-flying.webp"/>
<field name="res_model">ir.ui.view</field>
<field name="public" eval="True"/>
</record>

<!-- CONTACT PAGE -->
<record id="img_topview" model="ir.attachment">
<field name="name">Fields topview</field>
<field name="datas" type="base64" file="website_airproof/static/src/img/content/topview.webp"/>
<field name="res_model">ir.ui.view</field>
<field name="public" eval="True"/>
</record>

<!-- SHOP PAGE -->
<record id="img_topview3" model="ir.attachment">
<field name="name">Highway topview</field>
<field name="datas" type="base64" file="website_airproof/static/src/img/content/topview3.webp"/>
<field name="res_model">ir.ui.view</field>
<field name="public" eval="True"/>
</record>

<!-- PRODUCT PAGE -->
<record id="img_drone_bluebg" model="ir.attachment">
<field name="name">Drone with blue background picture</field>
<field name="datas" type="base64" file="website_airproof/static/src/img/content/drone-bluebg.webp"/>
<field name="res_model">ir.ui.view</field>
<field name="public" eval="True"/>
</record>

<!-- SNIPPET CAROUSSEL -->
<record id="img_sticker" model="ir.attachment">
<field name="name">Sticker logo</field>
<field name="datas" type="base64" file="website_airproof/static/src/img/snippets/s_airproof_caroussel/sticker.webp"/>
<field name="res_model">ir.ui.view</field>
<field name="public" eval="True"/>
</record>
<record id="img_drone" model="ir.attachment">
<field name="name">Drone picture</field>
<field name="datas" type="base64" file="website_airproof/static/src/img/snippets/s_airproof_caroussel/drone.webp"/>
<field name="res_model">ir.ui.view</field>
<field name="public" eval="True"/>
</record>
</odoo>
116 changes: 116 additions & 0 deletions website_airproof/data/menu.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo noupdate="1">
<!-- Delete Default "Home" menu item -->
<delete model="website.menu" search="[('url','in', ['/', '/']), ('website_id', '=', 1)]"/>
<!-- Delete Default "Blog" menu item -->
<delete model="website.menu" search="[('url','in', ['/', '/blog']), ('website_id', '=', 1)]"/>
<!-- Delete Default "Shop" menu item -->
<delete model="website.menu" search="[('url','in', ['/', '/shop']), ('website_id', '=', 1)]"/>
<!-- Delete Default "Contact us" menu item -->
<delete model="website.menu" search="[('url','in', ['/', '/contactus']), ('website_id', '=', 1)]"/>

<!-- Waterproof drones item - Mega-menu -->
<record id="menu_drones" model="website.menu">
<field name="is_mega_menu" eval="True"/>
<field name="name">Waterproof drones</field>
<field name="parent_id" search="[
('url', '=', '/default-main-menu'),
('website_id', '=', 1)]"/>
<field name="website_id">1</field>
<field name="sequence" type="int">10</field>
<field name="mega_menu_content" type="html">
<section class="s_mega_menu_cards pt24 pb24" style="background-color: #F4F4F4 !important;">
<div class="container">
<div class="row">
<div class="col-6 col-sm text-center pt8 pb8 o_colored_level">
<a href="/shop/airproof-mini-1" class="nav-link p-0" data-name="Menu Item">
<img src="/web/image/website_airproof.img_mini" alt="Drone Airproof Mini" class="img-fluid img"/>
<div class="p-2">
<font class="fw-bold">Airproof Mini</font>
</div>
</a>
</div>
<div class="col-6 col-sm text-center pt8 pb8 o_colored_level">
<a href="/shop/airproof-pro-2" class="nav-link p-0" data-name="Menu Item">
<img src="/web/image/website_airproof.img_pro" alt="Drone Airproof Pro" class="img-fluid img"/>
<div class="p-2">
<font class="fw-bold">Airproof Pro</font>
</div>
</a>
</div>
<div class="col-6 col-sm text-center pt8 pb8 o_colored_level">
<a href="/shop/airproof-robin-3" class="nav-link p-0" data-name="Menu Item">
<img src="/web/image/website_airproof.img_robin" alt="Drone Airproof Robin" class="img-fluid img"/>
<div class="d-block p-2">
<font class="fw-bold">Airproof Robin</font>
</div>
</a>
</div>
<div class="col-6 col-sm text-center pt8 pb8 o_colored_level">
<a href="/shop/airproof-falcon-4" class="nav-link p-0" data-name="Menu Item">
<img src="/web/image/website_airproof.img_falcon" alt="Drone Airproof Falcon" class="img-fluid img"/>
<div class="d-block p-2">
<font class="fw-bold">Airproof Falcon</font>
</div>
</a>
</div>
<div class="col-6 col-sm text-center pt8 pb8 o_colored_level">
<a href="/shop/airproof-eagle-5" class="nav-link p-0" data-name="Menu Item">
<img src="/web/image/website_airproof.img_eagle" alt="Drone Airproof Eagle" class="img-fluid img"/>
<div class="d-block p-2">
<font class="fw-bold">Airproof Eagle</font>
</div>
</a>
</div>
</div>
</div>
</section>
</field>
</record>

<!-- About us item -->
<record id="menu_about" model="website.menu">
<field name="name">About us</field>
<field name="url">/about-us</field>
<field name="website_id">1</field>
<field name="parent_id" search="[
('url', '=', '/default-main-menu'),
('website_id', '=', 1)]"/>
<field name="sequence" type="int">20</field>
</record>

<!-- Blog item - Dropdown -->
<record id="menu_blog" model="website.menu">
<field name="name">Blog</field>
<field name="parent_id" search="[
('url', '=', '/default-main-menu'),
('website_id', '=', 1)]"/>
<field name="website_id">1</field>
<field name="sequence" type="int">30</field>
</record>
<record id="menu_blog_item_1" model="website.menu">
<field name="name">Our latest news</field>
<field name="url">/blog/our-latest-news-2</field>
<field name="website_id">1</field>
<field name="parent_id" ref="website_airproof.menu_blog"/>
<field name="sequence" type="int">31</field>
</record>
<record id="menu_blog_item_2" model="website.menu">
<field name="name">Tutorials</field>
<field name="url">/blog/tutorials-3</field>
<field name="website_id">1</field>
<field name="parent_id" ref="website_airproof.menu_blog"/>
<field name="sequence" type="int">32</field>
</record>

<!-- Contact us item -->
<record id="menu_contact" model="website.menu">
<field name="name">Contact us</field>
<field name="url">/contactus</field>
<field name="website_id">1</field>
<field name="parent_id" search="[
('url', '=', '/default-main-menu'),
('website_id', '=', 1)]"/>
<field name="sequence" type="int">40</field>
</record>
</odoo>
Loading