diff --git a/pyconbalkan/cfp/migrations/0011_auto_20181018_1949.py b/pyconbalkan/cfp/migrations/0011_auto_20181018_1949.py new file mode 100644 index 00000000..d2a0e969 --- /dev/null +++ b/pyconbalkan/cfp/migrations/0011_auto_20181018_1949.py @@ -0,0 +1,18 @@ +# Generated by Django 2.0.5 on 2018-10-18 19:49 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('cfp', '0010_cfp_active'), + ] + + operations = [ + migrations.AlterField( + model_name='cfp', + name='active', + field=models.BooleanField(default=False), + ), + ] diff --git a/pyconbalkan/core/static/css/components/faq-accordion.css b/pyconbalkan/core/static/css/components/faq-accordion.css new file mode 100644 index 00000000..e976040c --- /dev/null +++ b/pyconbalkan/core/static/css/components/faq-accordion.css @@ -0,0 +1,52 @@ +.accordion { + background-color: #eee; + color: #444; + cursor: pointer; + padding: 18px; + width: 100%; + border: none; + text-align: left; + outline: none; + font-size: 15px; + transition: 0.4s; +} + +.accordion:hover { + background-color: #ccc; +} + +.accordion:after { + content: "\25BA"; /* "play" icon */ + float: right; + color: #454444; + font-size: 18px; + line-height: 22px; + /* rotate "play" icon from > (right arrow) to down arrow */ + -webkit-transform: rotate(90deg); + -moz-transform: rotate(90deg); + -ms-transform: rotate(90deg); + -o-transform: rotate(90deg); + transform: rotate(90deg); +} + +.active:after { + /* rotate "play" icon from > (right arrow) to ^ (up arrow) */ + -webkit-transform: rotate(-90deg); + -moz-transform: rotate(-90deg); + -ms-transform: rotate(-90deg); + -o-transform: rotate(-90deg); + transform: rotate(-90deg); + color: #F58723; +} + +.panel { + padding: 0 18px; + background-color: #32383A; + max-height: 0; + overflow: hidden; + transition: max-height 0.2s ease-out; +} + +p { + margin: 20px; +} \ No newline at end of file diff --git a/pyconbalkan/core/static/img/euro-python-society.png b/pyconbalkan/core/static/img/euro-python-society.png new file mode 100644 index 00000000..e948c7b4 Binary files /dev/null and b/pyconbalkan/core/static/img/euro-python-society.png differ diff --git a/pyconbalkan/core/static/js/accordion.js b/pyconbalkan/core/static/js/accordion.js new file mode 100644 index 00000000..a4c80ff9 --- /dev/null +++ b/pyconbalkan/core/static/js/accordion.js @@ -0,0 +1,14 @@ +var acc = document.getElementsByClassName("accordion"); +var i; + +for (i = 0; i < acc.length; i++) { + acc[i].addEventListener("click", function() { + this.classList.toggle("active"); + var panel = this.nextElementSibling; + if (panel.style.maxHeight){ + panel.style.maxHeight = null; + } else { + panel.style.maxHeight = panel.scrollHeight + "px"; + } + }); +} \ No newline at end of file diff --git a/pyconbalkan/core/templates/base.html b/pyconbalkan/core/templates/base.html index b751ad26..ec5880b2 100644 --- a/pyconbalkan/core/templates/base.html +++ b/pyconbalkan/core/templates/base.html @@ -43,6 +43,7 @@ + diff --git a/pyconbalkan/core/templates/includes/event_sidebar.html b/pyconbalkan/core/templates/includes/event_sidebar.html index 3943f1f4..0f65eb57 100644 --- a/pyconbalkan/core/templates/includes/event_sidebar.html +++ b/pyconbalkan/core/templates/includes/event_sidebar.html @@ -1,35 +1,39 @@ {% load static %} diff --git a/pyconbalkan/core/templates/includes/header.html b/pyconbalkan/core/templates/includes/header.html index 42d0fd18..6b0100f4 100644 --- a/pyconbalkan/core/templates/includes/header.html +++ b/pyconbalkan/core/templates/includes/header.html @@ -15,6 +15,7 @@ diff --git a/pyconbalkan/faq/__init__.py b/pyconbalkan/faq/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/pyconbalkan/faq/admin.py b/pyconbalkan/faq/admin.py new file mode 100644 index 00000000..3081a880 --- /dev/null +++ b/pyconbalkan/faq/admin.py @@ -0,0 +1,12 @@ +from django.contrib import admin + +from .models import Faq + + +class FaqAdmin(admin.ModelAdmin): + class Meta: + model = Faq + + +admin.site.register(Faq, FaqAdmin) + diff --git a/pyconbalkan/faq/api_urls.py b/pyconbalkan/faq/api_urls.py new file mode 100644 index 00000000..c4e80fae --- /dev/null +++ b/pyconbalkan/faq/api_urls.py @@ -0,0 +1,6 @@ +from rest_framework import routers + +from pyconbalkan.faq.views import FaqViewSet + +router = routers.DefaultRouter() +router.register(r'faq', FaqViewSet) diff --git a/pyconbalkan/faq/apps.py b/pyconbalkan/faq/apps.py new file mode 100644 index 00000000..adcba729 --- /dev/null +++ b/pyconbalkan/faq/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class FaqConfig(AppConfig): + name = 'faq' diff --git a/pyconbalkan/faq/migrations/0001_initial.py b/pyconbalkan/faq/migrations/0001_initial.py new file mode 100644 index 00000000..e7ff0a73 --- /dev/null +++ b/pyconbalkan/faq/migrations/0001_initial.py @@ -0,0 +1,26 @@ +# Generated by Django 2.0.5 on 2018-10-19 20:12 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Faq', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('active', models.BooleanField(default=False)), + ('question', models.CharField(blank=True, max_length=100, null=True)), + ('answer', models.TextField(blank=True, null=True)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/pyconbalkan/faq/migrations/__init__.py b/pyconbalkan/faq/migrations/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/pyconbalkan/faq/models.py b/pyconbalkan/faq/models.py new file mode 100644 index 00000000..edf37288 --- /dev/null +++ b/pyconbalkan/faq/models.py @@ -0,0 +1,11 @@ +from django.db import models + +from pyconbalkan.core.models import ActiveModel + + +class Faq(ActiveModel): + question = models.CharField(null=True, blank=True, max_length=100) + answer = models.TextField(null=True, blank=True) + + def __str__(self): + return self.question diff --git a/pyconbalkan/faq/serializers.py b/pyconbalkan/faq/serializers.py new file mode 100644 index 00000000..547b5685 --- /dev/null +++ b/pyconbalkan/faq/serializers.py @@ -0,0 +1,9 @@ +from rest_framework import serializers + +from pyconbalkan.faq.models import Faq + + +class FaqSerializer(serializers.ModelSerializer): + class Meta: + model = Faq + fields = '__all__' diff --git a/pyconbalkan/faq/templates/faq.html b/pyconbalkan/faq/templates/faq.html new file mode 100644 index 00000000..95cfdee6 --- /dev/null +++ b/pyconbalkan/faq/templates/faq.html @@ -0,0 +1,41 @@ +{% extends "base.html" %} + +{% load static %} + +{% block main_content %} + + {# Faq #} + + + {% if faq %} +
+

