sandwitches 2.3.3__py3-none-any.whl → 2.4.1__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.
sandwitches/views.py CHANGED
@@ -8,7 +8,7 @@ from django.contrib.auth import get_user_model
8
8
  from django.contrib.auth.decorators import login_required
9
9
  from django.contrib.admin.views.decorators import staff_member_required
10
10
  from django.utils.translation import gettext as _
11
- from .models import Recipe, Rating, Tag, Order
11
+ from .models import Recipe, Rating, Tag, Order, CartItem
12
12
  from .forms import (
13
13
  RecipeForm,
14
14
  AdminSetupForm,
@@ -28,6 +28,7 @@ from PIL import Image
28
28
  from django.db.models import Q, Avg
29
29
  from django_tasks.backends.database.models import DBTaskResult
30
30
  from django.contrib.auth.views import LoginView
31
+ from django.core.paginator import Paginator
31
32
 
32
33
 
33
34
  from sandwitches import __version__ as sandwitches_version
@@ -42,7 +43,7 @@ def community(request):
42
43
  if form.is_valid():
43
44
  recipe = form.save(commit=False)
44
45
  recipe.uploaded_by = request.user
45
- recipe.is_community_made = True
46
+ recipe.is_approved = False
46
47
  recipe.save()
47
48
  form.save_m2m()
48
49
  messages.success(
@@ -53,16 +54,17 @@ def community(request):
53
54
  else:
54
55
  form = UserRecipeSubmissionForm()
55
56
 
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
- )
57
+ # Community recipes = uploaded by users in 'community' group
58
+ recipes = Recipe.objects.filter( # ty:ignore[unresolved-attribute]
59
+ uploaded_by__groups__name="community"
60
+ ).prefetch_related("favorited_by")
60
61
 
61
- if not request.user.is_staff:
62
+ if not (request.user.is_staff or request.user.groups.filter(name="admin").exists()):
62
63
  # 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
- )
64
+ recipes = recipes.filter(Q(is_approved=True) | Q(uploaded_by=request.user))
65
+ else:
66
+ # Admins see all community recipes
67
+ pass
66
68
 
67
69
  recipes = recipes.order_by("-created_at")
68
70
 
@@ -155,7 +157,7 @@ def admin_dashboard(request):
155
157
  order_counts = [d["count"] for d in order_data]
156
158
 
157
159
  pending_recipes = Recipe.objects.filter( # ty:ignore[unresolved-attribute]
158
- uploaded_by__is_staff=False, uploaded_by__is_superuser=False
160
+ is_approved=False, uploaded_by__groups__name="community"
159
161
  ).order_by("-created_at")
160
162
  context = {
161
163
  "recipe_count": recipe_count,
@@ -220,6 +222,21 @@ def admin_recipe_list(request):
220
222
  )
221
223
 
222
224
 
225
+ @staff_member_required
226
+ def admin_recipe_approval_list(request):
227
+ recipes = Recipe.objects.filter( # ty:ignore[unresolved-attribute]
228
+ is_approved=False, uploaded_by__groups__name="community"
229
+ ).order_by("-created_at")
230
+ return render(
231
+ request,
232
+ "admin/recipe_approval_list.html",
233
+ {
234
+ "recipes": recipes,
235
+ "version": sandwitches_version,
236
+ },
237
+ )
238
+
239
+
223
240
  @staff_member_required
224
241
  def admin_recipe_add(request):
225
242
  if request.method == "POST":
@@ -266,11 +283,14 @@ def admin_recipe_edit(request, pk):
266
283
  @staff_member_required
267
284
  def admin_recipe_approve(request, pk):
268
285
  recipe = get_object_or_404(Recipe, pk=pk)
269
- recipe.is_community_made = True
286
+ recipe.is_approved = True
270
287
  recipe.save()
271
288
  messages.success(
272
289
  request, _("Recipe '%(title)s' approved.") % {"title": recipe.title}
273
290
  )
291
+ referer = request.META.get("HTTP_REFERER")
292
+ if referer and "dashboard/approvals" in referer:
293
+ return redirect("admin_recipe_approval_list")
274
294
  return redirect("admin_recipe_list")
275
295
 
276
296
 
@@ -494,10 +514,19 @@ def admin_order_list(request):
494
514
  def recipe_detail(request, slug):
495
515
  recipe = get_object_or_404(Recipe, slug=slug)
496
516
 
