176 lines
		
	
	
	
		
			6.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			176 lines
		
	
	
	
		
			6.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| from rest_framework import viewsets,filters
 | |
| from rest_framework import status
 | |
| from rest_framework.response import Response
 | |
| from django.core.exceptions import PermissionDenied
 | |
| from rest_framework.permissions import BasePermission, AllowAny
 | |
| 
 | |
| from odevzdavatko.models import Reseni
 | |
| from tvorba.models import Problem, Uloha
 | |
| 
 | |
| from .models import TextNode, CastNode, UlohaVzorakNode, UlohaZadaniNode, ReseniNode
 | |
| from .models import Text
 | |
| import treenode.serializers as views
 | |
| 
 | |
| from treenode.permissions import AllowWrite
 | |
| 
 | |
| class PermissionMixin(object):
 | |
| 	""" Redefines get_permissions so that only organizers can make changes. """
 | |
| 
 | |
| 	def get_permissions(self):
 | |
| 		permission_classes = []
 | |
| 		print("get_permissions have been called.")
 | |
| 		if self.action in ["create", "update", "partial_update", "destroy"]:
 | |
| 			permission_classes = [AllowWrite] # speciální permission na zápis - orgové
 | |
| 		else:
 | |
| 			permission_classes = [AllowAny] 
 | |
| 		# návštěvník nemusí být zalogován, aby si prohlížel obsah
 | |
| 		return [permission() for permission in permission_classes]
 | |
| 
 | |
| 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 TextViewSet(PermissionMixin, viewsets.ModelViewSet):
 | |
| 	queryset = Text.objects.all()
 | |
| 	serializer_class = views.TextSerializer
 | |
| 
 | |
| class TextNodeViewSet(PermissionMixin, ReadWriteSerializerMixin,viewsets.ModelViewSet):
 | |
| 	queryset = TextNode.objects.all()
 | |
| 	read_serializer_class = views.TextNodeSerializer
 | |
| 	write_serializer_class = views.TextNodeWriteSerializer
 | |
| 	create_serializer_class = views.TextNodeCreateSerializer
 | |
| 
 | |
| class CastNodeViewSet(PermissionMixin, ReadWriteSerializerMixin,viewsets.ModelViewSet):
 | |
| 	queryset = CastNode.objects.all()
 | |
| 	read_serializer_class = views.CastNodeSerializer
 | |
| 	write_serializer_class = views.CastNodeSerializer
 | |
| 	create_serializer_class = views.CastNodeCreateSerializer
 | |
| 
 | |
| 	def destroy(self, request, *args, **kwargs):
 | |
| 		obj = self.get_object()
 | |
| 		print(obj)
 | |
| 		if obj.first_child is None:
 | |
| 			return super().destroy(request,*args,**kwargs)
 | |
| 		raise PermissionDenied('Nelze smazat CastNode, který má děti!')
 | |
| 
 | |
| 
 | |
| class UlohaVzorakNodeViewSet(PermissionMixin, ReadWriteSerializerMixin, viewsets.ModelViewSet):
 | |
| 	read_serializer_class = views.UlohaVzorakNodeSerializer
 | |
| 	write_serializer_class = views.UlohaVzorakNodeWriteSerializer
 | |
| 	create_serializer_class = views.UlohaVzorakNodeCreateSerializer
 | |
| 
 | |
| 	def get_queryset(self):
 | |
| 		queryset = UlohaVzorakNode.objects.all()
 | |
| 		nazev = self.request.query_params.get('nazev',None)
 | |
| 		if nazev is not None:
 | |
| 			queryset = queryset.filter(nazev__contains=nazev)
 | |
| 
 | |
| 		if self.request.user.has_perm('auth.org'):
 | |
| 			return queryset
 | |
| 		else: # pro neorgy jen zveřejněné vzoráky
 | |
| 			return queryset.filter(uloha__cislo_reseni__verejne_db=True)
 | |
| 
 | |
| 		nadproblem = self.request.query_params.get('nadproblem',None)
 | |
| 		if nadproblem is not None:
 | |
| 			queryset = queryset.filter(nadproblem__pk = nadproblem)
 | |
| 		return queryset
 | |
| 
 | |
| class ReseniViewSet(viewsets.ModelViewSet):
 | |
| 	serializer_class = views.ReseniSerializer
 | |
| 
 | |
| 	def get_queryset(self):
 | |
| 		queryset = Reseni.objects.all()
 | |
| 		#FIXME upravit nazvy dle skutecnych polozek reseni
 | |
| 		nazev = self.request.query_params.get('nazev',None)
 | |
| 		if nazev is not None:
 | |
| 			queryset = queryset.filter(nazev__contains=nazev)
 | |
| 		nadproblem = self.request.query_params.get('nadproblem',None)
 | |
| 		if nadproblem is not None:
 | |
| 			queryset = queryset.filter(nadproblem__pk = nadproblem)
 | |
| 		return queryset
 | |
| 
 | |
| class UlohaViewSet(viewsets.ModelViewSet):
 | |
| 	serializer_class = views.UlohaSerializer
 | |
| 
 | |
| 	def get_queryset(self):
 | |
| 		queryset = Uloha.objects.all()
 | |
| 		nazev = self.request.query_params.get('nazev',None)
 | |
| 		if nazev is not None:
 | |
| 			queryset = queryset.filter(nazev__contains=nazev)
 | |
| 		nadproblem = self.request.query_params.get('nadproblem',None)
 | |
| 		if nadproblem is not None:
 | |
| 			queryset = queryset.filter(nadproblem__pk = nadproblem)
 | |
| 		return queryset
 | |
| 
 | |
| class UlohaZadaniNodeViewSet(ReadWriteSerializerMixin, viewsets.ModelViewSet):
 | |
| 	queryset = UlohaZadaniNode.objects.all()
 | |
| 	read_serializer_class = views.UlohaZadaniNodeSerializer
 | |
| 	write_serializer_class = views.UlohaZadaniNodeWriteSerializer
 | |
| 	create_serializer_class = views.UlohaZadaniNodeCreateSerializer
 | |
| 
 | |
| class ReseniNodeViewSet(ReadWriteSerializerMixin, viewsets.ModelViewSet):
 | |
| 	queryset = ReseniNode.objects.all()
 | |
| 	read_serializer_class = views.ReseniNodeSerializer
 | |
| 	write_serializer_class = views.ReseniNodeWriteSerializer
 | |
| 	create_serializer_class = views.ReseniNodeCreateSerializer
 | |
| 
 | |
| 
 | |
| 
 | |
| class ProblemViewSet(viewsets.ModelViewSet):
 | |
| 	serializer_class = views.ProblemSerializer
 | |
| 
 | |
| 	def get_queryset(self):
 | |
| 		queryset = Problem.objects.all()
 | |
| 		ucel = self.request.query_params.get('ucel',None)
 | |
| 		rocnik = self.request.query_params.get('rocnik',None)
 | |
| 		tema = self.request.query_params.get('tema',None)
 | |
| 
 | |
| 		if rocnik is not None:
 | |
| 			queryset = queryset.filter(rocnik=rocnik)
 | |
| 
 | |
| 		#if tema is not None:
 | |
| 
 | |
| 
 | |
| 
 | |
| 		return queryset
 | |
| 
 | 
