TreeNode editor | working adding and editing TextNodes.
This commit is contained in:
parent
40e2b2bdfc
commit
c9e8e737da
6 changed files with 139 additions and 8 deletions
|
@ -4,4 +4,6 @@ from seminar import viewsets as vs
|
||||||
router = routers.DefaultRouter()
|
router = routers.DefaultRouter()
|
||||||
|
|
||||||
router.register(r'ulohavzoraknode', vs.UlohaVzorakNodeViewSet)
|
router.register(r'ulohavzoraknode', vs.UlohaVzorakNodeViewSet)
|
||||||
|
router.register(r'text', vs.TextViewSet)
|
||||||
|
router.register(r'textnode', vs.TextNodeViewSet)
|
||||||
|
|
||||||
|
|
|
@ -2,9 +2,17 @@ from rest_framework import serializers
|
||||||
from rest_polymorphic.serializers import PolymorphicSerializer
|
from rest_polymorphic.serializers import PolymorphicSerializer
|
||||||
|
|
||||||
import seminar.models as m
|
import seminar.models as m
|
||||||
|
from seminar import treelib
|
||||||
|
|
||||||
DEFAULT_NODE_DEPTH = 2
|
DEFAULT_NODE_DEPTH = 2
|
||||||
|
|
||||||
|
class TextSerializer(serializers.ModelSerializer):
|
||||||
|
class Meta:
|
||||||
|
model = m.Text
|
||||||
|
fields = '__all__'
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class UlohaVzorakNodeSerializer(serializers.ModelSerializer):
|
class UlohaVzorakNodeSerializer(serializers.ModelSerializer):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = m.UlohaVzorakNode
|
model = m.UlohaVzorakNode
|
||||||
|
@ -54,9 +62,44 @@ class PohadkaNodeSerializer(serializers.ModelSerializer):
|
||||||
depth = DEFAULT_NODE_DEPTH
|
depth = DEFAULT_NODE_DEPTH
|
||||||
|
|
||||||
class TextNodeSerializer(serializers.ModelSerializer):
|
class TextNodeSerializer(serializers.ModelSerializer):
|
||||||
|
text = TextSerializer()
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = m.TextNode
|
model = m.TextNode
|
||||||
fields = '__all__'
|
fields = ('id','text','polymorphic_ctype')
|
||||||
|
depth = DEFAULT_NODE_DEPTH
|
||||||
|
|
||||||
|
class TextNodeWriteSerializer(serializers.ModelSerializer):
|
||||||
|
text = TextSerializer()
|
||||||
|
|
||||||
|
def update(self,node,validated_data):
|
||||||
|
node.text.na_web = validated_data.get('text').get('na_web')
|
||||||
|
return node
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = m.TextNode
|
||||||
|
fields = ('id','text')
|
||||||
|
depth = DEFAULT_NODE_DEPTH
|
||||||
|
|
||||||
|
class TextNodeCreateSerializer(serializers.ModelSerializer):
|
||||||
|
text = TextSerializer()
|
||||||
|
refnode = serializers.CharField()
|
||||||
|
where = serializers.CharField()
|
||||||
|
|
||||||
|
def create(self,validated_data):
|
||||||
|
temp_text = validated_data.pop('text')
|
||||||
|
where = validated_data.pop('where')
|
||||||
|
refnode_id = validated_data.pop('refnode')
|
||||||
|
refnode = m.TreeNode.objects.get(pk=refnode_id)
|
||||||
|
text = m.Text.objects.create(**temp_text)
|
||||||
|
node = treelib.create_child(refnode,m.TextNode,text=text)
|
||||||
|
node.where = None
|
||||||
|
node.refnode = None
|
||||||
|
return node
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = m.TextNode
|
||||||
|
fields = ('text','where','refnode')
|
||||||
depth = DEFAULT_NODE_DEPTH
|
depth = DEFAULT_NODE_DEPTH
|
||||||
|
|
||||||
class CastNodeSerializer(serializers.ModelSerializer):
|
class CastNodeSerializer(serializers.ModelSerializer):
|
||||||
|
@ -85,5 +128,5 @@ class TreeNodeSerializer(PolymorphicSerializer):
|
||||||
m.TextNode: TextNodeSerializer,
|
m.TextNode: TextNodeSerializer,
|
||||||
m.CastNode: CastNodeSerializer,
|
m.CastNode: CastNodeSerializer,
|
||||||
m.ReseniNode: ReseniNodeSerializer,
|
m.ReseniNode: ReseniNodeSerializer,
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,59 @@ from rest_framework import viewsets,filters
|
||||||
from . import models as m
|
from . import models as m
|
||||||
from . import views
|
from . import views
|
||||||
|
|
||||||
|
class ReadWriteSerializerMixin(object):
|
||||||
|
"""
|
||||||
|
Overrides get_serializer_class to choose the read serializer
|
||||||
|
for GET requests and the write serializer for POST requests.
|
||||||
|
|
||||||
|
Set read_serializer_class and write_serializer_class attributes on a
|
||||||
|
viewset.
|
||||||
|
"""
|
||||||
|
|
||||||
|
read_serializer_class = None
|
||||||
|
create_serializer_class = None
|
||||||
|
write_serializer_class = None
|
||||||
|
|
||||||
|
def get_serializer_class(self):
|
||||||
|
if self.action == "create":
|
||||||
|
return self.get_create_serializer_class()
|
||||||
|
if self.action in ["update", "partial_update", "destroy"]:
|
||||||
|
return self.get_write_serializer_class()
|
||||||
|
return self.get_read_serializer_class()
|
||||||
|
|
||||||
|
def get_read_serializer_class(self):
|
||||||
|
assert self.read_serializer_class is not None, (
|
||||||
|
"'%s' should either include a `read_serializer_class` attribute,"
|
||||||
|
"or override the `get_read_serializer_class()` method."
|
||||||
|
% self.__class__.__name__
|
||||||
|
)
|
||||||
|
return self.read_serializer_class
|
||||||
|
|
||||||
|
def get_write_serializer_class(self):
|
||||||
|
assert self.write_serializer_class is not None, (
|
||||||
|
"'%s' should either include a `write_serializer_class` attribute,"
|
||||||
|
"or override the `get_write_serializer_class()` method."
|
||||||
|
% self.__class__.__name__
|
||||||
|
)
|
||||||
|
return self.write_serializer_class
|
||||||
|
|
||||||
|
def get_create_serializer_class(self):
|
||||||
|
assert self.create_serializer_class is not None, (
|
||||||
|
"'%s' should either include a `create_serializer_class` attribute,"
|
||||||
|
"or override the `get_create_serializer_class()` method."
|
||||||
|
% self.__class__.__name__
|
||||||
|
)
|
||||||
|
return self.create_serializer_class
|
||||||
|
|
||||||
class UlohaVzorakNodeViewSet(viewsets.ModelViewSet):
|
class UlohaVzorakNodeViewSet(viewsets.ModelViewSet):
|
||||||
queryset = m.UlohaVzorakNode.objects.all()
|
queryset = m.UlohaVzorakNode.objects.all()
|
||||||
serializer_class = views.UlohaVzorakNodeSerializer
|
serializer_class = views.UlohaVzorakNodeSerializer
|
||||||
|
|
||||||
|
class TextViewSet(viewsets.ModelViewSet):
|
||||||
|
queryset = m.Text.objects.all()
|
||||||
|
serializer_class = views.TextSerializer
|
||||||
|
|
||||||
|
class TextNodeViewSet(ReadWriteSerializerMixin,viewsets.ModelViewSet):
|
||||||
|
queryset = m.TextNode.objects.all()
|
||||||
|
read_serializer_class = views.TextNodeSerializer
|
||||||
|
write_serializer_class = views.TextNodeWriteSerializer
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
<button v-if="types.includes('ulohaZadaniNode')" v-on:click="selected='ulohaZadaniNode'" :disabled="selected && selected !== 'ulohaZadaniNode'">Zadání úlohy</button>
|
<button v-if="types.includes('ulohaZadaniNode')" v-on:click="selected='ulohaZadaniNode'" :disabled="selected && selected !== 'ulohaZadaniNode'">Zadání úlohy</button>
|
||||||
<button v-if="types.includes('ulohaVzorakNode')" v-on:click="selected='ulohaVzorakNode'" :disabled="selected && selected !== 'ulohaVzorakNode'">Vzorák</button>
|
<button v-if="types.includes('ulohaVzorakNode')" v-on:click="selected='ulohaVzorakNode'" :disabled="selected && selected !== 'ulohaVzorakNode'">Vzorák</button>
|
||||||
<div v-if="selected">
|
<div v-if="selected">
|
||||||
<component :is='selected' :item='null' create></component>
|
<component :is='selected' :item='null' :where="where" :refnode="refnode" create></component>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
@ -22,7 +22,8 @@ export default {
|
||||||
name: 'AddNewNode',
|
name: 'AddNewNode',
|
||||||
props: {
|
props: {
|
||||||
types: Array,
|
types: Array,
|
||||||
where: String
|
where: String,
|
||||||
|
refnode: Object,
|
||||||
},
|
},
|
||||||
data: () => ({
|
data: () => ({
|
||||||
selected: null,
|
selected: null,
|
||||||
|
|
|
@ -48,7 +48,9 @@ export default {
|
||||||
props: {
|
props: {
|
||||||
item: Object,
|
item: Object,
|
||||||
editorShow: Boolean,
|
editorShow: Boolean,
|
||||||
create: Boolean
|
create: Boolean,
|
||||||
|
where: String,
|
||||||
|
refnode: Object
|
||||||
},
|
},
|
||||||
mounted: function() {
|
mounted: function() {
|
||||||
//console.log("mounted");
|
//console.log("mounted");
|
||||||
|
@ -82,8 +84,38 @@ export default {
|
||||||
updateText: function() {
|
updateText: function() {
|
||||||
console.log("Saving text");
|
console.log("Saving text");
|
||||||
console.log(this.currentText);
|
console.log(this.currentText);
|
||||||
|
if (this.create){
|
||||||
|
console.log(this.refnode);
|
||||||
|
console.log(this.where);
|
||||||
|
axios.post('/api/textnode/',{
|
||||||
|
'text': { 'na_web': this.currentText},
|
||||||
|
'refnode': this.refnode.id,
|
||||||
|
'where': this.where
|
||||||
|
}).then(response => {this.originalText = response.data.text.na_web})
|
||||||
|
.catch(e => {
|
||||||
|
this.errors.push(e)
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
axios.put('/api/textnode/'+this.item.node.id+'/',{
|
||||||
|
'text': { 'na_web': this.currentText},
|
||||||
|
'id': this.item.node.id
|
||||||
|
}).then(response => {this.originalText = response.data.text.na_web})
|
||||||
|
.catch(e => {
|
||||||
|
this.errors.push(e)
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
// FIXME really save!
|
// FIXME really save!
|
||||||
this.editorShow = false;
|
this.editorShow = false;
|
||||||
|
},
|
||||||
|
save: function() {
|
||||||
|
console.log(this.item);
|
||||||
|
if (this.create){
|
||||||
|
console.log(this.refnode);
|
||||||
|
console.log(this.where);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,12 +9,12 @@
|
||||||
<div v-if="item.children.length === 0">
|
<div v-if="item.children.length === 0">
|
||||||
<div v-if="item.appendable_children.length > 0">
|
<div v-if="item.appendable_children.length > 0">
|
||||||
<b>Vložit jako syna</b>
|
<b>Vložit jako syna</b>
|
||||||
<addnewnode :types="item.appendable_siblings" where="syn" />
|
<addnewnode :types="item.appendable_siblings" :refnode="item.node" where="syn" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="item.children.length > 0 && item.children[0].appendable_siblings.length > 0">
|
<div v-if="item.children.length > 0 && item.children[0].appendable_siblings.length > 0">
|
||||||
<b>Vložit před</b>
|
<b>Vložit před</b>
|
||||||
<addnewnode :types="item.children[0].appendable_siblings" where="pred" />
|
<addnewnode :types="item.children[0].appendable_siblings" :refnode="item.children[0].node" where="pred" />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
|
@ -24,7 +24,7 @@
|
||||||
<div v-if="chld.appendable_siblings.length > 0">
|
<div v-if="chld.appendable_siblings.length > 0">
|
||||||
<b v-if="index < (item.children.length - 1)">Vložit mezi</b>
|
<b v-if="index < (item.children.length - 1)">Vložit mezi</b>
|
||||||
<b v-else>Vložit za</b>
|
<b v-else>Vložit za</b>
|
||||||
<addnewnode :types="chld.appendable_siblings" where="za" />
|
<addnewnode :types="chld.appendable_siblings" :refnode="chld.node" where="za" />
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
Loading…
Reference in a new issue