From b5e08a48285bbb1f784832066987e51dd36d8ad7 Mon Sep 17 00:00:00 2001 From: Johannes Stefan Date: Sat, 9 Jan 2021 00:19:09 +0100 Subject: [PATCH 01/45] added webmanifest to static files to improve mobile (shortcut) experience --- cookbook/static/manifest/icon-192.png | Bin 0 -> 2072 bytes cookbook/static/manifest/icon-512.png | Bin 0 -> 6505 bytes cookbook/static/manifest/webmanifest | 21 +++++++++++++++++++++ cookbook/templates/base.html | 1 + 4 files changed, 22 insertions(+) create mode 100644 cookbook/static/manifest/icon-192.png create mode 100644 cookbook/static/manifest/icon-512.png create mode 100644 cookbook/static/manifest/webmanifest diff --git a/cookbook/static/manifest/icon-192.png b/cookbook/static/manifest/icon-192.png new file mode 100644 index 0000000000000000000000000000000000000000..2a84588b79f49306cb7c3f755a8b36e47b10bc3f GIT binary patch literal 2072 zcmb_dX;9Ny5`X{vAt51=YvqU_D%JpUOCmvHfda}=0?7bD4skZ1TtXx$M@UF?IGxcQ z2SpJ%ltbiHghbAuzz7x!iVSik?jXWoBrw2mg>0<-FkhVgw6CgP_piI(dtJYJ)t&9* zbqt5WV*mg+cQ+TRLJPl$3R1CC$74_mrNlhq?yI6$sVZSv3XEpBonQi>oc%?hvk`aJ z6;8bb*MNj?<4z|eeit7O5)%_GBV(hP^zRtqmT~cCZht1@0YF`McRB2vR3Mq~tUl?d zm$^_89F^|em_6l#fpvY{2`YPw-``b7n*5oKOb{#W?G$pKbfNRm-*l;4+7{cmaS7a{ zY+l#V?tp!HrwDrq=}ZsZn<~pkO7u}J|I$(?v1$_MmnHLTPA~p*<0L0U&Rm%k1&jUdP2Pgb*GAz`k{2VfdR17|=c-{P27qpCnR zAU5QA;2jhhYE`WsiGj`MDpL+_?rWW2(jB&0x7pgKZ& z8qg=PNO{??8?J{0upmWfQ>r#ctWeu=KTBCmX=ZUEPvbPWu40GC)Ss?_7#yDEz}R))s?yCJXkY5ta`kbfKD-88YBp2t?;BPID7+VYIETKNy?Nf0 z`9RsfJ*$YfXdI|)2+O6~0*`)RLWGOI1}x}c80HVkC?B5xD7!VP$uQGeZE1Cmc$8>6 zP*X(BJ1ddgC@hj0NA9oNUyBSu9F3lrM3lm2*Qnk!GIe}WIgbkP=3imY(tm%%PGR8$ zw?=R_pHV(hmYFwt{^qK`9?^rvvjfZhZ%W`mv%+l#zmg4_FIG5v7gadZqzN-?ir{PC zzp}qxUtkYNI+&pEomp6%Ym8Uh`{9iJvJ4b%3lWhG4st7;qltOWp7j68<=?aXe~dU( zpNFdSp#nHnnY4Cl15uAAX$FXD3H?>W5DCA!lVK_)ifzxnpd7G(rPd6atuUJN9H#aJ zy6#BMn`o~M_3E#EgZ~zoyy!1d#d4>6J=s>)Am4aw{iHZ>SO4XYTw5N0BX}wf^j``Q z@@MSVIzhzf1%zYinCBz%aIu-uV;Zjrp@Rr59n&aZW1>GW!yG3ppAO>e7epYoSms6i z@wdRfk9~$ln44wUD2fDlls=)Q|&!o6x;Xl z)j192$D6o%gCzd@)u=e5bd0IlPUnEs4c{=p7w;Cpg+ z^rK-4$9x(Rw`J||K&W3Mm(d!k+r#waaz9Nj`!L;b$I#XCs-?`?-AWT}xe1!flUrTI z972e^QgC3(ci|dn-DzXZp!hiE*G}#T@Q>8ycDQ1(!AO1lP+s|L$M#=ie=sTD3(~IY z>XLS@a(qJb%ky>i-QI&SK?`4I@zmCB>eWYz%FCwHJsQB~6#=b8(H}8$150no-or8F zYfimg8+Ou)tWLFNte~x4`*=|Q(G@Ml@jD4uk7C>Va6%&?rBfEwWZ@UQLz7FrEOh9K z%Lzr)c80$`vB_P0qM58iojRA{VDL}1iH9blQU~pB)Q7d9&4Ao|;&u@zd|=`9Kx)n~ zWZ0#POouG@jY0)}?=pSolAG^oupGY~LW)zx{OfEtjht=2)P&?nG40o$`A zBk*FYnjrV{c$#7uJVDCOiVrsb_DXIqCcWM`y=c`f*C*+%zEh!_@^v;&S`S-Rw+a0c zqBAf2Kqy~KEt`izR|X}pV)l6^+6|7$LHDjzbW5__Pcg-TyQ`N= J?U7R#{{sUQi=hAj literal 0 HcmV?d00001 diff --git a/cookbook/static/manifest/icon-512.png b/cookbook/static/manifest/icon-512.png new file mode 100644 index 0000000000000000000000000000000000000000..2fb8bdd609e4021ca76bc7721f415ad635719182 GIT binary patch literal 6505 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 literal 0 HcmV?d00001 diff --git a/cookbook/static/manifest/webmanifest b/cookbook/static/manifest/webmanifest new file mode 100644 index 00000000..227f78b9 --- /dev/null +++ b/cookbook/static/manifest/webmanifest @@ -0,0 +1,21 @@ +{ + "name": "Recipes", + "description": "Application to manage, tag and search recipes.", + "icons": [ + { + "src": "/static/manifest/icon-192.png", + "type": "image/png", + "sizes": "192x192" + }, + { + "src": "/static/manifest/icon-512.png", + "type": "image/png", + "sizes": "512x512" + } + ], + "start_url": "/search", + "background_color": "#18BC9C", + "display": "standalone", + "scope": "/", + "theme_color": "#18BC9C" +} diff --git a/cookbook/templates/base.html b/cookbook/templates/base.html index 45de3c80..ef78315f 100644 --- a/cookbook/templates/base.html +++ b/cookbook/templates/base.html @@ -16,6 +16,7 @@ + From 86134eecb448447f298f3a877e56a2fbb77bbd42 Mon Sep 17 00:00:00 2001 From: Tobias Lindenberg Date: Sat, 9 Jan 2021 22:17:56 +0100 Subject: [PATCH 02/45] added unique constraint on RecipeBookEntry table Signed-off-by: Tobias Lindenberg --- .../migrations/0096_auto_20210109_2044.py | 31 +++++++++++++++++++ cookbook/models.py | 3 ++ cookbook/views/views.py | 11 +++++-- 3 files changed, 42 insertions(+), 3 deletions(-) create mode 100644 cookbook/migrations/0096_auto_20210109_2044.py diff --git a/cookbook/migrations/0096_auto_20210109_2044.py b/cookbook/migrations/0096_auto_20210109_2044.py new file mode 100644 index 00000000..4206def6 --- /dev/null +++ b/cookbook/migrations/0096_auto_20210109_2044.py @@ -0,0 +1,31 @@ +# Generated by Django 3.1.5 on 2021-01-09 19:44 + +from django.db import migrations + + +def delete_duplicate_bookmarks(apps, schema_editor): + """ + In this migration, a unique constraint is set on the fields `recipe` and `book`. + If there are already duplicate entries, the migration will fail. + Therefore all duplicate entries are deleted beforehand. + """ + RecipeBookEntry = apps.get_model('cookbook', 'RecipeBookEntry') + + for row in RecipeBookEntry.objects.all(): + if RecipeBookEntry.objects.filter(recipe=row.recipe, book=row.book).count() > 1: + row.delete() + + +class Migration(migrations.Migration): + dependencies = [ + ('cookbook', '0095_auto_20210107_1804'), + ] + + operations = [ + # run function to delete duplicated bookmarks + migrations.RunPython(delete_duplicate_bookmarks), + migrations.AlterUniqueTogether( + name='recipebookentry', + unique_together={('recipe', 'book')}, + ), + ] diff --git a/cookbook/models.py b/cookbook/models.py index 64c4e3d3..6f88069c 100644 --- a/cookbook/models.py +++ b/cookbook/models.py @@ -265,6 +265,9 @@ class RecipeBookEntry(models.Model): def __str__(self): return self.recipe.name + class Meta: + unique_together = (('recipe', 'book'),) + class MealType(models.Model): name = models.CharField(max_length=128) diff --git a/cookbook/views/views.py b/cookbook/views/views.py index e4248689..7b2ae082 100644 --- a/cookbook/views/views.py +++ b/cookbook/views/views.py @@ -7,6 +7,7 @@ from django.contrib.auth import update_session_auth_hash, authenticate from django.contrib.auth.forms import PasswordChangeForm from django.contrib.auth.password_validation import validate_password from django.core.exceptions import ValidationError +from django.db import IntegrityError from django.db.models import Q, Avg from django.http import HttpResponseRedirect from django.shortcuts import render, get_object_or_404 @@ -105,9 +106,13 @@ def recipe_view(request, pk, share=None): bookmark.recipe = recipe bookmark.book = bookmark_form.cleaned_data['book'] - bookmark.save() - - messages.add_message(request, messages.SUCCESS, _('Bookmark saved!')) + try: + bookmark.save() + except IntegrityError as e: + if 'UNIQUE constraint' in str(e.args): + messages.add_message(request, messages.ERROR, _('This recipe is already linked to the book!')) + else: + messages.add_message(request, messages.SUCCESS, _('Bookmark saved!')) comment_form = CommentForm() bookmark_form = RecipeBookEntryForm() From db6fe4256f5f063571c787bc4cb51186ddd36739 Mon Sep 17 00:00:00 2001 From: vabene1111 Date: Sun, 10 Jan 2021 10:27:50 +0100 Subject: [PATCH 03/45] added shortcuts to manifest --- .idea/recipes.iml | 4 ---- cookbook/static/manifest/webmanifest | 25 ++++++++++++++++++++++++- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/.idea/recipes.iml b/.idea/recipes.iml index ba788b3d..c2b653f2 100644 --- a/.idea/recipes.iml +++ b/.idea/recipes.iml @@ -20,10 +20,6 @@ - - - -