Skip to content

Instantly share code, notes, and snippets.

@osw4l
Last active November 9, 2016 15:47
Show Gist options
  • Save osw4l/74e02e7f093acd09ac6ff27cd9d88991 to your computer and use it in GitHub Desktop.
Save osw4l/74e02e7f093acd09ac6ff27cd9d88991 to your computer and use it in GitHub Desktop.
filter content by request user
# models
from django.db import models
from django.contrib.auth.models import User
# Create your models here.
class Task(models.Model):
owner = models.ForeignKey('auth.User', related_name='tasks')
completed = models.BooleanField(default=False)
title = models.CharField(max_length=100)
description = models.TextField()
#serializers
from rest_framework import serializers
from ..models import Task
class TaskSerializer(serializers.ModelSerializer):
owner = serializers.ReadOnlyField(source='owner.username')
class Meta:
model = Task
fields = ('id', 'title', 'description', 'completed', 'owner')
# permisions
from rest_framework.permissions import BasePermission, SAFE_METHODS
class IsOwnerOrReadOnly(BasePermission):
def has_object_permission(self, request, view, obj):
if request.method in SAFE_METHODS:
return True
return obj.owner == request.user
# views
from django.contrib.auth import authenticate
from rest_framework import status
from rest_framework.decorators import api_view
from rest_framework.generics import (ListCreateAPIView, RetrieveUpdateDestroyAPIView)
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from .permisions import IsOwnerOrReadOnly
from .serializers import TaskSerializer
from ..models import Task
class TaskMixin(object):
queryset = Task.objects.all()
serializer_class = TaskSerializer
permission_classes = (IsOwnerOrReadOnly, IsAuthenticated,)
def pre_save(self, obj):
obj.owner = self.request.user
def perform_create(self, serializer):
serializer.save(owner=self.request.user)
class TaskList(TaskMixin, ListCreateAPIView):
def get(self, request, *args, **kwargs):
tasks = Task.objects.filter(owner=self.request.user)
serializer = TaskSerializer(tasks, many=True)
return Response({'tasks': serializer.data})
class TaskDetail(TaskMixin, RetrieveUpdateDestroyAPIView):
pass
@api_view(['GET', 'POST'])
def login(request):
if request.method == 'GET':
return Response({'hola': 'bienvenido a mi api'}, status=status.HTTP_200_OK)
if request.method == 'POST':
username = request.data['user']
password = request.data['password']
user = authenticate(username=username, password=password)
if user is not None:
if user.is_active:
return Response({'user': True}, status=status.HTTP_202_ACCEPTED)
return Response({'error': 'usuario o contraseña invalidos'}, status=status.HTTP_200_OK)
#urls
from django.conf.urls import url, include
from .views import categoria_detail, categoria_list, tarea_detail, tarea_list
from rest_framework import routers
from .viewsets import TareaViewSet, CategoriaViewSet
from rest_framework.urlpatterns import format_suffix_patterns
router = routers.DefaultRouter()
router.register(r'tareas-api', TareaViewSet)
router.register(r'categorias-api', CategoriaViewSet)
urlpatterns = [
url(r'^categorias/$', categoria_list),
url(r'^tareas/$', tarea_list),
url(r'^categoria/(?P<pk>[0-9]+)$', categoria_detail),
url(r'^tarea/(?P<pk>[0-9]+)$', tarea_detail),
]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment