Skip to content
Snippets Groups Projects
Commit bff8a013 authored by Jonathan Weth's avatar Jonathan Weth :keyboard: Committed by root
Browse files

Merge pull request #219 from Katharineum/feature/faq

Feature/faq
parents a85b099f 3009d31d
No related branches found
No related tags found
1 merge request!86Merge school-apps
Showing with 1153 additions and 28 deletions
......@@ -12,4 +12,5 @@ media/
node_modules/
dynselect2/src/*
dynselect2/bundle.js
package-lock.json
\ No newline at end of file
package-lock.json
schoolapps/latex/
\ No newline at end of file
......@@ -8,4 +8,5 @@ django-filter
django_react_templatetags
kanboard
PyPDF2
martor
\ No newline at end of file
martor
django_widget_tweaks
\ No newline at end of file
from django.contrib import admin
from faq.models import Question, FAQQuestion
from faq.models import Question, FAQQuestion, FAQSection
from django.utils.html import format_html
# Register your models here.
def show(modeladmin, request, queryset):
queryset.update(show=True)
show.short_description = "Ausgewählte Fragen veröffentlichen"
def hide(modeladmin, request, queryset):
queryset.update(show=False)
hide.short_description = "Ausgewählte Fragen nicht mehr veröffentlichen"
class QuestionAdmin(admin.ModelAdmin):
list_display = ("question_text", "pub_date", "user", "answered")
list_filter = ("answered",)
admin.site.register(Question, QuestionAdmin)
class FAQSectionAdmin(admin.ModelAdmin):
list_display = ("name", "_icon")
class Media:
css = {
'all': ('/static/css/materialdesignicons-webfont/material-icons.css',)
}
def _icon(self, obj):
return format_html(u'<i style="color: {};" class="material-icons">{}<i/>', obj.icon_color, obj.icon)
class FAQQuestionAdmin(admin.ModelAdmin):
list_display = ("question_text", "icon", "show")
list_display = ("question_text", "section", "_icon", "show")
actions = [show, hide]
admin.site.register(FAQQuestion, FAQQuestionAdmin)
\ No newline at end of file
class Media:
css = {
'all': ('/static/css/materialdesignicons-webfont/material-icons.css',)
}
def _icon(self, obj):
return format_html(u'<i class="material-icons">{}<i/>', obj.icon)
admin.site.register(FAQQuestion, FAQQuestionAdmin)
admin.site.register(FAQSection, FAQSectionAdmin)
......@@ -3,3 +3,4 @@ from django.apps import AppConfig
class FaqConfig(AppConfig):
name = 'faq'
verbose_name = "FAQ"
......@@ -2,4 +2,4 @@ from django import forms
class FAQForm(forms.Form):
question = forms.CharField(widget=forms.Textarea(),
label='Bitte geben sie ihre Frage hier ein…', required=True)
\ No newline at end of file
label='Deine Frage', required=True)
# Generated by Django 2.2.3 on 2019-07-22 11:36
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('faq', '0001_initial'),
]
operations = [
migrations.CreateModel(
name='FAQSection',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=200)),
('icon', models.CharField(blank=True, default='question_answer', max_length=20)),
],
),
migrations.AlterField(
model_name='faqquestion',
name='answer_text',
field=models.TextField(blank=True, help_text='Bei den Antworten funktioniert auch HTML-Syntax!<br> Aus Gründen des verwendeten CSS-Frameworks muss der Tag <strong>&lt;ul&gt;</strong> die CSS-Klasse <em>browser-default</em> besitzen!'),
),
migrations.AddField(
model_name='faqquestion',
name='section',
field=models.ForeignKey(blank=True, on_delete=django.db.models.deletion.CASCADE, to='faq.FAQSection'),
preserve_default=False,
),
]
# Generated by Django 2.2.3 on 2019-07-22 12:15
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('faq', '0002_auto_20190722_1336'),
]
operations = [
migrations.AlterModelOptions(
name='faqsection',
options={'verbose_name': 'FAQ-Abschnitt', 'verbose_name_plural': 'FAQ-Abschnitte'},
),
migrations.AddField(
model_name='faqsection',
name='icon_color',
field=models.CharField(choices=[('red', 'red'), ('pink', 'pink'), ('purple', 'purple'), ('deep-purple', 'deep-purple'), ('indigo', 'indigo'), ('blue', 'blue'), ('light-blue', 'light-blue'), ('cyan', 'cyan'), ('teal', 'teal'), ('green', 'green'), ('light-green', 'light-green'), ('lime', 'lime'), ('yellow', 'yellow'), ('amber', 'amber'), ('orange', 'orange'), ('deep-orange', 'deep-orange'), ('brown', 'brown'), ('grey', 'grey'), ('blue-grey', 'blue-grey'), ('black', 'black'), ('white', 'white'), ('transparent', 'transparent')], default='black', max_length=10),
),
]
This diff is collapsed.
from django.db import models
from django.contrib.auth.models import User
from .model_helper import COLORS, ICONS
# Create your models here.
class FAQSection(models.Model):
name = models.CharField(max_length=200, verbose_name="Bezeichnung")
icon = models.CharField(max_length=20, blank=True, default="question_answer", choices=ICONS, verbose_name="Symbol")
icon_color = models.CharField(max_length=10, default="black", choices=COLORS, verbose_name="Symbolfarbe")
def __str__(self):
return self.name
class Meta:
verbose_name = "FAQ-Abschnitt"
verbose_name_plural = "FAQ-Abschnitte"
class FAQQuestion(models.Model):
question_text = models.TextField()
icon = models.CharField(max_length=20, blank=True, default="question_answer")
question_text = models.TextField(verbose_name="Frage")
icon = models.CharField(max_length=20, blank=True, default="question_answer", choices=ICONS, verbose_name="Symbol")
show = models.BooleanField(verbose_name="Veröffentlicht", default=False)
answer_text = models.TextField(blank=True)
answer_text = models.TextField(blank=True,
help_text="Bei den Antworten funktioniert auch HTML-Syntax!<br> Aus Gründen des "
"verwendeten CSS-Frameworks muss der Tag <strong>&lt;ul&gt;</strong> die "
"CSS-Klasse <em>browser-default</em> besitzen!", verbose_name="Antwort")
section = models.ForeignKey(FAQSection, on_delete=models.CASCADE, blank=True, related_name="questions",
verbose_name="Abschnitt")
def __str__(self):
return self.question_text
......@@ -16,11 +38,12 @@ class FAQQuestion(models.Model):
verbose_name = "FAQ-Frage"
verbose_name_plural = "FAQ-Fragen"
class Question(models.Model):
question_text = models.TextField()
pub_date = models.DateTimeField('date published')
question_text = models.TextField(verbose_name="Frage")
pub_date = models.DateTimeField(verbose_name="Veröffentlichungszeitpunkt")
user = models.ForeignKey(User, on_delete=models.CASCADE)
user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="Benutzer")
answered = models.BooleanField(verbose_name="Beantwortet", default=False)
......@@ -29,4 +52,4 @@ class Question(models.Model):
class Meta:
verbose_name = "Frage"
verbose_name_plural = "Fragen"
\ No newline at end of file
verbose_name_plural = "Fragen"
import requests
from django.utils.html import format_html
def parse():
icons_raw = requests.get("https://raw.githubusercontent.com/google/material-design-icons/master/iconfont/codepoints").text
icons_raw = icons_raw.splitlines()
icons = [(i.split()[0], format_html('<i class="material-icons">{}</i>', i.split()[0])) for i in icons_raw]
print(icons)
{% load widget_tweaks %}
{% include 'partials/header.html' %}
<main>
<h3 class="h-with-subtitle">Frage stellen</h3>
<div class="grey-text subtitle">FAQ (frequently asked questions)</div>
<h3 class="h-with-subtitle">Du hast eine Frage?</h3>
<p class="flow-text">
Du hast eine Frage über SchoolApps oder andere Internetdienste des Katharineums und hast die Antwort auf deine
Frage nicht in den
<a href="{% url "faq" %}">FAQ</a>
gefunden? Dann kannst du uns hier deine Frage stellen:
</p>
<form class="col s12" method="post">
{% csrf_token %}
<div class="row">
<div class="input-field col s12">
<textarea id="{{ form.question.id_for_label }}" class="materialize-textarea required"
<textarea id="{{ form.question.id_for_label }}" class="materialize-textarea validate"
name="{{ form.question.html_name }}" required></textarea>
<label for="{{ form.question.id_for_label }}">{{ form.question.label }}</label>
</div>
......
{% include 'partials/header.html' %}
<main>
<h3>FAQ (frequently asked questions)</h3>
<h3>FAQ (Frequently Asked Questions)</h3>
{% for section in sections %}
<section>
<h4>
<i class="material-icons {{ section.icon_color }}-text">{{ section.icon }}</i> {{ section.name }}
</h4>
<ul class="collapsible">
{% for question in questions %}
<li>
<div class="collapsible-header flow-text"><i class="material-icons">{% if question.icon %} {{ question.icon }} {% else %} question_answer {% endif %}</i>{{ question.question_text }}</div>
<div class="collapsible-body"><span class="flow-text">{{ question.answer_text|safe }}</span></div>
</li>
{% endfor %}
</ul>
<ul class="collapsible">
{% for question in section.questions.all %}
<li>
<div class="collapsible-header flow-text">
<i class="material-icons">
{% if question.icon %}
{{ question.icon }}
{% else %}
question_answer
{% endif %}
</i>
{{ question.question_text }}
</div>
<div class="collapsible-body">
{{ question.answer_text|safe }}
</div>
</li>
{% endfor %}
</ul>
</section>
{% endfor %}
<p class="flow-text">
Deine Frage war nicht dabei?
</p>
<p>
<a class="btn blue waves-effect waves-green" href="{% url "ask-faq" %}">
<i class="material-icons left">chat</i>
Deine Frage stellen
</a>
</p>
</main>
{% include 'partials/footer.html' %}
\ No newline at end of file
......@@ -3,12 +3,18 @@
<main>
<p class="flow-text">
Wir haben deine Frage erhalten. Gucke demnächst in dein E-Mail-Postfach, wo du unsere Antwort finden wirst!
<i class="material-icons">done_all</i> Wir haben deine Frage erhalten. Wir werden dir schnellstmöglich
antworten.
</p>
<a href="{% url 'dashboard' %}" class="waves-effect waves-light btn green">
<i class="material-icons left">home</i>
Zurück zur Startseite</a>
Zurück zur Startseite
</a>
<a href="{% url 'faq' %}" class="waves-effect waves-light btn orange">
<i class="material-icons left">question_answer</i>
Zurück zu den FAQ
</a>
</main>
......
from django.shortcuts import render
from faq.models import FAQQuestion, Question
from faq.models import FAQSection, FAQQuestion, Question
from faq.forms import FAQForm
from datetime import datetime
......@@ -16,6 +16,7 @@ def faq(request):
""" Shows the FAQ site, also if not logged in"""
context = {
"questions": FAQQuestion.objects.filter(show=True),
"sections": FAQSection.objects.all(),
}
return render(request, 'faq/faq.html', context)
......
......@@ -398,3 +398,6 @@ FEEDBACK
vertical-align: middle;
}
/*section:not(:last-of-type) {*/
/* border-bottom: solid #bdbdbd 2px;*/
/*}*/
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment