Merge branch 'pseudo_master' into test
							
								
								
									
										10
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						|  | @ -1,11 +1,5 @@ | |||
| # virtual env | ||||
| /bin/ | ||||
| /include/ | ||||
| /lib/ | ||||
| /local/ | ||||
| /share/ | ||||
| /virtualenv/ | ||||
| /pip-selfcheck.json | ||||
| /env/ | ||||
| 
 | ||||
| # transient files | ||||
| /db-test.sqlite3* | ||||
|  | @ -16,7 +10,7 @@ | |||
| 
 | ||||
| # aux files | ||||
| *.pyc | ||||
| *.swp | ||||
| *.sw[mnop] | ||||
| 
 | ||||
| # secrets | ||||
| /django.secret | ||||
|  |  | |||
							
								
								
									
										3
									
								
								MIGRATIONS
									
									
									
									
									
										Normal file
									
								
							
							
						
						|  | @ -0,0 +1,3 @@ | |||
| Jak zvládnout migrace na nový model: | ||||
| 
 | ||||
| - V mojí verzi databáze mají úlohy-Problémy typ "b'uloha'" | ||||
							
								
								
									
										96
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						|  | @ -1,68 +1,69 @@ | |||
| .PHONY: clean_env init_env clean_virtualenv install_packages clean install run all schema_seminar.pdf schema_all.pdf sync_test_media sync_test_db sync_test sync_local_media sync_local_db sync_local | ||||
| PYTHON=python2.7 | ||||
| VE_VER=16.0.0 | ||||
| LOCAL_PYTHON=bin/python | ||||
| PYTHON ?= python3 | ||||
| VENV ?= ${PYTHON} -m venv | ||||
| # Všechny flagy, které se s venvem/virtualenvem/... mají volat patří sem. Volá se "${VENV} cesta"
 | ||||
| VENV_PATH ?= env | ||||
| # Musí být definovaná, i kdyby to měla být "."
 | ||||
| 
 | ||||
| all: install | ||||
| .PHONY: all venv_check clean install install_web install_venv clean_venv clean_schema run test deploy_test deploy_prod sync_test_media sync_test_db sync_test sync_local_media sync_local_db sync_local | ||||
| 
 | ||||
| clean: clean_env | ||||
| # activate by mělo být předpokladem ke všemu, co volá webový python (i.e. python nasazený do ${VENV}u kvůli webu, např. manage.py)
 | ||||
| all: | ||||
| 	@# Just echo: | ||||
| 	# Install je trochu magický: | ||||
| 	# Spusť následující posloupnost příkazů: | ||||
| 	#	make install_venv | ||||
| 	#	. ${VENV_PATH}/bin/activate | ||||
| 	#	make install_web | ||||
| 	# | ||||
| 	# Pokud install_web říká Error: pg_config executable not found. nainstaluj si libpq-dev | ||||
| 	# Pokud chybová hláška obsahuje #include <Python.h>, nainstaluj si python3-dev | ||||
| 	# | ||||
| 	# Až skončíš s vývojem webu, spusť "deactivate". Tím zmizí '(${VENV_PATH})' ze začátku promptu. | ||||
| 
 | ||||
| veryclean: clean clean_virtualenv | ||||
| venv_check: | ||||
| 	@# Pokud org nemá zapnutý venv, poradíme mu, aby si ho zapnul a spadneme. Jinak nic. | ||||
| 	@expr $$PATH : ".*:*$(shell pwd)/${VENV_PATH}/bin" > /dev/null && exit 0 || echo 'Není zapnutý venv, spusť ". ${VENV_PATH}/bin/activate".\nPokud není venv nainstalovaný, spusť "make install_venv"' && false | ||||
| 
 | ||||
| install: virtualenv bin/python install_packages | ||||
| clean: clean_venv clean_schema | ||||
| 
 | ||||
| install: install_web | ||||
| 
 | ||||
| # phony, but depends on file
 | ||||
| make_env: ${LOCAL_PYTHON} | ||||
| install_web: venv_check | ||||
| 	@# venv může být příšerně starý, takže nejdříve upgradujeme venvové věci | ||||
| 	pip install --upgrade pip | ||||
| 	pip install --upgrade setuptools | ||||
| 	# Instalace závislostí webu | ||||
| 	pip install -r requirements.txt --upgrade | ||||
| 
 | ||||
| # phony, but fast repeated execution
 | ||||
| install_packages: make_env | ||||
| 	bin/pip install -r requirements.txt --upgrade | ||||
| install_venv: | ||||
| 	${VENV} ${VENV_PATH} | ||||
| 
 | ||||
| # phony
 | ||||
| clean_env: | ||||
| 	rm -rf bin/ include/ lib/ local/ share/ | ||||
| clean_venv: | ||||
| 	# Možná není 100% foolproof... | ||||
| 	@test ! ${VENV_PATH} = . || ! echo "Smaž si prosím venv sám, nebudu mazat celý web" | ||||
| 	rm -rfv ${VENV_PATH} | ||||
| 	rm -f pip-selfcheck.json | ||||
| clean_schema: | ||||
| 	rm -f schema_seminar.pdf schema_all.pdf | ||||
| 
 | ||||
| # binary name representing set-up env
 | ||||
| ${LOCAL_PYTHON}: virtualenv | ||||
| 	${PYTHON} virtualenv/virtualenv.py . | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| # directory name
 | ||||
| virtualenv: | ||||
| 	# I could not find a link without hash anymore. This will probably break in | ||||
| 	# the future. | ||||
| 	curl -O https://files.pythonhosted.org/packages/33/bc/fa0b5347139cd9564f0d44ebd2b147ac97c36b2403943dbee8a25fd74012/virtualenv-16.0.0.tar.gz | ||||
| 	tar xvfz virtualenv-${VE_VER}.tar.gz | ||||
| 	mv -T virtualenv-${VE_VER} virtualenv | ||||
| 	rm virtualenv-${VE_VER}.tar.gz | ||||
| 
 | ||||
| # phony
 | ||||
| clean_virtualenv: | ||||
| 	rm -rf virtualenv/ | ||||
| 	rm -rf virtualenv-*.tar.gz | ||||
| 
 | ||||
| run: | ||||
| run: venv_check | ||||
| 	./manage.py runserver | ||||
| 
 | ||||
| test: | ||||
| test: venv_check | ||||
| 	./manage.py test -v2 seminar mamweb | ||||
| 
 | ||||
| # DB schemata
 | ||||
| 
 | ||||
| schema: schema_seminar.pdf schema_all.pdf | ||||
| 
 | ||||
| schema_seminar.pdf: | ||||
| schema_seminar.pdf: venv_check | ||||
| 	./manage.py graph_models seminar | dot -Tpdf > schema_seminar.pdf | ||||
| 
 | ||||
| schema_all.pdf: | ||||
| schema_all.pdf: venv_check | ||||
| 	./manage.py graph_models -a -g | dot -Tpdf > schema_all.pdf | ||||
| 
 | ||||
| # Deploy to current *mamweb-test* directory
 | ||||
| deploy_test: | ||||
| deploy_test: venv_check | ||||
| 	@if [ ${USER} != "mam-web" ]; then echo "Only possible by user mam-web"; exit 1; fi | ||||
| 	@if [ `readlink -f .` != "/aux/akce/mam/www/mamweb-test" ]; then echo "Only possible in directory mamweb-test"; exit 1; fi | ||||
| 	@echo "Installing version from origin/test ..." | ||||
|  | @ -78,7 +79,7 @@ deploy_test: | |||
| 	@echo Done. | ||||
| 
 | ||||
| # Deploy to current *mamweb-prod* directory
 | ||||
| deploy_prod: | ||||
| deploy_prod: venv_check | ||||
| 	@if [ ${USER} != "mam-web" ]; then echo "Only possible by user mam-web"; exit 1; fi | ||||
| 	@if [ `readlink -f .` != "/aux/akce/mam/www/mamweb-prod" ]; then echo "Only possible in directory mamweb-prod"; exit 1; fi | ||||
| 	@echo "Backing up production DB ..." | ||||
|  | @ -96,6 +97,15 @@ deploy_prod: | |||
| 	@echo Done. | ||||
| 
 | ||||
| 
 | ||||
| sync_prod_flatpages: venv_check  | ||||
| 	@echo Downloading current version of flatpages from mamweb-prod. | ||||
| 	ssh mam-web@gimli.ms.mff.cuni.cz \
 | ||||
| 	"cd /akce/mam/www/mamweb-prod; ./manage.py dumpdata flatpages --indent=2 > flat.json" | ||||
| 	rsync -ave ssh mam-web@gimli.ms.mff.cuni.cz:/akce/mam/www/mamweb-prod/flat.json ./flat.json | ||||
| 	@echo "Applying downloaded flatpages." | ||||
| 	./manage.py loaddata flat.json | ||||
| 	@echo "Done." | ||||
| 
 | ||||
| # Sync test media directory with production
 | ||||
| sync_test_media: | ||||
| 	@if [ ${USER} != "mam-web" ]; then echo "Only possible by user mam-web"; exit 1; fi | ||||
|  | @ -128,4 +138,4 @@ sync_local_db: | |||
| 	pg_restore -c -d mam-prod  last.pgdump | ||||
| 
 | ||||
| # Sync database and media. See above lines
 | ||||
| sync_local: sync_media sync_db | ||||
| sync_local: sync_local_media sync_local_db | ||||
|  |  | |||
							
								
								
									
										14
									
								
								README.md
									
									
									
									
									
								
							
							
						
						|  | @ -13,12 +13,12 @@ Use git :-) | |||
| 
 | ||||
| Quickstart | ||||
| ---------- | ||||
| Run the following commands: | ||||
| 	make install_venv | ||||
| 	. env/bin/activate | ||||
| 	make install_web | ||||
| 
 | ||||
| Install the following packages in Debian/Ubuntu: `libpq-dev python-dev python-setuptools python2.7 libjpeg-dev libpng12-dev`. Then run: | ||||
| 
 | ||||
|   make | ||||
|   ./manage.py testdata | ||||
|   make run | ||||
| After finishing development, run "deactivate". | ||||
| 
 | ||||
| Make commands | ||||
| ------------- | ||||
|  | @ -41,6 +41,8 @@ Make commands | |||
| 
 | ||||
| * `make schema` - generates graph of seminar and all schemas as PDF. Supercool! | ||||
| 
 | ||||
| * `make sync_prod_flatpages` - downloads and applies static/flat pages from mamweb-prod | ||||
| 
 | ||||
| ./manage.py commands | ||||
| -------------------- | ||||
| 
 | ||||
|  | @ -56,6 +58,8 @@ Make commands | |||
| 
 | ||||
| * `./manage.py test` - run the tests. | ||||
| 
 | ||||
| * `./manage.py shell` - run commands, list elemements of database, check syntax | ||||
|   by importing files, etc. | ||||
| 
 | ||||
| Configurations | ||||
| -------------- | ||||
|  |  | |||
							
								
								
									
										
											BIN
										
									
								
								Schema_new.dia
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										17
									
								
								convert_spaces_to_tabs.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						|  | @ -0,0 +1,17 @@ | |||
| #!/bin/sh | ||||
| 
 | ||||
| if test "$#" -lt 1 | ||||
| then | ||||
| 	echo "Usage: $0 file ..." | ||||
| 	exit 2 | ||||
| fi | ||||
| 
 | ||||
| for file in "$@" | ||||
| do | ||||
| 	# Do the sed magic: keep replacing 4 spaces at the begining of line | ||||
| 	sed -i -re ' | ||||
| 		: loop | ||||
| 		s/^(	*)    /\1	/ | ||||
| 		t loop | ||||
| 		' "$file" | ||||
| done | ||||
							
								
								
									
										332
									
								
								flat.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						|  | @ -5,7 +5,6 @@ from django.contrib import admin | |||
| from django.http import HttpResponseRedirect | ||||
| from django import forms | ||||
| from django.db import models | ||||
| from autocomplete_light import shortcuts as autocomplete_light | ||||
| 
 | ||||
| # akction | ||||
| 
 | ||||
|  | @ -39,11 +38,12 @@ class GalerieInline(admin.TabularInline): | |||
| 
 | ||||
| class ObrazekAdmin(admin.ModelAdmin): | ||||
| 	list_display = ('obrazek_velky', 'nazev', 'popis', 'obrazek_maly_tag', 'poradi') | ||||
| 	search_fields = ['nazev','popis'] | ||||
| 
 | ||||
| class GalerieAdmin(admin.ModelAdmin): | ||||
|     form = autocomplete_light.modelform_factory(Galerie, autocomplete_fields=['titulni_obrazek'], fields=['titulni_obrazek']) | ||||
| 	model = Galerie | ||||
| 	fields = ('zobrazit', 'nazev', 'titulni_obrazek', 'popis', 'galerie_up', 'soustredeni', 'poradi') | ||||
| 	autocomplete_fields = ['titulni_obrazek'] | ||||
| 	list_display = ('nazev', 'soustredeni', 'galerie_up', 'poradi', 'zobrazit', 'datum_zmeny') | ||||
| 	inlines = [GalerieInline] | ||||
| 	actions = [zverejnit_fotogalerii, prepnout_fotogalerii_do_org_rezimu] | ||||
|  |  | |||
|  | @ -1,11 +1,9 @@ | |||
| # -*- coding: utf-8 -*- | ||||
| 
 | ||||
| from __future__ import unicode_literals | ||||
| 
 | ||||
| from autocomplete_light import shortcuts as autocomplete_light | ||||
| 
 | ||||
| from models import Obrazek, Galerie | ||||
| from views import cesta_od_korene | ||||
| from .models import Obrazek, Galerie | ||||
| from .views import cesta_od_korene | ||||
| 
 | ||||
| 
 | ||||
| class ObrazekAutocomplete(autocomplete_light.AutocompleteModelBase): | ||||
|  | @ -21,8 +21,8 @@ class Migration(migrations.Migration): | |||
|                 ('datum_zmeny', models.DateTimeField(auto_now=True, verbose_name=b'Datum posledn\xc3\xad zm\xc4\x9bny')), | ||||
|                 ('popis', models.TextField(null=True, verbose_name=b'Popis', blank=True)), | ||||
|                 ('zobrazit', models.IntegerField(default=1, verbose_name=b'Zobrazit?', choices=[(0, b'V\xc5\xbedy'), (1, b'Organiz\xc3\xa1tor\xc5\xafm'), (2, b'Nikdy')])), | ||||
|                 ('galerie_up', models.ForeignKey(blank=True, to='galerie.Galerie', null=True)), | ||||
|                 ('soustredeni', models.ForeignKey(blank=True, to='seminar.Soustredeni', null=True)), | ||||
|                 ('galerie_up', models.ForeignKey(blank=True, to='galerie.Galerie', null=True, on_delete=models.CASCADE)), | ||||
|                 ('soustredeni', models.ForeignKey(blank=True, to='seminar.Soustredeni', null=True, on_delete=models.CASCADE)), | ||||
|             ], | ||||
|             options={ | ||||
|                 'verbose_name': 'Galerie', | ||||
|  | @ -42,7 +42,7 @@ class Migration(migrations.Migration): | |||
|                 ('datum_vlozeni', models.DateTimeField(auto_now_add=True, verbose_name=b'Datum vlo\xc5\xbeen\xc3\xad')), | ||||
|                 ('datum', models.DateTimeField(verbose_name=b'Datum po\xc5\x99\xc3\xadzen\xc3\xad fotografie')), | ||||
|                 ('poradi', models.IntegerField(null=True, verbose_name=b'Po\xc5\x99ad\xc3\xad', blank=True)), | ||||
|                 ('galerie', models.ForeignKey(to='galerie.Galerie')), | ||||
|                 ('galerie', models.ForeignKey(to='galerie.Galerie', on_delete=models.CASCADE)), | ||||
|             ], | ||||
|             options={ | ||||
|                 'verbose_name': 'Obr\xe1zek', | ||||
|  |  | |||
|  | @ -14,7 +14,7 @@ class Migration(migrations.Migration): | |||
|         migrations.AlterField( | ||||
|             model_name='obrazek', | ||||
|             name='galerie', | ||||
|             field=models.ForeignKey(blank=True, to='galerie.Galerie', null=True), | ||||
|             field=models.ForeignKey(blank=True, to='galerie.Galerie', null=True, on_delete=models.CASCADE), | ||||
|             preserve_default=True, | ||||
|         ), | ||||
|     ] | ||||
|  |  | |||
							
								
								
									
										71
									
								
								galerie/migrations/0008_auto_20190430_2340.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						|  | @ -0,0 +1,71 @@ | |||
