From 626033f9775ba64ec135f3b7462aa497221d3096 Mon Sep 17 00:00:00 2001 From: Standa Platil Date: Wed, 4 Nov 2020 11:07:57 +0100 Subject: [PATCH] Initial commit --- .dockerignore | 39 ++++ Dockerfile | 60 ++++++ blog/__init__.py | 0 blog/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 136 bytes blog/__pycache__/urls.cpython-38.pyc | Bin 0 -> 872 bytes blog/__pycache__/wsgi.cpython-38.pyc | Bin 0 -> 537 bytes blog/settings/__init__.py | 0 .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 145 bytes blog/settings/__pycache__/base.cpython-38.pyc | Bin 0 -> 3008 bytes blog/settings/__pycache__/dev.cpython-38.pyc | Bin 0 -> 404 bytes blog/settings/base.py | 162 ++++++++++++++ blog/settings/dev.py | 18 ++ blog/settings/production.py | 8 + blog/static/css/blog.css | 0 blog/static/js/blog.js | 0 blog/templates/404.html | 9 + blog/templates/500.html | 13 ++ blog/templates/base.html | 40 ++++ blog/urls.py | 39 ++++ blog/wsgi.py | 16 ++ db.sqlite3 | Bin 0 -> 688128 bytes home/__init__.py | 0 home/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 136 bytes home/__pycache__/models.cpython-38.pyc | Bin 0 -> 498 bytes home/migrations/0001_initial.py | 22 ++ home/migrations/0002_create_homepage.py | 58 +++++ home/migrations/__init__.py | 0 .../__pycache__/0001_initial.cpython-38.pyc | Bin 0 -> 731 bytes .../0002_create_homepage.cpython-38.pyc | Bin 0 -> 1415 bytes .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 147 bytes home/models.py | 8 + home/static/css/welcome_page.css | 204 ++++++++++++++++++ home/templates/home/home_page.html | 21 ++ home/templates/home/welcome_page.html | 52 +++++ manage.py | 10 + requirements.txt | 2 + search/__init__.py | 0 search/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 138 bytes search/__pycache__/views.cpython-38.pyc | Bin 0 -> 914 bytes search/templates/search/search.html | 38 ++++ search/views.py | 34 +++ 41 files changed, 853 insertions(+) create mode 100644 .dockerignore create mode 100644 Dockerfile create mode 100644 blog/__init__.py create mode 100644 blog/__pycache__/__init__.cpython-38.pyc create mode 100644 blog/__pycache__/urls.cpython-38.pyc create mode 100644 blog/__pycache__/wsgi.cpython-38.pyc create mode 100644 blog/settings/__init__.py create mode 100644 blog/settings/__pycache__/__init__.cpython-38.pyc create mode 100644 blog/settings/__pycache__/base.cpython-38.pyc create mode 100644 blog/settings/__pycache__/dev.cpython-38.pyc create mode 100644 blog/settings/base.py create mode 100644 blog/settings/dev.py create mode 100644 blog/settings/production.py create mode 100644 blog/static/css/blog.css create mode 100644 blog/static/js/blog.js create mode 100644 blog/templates/404.html create mode 100644 blog/templates/500.html create mode 100644 blog/templates/base.html create mode 100644 blog/urls.py create mode 100644 blog/wsgi.py create mode 100644 db.sqlite3 create mode 100644 home/__init__.py create mode 100644 home/__pycache__/__init__.cpython-38.pyc create mode 100644 home/__pycache__/models.cpython-38.pyc create mode 100644 home/migrations/0001_initial.py create mode 100644 home/migrations/0002_create_homepage.py create mode 100644 home/migrations/__init__.py create mode 100644 home/migrations/__pycache__/0001_initial.cpython-38.pyc create mode 100644 home/migrations/__pycache__/0002_create_homepage.cpython-38.pyc create mode 100644 home/migrations/__pycache__/__init__.cpython-38.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 manage.py create mode 100644 requirements.txt create mode 100644 search/__init__.py create mode 100644 search/__pycache__/__init__.cpython-38.pyc create mode 100644 search/__pycache__/views.cpython-38.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..f82fa12 --- /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 blog.wsgi:application diff --git a/blog/__init__.py b/blog/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/blog/__pycache__/__init__.cpython-38.pyc b/blog/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fc12101774f4806447ca405d3c61ca5109f8812f GIT binary patch literal 136 zcmWIL<>g`k0>iRJ@gVv!h(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o2DP*(xTqIJKxa zCb%RqFC{U?CAB!aB)=dgDJMT2Ld3^s=4F<|$LkeT-r}&y%}*)KNwotR^BIU404Q%B AW&i*H literal 0 HcmV?d00001 diff --git a/blog/__pycache__/urls.cpython-38.pyc b/blog/__pycache__/urls.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ea2468bf73300d437890d9fe575fa89eb109dd86 GIT binary patch literal 872 zcmYjP&5qMB5Vn&vO`D|KmMsM?+>m;p6(=Nw5Im!xC@VT8D2gRzd%RC53?TW*_ttbnDt2?YIa$Fi(Vq& zby*L%kKlbwTQ^P>^XLK84o&R^?gNjuPtlR$QkKRu{lKx)q`Ot_MmggeOoh48ASu;$Pvu9?>A_SIh zd^s9_dN-S#eAdkpo*W;4`-w!)$T8-2@Zr^TBAJlWQGom( literal 0 HcmV?d00001 diff --git a/blog/__pycache__/wsgi.cpython-38.pyc b/blog/__pycache__/wsgi.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..07323d6c0b52c2a0f2b96a332f8aa85beb6eecd9 GIT binary patch literal 537 zcmYjO!EO^V5cN7~6Bde!RB`q-66{iOs}KS;Z4^|}!!|;SB027QvT^WwR%>@ld*vIr z12_JsCto@73!LyKLW(6nYdrRQZ)TRrF z(JTsQN7J%1>qG>ib@%(8?8?0#G(?@RWVSD9Mh5%$5AmmLG-f%Pr7GAGYj&-%U{#H4 z$Xyc0W5?i2g%&JxD`4B#LThoYfeFh5D^cEPc&VWQ%^FdwP0EN8BwH**RcVzAr_d}G zf$uy>lvo2(Ca9I01VayAf4+SJGZ%u=e?}2GljmF2}vxKF%(at~Kk^DvK zc8nYNJ2*X=Pc77To;hKpm=D2zc390@`7N~6Npg`k0>iRJ@gVv!h(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o6wv*(xTqIJKxa zCb%RqFC{U?CAB!aB)=dgDJMT2LKLT#lw{_m7stfMXXa&=#K-FuRNmsS$<0qG%}KQb JnfDop831qsB0K;9 literal 0 HcmV?d00001 diff --git a/blog/settings/__pycache__/base.cpython-38.pyc b/blog/settings/__pycache__/base.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bc720f6691d6ca47d65821ccc907218ae98a4f9f GIT binary patch literal 3008 zcmb7G>vPja5VsY@b{r?1IGHK6t@GVJe!I7~yQj^GiF^t_OK*PB9!{rHzlV$D zXAT$7@Zk^AsT8D03eq5$X_BVtJ>ln(#3<6y_v!FUGCgVr=UEs55k?^cS;)Z{W=}c`i|+-H-U%#CCZPnkP_hI|(Re!=ms#2n z$tk!)rroO&L!4PM-F++xdgjAF-i_GsIa^7&P2Q&;yW6k7+y zs}LzH>R>Uu$UWWldXiU*U5*gN9^$gJBrT)%3IbY=ON-1#Y)ki;V;Aw~?J~5+OnMWI z)BLXIb@+o)37j^UVjF!A+KyGCb_oGXp3`A%Ug~>Wis8LoTHNWHX3=EaD>^$zyU}ex zLzKD2H@exS{QuZ;=}yAXpJ5Kx198`}XprGlciX%E+`evjIy0rVV|y-ZN#PE;e}0(k zQeZ9yllzl>7PVRwxIfWfbLP>+vdgK<{iy-hW}Oa2{pmgh>D}M7g^om2r5<=zc=<-jFXk#vP#oSwf9FZ%wKy6Ht-B{|!es4N zdwTm7)|~XyimO|+(Fu!-C-fGN>v7udy39MkP{osk_`Rdti1T@nxJmamdfA*%91B~9 z)OAhnmwF~WYIRKP8d3{=q&D=cTB<}1q}gNhV5~36n`9&=ny?9*MpA zf)Hes`f9bV1Y%uYQ{3GTIKn8k7rUH{Y&Ofs zjuUUOev^@Qm<`x^r4?*B>H&5|YbB!i!xev$lHBQ3qDJqyjPh8KWMWDG@z5TU0Nit2 z?0?dlZnGUsPc`x=^nt4}%g>c!g%TOHumE*GTZ;ZmL=2P2p9ybJyg=z&9Se_Q@3t1c z2(p@nH-)AJg2Mx`qkFrUT+FqxTLf9X#Un~i)4~p`X=HqTqw#}MZiZ<}a?fQ|31`7% zwXQbhT1}~Fn8Rw2U#nIsHDycQP=dlnqtVnhH)`cZeI*e09A*b&O=WGpCN~u|nA%cT ztD#n{T9(7455_8TQx2ik;GDeKe4(w&s=C$KsAwlpGvmG8=JoMjZwp%) ZXGJ7O-%$Fam?<2JSy7lwN6)Az{tGM9`7Zzf literal 0 HcmV?d00001 diff --git a/blog/settings/__pycache__/dev.cpython-38.pyc b/blog/settings/__pycache__/dev.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e4cc66f811cdceea5407d24eb5071a135d8e3ad4 GIT binary patch literal 404 zcmYjN&1%9x7~GBV2Wv_XeSsbd#$r&R2vSScEUjo2nut{bA-Zd-iP^B5D&}!|>(lhU z*Pi+cJvGrwXZQwYK0ZE}iJ}xig8J^m{(=B}r{+HjiFrtdr-A{7J}?26<`8G*5|&*! z&*1D_j!VZ~)&x@!T*`ptydrBska7kB=@sCd0o43Y@&l+)z=|0+_U$k%ABehA!)kN8 zcdE-xBW_1!pVb&G?<$9b7rQsBw`P{X-(LlWyWZDBX6G~?|98ZyMKaCC35DI$k^oMr0 z(;J|XF0wvdI=(pTZ$ru=#296tfTfKc<+t8zSrbkew~WXMuw&_jdl3z-g-_j+a1ur9 kz~vSuJ1snj!rhkQcc0v+P4J6E3K=odPXGV_ literal 0 HcmV?d00001 diff --git a/blog/settings/base.py b/blog/settings/base.py new file mode 100644 index 0000000..a242a02 --- /dev/null +++ b/blog/settings/base.py @@ -0,0 +1,162 @@ +""" +Django settings for blog project. + +Generated by 'django-admin startproject' using Django 3.1.3. + +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', + + '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 = 'blog.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 = 'blog.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 = "blog" + +# 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/blog/settings/dev.py b/blog/settings/dev.py new file mode 100644 index 0000000..5373e60 --- /dev/null +++ b/blog/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 = 'w=pp(ye)f)p-7mwa-cj2z=t(lr0ro(v*yykzg+fh%or7!5_00f' + +# 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/blog/settings/production.py b/blog/settings/production.py new file mode 100644 index 0000000..9ca4ed7 --- /dev/null +++ b/blog/settings/production.py @@ -0,0 +1,8 @@ +from .base import * + +DEBUG = False + +try: + from .local import * +except ImportError: + pass diff --git a/blog/static/css/blog.css b/blog/static/css/blog.css new file mode 100644 index 0000000..e69de29 diff --git a/blog/static/js/blog.js b/blog/static/js/blog.js new file mode 100644 index 0000000..e69de29 diff --git a/blog/templates/404.html b/blog/templates/404.html new file mode 100644 index 0000000..3a5500e --- /dev/null +++ b/blog/templates/404.html @@ -0,0 +1,9 @@ +{% extends "base.html" %} + +{% block body_class %}template-404{% endblock %} + +{% block content %} +

Page not found

+ +

Sorry, this page could not be found.

+{% endblock %} diff --git a/blog/templates/500.html b/blog/templates/500.html new file mode 100644 index 0000000..72b6406 --- /dev/null +++ b/blog/templates/500.html @@ -0,0 +1,13 @@ + + + + + Internal server error + + + +

Internal server error

+ +

Sorry, there seems to be an error. Please try again soon.

+ + diff --git a/blog/templates/base.html b/blog/templates/base.html new file mode 100644 index 0000000..97a9752 --- /dev/null +++ b/blog/templates/base.html @@ -0,0 +1,40 @@ +{% load static wagtailuserbar %} + + + + + + + {% block title %} + {% if self.seo_title %}{{ self.seo_title }}{% else %}{{ self.title }}{% endif %} + {% endblock %} + {% block title_suffix %} + {% with self.get_site.site_name as site_name %} + {% if site_name %}- {{ site_name }}{% endif %} + {% endwith %} + {% endblock %} + + + + + {# Global stylesheets #} + + + {% block extra_css %} + {# Override this in templates to add extra stylesheets #} + {% endblock %} + + + + {% wagtailuserbar %} + + {% block content %}{% endblock %} + + {# Global javascript #} + + + {% block extra_js %} + {# Override this in templates to add extra javascript #} + {% endblock %} + + diff --git a/blog/urls.py b/blog/urls.py new file mode 100644 index 0000000..d1b8710 --- /dev/null +++ b/blog/urls.py @@ -0,0 +1,39 @@ +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 + +urlpatterns = [ + 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/blog/wsgi.py b/blog/wsgi.py new file mode 100644 index 0000000..f21e946 --- /dev/null +++ b/blog/wsgi.py @@ -0,0 +1,16 @@ +""" +WSGI config for blog 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", "blog.settings.dev") + +application = get_wsgi_application() diff --git a/db.sqlite3 b/db.sqlite3 new file mode 100644 index 0000000000000000000000000000000000000000..5f5096c507a16235c9c7dfe3ca854ceb7664a6c8 GIT binary patch literal 688128 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
Q} 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 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-38.pyc b/home/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..67440e700eee33a9f4d5eead076c42090cd7269f GIT binary patch literal 136 zcmWIL<>g`k0>iRJ@gVv!h(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o2DP*(xTqIJKxa zCb%RqFC{U?CAB!aB)=dgDJMTYCL=#LH6}hjGcU6wK3=b&@)n0pZhlH>PO2Tqn9o4W F001c^9%}#q literal 0 HcmV?d00001 diff --git a/home/__pycache__/models.cpython-38.pyc b/home/__pycache__/models.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ce29c854a24b2e8f184860dfd572791516211624 GIT binary patch literal 498 zcmY*VOHRWu5Vhm{TGACuP7opG00^N39@Cy z6%Y%?i4bKhKfm#KW}as;8VwQH_tPtThx5ZZyXJ#4hHWPR0tu{;#uQ`6J>_XaNymxu zbwGoT`zq8CjW9Y#A`syV5}_o|gvKJ8qcr}6N+`u`sB0mW1?JCqA>kZdmaFxZd}z)} zsRUdMJ2K;yR4bRYYZ#m{Y?}Z`M6p2B6Bs&pZG2H{>55KM(#DKcTua8Us~k@l zyW4WrN8XTeW9Z=P@boBOSZQoNZ+InmK9TmesWP#$+i?sXqyl8l-vQ=$l*5?}n5&A!J?S5{J8+&{3o5O`Jt4xZrVQWyN fK${8RMc3_5dC&G-YJA*(^u$fc#sGfjN5OthnH~Uek7bFCnk@iw;B~GY9t#&C~T9CHAM3F4-&NO(N#HsCq+ACc9 zC%EyKeC5PHKwOq_wy0&Id9wY+dGq1(ot+^g+yDGs7|z(wuz73=Z4SxpO9EgJRjiKk zsOCA3*gFOs;%^LMjMnkjIFBJ&uu1xhV%dcIVXaCdozjiwMo=B- z(2rVauyLYN&7~j9Yp2D^pmYdC8C6SjBQEjA4=frbD|L&WJMA;Mw9d$tn?(OB1m#KM zlSbC)dlw2Tu)eR`ZU54xv}jK!L!Su|LWJ-`A*id@RalROxVo0rJu?Puu>ovW3T+rH z^P^dp+({UNiNndxhX&6y!Ew;?{n^oCb~JzMhq}f4vHf7?IfZuc=V11_IHzK4v2d~h zSa@ePmp r?_|?Ool+MDu$E1!_h8v&-zD6U5BY3YFX(SRJJ|N&O{mlc*p2@JOeN7W literal 0 HcmV?d00001 diff --git a/home/migrations/__pycache__/0002_create_homepage.cpython-38.pyc b/home/migrations/__pycache__/0002_create_homepage.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f3b7eb007494636a3eb2ea0ca9534834254054eb GIT binary patch literal 1415 zcmZux&2Aev5ayEH6<3zxBxr%O1zH0|fA*p{IR-@$zyaDzji630f&gN@q@`6?%PmPI za3BK(nycQy?k&&Jx8Sv>yg}iMJF_c0auE_7&JQ{J&FlMaVA#0we7Bix~uN383aWD^8Lfh z2ZgDP3C!V3`I+ zprrw2;K;qBAzm1ztB~eRBdh#aS7VMB$6|kf{}C=5!Sy%ELp=X56Cw7cuXNZ^Hb3#Q z6S%9E(=gb8mWVp=Cik-tE8V~*>gA%Cl@%aZ+Df*jv@%6r&5ZLeGKR>Uuk(ctsWryK z5dgVcI;r$YzO1}-5LuRlbgI4VF!#*yTo>Mj;wjqH?wAW#XXN;AF)j5bsw`XbK z5Ty%4SIqPxms*wH*s!ye-oPWqmxH8iT`j~tu!U-hz@dl#2_CIP)!)^!nMi+x?w-1ESe$-BW zpCu6`^s3Kczdip=2CWUO_B*(9tJblZaJ9Am6qt|JdRNyB8*5FsDw{%sG1a@)wY4e^ zEdxImy;^|;;bzp{LH-^R%#g({%eZ}j{AWl$NAg9d{Sx`FknAD(8VM$}Bi{lScCB8R zSNbL?XmjHBN*VeR3vpQ?KaleGWnOJ81E_jkD_s|*b{6|Dq`xlf z=cj&V>h`y^a6{iTdh;f21>A;?QQHg%zI$z?g3&7;_pe&*VHSr}&GUL{M(Viz#0S6a XiH|u9;)f3LkBG^^drJmP?1|xjU#@Q7 literal 0 HcmV?d00001 diff --git a/home/migrations/__pycache__/__init__.cpython-38.pyc b/home/migrations/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..575f948519dc7b661ef8101765f353aa3975be16 GIT binary patch literal 147 zcmWIL<>g`k0>iRJ@gVv!h(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o6wl*(xTqIJKxa zCb%RqFC{U?CAB!aB)=dgDJMTYCL=#LH6}MRy(qCHGe565CO$qhFS8^*Uaz3?7Kcr4 QeoARhsvXG0&p^xo0K9A?4*&oF literal 0 HcmV?d00001 diff --git a/home/models.py b/home/models.py new file mode 100644 index 0000000..f17e7c7 --- /dev/null +++ b/home/models.py @@ -0,0 +1,8 @@ +from django.db import models + +from wagtail.core.models import Page +from wagtail.core.fields import RichTextField +from wagtail.admin.edit_handlers import FieldPanel + +class HomePage(Page): + pass diff --git a/home/static/css/welcome_page.css b/home/static/css/welcome_page.css new file mode 100644 index 0000000..ce8b149 --- /dev/null +++ b/home/static/css/welcome_page.css @@ -0,0 +1,204 @@ +html { + box-sizing: border-box; +} + +*, +*:before, +*:after { + box-sizing: inherit; +} + +body { + max-width: 960px; + min-height: 100vh; + margin: 0 auto; + padding: 0 15px; + color: #231f20; + font-family: 'Helvetica Neue', 'Segoe UI', Arial, sans-serif; + line-height: 1.25; +} + +a { + background-color: transparent; + color: #308282; + text-decoration: underline; +} + +a:hover { + color: #ea1b10; +} + +h1, +h2, +h3, +h4, +h5, +p, +ul { + padding: 0; + margin: 0; + font-weight: 400; +} + +main { + display: block; /* For IE11 support */ +} + +svg:not(:root) { + overflow: hidden; +} + +.header { + display: flex; + justify-content: space-between; + align-items: center; + padding-top: 20px; + padding-bottom: 10px; + border-bottom: 1px solid #e6e6e6; +} + +.logo { + width: 150px; + margin-right: 20px; +} + +.logo a { + display: block; +} + +.figure-logo { + max-width: 150px; + max-height: 55.1px; +} + +.release-notes { + font-size: 14px; +} + +.main { + padding: 40px 0; + margin: 0 auto; + text-align: center; +} + +.figure-space { + max-width: 265px; +} + +@-webkit-keyframes pos { + 0%, 100% { + -webkit-transform: rotate(-6deg); + transform: rotate(-6deg); + } + 50% { + -webkit-transform: rotate(6deg); + transform: rotate(6deg); + } +} + +@keyframes pos { + 0%, 100% { + -webkit-transform: rotate(-6deg); + transform: rotate(-6deg); + } + 50% { + -webkit-transform: rotate(6deg); + transform: rotate(6deg); + } +} + +.egg { + fill: #43b1b0; + -webkit-animation: pos 3s ease infinite; + animation: pos 3s ease infinite; + -webkit-transform: translateY(50px); + transform: translateY(50px); + -webkit-transform-origin: 50% 80%; + transform-origin: 50% 80%; +} + +.main-text { + max-width: 400px; + margin: 5px auto; +} + +.main-text h1 { + font-size: 22px; +} + +.main-text p { + margin: 15px auto 0; +} + +.footer { + display: flex; + flex-wrap: wrap; + justify-content: space-between; + border-top: 1px solid #e6e6e6; + padding: 10px; +} + +.option { + display: block; + padding: 10px 10px 10px 34px; + position: relative; + text-decoration: none; +} + +.option svg { + width: 24px; + height: 24px; + fill: gray; + border: 1px solid #d9d9d9; + padding: 5px; + border-radius: 100%; + top: 10px; + left: 0; + position: absolute; +} + +.option h4 { + font-size: 19px; + text-decoration: underline; +} + +.option p { + padding-top: 3px; + color: #231f20; + font-size: 15px; + font-weight: 300; +} + +@media (max-width: 996px) { + body { + max-width: 780px; + } +} + +@media (max-width: 767px) { + .option { + flex: 0 0 50%; + } +} + +@media (max-width: 599px) { + .main { + padding: 20px 0; + } + + .figure-space { + max-width: 200px; + } + + .footer { + display: block; + width: 300px; + margin: 0 auto; + } +} + +@media (max-width: 360px) { + .header-link { + max-width: 100px; + } +} diff --git a/home/templates/home/home_page.html b/home/templates/home/home_page.html new file mode 100644 index 0000000..db9e9b0 --- /dev/null +++ b/home/templates/home/home_page.html @@ -0,0 +1,21 @@ +{% extends "base.html" %} +{% load static %} + +{% block body_class %}template-homepage{% endblock %} + +{% block extra_css %} + +{% comment %} +Delete the line below if you're just getting started and want to remove the welcome screen! +{% endcomment %} + +{% endblock extra_css %} + +{% block content %} + +{% comment %} +Delete the line below if you're just getting started and want to remove the welcome screen! +{% endcomment %} +{% include 'home/welcome_page.html' %} + +{% endblock content %} diff --git a/home/templates/home/welcome_page.html b/home/templates/home/welcome_page.html new file mode 100644 index 0000000..6368471 --- /dev/null +++ b/home/templates/home/welcome_page.html @@ -0,0 +1,52 @@ +{% load i18n wagtailcore_tags %} + + +
+
+ +
+
+