497
- if not recipe.is_community_made:
517
+ # If it's a community recipe, it must be approved or viewed by staff/owner
518
+ is_community = (
519
+ recipe.uploaded_by
520
+ and recipe.uploaded_by.groups.filter(name="community").exists()
521
+ )
522
+ if is_community and not recipe.is_approved:
498
523
  if not (
499
524
  request.user.is_authenticated
500
- and (request.user.is_staff or recipe.uploaded_by == request.user)
525
+ and (
526
+ request.user.is_staff
527
+ or recipe.uploaded_by == request.user
528
+ or request.user.groups.filter(name="admin").exists()
529
+ )
501
530
  ):
502
531
  raise Http404("Recipe not found or pending approval.")
503
532
 
@@ -668,8 +697,8 @@ def index(request):
668
697
 
669
698
  recipes = Recipe.objects.all().prefetch_related("favorited_by") # ty:ignore[unresolved-attribute]
670
699
 
671
- # Only show "normal" recipes (uploaded by staff or no uploader)
672
- recipes = recipes.filter(Q(is_community_made=False))
700
+ # Only show recipes from people in the admin group
701
+ recipes = recipes.filter(uploaded_by__groups__name="admin")
673
702
 
674
703
  # Filtering
675
704
  q = request.GET.get("q")
@@ -743,6 +772,8 @@ def setup(request):
743
772
  First-time setup page: create initial superuser if none exists.
744
773
  Visible only while there are no superusers in the DB.
745
774
  """
775
+ from django.contrib.auth.models import Group
776
+
746
777
  # do not allow access if a superuser already exists
747
778
  if User.objects.filter(is_superuser=True).exists():
748
779
  return redirect("index")
@@ -751,6 +782,12 @@ def setup(request):
751
782
  form = AdminSetupForm(request.POST)
752
783
  if form.is_valid():
753
784
  user = form.save()
785
+
786
+ # Ensure groups exist and add user to admin group
787
+ admin_group, created = Group.objects.get_or_create(name="admin")
788
+ Group.objects.get_or_create(name="community")
789
+ user.groups.add(admin_group)
790
+
754
791
  user.backend = "django.contrib.auth.backends.ModelBackend"
755
792
  login(request, user)
756
793
  messages.success(request, _("Admin account created and signed in."))
@@ -765,10 +802,17 @@ def signup(request):
765
802
  """
766
803
  User signup page: create new regular user accounts.
