From 5d09976a82dec4e8fbce92d552997e89cdf1ddc2 Mon Sep 17 00:00:00 2001 From: "tomas.patolan" Date: Wed, 31 Mar 2021 10:09:35 +0200 Subject: [PATCH] hvezdarna --- .dockerignore | 39 + Dockerfile | 60 ++ db.sqlite3 | Bin 0 -> 700416 bytes home/__init__.py | 0 home/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 172 bytes home/__pycache__/models.cpython-37.pyc | Bin 0 -> 1763 bytes home/migrations/0001_initial.py | 22 + home/migrations/0002_create_homepage.py | 58 ++ home/migrations/0003_auto_20210319_1046.py | 56 ++ home/migrations/__init__.py | 0 .../__pycache__/0001_initial.cpython-37.pyc | Bin 0 -> 751 bytes .../0002_create_homepage.cpython-37.pyc | Bin 0 -> 1461 bytes .../0003_auto_20210319_1046.cpython-37.pyc | Bin 0 -> 1645 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 183 bytes home/models.py | 51 + home/static/css/welcome_page.css | 204 ++++ home/templates/home/home_page.html | 52 + home/templates/home/welcome_page.html | 1 + hvezdarna/__init__.py | 0 hvezdarna/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 177 bytes hvezdarna/__pycache__/api.cpython-37.pyc | Bin 0 -> 557 bytes hvezdarna/__pycache__/urls.cpython-37.pyc | Bin 0 -> 973 bytes hvezdarna/__pycache__/wsgi.cpython-37.pyc | Bin 0 -> 588 bytes hvezdarna/api.py | 15 + hvezdarna/settings/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 186 bytes .../settings/__pycache__/base.cpython-37.pyc | Bin 0 -> 3069 bytes .../settings/__pycache__/dev.cpython-37.pyc | Bin 0 -> 445 bytes hvezdarna/settings/base.py | 163 +++ hvezdarna/settings/dev.py | 18 + hvezdarna/settings/production.py | 8 + hvezdarna/static/css/hvezdarna.css | 0 hvezdarna/static/js/hvezdarna.js | 0 hvezdarna/static/js/muj-kolotoc.js | 939 ++++++++++++++++++ hvezdarna/static/js/muj-kolotoc.js.map | 1 + hvezdarna/static/js/muj-kolotoc.min.js | 2 + hvezdarna/static/js/muj-kolotoc.min.js.map | 1 + hvezdarna/templates/404.html | 9 + hvezdarna/templates/500.html | 13 + hvezdarna/templates/base.html | 43 + hvezdarna/urls.py | 43 + hvezdarna/wsgi.py | 16 + manage.py | 10 + requirements.txt | 2 + search/__init__.py | 0 search/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 174 bytes search/__pycache__/views.cpython-37.pyc | Bin 0 -> 944 bytes search/templates/search/search.html | 38 + search/views.py | 34 + 49 files changed, 1898 insertions(+) create mode 100644 .dockerignore create mode 100644 Dockerfile create mode 100644 db.sqlite3 create mode 100644 home/__init__.py create mode 100644 home/__pycache__/__init__.cpython-37.pyc create mode 100644 home/__pycache__/models.cpython-37.pyc create mode 100644 home/migrations/0001_initial.py create mode 100644 home/migrations/0002_create_homepage.py create mode 100644 home/migrations/0003_auto_20210319_1046.py create mode 100644 home/migrations/__init__.py create mode 100644 home/migrations/__pycache__/0001_initial.cpython-37.pyc create mode 100644 home/migrations/__pycache__/0002_create_homepage.cpython-37.pyc create mode 100644 home/migrations/__pycache__/0003_auto_20210319_1046.cpython-37.pyc create mode 100644 home/migrations/__pycache__/__init__.cpython-37.pyc create mode 100644 home/models.py create mode 100644 home/static/css/welcome_page.css create mode 100644 home/templates/home/home_page.html create mode 100644 home/templates/home/welcome_page.html create mode 100644 hvezdarna/__init__.py create mode 100644 hvezdarna/__pycache__/__init__.cpython-37.pyc create mode 100644 hvezdarna/__pycache__/api.cpython-37.pyc create mode 100644 hvezdarna/__pycache__/urls.cpython-37.pyc create mode 100644 hvezdarna/__pycache__/wsgi.cpython-37.pyc create mode 100644 hvezdarna/api.py create mode 100644 hvezdarna/settings/__init__.py create mode 100644 hvezdarna/settings/__pycache__/__init__.cpython-37.pyc create mode 100644 hvezdarna/settings/__pycache__/base.cpython-37.pyc create mode 100644 hvezdarna/settings/__pycache__/dev.cpython-37.pyc create mode 100644 hvezdarna/settings/base.py create mode 100644 hvezdarna/settings/dev.py create mode 100644 hvezdarna/settings/production.py create mode 100644 hvezdarna/static/css/hvezdarna.css create mode 100644 hvezdarna/static/js/hvezdarna.js create mode 100644 hvezdarna/static/js/muj-kolotoc.js create mode 100644 hvezdarna/static/js/muj-kolotoc.js.map create mode 100644 hvezdarna/static/js/muj-kolotoc.min.js create mode 100644 hvezdarna/static/js/muj-kolotoc.min.js.map create mode 100644 hvezdarna/templates/404.html create mode 100644 hvezdarna/templates/500.html create mode 100644 hvezdarna/templates/base.html create mode 100644 hvezdarna/urls.py create mode 100644 hvezdarna/wsgi.py create mode 100644 manage.py create mode 100644 requirements.txt create mode 100644 search/__init__.py create mode 100644 search/__pycache__/__init__.cpython-37.pyc create mode 100644 search/__pycache__/views.cpython-37.pyc create mode 100644 search/templates/search/search.html create mode 100644 search/views.py diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..63ce98d --- /dev/null +++ b/.dockerignore @@ -0,0 +1,39 @@ +# Django project +/media/ +/static/ +*.sqlite3 + +# Python and others +__pycache__ +*.pyc +.DS_Store +*.swp +/venv/ +/tmp/ +/.vagrant/ +/Vagrantfile.local +node_modules/ +/npm-debug.log +/.idea/ +.vscode +coverage +.python-version + +# Distribution / packaging +.Python +env/ +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..9aa185c --- /dev/null +++ b/Dockerfile @@ -0,0 +1,60 @@ +# Use an official Python runtime based on Debian 10 "buster" as a parent image. +FROM python:3.8.1-slim-buster + +# Add user that will be used in the container. +RUN useradd wagtail + +# Port used by this container to serve HTTP. +EXPOSE 8000 + +# Set environment variables. +# 1. Force Python stdout and stderr streams to be unbuffered. +# 2. Set PORT variable that is used by Gunicorn. This should match "EXPOSE" +# command. +ENV PYTHONUNBUFFERED=1 \ + PORT=8000 + +# Install system packages required by Wagtail and Django. +RUN apt-get update --yes --quiet && apt-get install --yes --quiet --no-install-recommends \ + build-essential \ + libpq-dev \ + libmariadbclient-dev \ + libjpeg62-turbo-dev \ + zlib1g-dev \ + libwebp-dev \ + && rm -rf /var/lib/apt/lists/* + +# Install the application server. +RUN pip install "gunicorn==20.0.4" + +# Install the project requirements. +COPY requirements.txt / +RUN pip install -r /requirements.txt + +# Use /app folder as a directory where the source code is stored. +WORKDIR /app + +# Set this directory to be owned by the "wagtail" user. This Wagtail project +# uses SQLite, the folder needs to be owned by the user that +# will be writing to the database file. +RUN chown wagtail:wagtail /app + +# Copy the source code of the project into the container. +COPY --chown=wagtail:wagtail . . + +# Use user "wagtail" to run the build commands below and the server itself. +USER wagtail + +# Collect static files. +RUN python manage.py collectstatic --noinput --clear + +# Runtime command that executes when "docker run" is called, it does the +# following: +# 1. Migrate the database. +# 2. Start the application server. +# WARNING: +# Migrating database at the same time as starting the server IS NOT THE BEST +# PRACTICE. The database should be migrated manually or using the release +# phase facilities of your hosting platform. This is used only so the +# Wagtail instance can be started with a simple "docker run" command. +CMD set -xe; python manage.py migrate --noinput; gunicorn hvezdarna.wsgi:application diff --git a/db.sqlite3 b/db.sqlite3 new file mode 100644 index 0000000000000000000000000000000000000000..83a7fff1adf3928e92e3fb363cd1ad76af70c4fe GIT binary patch literal 700416 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 z zJH!24y>KA-f)_7(-`&tEr=4ZHa_(oFtE`>fd+R&Z+>WfOQb8yws=O)ZMb=-aK5~ju zw6L&>+ND(Y4!0{yZ%Fwr;xTycy<&ZN;l_HFw>K}UfNc$T_nodRZA#@b=`D(-t*X|i z%nFY-4*~fq*_Bj5m1zKbQz_Y+#%!~txF@P24Kj^Dw)5dy;^0MJP`u==t!s_NsHcj= zh8{sG$f{DV?8^CDS`VSzg;+YD%g0i)Z7sQ4ODdFi*la4iSF4DwX${@_bT~q**c2UinXTtK1Q@3+bj$C|rN^;F>RZ>5})IguQb) z3AI=HGp^ms8R5P4ul93OL8|1-vN1ok4sce6&N0~DF`Bc|oVxEKUCm3z74CCn57(|7 zT=oU!thXk)v?)z!frjw?ZCR}dX0k#onoeXgvpJWvENkvZJGHFCBD*!NW*^4S6hwVv z>)?4`@a?SkUhqEhD2Oy`L<@yjJSHWDYDvD`F{7U}GBQR!*UsK7vVqKbsryWk#&#AX z6uy@@xa13Fv)=kGm#)-&{f_DUM5hkb9OpgtDNQcVe%dD}){<=NKVw3t?5xWCkh)U% z>cMk^!HxJKYX)OL(bbsC1$!a);~eMxMPD!;_udP%s{t4A+>af~`#oXSl~&ZUT-s{P zd9j3Tea7o8mQ8&ZT&6yne&sT)1}cL2n^0lvDVji1>4+GSqLPu1dA?!Eebu#_I}IHn zo7%tAp0O}gQ1^c6;2B@ALQ~(qy?Z;o8W|YNc_Eib#nNJWvwa3%={5uNa@NAYjNL^l zt-jiHo^hGZO~VFaK`9pKlC-qS<>HChY|0#Wou=HE9l6wwA8h-AH>2KKMnk70%SS91hXpr73zS)urY-T5JklE?UkM7CR9nFqinH}&fJpU4%J$wG6HhDH>n#GE4 zVbjDc3^~l=v1PJ2Iq^|b2s_O*uyfaz=-k5kG41MkrC6l*J*9V2XNU9#_w**J+My+> zVWCU3*(@$nq@|5xhSG+mODqFy!^Royx*pBQs$uC8%}BLjJ<4cx48>@5h%=R?IOpS!XtWxjEIf^(r>>CYOzIIw+hMkj#`4s> zZtZ9r%-Ycyp14fb;pijHbV{n?9j?&8A3+SS?n!Lna$y~`5A&Nva&Bz{!Lv; zb2Ce$X)=#re8`rrd5Uqe=V_KlQ@V>SKl2oGu_tDhpHGs@bm}29A+wy>TbY=J&nC$D z;zB^nK#odz$^^my3M3+V^_;; z43V16i6_YB^yHYOj2SRN+S!>2Ivc$(s;Q{%78S8T?~KkqBFR!?mhxJ0{2VzXE{z(p z%#)UjA&AFd9s^Mj2H=61ZewhfojXOglQSbsu2pEVwhB(2B&##w zK~1HV4Lj1aICnyeGN7F=DEaCReg2D86=uQt$C<9wux4fZtRKsemGQ<00L?r`#?cGI zW{ovI8i<*j^<{TBt~;2u)$Cx_mCYgiF>*Mc7}jd4*;=b7o9U?_nVt#zHRaMyPAXWM zwWH8S>HNgB-wU}Cg`bC1y3$(bQdh5459 zmJqXG>LX-zK0ahbxT8$Su4tB-Ey_H8(!*>n_KEpCeWIBl7ItK9 z2csYJFY6y6M~#rm+5Ug7{|~vqzYY9y;JX7tAQSM6e|`L&@$2I!#{OvRpN!SU*2d0^ z{^{ty82#et&C$n3{&3{iM(QIgBd3S|Zus|ye|h-(hwlu(Je(SS-2dnPulv8`m;G1# z$A|uO=wA-~#L(@b%R@omU;BQ?_e;L-_3iqWd{6pD2LIFGFAlynxHS0Wpl9IU4gB&z zePC%IND}Y`0w4eaA3TAX8e2m|FFc{mNKGFNV@*qDsXlbaYivc4xb%cEcAICdLEe}t z%yQFa4gUs#+o88_RTgqu9r$|8ERvD)!&uZ$~n%Zg{+5)@ARu*T^pEcx~28K@Egsm&c#L#D&7{b`$V>Py{ zI5}~a2{O+!CG7W8HMX8O6Aoz#w0*fHK|2c7*pgymI%H_DObii*5nD}=k)gseGGu7S zCu(dVae9({?x}urz+6RWr>AOc4RJnxMpM$btzpS&6g^er$aE%k#?aI_!;B4Kjl!os zt6Ll58Yh^wp|DZ-#AnDl96iHSHcCyYjgpDC$!;>L-9{6N$`-Y|^1daO3V5v~{An^f zpDrjV>!Eu-+h7VoqMR28?j*ynIcJC;Vh zh-YQfcgb`nbJ_sfY;5SXo8QsR4W-TIhE|*TJ-DneeHGM0U2J?NmiS-_XR)H^h9bOy?gzd&&^OP8wI|Z_}Bx=TB-^Eh>4j*cd(Z z!*jc2F*$S6xOT(FxV&Md=vIb;hLs^gFE~{qt25z~Oh?0nNzsp<-l6j|7f$HifVMIA zcEAetyPsAq$BJYhzjVUT#x_274@04Ludv~BOZPF9w)z-)n|+>ogM6klCz$S52d2K+ zIxe#;vX5(7+)>K6HjBy~_N>UNQnOHhLZy9#b!wZ*T6o+@#k4Tpj8x2GyW^JbXyjvB zn2tt1X0gpNy2+B7f1D*{o;JN$Qf8UWWm;mHWgctFj3w{PjFmWST65A| z^14e)Hl|B!Hmv-7j^&Yh%$|p7-;@U{oDs=5df|9e2G;XRt%<#C)R_LnGX5!YNL)JJ zl7r=9B+=p|=uRzJSWZS7%}&#=lhaJ*xIGWcgC){zo_>wYGueJE6KxjJKdMT*GS9F`&HfB$j#N;$j`+)`3dq)&G)k;U0qqCE`H}W z$ZvAyV@>tuXmwMskk$G4$66|j*%=AlF)DZJW!AMZ+}Id>+y4Lm(aI3nfB*=900@8p2!H?xfB*=900@8p2v`KL|F=-!7Z3me5C8!X U009sH0T2KI5C8!XII;x(A9)sI-~a#s literal 0 HcmV?d00001 diff --git a/home/__init__.py b/home/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/home/__pycache__/__init__.cpython-37.pyc b/home/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..db8724745e54c50a3cc087b8e8717a725fbf3190 GIT binary patch literal 172 zcmZ?b<>g`kg4*if1Q7igM8E(ekl_Ht#VkM~g&~+hlhJP_LlHv5cYd)k3Ek(HoNSC0!T>1!bosL2qjDcL_jjyBo}Lt>6z}#IBDBM+p{D& zA%znn|A9Gjd(W_*Wj7|^4<4;I-2%3 zDyzo=VF$kAR{*L}oolHc={m{=H&Qb)m27e=wIe%qB1h>KucdC}D%s{<>PLQBkLpTy zc#wussN@=Nq|K|7VT*%)T+BHPGuc06kz1=<75*);f&^WTbU; z>7+Sjya1`*CxT@q;a{_>jv=i+88hh}3CaW+at0pZvt%?mVVC6>3F8!ed?oZr#<;8> zWIV~3Qoy%;kV1TKlIH~zE2EuclwHEAyW2ldu_H`l^>;kv>Nz!u%459rpdF?P1Jr~y%Jw)WdPZOrwt4wg3Cpqn=!N1OB^l=P8wzsgf6 zz?hxD5$z!-*~Q{tI7;N~Qo#x$wT>nIlw8J~W#e)pgXc^Pp+Ip)QYJ!hl{L!F$c&eZ zhZtyon-3Gd*a7+4+5a#l3GY~<1*&Kxs1PfgalZHoeZnJpL9VwmvYnFYOj^U7UP6Czaq#T#gRj7EPS zQ>d&@(BPgv`=(OgL?;|3*%;+n2`r7LNV-DQa0OG7VZn$PP2w};W+9MEvVN>=)h2bc z_+*+aU4GZZ`xuSzPamN7$>0>oS`1F|^ltvwe7jG|oZro}!5%9v%6vLFJ~`bxINI(V z?d=aH&)GF4A|wBop#Otvpt{p55x}O{q2et7SNHX`>NPBoo#opyExlnW-+RMgL(C2a z4**^b1FOaWN5WJC;8IhKfu$@S$Ucq-t=$??odwhdDu>hqq8dQrrqY{By+wT>Ze51G zWwX`L3QQNK+sm^U?gmye83@Kn$*Ah|_4#gAxnRjSgDXjVgih}we2m~B zVEd)Bthn)@S(Q}fG^DZ4$*{rKx zj`*x7ndmN=g&E6L3A!Uluv@iUF;rmRqWjCsKpX=3cv-tHp=pwJ8BNM~LNdyMc(2$T zJz2ReYkc1i&mJ{aE*0?=e@2s{_6AgZ=__}5iMx}R1P` HX6w;^P58@} literal 0 HcmV?d00001 diff --git a/home/migrations/0001_initial.py b/home/migrations/0001_initial.py new file mode 100644 index 0000000..ef46d12 --- /dev/null +++ b/home/migrations/0001_initial.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('wagtailcore', '0040_page_draft_title'), + ] + + operations = [ + migrations.CreateModel( + name='HomePage', + fields=[ + ('page_ptr', models.OneToOneField(on_delete=models.CASCADE, parent_link=True, auto_created=True, primary_key=True, serialize=False, to='wagtailcore.Page')), + ], + options={ + 'abstract': False, + }, + bases=('wagtailcore.page',), + ), + ] diff --git a/home/migrations/0002_create_homepage.py b/home/migrations/0002_create_homepage.py new file mode 100644 index 0000000..039f0f5 --- /dev/null +++ b/home/migrations/0002_create_homepage.py @@ -0,0 +1,58 @@ +# -*- coding: utf-8 -*- +from django.db import migrations + + +def create_homepage(apps, schema_editor): + # Get models + ContentType = apps.get_model('contenttypes.ContentType') + Page = apps.get_model('wagtailcore.Page') + Site = apps.get_model('wagtailcore.Site') + HomePage = apps.get_model('home.HomePage') + + # Delete the default homepage + # If migration is run multiple times, it may have already been deleted + Page.objects.filter(id=2).delete() + + # Create content type for homepage model + homepage_content_type, __ = ContentType.objects.get_or_create( + model='homepage', app_label='home') + + # Create a new homepage + homepage = HomePage.objects.create( + title="Home", + draft_title="Home", + slug='home', + content_type=homepage_content_type, + path='00010001', + depth=2, + numchild=0, + url_path='/home/', + ) + + # Create a site with the new homepage set as the root + Site.objects.create( + hostname='localhost', root_page=homepage, is_default_site=True) + + +def remove_homepage(apps, schema_editor): + # Get models + ContentType = apps.get_model('contenttypes.ContentType') + HomePage = apps.get_model('home.HomePage') + + # Delete the default homepage + # Page and Site objects CASCADE + HomePage.objects.filter(slug='home', depth=2).delete() + + # Delete content type for homepage model + ContentType.objects.filter(model='homepage', app_label='home').delete() + + +class Migration(migrations.Migration): + + dependencies = [ + ('home', '0001_initial'), + ] + + operations = [ + migrations.RunPython(create_homepage, remove_homepage), + ] diff --git a/home/migrations/0003_auto_20210319_1046.py b/home/migrations/0003_auto_20210319_1046.py new file mode 100644 index 0000000..05b81ca --- /dev/null +++ b/home/migrations/0003_auto_20210319_1046.py @@ -0,0 +1,56 @@ +# Generated by Django 3.1.4 on 2021-03-19 09:46 + +from django.db import migrations, models +import django.db.models.deletion +import modelcluster.fields +import wagtail.core.fields + + +class Migration(migrations.Migration): + + dependencies = [ + ('wagtailimages', '0022_uploadedimage'), + ('home', '0002_create_homepage'), + ] + + operations = [ + migrations.AddField( + model_name='homepage', + name='address', + field=models.CharField(blank=True, default='', max_length=255, verbose_name='Adresa'), + ), + migrations.AddField( + model_name='homepage', + name='body', + field=wagtail.core.fields.RichTextField(blank=True), + ), + migrations.AddField( + model_name='homepage', + name='email', + field=models.EmailField(blank=True, max_length=64, null=True, verbose_name='E-mail'), + ), + migrations.AddField( + model_name='homepage', + name='map_link', + field=models.URLField(blank=True, default='', max_length=128, verbose_name='Odkaz na mapu'), + ), + migrations.AddField( + model_name='homepage', + name='mobile', + field=models.CharField(blank=True, default='', max_length=24, verbose_name='Mobil'), + ), + migrations.CreateModel( + name='CarouselImage', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('sort_order', models.IntegerField(blank=True, editable=False, null=True)), + ('caption', models.CharField(blank=True, max_length=250)), + ('image', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='+', to='wagtailimages.image')), + ('page', modelcluster.fields.ParentalKey(on_delete=django.db.models.deletion.CASCADE, related_name='carousel_images', to='home.homepage')), + ], + options={ + 'ordering': ['sort_order'], + 'abstract': False, + }, + ), + ] diff --git a/home/migrations/__init__.py b/home/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/home/migrations/__pycache__/0001_initial.cpython-37.pyc b/home/migrations/__pycache__/0001_initial.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..39a1d4744e8700998f917c83768a80a2a007187c GIT binary patch literal 751 zcmY*X&2AGh5cd9Lv-y*H;Y1HTA>~p9i4#JoC24^}f25?B)k?<6OoEf$^D$}kH9_Le~i(GLa@2J7g1ltmCv*|7D8V%acs-BPZ!uu@gVC8Yu^%)(Rmt4Cmu z%uL83%K~6o2*E1IB8=B9e>o=WHdzXB^R*y>_EoYBR{^BZk^yv}dll1(4)iE>-*t}e zb5a4lFJfhdEEY;*_GC1AG2*pYAqOp%mRo5Hbm==);wkOAwBc&2XNQ+tk52A-c9^)1 zsyOw47G19v8Y{~SS#4ZjoLj{g8ihq5O3PB{3%@fI0 zgU>vSU0jJ0U9yx|fN^bA-)h&I3xno(*mWuAK7@1E<(w2fFFfvZ{^?v4cT69!#tN`n zNHl(+%=N}iaYudxI`TV%lL}{w+@a6q+T;D{cz<%>x~j&zk^N-)DTOxfuOKvjnV(TV zCZDPD=K9z5&Z)4fxVf(K37U;nbv~V)P2QjEj87&9`Nz+A2|`!mF(Rq+hewf*Mx*Ck zR??D2yY+?kudPL9`sC6miQ^y)x1%I%m}63?18Y&O)Go}M&YET#@}bsSv`sg-^wq6K Lue}P!yRGOS2UXj5 literal 0 HcmV?d00001 diff --git a/home/migrations/__pycache__/0002_create_homepage.cpython-37.pyc b/home/migrations/__pycache__/0002_create_homepage.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..db5a97482d250a3f8e7431e44dac3f08b5137477 GIT binary patch literal 1461 zcmaJ>L2n~96!v&L6Hl77%Zi1S04V|%DVJ>7BSNU6MZke>MZ1?Ml5xjwGGQ_fwzH@q zk&xJH{zG%*cU1fdUpeg$;LdxKrrV+w9{Kam6<;XE2#R_*D+QEXv$i-8+%P|5#27ujlQNndshk0Jz~bDh2VhP=Vvh z6pVo(>(Y=+jM8Pu^6ee=jl`2|Fp|P;tOBuu%oQJ@M1Gz zuAB`+>&9t;UI#XneiRa=r!eqpHpxdt2_DRBDe9%HG`TEC#`&{ujGj4P$%zh`HO9jh zaB{D3Lg@=RE4^@_teb{xsJ+M5H^A6{7LM`F#J;h9DXr) z;k0#wGc&nf|F!O%NN>vPbu~EB?q_eNgVVDYN8dm196mq#W-xlG=Std2-evHu!J9-K zz)yH~BSmce=uI!f-bU7~4Lxz60ub7a>W4jy(`Xkuz4vgIMiw{T)&Le5_PPcRfV{N^ zHu)Z7v90KxjHgg^v1)8>bq@3Y%i;U^X`$SSjRCsU?jYYqKsjJ&Am_-LeT4iyg!d61 zZ>%36{}ACLgbo7!jtzVQEbLi5F)#IPsGfk);h}Y?*t@YsOOA$Z!*CoxcO3vt`jNtW zCK^WlShK4{r@FDGFyo3s$;Ki3VSBZJ)2Jx4uzEyM6~2(=F=QVX0ux+_&=i=$vl4kr zh+k&1yjf{Mz358mDlfFNSh*qlaaNsN`jM&XpH{mXnr5nRZn8UKYuTvSeg=TIr9&M& qPFZa^?j|8qV_6MNPo3Atzd5ts@wUSP|8nE)SLlyJajlqlc>7;fz=p8^ literal 0 HcmV?d00001 diff --git a/home/migrations/__pycache__/0003_auto_20210319_1046.cpython-37.pyc b/home/migrations/__pycache__/0003_auto_20210319_1046.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bf7ad01465195e75bd216ce52dcd440cfad2bb97 GIT binary patch literal 1645 zcmZ8iO>-MX5ZzB{SC(Q~c49k(U?6;m6e`)FD4?iRglvNg9H(OYqEgi|QjgcW9_@;m zRfu(>3a&bF<>Dj1BgLPXD<}N`F1bL@tmMe-*6wuoo9XF&uQmFnQYjgDIpXBU-#x?l zTRHQ~LE{NN;xWF!0FxO5vttgdj%6y}Vs^*TquVLyvDopxHNXbvHv=4M#{RE%#|P`! zsJm0lVbm>I8bl!{S(GM176vI$CZ6^cHosQTc!H03U>XKBIwlw$3rw&=t7B6qc2#~_ zh>PGt0gB*(KXITmnPW@Ti~YD1FCku@m7!Rr4qu3hhT z8}2M%w_qJM5L?D|E^NYGcx&RES#S?yRUL8R?TL+%`?C!1z}Cb<|6TM~Xf0li3-MZf z8{UKW;enp{0lkB@uPu%JG%!$M~RK0$6DO8;<9Dl%O8nS>dM zSTrCZ6`fkMxw8|DhAbsOK?iY?bDj>UTx%j2^f@IN4OC=^OQd&g6$t>RLYzor`Y&oC z3oYf7x+C2lBgus<0zD%mmZ7fXWx!|>X6Lf}g7RJ}XpoQrt=otxowX+&6_f5+L>Wk@ zm%?S;uR@RpA1!RPhX=~w-%~*HS@2{hvU^7`ZRJy zZ0V;-fGp9B$}*=66@i>FD@&!Lg<0;;J|fVI#JHlAYRu(ASv_4`l!VeFJ&|$J&#=;( zDy^U?7qXb@3dPg)2OZ%8L3X|_qoC3ro2~%l7PkNd-boUcTbje&-K|zWR%OLXN1!v zBTTIuT#6$x`;}D(UW0agn9N?(xa# z?!nPk`)GHsd;Wrsf$)SZS|~~P%^}ytpV*^7_t;KzXS?}m`^#Xv`Pt`<;U!lGtdEaA zU_IM13yx!2c&}OcSeuP=|Hf#onKiR&-Zk&rj;V9iOVZC-X+Td)l?$|a9c*Y;L}Shu zZ{hZGb&;#anNn8pJ&nxtY$!SB$QOv{{oZhwTL)^1_cdn2MtZDzL*RdkQ8hhv+y4O; Cq~`qq literal 0 HcmV?d00001 diff --git a/home/migrations/__pycache__/__init__.cpython-37.pyc b/home/migrations/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..395d86af01d979f01f05398471a7b76aa77ce271 GIT binary patch literal 183 zcmZ?b<>g`kg4*if1Q7igM8E(ekl_Ht#VkM~g&~+hlhJP_LlH +{% endblock content %} + + +{% block extra_js %} + + + +{% endblock %} \ No newline at end of file diff --git a/home/templates/home/welcome_page.html b/home/templates/home/welcome_page.html new file mode 100644 index 0000000..83b7c38 --- /dev/null +++ b/home/templates/home/welcome_page.html @@ -0,0 +1 @@ +{% load i18n wagtailcore_tags %} diff --git a/hvezdarna/__init__.py b/hvezdarna/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/hvezdarna/__pycache__/__init__.cpython-37.pyc b/hvezdarna/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8c3f972cf9a43577d76572720a2ebcf11ec546c9 GIT binary patch literal 177 zcmZ?b<>g`kg4*if1Q7igM8E(ekl_Ht#VkM~g&~+hlhJP_LlH literal 0 HcmV?d00001 diff --git a/hvezdarna/__pycache__/api.cpython-37.pyc b/hvezdarna/__pycache__/api.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7df5e3de7226a8dacc0171cc1f8f4990f38b01b0 GIT binary patch literal 557 zcmZutyH3L}6t$D4Nh8Wbz=VXlcAx_zLI`LWy3nc*kgT9K!d8ihlPFGG!OD-2k%^C} z_zAB}d_Z@uQ-Ua9%h$*Eo^y}w^J>*bFb-aCMhgw0cXcR63BV~VF@iu5#R1}&V63nf zXj~_Hj`g6#4PxZD6qLD1OpKULjVDYjW<6JEnc+->oWdqEzOltjg=wXS>h=e?pgNWt z9dFFUS*La7vssU&klMWV#;NBAknBd2lqD+H;(vJCPINorEKGmMi9K72z1WvVtTeLh z=UQ2z1^=>c%bhP`1DK8JVPgvZB7t8)a`#s$$#0S9P$PRqZP|2Ht^Sbg7mRPaRg$4B zY;YYe`^v3^jeP;{9I}wcksqcnD5(M~4~s6K=8-!PED>%$;`8h+t986I3g%hpI!xTB xQSA2m1Ej}KS=ACM|2Xf6Ab;uI)pWxPu(i3{S(yRr7Hjc literal 0 HcmV?d00001 diff --git a/hvezdarna/__pycache__/urls.cpython-37.pyc b/hvezdarna/__pycache__/urls.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..666c92ce094e07a0ab6363702e4ffc7791609133 GIT binary patch literal 973 zcmZva&u`N(6vv&PZPTRdxx`zR&Vr5O@flC*MDQ8aN33QpWnJ0K9@v z{(*%cVlc!FY#547W^xN#+{U)HE#`0+yP9oQ;$>VZ*aNN>>;ngy9aiHTxDM=+65Her z+%OQeNtrgL<&_Ckq3(36V2@g~vNE*43LF&d)B3bV0#duMCJt^=V|qvY1a%wiE^pzM z?o?;ndln40*DyV58(CS> zG>zhkY@1mripOkDXlBpC^bCSdNO%+j*mJ?8ax5ZxF0YMzuNTgukx1q#70VKEck#5l z49GN$C&^>IwYzkSzekesoYOd!-DOGAP>j#InVW-Z5Qm(?-<4^YMq{8>PNxy0as=%` z67-2d1rFA=pm~yJ=zaS^R?XXX#z}lCOwf1ZQPPD49$~|RYqyE1h&~IrA1DjX!$}%O ztfSQmS0!#1KJ8KpB=*;7<3!LKE03+yJ8N+g*Nb%U=nOH)Ts4UbO-y~Fv0cQd%KZkrES6Qy0gMVsDl$;>3qQ zk9^09kHA+>d;oWxR=e5*Bl&s8qnY={b9!{-BWGVe$JsXzq2FzAZC&TQa7RCOz|aCQ zk7400Ja=~lE<1~khrnBRzaOwJJJ@0ub-tp-A;U2m9BzL3@8i*!H{R%^&j;QM1k;8UeEXku1C_9avZ`auApnov?Ib}rzNfCdCz zo>Rk>%re*SmE$Q@4TMWaS?&@GVtt!0!-SzrMG0*tv?NtL@J%c}I;BS6i7xpg$T_CGl(?ji=;n8V!>h dasTyN9YJ+z`_K04c;0sex`i(8g`kg4*if1Q7igM8E(ekl_Ht#VkM~g&~+hlhJP_LlHtLnbq> literal 0 HcmV?d00001 diff --git a/hvezdarna/settings/__pycache__/base.cpython-37.pyc b/hvezdarna/settings/__pycache__/base.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0e0bd7f188f1cb67494445c7d5000b5339576307 GIT binary patch literal 3069 zcmb7GOLyBu6t)$`cAUf{eUQEY@hBxgWkL&u0;Q_01c77cL`ut<6OK@P$M&Rp7|pmL zV#}6)z=ACK9UT6IwygL8?75O`M>ye7EK45U$9Erd?;Sr{Ual7KqyF^Gw?C{F3V$Ro zlg}D19^%a(6bl6?kOCAza*L!$i-*!LbGfHX=TC~sMM`683D;$q0~zL_1ZAke0#soU zmS7ob@B*yBDqMhza0xEMi?9Y);A(%3RNxw1ha2z`ybP~^0HZx8N;UhqwDOE5bWJ%l#r*f_KR>+y-?lU55IJ1n>PUu_CF#2E31w8*nFm z-c6q$uwq{(FTjUn1@4hmxJfSHeG%_V@DY66m&oO*<@|-f6A!w9SEqg*0qY_dvM#SrT&`#EVnCJN$aNK$ zaiIjg(~uk=&=6&z^2~8Zl>Z-FA?@W1{h1VEJC+B5N8=KwPS_npmyevjaG0xh17C#f zKusd#(bZXUNP&fzOdi!HEb1Ll;L-BroijmmuOm)F9<5BdJ{t}x>aR{Hn5U6P{X8V| zoIYYqO^ltKnn<@STACnqaZ^Ywq+Hm&(DCR|5I#Lsc7{xS_C8ti0-$c!9dSWJQW8$T z&qQ=7+n{OK8S=$h>PQTt>ode8Q|Puh9-^yjGfYl7$MQJK@Q{%PcWqWfU_o`0GUCzQ zS>6~;^%#IlkDQRIW=7kdQlj;-R!#^D&I^3Ck^cOLC=YvT10RnWJ<5sRoAJfLT;%=G z@Ey~@x@kY;6la5&M4ngP&a#oy`tY0}T-JSh=yacAPpV&UCOh02Ce6oldbiK&aoQb) zOdMmXvPDk(-f8V*^*$}^ynDOjYR@UwrgKFdg)WckW4nTSLl;MjdVr2nA11A@Hq$9% zjoCb2m`HMqTu5u^dtu{%=wd1Y?3A}=0nf^)Ko3U!=+XNO&mVvG0sPCGo?hc zy?>sPHXJt7BOwSG<(VQWWs=cnGcn`=xCla=gzC2AvmVx{nR=A?z|D*mRqB~Soy>dK zicVCnr@wWwFs-EMLUQ2Zc}u@{umvfOa&P_RxNO^au-JAi1w59Aju>EtG5kA#hhEt^ z;3=hI+sVMSZL+wt+xb#&SV_T>$|KFxlT}4-UE%6`mA literal 0 HcmV?d00001 diff --git a/hvezdarna/settings/__pycache__/dev.cpython-37.pyc b/hvezdarna/settings/__pycache__/dev.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..77683025ffec4cf65b09502b1bbb4a76930a80b5 GIT binary patch literal 445 zcmZutO;5r=5Zx^W35xOH50C(fXl&5n#fagf8zrI`TY_REuH6-pw%hDh5-|Q4j{Xkg z+528S`2)PW)p+y0%*&fMnK?`&o6P`)=O^pt9RlzXH-AVgQ&S~kA%H*+*nnt#ND_UG z=tI~~kYrz$F^obeaH<8S@Q*OhY3J*O)u7mm&R*ZJFg?F>iE zdz}Z4NyRu~p<~%yv(;H^c1+~lPw0$b9^ikSpiwjmhQc9qVuVwf-uD@K^yoqSHnE~4 PozN9inx4?$5?qGgR;qf< literal 0 HcmV?d00001 diff --git a/hvezdarna/settings/base.py b/hvezdarna/settings/base.py new file mode 100644 index 0000000..a2070dc --- /dev/null +++ b/hvezdarna/settings/base.py @@ -0,0 +1,163 @@ +""" +Django settings for hvezdarna project. + +Generated by 'django-admin startproject' using Django 3.1.4. + +For more information on this file, see +https://docs.djangoproject.com/en/3.1/topics/settings/ + +For the full list of settings and their values, see +https://docs.djangoproject.com/en/3.1/ref/settings/ +""" + +# Build paths inside the project like this: os.path.join(BASE_DIR, ...) +import os + +PROJECT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +BASE_DIR = os.path.dirname(PROJECT_DIR) + + +# Quick-start development settings - unsuitable for production +# See https://docs.djangoproject.com/en/3.1/howto/deployment/checklist/ + + +# Application definition + +INSTALLED_APPS = [ + 'home', + 'search', + + 'wagtail.contrib.forms', + 'wagtail.contrib.redirects', + 'wagtail.embeds', + 'wagtail.sites', + 'wagtail.users', + 'wagtail.snippets', + 'wagtail.documents', + 'wagtail.images', + 'wagtail.search', + 'wagtail.admin', + 'wagtail.core', + 'rest_framework', + 'wagtail.api.v2', + 'modelcluster', + 'taggit', + + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', +] + +MIDDLEWARE = [ + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', + 'django.middleware.security.SecurityMiddleware', + + 'wagtail.contrib.redirects.middleware.RedirectMiddleware', +] + +ROOT_URLCONF = 'hvezdarna.urls' + +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [ + os.path.join(PROJECT_DIR, 'templates'), + ], + 'APP_DIRS': True, + 'OPTIONS': { + 'context_processors': [ + 'django.template.context_processors.debug', + 'django.template.context_processors.request', + 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages', + ], + }, + }, +] + +WSGI_APPLICATION = 'hvezdarna.wsgi.application' + + +# Database +# https://docs.djangoproject.com/en/3.1/ref/settings/#databases + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), + } +} + + +# Password validation +# https://docs.djangoproject.com/en/3.1/ref/settings/#auth-password-validators + +AUTH_PASSWORD_VALIDATORS = [ + { + 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', + }, +] + + +# Internationalization +# https://docs.djangoproject.com/en/3.1/topics/i18n/ + +LANGUAGE_CODE = 'en-us' + +TIME_ZONE = 'UTC' + +USE_I18N = True + +USE_L10N = True + +USE_TZ = True + + +# Static files (CSS, JavaScript, Images) +# https://docs.djangoproject.com/en/3.1/howto/static-files/ + +STATICFILES_FINDERS = [ + 'django.contrib.staticfiles.finders.FileSystemFinder', + 'django.contrib.staticfiles.finders.AppDirectoriesFinder', +] + +STATICFILES_DIRS = [ + os.path.join(PROJECT_DIR, 'static'), +] + +# ManifestStaticFilesStorage is recommended in production, to prevent outdated +# JavaScript / CSS assets being served from cache (e.g. after a Wagtail upgrade). +# See https://docs.djangoproject.com/en/3.1/ref/contrib/staticfiles/#manifeststaticfilesstorage +STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.ManifestStaticFilesStorage' + +STATIC_ROOT = os.path.join(BASE_DIR, 'static') +STATIC_URL = '/static/' + +MEDIA_ROOT = os.path.join(BASE_DIR, 'media') +MEDIA_URL = '/media/' + + +# Wagtail settings + +WAGTAIL_SITE_NAME = "hvezdarna" + +# Base URL to use when referring to full URLs within the Wagtail admin backend - +# e.g. in notification emails. Don't include '/admin' or a trailing slash +BASE_URL = 'http://example.com' diff --git a/hvezdarna/settings/dev.py b/hvezdarna/settings/dev.py new file mode 100644 index 0000000..dd19297 --- /dev/null +++ b/hvezdarna/settings/dev.py @@ -0,0 +1,18 @@ +from .base import * + +# SECURITY WARNING: don't run with debug turned on in production! +DEBUG = True + +# SECURITY WARNING: keep the secret key used in production secret! +SECRET_KEY = '!m!d%l_th%$@(50+p@=r0m$^cf$(a%*5c214-4p-4tcy=#e=d#' + +# SECURITY WARNING: define the correct hosts in production! +ALLOWED_HOSTS = ['*'] + +EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' + + +try: + from .local import * +except ImportError: + pass diff --git a/hvezdarna/settings/production.py b/hvezdarna/settings/production.py new file mode 100644 index 0000000..9ca4ed7 --- /dev/null +++ b/hvezdarna/settings/production.py @@ -0,0 +1,8 @@ +from .base import * + +DEBUG = False + +try: + from .local import * +except ImportError: + pass diff --git a/hvezdarna/static/css/hvezdarna.css b/hvezdarna/static/css/hvezdarna.css new file mode 100644 index 0000000..e69de29 diff --git a/hvezdarna/static/js/hvezdarna.js b/hvezdarna/static/js/hvezdarna.js new file mode 100644 index 0000000..e69de29 diff --git a/hvezdarna/static/js/muj-kolotoc.js b/hvezdarna/static/js/muj-kolotoc.js new file mode 100644 index 0000000..260763f --- /dev/null +++ b/hvezdarna/static/js/muj-kolotoc.js @@ -0,0 +1,939 @@ +/******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // define getter function for harmony exports +/******/ __webpack_require__.d = function(exports, name, getter) { +/******/ if(!__webpack_require__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); +/******/ } +/******/ }; +/******/ +/******/ // define __esModule on exports +/******/ __webpack_require__.r = function(exports) { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ +/******/ // create a fake namespace object +/******/ // mode & 1: value is a module id, require it +/******/ // mode & 2: merge all properties of value into the ns +/******/ // mode & 4: return value when already ns object +/******/ // mode & 8|1: behave like require +/******/ __webpack_require__.t = function(value, mode) { +/******/ if(mode & 1) value = __webpack_require__(value); +/******/ if(mode & 8) return value; +/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; +/******/ var ns = Object.create(null); +/******/ __webpack_require__.r(ns); +/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); +/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); +/******/ return ns; +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __webpack_require__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(__webpack_require__.s = "5a74"); +/******/ }) +/************************************************************************/ +/******/ ({ + +/***/ "24fb": +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ +// css base code, injected by the css-loader +// eslint-disable-next-line func-names +module.exports = function (useSourceMap) { + var list = []; // return the list of modules as css string + + list.toString = function toString() { + return this.map(function (item) { + var content = cssWithMappingToString(item, useSourceMap); + + if (item[2]) { + return "@media ".concat(item[2], " {").concat(content, "}"); + } + + return content; + }).join(''); + }; // import a list of modules into the list + // eslint-disable-next-line func-names + + + list.i = function (modules, mediaQuery, dedupe) { + if (typeof modules === 'string') { + // eslint-disable-next-line no-param-reassign + modules = [[null, modules, '']]; + } + + var alreadyImportedModules = {}; + + if (dedupe) { + for (var i = 0; i < this.length; i++) { + // eslint-disable-next-line prefer-destructuring + var id = this[i][0]; + + if (id != null) { + alreadyImportedModules[id] = true; + } + } + } + + for (var _i = 0; _i < modules.length; _i++) { + var item = [].concat(modules[_i]); + + if (dedupe && alreadyImportedModules[item[0]]) { + // eslint-disable-next-line no-continue + continue; + } + + if (mediaQuery) { + if (!item[2]) { + item[2] = mediaQuery; + } else { + item[2] = "".concat(mediaQuery, " and ").concat(item[2]); + } + } + + list.push(item); + } + }; + + return list; +}; + +function cssWithMappingToString(item, useSourceMap) { + var content = item[1] || ''; // eslint-disable-next-line prefer-destructuring + + var cssMapping = item[3]; + + if (!cssMapping) { + return content; + } + + if (useSourceMap && typeof btoa === 'function') { + var sourceMapping = toComment(cssMapping); + var sourceURLs = cssMapping.sources.map(function (source) { + return "/*# sourceURL=".concat(cssMapping.sourceRoot || '').concat(source, " */"); + }); + return [content].concat(sourceURLs).concat([sourceMapping]).join('\n'); + } + + return [content].join('\n'); +} // Adapted from convert-source-map (MIT) + + +function toComment(sourceMap) { + // eslint-disable-next-line no-undef + var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))); + var data = "sourceMappingURL=data:application/json;charset=utf-8;base64,".concat(base64); + return "/*# ".concat(data, " */"); +} + +/***/ }), + +/***/ "35d6": +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +// ESM COMPAT FLAG +__webpack_require__.r(__webpack_exports__); + +// EXPORTS +__webpack_require__.d(__webpack_exports__, "default", function() { return /* binding */ addStylesToShadowDOM; }); + +// CONCATENATED MODULE: ./node_modules/vue-style-loader/lib/listToStyles.js +/** + * Translates the list format produced by css-loader into something + * easier to manipulate. + */ +function listToStyles (parentId, list) { + var styles = [] + var newStyles = {} + for (var i = 0; i < list.length; i++) { + var item = list[i] + var id = item[0] + var css = item[1] + var media = item[2] + var sourceMap = item[3] + var part = { + id: parentId + ':' + i, + css: css, + media: media, + sourceMap: sourceMap + } + if (!newStyles[id]) { + styles.push(newStyles[id] = { id: id, parts: [part] }) + } else { + newStyles[id].parts.push(part) + } + } + return styles +} + +// CONCATENATED MODULE: ./node_modules/vue-style-loader/lib/addStylesShadow.js + + +function addStylesToShadowDOM (parentId, list, shadowRoot) { + var styles = listToStyles(parentId, list) + addStyles(styles, shadowRoot) +} + +/* +type StyleObject = { + id: number; + parts: Array +} + +type StyleObjectPart = { + css: string; + media: string; + sourceMap: ?string +} +*/ + +function addStyles (styles /* Array */, shadowRoot) { + const injectedStyles = + shadowRoot._injectedStyles || + (shadowRoot._injectedStyles = {}) + for (var i = 0; i < styles.length; i++) { + var item = styles[i] + var style = injectedStyles[item.id] + if (!style) { + for (var j = 0; j < item.parts.length; j++) { + addStyle(item.parts[j], shadowRoot) + } + injectedStyles[item.id] = true + } + } +} + +function createStyleElement (shadowRoot) { + var styleElement = document.createElement('style') + styleElement.type = 'text/css' + shadowRoot.appendChild(styleElement) + return styleElement +} + +function addStyle (obj /* StyleObjectPart */, shadowRoot) { + var styleElement = createStyleElement(shadowRoot) + var css = obj.css + var media = obj.media + var sourceMap = obj.sourceMap + + if (media) { + styleElement.setAttribute('media', media) + } + + if (sourceMap) { + // https://developer.chrome.com/devtools/docs/javascript-debugging + // this makes source maps inside style tags work properly in Chrome + css += '\n/*# sourceURL=' + sourceMap.sources[0] + ' */' + // http://stackoverflow.com/a/26603875 + css += '\n/*# sourceMappingURL=data:application/json;base64,' + btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))) + ' */' + } + + if (styleElement.styleSheet) { + styleElement.styleSheet.cssText = css + } else { + while (styleElement.firstChild) { + styleElement.removeChild(styleElement.firstChild) + } + styleElement.appendChild(document.createTextNode(css)) + } +} + + +/***/ }), + +/***/ "4933": +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _node_modules_vue_style_loader_index_js_ref_6_oneOf_1_0_node_modules_css_loader_dist_cjs_js_ref_6_oneOf_1_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_6_oneOf_1_2_node_modules_postcss_loader_src_index_js_ref_6_oneOf_1_3_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_Kolotoc_vue_vue_type_style_index_0_lang_css_shadow__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__("4f39"); +/* harmony import */ var _node_modules_vue_style_loader_index_js_ref_6_oneOf_1_0_node_modules_css_loader_dist_cjs_js_ref_6_oneOf_1_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_6_oneOf_1_2_node_modules_postcss_loader_src_index_js_ref_6_oneOf_1_3_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_Kolotoc_vue_vue_type_style_index_0_lang_css_shadow__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_vue_style_loader_index_js_ref_6_oneOf_1_0_node_modules_css_loader_dist_cjs_js_ref_6_oneOf_1_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_6_oneOf_1_2_node_modules_postcss_loader_src_index_js_ref_6_oneOf_1_3_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_Kolotoc_vue_vue_type_style_index_0_lang_css_shadow__WEBPACK_IMPORTED_MODULE_0__); +/* harmony reexport (unknown) */ for(var __WEBPACK_IMPORT_KEY__ in _node_modules_vue_style_loader_index_js_ref_6_oneOf_1_0_node_modules_css_loader_dist_cjs_js_ref_6_oneOf_1_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_6_oneOf_1_2_node_modules_postcss_loader_src_index_js_ref_6_oneOf_1_3_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_Kolotoc_vue_vue_type_style_index_0_lang_css_shadow__WEBPACK_IMPORTED_MODULE_0__) if(["default"].indexOf(__WEBPACK_IMPORT_KEY__) < 0) (function(key) { __webpack_require__.d(__webpack_exports__, key, function() { return _node_modules_vue_style_loader_index_js_ref_6_oneOf_1_0_node_modules_css_loader_dist_cjs_js_ref_6_oneOf_1_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_6_oneOf_1_2_node_modules_postcss_loader_src_index_js_ref_6_oneOf_1_3_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_Kolotoc_vue_vue_type_style_index_0_lang_css_shadow__WEBPACK_IMPORTED_MODULE_0__[key]; }) }(__WEBPACK_IMPORT_KEY__)); + + +/***/ }), + +/***/ "4f39": +/***/ (function(module, exports, __webpack_require__) { + +// style-loader: Adds some css to the DOM by adding a \r\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Kolotoc.vue?vue&type=script&lang=js&shadow\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Kolotoc.vue?vue&type=script&lang=js&shadow\"","import { render, staticRenderFns } from \"./Kolotoc.vue?vue&type=template&id=7f6b8457&shadow\"\nimport script from \"./Kolotoc.vue?vue&type=script&lang=js&shadow\"\nexport * from \"./Kolotoc.vue?vue&type=script&lang=js&shadow\"\nfunction injectStyles (context) {\n \n var style0 = require(\"./Kolotoc.vue?vue&type=style&index=0&lang=css&shadow\")\nif (style0.__inject__) style0.__inject__(context)\n\n}\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n injectStyles,\n null,\n null\n ,true\n)\n\nexport default component.exports","import './setPublicPath'\nimport Vue from 'vue'\nimport wrap from '@vue/web-component-wrapper'\n\n// runtime shared by every component chunk\nimport 'css-loader/dist/runtime/api.js'\nimport 'vue-style-loader/lib/addStylesShadow'\nimport 'vue-loader/lib/runtime/componentNormalizer'\n\nimport mujKolotoc from '~root/src/components/Kolotoc.vue?shadow'\nwindow.customElements.define('muj-kolotoc', wrap(Vue, mujKolotoc))","// addapted from the document.currentScript polyfill by Adam Miller\n// MIT license\n// source: https://github.com/amiller-gh/currentScript-polyfill\n\n// added support for Firefox https://bugzilla.mozilla.org/show_bug.cgi?id=1620505\n\n(function (root, factory) {\n if (typeof define === 'function' && define.amd) {\n define([], factory);\n } else if (typeof module === 'object' && module.exports) {\n module.exports = factory();\n } else {\n root.getCurrentScript = factory();\n }\n}(typeof self !== 'undefined' ? self : this, function () {\n function getCurrentScript () {\n var descriptor = Object.getOwnPropertyDescriptor(document, 'currentScript')\n // for chrome\n if (!descriptor && 'currentScript' in document && document.currentScript) {\n return document.currentScript\n }\n\n // for other browsers with native support for currentScript\n if (descriptor && descriptor.get !== getCurrentScript && document.currentScript) {\n return document.currentScript\n }\n \n // IE 8-10 support script readyState\n // IE 11+ & Firefox support stack trace\n try {\n throw new Error();\n }\n catch (err) {\n // Find the second match for the \"at\" string to get file src url from stack.\n var ieStackRegExp = /.*at [^(]*\\((.*):(.+):(.+)\\)$/ig,\n ffStackRegExp = /@([^@]*):(\\d+):(\\d+)\\s*$/ig,\n stackDetails = ieStackRegExp.exec(err.stack) || ffStackRegExp.exec(err.stack),\n scriptLocation = (stackDetails && stackDetails[1]) || false,\n line = (stackDetails && stackDetails[2]) || false,\n currentLocation = document.location.href.replace(document.location.hash, ''),\n pageSource,\n inlineScriptSourceRegExp,\n inlineScriptSource,\n scripts = document.getElementsByTagName('script'); // Live NodeList collection\n \n if (scriptLocation === currentLocation) {\n pageSource = document.documentElement.outerHTML;\n inlineScriptSourceRegExp = new RegExp('(?:[^\\\\n]+?\\\\n){0,' + (line - 2) + '}[^<]*\r\n\r\n\r\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Kolotoc.vue?vue&type=script&lang=js&shadow\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Kolotoc.vue?vue&type=script&lang=js&shadow\"","import { render, staticRenderFns } from \"./Kolotoc.vue?vue&type=template&id=7f6b8457&shadow\"\nimport script from \"./Kolotoc.vue?vue&type=script&lang=js&shadow\"\nexport * from \"./Kolotoc.vue?vue&type=script&lang=js&shadow\"\nfunction injectStyles (context) {\n \n var style0 = require(\"./Kolotoc.vue?vue&type=style&index=0&lang=css&shadow\")\nif (style0.__inject__) style0.__inject__(context)\n\n}\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n injectStyles,\n null,\n null\n ,true\n)\n\nexport default component.exports","import './setPublicPath'\nimport Vue from 'vue'\nimport wrap from '@vue/web-component-wrapper'\n\n// runtime shared by every component chunk\nimport 'css-loader/dist/runtime/api.js'\nimport 'vue-style-loader/lib/addStylesShadow'\nimport 'vue-loader/lib/runtime/componentNormalizer'\n\nimport mujKolotoc from '~root/src/components/Kolotoc.vue?shadow'\nwindow.customElements.define('muj-kolotoc', wrap(Vue, mujKolotoc))","// addapted from the document.currentScript polyfill by Adam Miller\n// MIT license\n// source: https://github.com/amiller-gh/currentScript-polyfill\n\n// added support for Firefox https://bugzilla.mozilla.org/show_bug.cgi?id=1620505\n\n(function (root, factory) {\n if (typeof define === 'function' && define.amd) {\n define([], factory);\n } else if (typeof module === 'object' && module.exports) {\n module.exports = factory();\n } else {\n root.getCurrentScript = factory();\n }\n}(typeof self !== 'undefined' ? self : this, function () {\n function getCurrentScript () {\n var descriptor = Object.getOwnPropertyDescriptor(document, 'currentScript')\n // for chrome\n if (!descriptor && 'currentScript' in document && document.currentScript) {\n return document.currentScript\n }\n\n // for other browsers with native support for currentScript\n if (descriptor && descriptor.get !== getCurrentScript && document.currentScript) {\n return document.currentScript\n }\n \n // IE 8-10 support script readyState\n // IE 11+ & Firefox support stack trace\n try {\n throw new Error();\n }\n catch (err) {\n // Find the second match for the \"at\" string to get file src url from stack.\n var ieStackRegExp = /.*at [^(]*\\((.*):(.+):(.+)\\)$/ig,\n ffStackRegExp = /@([^@]*):(\\d+):(\\d+)\\s*$/ig,\n stackDetails = ieStackRegExp.exec(err.stack) || ffStackRegExp.exec(err.stack),\n scriptLocation = (stackDetails && stackDetails[1]) || false,\n line = (stackDetails && stackDetails[2]) || false,\n currentLocation = document.location.href.replace(document.location.hash, ''),\n pageSource,\n inlineScriptSourceRegExp,\n inlineScriptSource,\n scripts = document.getElementsByTagName('script'); // Live NodeList collection\n \n if (scriptLocation === currentLocation) {\n pageSource = document.documentElement.outerHTML;\n inlineScriptSourceRegExp = new RegExp('(?:[^\\\\n]+?\\\\n){0,' + (line - 2) + '}[^<]* + + + + + {% block extra_js %} + {# Override this in templates to add extra javascript #} + {% endblock %} + + diff --git a/hvezdarna/urls.py b/hvezdarna/urls.py new file mode 100644 index 0000000..f9633be --- /dev/null +++ b/hvezdarna/urls.py @@ -0,0 +1,43 @@ +from django.conf import settings +from django.urls import include, path +from django.contrib import admin + +from wagtail.admin import urls as wagtailadmin_urls +from wagtail.core import urls as wagtail_urls +from wagtail.documents import urls as wagtaildocs_urls + +from search import views as search_views + + +from .api import api_router + +urlpatterns = [ + path('api/v2/', api_router.urls), + path('django-admin/', admin.site.urls), + + path('admin/', include(wagtailadmin_urls)), + path('documents/', include(wagtaildocs_urls)), + + path('search/', search_views.search, name='search'), + +] + + +if settings.DEBUG: + from django.conf.urls.static import static + from django.contrib.staticfiles.urls import staticfiles_urlpatterns + + # Serve static and media files from development server + urlpatterns += staticfiles_urlpatterns() + urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) + +urlpatterns = urlpatterns + [ + # For anything not caught by a more specific rule above, hand over to + # Wagtail's page serving mechanism. This should be the last pattern in + # the list: + path("", include(wagtail_urls)), + + # Alternatively, if you want Wagtail pages to be served from a subpath + # of your site, rather than the site root: + # path("pages/", include(wagtail_urls)), +] diff --git a/hvezdarna/wsgi.py b/hvezdarna/wsgi.py new file mode 100644 index 0000000..0e6a5c9 --- /dev/null +++ b/hvezdarna/wsgi.py @@ -0,0 +1,16 @@ +""" +WSGI config for hvezdarna project. + +It exposes the WSGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/3.1/howto/deployment/wsgi/ +""" + +import os + +from django.core.wsgi import get_wsgi_application + +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "hvezdarna.settings.dev") + +application = get_wsgi_application() diff --git a/manage.py b/manage.py new file mode 100644 index 0000000..60534c1 --- /dev/null +++ b/manage.py @@ -0,0 +1,10 @@ +#!/usr/bin/env python +import os +import sys + +if __name__ == "__main__": + os.environ.setdefault("DJANGO_SETTINGS_MODULE", "hvezdarna.settings.dev") + + from django.core.management import execute_from_command_line + + execute_from_command_line(sys.argv) diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..574b6c3 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +Django>=3.1,<3.2 +wagtail>=2.11,<2.12 diff --git a/search/__init__.py b/search/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/search/__pycache__/__init__.cpython-37.pyc b/search/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aa4bbf83626fa5c230d6638f9d7b1e3bc768d066 GIT binary patch literal 174 zcmZ?b<>g`kg1YM91Q7igM8E(ekl_Ht#VkM~g&~+hlhJP_LlHU6<|dwCSK)HKf>;&Rf@}{{TUo$ zZu|lMK*gWfE2sVd#Fg1~3SDc)GxN>P&g)gH6(BfYJ|BJfLlOFAl)FPfcmX84z!H?; z6lFNV8Hq?nBZ`fUq%3nH$I3KyGcWS2%+f~YM?T0-;$EXDNW3EyHf|vj3aR#YvZISqO;9*4 zPy=WiNd5p;q6u2y1ShB>mw2g>gn~v&EV_zJ=z>*f;gq<-msGh6Y$aB*g;ybr^1%8u zDg>xs(u7@+OK09LokdU*bLTC}w-{0@r-8V}a04TQ!5e_RNBJgTO~AhW$4Y0?TB76~ zQtc9YRAPwjekE5Fy5#L?=aZ>SvndpMYwEi-W4c(AJQjn|)B4vLsVohNZr18aeW$(D z1edc^$?$=uuXlQy4!IJhL)t4oPWV7c&C>B1*KX}EJd4Fiaxxk#&GI7Wf`Lu=hQV$i zVHQIB`7Apzc}d}b9=h5S9G;d+G>wyWZyCwVLi^xa5A!<`8({f;2yFXV|5$P%`@JH& zseV?Q2QcpRrpo(WE>Bf4?H~1yySw|F+xy*}{^*QfB(ccjds3Zs|7^_9WoJ4UYY^2u zD4zgBxQ*MC;Z+>afB<1)EcRO?E@;+&FI>^<$t2E)MQ2b5-uaiSEwwJ%^gwScz0`6U zJJ4ObjkX8+;dwk%@i?ucWJSVLX`3Cb-ywCroh4?PZBwukHcR<)GkIyM LdW4&#iJSBSearch + +
+ + +
+ + {% if search_results %} +
    + {% for result in search_results %} +
  • +

    {{ result }}

    + {% if result.search_description %} + {{ result.search_description }} + {% endif %} +
  • + {% endfor %} +
+ + {% if search_results.has_previous %} + Previous + {% endif %} + + {% if search_results.has_next %} + Next + {% endif %} + {% elif search_query %} + No results found + {% endif %} +{% endblock %} diff --git a/search/views.py b/search/views.py new file mode 100644 index 0000000..d9ad9d0 --- /dev/null +++ b/search/views.py @@ -0,0 +1,34 @@ +from django.core.paginator import EmptyPage, PageNotAnInteger, Paginator +from django.template.response import TemplateResponse + +from wagtail.core.models import Page +from wagtail.search.models import Query + + +def search(request): + search_query = request.GET.get('query', None) + page = request.GET.get('page', 1) + + # Search + if search_query: + search_results = Page.objects.live().search(search_query) + query = Query.get(search_query) + + # Record hit + query.add_hit() + else: + search_results = Page.objects.none() + + # Pagination + paginator = Paginator(search_results, 10) + try: + search_results = paginator.page(page) + except PageNotAnInteger: + search_results = paginator.page(1) + except EmptyPage: + search_results = paginator.page(paginator.num_pages) + + return TemplateResponse(request, 'search/search.html', { + 'search_query': search_query, + 'search_results': search_results, + })