| # -*- coding: utf-8 -*- | ||||
| # Generated by Django 1.11.20 on 2019-04-30 21:40 | ||||
| from __future__ import unicode_literals | ||||
| 
 | ||||
| from django.db import migrations, models | ||||
| import galerie.models | ||||
| 
 | ||||
| 
 | ||||
| class Migration(migrations.Migration): | ||||
| 
 | ||||
|     dependencies = [ | ||||
|         ('galerie', '0007_obrazek_odstranen_datum'), | ||||
|     ] | ||||
| 
 | ||||
|     operations = [ | ||||
|         migrations.AlterField( | ||||
|             model_name='galerie', | ||||
|             name='datum_vytvoreni', | ||||
|             field=models.DateTimeField(auto_now_add=True, verbose_name='Datum vytvoření'), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name='galerie', | ||||
|             name='datum_zmeny', | ||||
|             field=models.DateTimeField(auto_now=True, verbose_name='Datum poslední změny'), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name='galerie', | ||||
|             name='nazev', | ||||
|             field=models.CharField(max_length=100, verbose_name='Název'), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name='galerie', | ||||
|             name='popis', | ||||
|             field=models.TextField(blank=True, null=True, verbose_name='Popis'), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name='galerie', | ||||
|             name='poradi', | ||||
|             field=models.IntegerField(blank=True, null=True, verbose_name='Pořadí'), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name='galerie', | ||||
|             name='zobrazit', | ||||
|             field=models.IntegerField(choices=[(0, 'Vždy'), (1, 'Organizátorům'), (2, 'Nikdy')], default=1, verbose_name='Zobrazit?'), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name='obrazek', | ||||
|             name='datum_vlozeni', | ||||
|             field=models.DateTimeField(auto_now_add=True, verbose_name='Datum vložení'), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name='obrazek', | ||||
|             name='nazev', | ||||
|             field=models.CharField(blank=True, max_length=50, null=True, verbose_name='Název'), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name='obrazek', | ||||
|             name='obrazek_velky', | ||||
|             field=models.ImageField(help_text='Lze vložit libovolně velký obrázek. Ideální je, aby alespoň jeden rozměr měl alespoň 500px.', upload_to=galerie.models.obrazek_filename), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name='obrazek', | ||||
|             name='popis', | ||||
|             field=models.TextField(blank=True, null=True, verbose_name='Popis'), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name='obrazek', | ||||
|             name='poradi', | ||||
|             field=models.IntegerField(blank=True, null=True, verbose_name='Pořadí'), | ||||
|         ), | ||||
|     ] | ||||
							
								
								
									
										31
									
								
								galerie/migrations/0009_auto_20190610_2358.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						|  | @ -0,0 +1,31 @@ | |||
| # -*- coding: utf-8 -*- | ||||
| # Generated by Django 1.11.21 on 2019-06-10 21:58 | ||||
| from __future__ import unicode_literals | ||||
| 
 | ||||
| from django.db import migrations, models | ||||
| import django.db.models.deletion | ||||
| 
 | ||||
| 
 | ||||
| class Migration(migrations.Migration): | ||||
| 
 | ||||
|     dependencies = [ | ||||
|         ('galerie', '0008_auto_20190430_2340'), | ||||
|     ] | ||||
| 
 | ||||
|     operations = [ | ||||
|         migrations.AlterField( | ||||
|             model_name='galerie', | ||||
|             name='galerie_up', | ||||
|             field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='galerie.Galerie'), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name='galerie', | ||||
|             name='soustredeni', | ||||
|             field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='seminar.Soustredeni'), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name='obrazek', | ||||
|             name='galerie', | ||||
|             field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='galerie.Galerie'), | ||||
|         ), | ||||
|     ] | ||||
|  | @ -1,6 +1,4 @@ | |||
| # -*- coding: utf-8 -*- | ||||
| # Generated by Django 1.11.26 on 2019-12-09 22:26 | ||||
| from __future__ import unicode_literals | ||||
| # Generated by Django 2.2.15 on 2020-08-19 07:47 | ||||
| 
 | ||||
| from django.db import migrations, models | ||||
| 
 | ||||
|  | @ -8,13 +6,13 @@ from django.db import migrations, models | |||
| class Migration(migrations.Migration): | ||||
| 
 | ||||
|     dependencies = [ | ||||
|         ('galerie', '0007_obrazek_odstranen_datum'), | ||||
|         ('galerie', '0009_auto_20190610_2358'), | ||||
|     ] | ||||
| 
 | ||||
|     operations = [ | ||||
|         migrations.AlterField( | ||||
|             model_name='galerie', | ||||
|             name='poradi', | ||||
|             field=models.IntegerField(blank=True, default=0, verbose_name=b'Po\xc5\x99ad\xc3\xad'), | ||||
|             field=models.IntegerField(blank=True, default=0, verbose_name='Pořadí'), | ||||
|         ), | ||||
|     ] | ||||
|  | @ -2,7 +2,7 @@ | |||
| 
 | ||||
| from django.db import models | ||||
| #from django.db.models import Q | ||||
| from django.utils.encoding import force_unicode | ||||
| from django.utils.encoding import force_text | ||||
| from imagekit.models import ImageSpecField | ||||
| from imagekit.processors import ResizeToFit, Transpose | ||||
| 
 | ||||
|  | @ -30,7 +30,7 @@ def obrazek_filename_velky(): | |||
| 
 | ||||
| def obrazek_filename(self, filename): | ||||
| 	gal = self.galerie | ||||
|     cislo_gal = force_unicode(gal.pk) | ||||
| 	cislo_gal = gal.pk | ||||
| 
 | ||||
| 	# najdi kořenovou galerii | ||||
| 	while (gal.galerie_up): | ||||
|  | @ -39,8 +39,8 @@ def obrazek_filename(self, filename): | |||
| 	# soustředění je v cestě jen pokud galerie pod nějaké patří | ||||
| 	cesta = ( | ||||
| 		['Galerie'] + | ||||
|         (["soustredeni_" + force_unicode(gal.soustredeni.pk)] if gal.soustredeni else []) + | ||||
|         ["galerie_" + cislo_gal, force_unicode(self.nazev)] | ||||
| 		(["soustredeni_{}".format(gal.soustredeni.pk)] if gal.soustredeni else []) + | ||||
| 		["galerie_{}".format(cislo_gal), self.nazev] | ||||
| 	) | ||||
| 
 | ||||
| 	return os.path.join(*cesta) | ||||
|  | @ -57,11 +57,11 @@ class Obrazek(models.Model): | |||
| 	nazev = models.CharField('Název', max_length=50, blank=True, null=True) | ||||
| 	popis = models.TextField('Popis', blank=True, null=True) | ||||
| 	datum_vlozeni = models.DateTimeField('Datum vložení', auto_now_add=True) | ||||
|     galerie = models.ForeignKey('Galerie', blank=True, null=True) | ||||
| 	galerie = models.ForeignKey('Galerie', blank=True, null=True, on_delete=models.SET_NULL) | ||||
| 	poradi = models.IntegerField('Pořadí', blank=True, null=True) | ||||
| 
 | ||||
|     def __unicode__(self): | ||||
|           return unicode(self.obrazek_velky.name) | ||||
| 	def __str__(self): | ||||
| 			return self.obrazek_velky.name | ||||
| 
 | ||||
| 	class Meta: | ||||
| 		verbose_name = 'Obrázek' | ||||
|  | @ -69,6 +69,8 @@ class Obrazek(models.Model): | |||
| 		ordering = ['nazev'] | ||||
| 
 | ||||
| 	def obrazek_maly_tag(self): | ||||
| 		if not self.obrazek_maly: | ||||
| 			return '' | ||||
| 		return u'<img src="{}">'.format(self.obrazek_maly.url) | ||||
| 	obrazek_maly_tag.short_description = "Náhled" | ||||
| 	obrazek_maly_tag.allow_tags = True | ||||
|  | @ -81,7 +83,6 @@ class Obrazek(models.Model): | |||
| 		super(Obrazek, self).save(*args, **kwargs) | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| class Galerie(models.Model): | ||||
| 	nazev = models.CharField('Název', max_length=100) | ||||
| 	datum_vytvoreni = models.DateTimeField('Datum vytvoření', auto_now_add = True) | ||||
|  | @ -89,11 +90,13 @@ class Galerie(models.Model): | |||
| 	popis = models.TextField('Popis', blank = True, null = True) | ||||
| 	titulni_obrazek = models.ForeignKey(Obrazek, blank = True, null = True, related_name = "+", on_delete = models.SET_NULL) | ||||
| 	zobrazit = models.IntegerField('Zobrazit?', default = ORG, choices = VIDITELNOST) | ||||
|   galerie_up = models.ForeignKey('Galerie', blank = True, null = True) | ||||
|   soustredeni = models.ForeignKey(Soustredeni, blank = True, null = True) | ||||
| 	galerie_up = models.ForeignKey('Galerie', blank = True, null = True, | ||||
| 		on_delete=models.SET_NULL) | ||||
| 	soustredeni = models.ForeignKey(Soustredeni, blank = True, null = True, | ||||
| 		on_delete=models.PROTECT) | ||||
| 	poradi = models.IntegerField('Pořadí', blank = True, null = False, default = 0) | ||||
| 
 | ||||
|   def __unicode__(self): | ||||
| 	def __str__(self): | ||||
| 		return self.nazev | ||||
| 	class Meta: | ||||
| 		verbose_name = 'Galerie' | ||||
|  |  | |||
| Before Width: | Height: | Size: 15 KiB | 
							
								
								
									
										65
									
								
								galerie/static/galerie/prvky/dalsi.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						|  | @ -0,0 +1,65 @@ | |||
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||||
| <svg | ||||
|    xmlns:dc="http://purl.org/dc/elements/1.1/" | ||||
|    xmlns:cc="http://creativecommons.org/ns#" | ||||
|    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | ||||
|    xmlns:svg="http://www.w3.org/2000/svg" | ||||
|    xmlns="http://www.w3.org/2000/svg" | ||||
|    xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | ||||
|    xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | ||||
|    width="25.135418mm" | ||||
|    height="42.333332mm" | ||||
|    viewBox="0 0 25.135418 42.333331" | ||||
|    version="1.1" | ||||
|    id="svg851" | ||||
|    sodipodi:docname="dalsi.svg" | ||||
|    inkscape:version="0.92.4 (5da689c313, 2019-01-14)"> | ||||
|   <sodipodi:namedview | ||||
|      pagecolor="#ffffff" | ||||
|      bordercolor="#666666" | ||||
|      borderopacity="1" | ||||
|      objecttolerance="10" | ||||
|      gridtolerance="10" | ||||
|      guidetolerance="10" | ||||
|      inkscape:pageopacity="0" | ||||
|      inkscape:pageshadow="2" | ||||
|      inkscape:window-width="1850" | ||||
|      inkscape:window-height="1136" | ||||
|      id="namedview7" | ||||
|      showgrid="true" | ||||
|      inkscape:zoom="23.600001" | ||||
|      inkscape:cx="18.587131" | ||||
|      inkscape:cy="74.924864" | ||||
|      inkscape:window-x="70" | ||||
|      inkscape:window-y="27" | ||||
|      inkscape:window-maximized="1" | ||||
|      inkscape:current-layer="svg851"> | ||||
|     <inkscape:grid | ||||
|        type="xygrid" | ||||
|        id="grid833" /> | ||||
|   </sodipodi:namedview> | ||||
|   <defs | ||||
|      id="defs845" /> | ||||
|   <metadata | ||||
|      id="metadata848"> | ||||
|     <rdf:RDF> | ||||
|       <cc:Work | ||||
|          rdf:about=""> | ||||
|         <dc:format>image/svg+xml</dc:format> | ||||
|         <dc:type | ||||
|            rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> | ||||
|         <dc:title></dc:title> | ||||
|       </cc:Work> | ||||
|     </rdf:RDF> | ||||
|   </metadata> | ||||
|   <g | ||||
|      id="layer1" | ||||
|      transform="matrix(-1.0282842,0,0,1,111.4545,-88.415317)"> | ||||
|     <path | ||||
|        d="m 98.096584,101.64448 1.286528,1.32292 -5.660724,5.82083 h 13.379892 v 1.5875 H 93.722388 l 5.660724,5.82083 -1.286528,1.32292 -7.719171,-7.9375 z" | ||||
|        style="fill:#e84e10;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.23177969" | ||||
|        id="path44-3" | ||||
|        inkscape:connector-curvature="0" | ||||
|        sodipodi:nodetypes="cccccccccc" /> | ||||
|   </g> | ||||
| </svg> | ||||
| After Width: | Height: | Size: 2 KiB | 
| Before Width: | Height: | Size: 18 KiB | 
| Before Width: | Height: | Size: 15 KiB | 
							
								
								
									
										65
									
								
								galerie/static/galerie/prvky/predchozi.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						|  | @ -0,0 +1,65 @@ | |||
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||||
| <svg | ||||
|    xmlns:dc="http://purl.org/dc/elements/1.1/" | ||||
|    xmlns:cc="http://creativecommons.org/ns#" | ||||
|    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | ||||
|    xmlns:svg="http://www.w3.org/2000/svg" | ||||
|    xmlns="http://www.w3.org/2000/svg" | ||||
|    xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | ||||
|    xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | ||||
|    width="25.135418mm" | ||||
|    height="42.333332mm" | ||||
|    viewBox="0 0 25.135418 42.333331" | ||||
|    version="1.1" | ||||
|    id="svg851" | ||||
|    sodipodi:docname="predchozi.svg" | ||||
|    inkscape:version="0.92.4 (5da689c313, 2019-01-14)"> | ||||
|   <sodipodi:namedview | ||||
|      pagecolor="#ffffff" | ||||
|      bordercolor="#666666" | ||||
|      borderopacity="1" | ||||
|      objecttolerance="10" | ||||
|      gridtolerance="10" | ||||
|      guidetolerance="10" | ||||
|      inkscape:pageopacity="0" | ||||
|      inkscape:pageshadow="2" | ||||
|      inkscape:window-width="1850" | ||||
|      inkscape:window-height="1136" | ||||
|      id="namedview7" | ||||
|      showgrid="true" | ||||
|      inkscape:zoom="4.1719301" | ||||
|      inkscape:cx="124.03002" | ||||
|      inkscape:cy="97.874031" | ||||
|      inkscape:window-x="70" | ||||
|      inkscape:window-y="27" | ||||
|      inkscape:window-maximized="1" | ||||
|      inkscape:current-layer="svg851"> | ||||
|     <inkscape:grid | ||||
|        type="xygrid" | ||||
|        id="grid833" /> | ||||
|   </sodipodi:namedview> | ||||
|   <defs | ||||
|      id="defs845" /> | ||||
|   <metadata | ||||
|      id="metadata848"> | ||||
|     <rdf:RDF> | ||||
|       <cc:Work | ||||
|          rdf:about=""> | ||||
|         <dc:format>image/svg+xml</dc:format> | ||||
|         <dc:type | ||||
|            rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> | ||||
|         <dc:title></dc:title> | ||||
|       </cc:Work> | ||||
|     </rdf:RDF> | ||||
|   </metadata> | ||||
|   <g | ||||
|      id="layer1" | ||||
|      transform="matrix(1.0282842,0,0,1,-86.319083,-88.415315)"> | ||||
|     <path | ||||
|        d="m 98.096584,101.64448 1.286528,1.32292 -5.660724,5.82083 h 13.379892 v 1.5875 H 93.722388 l 5.660724,5.82083 -1.286528,1.32292 -7.719171,-7.9375 z" | ||||
|        style="fill:#e84e10;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.23177969" | ||||
|        id="path44-3" | ||||
|        inkscape:connector-curvature="0" | ||||
|        sodipodi:nodetypes="cccccccccc" /> | ||||
|   </g> | ||||
| </svg> | ||||
| After Width: | Height: | Size: 2 KiB | 
|  | @ -1,13 +1,13 @@ | |||
| # coding: utf-8 | ||||
| 
 | ||||
| from django.conf.urls import include, url | ||||
| from django.urls import path | ||||
| from . import views | ||||
| 
 | ||||
