wip supermarket categories

This commit is contained in:
vabene1111
2021-01-25 21:58:24 +01:00
parent 138a29770a
commit 09716f2b00
7 changed files with 100 additions and 13 deletions

View File

@ -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)

View 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'),
),
]

View File

@ -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)

View File

@ -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):

View File

@ -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

View File

@ -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'),

View File

@ -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: