sandwitches 2.3.0__py3-none-any.whl → 2.3.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. sandwitches/api.py +22 -1
  2. sandwitches/forms.py +36 -0
  3. sandwitches/management/__init__.py +0 -0
  4. sandwitches/management/commands/__init__.py +0 -0
  5. sandwitches/management/commands/reset_daily_orders.py +14 -0
  6. sandwitches/migrations/0008_historicalrecipe_daily_orders_count_and_more.py +36 -0
  7. sandwitches/migrations/0009_historicalrecipe_is_approved_recipe_is_approved.py +22 -0
  8. sandwitches/migrations/0010_rename_is_approved_historicalrecipe_is_community_made_and_more.py +22 -0
  9. sandwitches/migrations/0011_alter_historicalrecipe_is_community_made_and_more.py +25 -0
  10. sandwitches/models.py +28 -1
  11. sandwitches/settings.py +1 -0
  12. sandwitches/tasks.py +74 -0
  13. sandwitches/templates/admin/admin_base.html +8 -4
  14. sandwitches/templates/admin/dashboard.html +132 -69
  15. sandwitches/templates/admin/order_list.html +30 -0
  16. sandwitches/templates/admin/partials/dashboard_charts.html +90 -0
  17. sandwitches/templates/admin/partials/order_rows.html +28 -0
  18. sandwitches/templates/admin/rating_list.html +2 -0
  19. sandwitches/templates/admin/recipe_form.html +26 -0
  20. sandwitches/templates/admin/recipe_list.html +65 -15
  21. sandwitches/templates/base.html +12 -0
  22. sandwitches/templates/{recipe_form.html → community.html} +30 -8
  23. sandwitches/templates/components/recipe_header.html +9 -0
  24. sandwitches/templates/components/side_menu.html +4 -0
  25. sandwitches/templates/profile.html +1 -1
  26. sandwitches/urls.py +8 -0
  27. sandwitches/views.py +178 -21
  28. {sandwitches-2.3.0.dist-info → sandwitches-2.3.2.dist-info}/METADATA +1 -1
  29. {sandwitches-2.3.0.dist-info → sandwitches-2.3.2.dist-info}/RECORD +30 -20
  30. {sandwitches-2.3.0.dist-info → sandwitches-2.3.2.dist-info}/WHEEL +0 -0
sandwitches/views.py CHANGED
@@ -1,3 +1,5 @@
1
+ import logging
2
+ from django.core.exceptions import ValidationError
1
3
  from django.shortcuts import render, get_object_or_404, redirect
2
4
  from django.urls import reverse
3
5
  from django.contrib import messages
@@ -6,7 +8,7 @@ from django.contrib.auth import get_user_model
6
8
  from django.contrib.auth.decorators import login_required
7
9
  from django.contrib.admin.views.decorators import staff_member_required
8
10
  from django.utils.translation import gettext as _
9
- from .models import Recipe, Rating, Tag
11
+ from .models import Recipe, Rating, Tag, Order
10
12
  from .forms import (
11
13
  RecipeForm,
12
14
  AdminSetupForm,
@@ -15,10 +17,11 @@ from .forms import (
15
17
  UserEditForm,
16
18
  TagForm,
17
19
  UserProfileForm,
20
+ UserRecipeSubmissionForm,
18
21
  )
19
- from django.http import HttpResponseBadRequest
22
+ from django.http import HttpResponseBadRequest, Http404
20
23
  from django.conf import settings
21
- from django.http import FileResponse, Http404
24
+ from django.http import FileResponse
22
25
  from pathlib import Path
23
26
  import mimetypes
24
27
  from PIL import Image
@@ -32,6 +35,50 @@ from sandwitches import __version__ as sandwitches_version
32
35
  User = get_user_model()
33
36
 
34
37
 
38
+ @login_required
39
+ def community(request):
40
+ if request.method == "POST":
41
+ form = UserRecipeSubmissionForm(request.POST, request.FILES)
42
+ if form.is_valid():
43
+ recipe = form.save(commit=False)
44
+ recipe.uploaded_by = request.user
45
+ recipe.is_community_made = True
46
+ recipe.save()
47
+ form.save_m2m()
48
+ messages.success(
49
+ request,
50
+ _("Your recipe has been submitted and is awaiting admin approval."),
51
+ )
52
+ return redirect("user_profile")
53
+ else:
54
+ form = UserRecipeSubmissionForm()
55
+
56
+ # Community recipes = non-staff uploaded
57
+ recipes = Recipe.objects.filter(is_community_made=True).prefetch_related( # ty:ignore[unresolved-attribute]
58
+ "favorited_by"
59
+ )
60
+
61
+ if not request.user.is_staff:
62
+ # Regular users only see approved community recipes or their own
63
+ recipes = recipes.filter(
64
+ Q(is_community_made=True) | Q(uploaded_by=request.user)
65
+ )
66
+
67
+ recipes = recipes.order_by("-created_at")
68
+
69
+ return render(
70
+ request,
71
+ "community.html",
72
+ {
73
+ "form": form,
74
+ "recipes": recipes,
75
+ "title": _("Community"),
76
+ "version": sandwitches_version,
77
+ "user": request.user,
78
+ },
79
+ )
80
+
81
+
35
82
  class CustomLoginView(LoginView):
36
83
  template_name = "login.html"
37
84
  redirect_authenticated_user = True
@@ -88,6 +135,15 @@ def admin_dashboard(request):
88
135
  .order_by("date")
89
136
  )