| urlpatterns = [ | ||||
|     url(r'^(?P<pk>\d+)/$', views.nahled), | ||||
|     url(r'^(?P<pk>\d+)/(?P<fotka>\d+)/$', views.detail), | ||||
|     url(r'^(?P<galerie>\d+)/new/$', views.new_galerie), | ||||
|     url(r'^(?P<galerie>\d+)/plus/(?P<subgalerie>\d+)/$', views.plus_galerie), | ||||
|     url(r'^(?P<galerie>\d+)/minus/(?P<subgalerie>\d+)/$', views.minus_galerie), | ||||
| 	path('<int:pk>/', views.nahled), | ||||
| 	path('<int:pk>/<int:fotka>/', views.detail), | ||||
| 	path('<int:galerie>/new/', views.new_galerie), | ||||
| 	path('<int:galerie>/plus/<int:subgalerie>/', views.plus_galerie), | ||||
| 	path('<int:galerie>/minus/<int:subgalerie>/', views.minus_galerie), | ||||
| ] | ||||
| 
 | ||||
|  |  | |||
|  | @ -160,7 +160,6 @@ def detail(request, pk, fotka, soustredeni): | |||
| 		 'cesta': cesta_od_korene(galerie), | ||||
| 		}) | ||||
| 
 | ||||
| 
 | ||||
| def new_galerie(request, galerie, soustredeni): | ||||
| 
 | ||||
| 	# zjistime k jakemu soustredeni se vaze nove vytvarena galerie | ||||
|  |  | |||
							
								
								
									
										16
									
								
								init_local.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						|  | @ -0,0 +1,16 @@ | |||
| #!/bin/sh | ||||
| 
 | ||||
| set -e # Spadni pokud něco spadne | ||||
| 
 | ||||
| # Check venvu | ||||
| # NOTE: zkontroluje i správnou složku -- existencí Makefilu | ||||
| make venv_check | ||||
| 
 | ||||
| # Vygenerujeme testdata | ||||
| ./manage.py testdata | ||||
| 
 | ||||
| # Nahrajeme statický obsah modelů | ||||
| ./manage.py loaddata flat.json sitetree_new.json | ||||
| 
 | ||||
| # Posbíráme statické soubory | ||||
| ./manage.py collectstatic | ||||
|  | @ -50,7 +50,7 @@ class Migration(migrations.Migration): | |||
|                 ('cas', models.DateTimeField(help_text=b'\xc4\x8cas zad\xc3\xa1n\xc3\xad koment\xc3\xa1\xc5\x99e', verbose_name='\u010das koment\xe1\u0159e')), | ||||
|                 ('autor', models.TextField(help_text=b'Autor koment\xc3\xa1\xc5\x99e', verbose_name='autor koment\xe1\u0159e', blank=True)), | ||||
|                 ('text', models.TextField(help_text=b'Text koment\xc3\xa1\xc5\x99e', verbose_name='text koment\xe1\u0159e', blank=True)), | ||||
|                 ('oprava', models.ForeignKey(to='korektury.Oprava')), | ||||
|                 ('oprava', models.ForeignKey(to='korektury.Oprava', on_delete=models.CASCADE)), | ||||
|             ], | ||||
|             options={ | ||||
|                 'ordering': ['cas'], | ||||
|  |  | |||
|  | @ -19,7 +19,7 @@ class Migration(migrations.Migration): | |||
|                 ('cas', models.DateTimeField(default=django.utils.timezone.now, help_text=b'\xc4\x8cas zad\xc3\xa1n\xc3\xad koment\xc3\xa1\xc5\x99e', verbose_name='\u010das koment\xe1\u0159e')), | ||||
|                 ('autor', models.TextField(help_text=b'Autor koment\xc3\xa1\xc5\x99e', verbose_name='autor koment\xe1\u0159e', blank=True)), | ||||
|                 ('text', models.TextField(help_text=b'Text koment\xc3\xa1\xc5\x99e', verbose_name='text koment\xe1\u0159e', blank=True)), | ||||
|                 ('oprava', models.ForeignKey(to='korektury.Oprava')), | ||||
|                 ('oprava', models.ForeignKey(to='korektury.Oprava', on_delete=models.CASCADE)), | ||||
|             ], | ||||
|             options={ | ||||
|                 'ordering': ['cas'], | ||||
|  |  | |||
|  | @ -14,7 +14,7 @@ class Migration(migrations.Migration): | |||
|         migrations.AddField( | ||||
|             model_name='oprava', | ||||
|             name='pdf', | ||||
|             field=models.ForeignKey(default=-1, to='korektury.KorekturovanePDF'), | ||||
|             field=models.ForeignKey(default=-1, to='korektury.KorekturovanePDF', on_delete=models.CASCADE), | ||||
|             preserve_default=True, | ||||
|         ), | ||||
|     ] | ||||
|  |  | |||
|  | @ -15,11 +15,11 @@ class Migration(migrations.Migration): | |||
|         migrations.AddField( | ||||
|             model_name='komentar', | ||||
|             name='autor_org', | ||||
|             field=models.ForeignKey(blank=True, to='seminar.Organizator', help_text='Autor koment\xe1\u0159e', null=True), | ||||
|             field=models.ForeignKey(blank=True, to='seminar.Organizator', help_text='Autor koment\xe1\u0159e', null=True, on_delete=models.CASCADE), | ||||
|         ), | ||||
|         migrations.AddField( | ||||
|             model_name='oprava', | ||||
|             name='autor_org', | ||||
|             field=models.ForeignKey(blank=True, to='seminar.Organizator', help_text=b'Autor opravy', null=True), | ||||
|             field=models.ForeignKey(blank=True, to='seminar.Organizator', help_text=b'Autor opravy', null=True, on_delete=models.CASCADE), | ||||
|         ), | ||||
|     ] | ||||
|  |  | |||
|  | @ -18,10 +18,10 @@ def transform_autor(apps, schema_editor): | |||
|                 oprava.autor_org = org | ||||
|                 oprava.save() | ||||
|             except: | ||||
|                 print "Org nenalezen -- mažu korekturu" | ||||
|                 print("Org nenalezen -- mažu korekturu") | ||||
| #                oprava.delete() | ||||
|         else: | ||||
|             print "Org nenalezen -- mažu korekturu" | ||||
|             print("Org nenalezen -- mažu korekturu") | ||||
|             oprava.delete() | ||||
| 
 | ||||
|     # preorgovani komentaru | ||||
|  | @ -35,10 +35,10 @@ def transform_autor(apps, schema_editor): | |||
|                 komentar.autor_org = org | ||||
|                 komentar.save() | ||||
|             except: | ||||
|                 print "Org nenalezen -- mažu korekturu" | ||||
|                 print("Org nenalezen -- mažu korekturu") | ||||
| #                oprava.delete() | ||||
|         else: | ||||
|             print "Org nenalezen -- mažu korekturu" | ||||
|             print("Org nenalezen -- mažu korekturu") | ||||
|             komentar.delete() | ||||
| 
 | ||||
| def back(apps, schema_editor): | ||||
|  |  | |||
|  | @ -20,6 +20,6 @@ class Migration(migrations.Migration): | |||
|                   to='seminar.Organizator', | ||||
|                   help_text=b'Zodpov\xc4\x9bdn\xc3\xbd\ | ||||
|                           organiz\xc3\xa1tor za obsah', | ||||
|                                     null=True), | ||||
|                   null=True, on_delete=models.CASCADE), | ||||
|         ), | ||||
|     ] | ||||
|  |  | |||
|  | @ -14,6 +14,6 @@ class Migration(migrations.Migration): | |||
|         migrations.AlterField( | ||||
|             model_name='korekturovanepdf', | ||||
|             name='org', | ||||
|             field=models.ForeignKey(default=None, blank=True, to='seminar.Organizator', help_text=b'Zodpov\xc4\x9bdn\xc3\xbd organiz\xc3\xa1tor za obsah', null=True), | ||||
|             field=models.ForeignKey(default=None, blank=True, to='seminar.Organizator', help_text=b'Zodpov\xc4\x9bdn\xc3\xbd organiz\xc3\xa1tor za obsah', null=True, on_delete=models.CASCADE), | ||||
|         ), | ||||
|     ] | ||||
|  |  | |||
							
								
								
									
										77
									
								
								korektury/migrations/0016_auto_20190430_2340.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						|  | @ -0,0 +1,77 @@ | |||
| # -*- coding: utf-8 -*- | ||||
| # Generated by Django 1.11.20 on 2019-04-30 21:40 | ||||
| from __future__ import unicode_literals | ||||
| 
 | ||||
| from django.db import migrations, models | ||||
| import django.db.models.deletion | ||||
| import django.utils.timezone | ||||
| 
 | ||||
| 
 | ||||
| class Migration(migrations.Migration): | ||||
| 
 | ||||
|     dependencies = [ | ||||
|         ('korektury', '0015_auto_20161004_2005'), | ||||
|     ] | ||||
| 
 | ||||
|     operations = [ | ||||
|         migrations.AlterField( | ||||
|             model_name='komentar', | ||||
|             name='cas', | ||||
|             field=models.DateTimeField(default=django.utils.timezone.now, help_text='Čas zadání komentáře', verbose_name='čas komentáře'), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name='komentar', | ||||
|             name='text', | ||||
|             field=models.TextField(blank=True, help_text='Text komentáře', verbose_name='text komentáře'), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name='korekturovanepdf', | ||||
|             name='cas', | ||||
|             field=models.DateTimeField(default=django.utils.timezone.now, help_text='Čas vložení PDF', verbose_name='čas vložení PDF'), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name='korekturovanepdf', | ||||
|             name='komentar', | ||||
|             field=models.TextField(blank=True, help_text='Komentář ke korekturovanému PDF (např. na co se zaměřit)', verbose_name='komentář k PDF'), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name='korekturovanepdf', | ||||
|             name='nazev', | ||||
|             field=models.CharField(blank=True, help_text='Název (např. 22.1 verze 4) korekturovaného PDF', max_length=50, verbose_name='název PDF'), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name='korekturovanepdf', | ||||
|             name='org', | ||||
|             field=models.ForeignKey(blank=True, default=None, help_text='Zodpovědný organizátor za obsah', null=True, on_delete=django.db.models.deletion.CASCADE, to='seminar.Organizator'), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name='korekturovanepdf', | ||||
|             name='status', | ||||
|             field=models.CharField(choices=[('pridavani', 'Přidávání korektur'), ('zanaseni', 'Korektury jsou zanášeny'), ('zastarale', 'Stará verze, nekorigovat')], default='pridavani', max_length=16, verbose_name='stav PDF'), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name='korekturovanepdf', | ||||
|             name='stran', | ||||
|             field=models.IntegerField(default=0, help_text='Počet stran PDF', verbose_name='počet stran'), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name='oprava', | ||||
|             name='autor', | ||||
|             field=models.ForeignKey(blank=True, help_text='Autor opravy', null=True, on_delete=django.db.models.deletion.CASCADE, to='seminar.Organizator'), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name='oprava', | ||||
|             name='status', | ||||
|             field=models.CharField(choices=[('k_oprave', 'K opravě'), ('opraveno', 'Opraveno'), ('neni_chyba', 'Není chyba'), ('k_zaneseni', 'K zanesení do TeXu')], default='k_oprave', max_length=16, verbose_name='stav opravy'), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name='oprava', | ||||
|             name='strana', | ||||
|             field=models.IntegerField(help_text='Strana s opravou (od 0)', verbose_name='strana s opravou'), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name='oprava', | ||||
|             name='text', | ||||
|             field=models.TextField(blank=True, help_text='Text opravy', verbose_name='text opravy'), | ||||
|         ), | ||||
|     ] | ||||
							
								
								
									
										36
									
								
								korektury/migrations/0017_auto_20190610_2358.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						|  | @ -0,0 +1,36 @@ | |||
| # -*- coding: utf-8 -*- | ||||
| # Generated by Django 1.11.21 on 2019-06-10 21:58 | ||||
| from __future__ import unicode_literals | ||||
| 
 | ||||
| from django.db import migrations, models | ||||
| import django.db.models.deletion | ||||
| 
 | ||||
| 
 | ||||
| class Migration(migrations.Migration): | ||||
| 
 | ||||
|     dependencies = [ | ||||
|         ('korektury', '0016_auto_20190430_2340'), | ||||
|     ] | ||||
| 
 | ||||
|     operations = [ | ||||
|         migrations.AlterField( | ||||
|             model_name='komentar', | ||||
|             name='autor', | ||||
|             field=models.ForeignKey(blank=True, help_text='Autor komentáře', null=True, on_delete=django.db.models.deletion.SET_NULL, to='seminar.Organizator'), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name='korekturovanepdf', | ||||
|             name='org', | ||||
|             field=models.ForeignKey(blank=True, default=None, help_text='Zodpovědný organizátor za obsah', null=True, on_delete=django.db.models.deletion.SET_NULL, to='seminar.Organizator'), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name='oprava', | ||||
|             name='autor', | ||||
|             field=models.ForeignKey(blank=True, help_text='Autor opravy', null=True, on_delete=django.db.models.deletion.SET_NULL, to='seminar.Organizator'), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name='oprava', | ||||
|             name='pdf', | ||||
|             field=models.ForeignKey(default=-1, on_delete=django.db.models.deletion.PROTECT, to='korektury.KorekturovanePDF'), | ||||
|         ), | ||||
|     ] | ||||
|  | @ -3,8 +3,7 @@ import os | |||
| from django.db import models | ||||
| from django.utils import timezone | ||||
| from django.conf import settings | ||||
| from django.utils.encoding import python_2_unicode_compatible | ||||
| from django.utils.encoding import force_unicode | ||||
| from django.utils.encoding import force_text | ||||
| from django.core.exceptions import ObjectDoesNotExist | ||||
| from django.utils.text import get_valid_filename | ||||
| 
 | ||||
|  | @ -29,7 +28,6 @@ def generate_filename(self, filename): | |||
| 
 | ||||
| 
 | ||||
| #@reversion.register(ignore_duplicates=True) | ||||
| #@python_2_unicode_compatible | ||||
| class KorekturovanePDF(models.Model): | ||||
| 	class Meta: | ||||
| 		ordering = ['-cas'] | ||||
|  | @ -50,8 +48,7 @@ class KorekturovanePDF(models.Model): | |||
| 
 | ||||
| 	org = models.ForeignKey(Organizator, blank=True, | ||||
| 		help_text='Zodpovědný organizátor za obsah', | ||||
|                             null=True, | ||||
|                             default=None) | ||||
| 		null=True, default=None, on_delete=models.SET_NULL) | ||||
| 
 | ||||
| 	stran = models.IntegerField(u'počet stran', help_text='Počet stran PDF', | ||||
| 								default=0) | ||||
|  | @ -122,7 +119,6 @@ class KorekturovanePDF(models.Model): | |||
| 		self.convert() | ||||
| 
 | ||||
| @reversion.register(ignore_duplicates=True) | ||||
| @python_2_unicode_compatible | ||||
| class Oprava(models.Model): | ||||
| 	class Meta: | ||||
| 		db_table = 'opravy' | ||||
|  | @ -133,7 +129,7 @@ class Oprava(models.Model): | |||
| 	#Interní ID | ||||
| 	id = models.AutoField(primary_key = True) | ||||
| 
 | ||||
|     pdf = models.ForeignKey(KorekturovanePDF, default=-1) | ||||
| 	pdf = models.ForeignKey(KorekturovanePDF, default=-1, on_delete=models.PROTECT) | ||||
| 
 | ||||
| 	strana = models.IntegerField(u'strana s opravou', help_text='Strana s opravou (od 0)') | ||||
| 
 | ||||
|  | @ -155,7 +151,7 @@ class Oprava(models.Model): | |||
| 
 | ||||
| 	autor = models.ForeignKey(Organizator, blank = True, | ||||
| 			help_text='Autor opravy', | ||||
|             null = True) | ||||
| 			null = True, on_delete=models.SET_NULL) | ||||
| 	 | ||||
| 	text = models.TextField(u'text opravy',blank = True, help_text='Text opravy') | ||||
| 
 | ||||
|  | @ -164,12 +160,11 @@ class Oprava(models.Model): | |||
| #			setattr(self,k,v) | ||||
| 
 | ||||
