Skip to content

Commit

Permalink
removing menus
Browse files Browse the repository at this point in the history
  • Loading branch information
RyanNoelk committed Aug 27, 2018
1 parent ebf16d6 commit 8014dfe
Show file tree
Hide file tree
Showing 10 changed files with 64 additions and 218 deletions.
11 changes: 1 addition & 10 deletions v1/menu/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,7 @@
# encoding: utf-8

from django.contrib import admin
from .models import Menu, MenuItem


class MenuAdmin(admin.ModelAdmin):
# ordering = ['title', 'ingredient_group']
# list_display = ['title', 'quantity', 'measurement']
# list_filter = ['ingredient_group__title']
# search_fields = ['title', 'ingredient_group__title', ]
pass
from .models import MenuItem


class MenuItemAdmin(admin.ModelAdmin):
Expand All @@ -21,5 +13,4 @@ class MenuItemAdmin(admin.ModelAdmin):
pass


admin.site.register(Menu, MenuAdmin)
admin.site.register(MenuItem, MenuItemAdmin)
37 changes: 37 additions & 0 deletions v1/menu/migrations/0007_auto_20180827_2124.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
# Generated by Django 2.0.1 on 2018-08-27 21:24

from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):

dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('menu', '0006_menuitem_all_day'),
]

operations = [
migrations.RemoveField(
model_name='menu',
name='author',
),
migrations.RemoveField(
model_name='menuitem',
name='menu',
),
migrations.AddField(
model_name='menuitem',
name='author',
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL),
),
migrations.AddField(
model_name='menuitem',
name='complete',
field=models.BooleanField(default=False),
),
migrations.DeleteModel(
name='Menu',
),
]
19 changes: 2 additions & 17 deletions v1/menu/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,33 +3,18 @@

from django.db import models
from django.contrib.auth.models import User
from django.utils.translation import ugettext_lazy as _

from v1.recipe.models import Recipe


class Menu(models.Model):
"""
Django Model to hold an Menus.
"""
title = models.CharField(_('title'), max_length=150, null=True, blank=True)
description = models.CharField(_('description'), max_length=150, null=True, blank=True)
author = models.ForeignKey(User, on_delete=models.CASCADE, null=True)

class Meta:
ordering = ['id']

def __unicode__(self):
return '%s' % self.title


class MenuItem(models.Model):
"""
Django Model to hold a Recipe that is related to a menu.
"""
menu = models.ForeignKey(Menu, on_delete=models.CASCADE, related_name='menu')
author = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
recipe = models.ForeignKey(Recipe, on_delete=models.CASCADE, related_name='menu_recipe')
all_day = models.BooleanField(default=False, blank=True)
complete = models.BooleanField(default=False, blank=True)
start_date = models.DateTimeField(null=True, blank=True)
end_date = models.DateTimeField(null=True, blank=True)

Expand Down
17 changes: 1 addition & 16 deletions v1/menu/permissions.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,21 +4,6 @@
from rest_framework import permissions


class IsMenuOwner(permissions.BasePermission):
"""
Custom permission to only allow owners
of an list and admins to edit it.
"""

def has_object_permission(self, request, view, obj):
# Only show all data to super admins.
if request.user.is_superuser:
return True

# Write permissions are only allowed to the owner of the list.
return obj.author == request.user


