Skip to content

Commit fbf9ee9

Browse files
committed
[ADD] website airproof: add solution for website theme tutorial
closes #764 Signed-off-by: Antoine Vandevenne (anv) <[email protected]>
1 parent 4c650f3 commit fbf9ee9

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

69 files changed

+3111
-0
lines changed

website_airproof/README.md

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# Odoo Tutorial : Build a website theme
2+
3+
This branch contains the code necessary for the creation of the website for our Airproof example.
4+
Example used to illustrate the exercises given in the Odoo tutorial: Build a website theme.
5+
6+
Here is the final design of the 4 pages of Airproof that will be created throughout this tutorial.
7+
8+
**Home**
9+
![Airproof home page](airproof-home-page.jpg)
10+
11+
**Contact page**
12+
![Airproof contact page](airproof-contact-page.jpg)
13+
14+
**Shop page**
15+
![Airproof shop page](airproof-shop-page.jpg)
16+
17+
**Product page**
18+
![Airproof product page](airproof-product-page.jpg)

website_airproof/__init__.py

Whitespace-only changes.

website_airproof/__manifest__.py

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
{
2+
'name': 'Airproof Theme',
3+
'description': 'Airproof Theme - Drones, modelling, camera',
4+
'category': 'Website/Theme',
5+
# 'version': '18.0.1.0',
6+
'author': 'PSBE Designers',
7+
'license': 'LGPL-3',
8+
'depends': ['website_sale', 'website_sale_wishlist', 'website_blog', 'website_mass_mailing'],
9+
'data': [
10+
# Options
11+
'data/presets.xml',
12+
# Menu
13+
'data/menu.xml',
14+
# Shapes
15+
'data/shapes.xml',
16+
# Pages
17+
'data/pages/home.xml',
18+
'data/pages/contact.xml',
19+
# Frontend
20+
'views/website_templates.xml',
21+
'views/website_sale_templates.xml',
22+
'views/website_sale_wishlist_templates.xml',
23+
# Snippets
24+
'views/snippets/options.xml',
25+
'views/snippets/s_airproof_carousel.xml',
26+
# Images
27+
'data/images.xml',
28+
],
29+
'assets': {
30+
'web._assets_primary_variables': [
31+
'website_airproof/static/src/scss/primary_variables.scss',
32+
],
33+
'web._assets_frontend_helpers': [
34+
('prepend', 'website_airproof/static/src/scss/bootstrap_overridden.scss'),
35+
],
36+
'web.assets_frontend': [
37+
# SCSS
38+
'website_airproof/static/src/scss/components/mouse_follower.scss',
39+
'website_airproof/static/src/scss/layout/header.scss',
40+
'website_airproof/static/src/scss/pages/product_page.scss',
41+
'website_airproof/static/src/scss/pages/shop.scss',
42+
'website_airproof/static/src/scss/snippets/caroussel.scss',
43+
'website_airproof/static/src/scss/snippets/newsletter.scss',
44+
'website_airproof/static/src/snippets/s_airproof_carousel/000.scss',
45+
# JS
46+
'website_airproof/static/src/js/mouse_follower.js',
47+
],
48+
},
49+
}
76 KB
Loading
94 KB
Loading
90.9 KB
Loading
84.6 KB
Loading

website_airproof/data/images.xml

