Publicerad - Version 1.0
55
Brdtxt dbl.rtf
Normal file
@ -0,0 +1,55 @@
|
||||
{\rtf1\ansi\ansicpg1252\cocoartf1504\cocoasubrtf810
|
||||
{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
|
||||
{\colortbl;\red255\green255\blue255;}
|
||||
{\*\expandedcolortbl;;}
|
||||
\paperw11900\paperh16840\margl1440\margr1440\vieww50620\viewh27080\viewkind0
|
||||
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural\partightenfactor0
|
||||
|
||||
\f0\fs24 \cf0 V\'e4lkommen till Design by Lov\'e9n! H\'e4r hittar du unika och sk\'f6na kl\'e4der f\'f6r barn upp till tv\'e5 \'e5r. Allt sys av mig, Anneli, i min atelj\'e9 i R\'f6deby. \
|
||||
\
|
||||
Visningsexemplar sys i samma storlek som en av mina flickor (fn st62 och st86). \'d6vriga storlekar tillverkas efter best\'e4llning f\'f6r att kunna h\'e5lla nere priserna. Nya modeller tillkommer l\'f6pande. \
|
||||
\
|
||||
Samtliga kl\'e4dtyger har tv\'e4ttats parfymfritt, utan sk\'f6ljmedel, innan s\'f6mnad. \
|
||||
(Obs! G\'e4ller ej f\'f6rkl\'e4den.)\
|
||||
\
|
||||
Nystartserbjudande! K\'f6p v\'e5r fina Superman-body f\'f6r bara 200kr (ord pris 250kr) om du best\'e4ller innan p\'e5sk. Bodyn sys i st 62-80 med rosa, bl\'e5 eller beige bas.\
|
||||
\
|
||||
Vi finns \'e4ven p\'e5 FaceBook, gilla f\'f6r att f\'e5 uppdateringar i din telefon eller surfplatta!\
|
||||
\
|
||||
________\
|
||||
Superman-body 250kr\
|
||||
Visst \'e4r varje barn en liten superhj\'e4lte?! \
|
||||
Denna kuvertbody sys i st62-80 med rosa, bl\'e5 eller beige bas. Samtliga varianter har vitt tryck och vita kantband. \'c4rmarna avslutas med sm\'e5 kontrasterande dekors\'f6mmar vid handleden. \
|
||||
\
|
||||
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural\partightenfactor0
|
||||
\cf0 ________\
|
||||
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural\partightenfactor0
|
||||
\cf0 Kuvertbody med dekors\'f6mmar p\'e5 br\'f6stet 230kr\
|
||||
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural\partightenfactor0
|
||||
\cf0 Denna body sys i st62-80 med rosa, bl\'e5, gr\'f6n eller beige bas. Samtliga varianter har vita kantband. Dekors\'f6mmarna bryter vackert av mot basf\'e4rgen. \'c4rmarna avslutas med matchande dekors\'f6m vid handleden. \
|
||||
________\
|
||||
F\'f6rkl\'e4de 150kr\
|
||||
Finns det n\'e5t mer bed\'e5rande \'e4n barn som hj\'e4lper till i k\'f6ket?\
|
||||
Dessa f\'f6rkl\'e4den passar barn i \'e5lder 1-3 \'e5r (ca 74-104cm) och sys av l\'e4ttsk\'f6tt och vattenavvisande CTC-duk, kantad med snedsl\'e5 i bomull. \
|
||||
\
|
||||
________\
|
||||
Balaclava 200kr\
|
||||
Perfekt under hj\'e4lmen, oavsett om ni ska \'e5ka pulka, skoter eller ut och cykla. Superbra \'e4ven f\'f6r de minsta innanf\'f6r overallens luva. Sys i enkelstorlekar f\'f6r huvudomf\'e5ng 38-50cm.\
|
||||
\
|
||||
________\
|
||||
Set med m\'f6ssa, vantar och dregglis f\'f6r de minsta 300kr\
|
||||
Matchat set i trik\'e5 som kan anv\'e4ndas l\'e4nge. \
|
||||
\
|
||||
M\'f6ssan sys med eller utan foder efter s\'e4song/\'f6nskem\'e5l. M\'f6ssans innerdiameter \'e4r ca 40cm (motsvarar ca st62 i kl\'e4der), stretchen i tyget g\'f6r att den passar bra upp till huvudstorlek 44-45cm (motsv ca st74). \
|
||||
\
|
||||
Vantarna \'e4r fodrade, handledsdiameter ca 10cm n\'e4r tyget \'e4r \'94i vila\'94.\
|
||||
\
|
||||
Dregglis i dubbel trik\'e5 med tv\'e5 l\'e4gen f\'f6r tryckknappen, s\'e5 den passar fr\'e5n nyf\'f6dd till ca st74.\
|
||||
\
|
||||
Setet kan \'e4ven sys f\'f6r st\'f6rre/mindre storlekar, efter \'f6nskem\'e5l vid best\'e4llning. \
|
||||
Samtliga delar kan dessutom best\'e4llas separat.\
|
||||
\
|
||||
M\'e5ttbest\'e4llt set 350kr\
|
||||
M\'f6ssa 150kr\
|
||||
Vantar 100kr\
|
||||
Dregglis 90kr}
|
@ -1,17 +1,105 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
from flask import Flask, render_template, url_for, send_from_directory
|
||||
from flask import Flask, render_template, url_for, send_from_directory, abort, jsonify
|
||||
from flask_bootstrap import Bootstrap
|
||||
from flaskext.markdown import Markdown
|
||||
from PIL import Image, ImageOps
|
||||
|
||||
import os
|
||||
import random
|
||||
|
||||
app = Flask(__name__)
|
||||
Bootstrap(app)
|
||||
Markdown(app)
|
||||
|
||||
pages = 'sidor/'
|
||||
|
||||
categories = []
|
||||
photos = []
|
||||
for x in os.walk(pages):
|
||||
if not 'presentation.md' in x[2]:
|
||||
continue
|
||||
cat = x[0].split('/')[-1]
|
||||
categories.append(cat)
|
||||
num = len([x for x in x[2] if x.endswith(('.jpg','.JPG'))])
|
||||
for i in range(num):
|
||||
photos.append({'category': cat, 'num': i})
|
||||
|
||||
@app.route('/randimg')
|
||||
def randimg():
|
||||
img = random.choice(photos)
|
||||
return jsonify(img)
|
||||
|
||||
def genimg(imgin, imgout, size):
|
||||
img = Image.open(imgin)
|
||||
img.thumbnail(size)
|
||||
hpad = int((size[0]-img.size[0])/2)
|
||||
vpad = int((size[1]-img.size[1])/2)
|
||||
thumb = Image.new(mode='RGBA', size=size, color=(255,255,255,0))
|
||||
thumb.paste(img, (hpad, vpad))
|
||||
thumb.save(imgout)
|
||||
|
||||
@app.route('/thumbnails/<category>/')
|
||||
@app.route('/thumbnails/<category>/<int:num>')
|
||||
def thumbnails(category, num=0):
|
||||
catdir = pages + '/' + category
|
||||
thumbdir = catdir + '/thumbnails'
|
||||
if not os.path.isfile('%s/%d.jpg' % (thumbdir, num)):
|
||||
images = [x for x in next(os.walk(catdir))[2] if x.endswith('.jpg')]
|
||||
if not os.path.exists(thumbdir):
|
||||
os.makedirs(thumbdir)
|
||||
imgin = '%s/%s' % (catdir, images[num])
|
||||
imgout = '%s/%d.jpg' % (thumbdir, num)
|
||||
genimg(imgin, imgout, (171,180))
|
||||
|
||||
return send_from_directory(thumbdir, filename="%d.jpg" % (num))
|
||||
@app.route('/slides/<category>/<int:num>')
|
||||
def slides(category, num=0):
|
||||
catdir = pages + '/' + category
|
||||
thumbdir = catdir + '/slides'
|
||||
if not os.path.isfile('%s/%d.jpg' % (thumbdir, num)):
|
||||
images = [x for x in next(os.walk(catdir))[2] if x.endswith('.jpg')]
|
||||
imgin = '%s/%s' % (catdir, images[num])
|
||||
imgout = '%s/%d.jpg' % (thumbdir, num)
|
||||
if not os.path.exists(thumbdir):
|
||||
os.makedirs(thumbdir)
|
||||
genimg(imgin, imgout, (550,400))
|
||||
|
||||
return send_from_directory(thumbdir, filename="%d.jpg" % (num))
|
||||
|
||||
@app.route('/<category>/<int:num>.jpg')
|
||||
def cat_photo(category, num):
|
||||
directory = pages + '/' + category
|
||||
images = [x for x in next(os.walk(directory))[2] if x.endswith('.jpg')]
|
||||
try:
|
||||
return send_from_directory(directory, images[num]);
|
||||
except IndexError:
|
||||
abort(404)
|
||||
|
||||
@app.route('/<category>/')
|
||||
def category(category):
|
||||
directory = pages + '/' + category
|
||||
try:
|
||||
with open(directory + '/presentation.md') as f:
|
||||
presentation = ''.join(f.readlines())
|
||||
except FileNotFoundError:
|
||||
presentation = ''
|
||||
images = len([x for x in next(os.walk(directory))[2] if x.endswith('.jpg')])
|
||||
|
||||
|
||||
return render_template('category.html', presentation=presentation, categories=categories, category=category, images=images)
|
||||
|
||||
|
||||
@app.route('/')
|
||||
def hello_world():
|
||||
return render_template('splash.html')
|
||||
def index():
|
||||
with open(pages + 'startsida.md') as f:
|
||||
presentation = ''.join(f.readlines())
|
||||
return render_template('index.html', presentation=presentation, categories=categories, img1=random.choice(photos), img2=random.choice(photos))
|
||||
|
||||
@app.route('/favicon.ico')
|
||||
def favicon():
|
||||
return send_from_directory('static', 'favicon.ico')
|
||||
return send_from_directory('static', filename='favicon.ico')
|
||||
|
||||
if __name__ == '__main__':
|
||||
app.run(debug=True)
|
||||
app.run(host='0.0.0.0', debug=True)
|
||||
|
||||
|
@ -1,6 +1,17 @@
|
||||
appdirs==1.4.3
|
||||
click==6.7
|
||||
dominate==2.3.1
|
||||
Flask==0.12
|
||||
Flask-Bootstrap==3.3.7.1
|
||||
Flask-Markdown==0.3
|
||||
itsdangerous==0.24
|
||||
Jinja2==2.9.4
|
||||
Markdown==2.6.8
|
||||
MarkupSafe==0.23
|
||||
olefile==0.44
|
||||
packaging==16.8
|
||||
Pillow==4.0.0
|
||||
pyparsing==2.2.0
|
||||
six==1.10.0
|
||||
visitor==0.1.3
|
||||
Werkzeug==0.11.15
|
||||
|
BIN
sidor/Balaclava/Grey melange.jpg
Normal file
After Width: | Height: | Size: 1009 KiB |
BIN
sidor/Balaclava/chockrosa.jpg
Normal file
After Width: | Height: | Size: 723 KiB |
BIN
sidor/Balaclava/dark grey.jpg
Normal file
After Width: | Height: | Size: 683 KiB |
BIN
sidor/Balaclava/feathers1.jpg
Normal file
After Width: | Height: | Size: 702 KiB |
BIN
sidor/Balaclava/feathers2.jpg
Normal file
After Width: | Height: | Size: 722 KiB |
7
sidor/Balaclava/presentation.md
Normal file
@ -0,0 +1,7 @@
|
||||
##Balaclava
|
||||
|
||||
Perfekt under hjälmen, oavsett om ni ska åka pulka, skoter eller ut och cykla. Superbra även för de minsta innanför overallens luva. Sys i enkelstorlekar för huvudomfång 38-50cm.
|
||||
|
||||
Samtliga visningsexemplar har storlek 48.
|
||||
|
||||
##200 kr
|
After Width: | Height: | Size: 114 KiB |
7
sidor/Förkläde/presentation.md
Normal file
@ -0,0 +1,7 @@
|
||||
##Förkläde
|
||||
|
||||
Visst är det trevligt att få hjälp i köket?
|
||||
|
||||
Dessa förkläden passar barn i ålder 1-3 år (ca 74-104 cm) och sys av lättskött vattenavvisande CTC-duk, kantad med snedslå i bomull.
|
||||
|
||||
###150kr
|
BIN
sidor/Förkläde/thumbnail.jpg
Normal file
After Width: | Height: | Size: 104 KiB |
BIN
sidor/Kuvertbody/2striped body.jpg
Normal file
After Width: | Height: | Size: 1.3 MiB |
5
sidor/Kuvertbody/presentation.md
Normal file
@ -0,0 +1,5 @@
|
||||
##Kuvertbody
|
||||
|
||||
Denna kuvertbody sys i st62-80 med rosa, blå, grön eller beige bas. Samtliga varianter har vita kantband. Ärmarna avslutas med kontrasterande dekorsömmar vid handleden.
|
||||
|
||||
###230kr
|
21
sidor/Nyfödd-kit/presentation.md
Normal file
@ -0,0 +1,21 @@
|
||||
|
||||
##Mössa, vantar och dregglis
|
||||
|
||||
Set i trikå som kan användas länge, från nyfödd till ungefär st74.
|
||||
|
||||
Mössan sys med eller utan foder efter säsong/önskemål. Mössans innerdiameter är 40 cm (motsvarar st62 i kläder), stretchen i tyget gör att den passar bra upp till huvudstorlek 44-45 cm (motsv st74).
|
||||
|
||||
Vantarna är fodrade, handledsdiameter ca 10 cm när tyget är "i vila".
|
||||
|
||||
Dregglis i dubbel trikå med två lägen för tryckknappen.
|
||||
|
||||
###300kr
|
||||
|
||||
|
||||
Setet kan även sys för större/mindre storlekar, efter önskemål vid beställning.
|
||||
Samtliga delar kan beställas separat.
|
||||
|
||||
- Måttbeställt set **320kr**
|
||||
- Mössa **150kr**
|
||||
- Vantar **100kr**
|
||||
- Dregglis **90kr**
|
BIN
sidor/Nyfödd-kit/thumbnail.jpg
Normal file
After Width: | Height: | Size: 117 KiB |
BIN
sidor/Supermanbody/1Superman.jpg
Normal file
After Width: | Height: | Size: 34 KiB |
7
sidor/Supermanbody/presentation.md
Normal file
@ -0,0 +1,7 @@
|
||||
##Supermanbody
|
||||
|
||||
Visst är varje barn en liten superhjälte?
|
||||
|
||||
Denna kuvertbody sys i st62-80 med rosa, blå eller beige bas. Samtliga varianter har vitt tryck och vita kantband. Ärmarna avslutas med kontrasterande dekorsömmar vid handleden.
|
||||
|
||||
###250kr
|
7
sidor/startaom.sh.command
Executable file
@ -0,0 +1,7 @@
|
||||
#!/bin/bash
|
||||
|
||||
rm -r /Users/thomas/code/designbyloven/sidor/**/slides
|
||||
rm -r /Users/thomas/code/designbyloven/sidor/**/thumbnails
|
||||
touch /Users/thomas/code/designbyloven/designbyloven.py
|
||||
|
||||
exit 0
|
12
sidor/startsida.md
Normal file
@ -0,0 +1,12 @@
|
||||
###Välkommen till Design by Lovén!
|
||||
|
||||
Här hittar du unika kläder för aktiva barn. Allt sys av mig, Anneli, i min ateljé i Rödeby.
|
||||
|
||||
Visningsexemplar sys i samma storlek som en av mina flickor (fn st62 och st86). Övriga storlekar tillverkas efter beställning för att kunna hålla nere priserna. Nya modeller tillkommer löpande.
|
||||
|
||||
Samtliga tyger har tvättats parfymfritt, utan sköljmedel, innan sömnad.
|
||||
(Obs! Gäller ej förkläden.)
|
||||
|
||||
**Nystartserbjudande!** Köp vår fina [Supermanbody](/Supermanbody/) för bara 200 kr (ord pris 250kr) om du beställer innan påsk. Bodyn sys i st 62-80 med rosa, blå eller beige bas.
|
||||
|
||||
Vi finns även på FaceBook, gilla för att få uppdateringar i din telefon eller surfplatta!
|
BIN
static/.DS_Store
vendored
30
templates/base.html
Normal file
@ -0,0 +1,30 @@
|
||||
{% extends "bootstrap/base.html" %}
|
||||
{% block title %} -- Design by Lovén -- {% endblock %}
|
||||
{% block styles %}
|
||||
{{super()}}
|
||||
<style>
|
||||
body {
|
||||
font-family: sans-serif;
|
||||
}
|
||||
</style>
|
||||
{% endblock %}
|
||||
|
||||
{% block navbar %}
|
||||
<nav class="navbar navbar-default">
|
||||
<div class="container">
|
||||
<div class="navbar-header col-xs-11">
|
||||
<a class="navbar-brand" href="/">
|
||||
<div>
|
||||
<img src="{{url_for('static', filename='favicon.ico')}}">
|
||||
Design by Lovén
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
<div class="navbar-header col-xs-1">
|
||||
<ul class="nav navbar-nav">
|
||||
<li><a href="mailto:kontakt@designbyloven.se"><span class="glyphicon glyphicon-envelope"></span></a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
{% endblock %}
|
108
templates/category.html
Normal file
@ -0,0 +1,108 @@
|
||||
|
||||
{% extends "base.html" %}
|
||||
{% block styles %}
|
||||
{{super()}}
|
||||
|
||||
<style>
|
||||
.selected img {
|
||||
opacity: 0.5;
|
||||
}
|
||||
</style>
|
||||
|
||||
{% endblock %}
|
||||
{% block content %}
|
||||
|
||||
<div class="container">
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-6 hidden-xs hidden-sm">
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-body">
|
||||
|
||||
<div id="myCarousel" class="carousel slide" data-ride="carousel">
|
||||
<div class="carousel-inner" role="listbox">
|
||||
{% for i in range(images) %}
|
||||
<div class="item {% if i==0 %}active{% endif %}" data-slide-number="{{i}}">
|
||||
<a href="{{url_for('cat_photo', category=category, num=i) }}">
|
||||
<img src=" {{ url_for('slides', category=category, num=i) }}" class="img-responsive">
|
||||
</a>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="panel-footer" id="slider-thumbs">
|
||||
<ul class="list-inline">
|
||||
{% for i in range(images) %}
|
||||
<li>
|
||||
<a id="carousel-selector-{{i}}" class="thumbnail {% if i==0 %}selected{% endif %}" style="width: 100px; height=100px;">
|
||||
<img src="{{ url_for('thumbnails', category=category, num=i) }}" width=100 height=100>
|
||||
</a>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
<div class="col-md-6">
|
||||
<div class="panel panel-default">
|
||||
<!-- <div class="panel-heading"> -->
|
||||
<!-- <div class="panel-title"> <h2>{{ category }}</h2> </div> -->
|
||||
<!-- </div> -->
|
||||
<div class="panel-body">
|
||||
{{ presentation | markdown }}
|
||||
</div>
|
||||
<div class="panel-footer">
|
||||
<a href="mailto:order@designbyloven.se" class="btn btn-default"><span class="glyphicon glyphicon-envelope"></span> Beställ</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6 visible-xs visible-sm">
|
||||
<div class="well">
|
||||
<ul class="list-inline">
|
||||
{% for i in range(images) %}
|
||||
<li>
|
||||
<a class="thumbnail" style="width:100px; height=100px;" href="{{ url_for('cat_photo', category=category, num=i) }}">
|
||||
<img src="{{ url_for('thumbnails', category=category, num=i) }}" width=100 height=100>
|
||||
</a>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block scripts %}
|
||||
{{super()}}
|
||||
<script>
|
||||
$('#myCarousel').carousel({
|
||||
interval: 5000
|
||||
});
|
||||
|
||||
$('[id^=carousel-selector-]').click(function() {
|
||||
var id_selector = $(this).attr("id");
|
||||
var id = id_selector.substr(id_selector.length -1);
|
||||
id = parseInt(id);
|
||||
$('#myCarousel').carousel(id);
|
||||
$('[id^=carousel-selector-]').removeClass('selected');
|
||||
$(this).addClass('selected');
|
||||
});
|
||||
|
||||
$('#myCarousel').on('slid.bs.carousel', function (e) {
|
||||
var id = $('.item.active').data('slide-number');
|
||||
id = parseInt(id);
|
||||
$('[id^=carousel-selector-]').removeClass('selected');
|
||||
$('[id=carousel-selector-'+id+']').addClass('selected');
|
||||
});
|
||||
</script>
|
||||
{% endblock %}
|
60
templates/index.html
Normal file
@ -0,0 +1,60 @@
|
||||
{% extends "base.html" %}
|
||||
{% block content %}
|
||||
|
||||
<div class="container">
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<img class="pull-left" style="margin: 20px;" src="{{url_for('static', filename='symbol.png')}}">
|
||||
{{presentation|markdown}}
|
||||
</div>
|
||||
<div class="col-md-6 hidden-xs hidden-sm">
|
||||
<div id="myCarousel" class="carousel slide" data-ride="carousel">
|
||||
<div class="carousel-inner thumbnail" role="listbox" style="width:100%; height:430px !important;">
|
||||
<div class="item active" data-slide-number="0">
|
||||
<a id="link-0" href="{{ url_for('category', category=img1['category']) }}"><img id="image-0" src="{{ url_for('slides', **img1) }}">
|
||||
</div>
|
||||
<div class="item" data-slide-number="1">
|
||||
<a id="link-1" href="{{ url_for('category', category=img2['category']) }}"><img id="image-1" src="{{ url_for('slides', **img2) }}">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
{% for cat in categories %}
|
||||
<div class="col-xs-6 col-md-3">
|
||||
<div class="thumbnail">
|
||||
<div class="caption">
|
||||
<a href="{{ url_for('category', category=cat) }}"><h3>{{cat}}</h3></a>
|
||||
</div>
|
||||
<a href="{{ url_for('category', category=cat) }}"><img src="{{ url_for('thumbnails', category=cat) }}" class="img-responsive"></a>
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block scripts %}
|
||||
{{super()}}
|
||||
|
||||
<script>
|
||||
$('#myCarousel').on('slid.bs.carousel', function (e) {
|
||||
var id = $('.item.active').data('slide-number');
|
||||
id = 1-parseInt(id);
|
||||
$.get("/randimg", function(data) {
|
||||
$('[id=link-'+id+']').attr('href', '/'+data.category+'/');
|
||||
$('[id=image-'+id+']').attr('src', '/slides/'+data.category+'/'+data.num);
|
||||
});
|
||||
});
|
||||
|
||||
</script>
|
||||
|
||||
{% endblock %}
|