Merged in feature/base-knowledge-model (pull request #9)
Basic Knowledge Model
This commit is contained in:
commit
aee8d72ebe
|
|
@ -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>
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,9 @@
|
|||
query BasicKnowledgeQuery($slug: String!){
|
||||
basicKnowledge(slug: $slug) {
|
||||
id
|
||||
title
|
||||
slug
|
||||
type
|
||||
contents
|
||||
}
|
||||
}
|
||||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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+
|
||||
|
|
|
|||
|
|
@ -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',
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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'
|
||||
|
||||
description = blocks.RichTextBlock()
|
||||
url = blocks.URLBlock()
|
||||
basic_knowledge = blocks.PageChooserBlock(required=True, target_model='basicknowledge.BasicKnowledge')
|
||||
|
||||
|
||||
# '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'
|
||||
|
||||
subpage_types = ['books.Topic']
|
||||
subpage_types = ['books.Topic', 'basicknowledge.BasicKnowledge']
|
||||
|
|
|
|||
|
|
@ -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',
|
||||
|
|
|
|||
Loading…
Reference in New Issue