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.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 | ||||
| 
 | ||||
| import seminar.models as m | ||||
| from seminar import treelib | ||||
| 
 | ||||
| DEFAULT_NODE_DEPTH = 2 | ||||
| 
 | ||||
| class TextSerializer(serializers.ModelSerializer): | ||||
| 	class Meta: | ||||
| 		model = m.Text | ||||
| 		fields = '__all__' | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| class UlohaVzorakNodeSerializer(serializers.ModelSerializer): | ||||
| 	class Meta: | ||||
| 		model = m.UlohaVzorakNode | ||||
|  | @ -54,9 +62,44 @@ class PohadkaNodeSerializer(serializers.ModelSerializer): | |||
| 		depth = DEFAULT_NODE_DEPTH | ||||
| 
 | ||||
| class TextNodeSerializer(serializers.ModelSerializer): | ||||
| 	text = TextSerializer() | ||||
| 
 | ||||
| 	class Meta: | ||||
| 		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 | ||||
| 
 | ||||
| class CastNodeSerializer(serializers.ModelSerializer): | ||||
|  | @ -85,5 +128,5 @@ class TreeNodeSerializer(PolymorphicSerializer): | |||
| 		m.TextNode: TextNodeSerializer, | ||||
| 		m.CastNode: CastNodeSerializer, | ||||
| 		m.ReseniNode: ReseniNodeSerializer, | ||||
| 	 | ||||
| 	} | ||||
| 
 | ||||
|  |  | |||
|  | @ -2,6 +2,59 @@ from rest_framework import viewsets,filters | |||
| from . import models as m | ||||
| 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): | ||||
| 	queryset = m.UlohaVzorakNode.objects.all() | ||||
| 	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('ulohaVzorakNode')" v-on:click="selected='ulohaVzorakNode'" :disabled="selected && selected !== 'ulohaVzorakNode'">Vzorák</button> | ||||
| 		<div v-if="selected"> | ||||
| 			<component :is='selected' :item='null' create></component> | ||||
| 			<component :is='selected' :item='null' :where="where" :refnode="refnode" create></component> | ||||
| 		</div> | ||||
| 	</div> | ||||
| </template> | ||||
|  | @ -22,7 +22,8 @@ export default { | |||
| 	name: 'AddNewNode', | ||||
| 	props: { | ||||
| 		types: Array, | ||||
| 		where: String | ||||
| 		where: String, | ||||
| 		refnode: Object, | ||||
| 	}, | ||||
| 	data: () => ({ | ||||
| 		selected: null, | ||||
|  |  | |||
|  | @ -48,7 +48,9 @@ export default { | |||
| 	props: { | ||||
| 		item: Object, | ||||
| 		editorShow: Boolean, | ||||
| 		create: Boolean | ||||
| 		create: Boolean, | ||||
| 		where: String, | ||||
| 		refnode: Object | ||||
| 	}, | ||||
| 	mounted: function() { | ||||
| 		//console.log("mounted"); | ||||
|  | @ -82,8 +84,38 @@ export default { | |||
| 		updateText: function() { | ||||
| 			console.log("Saving text"); | ||||
| 			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! | ||||
| 			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.appendable_children.length > 0"> | ||||
| 		<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 v-if="item.children.length > 0 && item.children[0].appendable_siblings.length > 0"> | ||||
| 		<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> | ||||
| 
 | ||||
| 	<ul> | ||||
|  | @ -24,7 +24,7 @@ | |||
| 			<div v-if="chld.appendable_siblings.length > 0"> | ||||
| 				<b v-if="index < (item.children.length - 1)">Vložit mezi</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> | ||||
| 		</li> | ||||
| 	</ul> | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue