add websock functionality

This commit is contained in:
Alexander Laevens
2022-11-30 02:52:56 -07:00
parent 34edcd53cb
commit 339b0c6ad9
41 changed files with 1028 additions and 189 deletions

View File

@@ -1,5 +1,5 @@
from django.apps import AppConfig
from django.db.models.signals import post_save
class ApiConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'

View File

@@ -0,0 +1,18 @@
# Generated by Django 4.1.3 on 2022-11-29 16:15
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('api', '0004_remove_recipe_list_delete_ingredient'),
]
operations = [
migrations.AddField(
model_name='list',
name='updates',
field=models.BigIntegerField(default=0),
),
]

View File

@@ -26,6 +26,7 @@ class Homegroup(models.Model):
class List(models.Model):
# Foreign Key ListIngredient -> List [as ingredients]
homegroup = models.OneToOneField(Homegroup, on_delete=models.CASCADE, primary_key=True)
updates = models.BigIntegerField(default=0);
class Recipe(models.Model):

View File

@@ -1,6 +1,10 @@
from rest_framework import serializers
from api.models import *
from users.serializers import UserSerializer
from asgiref.sync import async_to_sync
from channels.layers import get_channel_layer
channel_layer = get_channel_layer()
class RecipeIngredientSerializer(serializers.ModelSerializer):
class Meta:
@@ -29,9 +33,13 @@ class ListSerializer(serializers.ModelSerializer):
class Meta:
model = List
fields = ["homegroup", "ingredients"]
fields = ["homegroup", "updates", "ingredients"]
read_only_fields = ["homegroup"]
def update(self, instance, validated_data):
# async_to_sync(channel_layer.group_send)(f"group_{instance.homegroup.id}", {"type": "model_update"})
return super().update(instance, validated_data)
def get_ingredients(self, instance):
ingredients = instance.ingredients.all().order_by("name")
return ListIngredientSerializer(ingredients, many=True).data

View File

@@ -3,7 +3,8 @@ from rest_framework import routers
from api import views
router = routers.DefaultRouter()
router.register(r'recipes', views.RecipeView)
router.register(r'recipes', views.RecipeAllView)
router.register(r'searchrecipes', views.RecipeSearchView)
router.register(r'lists', views.ListView)
router.register(r'recipeingredients', views.RecipeIngredientView)
router.register(r'listingredients', views.ListIngredientView)

View File

@@ -1,28 +1,69 @@
from rest_framework import viewsets, mixins, views, status, permissions
from rest_framework import viewsets, mixins, permissions, request, pagination, filters
from rest_framework.response import Response
from rest_framework.request import Request
from api.serializers import *
from api.models import *
class RecipeView(viewsets.ModelViewSet):
class HasHomegroup(permissions.BasePermission):
def has_permission(self, request: Request, view):
if not request.user.homegroup:
return False
return super().has_permission(request, view)
class Pagination(pagination.PageNumberPagination):
page_size = 4
class NoListModelViewset(mixins.CreateModelMixin, mixins.DestroyModelMixin, mixins.UpdateModelMixin, mixins.RetrieveModelMixin, viewsets.GenericViewSet):
pass
class RecipeSearchView(viewsets.ModelViewSet):
serializer_class = RecipeSerializer
permission_classes = [permissions.IsAuthenticated, HasHomegroup]
queryset = Recipe.objects.all()
filter_backends = [filters.SearchFilter]
search_fields = ["name"]
pagination_class = Pagination
def list(self, request: Request, *args, **kwargs):
queryset = self.filter_queryset(Recipe.objects.filter(homegroup=request.user.homegroup).order_by("name"));
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = self.serializer_class(queryset, many=True)
return Response(serializer.data)
class RecipeAllView(viewsets.ModelViewSet):
serializer_class = RecipeSerializer
permission_classes = [permissions.IsAuthenticated, HasHomegroup]
queryset = Recipe.objects.all()
filter_backends = [filters.SearchFilter]
search_fields = ["name"]
def list(self, request: Request, *args, **kwargs):
queryset = self.filter_queryset(Recipe.objects.filter(homegroup=request.user.homegroup).order_by("name"));
serializer = self.serializer_class(queryset, many=True)
return Response(serializer.data)
class HomegroupView(viewsets.ModelViewSet):
serializer_class = HomegroupSerializer
queryset = Homegroup.objects.all()
class HomegroupInviteView(viewsets.ModelViewSet):
class HomegroupInviteView(NoListModelViewset):
serializer_class = InviteSerializer
queryset = HomegroupInvite.objects.all()
class RecipeIngredientView(viewsets.ModelViewSet):
class RecipeIngredientView(NoListModelViewset):
serializer_class = RecipeIngredientSerializer
queryset = RecipeIngredient.objects.all()
class ListIngredientView(viewsets.ModelViewSet):
class ListIngredientView(NoListModelViewset):
serializer_class = ListIngredientSerializer
queryset = ListIngredient.objects.all()
class ListView(mixins.RetrieveModelMixin, viewsets.GenericViewSet):
class ListView(mixins.RetrieveModelMixin, mixins.UpdateModelMixin, viewsets.GenericViewSet):
serializer_class = ListSerializer
queryset = List.objects.all()