90
137
 
138
+ # Orders over time
139
+ order_data = (
140
+ Order.objects.filter(created_at__date__range=(start_date, end_date)) # ty:ignore[unresolved-attribute]
141
+ .annotate(date=TruncDate("created_at"))
142
+ .values("date")
143
+ .annotate(count=Count("id"))
144
+ .order_by("date")
145
+ )
146
+
91
147
  # Prepare labels and data for JS
92
148
  recipe_labels = [d["date"].strftime("%d/%m/%Y") for d in recipe_data]
93
149
  recipe_counts = [d["count"] for d in recipe_data]
@@ -95,36 +151,72 @@ def admin_dashboard(request):
95
151
  rating_labels = [d["date"].strftime("%d/%m/%Y") for d in rating_data]
96
152
  rating_avgs = [float(d["avg"]) for d in rating_data]
97
153
 
154
+ order_labels = [d["date"].strftime("%d/%m/%Y") for d in order_data]
155
+ order_counts = [d["count"] for d in order_data]
156
+
157
+ pending_recipes = Recipe.objects.filter( # ty:ignore[unresolved-attribute]
158
+ uploaded_by__is_staff=False, uploaded_by__is_superuser=False
159
+ ).order_by("-created_at")
160
+ context = {
161
+ "recipe_count": recipe_count,
162
+ "user_count": user_count,
163
+ "tag_count": tag_count,
164
+ "recent_recipes": recent_recipes,
165
+ "pending_recipes": pending_recipes,
166
+ "recipe_labels": recipe_labels,
167
+ "recipe_counts": recipe_counts,
168
+ "rating_labels": rating_labels,
169
+ "rating_avgs": rating_avgs,
170
+ "order_labels": order_labels,
171
+ "order_counts": order_counts,
172
+ "start_date": start_date.strftime("%Y-%m-%d"),
173
+ "end_date": end_date.strftime("%Y-%m-%d"),
174
+ "version": sandwitches_version,
175
+ }
176
+
177
+ if request.headers.get("HX-Request"):
178
+ return render(request, "admin/partials/dashboard_charts.html", context)
179
+
98
180
  return render(
99
181
  request,
100
182
  "admin/dashboard.html",
101
- {
102
- "recipe_count": recipe_count,
103
- "user_count": user_count,
104
- "tag_count": tag_count,
105
- "recent_recipes": recent_recipes,
106
- "recipe_labels": recipe_labels,
107
- "recipe_counts": recipe_counts,
108
- "rating_labels": rating_labels,
109
- "rating_avgs": rating_avgs,
110
- "start_date": start_date.strftime("%Y-%m-%d"),
111
- "end_date": end_date.strftime("%Y-%m-%d"),
112
- "version": sandwitches_version,
113
- },
183
+ context,
114
184
  )
115
185
 
116
186
 
117
187
  @staff_member_required
118
188
  def admin_recipe_list(request):
