Merged in feature/base-knowledge-model (pull request #9)
Basic Knowledge Model
This commit is contained in:
commit
aee8d72ebe
|
|
@ -1,7 +1,9 @@
|
||||||
<template>
|
<template>
|
||||||
<div class="basic-knowledge-widget">
|
<div class="basic-knowledge-widget">
|
||||||
<div class="basic-knowledge-widget__description" v-html="value.description"></div>
|
<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>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,9 @@
|
||||||
|
query BasicKnowledgeQuery($slug: String!){
|
||||||
|
basicKnowledge(slug: $slug) {
|
||||||
|
id
|
||||||
|
title
|
||||||
|
slug
|
||||||
|
type
|
||||||
|
contents
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,94 +1,38 @@
|
||||||
<template>
|
<template>
|
||||||
<div class="basic-knowledge">
|
<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>
|
<div v-for="(content, index) in basicKnowledge.contents"
|
||||||
|
v-html="content.value.text"
|
||||||
<p>
|
:key="index"
|
||||||
Es wird zwischen offenen Fragen und geschlossenen Fragen unterschieden:
|
></div>
|
||||||
</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>
|
</div>
|
||||||
</template>
|
</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">
|
<style scoped lang="scss">
|
||||||
@import "@/styles/_variables.scss";
|
@import "@/styles/_variables.scss";
|
||||||
@import "@/styles/_functions.scss";
|
@import "@/styles/_functions.scss";
|
||||||
|
|
@ -117,6 +61,16 @@
|
||||||
& p {
|
& p {
|
||||||
margin-bottom: 40px;
|
margin-bottom: 40px;
|
||||||
}
|
}
|
||||||
|
& ul {
|
||||||
|
padding-left: 25px;
|
||||||
|
}
|
||||||
|
& p + ul {
|
||||||
|
margin-top: -30px;
|
||||||
|
}
|
||||||
|
& li {
|
||||||
|
list-style: disc;
|
||||||
|
line-height: 1.5;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,8 @@
|
||||||
display: grid;
|
display: grid;
|
||||||
}
|
}
|
||||||
justify-items: center;
|
justify-items: center;
|
||||||
grid-template-columns: 400px 1fr 400px;
|
|
||||||
|
grid-template-columns: 400px minmax(max-content, 1fr) minmax(auto, 400px);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* For IE10+
|
* For IE10+
|
||||||
|
|
|
||||||
|
|
@ -43,7 +43,7 @@ const routes = [
|
||||||
{path: '/edit-room/:id', name: 'edit-room', component: editRoom, props: true},
|
{path: '/edit-room/:id', name: 'edit-room', component: editRoom, props: true},
|
||||||
{path: '/room/:slug', name: 'room', component: room, props: true},
|
{path: '/room/:slug', name: 'room', component: room, props: true},
|
||||||
{path: '/article/:slug', name: 'article', component: article, meta: {layout: 'simple'}},
|
{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: '/submission/:id', name: 'submission', component: submission, meta: {layout: 'simple'}},
|
||||||
{
|
{
|
||||||
path: '/book',
|
path: '/book',
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,7 @@ from wagtail.core.fields import StreamField
|
||||||
from wagtail.images.models import Image
|
from wagtail.images.models import Image
|
||||||
|
|
||||||
from assignments.models import Assignment
|
from assignments.models import Assignment
|
||||||
|
from basicknowledge.models import BasicKnowledge
|
||||||
|
|
||||||
|
|
||||||
class GenericStreamFieldType(Scalar):
|
class GenericStreamFieldType(Scalar):
|
||||||
|
|
@ -35,6 +36,13 @@ class GenericStreamFieldType(Scalar):
|
||||||
'id': to_global_id('AssignmentNode', assignment.pk)
|
'id': to_global_id('AssignmentNode', assignment.pk)
|
||||||
}
|
}
|
||||||
d['value'] = value
|
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'])
|
# value = dict(d['value'])
|
||||||
# if 'document' in value:
|
# if 'document' in value:
|
||||||
|
|
|
||||||
|
|
@ -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 api import graphene_wagtail # Keep this import exactly here, it's necessary for StreamField conversion
|
||||||
from assignments.schema.mutations import AssignmentMutations
|
from assignments.schema.mutations import AssignmentMutations
|
||||||
from assignments.schema.queries import AssignmentsQuery, StudentSubmissionQuery
|
from assignments.schema.queries import AssignmentsQuery, StudentSubmissionQuery
|
||||||
|
from basicknowledge.queries import BasicKnowledgeQuery
|
||||||
from books.schema.mutations.main import BookMutations
|
from books.schema.mutations.main import BookMutations
|
||||||
from books.schema.queries import BookQuery
|
from books.schema.queries import BookQuery
|
||||||
from core.schema.mutations.main import CoreMutations
|
from core.schema.mutations.main import CoreMutations
|
||||||
|
|
@ -18,7 +19,7 @@ from users.schema import UsersQuery
|
||||||
|
|
||||||
|
|
||||||
class Query(UsersQuery, RoomsQuery, ObjectivesQuery, BookQuery, AssignmentsQuery, StudentSubmissionQuery,
|
class Query(UsersQuery, RoomsQuery, ObjectivesQuery, BookQuery, AssignmentsQuery, StudentSubmissionQuery,
|
||||||
graphene.ObjectType):
|
BasicKnowledgeQuery, graphene.ObjectType):
|
||||||
node = relay.Node.Field()
|
node = relay.Node.Field()
|
||||||
|
|
||||||
if settings.DEBUG:
|
if settings.DEBUG:
|
||||||
|
|
|
||||||
|
|
@ -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',),
|
||||||
|
),
|
||||||
|
]
|
||||||
|
|
@ -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')
|
||||||
|
]
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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)
|
||||||
|
|
@ -26,7 +26,7 @@ class BasicKnowledgeBlock(blocks.StructBlock):
|
||||||
icon = 'placeholder'
|
icon = 'placeholder'
|
||||||
|
|
||||||
description = blocks.RichTextBlock()
|
description = blocks.RichTextBlock()
|
||||||
url = blocks.URLBlock()
|
basic_knowledge = blocks.PageChooserBlock(required=True, target_model='basicknowledge.BasicKnowledge')
|
||||||
|
|
||||||
|
|
||||||
# 'image_url'
|
# 'image_url'
|
||||||
|
|
|
||||||
|
|
@ -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),
|
||||||
|
),
|
||||||
|
]
|
||||||
|
|
@ -27,4 +27,4 @@ class Book(StrictHierarchyPage):
|
||||||
|
|
||||||
template = 'generic_page.html'
|
template = 'generic_page.html'
|
||||||
|
|
||||||
subpage_types = ['books.Topic']
|
subpage_types = ['books.Topic', 'basicknowledge.BasicKnowledge']
|
||||||
|
|
|
||||||
|
|
@ -50,9 +50,11 @@ INSTALLED_APPS = [
|
||||||
'objectives',
|
'objectives',
|
||||||
'rooms',
|
'rooms',
|
||||||
'assignments',
|
'assignments',
|
||||||
|
'basicknowledge',
|
||||||
|
|
||||||
'wagtail.contrib.forms',
|
'wagtail.contrib.forms',
|
||||||
'wagtail.contrib.redirects',
|
'wagtail.contrib.redirects',
|
||||||
|
'wagtail.contrib.modeladmin',
|
||||||
'wagtail.embeds',
|
'wagtail.embeds',
|
||||||
'wagtail.sites',
|
'wagtail.sites',
|
||||||
'wagtail.users',
|
'wagtail.users',
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue