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