189
+ sort_param = request.GET.get("sort", "-created_at")
190
+ allowed_sorts = {
191
+ "title": "title",
192
+ "-title": "-title",
193
+ "created_at": "created_at",
194
+ "-created_at": "-created_at",
195
+ "uploader": "uploaded_by__username",
196
+ "-uploader": "-uploaded_by__username",
197
+ "price": "price",
198
+ "-price": "-price",
199
+ "orders": "daily_orders_count",
200
+ "-orders": "-daily_orders_count",
201
+ "rating": "avg_rating",
202
+ "-rating": "-avg_rating",
203
+ }
204
+
205
+ order_by = allowed_sorts.get(sort_param, "-created_at")
206
+
119
207
  recipes = (
120
208
  Recipe.objects.annotate(avg_rating=Avg("ratings__score")) # ty:ignore[unresolved-attribute]
121
209
  .prefetch_related("tags")
122
- .all()
210
+ .order_by(order_by)
123
211
  )
124
212
  return render(
125
213
  request,
126
214
  "admin/recipe_list.html",
127
- {"recipes": recipes, "version": sandwitches_version},
215
+ {
216
+ "recipes": recipes,
217
+ "version": sandwitches_version,
218
+ "current_sort": sort_param,
219
+ },
128
220
  )
129
221
 
130
222
 
@@ -171,6 +263,17 @@ def admin_recipe_edit(request, pk):
171
263
  )
172
264
 
173
265
 
266
+ @staff_member_required
267
+ def admin_recipe_approve(request, pk):
268
+ recipe = get_object_or_404(Recipe, pk=pk)
269
+ recipe.is_community_made = True
270
+ recipe.save()
271
+ messages.success(
272
+ request, _("Recipe '%(title)s' approved.") % {"title": recipe.title}
273
+ )
274
+ return redirect("admin_recipe_list")
275
+
276
+
174
277
  @staff_member_required
175
278
  def admin_recipe_delete(request, pk):
176
279
  recipe = get_object_or_404(Recipe, pk=pk)
@@ -366,8 +469,38 @@ def admin_rating_delete(request, pk):
366
469
  )
367
470
 
368
471
 
472
+ @staff_member_required
473
+ def admin_order_list(request):
474
+ orders = (
475
+ Order.objects.select_related("user", "recipe") # ty:ignore[unresolved-attribute]
476
+ .all()
477
+ .order_by("-created_at")
478
+ )
479
+
480
+ if request.headers.get("HX-Request"):
481
+ return render(
482
+ request,
483
+ "admin/partials/order_rows.html",
484
+ {"orders": orders, "version": sandwitches_version},
485
+ )
486
+
487
+ return render(
488
+ request,
489
+ "admin/order_list.html",
490
+ {"orders": orders, "version": sandwitches_version},
491
+ )
492
+
493
+
369
494
  def recipe_detail(request, slug):
370
495
  recipe = get_object_or_404(Recipe, slug=slug)
496
+
497
+ if not recipe.is_community_made:
498
+ if not (
499
+ request.user.is_authenticated
500
+ and (request.user.is_staff or recipe.uploaded_by == request.user)
501
+ ):
502
+ raise Http404("Recipe not found or pending approval.")
503
+
371
504
  avg = recipe.average_rating()
372
505
  count = recipe.rating_count()
373
506
  user_rating = None
@@ -401,6 +534,28 @@ def recipe_detail(request, slug):
401
534
  )
402
535
 
403
536
 
537
+ @login_required
538
+ def order_recipe(request, pk):
539
+ """
540
+ Create an order for the given recipe by the logged-in user.
541
+ """
542
+ recipe = get_object_or_404(Recipe, pk=pk)
543
+ if request.method != "POST":
544
+ return redirect("recipe_detail", slug=recipe.slug)
545
+
546
+ try:
547
+ order = Order.objects.create(user=request.user, recipe=recipe) # ty:ignore[unresolved-attribute]
548
+ logging.debug(f"Created {order}")
549
+ messages.success(
550
+ request,
551
+ _("Your order for %(title)s has been submitted!") % {"title": recipe.title},
552
+ )
553
+ except (ValidationError, ValueError) as e:
554
+ messages.error(request, str(e))
555
+
556
+ return redirect("recipe_detail", slug=recipe.slug)
557
+
558
+
404
559
  @login_required
405
560
  def recipe_rate(request, pk):