767
804
  """
805
+ from django.contrib.auth.models import Group
806
+
768
807
  if request.method == "POST":
769
808
  form = UserSignupForm(request.POST, request.FILES)
770
809
  if form.is_valid():
771
810
  user = form.save()
811
+
812
+ # Add user to community group
813
+ community_group, created = Group.objects.get_or_create(name="community")
814
+ user.groups.add(community_group)
815
+
772
816
  # log in the newly created user
773
817
  user.backend = "django.contrib.auth.backends.ModelBackend"
774
818
  login(request, user)
@@ -815,6 +859,149 @@ def user_profile(request):
815
859
  return redirect("user_profile")
816
860
  else:
817
861
  form = UserProfileForm(instance=request.user)
862
+
863
+ orders = request.user.orders.select_related("recipe").all()
864
+
865
+ # Filtering
866
+ status_filter = request.GET.get("status")
867
+ if status_filter:
868
+ orders = orders.filter(status=status_filter)
869
+
870
+ # Sorting
871
+ sort_param = request.GET.get("sort", "-created_at")
872
+ allowed_sorts = {
873
+ "date_asc": "created_at",
874
+ "date_desc": "-created_at",
875
+ "price_asc": "total_price",
876
+ "price_desc": "-total_price",
877
+ "status": "status",
878
+ }
879
+ order_by = allowed_sorts.get(sort_param, "-created_at")
880
+ orders = orders.order_by(order_by)
881
+
882
+ # Pagination
883
+ paginator = Paginator(orders, 5) # Show 5 orders per page
884
+ page_number = request.GET.get("page")
885
+ page_obj = paginator.get_page(page_number)
886
+
818
887
  return render(
819
- request, "profile.html", {"form": form, "version": sandwitches_version}
888
+ request,
889
+ "profile.html",
890
+ {
891
+ "form": form,
892
+ "version": sandwitches_version,
893
+ "orders": page_obj,
894
+ "current_status": status_filter,
895
+ "current_sort": sort_param,
896
+ "status_choices": Order.STATUS_CHOICES,
897
+ },
820
898
  )
899
+
900
+
901
+ @login_required
902
+ def user_order_detail(request, pk):
903
+ order = get_object_or_404(Order, pk=pk, user=request.user)
904
+ return render(
905
+ request,
906
+ "order_detail.html",
907
+ {"order": order, "version": sandwitches_version},
908
+ )
909
+
910
+
911
+ @login_required
912
+ def view_cart(request):
913
+ cart_items = CartItem.objects.filter(user=request.user).select_related("recipe") # ty:ignore[unresolved-attribute]
914
+ total = sum(item.total_price for item in cart_items)
915
+ return render(
916
+ request,
917
+ "cart.html",
918
+ {
919
+ "cart_items": cart_items,
920
+ "total": total,
921
+ "version": sandwitches_version,
922
+ },
923
+ )
924
+
925
+
926
+ @login_required
927
+ def add_to_cart(request, pk):
928
+ recipe = get_object_or_404(Recipe, pk=pk)
929
+ if not recipe.price:
930
+ messages.error(request, _("This recipe cannot be ordered (no price set)."))
931
+ return redirect("recipe_detail", slug=recipe.slug)
932
+
933
+ cart_item, created = CartItem.objects.get_or_create( # ty:ignore[unresolved-attribute]
934
+ user=request.user, recipe=recipe
935
+ )
936
+ if not created:
937
+ cart_item.quantity += 1
938
+ cart_item.save()
939
+
940
+ messages.success(
941
+ request, _("Added %(title)s to your cart.") % {"title": recipe.title}
942
+ )
943
+ return redirect("view_cart")
944
+
945
+
946
+ @login_required
947
+ def remove_from_cart(request, pk):
948
+ cart_item = get_object_or_404(CartItem, pk=pk, user=request.user)
949
+ cart_item.delete()
950
+ messages.success(request, _("Removed from cart."))
951
+ return redirect("view_cart")
952
+
953
+
954
+ @login_required
955
+ def update_cart_quantity(request, pk):
956
+ if request.method == "POST":
957
+ cart_item = get_object_or_404(CartItem, pk=pk, user=request.user)
958
+ try:
959
+ quantity = int(request.POST.get("quantity", 1))
960
+ if quantity > 0:
961
+ cart_item.quantity = quantity
962
+ cart_item.save()
963
+ else:
964
+ cart_item.delete()
965
+ except ValueError:
966
+ pass
967
+ return redirect("view_cart")
968
+
969
+
970
+ @login_required
971
+ def checkout_cart(request):
972
+ cart_items = CartItem.objects.filter(user=request.user) # ty:ignore[unresolved-attribute]
973
+ if not cart_items.exists():
974
+ messages.error(request, _("Your cart is empty."))
975
+ return redirect("view_cart")
976
+
977
+ created_orders = [] # noqa: F841
978
+ errors = []
979
+
980
+ # We use a transaction to ensure either all orders are created or none if something goes wrong
981
+ from django.db import transaction
982
+
983
+ try:
984
+ with transaction.atomic():
985
+ for item in cart_items:
986
+ # Create Order for each recipe in cart (quantity times?)
987
+ # Current Order model doesn't have quantity, so we create multiple orders or update Order model.
988
+ # For now, let's create 'quantity' number of orders as per current schema
989
+ # OR we could update Order model to support quantity.
990
+ # Let's see if Order has quantity. (Checked: it does not).
991
+ for i in range(item.quantity):
992
+ try:
993
+ Order.objects.create(user=request.user, recipe=item.recipe) # ty:ignore[unresolved-attribute]
994
+ except (ValidationError, ValueError) as e:
995
+ errors.append(f"{item.recipe.title}: {str(e)}")
996
+ raise e # Trigger rollback
997
+
998
+ cart_items.delete()
999
+ messages.success(request, _("Orders submitted successfully!"))
1000
+ return redirect("user_profile")
1001
+ except Exception:
1002
+ if errors:
1003
+ for error in errors:
1004
+ messages.error(request, error)
1005
+ else:
1006
+ messages.error(request, _("An error occurred during checkout."))
1007
+ return redirect("view_cart")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: sandwitches
3
- Version: 2.3.3
3
+ Version: 2.4.1
4
4
  Summary: Add your description here
5
5
  Author: Martyn van Dijke
6
6
  Author-email: Martyn van Dijke <martijnvdijke600@gmail.com>
@@ -1,9 +1,9 @@
1
1
  sandwitches/__init__.py,sha256=YTDsQDSdJmxV2Z0dTbBqZhuJRuXcNLSKL0SX73Lu2u8,195
2
- sandwitches/admin.py,sha256=-02WqE8U3rxrVCoNB7sfvtyE4v_e3pt7mFwXfUlindo,2421
2
+ sandwitches/admin.py,sha256=-4QA5InEvLHyb6VFAGKapWbJO9mXdiV4GeQcGsM4xlI,2510
3
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=rcXAL-Dn1gY3mWIPV9X9tZpFp2z6Xrkv6k9f2YUp8OU,7158
6
+ sandwitches/forms.py,sha256=VoQ81COBCgwuS161dhF8IVeeAp8dLiQakzs56SV6-T8,9541
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
9
  sandwitches/management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -20,20 +20,25 @@ sandwitches/migrations/0008_historicalrecipe_daily_orders_count_and_more.py,sha2
20
20
  sandwitches/migrations/0009_historicalrecipe_is_approved_recipe_is_approved.py,sha256=XP76J2_HiMOFeIU17Yu8AYXtswE-dcsNZq3lJGFgGtg,588
21
21
  sandwitches/migrations/0010_rename_is_approved_historicalrecipe_is_community_made_and_more.py,sha256=9Xv-rBRUvx5UWbr7i4BeWbllCcVkcNuC8T3sxKSdWyU,575
22
22
  sandwitches/migrations/0011_alter_historicalrecipe_is_community_made_and_more.py,sha256=O2D57bAsSwBklYqfMTWrHE3Zxj3lrk-CO9yDP8sQS0M,659
23
+ sandwitches/migrations/0012_rename_is_community_made_historicalrecipe_is_approved_and_more.py,sha256=bCDPpHmZTIW70-YeL30WhuJ2mORktkrsntKqTw0vj94,577
24
+ sandwitches/migrations/0013_cartitem.py,sha256=KYMinpnZiLHwjo7p7EdJHQExuEGC9jtpcZcbm1r7JFo,1787
25
+ sandwitches/migrations/0014_ensure_groups_exist.py,sha256=5FSA742bEQtwHZl5CWZQYIdmS8FBxMgWS079dOaOltY,564
26
+ sandwitches/migrations/0015_order_completed_alter_order_status_and_more.py,sha256=PTXQZUE8RqTAK8l0vkZhiGKv2T0PDiWEue7f6qz3AQ0,1670
23
27
  sandwitches/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
24
- sandwitches/models.py,sha256=MmSP1P7Kq2ObjYTJs9AKTEVeWcD5-Pqumj1BTnmBqTc,9986
28
+ sandwitches/models.py,sha256=kU71fC9Lf6Ij_8vpN0nB0OUKWpzWxi9WxqIYEzP4Ogg,11144
25
29
  sandwitches/settings.py,sha256=5_eQAJCAV093hnhr3XOxHekT4IF-PEJcRiTecq71_SQ,5841
26
30
  sandwitches/storage.py,sha256=ibBG6tVtArqzgEKsRimZPwsqW7i9j4WiPLLHrOJchow,3578
27
31
  sandwitches/tasks.py,sha256=YiliAT2rj0fh7hrwKq5_qWtv9AGhd5iulj_iBwZBBKg,6024
28
- sandwitches/templates/admin/admin_base.html,sha256=Mzq0A6Pl-x61gXv15XegW26X7HKHS0aGcAD-WBSwSG4,4249
32
+ sandwitches/templates/admin/admin_base.html,sha256=aXba3MKFOKhaauFf0z0fFRjPpFHEbT_fREQx31TyxAM,4497
29
33
  sandwitches/templates/admin/confirm_delete.html,sha256=HfsZI_gV8JQTKz215TYgPWBrgrFhGv1UB3N-0Hln-14,804
30
- sandwitches/templates/admin/dashboard.html,sha256=1aZd5AQ2opWjzAsP1q_d15EWZIC04NWoKSH8RTgSyTg,5832
34
+ sandwitches/templates/admin/dashboard.html,sha256=Ial8zH2odIPpstSkQmzGrasl0QxvgGhFPAGy7V5xRzY,5916
31
35
  sandwitches/templates/admin/order_list.html,sha256=eHFUn2speXaaj5_SFUG0Z0HfWVUR9-VCDRBeb8ufFb0,819
32
36
  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
37
+ sandwitches/templates/admin/partials/order_rows.html,sha256=C7_ArHw1udaGjx6CRJHhksje0OReP7UUhdsHcdFPqCc,940
34
38
  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
39
+ sandwitches/templates/admin/recipe_approval_list.html,sha256=M6GFYI45lAkLkvqP44cu5tDYVOeeVNklEphof1euesM,2281
40
+ sandwitches/templates/admin/recipe_form.html,sha256=wVKKBFl3vN11aknnmv2Hxkj66zZk9iZ0x_iS1j_X_Ro,12884
41
+ sandwitches/templates/admin/recipe_list.html,sha256=5fGnRIQ7JfvM3yfG-sngEIEgiPnPDkjK1Tn3nO8EDh4,5359
37
42
  sandwitches/templates/admin/tag_form.html,sha256=JRWgAl4fz_Oy-Kuo1K6Mex_CXdsHMABzzyPazthr1Kg,989
38
43
  sandwitches/templates/admin/tag_list.html,sha256=ttxwXgfdxkEs4Cmrz5RHaGmaqLd7JDmWhjv80XIQqyw,1246
39
44
  sandwitches/templates/admin/task_detail.html,sha256=dO5zHOG-yTY1ly3VPA3o3jjie0wmxw0gdddtSKpN-W8,3825
@@ -42,7 +47,8 @@ sandwitches/templates/admin/user_form.html,sha256=7_6GShLROFeJJexL1XLFUXdW9_lYF8
42
47
  sandwitches/templates/admin/user_list.html,sha256=6O1YctULY-tqJnagybJof9ERA_NL1LX_a8cAu6_aWVQ,2193
43
48
  sandwitches/templates/base.html,sha256=mwCESNirfvvdyMg2e1Siy_LA8fLH29m0aS_Jv0Qom4U,3597
44
49
  sandwitches/templates/base_beer.html,sha256=4QgU4_gu_RRMtimmRAhATDJ3mj_WANxtilQJYNgAL60,2077
45
- sandwitches/templates/community.html,sha256=6x-Z8E0W3Ii-d0aG7DdCJoWQM9bVKNP_NSP8fTqpo6o,5324
50
+ sandwitches/templates/cart.html,sha256=YqmrzOLLPAXSqeXeUTrt9AwTTWOitOLTaD_k3mYYVpM,4537
51
+ sandwitches/templates/community.html,sha256=-YhpPtLbrVK9mc2Go1XBInLK-7OXrtb7kKukjl7rGbg,9607
46
52
  sandwitches/templates/components/carousel_scripts.html,sha256=9vEL5JJv8zUUjEtsnHW-BwwXUNWqQ6w_vf6UdxgEv_I,1934
47
53
  sandwitches/templates/components/favorites_search_form.html,sha256=tpD8SpS47TUDJBwxhMuvjhTN9pjWoRGFW50TBv48Ld4,5202
48
54
  sandwitches/templates/components/footer.html,sha256=Qk-myRtXS6-1b3fMowVGnSuFb_UkUgX6BYX9zgh_SV8,486
@@ -50,9 +56,9 @@ sandwitches/templates/components/ingredients_scripts.html,sha256=2zKTC65GYF589uW
50
56
  sandwitches/templates/components/ingredients_section.html,sha256=XsaVXTs9MIwjfJeLjlzah3GWWj8oFU-_HJd9i9l1HAo,665
51
57
  sandwitches/templates/components/instructions_section.html,sha256=RFlA4uPiI6vf1e2QgiD5KzGoy7Vg7y7nFY7TFabCYLA,277
52
58
  sandwitches/templates/components/language_dialog.html,sha256=iz-6QhFe4f_dsVhGDhVx6KKKLgQz4grX8tbIqSQjDsg,1184
53
- sandwitches/templates/components/navbar.html,sha256=X2qOPHhVrSl4TkTk4YY-60YjpwCG7IEe4L6a9ywMih4,1164
59
+ sandwitches/templates/components/navbar.html,sha256=t-ZWvd9Z3UQRR2RswcsRXRNbygiesOD0Bh1jhmm2vEY,1396
54
60
  sandwitches/templates/components/rating_section.html,sha256=8O5IsFfQwnElMQZLnDpJiuCvvQMLa3jCS67u_RhMi7o,2717
55
- sandwitches/templates/components/recipe_header.html,sha256=jH9bnT6tis3OuePBq-xzP87IIx2ipDTuw2LO0BQwLXg,1996
61
+ sandwitches/templates/components/recipe_header.html,sha256=U6CxuR275QD9TIqo3VQftqvV6tqmH1rJdDcQotnXxYM,2001
56
62
  sandwitches/templates/components/search_form.html,sha256=B8579Jo44gLrlmvkkc2-Vuv_QD93Ljt6F2J1WgTDV60,6617
57
63
  sandwitches/templates/components/search_scripts.html,sha256=HvsO5e50DoTZeoFiYeNP5S8S5h7Zfr9VULOWKKR1i_M,3423
58
64
  sandwitches/templates/components/side_menu.html,sha256=qXYyk8W-GnG-u_mJ65ADa4HWfUa2ubxnQAKwxwacF9M,1787
@@ -61,17 +67,18 @@ sandwitches/templates/detail.html,sha256=g-O_RsW9Ix9ivWC0nZ4FwHY2NhgYZ3bEGLpqGY0
61
67
  sandwitches/templates/favorites.html,sha256=0cPpW07N6Isrb8XpvA5Eh97L2-12QFZ43EzeJvbOlXo,917
62
68
  sandwitches/templates/index.html,sha256=7anU7k8s80JYk59Rwsm8EdlNYd7B5clCvV7pKq2IUy0,2518
63
69
  sandwitches/templates/login.html,sha256=LiQskhkOkfx0EE4ssA1ToqQ3oEll08OPYLDIkLjHfU8,2177
64
- sandwitches/templates/partials/recipe_list.html,sha256=oF5zlgAyX_uG63BwulyhFywrn8QLnWXatXVtZPVcPmE,4186
65
- sandwitches/templates/profile.html,sha256=PQTL6_xn0pGUxqEOYuz5j0pmqAyG0Wr3KvyFBO8_k1s,4156
70
+ sandwitches/templates/order_detail.html,sha256=D6MjUVibQuED2VRNHSjKVnLHcLgFtLvcVmuwlzfoJzo,2498
71
+ sandwitches/templates/partials/recipe_list.html,sha256=LUHKFKG90D72K9X2X3d1osvj2jX1QU_MbPe0lNwRSII,4555
72
+ sandwitches/templates/profile.html,sha256=m3-31b_z5QhHLgol-QwHrb3MM9B9kk5kybL3B1nWC5Y,8539
66
73
  sandwitches/templates/setup.html,sha256=iNveFgePATsCSO4XMbGPa8TnWHyvj8S_5WwcW6i7pbo,4661
67
74
  sandwitches/templates/signup.html,sha256=pNBSlRGZI_B5ccF3dWpUgWBcjODkdLlq7HhyJLYIHCI,6176
68
75
  sandwitches/templatetags/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
69
76
  sandwitches/templatetags/custom_filters.py,sha256=0KDFlFz4b5LwlcURBAmzyYWKKea-LwydZytJGVkkuKA,243
70
77
  sandwitches/templatetags/markdown_extras.py,sha256=0ibmRzxE3r85x4k7kK71R-9UT0CgeegYF7MHzj3juTI,344
71
- sandwitches/urls.py,sha256=4VeccEtx2dz-Y8IjqD7Cj24nnd89PteoXo2NUUfWJiU,4339
78
+ sandwitches/urls.py,sha256=TysY6JhOV2kGC-9KloZjLDfk4TUZS6xX95A_RfG971g,4940
72
79
  sandwitches/utils.py,sha256=SJP-TkeRZ0OIfaMigYrOSbxRqYXswoqoWhwll3nFuAM,7245
73
- sandwitches/views.py,sha256=bFe1y8FJ00Tke6yUJteY0j3VysXUsZJkuQXmmbK_yso,25876
80
+ sandwitches/views.py,sha256=pDDDXaojPstj5E_k5gBQmW901Lol0R3gUl3qWGwUmI0,32145
74
81
  sandwitches/wsgi.py,sha256=Eyncpnahq_4s3Lr9ruB-R3Lu9j9zBXqgPbUj7qhIbwU,399
75
- sandwitches-2.3.3.dist-info/WHEEL,sha256=eh7sammvW2TypMMMGKgsM83HyA_3qQ5Lgg3ynoecH3M,79
76
- sandwitches-2.3.3.dist-info/METADATA,sha256=TltlxFRdT55B1vxKqYv9CjjUEwITAOgFXvw3UwWKA2k,3111
77
- sandwitches-2.3.3.dist-info/RECORD,,
82
+ sandwitches-2.4.1.dist-info/WHEEL,sha256=eh7sammvW2TypMMMGKgsM83HyA_3qQ5Lgg3ynoecH3M,79
83
+ sandwitches-2.4.1.dist-info/METADATA,sha256=97JvkhJ7rzJpQIfULxJ-0yz3rN1EfGZkhB-zpihx4wg,3111
84
+ sandwitches-2.4.1.dist-info/RECORD,,