Lines changed: 192 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,192 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<odoo>
3+
<!-- Branding -->
4+
<!-- Set as the logo of the website -->
5+
<record id="website.default_website" model="website">
6+
<field name="logo" type="base64" file="website_airproof/static/src/img/content/branding/airproof-logo.svg"/>
7+
</record>
8+
<!-- Record the image of the logo -->
9+
<record id="logo" model="ir.attachment">
10+
<field name="name">Logo Airproof</field>
11+
<field name="datas" type="base64" file="website_airproof/static/src/img/content/branding/airproof-logo.svg"/>
12+
<field name="res_model">ir.ui.view</field>
13+
<field name="public" eval="True"/>
14+
</record>
15+
16+
<!-- ICONS -->
17+
<record id="img_arrow_white" model="ir.attachment">
18+
<field name="name">White arrow icon</field>
19+
<field name="datas" type="base64" file="website_airproof/static/src/img/content/icons/arrow-white.svg"/>
20+
<field name="res_model">ir.ui.view</field>
21+
<field name="public" eval="True"/>
22+
</record>
23+
<record id="img_glasses" model="ir.attachment">
24+
<field name="name">Glasses icon</field>
25+
<field name="datas" type="base64" file="website_airproof/static/src/img/content/icons/glasses.svg"/>
26+
<field name="res_model">ir.ui.view</field>
27+
<field name="public" eval="True"/>
28+
</record>
29+
<record id="img_4k" model="ir.attachment">
30+
<field name="name">4K icon</field>
31+
<field name="datas" type="base64" file="website_airproof/static/src/img/content/icons/4k.svg"/>
32+
<field name="res_model">ir.ui.view</field>
33+
<field name="public" eval="True"/>
34+
</record>
35+
<record id="img_hand_drone" model="ir.attachment">
36+
<field name="name">Hand with drone icon</field>
37+
<field name="datas" type="base64" file="website_airproof/static/src/img/content/icons/hand-drone.svg"/>
38+
<field name="res_model">ir.ui.view</field>
39+
<field name="public" eval="True"/>
40+
</record>
41+
<record id="img_control" model="ir.attachment">
42+
<field name="name">Control icon</field>
43+
<field name="datas" type="base64" file="website_airproof/static/src/img/content/icons/control.svg"/>
44+
<field name="res_model">ir.ui.view</field>
45+
<field name="public" eval="True"/>
46+
</record>
47+
<record id="img_shopping" model="ir.attachment">
48+
<field name="name">Shopping icon</field>
49+
<field name="datas" type="base64" file="website_airproof/static/src/img/content/icons/shopping.svg"/>
50+
<field name="res_model">ir.ui.view</field>
51+
<field name="public" eval="True"/>
52+
</record>
53+
<record id="img_phone" model="ir.attachment">
54+
<field name="name">Phone icon</field>
55+
<field name="datas" type="base64" file="website_airproof/static/src/img/content/icons/phone.svg"/>
56+
<field name="res_model">ir.ui.view</field>
57+
<field name="public" eval="True"/>
58+
</record>
59+
<record id="img_envelop" model="ir.attachment">
60+
<field name="name">Envelop icon</field>
61+
<field name="datas" type="base64" file="website_airproof/static/src/img/content/icons/envelop.svg"/>
62+
<field name="res_model">ir.ui.view</field>
63+
<field name="public" eval="True"/>
64+
</record>
65+
<record id="img_arrow" model="ir.attachment">
66+
<field name="name">Arrow icon</field>
67+
<field name="datas" type="base64" file="website_airproof/static/src/img/content/icons/arrow.svg"/>
68+
<field name="res_model">ir.ui.view</field>
69+
<field name="public" eval="True"/>
70+
</record>
71+
<record id="img_arrow_small" model="ir.attachment">
72+
<field name="name">Small arrow icon</field>
73+
<field name="datas" type="base64" file="website_airproof/static/src/img/content/icons/arrow-small.svg"/>
74+
<field name="res_model">ir.ui.view</field>
75+
<field name="public" eval="True"/>
76+
</record>
77+
<record id="img_check" model="ir.attachment">
78+
<field name="name">Check icon</field>
79+
<field name="datas" type="base64" file="website_airproof/static/src/img/content/icons/check.svg"/>
80+
<field name="res_model">ir.ui.view</field>
81+
<field name="public" eval="True"/>
82+
</record>
83+
<record id="img_phone_black" model="ir.attachment">
84+
<field name="name">Black Phone icon</field>
85+
<field name="datas" type="base64" file="website_airproof/static/src/img/content/icons/phone-black.svg"/>
86+
<field name="res_model">ir.ui.view</field>
87+
<field name="public" eval="True"/>
88+
</record>
89+
<record id="img_envelop_black" model="ir.attachment">
90+
<field name="name">Black Envelop icon</field>
91+
<field name="datas" type="base64" file="website_airproof/static/src/img/content/icons/envelop-black.svg"/>
92+
<field name="res_model">ir.ui.view</field>
93+
<field name="public" eval="True"/>
94+
</record>
95+
96+
<!-- MEGA-MENU -->
97+
<record id="img_mini" model="ir.attachment">
98+
<field name="name">Drone Airproof Mini</field>
99+
<field name="datas" type="base64" file="website_airproof/static/src/img/content/airproof-mini.webp"/>
100+
<field name="res_model">ir.ui.view</field>
101+
<field name="public" eval="True"/>
102+
</record>
103+
<record id="img_pro" model="ir.attachment">
104+
<field name="name">Drone Airproof Pro</field>
105+
<field name="datas" type="base64" file="website_airproof/static/src/img/content/airproof-pro.webp"/>
106+
<field name="res_model">ir.ui.view</field>
107+
<field name="public" eval="True"/>
108+
</record>
109+
<record id="img_robin" model="ir.attachment">
110+
<field name="name">Drone Airproof Robin</field>
111+
<field name="datas" type="base64" file="website_airproof/static/src/img/content/airproof-robin.webp"/>
112+
<field name="res_model">ir.ui.view</field>
113+
<field name="public" eval="True"/>
114+
</record>
115+
<record id="img_falcon" model="ir.attachment">
116+
<field name="name">Drone Airproof Falcon</field>
117+
<field name="datas" type="base64" file="website_airproof/static/src/img/content/airproof-falcon.webp"/>
118+
<field name="res_model">ir.ui.view</field>
119+
<field name="public" eval="True"/>
120+
</record>
121+
<record id="img_eagle" model="ir.attachment">
122+
<field name="name">Drone Airproof Eagle</field>
123+
<field name="datas" type="base64" file="website_airproof/static/src/img/content/airproof-eagle.webp"/>
124+
<field name="res_model">ir.ui.view</field>
125+
<field name="public" eval="True"/>
126+
</record>
127+
128+
<!-- HOMEPAGE -->
129+
<!-- Add drone image in the library -->
130+
<record id="img_accessories" model="ir.attachment">
131+
<field name="name">Drone accessories picture</field>
132+
<field name="datas" type="base64" file="website_airproof/static/src/img/content/accessories.webp"/>
133+
<field name="res_model">ir.ui.view</field>
134+
<field name="public" eval="True"/>
135+
</record>
136+
<record id="img_drone_robin" model="ir.attachment">
137+
<field name="name">Drone Robin picture</field>
138+
<field name="datas" type="base64" file="website_airproof/static/src/img/content/drone-robin.webp"/>
139+
<field name="res_model">ir.ui.view</field>
140+
<field name="public" eval="True"/>
141+
</record>
142+
<record id="img_school" model="ir.attachment">
143+
<field name="name">Drone school picture</field>
144+
<field name="datas" type="base64" file="website_airproof/static/src/img/content/school.webp"/>
145+
<field name="res_model">ir.ui.view</field>
146+
<field name="public" eval="True"/>
147+
</record>
148+
<record id="img_drone_flying" model="ir.attachment">
149+
<field name="name">Drone flying picture</field>
150+
<field name="datas" type="base64" file="website_airproof/static/src/img/content/drone-flying.webp"/>
151+
<field name="res_model">ir.ui.view</field>
152+
<field name="public" eval="True"/>
153+
</record>
154+
155+
<!-- CONTACT PAGE -->
156+
<record id="img_topview" model="ir.attachment">
157+
<field name="name">Fields topview</field>
158+
<field name="datas" type="base64" file="website_airproof/static/src/img/content/topview.webp"/>
159+
<field name="res_model">ir.ui.view</field>
160+
<field name="public" eval="True"/>
161+
</record>
162+
163+
<!-- SHOP PAGE -->
164+
<record id="img_topview3" model="ir.attachment">
165+
<field name="name">Highway topview</field>
166+
<field name="datas" type="base64" file="website_airproof/static/src/img/content/topview3.webp"/>
167+
<field name="res_model">ir.ui.view</field>
168+
<field name="public" eval="True"/>
169+
</record>
170+
171+
<!-- PRODUCT PAGE -->
172+
<record id="img_drone_bluebg" model="ir.attachment">
173+
<field name="name">Drone with blue background picture</field>
174+
<field name="datas" type="base64" file="website_airproof/static/src/img/content/drone-bluebg.webp"/>
175+
<field name="res_model">ir.ui.view</field>
176+
<field name="public" eval="True"/>
177+
</record>
178+
179+
<!-- SNIPPET CAROUSSEL -->
180+
<record id="img_sticker" model="ir.attachment">
181+
<field name="name">Sticker logo</field>
182+
<field name="datas" type="base64" file="website_airproof/static/src/img/snippets/s_airproof_caroussel/sticker.webp"/>
183+
<field name="res_model">ir.ui.view</field>
184+
<field name="public" eval="True"/>
185+
</record>
186+
<record id="img_drone" model="ir.attachment">
187+
<field name="name">Drone picture</field>
188+
<field name="datas" type="base64" file="website_airproof/static/src/img/snippets/s_airproof_caroussel/drone.webp"/>
189+
<field name="res_model">ir.ui.view</field>
190+
<field name="public" eval="True"/>
191+
</record>
192+
</odoo>

