Merged in feature/base-knowledge-model (pull request #9)

Basic Knowledge Model
This commit is contained in:
Ramon Wenger 2018-10-25 12:35:36 +00:00
commit aee8d72ebe
17 changed files with 212 additions and 102 deletions

View File

@ -1,7 +1,9 @@
<template>
<div class="basic-knowledge-widget">
<div class="basic-knowledge-widget__description" v-html="value.description"></div>
<router-link class="basic-knowledge-widget__button button" tag="button" to="/basic-knowledge">Basiswissen lesen</router-link>
<router-link class="basic-knowledge-widget__button button" tag="button"
:to="{name: 'basic-knowledge', params: { slug: value.slug }}">Basiswissen lesen
</router-link>
</div>
</template>

View File

@ -0,0 +1,9 @@
query BasicKnowledgeQuery($slug: String!){
basicKnowledge(slug: $slug) {
id
title
slug
type
contents
}
}

View File

@ -1,94 +1,38 @@
<template>
<div class="basic-knowledge">
<h1 class="basic-knowledge__title">Basiswissen: Fragetypen</h1>
<h1 class="basic-knowledge__title">{{basicKnowledge.title}}</h1>
<h3>Offene und geschlossene Fragen</h3>
<p>
Es wird zwischen offenen Fragen und geschlossenen Fragen unterschieden:
</p>
<h4>Offene Fragen</h4>
<p>
Offene Fragen beginnen mit einem W-Fragewort (wann, was, wie, welche usw.). Die befragte Person entscheidet, was
sie antwortet und ob die Antwort knapp oder ausführlich ausfällt. <br>
Beispiel: Wann sind Sie zum letzten Mal mit dem Zug gefahren?
</p>
<h4>Geschlossene Fragen</h4>
<h5>
Entscheidungsfrage
</h5>
<p>
Die befragte Person antwortet mit Ja oder Nein.<br>
Beispiel: Fahren Sie mit dem Auto zur Arbeit?
</p>
<h5>
Alternativfrage
</h5>
<p>
Zwei (oder mehr) Antwortmöglichkeiten sind vorhanden (entweder oder). <br>
Beispiel: Fahren Sie lieber mit dem Auto oder mit öffentlichen Verkehrsmitteln zur Arbeit?
</p>
<h3>
Weitere Fragetypen
</h3>
<p>
Auf eine Frage kann eine Anschlussfrage folgen, oder es können verschiedene Fragen miteinander kombiniert werden:
</p>
<h4>
Anschlussfrage
</h4>
<p>
Der Interviewer bezieht sich auf eine Antwort, die die Befragte gegeben hat, und stellt dazu eine weitere Frage.
Diese kann als offene oder geschlossene Frage formuliert sein. Beispiel: Warum fahren Sie denn lieber mit dem
Auto?
</p>
<h4>
Mehrfachfrage
</h4>
<p>
Die Interviewerin kombiniert zwei oder mehrere Fragen. Auch diese können als offene oder geschlossene Fragen
formuliert sein. Beispiel: Sind Sie letzte Woche mit dem Zug zur Arbeit gefahren, und wenn ja: wie oft?
</p>
<p>
Manche Fragen versuchen, die befragte Person zu beeinflussen oder bestimmte Gedanken oderGefühle in ihr
auszulösen:
</p>
<h4>
Suggestivfrage (suggerieren = einreden, vorschlagen)
</h4>
<p>
Die Interviewerin macht dem Befragten deutlich, welche Antwort sie erwartet. Der Befragte soll auf diese Weise
beeinflusst werden, sodass er den Ideen und Bewertungen der Interviewerin zustimmt. Beispiel: Sie denken doch
sicher auch, dass das Angebot öffentlicher Verkehrsmittel unzureichend ist?
</p>
<h4>
Rhetorische Frage (Rhetorik = Redekunst)
</h4>
<p>
Der Zuhörer soll durch die Frage neugierig gemacht werden. Sie dient nicht dazu, Informationen zu gewinnen.
Beispiel: Haben Sie etwas dagegen, dass ich Ihnen als Dank einen Kinogutschein überreiche?
</p>
<div v-for="(content, index) in basicKnowledge.contents"
v-html="content.value.text"
:key="index"
></div>
</div>
</template>
<script>
import BASIC_KNOWLEDGE_QUERY from '@/graphql/gql/basicKnowledgeQuery.gql';
export default {
apollo: {
basicKnowledge() {
return {
query: BASIC_KNOWLEDGE_QUERY,
variables: {
slug: this.$route.params.slug
}
}
}
},
data() {
return {
basicKnowledge: {}
}
}
}
</script>
<style scoped lang="scss">
@import "@/styles/_variables.scss";
@import "@/styles/_functions.scss";
@ -117,6 +61,16 @@
& p {
margin-bottom: 40px;
}
& ul {
padding-left: 25px;
}
& p + ul {
margin-top: -30px;
}
& li {
list-style: disc;
line-height: 1.5;
}
}
}
</style>

