Publicerad - Version 1.0

This commit is contained in:
Thomas Lovén 2017-03-14 23:48:14 +01:00
parent 778d00dcf6
commit ed7c8f1bda
24 changed files with 423 additions and 5 deletions

55
Brdtxt dbl.rtf Normal file
View 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}

View File

@ -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)

View File

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 1009 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 723 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 683 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 702 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 722 KiB

View 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

Binary file not shown.

After

Width:  |  Height:  |  Size: 114 KiB

View 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

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

View 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

View 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**

Binary file not shown.

After

Width:  |  Height:  |  Size: 117 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

View 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
View 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
View 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

Binary file not shown.

30
templates/base.html Normal file
View 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
View 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>&nbsp;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
View 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 %}