406
561
  """
@@ -510,9 +665,11 @@ def favorites(request):
510
665
  def index(request):
511
666
  if not User.objects.filter(is_superuser=True).exists():
512
667
  return redirect("setup")
513
- recipes = (
514
- Recipe.objects.all().prefetch_related("favorited_by") # ty:ignore[unresolved-attribute]
515
- ) # Start with all, order later
668
+
669
+ recipes = Recipe.objects.all().prefetch_related("favorited_by") # ty:ignore[unresolved-attribute]
670
+
671
+ # Only show "normal" recipes (uploaded by staff or no uploader)
672
+ recipes = recipes.filter(Q(is_community_made=False))
516
673
 
517
674
  # Filtering
518
675
  q = request.GET.get("q")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: sandwitches
3
- Version: 2.3.0
3
+ Version: 2.3.2
4
4
  Summary: Add your description here
5
5
  Author: Martyn van Dijke
6
6
  Author-email: Martyn van Dijke <martijnvdijke600@gmail.com>
@@ -1,11 +1,14 @@
1
1
  sandwitches/__init__.py,sha256=YTDsQDSdJmxV2Z0dTbBqZhuJRuXcNLSKL0SX73Lu2u8,195
2
2
  sandwitches/admin.py,sha256=-02WqE8U3rxrVCoNB7sfvtyE4v_e3pt7mFwXfUlindo,2421
3
- sandwitches/api.py,sha256=4Upjd78dHVZDOIFkZjPst0mLfVdiToB3RVVrBpttTYg,5714
3
+ sandwitches/api.py,sha256=ruD5QeOPY-l9PvkJQiaOYoI0sRARDpqpFrFDgBxo9cQ,6389
4
4
  sandwitches/asgi.py,sha256=cygnXdXSSVspM7ZXuj47Ef6oz7HSTw4D7BPzgE2PU5w,399
5
5
  sandwitches/feeds.py,sha256=iz1d11dV0utA0ZNsB7VIAp0h8Zr5mFNSKJWHbw_j6YM,683
6
- sandwitches/forms.py,sha256=oIL0Gofegq1LFfbUW66d6MvNR66NmLWK_dKUfHE6gz4,6158
6
+ sandwitches/forms.py,sha256=rcXAL-Dn1gY3mWIPV9X9tZpFp2z6Xrkv6k9f2YUp8OU,7158
7
7
  sandwitches/locale/nl/LC_MESSAGES/django.mo,sha256=EzQWzIhz_Na3w9AS7F-YjB-Xv63t4sMRSAkEQ1-g32M,5965
8
8
  sandwitches/locale/nl/LC_MESSAGES/django.po,sha256=znxspEoMwkmktusZtbVrt1KG1LDUwIEi4ZEIE3XGeoI,25904
9
+ sandwitches/management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
+ sandwitches/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
+ sandwitches/management/commands/reset_daily_orders.py,sha256=PrGPFfJ7r3J1SYYgyU5YDaFVvc7uvMGzkkePL07GDyo,480
9
12
  sandwitches/migrations/0001_initial.py,sha256=hXnCAhoA91C6YCinXyUdIfQ7QL29NPBHFfTqLgulMsY,12507
10
13
  sandwitches/migrations/0002_historicalrecipe_servings_recipe_servings.py,sha256=8E09y99FdVNzaQMn8R1d5zEcCN9jZICVCTW8MsGRBqs,743
11
14
  sandwitches/migrations/0003_setting.py,sha256=DmugIrz0Wtftx7B0MrX6ms34j60kSOwcPz1sLRP4wE0,1200
@@ -13,25 +16,33 @@ sandwitches/migrations/0004_alter_setting_ai_api_key_and_more.py,sha256=516vcSxW
13
16
  sandwitches/migrations/0005_rating_comment.py,sha256=MRlTZkyATH1aJdkaesPlPkXkYt-mzqBik-MCcNrbLRI,398
14
17
  sandwitches/migrations/0006_historicalrecipe_is_highlighted_and_more.py,sha256=BBCx4uxPK9udqsJ6qkoYpZ_3tH4uujquj9j0Gm7Ff6w,566
15
18
  sandwitches/migrations/0007_historicalrecipe_price_recipe_price_order.py,sha256=o-hsVK39ArT_KkSkMnZfhCTQu66v81P6LbZPqRxjonU,2793
19
+ sandwitches/migrations/0008_historicalrecipe_daily_orders_count_and_more.py,sha256=PyjettGABOcH6ryCXApOpEPNKBIs23AFIK302uQxpiY,1105
20
+ sandwitches/migrations/0009_historicalrecipe_is_approved_recipe_is_approved.py,sha256=XP76J2_HiMOFeIU17Yu8AYXtswE-dcsNZq3lJGFgGtg,588
21
+ sandwitches/migrations/0010_rename_is_approved_historicalrecipe_is_community_made_and_more.py,sha256=9Xv-rBRUvx5UWbr7i4BeWbllCcVkcNuC8T3sxKSdWyU,575
22
+ sandwitches/migrations/0011_alter_historicalrecipe_is_community_made_and_more.py,sha256=O2D57bAsSwBklYqfMTWrHE3Zxj3lrk-CO9yDP8sQS0M,659
16
23
  sandwitches/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
17
- sandwitches/models.py,sha256=ZcZYgHr7ikYHqCq3X1qaZirK5Vbd7dakOyYYjBNwNQc,8575
18
- sandwitches/settings.py,sha256=hNLDqbRPGdtNVNX31zxcDWKxWa95AcswKbj4XW4Z2lE,5821
24
+ sandwitches/models.py,sha256=MmSP1P7Kq2ObjYTJs9AKTEVeWcD5-Pqumj1BTnmBqTc,9986
25
+ sandwitches/settings.py,sha256=5_eQAJCAV093hnhr3XOxHekT4IF-PEJcRiTecq71_SQ,5841
19
26
  sandwitches/storage.py,sha256=ibBG6tVtArqzgEKsRimZPwsqW7i9j4WiPLLHrOJchow,3578
20
- sandwitches/tasks.py,sha256=rRQpWZp-vDbMgVmnZAz8GaPzK7F3uzAr6lho7Zq-mdM,3656
21
- sandwitches/templates/admin/admin_base.html,sha256=yPFo1K1LrRuPKfOuOGLEgQm29vWqzvkSoDNlpmxYPaY,4261
27
+ sandwitches/tasks.py,sha256=YiliAT2rj0fh7hrwKq5_qWtv9AGhd5iulj_iBwZBBKg,6024
28
+ sandwitches/templates/admin/admin_base.html,sha256=Mzq0A6Pl-x61gXv15XegW26X7HKHS0aGcAD-WBSwSG4,4249
22
29
  sandwitches/templates/admin/confirm_delete.html,sha256=HfsZI_gV8JQTKz215TYgPWBrgrFhGv1UB3N-0Hln-14,804
23
- sandwitches/templates/admin/dashboard.html,sha256=uHisWI3x-KehPDlwBFF5bIT5-tPsCVU5duA_ZPF-GHc,6168
24
- sandwitches/templates/admin/rating_list.html,sha256=ZTxu4emeYInlYyw7b19c8cYlj90fo1wtA-1BEJKZGt0,1256
25
- sandwitches/templates/admin/recipe_form.html,sha256=ssLnS63UobRFwPbDHMrnwniJEta3QHkWOJb8IPzYd_k,7560
26
- sandwitches/templates/admin/recipe_list.html,sha256=HDOmhK-XEPwTv1CCBqTXK79pLoH5y2xKPFjjue0HFeQ,2454
30
+ sandwitches/templates/admin/dashboard.html,sha256=TVrf91iue7w3B9JA3L2cGggAx0UfcSL44zxm8rmStE4,5887
31
+ sandwitches/templates/admin/order_list.html,sha256=eHFUn2speXaaj5_SFUG0Z0HfWVUR9-VCDRBeb8ufFb0,819
32
+ sandwitches/templates/admin/partials/dashboard_charts.html,sha256=NYrt-LDZO4__2KDWhAYL5K_f-2Zgj0iiuaZQiRZlBWg,3639
33
+ sandwitches/templates/admin/partials/order_rows.html,sha256=Ye35liahKbQ3rqa6fIGSTwb7seoXoqyqSw0wyNq2C_o,893
34
+ sandwitches/templates/admin/rating_list.html,sha256=8CHAsBfKfs4izhb-IyOiDjJXqAZxFcStoRSGh4pRlgM,1365
35
+ sandwitches/templates/admin/recipe_form.html,sha256=OpDnsB6WsoC45POtil54qHGn93P4A3DiccKVisM5NGM,8746
36
+ sandwitches/templates/admin/recipe_list.html,sha256=cVsAm1TRP4bsE7rkcxIVsThKs3FLr5MWvebSvJoRmAo,5365
27
37
  sandwitches/templates/admin/tag_form.html,sha256=JRWgAl4fz_Oy-Kuo1K6Mex_CXdsHMABzzyPazthr1Kg,989
28
38
  sandwitches/templates/admin/tag_list.html,sha256=ttxwXgfdxkEs4Cmrz5RHaGmaqLd7JDmWhjv80XIQqyw,1246
29
39
  sandwitches/templates/admin/task_detail.html,sha256=dO5zHOG-yTY1ly3VPA3o3jjie0wmxw0gdddtSKpN-W8,3825
30
40
  sandwitches/templates/admin/task_list.html,sha256=3YF7YQ3nbXnWjApKeA07Z7HkhdMuH4s6sLoN7gwg0eE,1535
31
41
  sandwitches/templates/admin/user_form.html,sha256=7_6GShLROFeJJexL1XLFUXdW9_lYF87eT6cigB5bQo4,1314
32
42
  sandwitches/templates/admin/user_list.html,sha256=6O1YctULY-tqJnagybJof9ERA_NL1LX_a8cAu6_aWVQ,2193
33
- sandwitches/templates/base.html,sha256=07zDXWzRC-aptZW6oq3xcxvDA1Lh87F7kTpBeYFUwsg,3211
43
+ sandwitches/templates/base.html,sha256=mwCESNirfvvdyMg2e1Siy_LA8fLH29m0aS_Jv0Qom4U,3597
34
44
  sandwitches/templates/base_beer.html,sha256=4QgU4_gu_RRMtimmRAhATDJ3mj_WANxtilQJYNgAL60,2077
45
+ sandwitches/templates/community.html,sha256=6x-Z8E0W3Ii-d0aG7DdCJoWQM9bVKNP_NSP8fTqpo6o,5324
35
46
  sandwitches/templates/components/carousel_scripts.html,sha256=9vEL5JJv8zUUjEtsnHW-BwwXUNWqQ6w_vf6UdxgEv_I,1934
36
47
  sandwitches/templates/components/favorites_search_form.html,sha256=tpD8SpS47TUDJBwxhMuvjhTN9pjWoRGFW50TBv48Ld4,5202
37
48
  sandwitches/templates/components/footer.html,sha256=Qk-myRtXS6-1b3fMowVGnSuFb_UkUgX6BYX9zgh_SV8,486
@@ -41,27 +52,26 @@ sandwitches/templates/components/instructions_section.html,sha256=RFlA4uPiI6vf1e
41
52
  sandwitches/templates/components/language_dialog.html,sha256=iz-6QhFe4f_dsVhGDhVx6KKKLgQz4grX8tbIqSQjDsg,1184
42
53
  sandwitches/templates/components/navbar.html,sha256=X2qOPHhVrSl4TkTk4YY-60YjpwCG7IEe4L6a9ywMih4,1164
43
54
  sandwitches/templates/components/rating_section.html,sha256=8O5IsFfQwnElMQZLnDpJiuCvvQMLa3jCS67u_RhMi7o,2717
44
- sandwitches/templates/components/recipe_header.html,sha256=9r7nZHNCZcuBb-9h7rEQFm3ug7Yv_XvbGTDqWwwN964,1666
55
+ sandwitches/templates/components/recipe_header.html,sha256=jH9bnT6tis3OuePBq-xzP87IIx2ipDTuw2LO0BQwLXg,1996
45
56
  sandwitches/templates/components/search_form.html,sha256=B8579Jo44gLrlmvkkc2-Vuv_QD93Ljt6F2J1WgTDV60,6617
46
57
  sandwitches/templates/components/search_scripts.html,sha256=HvsO5e50DoTZeoFiYeNP5S8S5h7Zfr9VULOWKKR1i_M,3423
47
- sandwitches/templates/components/side_menu.html,sha256=JyrhmyWLKKZj1yqriHqQc6Fv25TpmIgXNhoEdxrePVQ,1529
58
+ sandwitches/templates/components/side_menu.html,sha256=qXYyk8W-GnG-u_mJ65ADa4HWfUa2ubxnQAKwxwacF9M,1787
48
59
  sandwitches/templates/components/user_menu.html,sha256=c20cBpyLheGvHdQ5nn-c4fjNlhfnAt3FAsw1V46rTwQ,369
49
60
  sandwitches/templates/detail.html,sha256=g-O_RsW9Ix9ivWC0nZ4FwHY2NhgYZ3bEGLpqGY0JSxg,5642
50
61
  sandwitches/templates/favorites.html,sha256=0cPpW07N6Isrb8XpvA5Eh97L2-12QFZ43EzeJvbOlXo,917
51
62
  sandwitches/templates/index.html,sha256=7anU7k8s80JYk59Rwsm8EdlNYd7B5clCvV7pKq2IUy0,2518
52
63
  sandwitches/templates/login.html,sha256=LiQskhkOkfx0EE4ssA1ToqQ3oEll08OPYLDIkLjHfU8,2177
53
64
  sandwitches/templates/partials/recipe_list.html,sha256=oF5zlgAyX_uG63BwulyhFywrn8QLnWXatXVtZPVcPmE,4186
54
- sandwitches/templates/profile.html,sha256=TiYAf3ZPj18OYrmm-J_rjjqBrXbC9K2t1P4ZnKTajIY,4151
55
- sandwitches/templates/recipe_form.html,sha256=TzdlzeSqUoJTDTuCdFbeF5jCBZUTZEtlTIC_IQM3WL8,4754
65
+ sandwitches/templates/profile.html,sha256=PQTL6_xn0pGUxqEOYuz5j0pmqAyG0Wr3KvyFBO8_k1s,4156
56
66
  sandwitches/templates/setup.html,sha256=iNveFgePATsCSO4XMbGPa8TnWHyvj8S_5WwcW6i7pbo,4661
57
67
  sandwitches/templates/signup.html,sha256=pNBSlRGZI_B5ccF3dWpUgWBcjODkdLlq7HhyJLYIHCI,6176
58
68
  sandwitches/templatetags/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
59
69
  sandwitches/templatetags/custom_filters.py,sha256=0KDFlFz4b5LwlcURBAmzyYWKKea-LwydZytJGVkkuKA,243
60
70
  sandwitches/templatetags/markdown_extras.py,sha256=0ibmRzxE3r85x4k7kK71R-9UT0CgeegYF7MHzj3juTI,344
61
- sandwitches/urls.py,sha256=f_oPaPGMFfCc-rfmdmhUfFer3FjdHOixcRbueNhA9e8,3985
71
+ sandwitches/urls.py,sha256=4VeccEtx2dz-Y8IjqD7Cj24nnd89PteoXo2NUUfWJiU,4339
62
72
  sandwitches/utils.py,sha256=SJP-TkeRZ0OIfaMigYrOSbxRqYXswoqoWhwll3nFuAM,7245
63
- sandwitches/views.py,sha256=muqTfZ8Nm44dhyBX0QDVybNhWLvf1b7m47ri6aV-INE,21054
73
+ sandwitches/views.py,sha256=bFe1y8FJ00Tke6yUJteY0j3VysXUsZJkuQXmmbK_yso,25876
64
74
  sandwitches/wsgi.py,sha256=Eyncpnahq_4s3Lr9ruB-R3Lu9j9zBXqgPbUj7qhIbwU,399
65
- sandwitches-2.3.0.dist-info/WHEEL,sha256=eh7sammvW2TypMMMGKgsM83HyA_3qQ5Lgg3ynoecH3M,79
66
- sandwitches-2.3.0.dist-info/METADATA,sha256=0e2iaCj3WmbGAntDQ8dGhjb6HfiPKoHXiTxS5YGA0gk,3111
67
- sandwitches-2.3.0.dist-info/RECORD,,
75
+ sandwitches-2.3.2.dist-info/WHEEL,sha256=eh7sammvW2TypMMMGKgsM83HyA_3qQ5Lgg3ynoecH3M,79
76
+ sandwitches-2.3.2.dist-info/METADATA,sha256=tlOlPIGVWSb4EILVME-FpZDSQTqfDLtrQZGB_nQjtII,3111
77
+ sandwitches-2.3.2.dist-info/RECORD,,