F.A.Q - Frequently Asked Questions

+
+ + {% for item in faq %} + +
+

{{ item.answer }}

+
+ {% endfor %} +
+
+ {% else %} +

+ Coming Soon +

+ {% endif %} + + + {% if response_guide %} + +

{{ response_guide.title|safe }}

+
+ {% endif %} + +{% endblock %} + +{% block scripts %} + +{% endblock %} diff --git a/pyconbalkan/faq/tests.py b/pyconbalkan/faq/tests.py new file mode 100644 index 00000000..7ce503c2 --- /dev/null +++ b/pyconbalkan/faq/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/pyconbalkan/faq/views.py b/pyconbalkan/faq/views.py new file mode 100644 index 00000000..fde80a4d --- /dev/null +++ b/pyconbalkan/faq/views.py @@ -0,0 +1,20 @@ +from django.shortcuts import render +from rest_framework import viewsets + +from pyconbalkan.faq.models import Faq +from pyconbalkan.faq.serializers import FaqSerializer +from pyconbalkan.coc.views import coc_view +from pyconbalkan.organizers.views import organizers_list + + +class FaqViewSet(viewsets.ModelViewSet): + queryset = Faq.objects.all() + serializer_class = FaqSerializer + + +def faq_view(request): + faq = Faq.objects.filter(active=True) + context = { + 'faq': faq, + } + return render(request, 'faq.html', context) diff --git a/pyconbalkan/settings.py b/pyconbalkan/settings.py index 7212425a..e9aeae16 100644 --- a/pyconbalkan/settings.py +++ b/pyconbalkan/settings.py @@ -54,6 +54,7 @@ 'pyconbalkan.news', 'pyconbalkan.coc', 'pyconbalkan.info', + 'pyconbalkan.faq', # others 'rest_framework', 'django_countries', diff --git a/pyconbalkan/urls.py b/pyconbalkan/urls.py index ff4fb8bf..23a1c448 100644 --- a/pyconbalkan/urls.py +++ b/pyconbalkan/urls.py @@ -25,6 +25,9 @@ from pyconbalkan.speaker.views import * from pyconbalkan.sponsors.api_urls import router as sponsors from pyconbalkan.sponsors.views import sponsor_view, sponsoring_view, sponsors_view +from pyconbalkan.timetable.views import timetable_view +from pyconbalkan.faq.views import faq_view +from pyconbalkan.faq.api_urls import router as faq router = routers.DefaultRouter() router.extend(conference) @@ -37,6 +40,7 @@ router.extend(contact) router.extend(news) router.extend(coc) +router.extend(faq) urlpatterns = [ path('', views.home, name='index'), @@ -62,6 +66,7 @@ path('admin/', admin.site.urls), path('api/', include(router.urls)), # API path('markdownx/', include(markdownx)), + path('faq', faq_view, name='faq') path('timetable/', serve, {'path': 'pycon-balkan-2018-timetable.pdf', 'document_root': PDF_ROOT}, name='timetable'), # path('timetable/', timetable_view, name='timetable') ] @@ -69,4 +74,4 @@ # Add Django site authentication urls (for login, logout, password management) urlpatterns += [ path('accounts/', include('django.contrib.auth.urls')), -] \ No newline at end of file +]