wip supermarket categories
This commit is contained in:
@ -5,7 +5,7 @@ from .models import (Comment, CookLog, Food, Ingredient, InviteLink, Keyword,
|
|||||||
RecipeBook, RecipeBookEntry, RecipeImport, ShareLink,
|
RecipeBook, RecipeBookEntry, RecipeImport, ShareLink,
|
||||||
ShoppingList, ShoppingListEntry, ShoppingListRecipe,
|
ShoppingList, ShoppingListEntry, ShoppingListRecipe,
|
||||||
Space, Step, Storage, Sync, SyncLog, Unit, UserPreference,
|
Space, Step, Storage, Sync, SyncLog, Unit, UserPreference,
|
||||||
ViewLog, Supermarket, SupermarketCategory)
|
ViewLog, Supermarket, SupermarketCategory, SupermarketCategoryRelation)
|
||||||
|
|
||||||
|
|
||||||
class SpaceAdmin(admin.ModelAdmin):
|
class SpaceAdmin(admin.ModelAdmin):
|
||||||
@ -42,7 +42,16 @@ class SyncAdmin(admin.ModelAdmin):
|
|||||||
|
|
||||||
admin.site.register(Sync, SyncAdmin)
|
admin.site.register(Sync, SyncAdmin)
|
||||||
|
|
||||||
admin.site.register(Supermarket)
|
|
||||||
|
class SupermarketCategoryInline(admin.TabularInline):
|
||||||
|
model = SupermarketCategoryRelation
|
||||||
|
|
||||||
|
|
||||||
|
class SupermarketAdmin(admin.ModelAdmin):
|
||||||
|
inlines = (SupermarketCategoryInline,)
|
||||||
|
|
||||||
|
|
||||||
|
admin.site.register(Supermarket, SupermarketAdmin)
|
||||||
admin.site.register(SupermarketCategory)
|
admin.site.register(SupermarketCategory)
|
||||||
|
|
||||||
|
|
||||||
|
28
cookbook/migrations/0104_auto_20210125_2133.py
Normal file
28
cookbook/migrations/0104_auto_20210125_2133.py
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
# Generated by Django 3.1.5 on 2021-01-25 20:33
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('cookbook', '0103_food_ignore_shopping'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='SupermarketCategoryRelation',
|
||||||
|
fields=[
|
||||||
|
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('order', models.IntegerField(default=0)),
|
||||||
|
('category', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='cookbook.supermarketcategory')),
|
||||||
|
('supermarket', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='cookbook.supermarket')),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='supermarket',
|
||||||
|
name='categories',
|
||||||
|
field=models.ManyToManyField(through='cookbook.SupermarketCategoryRelation', to='cookbook.SupermarketCategory'),
|
||||||
|
),
|
||||||
|
]
|
@ -144,14 +144,6 @@ class Sync(models.Model):
|
|||||||
return self.path
|
return self.path
|
||||||
|
|
||||||
|
|
||||||
class Supermarket(models.Model):
|
|
||||||
name = models.CharField(unique=True, max_length=128, validators=[MinLengthValidator(1)])
|
|
||||||
description = models.TextField(blank=True, null=True)
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
return self.name
|
|
||||||
|
|
||||||
|
|
||||||
class SupermarketCategory(models.Model):
|
class SupermarketCategory(models.Model):
|
||||||
name = models.CharField(unique=True, max_length=128, validators=[MinLengthValidator(1)])
|
name = models.CharField(unique=True, max_length=128, validators=[MinLengthValidator(1)])
|
||||||
description = models.TextField(blank=True, null=True)
|
description = models.TextField(blank=True, null=True)
|
||||||
@ -160,6 +152,21 @@ class SupermarketCategory(models.Model):
|
|||||||
return self.name
|
return self.name
|
||||||
|
|
||||||
|
|
||||||
|
class Supermarket(models.Model):
|
||||||
|
name = models.CharField(unique=True, max_length=128, validators=[MinLengthValidator(1)])
|
||||||
|
description = models.TextField(blank=True, null=True)
|
||||||
|
categories = models.ManyToManyField(SupermarketCategory, through='SupermarketCategoryRelation')
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return self.name
|
||||||
|
|
||||||
|
|
||||||
|
class SupermarketCategoryRelation(models.Model):
|
||||||
|
supermarket = models.ForeignKey(Supermarket, on_delete=models.CASCADE)
|
||||||
|
category = models.ForeignKey(SupermarketCategory, on_delete=models.CASCADE)
|
||||||
|
order = models.IntegerField(default=0)
|
||||||
|
|
||||||
|
|
||||||
class SyncLog(models.Model):
|
class SyncLog(models.Model):
|
||||||
sync = models.ForeignKey(Sync, on_delete=models.CASCADE)
|
sync = models.ForeignKey(Sync, on_delete=models.CASCADE)
|
||||||
status = models.CharField(max_length=32)
|
status = models.CharField(max_length=32)
|
||||||
|
@ -11,7 +11,7 @@ from cookbook.models import (Comment, CookLog, Food, Ingredient, Keyword,
|
|||||||
RecipeBook, RecipeBookEntry, RecipeImport,
|
RecipeBook, RecipeBookEntry, RecipeImport,
|
||||||
ShareLink, ShoppingList, ShoppingListEntry,
|
ShareLink, ShoppingList, ShoppingListEntry,
|
||||||
ShoppingListRecipe, Step, Storage, Sync, SyncLog,
|
ShoppingListRecipe, Step, Storage, Sync, SyncLog,
|
||||||
Unit, UserPreference, ViewLog, SupermarketCategory)
|
Unit, UserPreference, ViewLog, SupermarketCategory, Supermarket, SupermarketCategoryRelation)
|
||||||
from cookbook.templatetags.custom_tags import markdown
|
from cookbook.templatetags.custom_tags import markdown
|
||||||
|
|
||||||
|
|
||||||
@ -140,6 +140,20 @@ class UnitSerializer(UniqueFieldsMixin, serializers.ModelSerializer):
|
|||||||
read_only_fields = ('id',)
|
read_only_fields = ('id',)
|
||||||
|
|
||||||
|
|
||||||
|
class SupermarketCategoryRelationSerializer(serializers.ModelSerializer):
|
||||||
|
class Meta:
|
||||||
|
model = SupermarketCategoryRelation
|
||||||
|
fields = "__all__"
|
||||||
|
|
||||||
|
|
||||||
|
class SupermarketSerializer(UniqueFieldsMixin, serializers.ModelSerializer):
|
||||||
|
categories = SupermarketCategoryRelationSerializer(many=True, read_only=True)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = Supermarket
|
||||||
|
fields = ('id', 'name', 'categories')
|
||||||
|
|
||||||
|
|
||||||
class SupermarketCategorySerializer(UniqueFieldsMixin, WritableNestedModelSerializer):
|
class SupermarketCategorySerializer(UniqueFieldsMixin, WritableNestedModelSerializer):
|
||||||
|
|
||||||
def create(self, validated_data):
|
def create(self, validated_data):
|
||||||
|
@ -201,6 +201,28 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col" style="margin-top: 1vh">
|
||||||
|
{# <multiselect#}
|
||||||
|
{# v-tabindex#}
|
||||||
|
{# v-model="shopping_list.shared"#}
|
||||||
|
{# :options="users"#}
|
||||||
|
{# :close-on-select="true"#}
|
||||||
|
{# :clear-on-select="true"#}
|
||||||
|
{# :allow-empty="true"#}
|
||||||
|
{# :preserve-search="true"#}
|
||||||
|
{# placeholder="{% trans 'Select Supermarket' %}"#}
|
||||||
|
{# select-label="{% trans 'Select' %}"#}
|
||||||
|
{# label="supermarket"#}
|
||||||
|
{# track-by="id"#}
|
||||||
|
{# :multiple="false"#}
|
||||||
|
{# :loading="supermarket_loading"#}
|
||||||
|
{# @search-change="searchSupermarket">#}
|
||||||
|
{# </multiselect>#}
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col" style="margin-top: 1vh">
|
<div class="col" style="margin-top: 1vh">
|
||||||
<multiselect
|
<multiselect
|
||||||
|
@ -34,6 +34,7 @@ router.register(r'view-log', api.ViewLogViewSet)
|
|||||||
router.register(r'cook-log', api.CookLogViewSet)
|
router.register(r'cook-log', api.CookLogViewSet)
|
||||||
router.register(r'recipe-book', api.RecipeBookViewSet)
|
router.register(r'recipe-book', api.RecipeBookViewSet)
|
||||||
router.register(r'recipe-book-entry', api.RecipeBookEntryViewSet)
|
router.register(r'recipe-book-entry', api.RecipeBookEntryViewSet)
|
||||||
|
router.register(r'supermarket', api.SupermarketViewSet)
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path('', views.index, name='index'),
|
path('', views.index, name='index'),
|
||||||
|
@ -36,7 +36,7 @@ from cookbook.models import (CookLog, Food, Ingredient, Keyword, MealPlan,
|
|||||||
MealType, Recipe, RecipeBook, ShoppingList,
|
MealType, Recipe, RecipeBook, ShoppingList,
|
||||||
ShoppingListEntry, ShoppingListRecipe, Step,
|
ShoppingListEntry, ShoppingListRecipe, Step,
|
||||||
Storage, Sync, SyncLog, Unit, UserPreference,
|
Storage, Sync, SyncLog, Unit, UserPreference,
|
||||||
ViewLog, RecipeBookEntry)
|
ViewLog, RecipeBookEntry, Supermarket)
|
||||||
from cookbook.provider.dropbox import Dropbox
|
from cookbook.provider.dropbox import Dropbox
|
||||||
from cookbook.provider.local import Local
|
from cookbook.provider.local import Local
|
||||||
from cookbook.provider.nextcloud import Nextcloud
|
from cookbook.provider.nextcloud import Nextcloud
|
||||||
@ -51,7 +51,7 @@ from cookbook.serializer import (FoodSerializer, IngredientSerializer,
|
|||||||
StorageSerializer, SyncLogSerializer,
|
StorageSerializer, SyncLogSerializer,
|
||||||
SyncSerializer, UnitSerializer,
|
SyncSerializer, UnitSerializer,
|
||||||
UserNameSerializer, UserPreferenceSerializer,
|
UserNameSerializer, UserPreferenceSerializer,
|
||||||
ViewLogSerializer, CookLogSerializer, RecipeBookEntrySerializer, RecipeOverviewSerializer)
|
ViewLogSerializer, CookLogSerializer, RecipeBookEntrySerializer, RecipeOverviewSerializer, SupermarketSerializer)
|
||||||
from recipes.settings import DEMO
|
from recipes.settings import DEMO
|
||||||
|
|
||||||
|
|
||||||
@ -141,6 +141,12 @@ class StandardFilterMixin(ViewSetMixin):
|
|||||||
return queryset
|
return queryset
|
||||||
|
|
||||||
|
|
||||||
|
class SupermarketViewSet(viewsets.ModelViewSet, StandardFilterMixin):
|
||||||
|
queryset = Supermarket.objects.all()
|
||||||
|
serializer_class = SupermarketSerializer
|
||||||
|
permission_classes = [CustomIsUser]
|
||||||
|
|
||||||
|
|
||||||
class KeywordViewSet(viewsets.ModelViewSet, StandardFilterMixin):
|
class KeywordViewSet(viewsets.ModelViewSet, StandardFilterMixin):
|
||||||
"""
|
"""
|
||||||
list:
|
list:
|
||||||
|
Reference in New Issue
Block a user