website_airproof/data/menu.xml

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<odoo noupdate="1">
3+
<!-- Delete Default "Home" menu item -->
4+
<delete model="website.menu" search="[('url','in', ['/', '/']), ('website_id', '=', 1)]"/>
5+
<!-- Delete Default "Blog" menu item -->
6+
<delete model="website.menu" search="[('url','in', ['/', '/blog']), ('website_id', '=', 1)]"/>
7+
<!-- Delete Default "Shop" menu item -->
8+
<delete model="website.menu" search="[('url','in', ['/', '/shop']), ('website_id', '=', 1)]"/>
9+
<!-- Delete Default "Contact us" menu item -->
10+
<delete model="website.menu" search="[('url','in', ['/', '/contactus']), ('website_id', '=', 1)]"/>
11+
12+
<!-- Waterproof drones item - Mega-menu -->
13+
<record id="menu_drones" model="website.menu">
14+
<field name="is_mega_menu" eval="True"/>
15+
<field name="name">Waterproof drones</field>
16+
<field name="parent_id" search="[
17+
('url', '=', '/default-main-menu'),
18+
('website_id', '=', 1)]"/>
19+
<field name="website_id">1</field>
20+
<field name="sequence" type="int">10</field>
21+
<field name="mega_menu_content" type="html">
22+
<section class="s_mega_menu_cards pt24 pb24" style="background-color: #F4F4F4 !important;">
23+
<div class="container">
24+
<div class="row">
25+
<div class="col-6 col-sm text-center pt8 pb8 o_colored_level">
26+
<a href="/shop/airproof-mini-1" class="nav-link p-0" data-name="Menu Item">
27+
<img src="/web/image/website_airproof.img_mini" alt="Drone Airproof Mini" class="img-fluid img"/>
28+
<div class="p-2">
29+
<font class="fw-bold">Airproof Mini</font>
30+
</div>
31+
</a>
32+
</div>
33+
<div class="col-6 col-sm text-center pt8 pb8 o_colored_level">
34+
<a href="/shop/airproof-pro-2" class="nav-link p-0" data-name="Menu Item">
35+
<img src="/web/image/website_airproof.img_pro" alt="Drone Airproof Pro" class="img-fluid img"/>
36+
<div class="p-2">
37+
<font class="fw-bold">Airproof Pro</font>
38+
</div>
39+
</a>
40+
</div>
41+
<div class="col-6 col-sm text-center pt8 pb8 o_colored_level">
42+
<a href="/shop/airproof-robin-3" class="nav-link p-0" data-name="Menu Item">
43+
<img src="/web/image/website_airproof.img_robin" alt="Drone Airproof Robin" class="img-fluid img"/>
44+
<div class="d-block p-2">
45+
<font class="fw-bold">Airproof Robin</font>
46+
</div>
47+
</a>
48+
</div>
49+
<div class="col-6 col-sm text-center pt8 pb8 o_colored_level">
50+
<a href="/shop/airproof-falcon-4" class="nav-link p-0" data-name="Menu Item">
51+
<img src="/web/image/website_airproof.img_falcon" alt="Drone Airproof Falcon" class="img-fluid img"/>
52+
<div class="d-block p-2">
53+
<font class="fw-bold">Airproof Falcon</font>
54+
</div>
55+
</a>
56+
</div>
57+
<div class="col-6 col-sm text-center pt8 pb8 o_colored_level">
58+
<a href="/shop/airproof-eagle-5" class="nav-link p-0" data-name="Menu Item">
59+
<img src="/web/image/website_airproof.img_eagle" alt="Drone Airproof Eagle" class="img-fluid img"/>
60+
<div class="d-block p-2">
61+
<font class="fw-bold">Airproof Eagle</font>
62+
</div>
63+
</a>
64+
</div>
65+
</div>
66+
</div>
67+
</section>
68+
</field>
69+
</record>
70+
71+
<!-- About us item -->
72+
<record id="menu_about" model="website.menu">
73+
<field name="name">About us</field>
74+
<field name="url">/about-us</field>
75+
<field name="website_id">1</field>
76+
<field name="parent_id" search="[
77+
('url', '=', '/default-main-menu'),
78+
('website_id', '=', 1)]"/>
79+
<field name="sequence" type="int">20</field>
80+
</record>
81+
82+
<!-- Blog item - Dropdown -->
83+
<record id="menu_blog" model="website.menu">
84+
<field name="name">Blog</field>
85+
<field name="parent_id" search="[
86+
('url', '=', '/default-main-menu'),
87+
('website_id', '=', 1)]"/>
88+
<field name="website_id">1</field>
89+
<field name="sequence" type="int">30</field>
90+
</record>
91+
<record id="menu_blog_item_1" model="website.menu">
92+
<field name="name">Our latest news</field>
93+
<field name="url">/blog/our-latest-news-2</field>
94+
<field name="website_id">1</field>
95+
<field name="parent_id" ref="website_airproof.menu_blog"/>
96+
<field name="sequence" type="int">31</field>
97+
</record>
98+
<record id="menu_blog_item_2" model="website.menu">
99+
<field name="name">Tutorials</field>
100+
<field name="url">/blog/tutorials-3</field>
101+
<field name="website_id">1</field>
102+
<field name="parent_id" ref="website_airproof.menu_blog"/>
103+
<field name="sequence" type="int">32</field>
104+
</record>
105+
106+
<!-- Contact us item -->
107+
<record id="menu_contact" model="website.menu">
108+
<field name="name">Contact us</field>
109+
<field name="url">/contactus</field>
110+
<field name="website_id">1</field>
111+
<field name="parent_id" search="[
112+
('url', '=', '/default-main-menu'),
113+
('website_id', '=', 1)]"/>
114+
<field name="sequence" type="int">40</field>
115+
</record>
116+
</odoo>

0 commit comments

Comments
 (0)