View File

@ -22,7 +22,8 @@
display: grid;
}
justify-items: center;
grid-template-columns: 400px 1fr 400px;
grid-template-columns: 400px minmax(max-content, 1fr) minmax(auto, 400px);
/*
* For IE10+

View File

@ -43,7 +43,7 @@ const routes = [
{path: '/edit-room/:id', name: 'edit-room', component: editRoom, props: true},
{path: '/room/:slug', name: 'room', component: room, props: true},
{path: '/article/:slug', name: 'article', component: article, meta: {layout: 'simple'}},
{path: '/basic-knowledge', name: 'basic-knowledge', component: basicknowledge, meta: {layout: 'simple'}},
{path: '/basic-knowledge/:slug', name: 'basic-knowledge', component: basicknowledge, meta: {layout: 'simple'}},
{path: '/submission/:id', name: 'submission', component: submission, meta: {layout: 'simple'}},
{
path: '/book',

View File

@ -8,6 +8,7 @@ from wagtail.core.fields import StreamField
from wagtail.images.models import Image
from assignments.models import Assignment
from basicknowledge.models import BasicKnowledge
class GenericStreamFieldType(Scalar):
@ -35,20 +36,27 @@ class GenericStreamFieldType(Scalar):
'id': to_global_id('AssignmentNode', assignment.pk)
}
d['value'] = value
if _type == 'basic_knowledge':
_value = d['value']
basic_knowledge = BasicKnowledge.objects.get(pk=_value['basic_knowledge'])
_value.update({
'slug': basic_knowledge.slug
})
d['value'] = _value
# value = dict(d['value'])
# if 'document' in value:
# value['document'] = Document.objects.get(id=value['document']).file.url
# if 'image' in value:
# value['image'] = Image.objects.get(id=value['image']).file.url
# value = dict(d['value'])
# if 'document' in value:
# value['document'] = Document.objects.get(id=value['document']).file.url
# if 'image' in value:
# value['image'] = Image.objects.get(id=value['image']).file.url
# else:
# _type = d[0]
# value = dict(d[1])
# if 'document' in value:
# value['document'] = value['document'].file.url
# if 'image' in value:
# value['image'] = value['image'].file.url
# else:
# _type = d[0]
# value = dict(d[1])
# if 'document' in value:
# value['document'] = value['document'].file.url
# if 'image' in value:
# value['image'] = value['image'].file.url
return stream_data

View File

@ -7,6 +7,7 @@ from graphene_django.debug import DjangoDebug
from api import graphene_wagtail # Keep this import exactly here, it's necessary for StreamField conversion
from assignments.schema.mutations import AssignmentMutations
from assignments.schema.queries import AssignmentsQuery, StudentSubmissionQuery
from basicknowledge.queries import BasicKnowledgeQuery
from books.schema.mutations.main import BookMutations
from books.schema.queries import BookQuery
from core.schema.mutations.main import CoreMutations
@ -18,7 +19,7 @@ from users.schema import UsersQuery
class Query(UsersQuery, RoomsQuery, ObjectivesQuery, BookQuery, AssignmentsQuery, StudentSubmissionQuery,
graphene.ObjectType):
BasicKnowledgeQuery, graphene.ObjectType):
node = relay.Node.Field()
if settings.DEBUG:

View File

View File

@ -0,0 +1,31 @@
# Generated by Django 2.0.6 on 2018-10-25 08:59
from django.db import migrations, models
import django.db.models.deletion
import wagtail.core.blocks
import wagtail.core.fields
import wagtail.images.blocks
class Migration(migrations.Migration):
initial = True
dependencies = [
('wagtailcore', '0040_page_draft_title'),
]
operations = [
migrations.CreateModel(
name='BasicKnowledge',
fields=[
('page_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='wagtailcore.Page')),
('contents', wagtail.core.fields.StreamField([('text_block', wagtail.core.blocks.StructBlock([('text', wagtail.core.blocks.RichTextBlock())])), ('image_block', wagtail.images.blocks.ImageChooserBlock()), ('link_block', wagtail.core.blocks.StructBlock([('text', wagtail.core.blocks.TextBlock()), ('url', wagtail.core.blocks.URLBlock())])), ('video_block', wagtail.core.blocks.StructBlock([('url', wagtail.core.blocks.URLBlock())])), ('document_block', wagtail.core.blocks.StructBlock([('url', wagtail.core.blocks.URLBlock())]))], blank=True, null=True)),
('type', models.CharField(choices=[('language_communication', 'Sprache & Kommunikation'), ('society', 'Gesellschaft')], max_length=100)),
],
options={
'abstract': False,
},
bases=('wagtailcore.page',),
),
]

View File

@ -0,0 +1,38 @@
from django.db import models
from wagtail.admin.edit_handlers import FieldPanel, StreamFieldPanel
from wagtail.core.fields import StreamField
from wagtail.images.blocks import ImageChooserBlock
from books.blocks import TextBlock, LinkBlock, VideoBlock, DocumentBlock
from core.wagtail_utils import StrictHierarchyPage
class BasicKnowledge(StrictHierarchyPage):
parent_page_types = ['books.book']
contents = StreamField([
('text_block', TextBlock()),
('image_block', ImageChooserBlock()),
('link_block', LinkBlock()),
('video_block', VideoBlock()),
('document_block', DocumentBlock()),
], null=True, blank=True)
LANGUAGE_COMMUNICATION = 'language_communication'
SOCIETY = 'society'
TYPE_CHOICES = (
(LANGUAGE_COMMUNICATION, 'Sprache & Kommunikation'),
(SOCIETY, 'Gesellschaft'),
)
type = models.CharField(
max_length=100,
choices=TYPE_CHOICES
)
content_panels = [
FieldPanel('title', classname="full title"),
FieldPanel('type'),
StreamFieldPanel('contents')
]

View File

@ -0,0 +1,32 @@
import graphene
from graphene import relay
from graphene_django import DjangoObjectType
from graphene_django.filter import DjangoFilterConnectionField
from api.utils import get_object
from .models import BasicKnowledge
class BasicKnowledgeNode(DjangoObjectType):
class Meta:
model = BasicKnowledge
filter_fields = ['slug']
interfaces = (relay.Node,)
only_fields = [
'slug', 'title', 'type', 'contents',
]
class BasicKnowledgeQuery(object):
basic_knowledge = graphene.Field(BasicKnowledgeNode, slug=graphene.String(), id=graphene.ID())
basic_knowledge_pages = DjangoFilterConnectionField(BasicKnowledgeNode)
def resolve_basic_knowledge(self, info, **kwargs):
slug = kwargs.get('slug')
room_id = kwargs.get('id')
if room_id is not None:
return get_object(BasicKnowledge, room_id)
if slug is not None:
return BasicKnowledge.objects.get(slug=slug)
return None

View File

@ -0,0 +1,11 @@
from wagtail.contrib.modeladmin.options import ModelAdmin, modeladmin_register
from .models import BasicKnowledge
class BasicKnowledgeAdmin(ModelAdmin):
model = BasicKnowledge
menu_label = 'Basiswissen'
list_display = ('title',)
modeladmin_register(BasicKnowledgeAdmin)

View File

@ -26,7 +26,7 @@ class BasicKnowledgeBlock(blocks.StructBlock):
icon = 'placeholder'
description = blocks.RichTextBlock()
url = blocks.URLBlock()
basic_knowledge = blocks.PageChooserBlock(required=True, target_model='basicknowledge.BasicKnowledge')
# 'image_url'

View File

@ -0,0 +1,21 @@
# Generated by Django 2.0.6 on 2018-10-25 11:55
from django.db import migrations
import wagtail.core.blocks
import wagtail.core.fields
import wagtail.images.blocks
class Migration(migrations.Migration):
dependencies = [
('books', '0004_remove_module_order'),
]
operations = [
migrations.AlterField(
model_name='contentblock',
name='contents',
field=wagtail.core.fields.StreamField([('text_block', wagtail.core.blocks.StructBlock([('text', wagtail.core.blocks.RichTextBlock())])), ('basic_knowledge', wagtail.core.blocks.StructBlock([('description', wagtail.core.blocks.RichTextBlock()), ('basic_knowledge', wagtail.core.blocks.PageChooserBlock(required=True, target_model=['basicknowledge.BasicKnowledge']))])), ('assignment', wagtail.core.blocks.StructBlock([('assignment_id', wagtail.core.blocks.IntegerBlock())])), ('image_block', wagtail.images.blocks.ImageChooserBlock()), ('image_url_block', wagtail.core.blocks.StructBlock([('title', wagtail.core.blocks.TextBlock()), ('url', wagtail.core.blocks.URLBlock())])), ('link_block', wagtail.core.blocks.StructBlock([('text', wagtail.core.blocks.TextBlock()), ('url', wagtail.core.blocks.URLBlock())])), ('task', wagtail.core.blocks.StructBlock([('text', wagtail.core.blocks.RichTextBlock())], icon='tick')), ('video_block', wagtail.core.blocks.StructBlock([('url', wagtail.core.blocks.URLBlock())])), ('document_block', wagtail.core.blocks.StructBlock([('url', wagtail.core.blocks.URLBlock())]))], blank=True, null=True),
),
]

View File

@ -27,4 +27,4 @@ class Book(StrictHierarchyPage):
template = 'generic_page.html'
subpage_types = ['books.Topic']
subpage_types = ['books.Topic', 'basicknowledge.BasicKnowledge']

View File

@ -50,9 +50,11 @@ INSTALLED_APPS = [
'objectives',
'rooms',
'assignments',
'basicknowledge',
'wagtail.contrib.forms',
'wagtail.contrib.redirects',
'wagtail.contrib.modeladmin',
'wagtail.embeds',
'wagtail.sites',
'wagtail.users',