class IsMenuItemOwner(permissions.BasePermission):
"""
Custom permission to only allow owners
Expand All @@ -31,4 +16,4 @@ def has_object_permission(self, request, view, obj):
return True

# Write/Read permissions are only allowed to the owner of the list.
return obj.menu.author == request.user
return obj.author == request.user
31 changes: 12 additions & 19 deletions v1/menu/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,36 +5,29 @@
from rest_framework.fields import CharField

from v1.recipe.mixins import FieldLimiter
from .models import Menu, MenuItem
from v1.recipe.serializers import MiniBrowseSerializer
from .models import MenuItem


class MenuItemSerializer(FieldLimiter, serializers.ModelSerializer):
""" Standard `rest_framework` ModelSerializer """
recipe_title = CharField(source='recipe.title', read_only=True)
recipe_slug = CharField(source='recipe.slug', read_only=True)
recipe = MiniBrowseSerializer(required=False)
# recipe_title = CharField(source='recipe.title', read_only=True)
# recipe_slug = CharField(source='recipe.slug', read_only=True)
# recipe_pub_date = CharField(source='recipe.pub_date', read_only=True)
# recipe_rating = CharField(source='recipe.rating', read_only=True)
# recipe_photo_thumbnail = CharField(source='recipe.photo_thumbnail', read_only=True)
# recipe_info = CharField(source='recipe.info', read_only=True)

class Meta:
model = MenuItem
fields = [
'id',
'recipe_title',
'recipe_slug',
'menu',
'author',
'complete',
'recipe',
'all_day',
'start_date',
'end_date',
'recipe',
]


class MenuSerializer(FieldLimiter, serializers.ModelSerializer):
""" Standard `rest_framework` ModelSerializer """
class Meta:
model = Menu
fields = [
'id',
'title',
'description',
'author',
]

46 changes: 0 additions & 46 deletions v1/menu/tests/test_copy.py

This file was deleted.

37 changes: 3 additions & 34 deletions v1/menu/tests/test_permission.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@

from django.contrib.auth.models import AnonymousUser, User
from django.test import TestCase, RequestFactory
from v1.menu.permissions import IsMenuOwner, IsMenuItemOwner
from v1.menu.models import MenuItem, Menu
from v1.menu.permissions import IsMenuItemOwner
from v1.menu.models import MenuItem


class PermissionTest(TestCase):
Expand All @@ -26,38 +26,7 @@ def setUp(self):
self.user = User.objects.create_user(
username='jacob', email='jacob@gmail.com', password='top_secret'
)
self.menu = Menu.objects.create(title='food', author=self.user)
self.item = MenuItem.objects.create(menu=self.menu, recipe_id=1)

def test_is_list_owner_or_read_only(self):
# Try and access something as an admin user.
# Both get and post should have access.
request = self.factory.get('/admin')
request.user = self.staff
self.assertTrue(IsMenuOwner().has_object_permission(request, None, None))
self.assertTrue(IsMenuOwner().has_object_permission(request, None, self.menu))
request = self.factory.post('/admin')
request.user = self.staff
self.assertTrue(IsMenuOwner().has_object_permission(request, None, None))
self.assertTrue(IsMenuOwner().has_object_permission(request, None, self.menu))

# Try and access something as an user who created th lists.
# Both get and post should have access.
request = self.factory.get('/admin')
request.user = self.user
self.assertTrue(IsMenuOwner().has_object_permission(request, None, self.menu))
request = self.factory.post('/admin')
request.user = self.user
self.assertTrue(IsMenuOwner().has_object_permission(request, None, self.menu))

# Try and access something as an anonymous user.
# Both get and post should not have access.
request = self.factory.get('/admin')
request.user = AnonymousUser()
self.assertFalse(IsMenuOwner().has_object_permission(request, None, self.menu))
request = self.factory.post('/admin')
request.user = AnonymousUser()
self.assertFalse(IsMenuOwner().has_object_permission(request, None, self.menu))
self.item = MenuItem.objects.create(author=self.user, recipe_id=1)

def test_is_item_owner_or_read_only(self):
# Try and access something as an admin user.
Expand Down
3 changes: 0 additions & 3 deletions v1/menu/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,8 @@

# Create a router and register our viewsets with it.
router = DefaultRouter()
router.register(r'menu', views.MenuViewSet)
router.register(r'menu-item', views.MenuItemViewSet)
router.register(r'menu-recipes', views.RecipeItemViewSet)

urlpatterns = [
url('', include(router.urls)),
url(r'^menu-copy/$', views.MenuCopyViewSet.as_view())
]
76 changes: 8 additions & 68 deletions v1/menu/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,27 +2,10 @@
# encoding: utf-8

from rest_framework import viewsets
from rest_framework.views import APIView
from rest_framework.response import Response
from datetime import timedelta
from dateutil import parser

from v1.recipe.serializers import MiniBrowseSerializer
from v1.recipe.models import Recipe
from .models import MenuItem, Menu
from .serializers import MenuItemSerializer, MenuSerializer
from .permissions import IsMenuOwner, IsMenuItemOwner


class MenuViewSet(viewsets.ModelViewSet):
"""
This viewset automatically provides `list`, `create`, `retrieve`,
`update` and `destroy` actions for Menus.
"""
queryset = Menu.objects.all()
serializer_class = MenuSerializer
permission_classes = (IsMenuOwner,)
filter_fields = ('title', 'author',)
from .models import MenuItem
from .serializers import MenuItemSerializer
from .permissions import IsMenuItemOwner


class MenuItemViewSet(viewsets.ModelViewSet):
Expand All @@ -33,52 +16,9 @@ class MenuItemViewSet(viewsets.ModelViewSet):
queryset = MenuItem.objects.all()
serializer_class = MenuItemSerializer
permission_classes = (IsMenuItemOwner,)
filter_fields = ('menu', 'recipe', 'start_date', 'end_date')


class RecipeItemViewSet(viewsets.ReadOnlyModelViewSet):
"""
This viewset automatically provides `list` and `retrieve`
actions for Menu Items.
"""
serializer_class = MiniBrowseSerializer

def get_queryset(self):
return Recipe.objects.filter(menu_recipe=1)


class MenuCopyViewSet(APIView):
def post(self, request, *args, **kwargs):
menu = request.data.get('menu')
title = request.data.get('title')
description = request.data.get('description')
start = request.data.get('start')

new_menu = MenuSerializer(data={
'title': title,
'description': description
})
new_menu.is_valid(raise_exception=True)
new_menu.save()

first_item = MenuItem.objects.filter(
menu__id=menu
).order_by(
'start_date'
).first()
days = (parser.parse(start) - first_item.start_date).days

new_items = []
for item in MenuItem.objects.filter(menu__id=menu):
new_item = MenuItemSerializer(data={
'menu': new_menu.data.get('id'),
'recipe': item.recipe.id,
'all_day': item.all_day,
'start_date': item.start_date + timedelta(days=days),
'end_date': item.end_date + timedelta(days=days)
})
new_item.is_valid(raise_exception=True)
new_item.save()
new_items.append(new_item.data)
filter_fields = ('recipe', 'start_date', 'end_date')

return Response({'menu': new_menu.data, 'items': new_items})
# def get_queryset(self):
# if self.request.user:
# return MenuItem.objects.filter(author=self.request.user)
# return MenuItem.objects.all()
5 changes: 0 additions & 5 deletions v1/recipe/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,11 +36,6 @@ def get_queryset(self):
if not self.request.user.is_authenticated:
filter_set['public'] = True

if 'v' in self.request.v:
filter_set['cuisine__in'] = Cuisine.objects.filter(
slug__in=self.request.query_params.get('cuisine__slug').split(',')
)

if 'cuisine__slug' in self.request.query_params:
filter_set['cuisine__in'] = Cuisine.objects.filter(
slug__in=self.request.query_params.get('cuisine__slug').split(',')
Expand Down

0 comments on commit 8014dfe

Please sign in to comment.