Merge branch 'develop' into 'master'

Ohlhafv and dependency fixes

Closes #117

See merge request vtmk/web2.0!132
This commit is contained in:
Aarni Halinen
2019-01-28 16:01:56 +02:00
25 changed files with 879 additions and 47 deletions
+2
View File
@@ -1,3 +1,5 @@
[report]
show_missing = True
[run]
omit =
*/migrations/*
+2 -1
View File
@@ -20,4 +20,5 @@ settings.json
.vscode/
.DS_Store
*.code-workspace
sik_test
sik_test
venv/
+2 -2
View File
@@ -31,7 +31,7 @@ pycodestyle:
- pycodestyle --config=setup.cfg --count .
eslint:
image: node:7.10.0
image: node:alpine
stage: lint
before_script:
- npm install
@@ -39,7 +39,7 @@ eslint:
- npm run eslint
remark:
image: node:7.10.0
image: node:alpine
stage: lint
before_script:
- npm install
+1 -1
View File
@@ -1,4 +1,4 @@
FROM python:3
FROM python:3.5
ENV PYTHONUNBUFFERED 1
ENV IS_DOCKER 1
RUN mkdir /code
+3 -4
View File
@@ -1,10 +1,9 @@
"""Admin site registers."""
from django.contrib import admin
from infoscreen.models import Rotation, InfoItem, InfoInstance
from infoscreen.models import ImageInfoItem, ExternalImageInfoItem, ABBInfoItem
from infoscreen.models import ExternalWebsiteInfoItem
from infoscreen.models import VideoInfoItem
from infoscreen.models import (
Rotation, InfoItem, InfoInstance, ImageInfoItem,
ExternalImageInfoItem, ABBInfoItem, ExternalWebsiteInfoItem, VideoInfoItem)
# Register your models here.
admin.site.register(Rotation)
-1
View File
@@ -17,7 +17,6 @@
<script src="{% static "js/lib/angular.js" %}"></script>
<script src="{% static "js/lib/ng-file-upload-bower-12.2.11/ng-file-upload-all.js" %}"></script>
<script src="{% static "js/lib/jquery-3.1.0.min.js" %}"></script>
<script src="{% static "js/lib/underscore-min.js" %}"></script>
<script src="{% static "js/lib/moment.js" %}"></script>
<script src="{% static "js/lib/angular-route.js" %}"></script>
<script src="{% static "js/lib/angular-animate.js" %}"></script>
+11 -14
View File
@@ -6,6 +6,7 @@ from django.views.decorators.csrf import ensure_csrf_cookie
from django.views.decorators.http import require_http_methods
from django.contrib.contenttypes.models import ContentType
from django.contrib.auth.decorators import permission_required, login_required
from django.db import DatabaseError
from infoscreen.models import UploadFileForm
import sikweb.settings as settings
@@ -14,14 +15,10 @@ import logging
import threading
import requests
from infoscreen.models import Rotation, InfoItem, InfoInstance
from infoscreen.models import (ABBInfoItem, ExternalImageInfoItem,
ImageInfoItem, SossoInfoItem, HslInfoItem)
from infoscreen.models import EventInfoItem
from infoscreen.models import ExternalWebsiteInfoItem
from infoscreen.models import ImageUploadForm
from infoscreen.models import ApyInfoItem
from infoscreen.models import VideoInfoItem
from infoscreen.models import (
Rotation, InfoItem, InfoInstance, ABBInfoItem, ExternalImageInfoItem,
ImageInfoItem, SossoInfoItem, HslInfoItem, EventInfoItem,
ExternalWebsiteInfoItem, ImageUploadForm, ApyInfoItem, VideoInfoItem)
@login_required(login_url='/admin/login')
@@ -41,7 +38,7 @@ def create_item_generator(model):
def create_item(request, *args, **kwargs):
try:
data = json.loads(request.body.decode("utf-8"))
except ValueError:
except json.JSONDecodeError:
return HttpResponseBadRequest(
'{"status":"failure","error":"invalid json supplied"}')
try:
@@ -71,7 +68,7 @@ def delete_item_generator(model):
try:
item.delete()
return HttpResponse('{"status":"success"}')
except:
except DatabaseError:
resp = HttpResponse('{"error" : "could not delete item"}')
resp.status_code = 500
return resp
@@ -97,7 +94,7 @@ def delete_info_item(request, *args, **kwargs):
try:
item.delete()
return HttpResponse('{"status":"success"}')
except:
except DatabaseError:
resp = HttpResponse('{"error" : "could not delete item"}')
resp.status_code = 500
return resp
@@ -145,14 +142,14 @@ def create_rotation(request, *args, **kwargs):
"""Create rotation."""
try:
data = json.loads(request.body.decode("utf-8"))
except:
except json.JSONDecodeError:
return HttpResponse('{"error": "bad post body!"}', status=400)
try:
name = data["name"]
Rotation.objects.create(name=name)
resp = HttpResponse(status=200)
except:
except DatabaseError:
resp = HttpResponse(
'{"error" : "could not create rotation!"}', status=400)
@@ -171,7 +168,7 @@ def delete_rotation(request, *args, **kwargs):
try:
Rotation.objects.filter(id=id).delete()
resp = HttpResponse(status=200)
except:
except DatabaseError:
resp = HttpResponse(
'{"error" : "could not delete rotation!"}', status=400)
+2 -1
View File
@@ -2,6 +2,7 @@ from django.shortcuts import render
from django.http import HttpResponse, JsonResponse, HttpResponseBadRequest
from django.views.decorators.http import require_http_methods
from django.conf import settings
from django.db import DatabaseError
from infoscreen.models import Rotation, InfoItem, InfoInstance
from infoscreen.hsl_fetcher import fetch as hsl_fetch
@@ -23,7 +24,7 @@ def default(request, *args, **kwargs):
"""Try getting first rotation item."""
try:
first = Rotation.objects.all()[0].id
except:
except DatabaseError:
first = 0
return index(request, first, *args, **kwargs)
+17
View File
@@ -55,3 +55,20 @@ bash setup.sh
and follow the instructions.
## Done!
## In case of error on macOS Mojave 10.14
If you get an error saying
```
The headers or library files could not be found for zlib,
a required dependency when compiling Pillow from source.
```
run
```
xcode-select --install
sudo installer -pkg /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg -target /
```
+2 -2
View File
@@ -53,9 +53,9 @@ def member_list(request, *args, **kwargs):
f_month = 9
now = timezone.now()
if (now.month >= f_month):
filter_date = datetime.date(now.year, f_month, f_day)
filter_date = timezone.make_aware(datetime.datetime(now.year, f_month, f_day))
else:
filter_date = datetime.date(now.year - 1, f_month, f_day)
filter_date = timezone.make_aware(datetime.datetime(now.year - 1, f_month, f_day))
context = {
'table': table_html,
'member_count': len(members),
+6 -6
View File
@@ -1,5 +1,6 @@
html, body {
background-color: rgb(252, 225, 69);
background: #fdd504;
background: linear-gradient(#fdaa02, #fdd504) no-repeat center center fixed;
}
body {
@@ -13,7 +14,7 @@ body {
border-color: black;
color: black;
border-radius: 0;
border-radius: 8px;
-webkit-appearance: none;
box-shadow: 10px 10px rgba(0, 0, 0, 0.5);
@@ -21,7 +22,6 @@ body {
.form-control:focus {
border-color: black;
outline-style: solid;
outline-color: black;
outline-width: 2px;
}
@@ -48,8 +48,8 @@ h3 {
}
.navbar {
border-radius: 0;
background-color: rgb(252, 225, 69);
border-radius: 8px;
background-color: #c1272d;
box-shadow: 0 0;
}
@@ -97,4 +97,4 @@ h3 {
h6 {
color: black;
}
}
+8
View File
@@ -8,4 +8,12 @@
.navbar-light .navbar-nav .nav-link {
color: black;
border-radius: 8px;
padding: 10px 15px 10px 15px;
margin: 5px;
background-color: #fdaa02;
}
a.nav-item.nav-link:hover {
background-color: #fc8606;
}
+473
View File
@@ -0,0 +1,473 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 23.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 1920 880" style="enable-background:new 0 0 1920 880;" xml:space="preserve">
<style type="text/css">
.st0{fill:#FFFFFF;}
.st1{fill:#5C3B17;}
.st2{fill:#FACF57;}
.st3{fill:#E0860B;}
.st4{fill:#FFE8AE;}
.st5{enable-background:new ;}
.st6{fill:#2833BE;}
.st7{fill:none;stroke:#231F20;stroke-width:5;stroke-miterlimit:10;}
.st8{fill:#C1272D;}
.st9{fill:none;stroke:#5C3B17;stroke-width:6;stroke-miterlimit:10;}
.st10{fill:none;stroke:#5C3B17;stroke-width:8;stroke-miterlimit:10;}
.st11{fill:none;stroke:#231F20;stroke-width:6;stroke-miterlimit:10;}
.st12{fill:#231F20;}
.st13{fill:#BC1D22;}
.st14{fill:#FDFDFD;}
</style>
<g>
<g>
<g>
<path class="st0" d="M1638.2,775.5l-87-42.7l17.6-36l87,42.7c10.2,5,22.4,0.8,27.4-9.4l28.6-58.3c5-10.2,0.8-22.5-9.4-27.4
l-87-42.7l17.6-35.9l87,42.7c30,14.7,42.4,51,27.7,81l-28.6,58.3C1704.5,777.8,1668.2,790.2,1638.2,775.5z"/>
<path class="st1" d="M1635.5,781l-92.5-45.4l23.1-47l92.5,45.4c7.1,3.5,15.7,0.5,19.2-6.6l28.6-58.3c3.5-7.1,0.5-15.7-6.6-19.2
l-92.5-45.4l23.1-47l92.5,45.4c33,16.2,46.7,56.2,30.5,89.2l-28.6,58.3C1708.6,783.5,1668.6,797.2,1635.5,781z M1559.5,730
l81.5,40c26.9,13.2,59.6,2,72.8-24.9l28.6-58.3c13.2-26.9,2-59.5-24.9-72.8l-81.5-40l-12.2,24.9l81.5,40
c13.2,6.5,18.7,22.5,12.2,35.7l-28.6,58.3c-6.5,13.2-22.5,18.7-35.7,12.2l-81.5-40L1559.5,730z"/>
</g>
</g>
<g>
<path class="st0" d="M1428.7,790l70.4,34.5c36.8,18.1,81.4,2.8,99.4-34l91.5-186.6c13.5-27.5,2.1-60.7-25.4-74.2l-104.3-51.2
c-27.5-13.5-60.7-2.1-74.2,25.4l-91.5,186.6C1376.7,727.4,1391.9,771.9,1428.7,790z"/>
<path class="st1" d="M1502.1,832.8l-81.7-40c-36.7-18-52-62.6-34-99.3L1507.8,446l214.9,105.4l-121.3,247.5
C1583.3,835.6,1538.8,850.8,1502.1,832.8z M1513.4,462.5l-115.9,236.4c-15,30.6-2.3,67.8,28.3,82.8l81.7,40
c30.6,15,67.8,2.3,82.8-28.3L1706.2,557L1513.4,462.5z"/>
</g>
<g>
<path class="st2" d="M1516.2,470.7L1403,701.6c-2.6,5.3-4.3,10.9-5.1,16.5c-1.6,11.3,4.3,22.3,14.6,27.3l131.9,64.7
c10.2,5,22.6,3,30.5-5.2c3.9-4.1,7.3-8.8,9.9-14.1L1698,559.8L1516.2,470.7z"/>
</g>
<g>
<path class="st3" d="M1662,542.2l-113.2,230.9c-2.6,5.3-6,10.1-9.9,14.1c-7.9,8.2-20.3,10.2-30.5,5.2l35.9,17.6
c10.2,5,22.6,3,30.5-5.2c3.9-4.1,7.3-8.8,9.9-14.1L1698,559.8L1662,542.2z"/>
</g>
<path class="st1" d="M1455.5,621c-3.1-1.5-6.7-0.2-8.2,2.8l-36.6,74.7c-1.5,3-0.2,6.7,2.8,8.2c3.1,1.5,6.7,0.2,8.2-2.8l36.6-74.7
C1459.8,626.2,1458.5,622.5,1455.5,621z"/>
<path class="st1" d="M1516,483.5l-48.1,98.1c-1.5,3-0.2,6.7,2.8,8.2c3.1,1.5,6.7,0.2,8.2-2.8l48.1-98.1L1516,483.5z"/>
<g>
<path class="st4" d="M1543.5,484.1l-99.2,202.4c-4.9,9.9-0.8,21.9,9.2,26.8c9.9,4.9,21.9,0.8,26.8-9.2l99.2-202.4L1543.5,484.1z"
/>
</g>
<g>
<path class="st0" d="M1719.6,538.7c4.2-5.6,7.2-12.2,8.5-20.1c3-18.8-5.8-37.9-22.3-47.5c-9.3-5.4-19.5-7.2-29.2-5.9
c-2-20.4-14.2-39.2-33.9-48.9c-27.4-13.5-60.1-4.4-77,19.9c-5.2-7-12.1-12.7-20.7-16.5c-24.4-10.8-53.9-0.8-66.7,22.6
c-14.3,26.2-3.8,58.7,22.8,71.7c4.3,2.1,8.7,3.5,13.1,4.4c9.1,1.7,14.3,11.3,10.2,19.7l-19.6,39.9c-6.4,13-1,28.8,12,35.2
c13,6.4,28.8,1,35.2-12l23.5-47.9c3.4-7,11.9-9.9,18.8-6.4l18.3,9c7,3.4,9.9,11.9,6.4,18.8l-9.2,18.8c-6.4,13-1,28.8,12,35.2
c13,6.4,28.8,1,35.2-12l9.2-18.8c3.4-7,11.9-9.9,18.8-6.4c14.3,7,32.1,3,41-10.2C1735.7,566.8,1732.1,548.5,1719.6,538.7z"/>
<path class="st1" d="M1733.9,580c0.1-0.2,0.1-0.3,0.2-0.5c0.4-0.8,0.7-1.6,1.1-2.4c0.1-0.3,0.2-0.5,0.3-0.8
c4.7-12.7,2.1-26.9-6.7-37.3c-0.2-0.2-0.3-0.4-0.5-0.6c-0.2-0.2-0.4-0.4-0.6-0.7c3.3-5.6,5.5-11.7,6.6-18.2
c3.4-21.4-6.7-43-25.3-53.8c-8.3-4.8-17.6-7.3-27.1-7.1c-0.2-1.1-0.4-2.1-0.7-3.2c-0.1-0.4-0.2-0.8-0.3-1.2
c-0.2-0.9-0.5-1.8-0.8-2.7c-0.2-0.7-0.4-1.4-0.7-2s-0.4-1.3-0.7-2c-0.5-1.4-1.1-2.8-1.7-4.1c-0.1-0.1-0.1-0.3-0.2-0.4
c-0.6-1.3-1.3-2.6-2-4c-0.1-0.2-0.2-0.4-0.3-0.5c-2.4-4.4-5.3-8.4-8.6-12.1l0,0c-1.1-1.2-2.3-2.4-3.5-3.6c0,0-0.1-0.1-0.1-0.1
c-2.4-2.3-4.9-4.4-7.6-6.3c-0.3-0.2-0.6-0.4-0.8-0.6c-1.1-0.7-2.1-1.4-3.2-2.1c-0.4-0.2-0.7-0.4-1.1-0.6c-1.4-0.8-2.8-1.6-4.2-2.3
c-27.2-13.3-60.2-6.4-79.9,15.8c-0.3-0.3-0.6-0.6-0.9-0.9c-0.8-0.8-1.6-1.5-2.5-2.3c-0.5-0.5-1.1-0.9-1.6-1.3
c-0.9-0.7-1.8-1.4-2.7-2.1c-0.6-0.4-1.2-0.8-1.8-1.2c-0.9-0.6-1.8-1.2-2.8-1.8c-0.7-0.4-1.4-0.8-2.1-1.1c-0.5-0.3-1-0.6-1.6-0.9
c-0.3-0.2-0.7-0.3-1-0.4c-0.4-0.2-0.7-0.4-1.1-0.5c-0.6-0.3-1.2-0.5-1.8-0.7c-0.8-0.3-1.7-0.7-2.5-1c-0.9-0.3-1.8-0.6-2.7-0.9
c-0.9-0.3-1.9-0.6-2.8-0.8c-0.7-0.2-1.5-0.3-2.2-0.5c-1.2-0.2-2.3-0.5-3.4-0.6c-0.4-0.1-0.9-0.1-1.3-0.1
c-15.7-1.8-31.4,2.9-43.5,12.8c-0.2,0.1-0.3,0.3-0.5,0.4c-1,0.9-2,1.8-3,2.7c-0.4,0.4-0.8,0.8-1.2,1.2c-0.8,0.8-1.5,1.6-2.2,2.4
c-0.6,0.6-1.1,1.2-1.6,1.9c-0.6,0.7-1.2,1.5-1.7,2.3c-0.6,0.8-1.2,1.6-1.7,2.4c-0.5,0.7-0.9,1.5-1.4,2.3c-0.3,0.5-0.6,1-0.9,1.5
c-0.2,0.4-0.4,0.8-0.6,1.2c-0.2,0.4-0.4,0.7-0.6,1.1l0.1,0c-6.7,13.5-7.9,28.8-3.3,43.2c4.9,15.3,15.5,27.6,29.8,34.6
c4.7,2.3,9.6,3.9,14.7,4.9c2.6,0.5,4.7,2.1,5.8,4.3c0.6,1.2,1.4,3.7,0,6.6l-19.6,39.9c-7.9,16.1-1.2,35.5,14.8,43.4
c16.1,7.9,35.6,1.2,43.4-14.8l23.5-47.9c1.9-3.9,6.7-5.5,10.6-3.6l18.3,9c3.9,1.9,5.6,6.7,3.6,10.6l-9.2,18.8
c-7.9,16.1-1.2,35.5,14.8,43.4s35.6,1.2,43.4-14.8l9.2-18.8c1.9-3.9,6.7-5.5,10.6-3.6c17.4,8.5,38.4,3.2,48.8-12.3
C1732.3,583,1733.1,581.5,1733.9,580L1733.9,580z M1721.1,577.7c-7,10.5-21.2,14-33.1,8.1c-10-4.9-22.2-0.8-27.1,9.3l-9.2,18.8
c-4.9,10-17,14.1-26.9,9.2s-14.1-17-9.2-26.9l9.2-18.8c4.9-10,0.8-22.2-9.3-27.1l-18.3-9c-10-4.9-22.2-0.8-27.1,9.3l-23.5,47.9
c-4.9,10-17,14.1-26.9,9.2c-10-4.9-14.1-17-9.2-26.9l19.6-39.9c2.7-5.6,2.7-12-0.1-17.5c-2-4-5.2-7.2-9.2-9.2
c-1.7-0.8-3.4-1.4-5.3-1.8c-4-0.8-7.9-2.1-11.6-3.9c-11.3-5.6-19.7-15.3-23.5-27.3c-3.7-11.7-2.6-24.1,3-35
c0.4-0.7,0.8-1.4,1.2-2.1c0.3-0.6,0.7-1.2,1.1-1.8c0.4-0.7,0.9-1.3,1.4-2c0.4-0.6,0.8-1.2,1.3-1.7c0.4-0.5,0.9-1.1,1.4-1.6
c0.5-0.6,1.1-1.2,1.7-1.8c0.4-0.4,0.7-0.7,1.1-1.1c0.7-0.7,1.4-1.4,2.2-2c0.2-0.2,0.4-0.3,0.6-0.5c8.6-6.9,19.5-10.6,30.6-10.2
c0.1,0,0.1,0,0.2,0c1.1,0,2.2,0.1,3.3,0.3c0.4,0,0.8,0.1,1.2,0.1c0.9,0.1,1.7,0.3,2.6,0.5c0.6,0.1,1.2,0.2,1.8,0.4
c0.7,0.2,1.4,0.4,2.2,0.6c0.7,0.2,1.5,0.4,2.2,0.7c0.7,0.2,1.3,0.5,2,0.8c0.9,0.4,1.7,0.7,2.6,1.1c0.3,0.1,0.6,0.3,0.9,0.4
c1.1,0.6,2.2,1.1,3.2,1.8c0.3,0.2,0.5,0.4,0.8,0.5c0.8,0.5,1.6,1,2.3,1.6c0.4,0.3,0.8,0.6,1.2,0.9c0.8,0.6,1.5,1.2,2.2,1.8
c0.4,0.3,0.8,0.7,1.2,1c0.7,0.6,1.3,1.3,2,2c0.3,0.4,0.7,0.7,1,1.1c0.6,0.6,1.1,1.3,1.7,2c0.2,0.3,0.5,0.6,0.7,0.9
c2.5,3.4,4.6,7,6.1,11c1.1,3,4.2,4.7,7.3,3.9l0,0c3.6-0.9,5.6-4.8,4.2-8.3c-1.4-3.6-3.1-6.9-5.1-10.1
c15.9-19.5,43.8-25.8,66.7-14.6c1.2,0.6,2.4,1.2,3.5,1.9c0.3,0.2,0.6,0.4,0.9,0.6c0.8,0.5,1.7,1,2.5,1.6c0.3,0.2,0.6,0.4,0.9,0.6
c0.8,0.6,1.7,1.2,2.5,1.9c0.2,0.2,0.4,0.3,0.6,0.5c3.2,2.6,6,5.6,8.4,8.8c0,0,0,0,0.1,0.1c0.8,1,1.5,2.1,2.2,3.1
c0.1,0.2,0.2,0.3,0.3,0.5c0.6,0.9,1.2,1.9,1.7,2.8c0.1,0.2,0.3,0.5,0.4,0.7c0.5,0.9,0.9,1.8,1.3,2.7c0.2,0.3,0.3,0.6,0.5,1
c0.4,0.8,0.7,1.6,1,2.4c0.5,1.4,1.1,2.8,1.5,4.2c0,0.1,0,0.1,0.1,0.2c0.3,1,0.6,2.1,0.8,3.1c0,0.1,0.1,0.2,0.1,0.3
c0.2,1.1,0.5,2.2,0.6,3.3c0,0.1,0,0.2,0,0.2c0.2,1.1,0.3,2.2,0.4,3.3c0.4,3.7,0.4,7.4,0,11.1c-0.3,3.2,1.7,6.1,4.8,6.8
c3.5,0.7,7-1.7,7.4-5.3c0.3-2.5,0.3-4.9,0.3-7.4c6.9,0.1,13.6,1.9,19.7,5.4c14.2,8.2,21.9,24.8,19.3,41.1
c-0.7,4.5-2.2,8.6-4.3,12.5c-0.4-0.2-0.7-0.4-1.1-0.6c-3.4-1.7-7.1-2.8-10.9-3.4c-3.8-0.6-7.2,2.5-7,6.4c0.1,2.9,2.3,5.3,5.1,5.8
c2.5,0.4,5,1.2,7.3,2.3c1.5,0.8,2.9,1.6,4.2,2.6l0.3,0.3c0.1,0.1,0.2,0.1,0.2,0.2c0.6,0.5,1.1,0.9,1.6,1.4
c0.4,0.4,0.8,0.8,1.1,1.2c0.2,0.2,0.3,0.3,0.5,0.5c4.3,5,6.5,11.5,6.2,18.1c0,0,0,0.1,0,0.1c0,0.7-0.1,1.5-0.2,2.2
c0,0.2-0.1,0.4-0.1,0.7c-0.1,0.5-0.2,1.1-0.3,1.6c-0.1,0.3-0.2,0.7-0.3,1c-0.1,0.4-0.3,0.9-0.4,1.3c-0.1,0.4-0.3,0.8-0.4,1.1
c-0.2,0.4-0.3,0.8-0.5,1.2C1722.5,575.2,1721.9,576.5,1721.1,577.7z"/>
</g>
<g>
<path class="st1" d="M1672.6,512.6c-6-7.3-14.7-11.2-23.9-11c-5.2,0.1-10.3,1.6-14.6,4.3c-3.5,2.1-4,7-1.1,9.8l0,0
c2.1,2,5.1,2.2,7.6,0.7c7.2-4.3,16.8-3,22.5,4c4.9,6.1,5.1,15,0.4,21.2c-1.8,2.3-4,4.2-6.5,5.4c-2.6,1.2-4.1,3.9-3.7,6.7
c0.7,4.1,5.1,6.3,8.8,4.5c4.2-2,7.9-4.9,10.9-8.7C1681.4,538.8,1681.2,523.2,1672.6,512.6z"/>
<path class="st1" d="M1630.1,446c-7.3-2-14.8-0.6-20.7,3.9c-2.7,2.1-4.9,4.6-6.4,7.5c-2,3.8,0.4,8.4,4.7,8.9
c2.6,0.4,5-1.1,6.3-3.4c0.7-1.3,1.7-2.4,2.9-3.3c3-2.3,7-2.9,10.7-1.5c4.1,1.5,6.9,5.6,7,10c0,1.6-0.3,3.2-0.8,4.6
c-1,2.4-0.7,5.2,1.2,7l0,0c3,3,8.2,2.1,9.9-1.7c1-2.3,1.7-4.7,1.9-7.3C1648,459.7,1640.8,449,1630.1,446z"/>
<path class="st1" d="M1572.6,469.4c-10.6-5.1-23-4.3-33.3,2.4c-2.9,1.9-5.5,4.3-7.7,7.1c-4.5,6-6.9,12.8-7.1,19.8
c-0.1,4,3.5,7.1,7.4,6.3c2.8-0.6,4.8-3,4.9-5.9c0.1-3,0.8-5.9,2.1-8.6c2.4-5.1,6.8-9,12.1-10.9s11.1-1.6,16.3,0.9
c0.1,0,0.1,0.1,0.2,0.1c9,4.4,13.5,14.3,11.4,23.7c-0.6,2.8,0.7,5.7,3.3,6.9c3.5,1.7,7.8-0.3,8.7-4.1
C1594.2,492.2,1587,476.4,1572.6,469.4z"/>
</g>
<g>
<path class="st0" d="M1591,690.3L1591,690.3c-8.9-4.3-12.6-15.1-8.2-24l4.2-8.6c4.3-8.9,15.1-12.5,24-8.2l0,0
c8.9,4.3,12.6,15.1,8.2,24l-4.2,8.6C1610.6,691,1599.8,694.6,1591,690.3z"/>
<path class="st1" d="M1588.2,695.8c-11.9-5.8-16.9-20.3-11-32.2l4.2-8.6c5.8-11.9,20.3-16.9,32.2-11c11.9,5.8,16.9,20.3,11,32.2
l-4.2,8.6C1614.6,696.7,1600.2,701.7,1588.2,695.8z M1608.2,655c-5.8-2.8-12.9-0.4-15.7,5.4l-4.2,8.6c-2.8,5.8-0.4,12.9,5.4,15.7
s12.9,0.4,15.7-5.4l4.2-8.6C1616.5,664.9,1614.1,657.9,1608.2,655z"/>
</g>
</g>
<g>
<g>
<g>
<path class="st0" d="M280.8,775.5l87-42.7l-17.6-36l-87,42.7c-10.1,5-22.4,0.8-27.4-9.4l-28.6-58.3c-5-10.2-0.8-22.5,9.4-27.4
l87-42.7l-17.6-35.9l-87,42.7c-30,14.7-42.4,51-27.7,81l28.6,58.3C214.5,777.8,250.8,790.2,280.8,775.5z"/>
<path class="st1" d="M194.2,750.5l-28.6-58.3c-16.2-33-2.5-73,30.5-89.2l92.5-45.4l23,47L219.2,650c-7.1,3.5-10,12.1-6.6,19.2
l28.6,58.3c3.5,7.1,12.1,10,19.2,6.6l92.5-45.4l23,47L283.5,781C250.5,797.2,210.4,783.5,194.2,750.5z M347.3,705.1l-81.5,40
c-13.2,6.5-29.2,1-35.7-12.2l-28.6-58.3c-6.5-13.2-1-29.2,12.2-35.7l81.5-40l-12.2-24.9l-81.5,40c-26.9,13.2-38.1,45.8-24.9,72.8
l28.6,58.3c13.2,26.9,45.8,38.1,72.8,24.9l81.5-40L347.3,705.1z"/>
</g>
</g>
<g>
<path class="st0" d="M496.4,787l-82.7,40.6c-33.5,16.4-73.9,2.6-90.3-30.9l-97.5-198.9c-11.8-24.1-1.9-53.2,22.2-65l116.7-57.2
c24.1-11.8,53.2-1.9,65,22.2l97.5,198.9C543.7,730.2,529.9,770.6,496.4,787z"/>
<path class="st1" d="M317.6,798.9L196.3,551.4L411.2,446l121.4,247.5c18,36.7,2.8,81.3-34,99.3l-81.6,40
C380.2,850.8,335.7,835.6,317.6,798.9z M212.8,557l115.9,236.4c15,30.6,52.2,43.3,82.8,28.3l81.6-40c30.6-15,43.3-52.2,28.3-82.8
L405.6,462.5L212.8,557z"/>
</g>
<g>
<path class="st2" d="M402.8,470.7L516,701.6c2.6,5.3,4.3,10.9,5.1,16.5c1.6,11.3-4.3,22.3-14.6,27.3L374.6,810
c-10.2,5-22.6,3-30.5-5.2c-3.9-4.1-7.3-8.8-9.9-14.1L221,559.8L402.8,470.7z"/>
</g>
<g>
<path class="st3" d="M257,542.2l113.2,230.9c2.6,5.3,6,10.1,9.9,14.1c7.9,8.2,20.3,10.2,30.5,5.2l-36,17.6
c-10.2,5-22.6,3-30.5-5.2c-3.9-4.1-7.3-8.8-9.9-14.1L221,559.8L257,542.2z"/>
</g>
<path class="st1" d="M463.5,621c3-1.5,6.7-0.2,8.2,2.8l36.6,74.7c1.5,3,0.2,6.7-2.8,8.2c-3,1.5-6.7,0.2-8.2-2.8l-36.6-74.7
C459.2,626.2,460.5,622.5,463.5,621z"/>
<path class="st1" d="M403,483.5l48.1,98.1c1.5,3,0.2,6.7-2.8,8.2c-3,1.5-6.7,0.2-8.2-2.8l-48.1-98.1L403,483.5z"/>
<g>
<path class="st4" d="M375.5,484.1l99.2,202.4c4.9,9.9,0.8,21.9-9.2,26.8s-21.9,0.8-26.8-9.2l-99.2-202.4L375.5,484.1z"/>
</g>
<g>
<path class="st0" d="M199.4,538.7c-4.1-5.6-7.2-12.2-8.5-20.1c-3-18.8,5.8-37.9,22.3-47.5c9.3-5.4,19.5-7.2,29.2-5.9
c2-20.4,14.2-39.2,33.9-48.9c27.4-13.5,60.1-4.4,77,19.9c5.2-7,12.1-12.7,20.7-16.5c24.4-10.8,53.9-0.8,66.7,22.6
c14.3,26.2,3.8,58.7-22.8,71.7c-4.3,2.1-8.7,3.5-13.1,4.4c-9.1,1.7-14.3,11.3-10.2,19.7l19.6,39.9c6.4,13,1,28.8-12,35.2
c-13,6.4-28.8,1-35.2-12l-23.5-47.9c-3.4-7-11.9-9.9-18.8-6.4l-18.3,9c-7,3.4-9.9,11.9-6.4,18.8l9.2,18.8c6.4,13,1,28.8-12,35.2
c-13,6.4-28.8,1-35.2-12l-9.2-18.8c-3.4-7-11.9-9.9-18.8-6.4c-14.3,7-32.1,3-41-10.2C183.3,566.8,186.9,548.5,199.4,538.7z"/>
<path class="st1" d="M185.1,580c0.8,1.5,1.6,3,2.6,4.5c10.4,15.6,31.4,20.9,48.8,12.3c3.9-1.9,8.7-0.3,10.6,3.6l9.2,18.8
c7.9,16.1,27.4,22.7,43.4,14.8c16.1-7.9,22.7-27.4,14.9-43.4l-9.2-18.8c-1.9-3.9-0.3-8.7,3.6-10.6l18.3-9
c3.9-1.9,8.7-0.3,10.6,3.6l23.5,47.9c7.9,16.1,27.4,22.7,43.4,14.8c16.1-7.9,22.7-27.4,14.9-43.4l-19.6-39.9
c-1.4-2.9-0.6-5.3,0-6.6c1.1-2.3,3.3-3.8,5.8-4.3c5.1-1,10-2.6,14.7-4.9c14.4-7.1,25-19.4,29.9-34.6c4.6-14.4,3.4-29.7-3.3-43.2
l0.1,0c-0.2-0.4-0.4-0.7-0.6-1.1s-0.4-0.8-0.6-1.2c-0.3-0.5-0.6-1-0.9-1.5c-0.5-0.8-0.9-1.5-1.4-2.3c-0.5-0.8-1.1-1.6-1.7-2.4
c-0.6-0.8-1.1-1.5-1.7-2.3c-0.5-0.6-1.1-1.3-1.6-1.9c-0.7-0.8-1.5-1.6-2.2-2.4c-0.4-0.4-0.8-0.8-1.2-1.2c-1-0.9-1.9-1.8-3-2.7
c-0.2-0.1-0.3-0.3-0.5-0.4c-12.1-9.9-27.9-14.5-43.5-12.8c-0.4,0-0.9,0.1-1.3,0.1c-1.2,0.2-2.3,0.4-3.5,0.6
c-0.7,0.1-1.5,0.3-2.2,0.5c-1,0.2-1.9,0.5-2.8,0.8c-0.9,0.3-1.8,0.5-2.7,0.9c-0.8,0.3-1.7,0.6-2.5,1c-0.6,0.2-1.2,0.4-1.8,0.7
c-0.4,0.2-0.7,0.4-1.1,0.5c-0.3,0.2-0.7,0.3-1,0.4c-0.5,0.3-1,0.6-1.6,0.9c-0.7,0.4-1.4,0.8-2.1,1.1c-1,0.6-1.9,1.1-2.8,1.8
c-0.6,0.4-1.2,0.8-1.8,1.2c-0.9,0.7-1.8,1.4-2.7,2.1c-0.5,0.4-1.1,0.9-1.6,1.3c-0.9,0.7-1.7,1.5-2.5,2.3c-0.3,0.3-0.6,0.5-0.9,0.9
c-19.7-22.2-52.7-29.1-79.9-15.8c-1.5,0.7-2.9,1.5-4.2,2.3c-0.4,0.2-0.7,0.4-1.1,0.6c-1.1,0.7-2.2,1.4-3.2,2.1
c-0.3,0.2-0.5,0.4-0.8,0.6c-2.7,1.9-5.3,4-7.6,6.3c0,0-0.1,0.1-0.1,0.1c-1.2,1.2-2.4,2.4-3.5,3.6l0,0c-3.3,3.7-6.2,7.8-8.6,12.1
c-0.1,0.2-0.2,0.4-0.3,0.5c-0.7,1.3-1.4,2.6-2,4c-0.1,0.1-0.1,0.3-0.2,0.4c-0.6,1.4-1.2,2.7-1.7,4.1c-0.2,0.7-0.5,1.3-0.7,2
c-0.2,0.7-0.4,1.4-0.7,2c-0.3,0.9-0.5,1.8-0.8,2.7c-0.1,0.4-0.2,0.8-0.3,1.2c-0.2,1-0.5,2.1-0.7,3.2c-9.4-0.1-18.7,2.3-27.1,7.1
c-18.6,10.8-28.7,32.4-25.3,53.8c1.1,6.5,3.2,12.6,6.6,18.2c-0.2,0.2-0.4,0.4-0.6,0.7c-0.2,0.2-0.4,0.4-0.5,0.6
c-8.9,10.3-11.4,24.5-6.7,37.3c0.1,0.3,0.2,0.5,0.3,0.8c0.3,0.8,0.7,1.6,1.1,2.4C185,579.7,185.1,579.9,185.1,580L185.1,580z
M195.9,573.9c-0.2-0.4-0.3-0.8-0.5-1.2c-0.1-0.4-0.3-0.8-0.4-1.1c-0.1-0.4-0.3-0.9-0.4-1.3c-0.1-0.3-0.2-0.7-0.3-1
c-0.1-0.5-0.2-1.1-0.3-1.6c0-0.2-0.1-0.4-0.1-0.7c-0.1-0.7-0.2-1.5-0.2-2.2c0,0,0-0.1,0-0.1c-0.4-6.6,1.9-13.1,6.2-18.1
c0.1-0.2,0.3-0.3,0.5-0.5c0.4-0.4,0.7-0.8,1.1-1.2c0.5-0.5,1.1-1,1.6-1.4c0.1-0.1,0.1-0.1,0.2-0.2l0.3-0.3c1.3-1,2.7-1.9,4.2-2.6
c2.3-1.1,4.8-1.9,7.3-2.3c2.9-0.4,5-2.9,5.1-5.8c0.2-3.8-3.2-7-7-6.4c-3.8,0.6-7.4,1.7-10.9,3.4c-0.4,0.2-0.8,0.4-1.1,0.6
c-2.1-3.9-3.6-8.1-4.3-12.5c-2.6-16.4,5.1-32.9,19.3-41.1c6.1-3.5,12.8-5.4,19.7-5.4c0,2.4,0.1,4.9,0.4,7.4c0.4,3.6,3.9,6,7.4,5.3
c3.1-0.7,5.2-3.6,4.8-6.8c-0.4-3.8-0.4-7.5,0-11.1c0.1-1.1,0.3-2.2,0.4-3.3c0-0.1,0-0.2,0-0.2c0.2-1.1,0.4-2.2,0.6-3.3
c0-0.1,0.1-0.2,0.1-0.3c0.2-1.1,0.5-2.1,0.8-3.1c0-0.1,0-0.1,0.1-0.2c0.4-1.4,0.9-2.8,1.5-4.2c0.3-0.8,0.6-1.6,1-2.4
c0.1-0.3,0.3-0.6,0.5-1c0.4-0.9,0.9-1.8,1.3-2.7c0.1-0.2,0.3-0.5,0.4-0.7c0.5-1,1.1-1.9,1.7-2.8c0.1-0.2,0.2-0.3,0.3-0.5
c0.7-1.1,1.4-2.1,2.2-3.1c0,0,0,0,0-0.1c2.5-3.2,5.3-6.1,8.4-8.8c0.2-0.2,0.4-0.3,0.6-0.5c0.8-0.6,1.6-1.3,2.5-1.9
c0.3-0.2,0.6-0.4,0.9-0.6c0.8-0.6,1.6-1.1,2.5-1.6c0.3-0.2,0.6-0.4,1-0.6c1.1-0.7,2.3-1.3,3.5-1.9c22.9-11.2,50.8-4.9,66.7,14.6
c-2,3.2-3.7,6.6-5.1,10.1c-1.3,3.5,0.6,7.4,4.2,8.3l0,0c3.1,0.8,6.2-1,7.3-3.9c1.5-4,3.6-7.7,6.1-11c0.2-0.3,0.5-0.6,0.7-0.9
c0.5-0.7,1.1-1.3,1.6-2c0.3-0.4,0.6-0.7,1-1.1c0.6-0.7,1.3-1.3,2-2c0.4-0.4,0.8-0.7,1.1-1c0.7-0.6,1.5-1.2,2.2-1.8
c0.4-0.3,0.8-0.6,1.2-0.9c0.8-0.5,1.5-1.1,2.3-1.6c0.3-0.2,0.5-0.4,0.8-0.5c1-0.6,2.1-1.2,3.2-1.8c0.3-0.1,0.6-0.3,0.9-0.4
c0.9-0.4,1.7-0.8,2.6-1.1c0.6-0.3,1.3-0.5,2-0.8c0.7-0.3,1.5-0.5,2.2-0.7c0.7-0.2,1.5-0.4,2.2-0.6c0.6-0.1,1.2-0.3,1.9-0.4
c0.9-0.2,1.7-0.4,2.6-0.5c0.4-0.1,0.8-0.1,1.2-0.1c1.1-0.1,2.2-0.2,3.3-0.3c0,0,0.1,0,0.2,0c11-0.4,22,3.3,30.6,10.2
c0.2,0.2,0.4,0.3,0.6,0.5c0.8,0.6,1.5,1.3,2.2,2c0.4,0.4,0.8,0.7,1.1,1.1c0.6,0.6,1.1,1.2,1.6,1.8c0.5,0.5,0.9,1,1.4,1.6
c0.4,0.5,0.9,1.1,1.3,1.7c0.5,0.6,0.9,1.3,1.4,2c0.4,0.6,0.7,1.2,1.1,1.8c0.4,0.7,0.8,1.4,1.2,2.1c5.6,10.9,6.8,23.3,3,35
c-3.8,12-12.2,21.7-23.5,27.3c-3.7,1.8-7.6,3.1-11.6,3.9c-1.9,0.4-3.7,1-5.3,1.8c-4,2-7.2,5.1-9.2,9.2c-2.8,5.5-2.8,11.9,0,17.5
l19.6,39.9c4.9,10,0.8,22.1-9.2,26.9c-10,4.9-22.1,0.8-26.9-9.2L349,550.6c-4.9-10-17.1-14.2-27.1-9.3l-18.3,9
c-10,4.9-14.2,17.1-9.3,27.1l9.2,18.8c4.9,10,0.8,22.1-9.2,26.9s-22.1,0.8-26.9-9.2l-9.2-18.8c-4.9-10-17.1-14.2-27.1-9.3
c-11.9,5.8-26.1,2.3-33.1-8.1C197.1,576.5,196.5,575.2,195.9,573.9z"/>
</g>
<g>
<path class="st1" d="M246.5,512.6c6-7.3,14.7-11.2,23.9-11c5.2,0.1,10.3,1.6,14.6,4.3c3.5,2.1,4,7,1,9.8l0,0
c-2.1,2-5.1,2.2-7.6,0.7c-7.2-4.3-16.8-3-22.5,4c-4.9,6.1-5.1,15-0.4,21.2c1.8,2.3,4,4.2,6.5,5.4c2.6,1.2,4.1,3.9,3.6,6.7
c-0.7,4.1-5.1,6.3-8.8,4.5c-4.2-2-7.9-4.9-10.9-8.7C237.6,538.8,237.8,523.2,246.5,512.6z"/>
<path class="st1" d="M288.9,446c7.3-2,14.8-0.6,20.7,3.9c2.7,2.1,4.9,4.6,6.4,7.5c2,3.8-0.5,8.4-4.7,8.9c-2.6,0.4-5-1.1-6.3-3.4
c-0.7-1.3-1.7-2.4-2.9-3.3c-3-2.3-7-2.9-10.7-1.5c-4.1,1.5-6.9,5.6-7,10c0,1.6,0.3,3.2,0.9,4.6c1,2.4,0.6,5.2-1.2,7l0,0
c-3,3-8.2,2.1-9.9-1.7c-1-2.3-1.7-4.7-1.9-7.3C271,459.7,278.2,449,288.9,446z"/>
<path class="st1" d="M346.4,469.4c10.6-5.1,23-4.3,33.3,2.4c2.9,1.9,5.5,4.3,7.7,7.1c4.5,6,6.9,12.8,7.1,19.8
c0.1,4-3.5,7.1-7.4,6.3c-2.8-0.6-4.8-3-4.9-5.9c-0.1-3-0.8-5.9-2.1-8.6c-2.5-5.1-6.8-9-12.1-10.9s-11.1-1.6-16.3,0.9
c-0.1,0-0.1,0.1-0.2,0.1c-9,4.4-13.5,14.3-11.4,23.7c0.6,2.8-0.7,5.7-3.3,6.9c-3.5,1.7-7.8-0.3-8.7-4.1
C324.8,492.2,332,476.4,346.4,469.4z"/>
</g>
<g>
<path class="st0" d="M328,690.3L328,690.3c8.9-4.3,12.5-15.1,8.2-24l-4.2-8.6c-4.4-8.9-15.1-12.5-24-8.2l0,0
c-8.9,4.3-12.5,15.1-8.2,24l4.2,8.6C308.4,691,319.2,694.6,328,690.3z"/>
<path class="st1" d="M298.5,684.8l-4.2-8.6c-5.8-11.9-0.9-26.4,11-32.2c11.9-5.8,26.4-0.9,32.2,11l4.2,8.6
c5.8,11.9,0.9,26.4-11,32.2C318.8,701.7,304.4,696.7,298.5,684.8z M305.4,670.7l4.2,8.6c2.9,5.8,9.9,8.2,15.7,5.4
c5.8-2.8,8.2-9.9,5.4-15.7l-4.2-8.6c-2.9-5.8-9.9-8.2-15.7-5.4C304.9,657.9,302.5,664.9,305.4,670.7z"/>
</g>
</g>
<g class="st5">
<path class="st6" d="M622.8,323c0,58.4-52.4,81.6-93.6,69.4l-8.4,13.8c-11.4,0-22.6,0-34.2,0v-4l15.2-24.8
c-13.4-12-22.4-30.2-22.4-54.4c0-59.6,54.2-82.6,96-69l8.2-13.4h34v3.8L602,270C614.6,282.2,622.8,299.8,622.8,323z M586.2,323
c0-50.6-69.8-50.6-69.8,0C516.4,373.4,586.2,373.4,586.2,323z"/>
<path class="st6" d="M766.4,393.4c-12.2,0-24.4,0-36.6,0v-56.2h-43.2v56.2c-12.2,0-24.6,0-36.6,0v-140c12,0,24.4,0,36.6,0v50.8
h43.2v-50.8c12.2,0,24.4,0,36.6,0V393.4z"/>
<path class="st6" d="M838,361.2h50.8c0,12,0,20.2,0,32.2c-28.8,0-58.4,0-86.8,0v-140c12,0,23.8,0,36,0
C838,325.8,838,301.6,838,361.2z"/>
<path class="st6" d="M1030,393.4c-12.2,0-24.4,0-36.6,0v-56.2h-43.2v56.2c-12.2,0-24.6,0-36.6,0v-140c12,0,24.4,0,36.6,0v50.8h43.2
v-50.8c12.2,0,24.4,0,36.6,0V393.4z"/>
<path class="st6" d="M1146.6,375.8h-55.2l-8.2,17.6h-35v-5.2l63-136.6h15.4l63.2,136.6v5.2h-35L1146.6,375.8z M1072.8,228.8
c0-11.4,8.8-18.4,19.8-18.4s20,7,20,18.4c0,11-9,18.2-20,18.2S1072.8,239.8,1072.8,228.8z M1118.8,308.2l-15.6,36.8h31.6
L1118.8,308.2z M1125.8,228.8c0-11.4,8.8-18.4,19.8-18.4c11.2,0,19.8,7,19.8,18.4c0,11-8.6,18.2-19.8,18.2
C1134.6,247,1125.8,239.8,1125.8,228.8z"/>
<path class="st6" d="M1244.6,348v45.4c-12,0-24.2,0-36.4,0v-140c28.6,0,58.6,0,87.2,0c0,11.8,0,20,0,32h-50.8V316h45
c0,12,0,19.6,0,32H1244.6z"/>
<path class="st6" d="M1375.2,332.8h1l32-79.4h34.4v5.4L1383.2,395H1368l-60-136.2v-5.4h34.4L1375.2,332.8z"/>
</g>
<g class="st5">
<path class="st7" d="M622.8,323c0,58.4-52.4,81.6-93.6,69.4l-8.4,13.8c-11.4,0-22.6,0-34.2,0v-4l15.2-24.8
c-13.4-12-22.4-30.2-22.4-54.4c0-59.6,54.2-82.6,96-69l8.2-13.4h34v3.8L602,270C614.6,282.2,622.8,299.8,622.8,323z M586.2,323
c0-50.6-69.8-50.6-69.8,0C516.4,373.4,586.2,373.4,586.2,323z"/>
<path class="st7" d="M766.4,393.4c-12.2,0-24.4,0-36.6,0v-56.2h-43.2v56.2c-12.2,0-24.6,0-36.6,0v-140c12,0,24.4,0,36.6,0v50.8
h43.2v-50.8c12.2,0,24.4,0,36.6,0V393.4z"/>
<path class="st7" d="M838,361.2h50.8c0,12,0,20.2,0,32.2c-28.8,0-58.4,0-86.8,0v-140c12,0,23.8,0,36,0
C838,325.8,838,301.6,838,361.2z"/>
<path class="st7" d="M1030,393.4c-12.2,0-24.4,0-36.6,0v-56.2h-43.2v56.2c-12.2,0-24.6,0-36.6,0v-140c12,0,24.4,0,36.6,0v50.8h43.2
v-50.8c12.2,0,24.4,0,36.6,0V393.4z"/>
<path class="st7" d="M1146.6,375.8h-55.2l-8.2,17.6h-35v-5.2l63-136.6h15.4l63.2,136.6v5.2h-35L1146.6,375.8z M1072.8,228.8
c0-11.4,8.8-18.4,19.8-18.4s20,7,20,18.4c0,11-9,18.2-20,18.2S1072.8,239.8,1072.8,228.8z M1118.8,308.2l-15.6,36.8h31.6
L1118.8,308.2z M1125.8,228.8c0-11.4,8.8-18.4,19.8-18.4c11.2,0,19.8,7,19.8,18.4c0,11-8.6,18.2-19.8,18.2
C1134.6,247,1125.8,239.8,1125.8,228.8z"/>
<path class="st7" d="M1244.6,348v45.4c-12,0-24.2,0-36.4,0v-140c28.6,0,58.6,0,87.2,0c0,11.8,0,20,0,32h-50.8V316h45
c0,12,0,19.6,0,32H1244.6z"/>
<path class="st7" d="M1375.2,332.8h1l32-79.4h34.4v5.4L1383.2,395H1368l-60-136.2v-5.4h34.4L1375.2,332.8z"/>
</g>
<g class="st5">
<path class="st8" d="M718.6,711.2c-33,0-54-23-54-51.5c0-28.5,21.1-51.5,54.1-51.4c33,0.1,54.2,23,54.2,51.5
C772.9,688.3,751.7,711.2,718.6,711.2L718.6,711.2z M759.2,659.7c0-21.4-15.9-38.4-40.5-38.4c-24.5,0-40.7,17-40.7,38.3
c0,21.4,16.1,38.4,40.7,38.4C743.3,698,759.2,681.1,759.2,659.7z M690.4,659.6c0-14.2,9.7-24.4,23.2-24.4c6.5,0,12.6,2.7,16.7,7.8
l-0.1-7.2h13.3v47.4h-13.3l0.1-7.2c-4.1,5.1-10.1,7.9-16.7,7.9C700.1,683.9,690.4,673.8,690.4,659.6z M730,659.3
c0-6.9-5.4-12-12.6-12c-7.4,0-12.6,4.9-12.6,12c0,7.2,5.2,12.3,12.6,12.3C724.7,671.6,730,666.5,730,659.3z"/>
<path class="st8" d="M830.6,640.5c-5.5-5.7-10.3-7.9-15.7-8c-6.5,0-10.8,3.4-10.8,8.6c0,4.8,3.1,7.8,9.9,9.7l8.3,2.3
c14,3.7,21.6,11.9,21.6,24.3c0,14.6-12.7,24.9-29.3,24.9c-12.7,0-23.4-5.3-31.1-14.5l13.3-9.7c4.9,5.4,11.5,8.7,18,8.6
c6.6,0,10.7-3.6,11-8.8c0.2-5.1-3-7.8-10.5-10l-7.3-2.1c-14.3-4.2-22-12.3-22-24.8c0-13.9,11.9-24.3,27.8-24.4
c12.4,0,21.9,4.9,29.9,15.1L830.6,640.5L830.6,640.5z"/>
<path class="st8" d="M942.1,664.7c0-10.7-3.7-15-11.5-15c-7.6,0-12.7,5.1-12.7,13.3v38.2h-17.7v-38.1c0-8.8-3.8-13.4-11.4-13.4
c-7.7,0-12.6,5-12.6,14.1v37.4h-17.6v-65.6h17.6l-0.1,7.9c3.7-5.9,9.3-9,17.4-9c8.7,0,15.2,4.2,18.3,11.4
c4.1-6.8,11.9-11.4,22.2-11.4c15.9,0,25.6,11,25.6,30.1v36.7h-17.6V664.7z"/>
<path class="st8" d="M1011.2,702c-22.9,0-37-15.3-37-33.7c0-18.2,14.2-33.8,37.1-33.8c22.8,0,36.9,15.6,36.9,33.8
C1048.1,686.8,1034,702,1011.2,702z M997.6,628.7c-5.2,0-9.5-4.3-9.5-9.4c0-5.2,4.3-9.2,9.5-9.2c5.3,0,9.6,4.1,9.6,9.2
C1007.3,624.5,1002.9,628.7,997.6,628.7z M1011.3,649.5c-11.8,0-19.1,8.5-19.1,18.6c0,10.4,7.3,18.8,19,18.8
c11.9,0,19.1-8.4,19.1-18.8C1030.3,658.5,1023.2,649.5,1011.3,649.5z M1025,628.7c-5.3,0-9.6-4.3-9.6-9.4c0-5.2,4.3-9.2,9.6-9.2
c5.3,0,9.4,4.1,9.4,9.2C1034.4,624.5,1030.2,628.7,1025,628.7z"/>
<path class="st8" d="M1081.2,673.2l-0.1,27.9h-17.6v-88.7h17.8l-0.1,49.7l31.7-28.3l13.9,10.7l-25,20.5c-1,0.8-2,1.6-3.2,2.3
c1.2,0.6,2.3,1.4,3.1,2.2l25.9,22.6l-14.3,10.8L1081.2,673.2z"/>
<path class="st8" d="M1156.2,673.2l-0.1,27.9h-17.6v-88.7h17.8l-0.1,49.7l31.7-28.3l13.9,10.7l-25,20.5c-1,0.8-2,1.6-3.2,2.3
c1.2,0.6,2.3,1.4,3.1,2.2l25.9,22.6l-14.3,10.8L1156.2,673.2z"/>
<path class="st8" d="M1211.4,615.1c0-5.6,4.9-9.4,11-9.4c6,0,10.9,3.8,10.9,9.4c0,5.6-4.9,9.3-10.9,9.3
C1216.3,624.4,1211.4,620.7,1211.4,615.1z M1213.8,635.6h17.6v65.5h-17.6V635.6z"/>
</g>
<g class="st5">
<path class="st9" d="M718.6,711.2c-33,0-54-23-54-51.5c0-28.5,21.1-51.5,54.1-51.4c33,0.1,54.2,23,54.2,51.5
C772.9,688.3,751.7,711.2,718.6,711.2L718.6,711.2z M759.2,659.7c0-21.4-15.9-38.4-40.5-38.4c-24.5,0-40.7,17-40.7,38.3
c0,21.4,16.1,38.4,40.7,38.4C743.3,698,759.2,681.1,759.2,659.7z M690.4,659.6c0-14.2,9.7-24.4,23.2-24.4c6.5,0,12.6,2.7,16.7,7.8
l-0.1-7.2h13.3v47.4h-13.3l0.1-7.2c-4.1,5.1-10.1,7.9-16.7,7.9C700.1,683.9,690.4,673.8,690.4,659.6z M730,659.3
c0-6.9-5.4-12-12.6-12c-7.4,0-12.6,4.9-12.6,12c0,7.2,5.2,12.3,12.6,12.3C724.7,671.6,730,666.5,730,659.3z"/>
<path class="st9" d="M830.6,640.5c-5.5-5.7-10.3-7.9-15.7-8c-6.5,0-10.8,3.4-10.8,8.6c0,4.8,3.1,7.8,9.9,9.7l8.3,2.3
c14,3.7,21.6,11.9,21.6,24.3c0,14.6-12.7,24.9-29.3,24.9c-12.7,0-23.4-5.3-31.1-14.5l13.3-9.7c4.9,5.4,11.5,8.7,18,8.6
c6.6,0,10.7-3.6,11-8.8c0.2-5.1-3-7.8-10.5-10l-7.3-2.1c-14.3-4.2-22-12.3-22-24.8c0-13.9,11.9-24.3,27.8-24.4
c12.4,0,21.9,4.9,29.9,15.1L830.6,640.5L830.6,640.5z"/>
<path class="st9" d="M942.1,664.7c0-10.7-3.7-15-11.5-15c-7.6,0-12.7,5.1-12.7,13.3v38.2h-17.7v-38.1c0-8.8-3.8-13.4-11.4-13.4
c-7.7,0-12.6,5-12.6,14.1v37.4h-17.6v-65.6h17.6l-0.1,7.9c3.7-5.9,9.3-9,17.4-9c8.7,0,15.2,4.2,18.3,11.4
c4.1-6.8,11.9-11.4,22.2-11.4c15.9,0,25.6,11,25.6,30.1v36.7h-17.6V664.7z"/>
<path class="st9" d="M1011.2,702c-22.9,0-37-15.3-37-33.7c0-18.2,14.2-33.8,37.1-33.8c22.8,0,36.9,15.6,36.9,33.8
C1048.1,686.8,1034,702,1011.2,702z M997.6,628.7c-5.2,0-9.5-4.3-9.5-9.4c0-5.2,4.3-9.2,9.5-9.2c5.3,0,9.6,4.1,9.6,9.2
C1007.3,624.5,1002.9,628.7,997.6,628.7z M1011.3,649.5c-11.8,0-19.1,8.5-19.1,18.6c0,10.4,7.3,18.8,19,18.8
c11.9,0,19.1-8.4,19.1-18.8C1030.3,658.5,1023.2,649.5,1011.3,649.5z M1025,628.7c-5.3,0-9.6-4.3-9.6-9.4c0-5.2,4.3-9.2,9.6-9.2
c5.3,0,9.4,4.1,9.4,9.2C1034.4,624.5,1030.2,628.7,1025,628.7z"/>
<path class="st9" d="M1081.2,673.2l-0.1,27.9h-17.6v-88.7h17.8l-0.1,49.7l31.7-28.3l13.9,10.7l-25,20.5c-1,0.8-2,1.6-3.2,2.3
c1.2,0.6,2.3,1.4,3.1,2.2l25.9,22.6l-14.3,10.8L1081.2,673.2z"/>
<path class="st9" d="M1156.2,673.2l-0.1,27.9h-17.6v-88.7h17.8l-0.1,49.7l31.7-28.3l13.9,10.7l-25,20.5c-1,0.8-2,1.6-3.2,2.3
c1.2,0.6,2.3,1.4,3.1,2.2l25.9,22.6l-14.3,10.8L1156.2,673.2z"/>
<path class="st9" d="M1211.4,615.1c0-5.6,4.9-9.4,11-9.4c6,0,10.9,3.8,10.9,9.4c0,5.6-4.9,9.3-10.9,9.3
C1216.3,624.4,1211.4,620.7,1211.4,615.1z M1213.8,635.6h17.6v65.5h-17.6V635.6z"/>
</g>
<g class="st5">
<path class="st0" d="M635.2,480.9v-21.7h40.3v83.1h15.9v21.9h-57.6v-21.9h15.6v-61.3H635.2z"/>
<path class="st0" d="M772.2,564.1c-8.2,0-16.6,0-24.9,0v-19.9h-45.7v-11.7l41.8-73.3h28.8v63.1h9c0,7.3,0,14.8,0,21.9h-9V564.1z
M731.5,522.3h16.8v-15.7l2-16H750L731.5,522.3z"/>
<path class="st0" d="M790.8,551.4c0-8.4,6.6-14,15-14c8.1,0,14.7,5.5,14.7,14c0,8.2-6.6,13.6-14.7,13.6
C797.4,565,790.8,559.6,790.8,551.4z"/>
<path class="st0" d="M866.7,481.5c-6,0-10.3,2.8-10.3,10.2c-8.8,0-14.1,0-22.8,0c-0.3-22.6,15-33.7,33.6-34.2
c30.1-0.8,43.3,29.1,27.7,53.2l-21.1,29.4h31.2c0,9.1,0,14.8,0,24h-73.8v-4l39.4-57.7C875.8,495.3,879.9,481.5,866.7,481.5z"/>
<path class="st0" d="M915.6,551.4c0-8.4,6.6-14,15-14c8.1,0,14.7,5.5,14.7,14c0,8.2-6.6,13.6-14.7,13.6
C922.2,565,915.6,559.6,915.6,551.4z"/>
<path class="st0" d="M991.5,481.5c-6,0-10.3,2.8-10.3,10.2c-8.8,0-14.1,0-22.8,0c-0.3-22.6,15-33.7,33.6-34.2
c30.1-0.8,43.3,29.1,27.7,53.2l-21.1,29.4h31.2c0,9.1,0,14.8,0,24h-73.8v-4l39.4-57.7C1000.6,495.3,1004.7,481.5,991.5,481.5z"/>
<path class="st0" d="M1124.5,493.3c0,11.7,0,25,0,36.7c0,22.9-17.7,36.1-39.4,36.1c-21.3,0-39.1-13.2-39.1-36.1c0-11.7,0-25,0-36.7
c0-22.9,17.8-36.1,39.1-36.1C1106.8,457.2,1124.5,470.4,1124.5,493.3z M1099.1,529.5c0-11.2,0-24.3,0-35.7
c0-8.2-6.1-12.6-14.1-12.6c-7.7,0-13.6,4.3-13.6,12.6c0,11.4,0,24.4,0,35.7c0,8.5,6,12.9,13.6,12.9
C1093,542.4,1099.1,538,1099.1,529.5z"/>
<path class="st0" d="M1141,480.9v-21.7h40.3v83.1h15.9v21.9h-57.6v-21.9h15.6v-61.3H1141z"/>
<path class="st0" d="M1216.6,565.2l22.3-37.9c-22.2,1.6-36.6-13.6-36.6-33.6c0-24.7,16.8-36,39.9-36c22.9,0,40.3,11.2,40.3,36
c0,7.2-1.3,14.5-5.5,20.7l-30.6,50.8H1216.6z M1229,493.6c0,7.6,5.2,13.2,13.2,13.2c8.7,0,13.2-5.1,13.2-13.2c0-7.3-5-13-13.2-13
C1234.3,480.6,1229,486.3,1229,493.6z"/>
</g>
<g class="st5">
<path class="st10" d="M635.2,480.9v-21.7h40.3v83.1h15.9v21.9h-57.6v-21.9h15.6v-61.3H635.2z"/>
<path class="st10" d="M772.2,564.1c-8.2,0-16.6,0-24.9,0v-19.9h-45.7v-11.7l41.8-73.3h28.8v63.1h9c0,7.3,0,14.8,0,21.9h-9V564.1z
M731.5,522.3h16.8v-15.7l2-16H750L731.5,522.3z"/>
<path class="st10" d="M790.8,551.4c0-8.4,6.6-14,15-14c8.1,0,14.7,5.5,14.7,14c0,8.2-6.6,13.6-14.7,13.6
C797.4,565,790.8,559.6,790.8,551.4z"/>
<path class="st10" d="M866.7,481.5c-6,0-10.3,2.8-10.3,10.2c-8.8,0-14.1,0-22.8,0c-0.3-22.6,15-33.7,33.6-34.2
c30.1-0.8,43.3,29.1,27.7,53.2l-21.1,29.4h31.2c0,9.1,0,14.8,0,24h-73.8v-4l39.4-57.7C875.8,495.3,879.9,481.5,866.7,481.5z"/>
<path class="st10" d="M915.6,551.4c0-8.4,6.6-14,15-14c8.1,0,14.7,5.5,14.7,14c0,8.2-6.6,13.6-14.7,13.6
C922.2,565,915.6,559.6,915.6,551.4z"/>
<path class="st10" d="M991.5,481.5c-6,0-10.3,2.8-10.3,10.2c-8.8,0-14.1,0-22.8,0c-0.3-22.6,15-33.7,33.6-34.2
c30.1-0.8,43.3,29.1,27.7,53.2l-21.1,29.4h31.2c0,9.1,0,14.8,0,24h-73.8v-4l39.4-57.7C1000.6,495.3,1004.7,481.5,991.5,481.5z"/>
<path class="st10" d="M1124.5,493.3c0,11.7,0,25,0,36.7c0,22.9-17.7,36.1-39.4,36.1c-21.3,0-39.1-13.2-39.1-36.1
c0-11.7,0-25,0-36.7c0-22.9,17.8-36.1,39.1-36.1C1106.8,457.2,1124.5,470.4,1124.5,493.3z M1099.1,529.5c0-11.2,0-24.3,0-35.7
c0-8.2-6.1-12.6-14.1-12.6c-7.7,0-13.6,4.3-13.6,12.6c0,11.4,0,24.4,0,35.7c0,8.5,6,12.9,13.6,12.9
C1093,542.4,1099.1,538,1099.1,529.5z"/>
<path class="st10" d="M1141,480.9v-21.7h40.3v83.1h15.9v21.9h-57.6v-21.9h15.6v-61.3H1141z"/>
<path class="st10" d="M1216.6,565.2l22.3-37.9c-22.2,1.6-36.6-13.6-36.6-33.6c0-24.7,16.8-36,39.9-36c22.9,0,40.3,11.2,40.3,36
c0,7.2-1.3,14.5-5.5,20.7l-30.6,50.8H1216.6z M1229,493.6c0,7.6,5.2,13.2,13.2,13.2c8.7,0,13.2-5.1,13.2-13.2c0-7.3-5-13-13.2-13
C1234.3,480.6,1229,486.3,1229,493.6z"/>
</g>
<g>
<g class="st5">
<path class="st8" d="M767,107.7h-19.7c0-17.6,10.8-26.3,26.2-26.3c15.4,0,26.2,9.6,26.2,23.4c0,7.5-2.9,14.1-10.1,23l-9.2,11.4
h19.9v18.4h-56l29.8-39.7c4.3-5.7,6-8.5,6-11.5c0-4.1-2.4-6.4-6.6-6.4C769.4,99.8,767,102.4,767,107.7z"/>
<path class="st8" d="M835.6,158.8c-11.2,0-21.4-6.3-27-16.3l14.8-10c3.7,5.3,7.6,8,11.7,8c5,0,7.9-2.8,7.9-7.7c0-5.4-3.9-8-11.9-8
h-17.3V82.6h44.7v18.1h-25.2v7.5h2.8c17,0,27.3,9.2,27.3,24.5C863.3,148.4,852.3,158.8,835.6,158.8z"/>
<path class="st8" d="M902,127.9c0-17.8,11.8-30.4,28.4-30.4c7.6,0,14.7,3.2,19.7,8.7l-0.2-7.8h19.3v59.2h-19.3l0.2-7.8
c-4.9,5.5-12.1,8.7-19.7,8.7C913.9,158.3,902,145.7,902,127.9z M921.5,78.5c0-7.4,6-13.7,15-13.7c9.2,0,14.5,6.3,14.5,13.7
c0,7.6-5.3,13.6-14.5,13.6C927.4,92.1,921.5,86.1,921.5,78.5z M951,127.4c0-7.8-6.2-13.6-14.5-13.6c-8.5,0-14.5,5.5-14.5,13.6
c0,8.4,6,14.3,14.5,14.3C944.9,141.7,951,135.7,951,127.4z M940.8,78.6c0-2.6-1.6-4.6-4.4-4.6s-4.6,2-4.6,4.6
c0,2.3,1.8,4.2,4.6,4.2S940.8,81,940.8,78.6z"/>
<path class="st8" d="M1005.8,131.4v26.1h-19.3v-59h19.3l-0.5,8c3.4-6.2,10-10.1,20.2-8.8v17.6
C1010.8,113.8,1005.8,121.4,1005.8,131.4z"/>
<path class="st8" d="M1063.7,79c0-6,5.3-10.1,11.8-10.1c6.4,0,11.7,4.1,11.7,10.1c0,6-5.3,9.9-11.7,9.9
C1069,88.9,1063.7,84.9,1063.7,79z M1066.1,98.5h19.3v59h-19.3V98.5z"/>
<path class="st8" d="M1152.9,157.5h-20V82.6h45.9v18.1h-25.9v10.4h24.8v17.6h-24.8V157.5z"/>
<path class="st8" d="M1191.7,79c0-6,5.3-10.1,11.8-10.1c6.4,0,11.7,4.1,11.7,10.1c0,6-5.3,9.9-11.7,9.9
C1197,88.9,1191.7,84.9,1191.7,79z M1194.1,98.5h19.3v59h-19.3V98.5z"/>
<path class="st8" d="M1272.3,128.2c0-9.6-2.9-14-10.4-14c-8.4,0-12.3,4.6-12.3,13.2v30.1h-19.3V98.4h19.3v6.4c3.7-4.3,10-7,17-7
c17.3,0,25.6,10.1,25.6,29.8v29.8h-19.9L1272.3,128.2z"/>
<path class="st8" d="M1308.8,77.7h19l0.4,79.8h-19.3V77.7z"/>
<path class="st8" d="M1341.8,127.9c0-17.8,11.8-30.4,28.4-30.4c7.6,0,14.7,3.2,19.7,8.7l-0.2-7.8h19.3v59.2h-19.3l0.2-7.8
c-4.9,5.5-12.1,8.7-19.7,8.7C1353.7,158.3,1341.8,145.7,1341.8,127.9z M1390.7,127.4c0-7.8-6.2-13.6-14.5-13.6
c-8.5,0-14.5,5.5-14.5,13.6c0,8.4,6,14.3,14.5,14.3C1384.7,141.7,1390.7,135.7,1390.7,127.4z"/>
<path class="st8" d="M1468.3,128.2c0-9.6-2.9-14-10.4-14c-8.4,0-12.3,4.6-12.3,13.2v30.1h-19.3V98.4h19.3v6.4c3.7-4.3,10-7,17-7
c17.3,0,25.6,10.1,25.6,29.8v29.8h-19.9L1468.3,128.2z"/>
<path class="st8" d="M1501.2,128c0-17.8,11.8-30.4,28.4-30.4c7.8,0,14.9,3,19.4,8.4V77.7h19.3v79.9H1549l0.2-7.8
c-4.9,5.5-12.1,8.7-19.7,8.7C1513,158.4,1501.2,145.8,1501.2,128z M1550.1,127.5c0-7.8-6.2-13.6-14.5-13.6
c-8.5,0-14.5,5.5-14.5,13.6c0,8.4,6,14.3,14.5,14.3C1544,141.8,1550.1,135.8,1550.1,127.5z"/>
</g>
<g class="st5">
<path class="st11" d="M767,107.7h-19.7c0-17.6,10.8-26.3,26.2-26.3c15.4,0,26.2,9.6,26.2,23.4c0,7.5-2.9,14.1-10.1,23l-9.2,11.4
h19.9v18.4h-56l29.8-39.7c4.3-5.7,6-8.5,6-11.5c0-4.1-2.4-6.4-6.6-6.4C769.4,99.8,767,102.4,767,107.7z"/>
<path class="st11" d="M835.6,158.8c-11.2,0-21.4-6.3-27-16.3l14.8-10c3.7,5.3,7.6,8,11.7,8c5,0,7.9-2.8,7.9-7.7
c0-5.4-3.9-8-11.9-8h-17.3V82.6h44.7v18.1h-25.2v7.5h2.8c17,0,27.3,9.2,27.3,24.5C863.3,148.4,852.3,158.8,835.6,158.8z"/>
<path class="st11" d="M902,127.9c0-17.8,11.8-30.4,28.4-30.4c7.6,0,14.7,3.2,19.7,8.7l-0.2-7.8h19.3v59.2h-19.3l0.2-7.8
c-4.9,5.5-12.1,8.7-19.7,8.7C913.9,158.3,902,145.7,902,127.9z M921.5,78.5c0-7.4,6-13.7,15-13.7c9.2,0,14.5,6.3,14.5,13.7
c0,7.6-5.3,13.6-14.5,13.6C927.4,92.1,921.5,86.1,921.5,78.5z M951,127.4c0-7.8-6.2-13.6-14.5-13.6c-8.5,0-14.5,5.5-14.5,13.6
c0,8.4,6,14.3,14.5,14.3C944.9,141.7,951,135.7,951,127.4z M940.8,78.6c0-2.6-1.6-4.6-4.4-4.6s-4.6,2-4.6,4.6
c0,2.3,1.8,4.2,4.6,4.2S940.8,81,940.8,78.6z"/>
<path class="st11" d="M1005.8,131.4v26.1h-19.3v-59h19.3l-0.5,8c3.4-6.2,10-10.1,20.2-8.8v17.6
C1010.8,113.8,1005.8,121.4,1005.8,131.4z"/>
<path class="st11" d="M1063.7,79c0-6,5.3-10.1,11.8-10.1c6.4,0,11.7,4.1,11.7,10.1c0,6-5.3,9.9-11.7,9.9
C1069,88.9,1063.7,84.9,1063.7,79z M1066.1,98.5h19.3v59h-19.3V98.5z"/>
<path class="st11" d="M1152.9,157.5h-20V82.6h45.9v18.1h-25.9v10.4h24.8v17.6h-24.8V157.5z"/>
<path class="st11" d="M1191.7,79c0-6,5.3-10.1,11.8-10.1c6.4,0,11.7,4.1,11.7,10.1c0,6-5.3,9.9-11.7,9.9
C1197,88.9,1191.7,84.9,1191.7,79z M1194.1,98.5h19.3v59h-19.3V98.5z"/>
<path class="st11" d="M1272.3,128.2c0-9.6-2.9-14-10.4-14c-8.4,0-12.3,4.6-12.3,13.2v30.1h-19.3V98.4h19.3v6.4c3.7-4.3,10-7,17-7
c17.3,0,25.6,10.1,25.6,29.8v29.8h-19.9L1272.3,128.2z"/>
<path class="st11" d="M1308.8,77.7h19l0.4,79.8h-19.3V77.7z"/>
<path class="st11" d="M1341.8,127.9c0-17.8,11.8-30.4,28.4-30.4c7.6,0,14.7,3.2,19.7,8.7l-0.2-7.8h19.3v59.2h-19.3l0.2-7.8
c-4.9,5.5-12.1,8.7-19.7,8.7C1353.7,158.3,1341.8,145.7,1341.8,127.9z M1390.7,127.4c0-7.8-6.2-13.6-14.5-13.6
c-8.5,0-14.5,5.5-14.5,13.6c0,8.4,6,14.3,14.5,14.3C1384.7,141.7,1390.7,135.7,1390.7,127.4z"/>
<path class="st11" d="M1468.3,128.2c0-9.6-2.9-14-10.4-14c-8.4,0-12.3,4.6-12.3,13.2v30.1h-19.3V98.4h19.3v6.4c3.7-4.3,10-7,17-7
c17.3,0,25.6,10.1,25.6,29.8v29.8h-19.9L1468.3,128.2z"/>
<path class="st11" d="M1501.2,128c0-17.8,11.8-30.4,28.4-30.4c7.8,0,14.9,3,19.4,8.4V77.7h19.3v79.9H1549l0.2-7.8
c-4.9,5.5-12.1,8.7-19.7,8.7C1513,158.4,1501.2,145.8,1501.2,128z M1550.1,127.5c0-7.8-6.2-13.6-14.5-13.6
c-8.5,0-14.5,5.5-14.5,13.6c0,8.4,6,14.3,14.5,14.3C1544,141.8,1550.1,135.8,1550.1,127.5z"/>
</g>
<g id="_x30_vn8iT_1_">
<g>
<path class="st12" d="M413.1,150.5c0.9-3,1.9-5.7,2.6-8.5c6.6-24.4,13.9-48.5,20.2-72.9c0.7-2.7,1.4-5.4,2.1-8.1
c0.1-0.5,0.4-0.8,0.8-1c2-1.1,4.1-0.8,6.2-0.4c6.8,1.2,13.4,2.8,19.8,5.3c1.1,0.4,2.3,0.9,3.2,1.7c1.1,0.9,1.7,2,1.5,3.5
c-1,5.9-1.6,11.9-2,17.9c0,0.2,0,0.3,0,0.4c0.3,0.1,0.4-0.1,0.6-0.2c9.7-7.7,19.3-15.3,29-23c0.5-0.4,0.8-0.4,1.4-0.3
c1.9,0.6,3.3,1.8,4.5,3.2c3.8,4.7,6.5,9.9,9,15.3c1.2,2.7,2.4,5.4,2.8,8.3c0.1,0.7-0.1,1.1-0.6,1.5
c-10.4,9.2-20.8,18.3-30.3,28.5c-0.7,0.7-0.7,1.2-0.2,2c3.6,6.1,7.4,12.1,11.3,18c0.1,0.1,0.2,0.2,0.3,0.4
c0.4-0.1,0.4-0.5,0.6-0.7c15.2-27.4,30.4-54.7,45.6-82.1c0.4-0.7,0.8-1,1.7-1c5.1,0.2,10.2,0.9,15.3,1.7c6.6,1,13.2,2.2,19.7,3.7
c1.2,0.3,1.7,0.8,2.1,1.9c5.5,17.1,10.1,34.4,14.4,51.8c0.6,2.6,1.3,5.1,1.9,7.6c0,0.2,0.1,0.4,0.3,0.8c1-3.8,1.9-7.4,2.9-11
c3.4-12.4,6.3-24.9,8.6-37.5c1.8-9.8,3.5-19.5,5.1-29.3c0.1-0.5,0.3-0.7,0.7-1c2.7-1.4,5.4-1,8.2-0.3c7.4,1.9,14.2,5,20.7,9.1
c3.3,2.1,3.2,2.2,3,6.1c-0.3,5.5-0.5,11-0.7,16.5c0.5-0.2,0.8-0.5,1.1-0.8c4.8-4.5,9.3-9.3,13.8-14.1c4.2-4.6,8.5-9.1,13-13.4
c0.9-0.8,1.9-1.5,2.8-2.3c0.4-0.3,0.7-0.3,1.1,0c3,2,5.2,4.7,7.3,7.5c4,5.3,7.2,11.1,8.8,17.7c0.4,1.5,0.6,2.9,0.8,4.4
c0.1,0.5-0.1,0.7-0.4,0.9c-10,9-19.1,18.8-27.6,29.2c-0.9,1-1.6,2.2-2.5,3.2c-0.4,0.5-0.4,0.9-0.1,1.4c2.1,4.3,4.6,8.4,7.2,12.4
c6,9.4,12,18.7,18.5,27.8c0.3,0.4,0.3,0.8,0.1,1.2c-1.4,2.6-3.3,4.8-5.3,6.9c-4.5,4.7-9.5,8.9-14.8,12.7
c-1.9,1.3-3.9,2.5-6.1,3.3c-0.7,0.2-1,0.2-1.4-0.4c-4.8-6.6-9.6-13.2-14.6-19.7c-3.5-4.6-7.1-9.1-11-13.3
c-0.2-0.2-0.4-0.5-0.6-0.8c-1.2,2.5-2.1,4.9-2.9,7.2c-3,8.9-5.6,17.9-7.4,27.2c-0.1,0.6-0.2,0.8-0.9,0.6
c-7.2-2.5-14.2-5.2-20.8-8.8c-0.6-0.3-0.9-0.1-1.3,0.2c-6.5,4.2-13.2,8.2-20.3,11.5c-3.3,1.6-6.7,2.9-10.3,3.6
c-0.6,0.1-0.9,0-1.1-0.6c-2.9-7.5-6.4-14.8-10.2-21.9c-0.3-0.6-0.6-0.9-1.3-0.9c-5.6,0-11.2-0.4-16.8-0.2c-1.8,0-3.5,0.2-5.2,0.2
c-0.7,0-1,0.3-1.4,0.9c-3.9,6.5-7.8,12.9-11.7,19.4c-0.4,0.7-0.8,0.8-1.5,0.6c-6.9-1.4-13.8-2.8-20.7-4.2
c-0.6-0.1-0.9,0.1-1.2,0.4c-4.4,4.1-8.9,8-13.8,11.4c-2.3,1.6-4.7,3-7.1,4.3c-0.6,0.3-0.8,0.1-1-0.4c-6.9-12-14.9-23.2-23.3-34.1
c-0.1-0.2-0.3-0.4-0.5-0.6c-1.5,3.4-2.8,6.7-4.1,10.1c-2.6,6.9-5.1,13.9-6.7,21.2c-0.1,0.5-0.2,0.7-0.8,0.5
c-8.2-3.1-16.5-5.8-24.6-9c-0.7-0.3-0.8,0-0.8,0.5c-0.1,1.3-0.6,2.5-1.2,3.6c-0.4,0.7-0.9,1-1.7,1.1c-9.1,0.9-18.2,1.9-27.4,2.8
c-8.3,0.8-16.6,1.7-24.8,2.5c-1.5,0.1-3,0.3-4.5,0.5c-0.6,0.1-0.8-0.1-1-0.6c-1.7-4.7-2.5-9.5-3.4-14.4
c-1.4-7.9-2.4-15.9-3.3-23.9c-1-8.3-1.8-16.6-2.5-24.8c-0.9-9.5-1.6-19-2-28.6c-0.2-6.7-0.5-13.3,0.3-20c0.2-1.6,0.5-3.2,1.2-4.7
c0.2-0.4,0.5-0.7,1-0.8c10.8-2.8,21.7-5.4,32.8-7c9.1-1.3,18.2-2.1,27.4-2.7c0.8-0.1,1.1,0.1,1.3,0.9c1.5,4.9,1.3,9.9,1.2,14.9
c-0.2,4.9-0.5,9.9-1.2,14.8c-0.2,1.2-0.6,2.3-1,3.4c-0.2,0.5-0.5,0.5-1,0.6c-5.9,0.8-11.8,1.6-17.7,2.4c-0.6,0.1-0.9,0.2-0.8,0.9
c0.1,0.9-0.3,2.2,0.3,2.8c0.5,0.5,1.8,0.2,2.7,0.2c3.7,0.1,7.4,0.2,11.1,0.3c2,0.1,3.2,0.9,4,2.8c0.7,1.9,0.9,3.8,1,5.8
c0.5,6.7,0.6,13.4,0.2,20.2c-0.1,1.1-0.2,2.3-0.6,3.4c-0.5,1.4-1.4,2.3-2.8,2.6c-5,1.1-9.9,2.3-14.9,3.5c-0.6,0.1-0.8,0.4-0.7,1
c0.1,1.1,0.2,2.3,0.3,3.5c0,0.4,0.1,0.6,0.7,0.6c6.9-0.7,13.8-1.4,20.6-2.1c0.6-0.1,1,0,1.2,0.7
C412.3,148.6,412.7,149.4,413.1,150.5z"/>
<path class="st13" d="M507,171.1c1.3-1.3,2.5-2.6,3.8-3.9c0.5-0.4,0.5-0.8,0.1-1.3c-3.6-5.3-7.1-10.7-10.6-16
c-0.4-0.6-0.4-1-0.1-1.6c7.1-12.8,14.2-25.5,21.3-38.3c5.5-9.9,11-19.8,16.5-29.7c2.6-4.6,5.1-9.2,7.7-13.9
c0.3-0.5,0.6-0.7,1.2-0.6c3.3,0.3,6.7,0.8,10,1.3c5.5,0.8,11,1.8,16.4,2.9c0.7,0.2,1,0.4,1.2,1.1c2.6,8.3,5,16.8,7.4,25.2
c2.2,8,4.2,16.1,6.2,24.2c3.3,13.3,6.6,26.7,9.8,40c0.5,2,0.5,2.1-1.3,3.2c-6.5,4.1-13.2,8.1-20.3,11.2c-1.8,0.8-1.8,0.8-2.5-1
c-2.9-6.8-6.4-13.2-9.7-19.8c-0.2-0.4-0.5-0.6-0.9-0.5c-0.2,0-0.4,0-0.7,0c-4.7-0.1-9.5-0.1-14.2-0.3c-3.6-0.2-7.2,0-10.9,0.1
c-1.7,0.1-3.4,0.3-5.1,0.4c-0.8,0-1.2,0.4-1.5,1c-3.3,5.6-6.7,11.1-10,16.6c-1.3,2.2-1.3,2.3-3.8,1.8c-3.2-0.6-6.3-1.2-9.5-1.9
C507.4,171.3,507.2,171.2,507,171.1z"/>
<path class="st13" d="M460.5,103.3c2.7-2.1,5.2-4.1,7.7-6.1c7.4-5.8,14.8-11.7,22.1-17.5c2.4-1.9,4.8-3.8,7.2-5.7
c0.5-0.4,0.8-0.5,1.2,0.1c3.3,4.9,6.1,10.1,8.3,15.5c0.2,0.4,0.1,0.6-0.2,0.9c-3.9,3.5-7.9,7-11.7,10.5
c-5.2,4.8-10.3,9.6-15.1,14.8c-1.5,1.7-3,3.4-4.7,5c-0.7,0.7-0.7,1.2-0.2,2.1c3.5,6.4,7.4,12.6,11.4,18.8
c5.1,7.8,10.2,15.5,15.3,23.2c0.4,0.6,0.5,1-0.1,1.6c-6,5.9-12.1,11.7-19,16.5c-1.5,1.1-1.5,1.1-2.5-0.5
c-5.7-8.8-11.7-17.4-18-25.7c-2.7-3.5-5.4-6.9-9-9.7c-0.6-0.4-0.7-0.4-1.1,0.2c-2.9,4.4-4.8,9.2-6.7,14
c-2.5,6.2-4.8,12.5-6.7,18.9c-0.1,0.4-0.1,0.9-0.9,0.7c-6.6-2.4-13.3-4.5-19.7-7.3c-0.5-0.2-0.7-0.5-0.8-1c-0.2-3-0.5-6-1-9
c-0.1-0.4,0.1-0.7,0.2-1.1c4.5-11.6,7.6-23.6,10.9-35.5c2.4-8.6,4.9-17.2,7.3-25.8c3.1-11.1,6.2-22.2,9.1-33.4
c0.3-1.3,0.3-1.3,1.6-1c5.5,1.1,10.9,2.4,16.2,4.3c0.6,0.2,0.9,0.4,0.8,1.1c-0.5,3.2-0.9,6.5-1.1,9.8c-0.4,5.1-0.8,10.2-0.7,15.3
C460.4,99.1,460.4,101.1,460.5,103.3z"/>
<path class="st13" d="M637.5,92.6c1.8-1.1,3.6-2,5.3-3c3.1-1.8,5.7-4.2,8.3-6.6c6.2-5.7,11.8-12,17.5-18.2c2.4-2.5,4.8-5,7.3-7.5
c0.4-0.4,0.6-0.5,1,0c4.2,5.2,7.7,10.7,9.4,17.3c0.1,0.6,0,0.9-0.4,1.3c-3.1,2.8-6,5.7-8.9,8.8c-6.7,7-13.3,14.1-19.1,21.8
c-0.5,0.7-0.9,1.4-1.5,2.1c-1.1,1.4-1.1,3-0.5,4.6c1,2.6,2.4,5.1,3.8,7.5c6.4,10.8,13.4,21.2,20.4,31.6c0.5,0.7,0.5,1.2-0.1,1.9
c-4.6,5-9.7,9.3-15.2,13.3c-0.6,0.4-0.9,0.5-1.4-0.2c-5.7-7.8-11.3-15.5-17.5-22.9c-3.7-4.4-7.6-8.7-11.9-12.6
c-0.6-0.6-0.8-0.2-1.1,0.2c-3.6,4.5-5.5,9.8-7.4,15.1c-2.4,6.7-4.3,13.6-6,20.5c-0.2,0.6-0.3,0.7-0.9,0.5
c-4.3-1.7-8.5-3.5-12.5-5.7c-0.6-0.3-0.9-0.7-1-1.3c-1.6-6.7-3.2-13.4-4.9-20c-0.1-0.4-0.1-0.8,0-1.2c2.9-11.1,5.9-22.2,8.8-33.2
c1.9-7.3,3.5-14.7,4.9-22.1c1.5-8.2,3-16.4,4.5-24.6c0.3-1.8,0.7-3.7,0.9-5.5c0.1-0.6,0.2-0.6,0.8-0.5c3,0.7,5.8,1.8,8.7,3
c3.2,1.4,6.3,2.8,9.2,4.6c0.6,0.3,0.8,0.7,0.7,1.4c-0.3,5.5-0.5,11-0.8,16.5C637.9,83.6,637.7,88,637.5,92.6z"/>
<path class="st13" d="M352.2,91.1c0-3.3,0.1-6.7,0.4-10c0-0.5,0.2-0.7,0.7-0.8c7.3-1.8,14.7-3.6,22.1-4.9
c6.2-1.1,12.4-1.9,18.6-2.5c2.9-0.3,5.8-0.6,8.7-0.8c0.6,0,0.8,0.2,0.8,0.7c0.1,4.3,0.1,8.7-0.3,13c-0.2,1.9-0.3,3.8-0.4,5.7
c-0.1,0.8-0.2,1.2-1.2,1.3c-6,0.7-12.1,1.6-18.1,2.4c-1.7,0.2-1.7,0.2-1.7,1.9c0.1,4.8,0.2,9.6,0.3,14.3c0,0.6,0.2,0.8,0.8,0.8
c3.1,0,6.3,0.1,9.4,0.2c2.5,0.1,4.9,0.2,7.4,0.2c1,0,1.1,0.4,1.2,1.2c0.3,3.5,0.4,6.9,0.4,10.4c0,3,0,5.9,0,8.9
c0,0.7-0.2,1-1,1.2c-6,1.4-11.9,2.8-17.9,4.1c-0.7,0.2-0.8,0.4-0.7,1.1c0.3,3.1,0.5,6.2,0.8,9.2c0.2,2.5,0.5,4.9,0.7,7.4
c0,0.5,0.2,0.6,0.7,0.6c4.2-0.4,8.3-0.9,12.5-1.3c3.3-0.3,6.5-0.6,9.8-1c0.6-0.1,0.8,0.1,1,0.7c0.8,3,1.5,6,2,9.1
c0.7,4.7,1.2,9.5,1.2,14.3c0,0.9-0.3,1.2-1.1,1.3c-4.2,0.4-8.5,0.9-12.7,1.3c-4,0.4-7.9,0.8-11.8,1.2c-4,0.4-8,0.8-11.9,1.2
c-3.3,0.3-6.6,0.6-10,1c-0.7,0.1-1-0.1-1.1-0.9c-1.4-6.8-2.5-13.7-3.4-20.6c-0.9-6.3-1.6-12.6-2.3-19c-0.5-5.1-1-10.2-1.5-15.3
c-0.5-5.4-1-10.9-1.3-16.4c-0.3-4.8-0.6-9.7-0.8-14.5C352.3,95.6,352.3,93.4,352.2,91.1z"/>
<path class="st12" d="M538.8,130.7c0.8-2.2,1.6-4.3,2.4-6.4c2.4-6.5,4.8-13,7.3-19.5c0.2-0.4,0.3-0.9,0.3-1.4
c0-0.9,0.4-1.3,1.3-1.4c1.5-0.3,2.9-0.6,4.3,0.4c0.8,0.7,1.3,1.5,1.6,2.5c1.9,5.2,3.1,10.6,4.1,16c0.5,2.8,0.9,5.5,0.9,8.4
c0,1.3,0,1.3-1.3,1.4c-3.3,0.4-6.6,0.6-9.9,0.5C546.1,131.1,542.5,131.1,538.8,130.7z"/>
<path class="st14" d="M551.7,116.3c0.8,2.6,1.3,5.1,1.7,7.8c-1.5,0-3,0-4.6,0C549.8,121.5,550.7,118.9,551.7,116.3z"/>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 41 KiB

+1 -1
View File
@@ -3,6 +3,6 @@
<div class="ohlhafv-header-content">
<div class="ohlhafv-banner logo">
<a href="/ohlhafv"><img class="ohlhafv-banner-image" src="{% static "ohlhafv/img/heevi_banner.svg" %}" alt="Aalto-yliopiston Sähköinsinöörikilta ry"></a>
<a href="/ohlhafv"><img class="ohlhafv-banner-image" src="{% static "ohlhafv/img/heevit.svg" %}" alt="Aalto-yliopiston Sähköinsinöörikilta ry"></a>
</div>
</div>
+6 -5
View File
@@ -1,6 +1,6 @@
backports.shutil-get-terminal-size==1.0.0
decorator==4.0.9
Django==2.0.7
Django==2.1.5
ipython==4.2.0
ipython-genutils==0.1.0
pexpect==4.1.0
@@ -9,7 +9,7 @@ ptyprocess==0.5.1
pytz==2016.4
simplegeneric==0.8.1
traitlets==4.2.1
Pillow==4.3.0
Pillow==5.4.1
requests==2.11.1
django-nocaptcha-recaptcha==0.0.19
django-cors-headers==2.0.1
@@ -19,7 +19,7 @@ djangorestframework-jwt==1.11.0
coverage==4.3.4
django-nose==1.4.5
nose-exclude==0.5.0
psycopg2==2.7.3.1
psycopg2-binary==2.7.6.1
django-bootstrap3==8.2.3
django-tables2==1.6.1
pycodestyle==2.3.1
@@ -31,8 +31,9 @@ django-autocomplete-light==3.2.10
six==1.10.0
django-suit==0.2.26
telepot==12.3
pyexcel==0.5.8
pyexcel==0.5.10
pyexcel-xlsx==0.5.5
django-import-export==0.7.0
openpyxl==2.4.11
django-app-namespace-template-loader==0.4.1
django-app-namespace-template-loader==0.4.1
django-filter==2.0.0
+6
View File
@@ -103,6 +103,7 @@ INSTALLED_APPS = [
'auditlog',
'phonenumber_field',
'import_export',
'django_filters',
]
IMPORT_EXPORT_USE_TRANSACTIONS = True
@@ -232,6 +233,11 @@ REST_FRAMEWORK = {
'burst': '60/min',
'sustained': '1000/day'
},
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',
'PAGE_SIZE': 10,
'DEFAULT_FILTER_BACKENDS': (
'django_filters.rest_framework.DjangoFilterBackend',
),
}
# Email settings (tested working with gmail)
@@ -3,6 +3,7 @@ import random
from members.models import Member, Request
from infoscreen.models import ExternalImageInfoItem, Rotation, InfoInstance
from webapp.models import Tag, Feed
from misc.namegenerator import generate_names
from django.core.management.base import BaseCommand, CommandError
@@ -65,3 +66,29 @@ class Command(BaseCommand):
POR=por,
AYY=ayy,
jas=jas)
TAGS = ["Party", "International", "Freshmen", "Culture"]
TAG_COUNT = 2
for i in range(TAG_COUNT):
slug = TAGS[i] + str(random.randint(0, 10))
name = slug + str(random.randint(0, 10))
print(slug, name)
Tag.objects.create(slug=slug,
name=name,
icon="http://testiurl.com/kuva.jpg")
FEED_COUNT = 3
for i in range(FEED_COUNT):
title = "ds" + str(random.randint(0, 15))
description = "dsg" + str(random.randint(0, 20))
content = "fdfd"
Feed.objects.create(title=title,
visible=True,
description=description,
content=content)
tag1 = Tag.objects.get(id=1)
Feed.objects.get(title=title).tags.add(tag1)
tag2 = Tag.objects.get(id=1)
Feed.objects.get(title=title).tags.add(tag2)
@@ -0,0 +1,17 @@
# Generated by Django 2.0.7 on 2018-11-18 11:36
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('webapp', '0047_auto_20180710_2110'),
]
operations = [
migrations.DeleteModel('tag'),
migrations.DeleteModel('feed'),
migrations.DeleteModel('event'),
migrations.DeleteModel('basefeed'),
]
@@ -0,0 +1,79 @@
# Generated by Django 2.0.7 on 2018-11-18 11:44
from django.db import migrations, models
import django.db.models.deletion
import django.utils.timezone
import webapp.utils
class Migration(migrations.Migration):
dependencies = [
('webapp', '0048_auto_20181118_1336'),
]
operations = [
migrations.CreateModel(
name='BaseFeed',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('visible', models.BooleanField(default=True)),
('title', models.CharField(max_length=255)),
('title_fi', models.CharField(max_length=255, null=True)),
('title_en', models.CharField(max_length=255, null=True)),
('description', models.CharField(max_length=255)),
('description_fi', models.CharField(max_length=255, null=True)),
('description_en', models.CharField(max_length=255, null=True)),
('content', models.TextField()),
('content_fi', models.TextField(null=True)),
('content_en', models.TextField(null=True)),
],
),
migrations.CreateModel(
name='Tag',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('slug', models.SlugField(unique=True)),
('name', models.CharField(max_length=127)),
('name_fi', models.CharField(max_length=127, null=True)),
('name_en', models.CharField(max_length=127, null=True)),
('icon', models.ImageField(upload_to='')),
],
options={
'verbose_name': 'Tag',
'verbose_name_plural': 'Tags',
},
),
migrations.CreateModel(
name='Event',
fields=[
('basefeed_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='webapp.BaseFeed')),
('start_time', models.DateTimeField(default=django.utils.timezone.now)),
('end_time', models.DateTimeField(default=django.utils.timezone.now)),
('signupForm', models.ManyToManyField(blank=True, to='webapp.SignupForm')),
],
options={
'verbose_name': 'Event',
'verbose_name_plural': 'Events',
},
bases=('webapp.basefeed',),
),
migrations.CreateModel(
name='Feed',
fields=[
('basefeed_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='webapp.BaseFeed')),
('publish_time', models.DateTimeField(default=django.utils.timezone.now)),
('autohide', models.DateTimeField(default=webapp.utils.month_from_now)),
],
options={
'verbose_name': 'Feed',
'verbose_name_plural': 'Feeds',
},
bases=('webapp.basefeed',),
),
migrations.AddField(
model_name='basefeed',
name='tags',
field=models.ManyToManyField(blank=True, related_name='feeds', to='webapp.Tag'),
),
]
@@ -0,0 +1,18 @@
# Generated by Django 2.0.7 on 2018-11-18 15:53
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('webapp', '0049_auto_20181118_1344'),
]
operations = [
migrations.AddField(
model_name='signupform',
name='visible',
field=models.BooleanField(default=True),
),
]
+2 -1
View File
@@ -20,7 +20,7 @@ VERBOSE_NAME = _('Webapp')
class Tag(models.Model):
"""Model for tag."""
slug = models.SlugField(primary_key=True)
slug = models.SlugField(unique=True)
name = models.CharField(max_length=127)
icon = models.ImageField()
@@ -93,6 +93,7 @@ class SignupForm(models.Model):
end = models.DateTimeField(default=timezone.now)
# question = JSONField()
questions = models.CharField(max_length=255)
visible = models.BooleanField(default=True)
class Meta:
verbose_name = _('Signup form')
+35 -3
View File
@@ -14,19 +14,28 @@ class EventSerializer(serializers.HyperlinkedModelSerializer):
signup_id = serializers.PrimaryKeyRelatedField(
many=True,
source="signupForm",
queryset=SignupForm.objects.all())
queryset=SignupForm.objects.all()
)
tag_id = serializers.PrimaryKeyRelatedField(
many=True,
source="tags",
queryset=Tag.objects.all()
)
class Meta:
model = Event
fields = ('id', 'tags', 'visible', 'title', 'description',
fields = ('id', 'tag_id', 'tags', 'visible', 'title', 'description',
'content', 'start_time', 'end_time', 'signup_id', 'signupForm')
depth = 1
def create(self, validated_data):
signupForms = validated_data.pop('signupForm')
tags = validated_data.pop('tags')
event = Event.objects.create(**validated_data)
for form in signupForms:
event.signupForm.add(form)
for tag in tags:
event.tags.add(tag)
event.save()
return event
@@ -57,12 +66,35 @@ class SavedQuestionsSerializer(serializers.ModelSerializer):
fields = ('id', 'name', 'question')
class TagSerializer(serializers.ModelSerializer):
class Meta:
model = Tag
fields = ('id', 'slug', 'name', 'icon')
class FeedSerializer(serializers.ModelSerializer):
# tags = TagSerializer(many=True, read_only=False)
# tags = serializers.PrimaryKeyRelatedField(
# many=True,
# queryset=Tag.objects.all(),
# read_only=False
# )
class Meta:
model = Feed
fields = ('id', 'tags', 'visible', 'title', 'description',
fields = ('tags', 'visible', 'title', 'description',
'content', 'publish_time', 'autohide')
def create(self, validated_data):
print("validated data: ", validated_data)
tags_data = validated_data.pop('tags')
feed = Feed.objects.create(**validated_data)
for tag in tags_data:
print(tag)
feed.tags.add(tag)
feed.save()
return feed
class ContactsSerializer(serializers.ModelSerializer):
class Meta:
+109 -1
View File
@@ -1,5 +1,113 @@
"""Tests for webapp."""
from django.test import TestCase
from django.core.files import File
from django.contrib.auth.models import User
from rest_framework.test import APITestCase
from rest_framework import status
from rest_framework.test import force_authenticate
from webapp.models import Tag, Feed
from webapp.serializers import TagSerializer, FeedSerializer
# Create your tests here.
from collections import OrderedDict
from itertools import islice
import tempfile
class TagsTestCase(APITestCase):
def setUp(self):
self.icon = tempfile.NamedTemporaryFile(suffix=".jpg").name
Tag.objects.create(slug='Party', name='Bileet', icon=self.icon)
def test_get_single_tag(self):
self.assertEqual(Tag.objects.count(), 1)
response = self.client.get('/api/tags/', format='json')
self.assertTrue(status.is_success(response.status_code))
# We dont care about icon, so response is sliced
sliced_response = OrderedDict(islice(response.data['results'][0].items(), 3))
tag1 = Tag.objects.get(slug="Party")
self.assertEqual(sliced_response, {'id': tag1.id, 'slug': 'Party', 'name': 'Bileet'})
def test_get_multiple_tags(self):
self.assertEqual(Tag.objects.count(), 1)
Tag.objects.create(slug='Freshmen', name='Fuksit', icon=self.icon)
Tag.objects.create(slug='International', name='Ulkkarit', icon=self.icon)
self.assertEqual(Tag.objects.count(), 3)
response = self.client.get('/api/tags/', format='json')
self.assertTrue(status.is_success(response.status_code))
# We dont care about icon, so response is sliced
tag1 = Tag.objects.get(slug="Party")
sliced_response = OrderedDict(islice(response.data['results'][0].items(), 3))
self.assertEqual(sliced_response, {'id': tag1.id, 'slug': 'Party', 'name': 'Bileet'})
sliced_response = OrderedDict(islice(response.data['results'][1].items(), 3))
tag2 = Tag.objects.get(slug="Freshmen")
self.assertEqual(sliced_response, {'id': tag2.id, 'slug': 'Freshmen', 'name': 'Fuksit'})
sliced_response = OrderedDict(islice(response.data['results'][2].items(), 3))
tag3 = Tag.objects.get(slug="International")
self.assertEqual(sliced_response, {'id': tag3.id, 'slug': 'International', 'name': 'Ulkkarit'})
def test_create_tag(self):
self.assertEqual(Tag.objects.count(), 1)
response = self.client.post('/api/tags/', {'slug': 'Test', 'name': 'Testinimi', 'icon': self.icon}, format='multipart')
self.assertFalse(status.is_success(response.status_code))
self.assertEqual(Tag.objects.count(), 1)
def test_invalid_tag(self):
self.assertEqual(Tag.objects.count(), 1)
response = self.client.get('/api/tags/15', format='json', follow=True)
self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
class FeedTestCase(APITestCase):
def setUp(self):
self.icon = tempfile.NamedTemporaryFile(suffix=".jpg").name
Tag.objects.create(slug='testtag1', name='test1', icon=self.icon)
tag1 = Tag.objects.get(slug="testtag1")
Tag.objects.create(slug="testtag2", name='test2', icon=self.icon)
tag2 = Tag.objects.get(slug="testtag2")
self.assertEqual(Tag.objects.count(), 2)
Feed.objects.create(title="TestFeed", visible=True, description="diidadaapa", content="lorem ipsum")
Feed.objects.get(title="TestFeed").tags.add(tag1)
Feed.objects.get(title="TestFeed").tags.add(tag2)
self.assertEqual(Feed.objects.count(), 1)
self.assertEqual(Feed.objects.all()[0].tags.count(), 2)
username, password = 'test_admin', 'password123'
self.authClient = User.objects.create_superuser(username, 'myemail@test.com', password)
def test_get_feed(self):
response = self.client.get('/api/feed/', format='json')
self.assertTrue(status.is_success(response.status_code))
feeds = Feed.objects.all()
serializer = FeedSerializer(feeds, many=True)
self.assertEqual(response.data['results'], serializer.data)
def test_post_feed(self):
Tag.objects.create(slug="test1", name="testsds")
Tag.objects.create(slug="test2", name="testsdsd")
tag1_id = Tag.objects.get(slug="test1").id
tag2_id = Tag.objects.get(slug="test2").id
data = {'tags': [tag1_id, tag2_id], 'title': 'testtitle', 'visible': 'True', 'description': 'liirumlaarum', 'content': 'lorem ipsum'}
# Try post without authentication
response = self.client.post('/api/feed/', data, format='multipart')
self.assertTrue(status.is_client_error(response.status_code))
self.assertEqual(Feed.objects.count(), 1)
# Authenticate
self.client.force_authenticate(user=self.authClient)
response = self.client.post('/api/feed/', data, format='multipart')
# Return success and check object was created
self.assertTrue(status.is_success(response.status_code))
self.assertEqual(Feed.objects.count(), 2)
created = Feed.objects.get(title="testtitle")
print(created.tags)
# self.assertEqual(created.tags.count(), 2)
+7 -1
View File
@@ -2,6 +2,8 @@
from django.conf.urls import url, include
from rest_framework import routers
from rest_framework_jwt.views import obtain_jwt_token, verify_jwt_token
# from rest_framework.urlpatterns import format_suffix_patterns
# from django.conf import settings
# from django.utils.translation import ugettext_lazy as _
@@ -19,7 +21,7 @@ from webapp.views import about_view
# from webapp.views import contact_view
from webapp.views import EventViewSet, SignupFormViewSet, SignupViewSet,\
FeedViewSet, ContactsViewSet, SavedQuestionsViewSet, RootView
FeedViewSet, ContactsViewSet, SavedQuestionsViewSet, RootView, TagsViewSet
class APIRouter(routers.DefaultRouter):
@@ -33,9 +35,13 @@ router.register(r'signup', SignupViewSet)
router.register(r'feed', FeedViewSet)
router.register(r'contacts', ContactsViewSet)
router.register(r'questions', SavedQuestionsViewSet)
router.register(r'tags', TagsViewSet)
urlpatterns = [
url(r'^api/', include(router.urls)),
url(r'^api/api-token-auth/', obtain_jwt_token),
url(r'^api/api-token-verify/', verify_jwt_token),
# login stuff
# url(r'^login$', login_view),
# url(r'^logout$', logout_view),
+43 -3
View File
@@ -13,17 +13,27 @@ from rest_framework import viewsets, routers
from rest_framework.permissions import IsAuthenticatedOrReadOnly
from rest_framework.response import Response
from rest_framework.reverse import reverse
from django_filters import rest_framework as filters
from rest_framework.filters import SearchFilter, OrderingFilter
from rest_framework import permissions
# import logging
# import requests
from dealer.git import git
from webapp.models import Event, SignupForm, Signup, TemplateQuestion, Feed,\
Committee, Official
Committee, Official, Tag
from webapp.serializers import *
from members.views.utils import *
class IsPostOrIsAuthenticated(permissions.BasePermission):
def has_permission(self, request, view):
if request.method == 'POST':
return True
return request.user and request.user.is_authenticated
# -- REST API -- #
class RootView(routers.APIRootView):
permission_classes = [IsAuthenticatedOrReadOnly]
@@ -33,18 +43,36 @@ class EventViewSet(viewsets.ModelViewSet):
queryset = Event.objects.all()
serializer_class = EventSerializer
permission_classes = [IsAuthenticatedOrReadOnly]
filter_backends = (filters.DjangoFilterBackend, SearchFilter, OrderingFilter)
filter_fields = '__all__'
search_fields = '__all__'
def get_queryset(self):
return Event.objects.filter(visible=True, end_time__gt=timezone.now()).order_by('start_time')
class SignupFormViewSet(viewsets.ModelViewSet):
queryset = SignupForm.objects.all()
serializer_class = SignupFormSerializer
permission_classes = [IsAuthenticatedOrReadOnly]
filter_backends = (filters.DjangoFilterBackend, SearchFilter, OrderingFilter)
filter_fields = '__all__'
search_fields = '__all__'
def get_queryset(self):
return SignupForm.objects.filter(visible=True, end__gt=timezone.now()).order_by('start')
class SignupViewSet(viewsets.ModelViewSet):
queryset = Signup.objects.all()
serializer_class = SignupSerializer
permission_classes = []
permission_classes = [IsPostOrIsAuthenticated]
# filter_backends = (filters.DjangoFilterBackend, SearchFilter, OrderingFilter)
# filter_fields = '__all__'
# search_fields = '__all__'
# def get_queryset(self):
# return Signup.objects.filter(visible=True, end_time__gt=timezone.now()).order_by('start_time')
class SavedQuestionsViewSet(viewsets.ModelViewSet):
@@ -57,6 +85,12 @@ class FeedViewSet(viewsets.ModelViewSet):
queryset = Feed.objects.all()
serializer_class = FeedSerializer
permission_classes = [IsAuthenticatedOrReadOnly]
filter_backends = (filters.DjangoFilterBackend, SearchFilter, OrderingFilter)
filter_fields = '__all__'
search_fields = '__all__'
def get_queryset(self):
return Feed.objects.filter(visible=True, autohide__gt=timezone.now()).order_by('publish_time')
class ContactsViewSet(viewsets.ReadOnlyModelViewSet):
@@ -65,6 +99,12 @@ class ContactsViewSet(viewsets.ReadOnlyModelViewSet):
permission_classes = [IsAuthenticatedOrReadOnly]
class TagsViewSet(viewsets.ReadOnlyModelViewSet):
queryset = Tag.objects.all()
serializer_class = TagSerializer
permission_classes = [IsAuthenticatedOrReadOnly]
# -- OLD CODEBASE -- #
@require_http_methods(["GET"])