| 	def __str__(self): | ||||
|         return force_unicode(u'%s od %s: %s'%(self.status,self.autor,self.text)) | ||||
| 		return '{} od {}: {}'.format(self.status,self.autor,self.text) | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| @reversion.register(ignore_duplicates=True) | ||||
| @python_2_unicode_compatible | ||||
| class Komentar(models.Model): | ||||
| 	class Meta: | ||||
| 		db_table = 'komentare' | ||||
|  | @ -182,15 +177,15 @@ class Komentar(models.Model): | |||
| 
 | ||||
| 	cas = models.DateTimeField(u'čas komentáře',default=timezone.now,help_text = 'Čas zadání komentáře') | ||||
| 
 | ||||
|     oprava = models.ForeignKey(Oprava) | ||||
| 	oprava = models.ForeignKey(Oprava, on_delete=models.CASCADE) | ||||
| 	autor = models.ForeignKey(Organizator, blank = True, | ||||
| 			help_text = u'Autor komentáře', | ||||
|             null = True) | ||||
| 			null = True, on_delete=models.SET_NULL) | ||||
| 	 | ||||
| 	text = models.TextField(u'text komentáře',blank = True, help_text='Text komentáře') | ||||
| 
 | ||||
| 	def __str__(self): | ||||
|         return force_unicode(u'%s od %s: %s'%(self.cas,self.autor,self.text)) | ||||
| 		return '{} od {}: {}'.format(self.cas,self.autor,self.text) | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
|  | @ -13,72 +13,46 @@ body, | |||
| 
 | ||||
| img{background:white;} | ||||
| 
 | ||||
| /* Barvy korektur */ | ||||
| .k_oprave {  | ||||
| 	--rgb: 255, 0, 0; | ||||
| } | ||||
| .opraveno { | ||||
| 	--rgb: 0, 0, 255; | ||||
| } | ||||
| .neni_chyba { | ||||
| 	--rgb: 128, 128, 128; | ||||
| } | ||||
| .k_zaneseni { | ||||
| 	--rgb: 0, 255, 0; | ||||
| } | ||||
| 
 | ||||