{% trans "Welcome to your new Wagtail site!" %}

+

{% trans 'Please feel free to join our community on Slack, or get started with one of the links below.' %}

+
+
+ diff --git a/manage.py b/manage.py new file mode 100644 index 0000000..4ac5c1f --- /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", "blog.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-38.pyc b/search/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f7e01ff9c4033664aa226acd8ac08e108a0f2063 GIT binary patch literal 138 zcmWIL<>g`k0>iRJ@gVv!h(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o2DX*(xTqIJKxa zCb%RqFC{U?CAB!aB)=dgDJMTYrZ_dRC^;i0K0Y%qvm`!Vub}c4hfQvNN@-529mt^1 HK+FIDZI>T9 literal 0 HcmV?d00001 diff --git a/search/__pycache__/views.cpython-38.pyc b/search/__pycache__/views.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d71d82644d5e62d8c146c55fe8b4a40ee5a19c6d GIT binary patch literal 914 zcmYjP&2AGh5cc2hX17VG0+q^*1DBOh5LZ-HpteF>Dxj@^RitPeTWQk$3AWQJ)%Mgr z28X0KUVw-3l~bMoi34KnU7%ihJTu?S?0jRNbUG1&_2S}g_>&^^!y5M&0pk^HwGVbVs#|%>s3JD!BPwGb34IK+D?SxEFo=(L`E5owMg)n{{F9V0AoDa_?+OVQ5gk<28p%w5( zkhG7&gvC4`+P;+Zz>a+rNCCfATDEPF3-4IX-h~Mvw7$@9NN$7Y*R#EsgA*mB8XW1g z;OSsrsB>M;2B%p$9@O0oE+*nq^=Av&gA`jxJq3Yq7k4Scn>eBofsKjvxUWZiu*h$h zaTsryEj~?)aoHc0QuP0I;YieUEIYH^MCsrU?^Ib{k8qo`ahv`DpwQ++ literal 0 HcmV?d00001 diff --git a/search/templates/search/search.html b/search/templates/search/search.html new file mode 100644 index 0000000..5f222e5 --- /dev/null +++ b/search/templates/search/search.html @@ -0,0 +1,38 @@ +{% extends "base.html" %} +{% load static wagtailcore_tags %} + +{% block body_class %}template-searchresults{% endblock %} + +{% block title %}Search{% endblock %} + +{% block content %} +

Search

+ +
+ + +
+ + {% 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, + })
+ + +