| .pointer-hi,  | ||||
| .pointer,  | ||||
| .pointer-wontfix,  | ||||
| .pointer-wontfix-hi,  | ||||
| .pointer-ready, | ||||
| .pointer-ready-hi, | ||||
| .pointer-done,  | ||||
| .pointer-done-hi { | ||||
| .pointer{  | ||||
| 	position:absolute; | ||||
| 	/*border-bottom-left-radius: 10px; */ | ||||
| 	border-left: 2px solid yellow; | ||||
| 	border-bottom: 2px solid yellow; | ||||
| } | ||||
| 
 | ||||
| .pointer-done-hi,  | ||||
| .pointer-wontfix-hi,  | ||||
| .pointer-ready-hi, | ||||
| .pointer-hi { | ||||
| 	border-width: 3px; | ||||
| 	border-color: rgb(var(--rgb),var(--alpha)); | ||||
| } | ||||
| 
 | ||||
| .pointer { | ||||
| 	border-color: #F00; /*IE*/ | ||||
| 	border-color: rgba(255, 0, 0, 0.35); | ||||
| 	border-width: 1px; | ||||
| 	--alpha: 0.35;	 | ||||
| } | ||||
| 
 | ||||
| .pointer-hi { | ||||
| 	border-color: #F00; /*IE*/ | ||||
| 	border-color: rgba(255, 0, 0, 1); | ||||
| } | ||||
| .pointer-done { | ||||
| 	border-color: #00F; /*IE*/ | ||||
| 	border-color: rgba(0, 0, 255, 0.2); | ||||
| } | ||||
| .pointer-done-hi { | ||||
| 	border-color: #00F; /*IE*/ | ||||
| 	border-color: rgba(0, 0, 255, 1); | ||||
| } | ||||
| .pointer-wontfix { | ||||
| 	border-color: #000; /*IE*/ | ||||
| 	border-color: rgba(128, 128, 128, 0.2); | ||||
| } | ||||
| .pointer-wontfix-hi { | ||||
| 	border-color: #000; /*IE*/ | ||||
| 	border-color: rgba(128, 128, 128, 1); | ||||
| } | ||||
| .pointer-ready { | ||||
| 	border-color: #0F0; /*IE*/ | ||||
| 	border-color: rgba(0, 255, 0, 0.2); | ||||
| } | ||||
| .pointer-ready-hi { | ||||
| 	border-color: #0F0; /*IE*/ | ||||
| 	border-color: rgba(0, 255, 0, 1); | ||||
| 	border-width: 3px; | ||||
| 	--alpha: 1; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| .box:hover, | ||||
| .box-done:hover, | ||||
| .box-ready:hover, | ||||
| .box-wontfix:hover{ | ||||
| 
 | ||||
| .box:hover{ | ||||
| 	border-width:3px; | ||||
| 	margin: 0px; | ||||
| } | ||||
| .box, | ||||
| .box-done, | ||||
| .box-ready, | ||||
| .box-wontfix { | ||||
| .box { | ||||
| 	margin: 1px; | ||||
| 	background-color: white; | ||||
| 	width:300px; | ||||
|  | @ -86,18 +60,7 @@ img{background:white;} | |||
| 	padding: 3px; | ||||
| 	border: 2px solid black; | ||||
| 	border-radius: 10px; | ||||
| } | ||||
| .box { | ||||
| 	border-color: red; | ||||
| } | ||||
| .box-done { | ||||
| 	border-color: blue; | ||||
| } | ||||
| .box-ready { | ||||
| 	border-color: rgba(0,255,0,1); | ||||
| } | ||||
| .box-wontfix { | ||||
| 	border-color: grey; | ||||
| 	border-color: rgb(var(--rgb)); | ||||
| } | ||||
| form { | ||||
| 	display:inline; | ||||
|  |  | |||
|  | @ -65,6 +65,12 @@ function place_comments_one_div(img_id, comments) | |||
| 	} | ||||
| } | ||||
| 
 | ||||
| function place_comments() { | ||||
|     for (var i=0; i < comments.length-1; i++) { | ||||
| 	    place_comments_one_div(comments[i][0], comments[i][1]) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| // ctrl-enter submits form
 | ||||
| function textarea_onkey(ev) | ||||
| { | ||||
|  | @ -212,45 +218,22 @@ function show_form(img_id, dx, dy, id, text, action) { | |||
| 	textarea.focus(); | ||||
| 
 | ||||
| 	return true; | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| function box_onmouseover(box, stat) | ||||
| function box_onmouseover(box) | ||||
| { | ||||
| 	var id = box.id; | ||||
| 	var pointer = document.getElementById(box.id + '-pointer'); | ||||
| 	switch (stat){ | ||||
| 		case 'done': | ||||
| 			pointer.className = 'pointer-done-hi'; | ||||
| 			break; | ||||
| 		case 'wontfix': | ||||
| 			pointer.className = 'pointer-wontfix-hi'; | ||||
| 			break; | ||||
| 		case 'ready': | ||||
| 			pointer.className = 'pointer-ready-hi'; | ||||
| 			break; | ||||
| 		default: | ||||
| 			pointer.className = 'pointer-hi'; | ||||
| 	} | ||||
| 	pointer.classList.remove('pointer'); | ||||
| 	pointer.classList.add('pointer-hi'); | ||||
| } | ||||
| 
 | ||||
| function box_onmouseout(box, stat) | ||||
| function box_onmouseout(box) | ||||
| { | ||||
| 	var id = box.id; | ||||
| 	var pointer = document.getElementById(box.id + '-pointer'); | ||||
| 	switch (stat){ | ||||
| 		case 'done': | ||||
| 			pointer.className = 'pointer-done'; | ||||
| 			break; | ||||
| 		case 'wontfix': | ||||
| 			pointer.className = 'pointer-wontfix'; | ||||
| 			break; | ||||
| 		case 'ready': | ||||
| 			pointer.className = 'pointer-ready'; | ||||
| 			break; | ||||
| 		default: | ||||
| 			pointer.className = 'pointer'; | ||||
| 	} | ||||
| 	pointer.classList.remove('pointer-hi'); | ||||
| 	pointer.classList.add('pointer'); | ||||
| } | ||||
| 
 | ||||
| function save_scroll(form) | ||||
|  | @ -261,6 +244,33 @@ function save_scroll(form) | |||
| 	return true; | ||||
| } | ||||
| 
 | ||||
| function toggle_corrections(aclass) | ||||
| { | ||||
| 	var stylesheets = document.styleSheets; | ||||
| 	var ssheet = null; | ||||
| 	for (var i=0;i<stylesheets.length; i++){ | ||||
| 		if (stylesheets[i].title === "opraf-css"){ | ||||
| 			ssheet = stylesheets[i]; | ||||
| 			break; | ||||
| 		} | ||||
| 	} | ||||
| 	if (! ssheet){ | ||||
| 		return;	 | ||||
| 	} | ||||
| 	for (var i=0;i<ssheet.cssRules.length;i++){ | ||||
| 		var rule = ssheet.cssRules[i];	 | ||||
| 		if (rule.selectorText === '.'+aclass){ | ||||
| 			if (rule.style.display === ""){ | ||||
| 				rule.style.display = "none"; | ||||
| 			} else { | ||||
| 				rule.style.display = ""; | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	place_comments(); | ||||
| 		 | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| String.prototype.unescapeHTML = function () {                                        | ||||
|         return(                                                                  | ||||
|  |  | |||
|  | @ -3,7 +3,7 @@ | |||
| <html> | ||||
| <head> | ||||
| 	<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> | ||||
|   <link rel="stylesheet" type="text/css" media="screen, projection" href="{% static "korektury/opraf.css"%}" /> | ||||
|   <link rel="stylesheet" title="opraf-css" type="text/css" media="screen, projection" href="{% static "korektury/opraf.css"%}" /> | ||||
|   <script src="{% static "korektury/opraf.js"%}"></script> | ||||
| 	<title>Korektury {{pdf.nazev}}</title> | ||||
| </head> | ||||
|  | @ -20,6 +20,29 @@ | |||
| 	          | | ||||
| 	<a href="/">hlavní stránka</a> | | ||||
| 	<a href="https://mam.mff.cuni.cz/wiki">wiki</a> | | ||||
| 	<hr /> | ||||
| 	Zobrazit:  | ||||
| 	<input type="checkbox"  | ||||
| 		id="k_oprave_checkbox"  | ||||
| 		name="k_oprave_checkbox"  | ||||
| 		onchange="toggle_corrections('k_oprave')" checked> | ||||
| 	<label for="k_oprave_checkbox">K opravě ({{k_oprave_cnt}})</label> | ||||
| 	<input type="checkbox" | ||||
| 		id="opraveno_checkbox" | ||||
| 		name="opraveno_checkbox"  | ||||
| 		onchange="toggle_corrections('opraveno')" checked> | ||||
| 	<label for="opraveno_checkbox">Opraveno ({{opraveno_cnt}})</label> | ||||
| 	<input type="checkbox" | ||||
| 		id="neni_chyba_checkbox" | ||||
| 		name="neni_chyba_checkbox" | ||||
| 		onchange="toggle_corrections('neni_chyba')" checked> | ||||
| 	<label for="neni_chyba_checkbox">Není chyba ({{neni_chyba_cnt}})</labe> | ||||
| 	<input type="checkbox" | ||||
| 		id="k_zaneseni_checkbox" | ||||
| 		name="k_zaneseni_checkbox" | ||||
| 		onchange="toggle_corrections('k_zaneseni')" checked> | ||||
| 	<label for="k_zaneseni_checkbox">K zanesení ({{k_zaneseni_cnt}})</labe> | ||||
| 
 | ||||
| 	<hr/> | ||||
| 
 | ||||
| 	<div id="commform-div"> | ||||
|  | @ -81,12 +104,12 @@ | |||
| 	{% for o in opravy %} | ||||
| 	<div onclick='img_click(this,event)' | ||||
| 		id='op{{o.id}}-pointer' | ||||
| 		class='pointer{%if o.status == 'opraveno' %}-done{% elif o.status == 'neni_chyba' %}-wontfix{% elif o.status == 'k_zaneseni' %}-ready{% endif %}'> | ||||
| 		class='pointer {{o.status}}'> | ||||
| 	</div> | ||||
| 	<div name='op{{o.id}}' id='op{{o.id}}'  | ||||
| 	    class='box{%if o.status == 'opraveno' %}-done{% elif o.status == 'neni_chyba' %}-wontfix{% elif o.status == 'k_zaneseni' %}-ready{% endif %}'  | ||||
| 	    onmouseover='box_onmouseover(this,{% if o.status == 'opraveno' %}"done"{% elif o.status == 'neni_chyba' %}"wontfix"{% elif o.status == 'k_zaneseni' %}"ready"{% else %}""{% endif %})'  | ||||
| 	    onmouseout='box_onmouseout(this,  {% if o.status == 'opraveno' %}"done"{% elif o.status == 'neni_chyba' %}"wontfix"{% elif o.status == 'k_zaneseni' %}"ready"{% else %}""{% endif %})'>  | ||||
| 	    class='box {{o.status}}'  | ||||
| 	    onmouseover='box_onmouseover(this)'  | ||||
| 	    onmouseout='box_onmouseout(this)'>  | ||||
| 
 | ||||
|     	<div class='corr-header'>  | ||||
| 			<span class='author' id='op{{o.id}}-autor'>{{o.autor}}</span> | ||||
|  | @ -211,11 +234,6 @@ | |||
| 		["img-{{s.strana}}", [{% for o in s.op_id %}["op{{o.id}}",{{o.x}},{{o.y}}],{% endfor %}[]]], | ||||
| 	{% endfor %} | ||||
| 	[]] | ||||
|         function place_comments() { | ||||
|             for (var i=0; i < comments.length-1; i++) { | ||||
|                     place_comments_one_div(comments[i][0], comments[i][1]) | ||||
|             } | ||||
|         } | ||||
| 	{% if scroll %} | ||||
| 		window.scrollTo(0,{{scroll}}); | ||||
| 	{% endif %} | ||||
|  |  | |||
|  | @ -21,7 +21,14 @@ | |||
| 
 | ||||
| <ul> | ||||
|   {% for pdf in object_list  %} | ||||
| 	  <li><span {% if pdf.status == 'zanaseni'%} class="comitting-text" {% elif pdf.status == 'zastarale' %} class="deprecated-text" {% endif %}> <b>{{ pdf.nazev }}</b> <i>{{pdf.komentar}}</i> <a href="/korektury/{{pdf.id}}">{{pdf.pdf.name}}</a> </span> </li> | ||||
| 	  <li><span {% if pdf.status == 'zanaseni'%} class="comitting-text" {% elif pdf.status == 'zastarale' %} class="deprecated-text" {% endif %}> | ||||
| 	  	<b>{{ pdf.nazev }}</b> | ||||
| 		<i>{{pdf.komentar}}</i> | ||||
| 		<a href="/korektury/{{pdf.id}}">{{pdf.pdf.name}}</a> | ||||
| 		(k opravě: {{pdf.k_oprave_cnt}},  | ||||
| 		opraveno: {{pdf.opraveno_cnt}}, | ||||
| 		není chyba: {{pdf.neni_chyba_cnt}}, | ||||
| 		k zanesení: {{pdf.k_zaneseni_cnt}}) </span> </li> | ||||
|   {% empty %} | ||||
|     <li> Nejsou žádné dokumenty ke korekturování. | ||||
|   {% endfor %} | ||||
|  |  | |||
|  | @ -1,13 +1,12 @@ | |||
| from django.conf.urls import *  # NOQA | ||||
| from django.conf.urls import url | ||||
| from django.urls import path | ||||
| from django.contrib.auth.decorators import user_passes_test | ||||
| from . import views | ||||
| 
 | ||||
| staff_member_required = user_passes_test(lambda u: u.is_staff) | ||||
| 
 | ||||
| urlpatterns = [ | ||||
|     url(r'^korektury/$', staff_member_required(views.KorekturyAktualniListView.as_view()), name='korektury-list'), | ||||
|     url(r'^korektury/zastarale/$', staff_member_required(views.KorekturyZastaraleListView.as_view()), name='korektury-list-zastarale'), | ||||
|     url(r'^korektury/(?P<pdf>\d+)/$', staff_member_required(views.KorekturyView.as_view()), name='korektury'), | ||||
|     url(r'^korektury/help/', staff_member_required(views.KorekturyHelpView.as_view()), name='korektury-help'), | ||||
| 	path('korektury/', staff_member_required(views.KorekturyAktualniListView.as_view()), name='korektury-list'), | ||||
| 	path('korektury/zastarale/', staff_member_required(views.KorekturyZastaraleListView.as_view()), name='korektury-list'), | ||||
| 	path('korektury/<int:pdf>/', staff_member_required(views.KorekturyView.as_view()), name='korektury'), | ||||
| 	path('korektury/help/', staff_member_required(views.KorekturyHelpView.as_view()), name='korektury-help'), | ||||
| ] | ||||
|  |  | |||
|  | @ -5,6 +5,7 @@ from django.utils.translation import ugettext as _ | |||
| from django.conf import settings | ||||
| from django.http import HttpResponseForbidden | ||||
| from django.core.mail import send_mail | ||||
| from django.db.models import Count,Q | ||||
| 
 | ||||
| from .models import Oprava,Komentar,KorekturovanePDF, Organizator | ||||
| from .forms import OpravaForm | ||||
|  | @ -12,13 +13,20 @@ from .forms import OpravaForm | |||
| import subprocess | ||||
| import shutil | ||||
| import os | ||||
| import unicodedata | ||||
| 
 | ||||
| class KorekturyHelpView(generic.TemplateView): | ||||
| 	template_name = 'korektury/help.html' | ||||
| 
 | ||||
| 
 | ||||
| class KorekturyListView(generic.ListView): | ||||
| 	model = KorekturovanePDF | ||||
| 	# Nefunguje, filtry se vubec nepouziji | ||||
| 	queryset = KorekturovanePDF.objects.annotate( | ||||
| 		k_oprave_cnt=Count('oprava',distinct=True,filter=Q(oprava__status='k_oprave')), | ||||
| 		opraveno_cnt=Count('oprava',distinct=True,filter=Q(oprava__status='opraveno')), | ||||
| 		neni_chyba_cnt=Count('oprava',distinct=True,filter=Q(oprava__status='neni_chyba')), | ||||
| 		k_zaneseni_cnt=Count('oprava',distinct=True,filter=Q(oprava__status='k_zaneseni')), | ||||
| 		) | ||||
| 	template_name = 'korektury/seznam.html' | ||||
| 
 | ||||
| class KorekturyAktualniListView(KorekturyListView): | ||||
|  | @ -57,7 +65,7 @@ class KorekturyView(generic.TemplateView): | |||
| 		# prirazeni autora podle prihlaseni | ||||
| 		autor_user = request.user | ||||
| 		# pokud existuje ucet (user), ale neni to organizator = 403 | ||||
|         autor = Organizator.objects.filter(user=autor_user).first() | ||||
| 		autor = Organizator.objects.filter(osoba__user=autor_user).first() | ||||
| 		if not autor: | ||||
| 			return HttpResponseForbidden() | ||||
| 
 | ||||
|  | @ -65,7 +73,7 @@ class KorekturyView(generic.TemplateView): | |||
| 			scroll = 0 | ||||
| 
 | ||||
| 		action = q.get('action') | ||||
|         if (action == u''):  # Přidej | ||||
| 		if (action == ''):  # Přidej | ||||
| 			x = int(q.get('x')) | ||||
| 			y = int(q.get('y')) | ||||
| 			text = q.get('txt') | ||||
|  | @ -75,62 +83,62 @@ class KorekturyView(generic.TemplateView): | |||
| 			op = Oprava(x=x,y=y, autor=autor, text=text, strana=strana,pdf = pdf) | ||||
| 			op.save() | ||||
| 			self.send_email_notification_komentar(op, autor, text) | ||||
|         elif (action == u'del'): | ||||
| 		elif (action == 'del'): | ||||
| 			id = int(q.get('id')) | ||||
| 			op = Oprava.objects.get(id=id) | ||||
| 			op.delete() | ||||
|         elif (action == u'update'): | ||||
| 		elif (action == 'update'): | ||||
| 			id = int(q.get('id')) | ||||
| 			op = Oprava.objects.get(id=id) | ||||
| 			text = q.get('txt') | ||||
| 			op.autor = autor | ||||
| 			op.text = text | ||||
| 			op.save() | ||||
|         elif (action == u'undone'): | ||||
| 		elif (action == 'undone'): | ||||
| 			id = int(q.get('id')) | ||||
| 			op = Oprava.objects.get(id=id) | ||||
| 			op.status = op.STATUS_K_OPRAVE | ||||
| 			op.save() | ||||
|         elif (action == u'done'): | ||||
| 		elif (action == 'done'): | ||||
| 			id = int(q.get('id')) | ||||
| 			op = Oprava.objects.get(id=id) | ||||
| 			op.status = op.STATUS_OPRAVENO | ||||
| 			op.save() | ||||
| 	elif (action == u'ready'): | ||||
| 		elif (action == 'ready'): | ||||
| 			id = int(q.get('id')) | ||||
| 			op = Oprava.objects.get(id=id) | ||||
| 			op.status = op.STATUS_K_ZANESENI | ||||
| 			op.save() | ||||
|         elif (action == u'wontfix'): | ||||
| 		elif (action == 'wontfix'): | ||||
| 			id = int(q.get('id')) | ||||
| 			op = Oprava.objects.get(id=id) | ||||
| 			op.status = op.STATUS_NENI_CHYBA | ||||
| 			op.save() | ||||
|         elif (action == u'comment'): | ||||
| 		elif (action == 'comment'): | ||||
| 			id = int(q.get('id')) | ||||
| 			op = Oprava.objects.get(id=id) | ||||
| 			text = q.get('txt') | ||||
| 			kom = Komentar(oprava=op,autor=autor,text=text) | ||||
| 			kom.save() | ||||
| 			self.send_email_notification_komentar(op, autor, text) | ||||
|         elif (action == u'update-comment'): | ||||
| 		elif (action == 'update-comment'): | ||||
| 			id = int(q.get('id')) | ||||
| 			kom = Komentar.objects.get(id=id) | ||||
| 			text = q.get('txt') | ||||
| 			kom.text = text | ||||
| 			kom.autor = autor | ||||
| 			kom.save() | ||||
|         elif (action == u'del-comment'): | ||||
| 		elif (action == 'del-comment'): | ||||
| 			id = int(q.get('id')) | ||||
| 			kom = Komentar.objects.get(id=id) | ||||
| 			kom.delete() | ||||
|         elif (action == u'set-state'): | ||||
| 		elif (action == 'set-state'): | ||||
| 			pdf = KorekturovanePDF.objects.get(id=q.get('pdf')) | ||||
|             if (q.get('state') == u'adding'): | ||||
| 			if (q.get('state') == 'adding'): | ||||
| 				pdf.status = pdf.STATUS_PRIDAVANI | ||||
|             elif (q.get('state') == u'comitting'): | ||||
| 			elif (q.get('state') == 'comitting'): | ||||
| 				pdf.status = pdf.STATUS_ZANASENI | ||||
|             elif (q.get('state') == u'deprecated'): | ||||
| 			elif (q.get('state') == 'deprecated'): | ||||
| 				pdf.status = pdf.STATUS_ZASTARALE | ||||
| 			pdf.save() | ||||
| 		context = self.get_context_data() | ||||
|  | @ -146,7 +154,7 @@ class KorekturyView(generic.TemplateView): | |||
| 		# parametry e-mailu | ||||
| 		odkaz = "https://mam.mff.cuni.cz/korektury/{}/".format(oprava.pdf.pk) | ||||
| 		from_email = 'korekturovatko@mam.mff.cuni.cz' | ||||
|         subject = u'Nová korektura od {} v {}'.format(autor, | ||||
| 		subject = 'Nová korektura od {} v {}'.format(autor, | ||||
| 													 oprava.pdf.nazev) | ||||
| 		text = u"Text komentáře:\n\n{}\n\n=== Konec textu komentáře ===\n\ | ||||
| 				\nodkaz do korekturovátka: {}\n\ | ||||
|  | @ -155,29 +163,29 @@ class KorekturyView(generic.TemplateView): | |||
| 		# Prijemci e-mailu | ||||
| 		emails = set() | ||||
| 		# e-mail autora korektury | ||||
|         email = oprava.autor.user.email | ||||
| 		email = oprava.autor.osoba.email | ||||
| 		if email: | ||||
| 			emails.add(email) | ||||
| 
 | ||||
| 		# nalezeni e-mailu na autory komentaru | ||||
| 		for komentar in oprava.komentar_set.all(): | ||||
|             email_komentujiciho = komentar.autor.user.email | ||||
| 			email_komentujiciho = komentar.autor.osoba.email | ||||
| 			if email_komentujiciho: | ||||
| 				emails.add(email_komentujiciho) | ||||
| 
 | ||||
| 		# zodpovedny org | ||||
| 		if oprava.pdf.org: | ||||
|             email_zobpovedny = oprava.pdf.org.user.email | ||||
| 			email_zobpovedny = oprava.pdf.org.osoba.email | ||||
| 			if email_zobpovedny: | ||||
| 				emails.add(email_zobpovedny) | ||||
| 
 | ||||
| 		# odstran e-mail autora opravy | ||||
|         email = autor.user.email | ||||
| 		email = autor.osoba.email | ||||
| 		if email: | ||||
| 			emails.discard(email) | ||||
| 
 | ||||
| 		if not settings.SEND_EMAIL_NOTIFICATIONS: | ||||
|             print "Poslal bych upozornění na tyto adresy: ", " ".join(emails) | ||||
| 			print("Poslal bych upozornění na tyto adresy: ", " ".join(emails)) | ||||
| 			return | ||||
| 
 | ||||
| 		send_mail(subject, text, from_email, list(emails)) | ||||
|  | @ -213,6 +221,11 @@ class KorekturyView(generic.TemplateView): | |||
| 		opravy_na_stranu = [{'strana': s, 'op_id': opravy.filter(strana=s)} for s in strany] | ||||
| 		context['opravy_strany'] = opravy_na_stranu | ||||
| 
 | ||||
| 		context['k_oprave_cnt'] = opravy.filter(status='k_oprave').count()  | ||||
| 		context['opraveno_cnt'] = opravy.filter(status='opraveno').count()  | ||||
| 		context['neni_chyba_cnt'] = opravy.filter(status='neni_chyba').count()  | ||||
| 		context['k_zaneseni_cnt'] = opravy.filter(status='k_zaneseni').count()  | ||||
| 		 | ||||
| 		context['opravy'] = opravy | ||||
| 		context['zasluhy'] = zasluhy | ||||
| 		return context | ||||
|  |  | |||
|  | @ -52,14 +52,15 @@ AUTHENTICATION_BACKENDS = ( | |||
| ) | ||||
| 
 | ||||
| 
 | ||||
| MIDDLEWARE_CLASSES = ( | ||||
|     'reversion.middleware.RevisionMiddleware', | ||||
| MIDDLEWARE = ( | ||||
| #    'reversion.middleware.RevisionMiddleware', | ||||
|     'django.contrib.sessions.middleware.SessionMiddleware', | ||||
|     'django.middleware.common.CommonMiddleware', | ||||
|     'django.middleware.csrf.CsrfViewMiddleware', | ||||
|     'mamweb.middleware.LoggedInHintCookieMiddleware', | ||||
| #	FIXME: rozbilo se při přechodu na Django 2.0, nevím, jestli  | ||||
| #	se to dá zahodit bez náhrady | ||||
| #    'mamweb.middleware.LoggedInHintCookieMiddleware', | ||||
|     'django.contrib.auth.middleware.AuthenticationMiddleware', | ||||
|     'django.contrib.auth.middleware.SessionAuthenticationMiddleware', | ||||
|     'django.contrib.messages.middleware.MessageMiddleware', | ||||
|     'django.middleware.clickjacking.XFrameOptionsMiddleware', | ||||
|     'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware', | ||||
|  | @ -73,6 +74,7 @@ TEMPLATES = [ | |||
|         'OPTIONS': { | ||||
|             'context_processors': ( | ||||
|                 'django.contrib.auth.context_processors.auth', | ||||
| 		'django.template.context_processors.request', | ||||
|                 'django.contrib.messages.context_processors.messages', | ||||
|                 'sekizai.context_processors.sekizai', | ||||
|                 'mamweb.context_processors.vzhled', | ||||
|  | @ -102,7 +104,8 @@ INSTALLED_APPS = ( | |||
|     'ckeditor', | ||||
|     'ckeditor_uploader', | ||||
|     'taggit', | ||||
|     'autocomplete_light', | ||||
|     'dal', | ||||
|     'dal_select2', | ||||
| 
 | ||||
|     'fluent_comments', | ||||
|     'crispy_forms', | ||||
|  | @ -112,8 +115,12 @@ INSTALLED_APPS = ( | |||
|     'django.contrib.flatpages', | ||||
|     'django.contrib.humanize', | ||||
| 
 | ||||
|     'sitetree', | ||||
| 
 | ||||
|     'imagekit', | ||||
| 
 | ||||
|     'polymorphic', | ||||
| 
 | ||||
|     # MaMweb | ||||
|     'mamweb', | ||||
|     'seminar', | ||||
|  | @ -211,6 +218,14 @@ LOGGING = { | |||
|                 'handlers': ['console'], | ||||
|                 'level': 'DEBUG', | ||||
|                 }, | ||||
|             'seminar.prihlaska.form':{ | ||||
| 		'handlers': ['console','registration_logfile'], | ||||
| 		'level': 'INFO' | ||||
| 		}, | ||||
|             'seminar.prihlaska.problem':{ | ||||
| 		'handlers': ['console','mail_registration','registration_error_log'], | ||||
| 		'level': 'INFO' | ||||
| 		}, | ||||
| 
 | ||||
|             # Catch-all logger | ||||
|             '': { | ||||
|  | @ -233,6 +248,24 @@ LOGGING = { | |||
|                 'class': 'django.utils.log.AdminEmailHandler', | ||||
|                 'formatter': 'verbose',  | ||||
|                 }, | ||||
|             'mail_registration': { | ||||
|                 'level': 'WARN', | ||||
|                 'class': 'django.utils.log.AdminEmailHandler', | ||||
|                 'formatter': 'verbose',  | ||||
|                 }, | ||||
|             'registration_logfile':{ | ||||
|                 'level': 'INFO', | ||||
| 		'class': 'logging.FileHandler', | ||||
| 		# filename declared in specific configuration files | ||||
|                 'formatter': 'verbose',  | ||||
| 		}, | ||||
| 	    'registration_error_log':{ | ||||
|                 'level': 'INFO', | ||||
| 		'class': 'logging.FileHandler', | ||||
| 		# filename declared in specific configuration files | ||||
|                 'formatter': 'verbose',  | ||||
| 		}, | ||||
| 		 | ||||
|             }, | ||||
|         } | ||||
| 
 | ||||
|  |  | |||
							
								
								
									
										13
									
								
								mamweb/settings_debug.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						|  | @ -0,0 +1,13 @@ | |||
| # Debugovaci nastaveni settings.py | ||||
| # Pro vyber tohoto nastaveni muzete pouzit tez: | ||||
| # DJANGO_SETTINGS_MODULE=mamweb.settings_debug ./manage.py ... | ||||
| 
 | ||||
| # Import local settings | ||||
| from .settings_local import * | ||||
| 
 | ||||
| # Vypisovani databazovych dotazu do konzole | ||||
| LOGGING['loggers']['django.db.backends'] = { | ||||
| 	'level': 'DEBUG', | ||||
| 	'handlers': ['console'], | ||||
| 	'propagate': False, | ||||
| } | ||||
|  | @ -10,7 +10,7 @@ import os.path | |||
| # Import common settings | ||||
| from .settings_common import * | ||||
| 
 | ||||
| MIDDLEWARE_CLASSES += ( | ||||
| MIDDLEWARE += ( | ||||
|     'debug_toolbar.middleware.DebugToolbarMiddleware', | ||||
|     ) | ||||
| 
 | ||||
|  | @ -24,6 +24,7 @@ INSTALLED_APPS += ( | |||
| 
 | ||||
| # SECURITY WARNING: don't run with debug turned on in production! | ||||
| DEBUG = True | ||||
| INTERNAL_IPS = ['127.0.0.1'] | ||||
| 
 | ||||
| TEMPLATES[0]['OPTIONS']['debug'] = True | ||||
| 
 | ||||
|  | @ -47,7 +48,50 @@ DATABASES = { | |||
| #} | ||||
| 
 | ||||
| # LOGGING | ||||
| LOGGING = { | ||||
|     'version': 1, | ||||
|     'disable_existing_loggers': True, | ||||
|     'filters': { | ||||
|         'require_debug_false': { | ||||
|             '()': 'django.utils.log.RequireDebugFalse' | ||||
|         } | ||||
|     }, | ||||
|     'formatters': { | ||||
|         'simple': { | ||||
|             'format': '%(asctime)s - %(name)s - %(levelname)-8s - %(message)s', | ||||
|         }, | ||||
|     }, | ||||
|     'handlers': { | ||||
|         'dummy': { | ||||
|             'class': 'logging.NullHandler', | ||||
|         }, | ||||
|         'console': { | ||||
|             'level': 'DEBUG', | ||||
|             'class': 'logging.StreamHandler', | ||||
|             'formatter': 'simple', | ||||
|         }, | ||||
|     }, | ||||
|     'loggers': { | ||||
| 	 # Vypisovani databazovych dotazu do konzole | ||||
|          #'django.db.backends': { | ||||
|          #    'level': 'DEBUG', | ||||
|          #    'handlers': ['console'], | ||||
|          #    'propagate': False, | ||||
|          #}, | ||||
|         'werkzeug': { | ||||
|         	'handlers': ['console'], | ||||
|         	'level': 'DEBUG', | ||||
|         	'propagate': True, | ||||
|         }, | ||||
|         '': { | ||||
|             'handlers': ['console'], | ||||
|             'level': 'DEBUG', | ||||
|             'propagate': False, | ||||
|         }, | ||||
|     }, | ||||
| } | ||||
| 
 | ||||
| # set to 'DEBUG' for EXTRA verbose output | ||||
| LOGGING['handlers']['console']['level'] = 'INFO' | ||||
| # LOGGING['handlers']['console']['level'] = 'INFO' | ||||
| 
 | ||||
| EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' | ||||
|  |  | |||
|  | @ -61,6 +61,8 @@ CSRF_COOKIE_SECURE = True | |||
| 
 | ||||
| LOGGING['loggers']['']['handlers'] = ['console', 'mail_admins'] | ||||
| LOGGING['loggers']['django']['handlers'] = ['console', 'mail_admins'] | ||||
| LOGGING['handlers']['registration_logfile']['filename'] = '/home/mam-web/logs/prod/registration.log' | ||||
| LOGGING['handlers']['registration_error_log']['filename'] = '/home/mam-web/logs/prod/registration_errors.log' | ||||
| 
 | ||||
| 
 | ||||
| # E-MAIL NOTIFICATIONS | ||||
|  |  | |||
|  | @ -65,3 +65,5 @@ CSRF_COOKIE_SECURE = True | |||
| 
 | ||||
| LOGGING['loggers']['']['handlers'] = ['console', 'mail_admins'] | ||||
| LOGGING['loggers']['django']['handlers'] = ['console', 'mail_admins'] | ||||
| LOGGING['handlers']['registration_logfile']['filename'] = '/home/mam-web/logs/test/registration.log' | ||||
| LOGGING['handlers']['registration_error_log']['filename'] = '/home/mam-web/logs/test/registration_errors.log' | ||||
|  |  | |||
| Before Width: | Height: | Size: 218 B | 
							
								
								
									
										201
									
								
								mamweb/static/fonts/OpenSans/Apache License.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						|  | @ -0,0 +1,201 @@ | |||
| Apache License | ||||
|                            Version 2.0, January 2004 | ||||
|                         http://www.apache.org/licenses/ | ||||
| 
 | ||||
|    TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION | ||||
| 
 | ||||
|    1. Definitions. | ||||
| 
 | ||||
|       "License" shall mean the terms and conditions for use, reproduction, | ||||
|       and distribution as defined by Sections 1 through 9 of this document. | ||||
| 
 | ||||
|       "Licensor" shall mean the copyright owner or entity authorized by | ||||
|       the copyright owner that is granting the License. | ||||
| 
 | ||||
|       "Legal Entity" shall mean the union of the acting entity and all | ||||
|       other entities that control, are controlled by, or are under common | ||||
|       control with that entity. For the purposes of this definition, | ||||
|       "control" means (i) the power, direct or indirect, to cause the | ||||
|       direction or management of such entity, whether by contract or | ||||
|       otherwise, or (ii) ownership of fifty percent (50%) or more of the | ||||
|       outstanding shares, or (iii) beneficial ownership of such entity. | ||||
| 
 | ||||
|       "You" (or "Your") shall mean an individual or Legal Entity | ||||
|       exercising permissions granted by this License. | ||||
| 
 | ||||
|       "Source" form shall mean the preferred form for making modifications, | ||||
|       including but not limited to software source code, documentation | ||||
|       source, and configuration files. | ||||
| 
 | ||||
|       "Object" form shall mean any form resulting from mechanical | ||||
|       transformation or translation of a Source form, including but | ||||
|       not limited to compiled object code, generated documentation, | ||||
|       and conversions to other media types. | ||||
| 
 | ||||
|       "Work" shall mean the work of authorship, whether in Source or | ||||
|       Object form, made available under the License, as indicated by a | ||||
|       copyright notice that is included in or attached to the work | ||||
|       (an example is provided in the Appendix below). | ||||
| 
 | ||||
|       "Derivative Works" shall mean any work, whether in Source or Object | ||||
|       form, that is based on (or derived from) the Work and for which the | ||||
|       editorial revisions, annotations, elaborations, or other modifications | ||||
|       represent, as a whole, an original work of authorship. For the purposes | ||||
|       of this License, Derivative Works shall not include works that remain | ||||
|       separable from, or merely link (or bind by name) to the interfaces of, | ||||
|       the Work and Derivative Works thereof. | ||||
| 
 | ||||
|       "Contribution" shall mean any work of authorship, including | ||||
|       the original version of the Work and any modifications or additions | ||||
|       to that Work or Derivative Works thereof, that is intentionally | ||||
|       submitted to Licensor for inclusion in the Work by the copyright owner | ||||
|       or by an individual or Legal Entity authorized to submit on behalf of | ||||
|       the copyright owner. For the purposes of this definition, "submitted" | ||||
|       means any form of electronic, verbal, or written communication sent | ||||
|       to the Licensor or its representatives, including but not limited to | ||||
|       communication on electronic mailing lists, source code control systems, | ||||
|       and issue tracking systems that are managed by, or on behalf of, the | ||||
|       Licensor for the purpose of discussing and improving the Work, but | ||||
|       excluding communication that is conspicuously marked or otherwise | ||||
|       designated in writing by the copyright owner as "Not a Contribution." | ||||
| 
 | ||||
|       "Contributor" shall mean Licensor and any individual or Legal Entity | ||||
|       on behalf of whom a Contribution has been received by Licensor and | ||||
|       subsequently incorporated within the Work. | ||||
| 
 | ||||
|    2. Grant of Copyright License. Subject to the terms and conditions of | ||||
|       this License, each Contributor hereby grants to You a perpetual, | ||||
|       worldwide, non-exclusive, no-charge, royalty-free, irrevocable | ||||
|       copyright license to reproduce, prepare Derivative Works of, | ||||
|       publicly display, publicly perform, sublicense, and distribute the | ||||
|       Work and such Derivative Works in Source or Object form. | ||||
| 
 | ||||
|    3. Grant of Patent License. Subject to the terms and conditions of | ||||
|       this License, each Contributor hereby grants to You a perpetual, | ||||
|       worldwide, non-exclusive, no-charge, royalty-free, irrevocable | ||||
|       (except as stated in this section) patent license to make, have made, | ||||
|       use, offer to sell, sell, import, and otherwise transfer the Work, | ||||
|       where such license applies only to those patent claims licensable | ||||
|       by such Contributor that are necessarily infringed by their | ||||
|       Contribution(s) alone or by combination of their Contribution(s) | ||||
|       with the Work to which such Contribution(s) was submitted. If You | ||||
|       institute patent litigation against any entity (including a | ||||
|       cross-claim or counterclaim in a lawsuit) alleging that the Work | ||||
|       or a Contribution incorporated within the Work constitutes direct | ||||
|       or contributory patent infringement, then any patent licenses | ||||
|       granted to You under this License for that Work shall terminate | ||||
|       as of the date such litigation is filed. | ||||
| 
 | ||||
|    4. Redistribution. You may reproduce and distribute copies of the | ||||
|       Work or Derivative Works thereof in any medium, with or without | ||||
|       modifications, and in Source or Object form, provided that You | ||||
|       meet the following conditions: | ||||
| 
 | ||||
|       (a) You must give any other recipients of the Work or | ||||
|           Derivative Works a copy of this License; and | ||||
| 
 | ||||
|       (b) You must cause any modified files to carry prominent notices | ||||
|           stating that You changed the files; and | ||||
| 
 | ||||
|       (c) You must retain, in the Source form of any Derivative Works | ||||
|           that You distribute, all copyright, patent, trademark, and | ||||
|           attribution notices from the Source form of the Work, | ||||
|           excluding those notices that do not pertain to any part of | ||||
|           the Derivative Works; and | ||||
| 
 | ||||
|       (d) If the Work includes a "NOTICE" text file as part of its | ||||
|           distribution, then any Derivative Works that You distribute must | ||||
|           include a readable copy of the attribution notices contained | ||||
|           within such NOTICE file, excluding those notices that do not | ||||
|           pertain to any part of the Derivative Works, in at least one | ||||
|           of the following places: within a NOTICE text file distributed | ||||
|           as part of the Derivative Works; within the Source form or | ||||
|           documentation, if provided along with the Derivative Works; or, | ||||
|           within a display generated by the Derivative Works, if and | ||||
|           wherever such third-party notices normally appear. The contents | ||||
|           of the NOTICE file are for informational purposes only and | ||||
|           do not modify the License. You may add Your own attribution | ||||
|           notices within Derivative Works that You distribute, alongside | ||||
|           or as an addendum to the NOTICE text from the Work, provided | ||||
|           that such additional attribution notices cannot be construed | ||||
|           as modifying the License. | ||||
| 
 | ||||
|       You may add Your own copyright statement to Your modifications and | ||||
|       may provide additional or different license terms and conditions | ||||
|       for use, reproduction, or distribution of Your modifications, or | ||||
|       for any such Derivative Works as a whole, provided Your use, | ||||
|       reproduction, and distribution of the Work otherwise complies with | ||||
|       the conditions stated in this License. | ||||
| 
 | ||||
|    5. Submission of Contributions. Unless You explicitly state otherwise, | ||||
|       any Contribution intentionally submitted for inclusion in the Work | ||||
|       by You to the Licensor shall be under the terms and conditions of | ||||
|       this License, without any additional terms or conditions. | ||||
|       Notwithstanding the above, nothing herein shall supersede or modify | ||||
|       the terms of any separate license agreement you may have executed | ||||
|       with Licensor regarding such Contributions. | ||||
| 
 | ||||
|    6. Trademarks. This License does not grant permission to use the trade | ||||
|       names, trademarks, service marks, or product names of the Licensor, | ||||
|       except as required for reasonable and customary use in describing the | ||||
|       origin of the Work and reproducing the content of the NOTICE file. | ||||
| 
 | ||||
|    7. Disclaimer of Warranty. Unless required by applicable law or | ||||
|       agreed to in writing, Licensor provides the Work (and each | ||||
|       Contributor provides its Contributions) on an "AS IS" BASIS, | ||||
|       WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or | ||||
|       implied, including, without limitation, any warranties or conditions | ||||
|       of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A | ||||
|       PARTICULAR PURPOSE. You are solely responsible for determining the | ||||
|       appropriateness of using or redistributing the Work and assume any | ||||
|       risks associated with Your exercise of permissions under this License. | ||||
| 
 | ||||
|    8. Limitation of Liability. In no event and under no legal theory, | ||||
|       whether in tort (including negligence), contract, or otherwise, | ||||
|       unless required by applicable law (such as deliberate and grossly | ||||
|       negligent acts) or agreed to in writing, shall any Contributor be | ||||
|       liable to You for damages, including any direct, indirect, special, | ||||
|       incidental, or consequential damages of any character arising as a | ||||
|       result of this License or out of the use or inability to use the | ||||
|       Work (including but not limited to damages for loss of goodwill, | ||||
|       work stoppage, computer failure or malfunction, or any and all | ||||
|       other commercial damages or losses), even if such Contributor | ||||
|       has been advised of the possibility of such damages. | ||||
| 
 | ||||
|    9. Accepting Warranty or Additional Liability. While redistributing | ||||
|       the Work or Derivative Works thereof, You may choose to offer, | ||||
|       and charge a fee for, acceptance of support, warranty, indemnity, | ||||
|       or other liability obligations and/or rights consistent with this | ||||
|       License. However, in accepting such obligations, You may act only | ||||
|       on Your own behalf and on Your sole responsibility, not on behalf | ||||
|       of any other Contributor, and only if You agree to indemnify, | ||||
|       defend, and hold each Contributor harmless for any liability | ||||
|       incurred by, or claims asserted against, such Contributor by reason | ||||
|       of your accepting any such warranty or additional liability. | ||||
| 
 | ||||
|    END OF TERMS AND CONDITIONS | ||||
| 
 | ||||
|    APPENDIX: How to apply the Apache License to your work. | ||||
| 
 | ||||
|       To apply the Apache License to your work, attach the following | ||||
|       boilerplate notice, with the fields enclosed by brackets "[]" | ||||
|       replaced with your own identifying information. (Don't include | ||||
|       the brackets!)  The text should be enclosed in the appropriate | ||||
|       comment syntax for the file format. We also recommend that a | ||||
|       file or class name and description of purpose be included on the | ||||
|       same "printed page" as the copyright notice for easier | ||||
|       identification within third-party archives. | ||||
| 
 | ||||
|    Copyright [yyyy] [name of copyright owner] | ||||
| 
 | ||||
|    Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|    you may not use this file except in compliance with the License. | ||||
|    You may obtain a copy of the License at | ||||
| 
 | ||||
|        http://www.apache.org/licenses/LICENSE-2.0 | ||||
| 
 | ||||
|    Unless required by applicable law or agreed to in writing, software | ||||
|    distributed under the License is distributed on an "AS IS" BASIS, | ||||
|    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|    See the License for the specific language governing permissions and | ||||
|    limitations under the License. | ||||
							
								
								
									
										
											BIN
										
									
								
								mamweb/static/fonts/OpenSans/OpenSans-Bold.ttf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								mamweb/static/fonts/OpenSans/OpenSans-BoldItalic.ttf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								mamweb/static/fonts/OpenSans/OpenSans-ExtraBold.ttf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								mamweb/static/fonts/OpenSans/OpenSans-ExtraBoldItalic.ttf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								mamweb/static/fonts/OpenSans/OpenSans-Italic.ttf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								mamweb/static/fonts/OpenSans/OpenSans-Light.ttf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								mamweb/static/fonts/OpenSans/OpenSans-LightItalic.ttf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								mamweb/static/fonts/OpenSans/OpenSans-Regular.ttf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								mamweb/static/fonts/OpenSans/OpenSans-Semibold.ttf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								mamweb/static/fonts/OpenSans/OpenSans-SemiboldItalic.ttf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										120
									
								
								mamweb/static/images/MATFYZ_MM_barevne.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						|  | @ -0,0 +1,120 @@ | |||
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||||
| <!-- Created with Inkscape (http://www.inkscape.org/) --> | ||||
| 
 | ||||
| <svg | ||||
|    xmlns:dc="http://purl.org/dc/elements/1.1/" | ||||
|    xmlns:cc="http://creativecommons.org/ns#" | ||||
|    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | ||||
|    xmlns:svg="http://www.w3.org/2000/svg" | ||||
|    xmlns="http://www.w3.org/2000/svg" | ||||
|    xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | ||||
|    xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | ||||
|    version="1.1" | ||||
|    id="svg2" | ||||
|    xml:space="preserve" | ||||
|    width="873.38959" | ||||
|    height="697.76959" | ||||
|    viewBox="0 0 873.38957 697.7696" | ||||
|    sodipodi:docname="MATFYZ_MM_barevne.svg" | ||||
|    inkscape:version="0.92.3 (2405546, 2018-03-11)"><metadata | ||||
|      id="metadata8"><rdf:RDF><cc:Work | ||||
|          rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type | ||||
|            rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs | ||||
|      id="defs6" /><sodipodi:namedview | ||||
|      pagecolor="#ffffff" | ||||
|      bordercolor="#666666" | ||||
|      borderopacity="1" | ||||
|      objecttolerance="10" | ||||
|      gridtolerance="10" | ||||
|      guidetolerance="10" | ||||
|      inkscape:pageopacity="0" | ||||
|      inkscape:pageshadow="2" | ||||
|      inkscape:window-width="1853" | ||||
|      inkscape:window-height="1025" | ||||
|      id="namedview4" | ||||
|      showgrid="false" | ||||
|      inkscape:zoom="0.29733907" | ||||
|      inkscape:cx="436.69495" | ||||
|      inkscape:cy="348.92161" | ||||
|      inkscape:window-x="67" | ||||
|      inkscape:window-y="27" | ||||
|      inkscape:window-maximized="1" | ||||
|      inkscape:current-layer="g10" /><g | ||||
|      id="g10" | ||||
|      inkscape:groupmode="layer" | ||||
|      inkscape:label="ink_ext_XXXXXX" | ||||
|      transform="matrix(1.3333333,0,0,-1.3333333,-124.56506,745.70131)"><g | ||||
|        id="g12" | ||||
|        transform="scale(0.1)"><path | ||||
|          d="M 7483.93,3086.74 6136.77,1739.57 h -1324.9 l 1347.41,1347.17 h 1324.65" | ||||
|          style="fill:#e94e0f;fill-opacity:1;fill-rule:nonzero;stroke:none" | ||||
|          id="path14" | ||||
|          inkscape:connector-curvature="0" /><path | ||||
|          d="m 7210.43,1001.61 v -88.579 h -308.59 v 91.489 l 179.35,190.24 H 6909.1 v 88.58 h 294.07 v -91.49 l -179.35,-190.24 h 186.61" | ||||
|          style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" | ||||
|          id="path16" | ||||
|          inkscape:connector-curvature="0" /><path | ||||
|          d="M 6847.38,1283.34 6704.34,793.219 h -100.93 l 34.85,119.812 H 6578 l -108.19,370.309 h 114.72 l 73.34,-298.43 74.06,298.43 h 115.45" | ||||
|          style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" | ||||
|          id="path18" | ||||
|          inkscape:connector-curvature="0" /><path | ||||
|          d="m 6437.13,1415.49 -5.08,-72.61 c -21.06,2.18 -37.76,2.9 -50.1,2.9 -52.28,0 -60.99,-6.53 -62.45,-63.17 h 94.4 v -87.85 h -94.4 V 913.031 h -108.91 v 387.009 c 0,96.57 32.67,128.52 129.24,128.52 36.31,0 74.07,-5.81 97.3,-13.07" | ||||
|          style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" | ||||
|          id="path20" | ||||
|          inkscape:connector-curvature="0" /><path | ||||
|          d="M 6151.29,3087.46 C 5702.07,2638.25 5252.62,2188.79 4803.4,1739.57 h -3.15 l -0.72,0.73 1347.4,1347.16 h 4.36" | ||||
|          style="fill:#e94e0f;fill-opacity:1;fill-rule:nonzero;stroke:none" | ||||
|          id="path22" | ||||
|          inkscape:connector-curvature="0" /><path | ||||
|          d="m 6116.92,998.711 5.81,-78.422 c -24.69,-7.988 -67.53,-14.519 -99.48,-14.519 -80.59,0 -119.8,25.41 -119.8,124.16 v 321.66 l 108.91,30.5 v -98.75 h 87.13 v -88.58 h -87.13 V 1056.8 c 0,-54.46 6.54,-62.448 48.65,-62.448 15.98,0 37.76,1.449 55.91,4.359" | ||||
|          style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" | ||||
|          id="path24" | ||||
|          inkscape:connector-curvature="0" /><path | ||||
|          d="m 5685.62,1068.41 c -26.14,1.45 -52.28,2.91 -68.26,2.91 -38.48,-0.73 -53,-15.98 -53,-44.3 0,-26.86 18.87,-44.29 56.63,-44.29 24.69,0 46.47,8.719 64.63,21.06 z m 0,67.53 v 3.63 c 0,55.91 -17.43,65.35 -74.07,65.35 -38.48,0 -80.59,-2.9 -122.71,-6.53 l -5.08,77.69 c 43.56,7.99 104.56,14.52 147.4,14.52 124.16,0 163.37,-31.95 163.37,-148.13 V 913.031 h -72.61 l -22.51,37.75 c -31.22,-27.59 -69.7,-45.011 -116.9,-45.011 -79.15,0 -124.16,47.921 -124.16,119.8 0,84.96 47.92,113.28 153.2,113.28 23.24,0.72 49.38,-0.73 74.07,-2.91" | ||||
|          style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" | ||||
|          id="path26" | ||||
|          inkscape:connector-curvature="0" /><path | ||||
|          d="m 5424.22,522.629 -17.19,-154.66 h -50.58 l 31.71,231.859 h 50.1 l 51.31,-134.078 50.58,134.078 h 51.56 l 30.49,-231.859 h -50.82 l -16.7,156.351 -45.27,-119.082 h -41.62 l -43.57,117.391" | ||||
|          style="fill:#e94e0f;fill-opacity:1;fill-rule:nonzero;stroke:none" | ||||
|          id="path28" | ||||
|          inkscape:connector-curvature="0" /><path | ||||
|          d="m 5204.69,402.09 c 9.93,0 18.64,2.91 26.87,8.23 l -54.7,56.399 c -8.47,-7.02 -12.83,-16.457 -12.83,-28.559 0,-21.789 17.43,-36.07 40.66,-36.07 z m -88.58,30.98 c 0,25.168 13.31,48.172 35.58,61.239 -13.07,16.461 -19.61,31.953 -19.61,47.203 0,19.84 6.78,35.57 20.33,47.918 13.8,12.582 31.71,18.879 53.98,18.879 52.04,0 77.93,-20.817 81.81,-65.11 h -53.74 c -1.45,16.942 -11.13,25.903 -28.07,25.903 -13.56,0 -23.96,-8.481 -23.96,-23.243 0,-11.859 4.6,-19.847 20.09,-35.82 l 56.39,-58.09 c 3.87,13.563 5.81,27.84 5.81,43.813 h 50.83 c 0,-28.563 -7.51,-54.942 -22.76,-79.153 l 47.2,-48.64 h -67.04 l -13.07,13.07 c -17.19,-12.109 -36.07,-18.16 -57.36,-18.16 -24.21,0 -45.02,6.051 -61.72,18.402 -16.7,12.578 -24.69,29.77 -24.69,51.789" | ||||
|          style="fill:#e94e0f;fill-opacity:1;fill-rule:nonzero;stroke:none" | ||||
|          id="path30" | ||||
|          inkscape:connector-curvature="0" /><path | ||||
|          d="m 5130.87,1248.49 c 39.94,25.41 89.31,42.11 127.8,42.11 72.61,0 109.64,-39.94 109.64,-121.98 V 913.031 h -108.92 v 212.019 c 0,67.53 -7.26,76.97 -53,76.97 -17.43,0 -38.49,-2.18 -58.09,-6.54 0.73,-8.71 1.45,-17.43 1.45,-26.86 V 913.031 h -108.91 v 212.019 c 0,67.53 -7.26,76.97 -53.01,76.97 -17.43,0 -38.48,-2.18 -58.09,-6.54 V 913.031 h -108.91 v 370.309 h 72.61 l 19.6,-34.13 c 39.21,24.69 88.59,41.39 127.07,41.39 42.84,0 73.34,-13.79 90.76,-42.11" | ||||
|          style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" | ||||
|          id="path32" | ||||
|          inkscape:connector-curvature="0" /><path | ||||
|          d="m 5019.05,524.32 -45.26,-119.082 h -41.63 l -43.56,117.391 -17.43,-154.66 h -50.34 l 31.7,231.859 h 50.1 l 51.07,-134.078 50.83,134.078 h 51.55 l 30.5,-231.859 h -50.83 l -16.7,156.351" | ||||
|          style="fill:#e94e0f;fill-opacity:1;fill-rule:nonzero;stroke:none" | ||||
|          id="path34" | ||||
|          inkscape:connector-curvature="0" /><path | ||||
|          d="M 6159.28,3086.74 4811.87,1739.57 h -8.47 c 449.22,449.22 898.67,898.68 1347.89,1347.89 h 1333.37 l -0.73,-0.72 H 6159.28" | ||||
|          style="fill:#e94e0f;fill-opacity:1;fill-rule:nonzero;stroke:none" | ||||
|          id="path36" | ||||
|          inkscape:connector-curvature="0" /><path | ||||
|          d="m 4800.25,1739.57 h -1.45 l 0.73,0.73 z" | ||||
|          style="fill:#e94e0f;fill-opacity:1;fill-rule:nonzero;stroke:none" | ||||
|          id="path38" | ||||
|          inkscape:connector-curvature="0" /><path | ||||
|          d="m 4782.34,1740.3 -0.24,-0.24 H 2883.34 v 1899 l 1899,-1898.76" | ||||
|          style="fill:#e94e0f;fill-opacity:1;fill-rule:nonzero;stroke:none" | ||||
|          id="path40" | ||||
|          inkscape:connector-curvature="0" /><path | ||||
|          d="M 4481.01,1707.38 V 359.488 H 3133.12 V 1707.38 h 1347.89" | ||||
|          style="fill:#e94e0f;fill-opacity:1;fill-rule:nonzero;stroke:none" | ||||
|          id="path42" | ||||
|          inkscape:connector-curvature="0" /><path | ||||
|          d="M 2850.67,5592.76 V 3710.7 l -941.27,941.03 z" | ||||
|          style="fill:#e94e0f;fill-opacity:1;fill-rule:nonzero;stroke:none" | ||||
|          id="path44" | ||||
|          inkscape:connector-curvature="0" /><path | ||||
|          d="m 2845.59,3672.94 -953.14,-953.13 -953.126,953.13 953.126,953.14 953.14,-953.14" | ||||
|          style="fill:#e94e0f;fill-opacity:1;fill-rule:nonzero;stroke:none" | ||||
|          id="path46" | ||||
|          inkscape:connector-curvature="0" /><path | ||||
|          d="M 1875.27,4651.73 934.238,3710.7 v 1882.06 z" | ||||
|          style="fill:#e94e0f;fill-opacity:1;fill-rule:nonzero;stroke:none" | ||||
|          id="path48" | ||||
|          inkscape:connector-curvature="0" /></g></g></svg> | ||||
| After Width: | Height: | Size: 7.9 KiB | 
| Before Width: | Height: | Size: 13 KiB | 
| Before Width: | Height: | Size: 15 KiB | 
							
								
								
									
										
											BIN
										
									
								
								mamweb/static/images/graf/adrenalinove.jpeg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 568 KiB | 
							
								
								
									
										
											BIN
										
									
								
								mamweb/static/images/graf/behaci.jpeg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 203 KiB | 
							
								
								
									
										
											BIN
										
									
								
								mamweb/static/images/graf/ceny.jpeg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 2.4 MiB | 
							
								
								
									
										
											BIN
										
									
								
								mamweb/static/images/graf/deskovky.jpeg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 56 KiB | 
							
								
								
									
										
											BIN
										
									
								
								mamweb/static/images/graf/dort.jpeg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 323 KiB | 
							
								
								
									
										
											BIN
										
									
								
								mamweb/static/images/graf/hry.jpeg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 394 KiB | 
							
								
								
									
										
											BIN
										
									
								
								mamweb/static/images/graf/jidlo.jpeg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 213 KiB | 
							
								
								
									
										
											BIN
										
									
								
								mamweb/static/images/graf/konfery.jpeg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 170 KiB | 
							
								
								
									
										
											BIN
										
									
								
								mamweb/static/images/graf/legenda.jpeg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 250 KiB | 
							
								
								
									
										
											BIN
										
									
								
								mamweb/static/images/graf/prednasky.jpeg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 72 KiB | 
							
								
								
									
										
											BIN
										
									
								
								mamweb/static/images/graf/strategicke.jpeg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 320 KiB | 
							
								
								
									
										
											BIN
										
									
								
								mamweb/static/images/graf/vylet.jpeg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 209 KiB | 
| Before Width: | Height: | Size: 62 KiB | 
| Before Width: | Height: | Size: 37 KiB | 
| Before Width: | Height: | Size: 55 KiB | 
| Before Width: | Height: | Size: 14 KiB | 
| Before Width: | Height: | Size: 86 KiB | 
| Before Width: | Height: | Size: 64 KiB | 
| Before Width: | Height: | Size: 53 KiB | 
| Before Width: | Height: | Size: 101 KiB | 
| Before Width: | Height: | Size: 42 KiB | 
| Before Width: | Height: | Size: 88 KiB | 
| Before Width: | Height: | Size: 36 KiB | 
| Before Width: | Height: | Size: 60 KiB | 
| Before Width: | Height: | Size: 122 KiB | 
							
								
								
									
										
											BIN
										
									
								
								mamweb/static/images/header/baliky.jpg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 351 KiB | 
							
								
								
									
										
											BIN
										
									
								
								mamweb/static/images/header/beh.jpg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.2 MiB | 
							
								
								
									
										
											BIN
										
									
								
								mamweb/static/images/header/kryptografie.jpg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 226 KiB | 
							
								
								
									
										
											BIN
										
									
								
								mamweb/static/images/header/mam_cernobile.jpg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 2 MiB | 
							
								
								
									
										
											BIN
										
									
								
								mamweb/static/images/header/noc.jpg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 262 KiB | 
							
								
								
									
										
											BIN
										
									
								
								mamweb/static/images/header/ohen.jpg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 363 KiB | 
							
								
								
									
										
											BIN
										
									
								
								mamweb/static/images/header/snih.jpg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 235 KiB | 
							
								
								
									
										
											BIN
										
									
								
								mamweb/static/images/header/spolecna.jpg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 338 KiB | 
							
								
								
									
										
											BIN
										
									
								
								mamweb/static/images/header/stiny.jpg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 443 KiB | 
							
								
								
									
										
											BIN
										
									
								
								mamweb/static/images/header/vikendovka.jpg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 284 KiB | 
							
								
								
									
										
											BIN
										
									
								
								mamweb/static/images/header/vylet.jpg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 426 KiB | 
| Before Width: | Height: | Size: 2.8 KiB | 
| Before Width: | Height: | Size: 15 KiB | 
							
								
								
									
										240
									
								
								mamweb/static/images/logo-mobile.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						|  | @ -0,0 +1,240 @@ | |||
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||||
| <!-- Created with Inkscape (http://www.inkscape.org/) --> | ||||
| 
 | ||||
| <svg | ||||
|    xmlns:dc="http://purl.org/dc/elements/1.1/" | ||||
|    xmlns:cc="http://creativecommons.org/ns#" | ||||
|    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | ||||
|    xmlns:svg="http://www.w3.org/2000/svg" | ||||
|    xmlns="http://www.w3.org/2000/svg" | ||||
|    xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | ||||
|    xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | ||||
|    version="1.1" | ||||
|    id="svg2" | ||||
|    xml:space="preserve" | ||||
|    width="1116.5013" | ||||
|    height="404.98737" | ||||
|    viewBox="0 0 1116.5013 404.98736" | ||||
|    sodipodi:docname="logo-mobile.svg" | ||||
|    inkscape:version="0.92.3 (2405546, 2018-03-11)"><metadata | ||||
|      id="metadata8"><rdf:RDF><cc:Work | ||||
|          rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type | ||||
|            rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs | ||||
|      id="defs6" /><sodipodi:namedview | ||||
|      pagecolor="#ffffff" | ||||
|      bordercolor="#666666" | ||||
|      borderopacity="1" | ||||
|      objecttolerance="10" | ||||
|      gridtolerance="10" | ||||
|      guidetolerance="10" | ||||
|      inkscape:pageopacity="0" | ||||
|      inkscape:pageshadow="2" | ||||
|      inkscape:window-width="1853" | ||||
|      inkscape:window-height="1145" | ||||
|      id="namedview4" | ||||
|      showgrid="true" | ||||
|      inkscape:zoom="0.84100187" | ||||
|      inkscape:cx="330.58146" | ||||
|      inkscape:cy="30.848545" | ||||
|      inkscape:window-x="67" | ||||
|      inkscape:window-y="27" | ||||
|      inkscape:window-maximized="1" | ||||
|      inkscape:current-layer="g12" | ||||
|      inkscape:snap-page="true"><inkscape:grid | ||||
|        type="xygrid" | ||||
|        id="grid903" | ||||
|        originx="-3.4986323" | ||||
|        originy="-416.4963" /></sodipodi:namedview><g | ||||
|      id="g10" | ||||
|      inkscape:groupmode="layer" | ||||
|      inkscape:label="ink_ext_XXXXXX" | ||||
|      transform="matrix(1.3333333,0,0,-1.3333333,-3.4986322,821.48366)"><g | ||||
|        id="g12" | ||||
|        transform="scale(0.1)"><path | ||||
|          d="m 8335.3454,4798.1624 -595.1505,-620.7555 h -585.3165 l 595.2607,620.7555 h 585.2063" | ||||
|          style="fill:#e84e10;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.18195856" | ||||
|          id="path14" | ||||
|          inkscape:connector-curvature="0" | ||||
|          sodipodi:nodetypes="ccccc" /><path | ||||
|          d="m 7078.5791,4120.5393 h -0.5073 l 0.2556,0.2663 z" | ||||
|          style="fill:#e84e10;fill-opacity:0.94117647;fill-rule:nonzero;stroke:none;stroke-width:0.93578213" | ||||
|          id="path38" | ||||
|          inkscape:connector-curvature="0" | ||||
|          sodipodi:nodetypes="cccc" /><path | ||||
|          d="m 7102.4996,4177.5001 -0.089,-0.093 h -708.1905 v 738.7467 l 708.2801,-738.6537" | ||||
|          style="fill:#e84e10;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99787205" | ||||
|          id="path40" | ||||
|          inkscape:connector-curvature="0" | ||||
|          sodipodi:nodetypes="ccccc" /><path | ||||
|          d="m 6937.5002,4101.5435 v -464.0434 h -444.9049 v 464.0434 h 444.9049" | ||||
|          style="fill:#e84e10;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.88309515" | ||||
|          id="path42" | ||||
|          inkscape:connector-curvature="0" | ||||
|          sodipodi:nodetypes="ccccc" /><path | ||||
|          d="M 6337.5002,5718.9966 V 5062.5001 L 6022.709,5390.7482 Z" | ||||
|          style="fill:#e84e10;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.89475256" | ||||
|          id="path44" | ||||
|          inkscape:connector-curvature="0" | ||||
|          sodipodi:nodetypes="cccc" /><path | ||||
|          d="m 5962.5001,4650.0001 -337.5,337.5 337.5,337.5 337.5001,-337.5 z" | ||||
|          style="fill:#e84e10;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.95725137" | ||||
|          id="path46" | ||||
|          inkscape:connector-curvature="0" | ||||
|          sodipodi:nodetypes="ccccc" /><path | ||||
|          d="m 6420.0002,3637.5001 v 465 l -457.5001,1.0607 -330,-466.0607 c 166.1399,-0.083 621.3604,0 787.5001,0 z" | ||||
|          style="fill:#fbe1b8;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.6284067" | ||||
|          id="path40-9" | ||||
|          inkscape:connector-curvature="0" | ||||
|          sodipodi:nodetypes="ccccc" /><path | ||||
|          d="m 5587.5001,5719.164 v -656.6639 l 314.8715,328.332 z" | ||||
|          style="fill:#e84e10;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.89498103" | ||||
|          id="path44-3" | ||||
|          inkscape:connector-curvature="0" | ||||
|          sodipodi:nodetypes="cccc" /><path | ||||
|          d="m 6000.0001,4575.0001 v -394.33 l 314.7902,-1.1147 c -6.0705,262.4914 -52.96,471.0265 -314.7902,395.4447 z" | ||||
|          style="fill:#fdedd5;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.89475173" | ||||
|          id="path44-3-2" | ||||
|          inkscape:connector-curvature="0" | ||||
|          sodipodi:nodetypes="cccc" /><path | ||||
|          d="m 6320.8633,4912.5001 -6.073,-732.9447 -314.7902,395.4447 z" | ||||
|          style="fill:#fdedd5;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.89933741" | ||||
|          id="path44-6" | ||||
|          inkscape:connector-curvature="0" | ||||
|          sodipodi:nodetypes="cccc" /><path | ||||
|          d="M 1387.5,3106.9263 26.145617,3112.5 26.239743,3429.3745 1387.5,3732.5654 Z" | ||||
|          style="fill:#f7cb87;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.53136837" | ||||
|          id="path42-2" | ||||
|          inkscape:connector-curvature="0" | ||||
|          sodipodi:nodetypes="ccccc" /><path | ||||
|          d="M 2775.0001,3109.1558 H 1462.5 v 640.8443 l 525,-112.5001 787.5001,206.4179 z" | ||||
|          style="fill:#f7cb87;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.53136837" | ||||
|          id="path42-2-8" | ||||
|          inkscape:connector-curvature="0" | ||||
|          sodipodi:nodetypes="cccccc" /><path | ||||
|          d="m 4237.5001,3110.2705 h -1387.5 l 0,752.2296 675,150 712.5,-246.8936 z" | ||||
|          style="fill:#f7cb87;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.53136837" | ||||
|          id="path42-2-7" | ||||
|          inkscape:connector-curvature="0" | ||||
|          sodipodi:nodetypes="cccccc" /><path | ||||
|          d="m 5550.0001,3112.5 h -1237.5 l 0,626.1475 618.75,-176.1474 h 618.75 z" | ||||
|          style="fill:#f9d59e;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.53136837" | ||||
|          id="path42-2-9" | ||||
|          inkscape:connector-curvature="0" | ||||
|          sodipodi:nodetypes="cccccc" /><path | ||||
|          d="m 6937.5002,3105.8115 -1312.5001,-1.1287 0,457.8173 h 1312.5001 z" | ||||
|          style="fill:#f9d59e;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.53136837" | ||||
|          id="path42-2-6" | ||||
|          inkscape:connector-curvature="0" | ||||
|          sodipodi:nodetypes="ccccc" /><path | ||||
|          d="m 8417.4395,3112.5 -1404.9393,-3.3582 v 453.3585 l 1405.2097,262.4998 z" | ||||
|          style="fill:#f9d59e;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.5496583" | ||||
|          id="path42-2-0" | ||||
|          inkscape:connector-curvature="0" | ||||
|          sodipodi:nodetypes="ccccc" /><path | ||||
|          d="m 8328.8772,3870.0686 -1316.377,-232.5685 v 465 z" | ||||
|          style="fill:#fbe1b8;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.53136837" | ||||
|          id="path42-2-0-4" | ||||
|          inkscape:connector-curvature="0" | ||||
|          sodipodi:nodetypes="cccc" /><path | ||||
|          d="m 7290.0002,4106.2559 1127.4393,-188.0235 1.5764,187.55 z" | ||||
|          style="fill:#fce7c6;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.49430776" | ||||
|          id="path42-2-0-4-1" | ||||
|          inkscape:connector-curvature="0" | ||||
|          sodipodi:nodetypes="cccc" /><path | ||||
|          d="m 7928.737,4175.1068 0.056,-0.059 490.363,0.083 -1.6663,624.8689 -595.4746,-624.9521" | ||||
|          style="fill:#fce7c6;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.61935329" | ||||
|          id="path40-8" | ||||
|          inkscape:connector-curvature="0" | ||||
|          sodipodi:nodetypes="ccccc" /><path | ||||
|          d="m 7447.5002,4575.0001 -322.5,-337.5 -300,337.5 h 622.5" | ||||
|          style="fill:#fdedd5;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.95725137" | ||||
|          id="path46-6" | ||||
|          inkscape:connector-curvature="0" | ||||
|          sodipodi:nodetypes="cccc" /><path | ||||
|          d="m 5925.0001,4575.0001 0,-392.8359 -337.5,280.3359 0,450 z" | ||||
|          style="fill:#fdedd5;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.64549828" | ||||
|          id="path14-7" | ||||
|          inkscape:connector-curvature="0" | ||||
|          sodipodi:nodetypes="ccccc" /><path | ||||
|          d="m 5887.5001,4125.0001 -337.5,-487.5 h -600 l 600,766.3199 z" | ||||
|          style="fill:#fbe1b8;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.5409205" | ||||
|          id="path42-2-6-9" | ||||
|          inkscape:connector-curvature="0" | ||||
|          sodipodi:nodetypes="ccccc" /><path | ||||
|          style="opacity:1;fill:#fef6eb;fill-opacity:1;fill-rule:evenodd;stroke:#cc2200;stroke-width:22.25494003;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0" | ||||
|          d="m 5234.2851,6184.7748 1476.9917,14.5116 -447.5529,-438.1391 c -176.9133,-173.1921 -301.1716,-305.5968 -301.2238,-305.5968 -242.6593,249.8656 -457.1495,460.2945 -728.215,729.2243 z" | ||||
|          id="path1203" | ||||
|          inkscape:connector-curvature="0" | ||||
|          sodipodi:nodetypes="ccscc" /><path | ||||
|          style="opacity:1;fill:#fdedd5;fill-opacity:1;fill-rule:evenodd;stroke:#cc2200;stroke-width:22.84425163;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0" | ||||
|          d="m 6396.6887,5762.3467 353.3115,363.8943 V 4650.0001 l -351.0821,375 z" | ||||
|          id="path1201-3" | ||||
|          inkscape:connector-curvature="0" | ||||
|          sodipodi:nodetypes="ccccc" /><path | ||||
|          style="opacity:1;fill:#fdedd5;fill-opacity:1;fill-rule:evenodd;stroke:#cc2200;stroke-width:17.39934158;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0" | ||||
|          d="m 6825.0002,5400.0001 c 0,0 591.4391,-696.4314 637.5,-750 l -320.7729,0 h -316.7271 z" | ||||
|          id="path1199-9" | ||||
|          inkscape:connector-curvature="0" | ||||
|          sodipodi:nodetypes="ccccc" /><path | ||||
|          d="m 7462.5002,5400.0001 0,-637.5 -637.5,750 0,600 z" | ||||
|          style="fill:#fdedd5;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.16200352" | ||||
|          id="path14-8" | ||||
|          inkscape:connector-curvature="0" | ||||
|          sodipodi:nodetypes="ccccc" /><path | ||||
|          d="m 7800.0002,4875.0001 0,1295.0654 600,3.3442 0,-1298.4097 z" | ||||
|          style="fill:#fef6eb;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.52054787" | ||||
|          id="path42-2-6-3" | ||||
|          inkscape:connector-curvature="0" | ||||
|          sodipodi:nodetypes="ccccc" /><path | ||||
|          d="m 6839.0906,6172.2949 v 0 l 885.9096,-2.2294 0,-920.0654 -885.9096,922.2948" | ||||
|          style="fill:#fef6eb;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.21138752" | ||||
|          id="path40-0" | ||||
|          inkscape:connector-curvature="0" | ||||
|          sodipodi:nodetypes="ccccc" /><path | ||||
|          style="opacity:1;fill:#fdedd5;fill-opacity:1;fill-rule:evenodd;stroke:#cc2200;stroke-width:9.21227551;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0" | ||||
|          d="m 7725.0002,5137.5001 -187.5,199.7622 v -649.7622 l 187.5,206.4178 z" | ||||
|          id="path1201-3-1" | ||||
|          inkscape:connector-curvature="0" | ||||
|          sodipodi:nodetypes="ccccc" /><path | ||||
|          d="M 1387.5,3787.5001 562.50001,3617.6989 v 448.4953 z" | ||||
|          style="fill:#f9d59e;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.09587288" | ||||
|          id="path42-2-0-4-1-7" | ||||
|          inkscape:connector-curvature="0" | ||||
|          sodipodi:nodetypes="cccc" /><path | ||||
|          style="opacity:1;fill:#f9d59e;fill-opacity:1;fill-rule:evenodd;stroke:#cc2200;stroke-width:22.52051163;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0" | ||||
|          d="m 487.50001,4087.5001 -465.000009,165 V 3480 l 465.000009,120.0001 z" | ||||
|          id="path1201-3-8" | ||||
|          inkscape:connector-curvature="0" | ||||
|          sodipodi:nodetypes="ccccc" /><path | ||||
|          d="m 5137.5001,4012.5001 -262.5,-337.5001 -1350,412.5001 L 1987.5,3712.5 -7.4999957e-7,4312.5001 l -8.5e-13,1875 4650.00010075000045,0 487.5,-525" | ||||
|          style="fill:#e84e10;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99139333" | ||||
|          id="path40-5" | ||||
|          inkscape:connector-curvature="0" | ||||
|          sodipodi:nodetypes="cccccccc" /><path | ||||
|          d="m 5512.5001,5775.0001 v -1312.5 l -300,-375 0,1612.5 -450,487.5 354.5057,0 z" | ||||
|          style="fill:#fdedd5;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.64549828" | ||||
|          id="path14-7-9" | ||||
|          inkscape:connector-curvature="0" | ||||
|          sodipodi:nodetypes="ccccccc" /><path | ||||
|          d="m 3713.6828,5316.7522 -83.8442,-754.3526 h -246.7035 l 154.6653,1130.8901 h 244.3623 l 250.2641,-653.9642 246.7034,653.9642 h 251.4839 l 148.7142,-1130.8901 h -247.874 l -81.4542,762.6005 -220.804,-580.8213 H 3926.195 l -212.5122,572.5734" | ||||
|          style="fill:#fdedd5;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4.87749052" | ||||
|          id="path28" | ||||
|          inkscape:connector-curvature="0" /><path | ||||
|          d="m 2642.9272,4728.8244 c 48.4335,0 90.9163,14.1934 131.0581,40.1417 l -266.7988,275.0857 c -41.3123,-34.24 -62.5782,-80.2689 -62.5782,-139.2963 0,-106.2757 85.0147,-175.9311 198.3189,-175.9311 z m -432.0483,151.1047 c 0,122.7567 64.9195,234.9585 173.5417,298.6927 -63.7494,80.2883 -95.6482,155.8504 -95.6482,230.2322 0,96.7694 33.0694,173.4923 99.16,233.7197 67.3094,61.3685 154.6647,92.082 263.2865,92.082 253.8246,0 380.1028,-101.5346 399.0275,-317.5734 H 2788.13 c -7.0724,82.6344 -54.2865,126.3416 -136.9111,126.3416 -66.1388,0 -116.8648,-41.366 -116.8648,-113.3675 0,-57.8422 22.4366,-96.8036 97.9889,-174.7117 l 275.0416,-283.3335 c 18.876,66.1533 28.3383,135.7894 28.3383,213.6975 h 247.9229 c 0,-139.3157 -36.63,-267.9791 -111.0117,-386.068 l 230.2181,-237.2411 h -326.9876 l -63.7483,63.7488 c -83.844,-59.0616 -175.9316,-88.5753 -279.7733,-88.5753 -118.0841,0 -219.5847,29.5137 -301.0383,89.7556 -81.4546,61.3491 -120.4258,145.2029 -120.4258,252.6004" | ||||
|          style="fill:#fdedd5;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4.87749052" | ||||
|          id="path30" | ||||
|          inkscape:connector-curvature="0" /><path | ||||
|          d="m 1737.4696,5325.0001 -220.7552,-580.8213 h -203.05 l -212.4634,572.5734 -85.0147,-754.3526 H 770.6534 l 154.61644,1130.8901 h 244.36236 l 249.0939,-653.9642 247.9224,653.9642 h 251.4347 l 148.7634,-1130.8901 h -247.9228 l -81.4542,762.6005" | ||||
|          style="fill:#fdedd5;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4.87749052" | ||||
|          id="path34" | ||||
|          inkscape:connector-curvature="0" /><flowRoot | ||||
|          xml:space="preserve" | ||||
|          id="flowRoot1023" | ||||
|          style="fill:black;stroke:none;stroke-opacity:1;stroke-width:1px;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:1;font-family:sans-serif;font-style:normal;font-weight:normal;font-size:29.33333333px;line-height:40.99999964%;letter-spacing:0px;word-spacing:0px;-inkscape-font-specification:'sans-serif, Normal';font-stretch:normal;font-variant:normal;text-anchor:start;text-align:start;writing-mode:lr;font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal"><flowRegion | ||||
|            id="flowRegion1025"><rect | ||||
|              id="rect1027" | ||||
|              width="210" | ||||
|              height="140" | ||||
|              x="246.50137" | ||||
|              y="481.48367" /></flowRegion><flowPara | ||||
|            id="flowPara1029" /></flowRoot></g></g></svg> | ||||
| After Width: | Height: | Size: 14 KiB | 
| Before Width: | Height: | Size: 35 KiB | 
 Pavel "LEdoian" Turinsky
						Pavel "LEdoian" Turinsky