sandwitches 1.4.2__py3-none-any.whl → 1.5.0__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 (67) hide show
  1. sandwitches/__init__.py +6 -0
  2. sandwitches/admin.py +21 -2
  3. sandwitches/api.py +112 -6
  4. sandwitches/feeds.py +23 -0
  5. sandwitches/forms.py +110 -7
  6. sandwitches/locale/nl/LC_MESSAGES/django.mo +0 -0
  7. sandwitches/locale/nl/LC_MESSAGES/django.po +784 -134
  8. sandwitches/migrations/0001_initial.py +255 -2
  9. sandwitches/migrations/0002_historicalrecipe_servings_recipe_servings.py +27 -0
  10. sandwitches/migrations/0003_setting.py +35 -0
  11. sandwitches/migrations/0004_alter_setting_ai_api_key_and_more.py +37 -0
  12. sandwitches/migrations/0005_rating_comment.py +17 -0
  13. sandwitches/models.py +48 -4
  14. sandwitches/settings.py +14 -5
  15. sandwitches/storage.py +44 -12
  16. sandwitches/templates/admin/admin_base.html +118 -0
  17. sandwitches/templates/admin/confirm_delete.html +23 -0
  18. sandwitches/templates/admin/dashboard.html +262 -0
  19. sandwitches/templates/admin/rating_list.html +38 -0
  20. sandwitches/templates/admin/recipe_form.html +184 -0
  21. sandwitches/templates/admin/recipe_list.html +64 -0
  22. sandwitches/templates/admin/tag_form.html +30 -0
  23. sandwitches/templates/admin/tag_list.html +37 -0
  24. sandwitches/templates/admin/task_detail.html +91 -0
  25. sandwitches/templates/admin/task_list.html +41 -0
  26. sandwitches/templates/admin/user_form.html +37 -0
  27. sandwitches/templates/admin/user_list.html +60 -0
  28. sandwitches/templates/base.html +80 -1
  29. sandwitches/templates/base_beer.html +57 -0
  30. sandwitches/templates/components/favorites_search_form.html +85 -0
  31. sandwitches/templates/components/footer.html +14 -0
  32. sandwitches/templates/components/ingredients_scripts.html +50 -0
  33. sandwitches/templates/components/ingredients_section.html +11 -0
  34. sandwitches/templates/components/instructions_section.html +9 -0
  35. sandwitches/templates/components/language_dialog.html +26 -0
  36. sandwitches/templates/components/navbar.html +27 -0
  37. sandwitches/templates/components/rating_section.html +66 -0
  38. sandwitches/templates/components/recipe_header.html +32 -0
  39. sandwitches/templates/components/search_form.html +106 -0
  40. sandwitches/templates/components/search_scripts.html +98 -0
  41. sandwitches/templates/components/side_menu.html +31 -0
  42. sandwitches/templates/components/user_menu.html +10 -0
  43. sandwitches/templates/detail.html +167 -110
  44. sandwitches/templates/favorites.html +42 -0
  45. sandwitches/templates/index.html +28 -61
  46. sandwitches/templates/partials/recipe_list.html +87 -0
  47. sandwitches/templates/recipe_form.html +119 -0
  48. sandwitches/templates/setup.html +1 -1
  49. sandwitches/templates/signup.html +114 -31
  50. sandwitches/templatetags/custom_filters.py +15 -0
  51. sandwitches/urls.py +56 -0
  52. sandwitches/utils.py +222 -0
  53. sandwitches/views.py +503 -14
  54. sandwitches-1.5.0.dist-info/METADATA +104 -0
  55. sandwitches-1.5.0.dist-info/RECORD +62 -0
  56. sandwitches/migrations/0002_historicalrecipe.py +0 -61
  57. sandwitches/migrations/0003_rating.py +0 -57
  58. sandwitches/migrations/0004_add_uploaded_by.py +0 -25
  59. sandwitches/migrations/0005_historicalrecipe_uploaded_by.py +0 -27
  60. sandwitches/migrations/0006_profile.py +0 -48
  61. sandwitches/migrations/0007_alter_rating_score.py +0 -23
  62. sandwitches/migrations/0008_delete_profile.py +0 -15
  63. sandwitches/templates/base_pico.html +0 -260
  64. sandwitches/templates/form.html +0 -16
  65. sandwitches-1.4.2.dist-info/METADATA +0 -25
  66. sandwitches-1.4.2.dist-info/RECORD +0 -35
  67. {sandwitches-1.4.2.dist-info → sandwitches-1.5.0.dist-info}/WHEEL +0 -0
@@ -0,0 +1,62 @@
1
+ sandwitches/__init__.py,sha256=YTDsQDSdJmxV2Z0dTbBqZhuJRuXcNLSKL0SX73Lu2u8,195
2
+ sandwitches/admin.py,sha256=3n73AD-j7vyajgoFdhPe3IXH6SFGIAq378gKDRr6ims,1852
3
+ sandwitches/api.py,sha256=4Upjd78dHVZDOIFkZjPst0mLfVdiToB3RVVrBpttTYg,5714
4
+ sandwitches/asgi.py,sha256=cygnXdXSSVspM7ZXuj47Ef6oz7HSTw4D7BPzgE2PU5w,399
5
+ sandwitches/feeds.py,sha256=iz1d11dV0utA0ZNsB7VIAp0h8Zr5mFNSKJWHbw_j6YM,683
6
+ sandwitches/forms.py,sha256=ODrwV52TSBxIatmVp_5A_l7WcDh9m1D3vLgL22HwLHo,5880
7
+ sandwitches/locale/nl/LC_MESSAGES/django.mo,sha256=EzQWzIhz_Na3w9AS7F-YjB-Xv63t4sMRSAkEQ1-g32M,5965
8
+ sandwitches/locale/nl/LC_MESSAGES/django.po,sha256=znxspEoMwkmktusZtbVrt1KG1LDUwIEi4ZEIE3XGeoI,25904
9
+ sandwitches/migrations/0001_initial.py,sha256=hXnCAhoA91C6YCinXyUdIfQ7QL29NPBHFfTqLgulMsY,12507
10
+ sandwitches/migrations/0002_historicalrecipe_servings_recipe_servings.py,sha256=8E09y99FdVNzaQMn8R1d5zEcCN9jZICVCTW8MsGRBqs,743
11
+ sandwitches/migrations/0003_setting.py,sha256=DmugIrz0Wtftx7B0MrX6ms34j60kSOwcPz1sLRP4wE0,1200
12
+ sandwitches/migrations/0004_alter_setting_ai_api_key_and_more.py,sha256=516vcSxWzsZiJaskH1JC-1FgB0t4ijNC2L3PcfdRPNg,1109
13
+ sandwitches/migrations/0005_rating_comment.py,sha256=MRlTZkyATH1aJdkaesPlPkXkYt-mzqBik-MCcNrbLRI,398
14
+ sandwitches/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
15
+ sandwitches/models.py,sha256=MHx892trckPaIM-K5u8fFGj8HuLHi7SnPG5COP94Ung,7196
16
+ sandwitches/settings.py,sha256=av4Cjplj0pwfThvaNfxPXh7D-0GCE4y_smtcH_mVYWE,5761
17
+ sandwitches/storage.py,sha256=ibBG6tVtArqzgEKsRimZPwsqW7i9j4WiPLLHrOJchow,3578
18
+ sandwitches/tasks.py,sha256=8jHQougtywhsDyd-6W4VV-x5PCwwhNG3J99E0hzy_MA,3660
19
+ sandwitches/templates/admin/admin_base.html,sha256=saeKUBngPhkq2udPXuO8oQPEu4RqgJaY0cic_QLIVGo,4263
20
+ sandwitches/templates/admin/confirm_delete.html,sha256=ewP0rRxbeSst5x5ZmLyAbhUiSArevnN7VtkR00VdPMc,812
21
+ sandwitches/templates/admin/dashboard.html,sha256=9dfmXotisr1vZw88eHbnKC_k-3ZGewbixZrJMpHj-pI,6167
22
+ sandwitches/templates/admin/rating_list.html,sha256=ZTxu4emeYInlYyw7b19c8cYlj90fo1wtA-1BEJKZGt0,1256
23
+ sandwitches/templates/admin/recipe_form.html,sha256=VWwfVgmG8oC3nRVVCtVDLop0LS9ctdy6-QhbfhQ7k8I,7617
24
+ sandwitches/templates/admin/recipe_list.html,sha256=HDOmhK-XEPwTv1CCBqTXK79pLoH5y2xKPFjjue0HFeQ,2454
25
+ sandwitches/templates/admin/tag_form.html,sha256=JRWgAl4fz_Oy-Kuo1K6Mex_CXdsHMABzzyPazthr1Kg,989
26
+ sandwitches/templates/admin/tag_list.html,sha256=ttxwXgfdxkEs4Cmrz5RHaGmaqLd7JDmWhjv80XIQqyw,1246
27
+ sandwitches/templates/admin/task_detail.html,sha256=1tU57R_EBw6v7PKvY7Ucf6BJYDbf_K9KXY_0qq2dHEA,3861
28
+ sandwitches/templates/admin/task_list.html,sha256=3YF7YQ3nbXnWjApKeA07Z7HkhdMuH4s6sLoN7gwg0eE,1535
29
+ sandwitches/templates/admin/user_form.html,sha256=7_6GShLROFeJJexL1XLFUXdW9_lYF87eT6cigB5bQo4,1314
30
+ sandwitches/templates/admin/user_list.html,sha256=6O1YctULY-tqJnagybJof9ERA_NL1LX_a8cAu6_aWVQ,2193
31
+ sandwitches/templates/base.html,sha256=Z_odI29O3HkCKUN0Wk3ETdWOfC5QD7FIHp0i5Xr0eoU,3218
32
+ sandwitches/templates/base_beer.html,sha256=gHangI-Q089WqLv7gfboInKGgyUbQt0H5Rqlb-dP6Ls,2077
33
+ sandwitches/templates/components/favorites_search_form.html,sha256=vX-yG7QYxfWsJUTjLrazenkDPZAHosdHGY76RWg19UI,5249
34
+ sandwitches/templates/components/footer.html,sha256=Qk-myRtXS6-1b3fMowVGnSuFb_UkUgX6BYX9zgh_SV8,486
35
+ sandwitches/templates/components/ingredients_scripts.html,sha256=BaWiNbWOYarqZOIkdR8yfv-bwQ4OdfHg0GOOCzGyZO8,1837
36
+ sandwitches/templates/components/ingredients_section.html,sha256=XsaVXTs9MIwjfJeLjlzah3GWWj8oFU-_HJd9i9l1HAo,665
37
+ sandwitches/templates/components/instructions_section.html,sha256=RFlA4uPiI6vf1e2QgiD5KzGoy7Vg7y7nFY7TFabCYLA,277
38
+ sandwitches/templates/components/language_dialog.html,sha256=iz-6QhFe4f_dsVhGDhVx6KKKLgQz4grX8tbIqSQjDsg,1184
39
+ sandwitches/templates/components/navbar.html,sha256=8ugRB2g_pI4VohCq3yj8yrPnKr8t3Q440G3VDtKG7vo,1057
40
+ sandwitches/templates/components/rating_section.html,sha256=Z_YDkmcSC1sNN5LR-3pnnb4gRB-SO95XBY3dbnINnBc,2733
41
+ sandwitches/templates/components/recipe_header.html,sha256=-LCp6KqkQO7a7yqR0jKUQ95-RczYU-_MFO058lE04_w,1473
42
+ sandwitches/templates/components/search_form.html,sha256=OqsrpG-eKtSedZ9k0ee1WrezOokuESrvKi62U1VA-B4,6665
43
+ sandwitches/templates/components/search_scripts.html,sha256=qDIqcOg3QEWS5bfJkJ3zFmWpt1UOiLs_vahOc-MtxZs,3463
44
+ sandwitches/templates/components/side_menu.html,sha256=0dfmsi4e4YY70Fbfqrxehj3d99lSkqgucm5hY9W1Lt8,1332
45
+ sandwitches/templates/components/user_menu.html,sha256=c20cBpyLheGvHdQ5nn-c4fjNlhfnAt3FAsw1V46rTwQ,369
46
+ sandwitches/templates/detail.html,sha256=w3e8tLZSbdHv3PVrzo-M1MSOsZPUbJCmvvrCYLiYhxk,5709
47
+ sandwitches/templates/favorites.html,sha256=0cPpW07N6Isrb8XpvA5Eh97L2-12QFZ43EzeJvbOlXo,917
48
+ sandwitches/templates/index.html,sha256=_ERrYj2iy_UWyIT_xVPNtBEggXDDVMSo61t7vEDdUTY,898
49
+ sandwitches/templates/partials/recipe_list.html,sha256=QoQNx1FP7viRgTp7Bpe20ECB9EZRt6vX-6jGxjd3WAQ,4001
50
+ sandwitches/templates/recipe_form.html,sha256=7-w5o3lfTJB3bTpL7UuMsin8ruHahaCXehp_RzeWjCA,4786
51
+ sandwitches/templates/setup.html,sha256=juoqntk47lsO3DTicL3k-_9HBLPlG-A-FhL2xqbIAoQ,1871
52
+ sandwitches/templates/signup.html,sha256=GKzTZVczL6ovmAK2wT1t7VTIJgwotS16lsOC66AnYHc,6213
53
+ sandwitches/templatetags/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
54
+ sandwitches/templatetags/custom_filters.py,sha256=0KDFlFz4b5LwlcURBAmzyYWKKea-LwydZytJGVkkuKA,243
55
+ sandwitches/templatetags/markdown_extras.py,sha256=0ibmRzxE3r85x4k7kK71R-9UT0CgeegYF7MHzj3juTI,344
56
+ sandwitches/urls.py,sha256=uhzsVpKC8Vo6ReDZk3BMg9Pxg4uSrFO8rUdNm18h-xI,3710
57
+ sandwitches/utils.py,sha256=SJP-TkeRZ0OIfaMigYrOSbxRqYXswoqoWhwll3nFuAM,7245
58
+ sandwitches/views.py,sha256=BpJkrBVXYoDMFborpH0FEaYT5xk0Dg4adCurXbFl4-o,20215
59
+ sandwitches/wsgi.py,sha256=Eyncpnahq_4s3Lr9ruB-R3Lu9j9zBXqgPbUj7qhIbwU,399
60
+ sandwitches-1.5.0.dist-info/WHEEL,sha256=eh7sammvW2TypMMMGKgsM83HyA_3qQ5Lgg3ynoecH3M,79
61
+ sandwitches-1.5.0.dist-info/METADATA,sha256=n-yUZ7iZePRdJlahDX2Zm7Cr-TBXh7Mueu6ETdgwaWs,3111
62
+ sandwitches-1.5.0.dist-info/RECORD,,
@@ -1,61 +0,0 @@
1
- # Generated by Django 5.2.8 on 2025-11-10 18:55
2
-
3
- import django.db.models.deletion
4
- import simple_history.models
5
- from django.conf import settings
6
- from django.db import migrations, models
7
-
8
-
9
- class Migration(migrations.Migration):
10
- dependencies = [
11
- ("sandwitches", "0001_initial"),
12
- migrations.swappable_dependency(settings.AUTH_USER_MODEL),
13
- ]
14
-
15
- operations = [
16
- migrations.CreateModel(
17
- name="HistoricalRecipe",
18
- fields=[
19
- (
20
- "id",
21
- models.BigIntegerField(
22
- auto_created=True, blank=True, db_index=True, verbose_name="ID"
23
- ),
24
- ),
25
- ("title", models.CharField(db_index=True, max_length=255)),
26
- ("slug", models.SlugField(blank=True, max_length=255)),
27
- ("description", models.TextField(blank=True)),
28
- ("ingredients", models.TextField(blank=True)),
29
- ("instructions", models.TextField(blank=True)),
30
- ("image", models.TextField(blank=True, max_length=100, null=True)),
31
- ("created_at", models.DateTimeField(blank=True, editable=False)),
32
- ("updated_at", models.DateTimeField(blank=True, editable=False)),
33
- ("history_id", models.AutoField(primary_key=True, serialize=False)),
34
- ("history_date", models.DateTimeField(db_index=True)),
35
- ("history_change_reason", models.CharField(max_length=100, null=True)),
36
- (
37
- "history_type",
38
- models.CharField(
39
- choices=[("+", "Created"), ("~", "Changed"), ("-", "Deleted")],
40
- max_length=1,
41
- ),
42
- ),
43
- (
44
- "history_user",
45
- models.ForeignKey(
46
- null=True,
47
- on_delete=django.db.models.deletion.SET_NULL,
48
- related_name="+",
49
- to=settings.AUTH_USER_MODEL,
50
- ),
51
- ),
52
- ],
53
- options={
54
- "verbose_name": "historical Recipe",
55
- "verbose_name_plural": "historical Recipes",
56
- "ordering": ("-history_date", "-history_id"),
57
- "get_latest_by": ("history_date", "history_id"),
58
- },
59
- bases=(simple_history.models.HistoricalChanges, models.Model),
60
- ),
61
- ]
@@ -1,57 +0,0 @@
1
- # Generated by Django 6.0 on 2025-12-21 21:17
2
-
3
- import django.db.models.deletion
4
- from django.conf import settings
5
- from django.db import migrations, models
6
-
7
-
8
- class Migration(migrations.Migration):
9
- dependencies = [
10
- ("sandwitches", "0002_historicalrecipe"),
11
- migrations.swappable_dependency(settings.AUTH_USER_MODEL),
12
- ]
13
-
14
- operations = [
15
- migrations.CreateModel(
16
- name="Rating",
17
- fields=[
18
- (
19
- "id",
20
- models.BigAutoField(
21
- auto_created=True,
22
- primary_key=True,
23
- serialize=False,
24
- verbose_name="ID",
25
- ),
26
- ),
27
- (
28
- "score",
29
- models.PositiveSmallIntegerField(
30
- choices=[(1, 1), (2, 2), (3, 3), (4, 4), (5, 5)]
31
- ),
32
- ),
33
- ("created_at", models.DateTimeField(auto_now_add=True)),
34
- ("updated_at", models.DateTimeField(auto_now=True)),
35
- (
36
- "recipe",
37
- models.ForeignKey(
38
- on_delete=django.db.models.deletion.CASCADE,
39
- related_name="ratings",
40
- to="sandwitches.recipe",
41
- ),
42
- ),
43
- (
44
- "user",
45
- models.ForeignKey(
46
- on_delete=django.db.models.deletion.CASCADE,
47
- related_name="ratings",
48
- to=settings.AUTH_USER_MODEL,
49
- ),
50
- ),
51
- ],
52
- options={
53
- "ordering": ("-updated_at",),
54
- "unique_together": {("recipe", "user")},
55
- },
56
- ),
57
- ]
@@ -1,25 +0,0 @@
1
- # Generated by ChatGPT — add uploaded_by to Recipe
2
- from django.conf import settings
3
- from django.db import migrations, models
4
- import django.db.models.deletion
5
-
6
-
7
- class Migration(migrations.Migration):
8
- dependencies = [
9
- ("sandwitches", "0003_rating"),
10
- migrations.swappable_dependency(settings.AUTH_USER_MODEL),
11
- ]
12
-
13
- operations = [
14
- migrations.AddField(
15
- model_name="recipe",
16
- name="uploaded_by",
17
- field=models.ForeignKey(
18
- blank=True,
19
- null=True,
20
- on_delete=django.db.models.deletion.SET_NULL,
21
- related_name="recipes",
22
- to=settings.AUTH_USER_MODEL,
23
- ),
24
- ),
25
- ]
@@ -1,27 +0,0 @@
1
- # Generated by Django 6.0 on 2025-12-28 18:36
2
-
3
- import django.db.models.deletion
4
- from django.conf import settings
5
- from django.db import migrations, models
6
-
7
-
8
- class Migration(migrations.Migration):
9
- dependencies = [
10
- ("sandwitches", "0004_add_uploaded_by"),
11
- migrations.swappable_dependency(settings.AUTH_USER_MODEL),
12
- ]
13
-
14
- operations = [
15
- migrations.AddField(
16
- model_name="historicalrecipe",
17
- name="uploaded_by",
18
- field=models.ForeignKey(
19
- blank=True,
20
- db_constraint=False,
21
- null=True,
22
- on_delete=django.db.models.deletion.DO_NOTHING,
23
- related_name="+",
24
- to=settings.AUTH_USER_MODEL,
25
- ),
26
- ),
27
- ]
@@ -1,48 +0,0 @@
1
- # Generated by Django 6.0 on 2025-12-29 17:38
2
-
3
- import django.db.models.deletion
4
- from django.conf import settings
5
- from django.db import migrations, models
6
-
7
-
8
- class Migration(migrations.Migration):
9
- dependencies = [
10
- ("sandwitches", "0005_historicalrecipe_uploaded_by"),
11
- migrations.swappable_dependency(settings.AUTH_USER_MODEL),
12
- ]
13
-
14
- operations = [
15
- migrations.CreateModel(
16
- name="Profile",
17
- fields=[
18
- (
19
- "id",
20
- models.BigAutoField(
21
- auto_created=True,
22
- primary_key=True,
23
- serialize=False,
24
- verbose_name="ID",
25
- ),
26
- ),
27
- (
28
- "avatar",
29
- models.ImageField(blank=True, null=True, upload_to="avatars"),
30
- ),
31
- ("bio", models.TextField(blank=True)),
32
- ("created_at", models.DateTimeField(auto_now_add=True)),
33
- ("updated_at", models.DateTimeField(auto_now=True)),
34
- (
35
- "user",
36
- models.OneToOneField(
37
- on_delete=django.db.models.deletion.CASCADE,
38
- related_name="profile",
39
- to=settings.AUTH_USER_MODEL,
40
- ),
41
- ),
42
- ],
43
- options={
44
- "verbose_name": "Profile",
45
- "verbose_name_plural": "Profiles",
46
- },
47
- ),
48
- ]
@@ -1,23 +0,0 @@
1
- # Generated by Django 6.0 on 2025-12-29 17:58
2
-
3
- import django.core.validators
4
- from django.db import migrations, models
5
-
6
-
7
- class Migration(migrations.Migration):
8
- dependencies = [
9
- ("sandwitches", "0006_profile"),
10
- ]
11
-
12
- operations = [
13
- migrations.AlterField(
14
- model_name="rating",
15
- name="score",
16
- field=models.FloatField(
17
- validators=[
18
- django.core.validators.MinValueValidator(0.0),
19
- django.core.validators.MaxValueValidator(10.0),
20
- ]
21
- ),
22
- ),
23
- ]
@@ -1,15 +0,0 @@
1
- # Generated by Django 6.0 on 2026-01-03 15:24
2
-
3
- from django.db import migrations
4
-
5
-
6
- class Migration(migrations.Migration):
7
- dependencies = [
8
- ("sandwitches", "0007_alter_rating_score"),
9
- ]
10
-
11
- operations = [
12
- migrations.DeleteModel(
13
- name="Profile",
14
- ),
15
- ]
@@ -1,260 +0,0 @@
1
- {% extends "base.html" %} {% load i18n static %} {% block extra_head %}
2
- <!-- Pico.css (CDN) -->
3
- <link
4
- rel="stylesheet"
5
- href="https://unpkg.com/@picocss/pico@1.*/css/pico.min.css"
6
- />
7
- <style>
8
- :root {
9
- --card-radius: 12px;
10
- --card-shadow-sm: 0 6px 18px rgba(15, 23, 42, 0.06);
11
- --card-shadow-lg: 0 18px 40px rgba(15, 23, 42, 0.12);
12
- --accent: #ff7a18;
13
- }
14
-
15
- /* responsive grid for cards */
16
- section.grid {
17
- display: grid;
18
- gap: 1.25rem;
19
- grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
20
- align-items: start;
21
- }
22
-
23
- /* unified card */
24
- article.card {
25
- background: var(--pico-card-background);
26
- border-radius: var(--card-radius);
27
- overflow: hidden;
28
- padding: 0.12rem 0.45rem;
29
- box-shadow: var(--card-shadow-sm);
30
- transition: transform 0.18s ease, box-shadow 0.18s ease;
31
- display: flex;
32
- flex-direction: column;
33
- border: 1px solid rgba(0, 0, 0, 0.04);
34
- }
35
- article.card:hover {
36
- transform: translateY(-8px);
37
- box-shadow: var(--card-shadow-lg);
38
- }
39
-
40
- /* image area on top */
41
- .recipe-figure {
42
- width: 100%;
43
- display: block;
44
- position: relative;
45
- background: #f6f6f6;
46
- flex: 0 0 auto;
47
- }
48
- .recipe-figure img {
49
- width: 100%;
50
- height: auto;
51
- object-fit: cover;
52
- display: block;
53
- }
54
-
55
- /* card body below image */
56
- .card-body {
57
- padding: 0.05rem 0.05rem;
58
- display: flex;
59
- flex-direction: column;
60
- gap: 0.4rem;
61
- min-height: 64px;
62
- flex: 1 1 auto;
63
- }
64
-
65
- .card-title,
66
- article header {
67
- margin: 0;
68
- font-size: 1.02rem;
69
- line-height: 1.2;
70
- font-weight: 600;
71
- color: inherit;
72
- word-break: break-word;
73
- }
74
-
75
- /* compact chips */
76
- .chip,
77
- .tag {
78
- display: inline-block;
79
- padding: 0.12rem 0.45rem;
80
- margin: 0 0.35rem 0.35rem 0;
81
- border-radius: 999px;
82
- font-size: 0.78rem;
83
- line-height: 1;
84
- white-space: nowrap;
85
- overflow: hidden;
86
- text-overflow: ellipsis;
87
- max-width: 9.5rem;
88
- vertical-align: middle;
89
- border: 1px solid rgba(0, 0, 0, 0.06);
90
- background: rgba(0, 0, 0, 0.03);
91
- color: rgba(0, 0, 0, 0.85);
92
- }
93
- .chip--accent {
94
- background: rgba(255, 122, 24, 0.09);
95
- color: var(--accent);
96
- border-color: rgba(255, 122, 24, 0.12);
97
- }
98
- .tags-row {
99
- display: flex;
100
- flex-wrap: wrap;
101
- gap: 0.15rem;
102
- align-items: center;
103
- }
104
-
105
- footer.card-footer,
106
- article.card footer {
107
- padding: 0.5rem 0.9rem;
108
- border-top: 1px solid rgba(0, 0, 0, 0.04);
109
- background: rgba(0, 0, 0, 0.01);
110
- display: flex;
111
- justify-content: flex-start;
112
- gap: 1rem;
113
- flex: 0 0 auto;
114
- }
115
-
116
- footer a {
117
- font-weight: 600;
118
- }
119
-
120
- @media (min-width: 900px) {
121
- .recipe-figure img {
122
- height: 200px;
123
- }
124
- }
125
- @media (min-width: 1200px) {
126
- .recipe-figure img {
127
- height: 220px;
128
- }
129
- }
130
- </style>
131
- <link rel="icon" type="image/svg+xml" href="{% static "icons/favicon.svg" %}">
132
- {% endblock %} {% block navbar %}
133
- <header class="container">
134
- <nav>
135
- <ul>
136
- <li>
137
- <a href="{% url 'index' %}"><strong>Sandwitches</strong></a>
138
- </li>
139
- </ul>
140
- <ul class="icons">
141
- <li>
142
- <a
143
- rel="noopener noreferrer"
144
- class="contrast"
145
- aria-label="GitHub repository"
146
- href="https://github.com/martynvdijke/sandwitches"
147
- target="_blank"
148
- ><svg
149
- xmlns="http://www.w3.org/2000/svg"
150
- height="24"
151
- width="24.25"
152
- viewBox="0 0 496 512"
153
- class="icon-github"
154
- >
155
- <path
156
- d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"
157
- ></path></svg
158
- ></a>
159
- </li>
160
- <li>
161
- <a
162
- href="#"
163
- id="theme-toggle"
164
- aria-label="Toggle theme"
165
- role="button"
166
- title="Toggle theme"
167
- >☀️</a
168
- >
169
- </li>
170
- </ul>
171
- <ul>
172
- <li>
173
- <form method="post" action="{% url 'set_language' %}">
174
- {% csrf_token %}
175
- <select name="language" onchange="this.form.submit()" aria-label="{% trans 'Language' %}">
176
- {% get_current_language as LANGUAGE_CODE %}
177
- {% get_available_languages as LANGUAGES %}
178
- {% for code,name in LANGUAGES %}
179
- <option value="{{ code }}"{% if code == LANGUAGE_CODE %} selected{% endif %}>{{ name }}</option>
180
- {% endfor %}
181
- </select>
182
- <input type="hidden" name="next" value="{{ request.get_full_path }}" />
183
- </form>
184
- </li>
185
- <li><a href="api/docs">{% trans "Docs" %}</a></li>
186
- {% if user.is_authenticated %}
187
- <li><a href="{% url 'admin:index' %}">{% trans "Admin" %}</a></li>
188
- <li><a href="{% url 'admin:logout' %}">{% trans "Logout" %}</a></li>
189
- {% else %}
190
- <li><a href="{% url 'admin:login' %}">{% trans "Login" %}</a></li>
191
- <li><a href="{% url 'signup' %}">{% trans "Sign up" %}</a></li>
192
- {% endif %}
193
- </ul>
194
- </nav>
195
- </header>
196
-
197
- <script>
198
- // Simple toggle-style theme switcher (stores choice in localStorage)
199
- const themeSwitcher = {
200
- localStorageKey: "picoPreferredColorScheme",
201
- buttonSelector: "#theme-toggle",
202
- rootAttribute: "data-theme",
203
- init() {
204
- // read saved choice, fallback to system preference
205
- const saved = window.localStorage?.getItem(this.localStorageKey);
206
- this._scheme =
207
- saved ??
208
- (window.matchMedia &&
209
- window.matchMedia("(prefers-color-scheme: dark)").matches
210
- ? "dark"
211
- : "light");
212
- this.applyScheme();
213
- this.initButton();
214
- },
215
- initButton() {
216
- const btn = document.querySelector(this.buttonSelector);
217
- if (!btn) return;
218
- this.updateButton(btn);
219
- btn.addEventListener("click", (e) => {
220
- e.preventDefault();
221
- this.toggle();
222
- this.updateButton(btn);
223
- });
224
- // react to storage changes from other tabs
225
- window.addEventListener("storage", (ev) => {
226
- if (ev.key === this.localStorageKey) {
227
- this._scheme =
228
- ev.newValue ||
229
- (window.matchMedia &&
230
- window.matchMedia("(prefers-color-scheme: dark)").matches
231
- ? "dark"
232
- : "light");
233
- this.applyScheme();
234
- this.updateButton(document.querySelector(this.buttonSelector));
235
- }
236
- });
237
- },
238
- toggle() {
239
- this._scheme = this._scheme === "dark" ? "light" : "dark";
240
- this.applyScheme();
241
- window.localStorage?.setItem(this.localStorageKey, this._scheme);
242
- },
243
- applyScheme() {
244
- document.documentElement?.setAttribute(this.rootAttribute, this._scheme);
245
- },
246
- updateButton(btn) {
247
- if (!btn) return;
248
- btn.textContent = this._scheme === "dark" ? "🌙" : "☀️";
249
- btn.title =
250
- this._scheme === "dark" ? "Switch to light" : "Switch to dark";
251
- btn.setAttribute(
252
- "aria-pressed",
253
- this._scheme === "dark" ? "true" : "false"
254
- );
255
- },
256
- };
257
- themeSwitcher.init();
258
- </script>
259
- {% endblock %} {% block extra_scripts %} {% block page_scripts %}{% endblock %}
260
- {% endblock %}
@@ -1,16 +0,0 @@
1
- <!DOCTYPE html>
2
- <html>
3
- <head>
4
- <meta charset="utf-8" />
5
- <title>{% trans "Edit" %}</title>
6
- </head>
7
- <body>
8
- {% load i18n %}
9
- <h1>{% trans "Edit Recipe:" %} {{ recipe.title }}</h1>
10
- <form method="post" enctype="multipart/form-data">
11
- {% csrf_token %} {{ form.as_p }}
12
- <button type="submit">{% trans "Save" %}</button>
13
- <a href="{% url 'recipes:admin_list' %}">{% trans "Cancel" %}</a>
14
- </form>
15
- </body>
16
- </html>
@@ -1,25 +0,0 @@
1
- Metadata-Version: 2.3
2
- Name: sandwitches
3
- Version: 1.4.2
4
- Summary: Add your description here
5
- Author: Martyn van Dijke
6
- Author-email: Martyn van Dijke <martijnvdijke600@gmail.com>
7
- Requires-Dist: django-debug-toolbar>=6.1.0
8
- Requires-Dist: django-filter>=25.2
9
- Requires-Dist: django-imagekit>=6.0.0
10
- Requires-Dist: django-import-export>=4.3.14
11
- Requires-Dist: django-ninja>=1.5.1
12
- Requires-Dist: django-simple-history>=3.10.1
13
- Requires-Dist: django-tasks>=0.10.0
14
- Requires-Dist: django>=6.0.0
15
- Requires-Dist: gunicorn>=23.0.0
16
- Requires-Dist: markdown>=3.10
17
- Requires-Dist: pillow>=12.0.0
18
- Requires-Dist: uvicorn>=0.40.0
19
- Requires-Dist: whitenoise[brotli]>=6.11.0
20
- Requires-Python: >=3.12
21
- Description-Content-Type: text/markdown
22
-
23
- # broodjes.vandijke.xyz
24
-
25
- Website files for broodjes.vandijke.xyz
@@ -1,35 +0,0 @@
1
- sandwitches/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- sandwitches/admin.py,sha256=modm8vYd0CPainUUR5k0dxeO6vUu2GQuTT2kYhGeP5M,1399
3
- sandwitches/api.py,sha256=YDadi-3f2Oz4ia5gXo_rgXVZkZ6LAOiOWraz9bpZzho,2404
4
- sandwitches/asgi.py,sha256=cygnXdXSSVspM7ZXuj47Ef6oz7HSTw4D7BPzgE2PU5w,399
5
- sandwitches/forms.py,sha256=kYzotFafLyNli4a62PsL5hTqUXyno5jPqIwSv04vYaA,2749
6
- sandwitches/locale/nl/LC_MESSAGES/django.mo,sha256=VdPE_fBnGxHPtizXpYA6E3RtduAoaVOtKTfQIgTa0yM,6934
7
- sandwitches/locale/nl/LC_MESSAGES/django.po,sha256=8tJzlyUxyTZkyGQWSpxNU-uYhiFpPPzphiiPewUsZ3o,10303
8
- sandwitches/migrations/0001_initial.py,sha256=01IfkFbUyYMpTHV5GaBxJEKjzRIdUdPR5sY3AUTODww,2546
9
- sandwitches/migrations/0002_historicalrecipe.py,sha256=yU2KYssfjYhPXRYN6C8IMRFr-4QUGJozz-O167XuabM,2499
10
- sandwitches/migrations/0003_rating.py,sha256=iKk9M9lcBS5LwsJkMYsmYfHKqKs2QRTILgINbnilASM,1857
11
- sandwitches/migrations/0004_add_uploaded_by.py,sha256=gZawakGU-H0Abnn2Bw_Mswy9ngipzUC-BHRXRByKVZo,720
12
- sandwitches/migrations/0005_historicalrecipe_uploaded_by.py,sha256=xmYDXgBxjrQkbEtorQlDzW0K1Z70UNxRrUk75WjYdEI,766
13
- sandwitches/migrations/0006_profile.py,sha256=gzmxZWXmjldimYRdovuNouc2Y2idihg8UvEaU0ad_Ds,1558
14
- sandwitches/migrations/0007_alter_rating_score.py,sha256=hHdJqjTwq2afcBi7TRSBofAjedDxu5YybbXLhUoMGUg,588
15
- sandwitches/migrations/0008_delete_profile.py,sha256=-vO3WqftSpDBic4Kx5HygmOhVtGEp60cihtv2TVpsWg,297
16
- sandwitches/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
17
- sandwitches/models.py,sha256=QWjaO7ONT_vsvEt_jJHJ6glUKtASC1ac_osIadhwbYM,5766
18
- sandwitches/settings.py,sha256=hSwtZ_OSvwl8QIMs6wnNMLGvMrPADrQt1Swc5xOOcCg,5701
19
- sandwitches/storage.py,sha256=HIiOEDa_LhpsbhCUBNO-SlCZDUJOoANUbyDIbspEcoE,2325
20
- sandwitches/tasks.py,sha256=8jHQougtywhsDyd-6W4VV-x5PCwwhNG3J99E0hzy_MA,3660
21
- sandwitches/templates/base.html,sha256=C9tUPfMKRvvdMqdDpE8ww21DH25bNktcVIwdrDEhajw,570
22
- sandwitches/templates/base_pico.html,sha256=yeWlWlrCfI9yVLStSyODvcNtSmxXvWm4SZORZN-31R4,8273
23
- sandwitches/templates/detail.html,sha256=arspmECgF-EuNDOv1shtIlj41oJE1V_tjbn-B8jjO5s,4653
24
- sandwitches/templates/form.html,sha256=S4yUq9p2v7vWifhA5xj_Z4ObpMoaqUq2w08TDw3vk0o,449
25
- sandwitches/templates/index.html,sha256=tgZFplcedG1r4s8pBc_qvJDXECPqrESPOSw56FnnCkw,2606
26
- sandwitches/templates/setup.html,sha256=yv9mBAPCa_XGsa92Q43pWqB-T6SJKPHKz6qnAEz0-5c,1871
27
- sandwitches/templates/signup.html,sha256=3qOdDMUHMshe2FoaQzR07lIm3Wbrzorb_h9Fp8Og-Eg,1585
28
- sandwitches/templatetags/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
29
- sandwitches/templatetags/markdown_extras.py,sha256=0ibmRzxE3r85x4k7kK71R-9UT0CgeegYF7MHzj3juTI,344
30
- sandwitches/urls.py,sha256=maKaIDfb_kNmMwrpS495TymuFnJJ6fbLoi5QRLjrFds,1582
31
- sandwitches/views.py,sha256=7ukWJHBflhAM02j_ZGuoqlBEgN2QnIIq4VhtnvRU1rM,5194
32
- sandwitches/wsgi.py,sha256=Eyncpnahq_4s3Lr9ruB-R3Lu9j9zBXqgPbUj7qhIbwU,399
33
- sandwitches-1.4.2.dist-info/WHEEL,sha256=eh7sammvW2TypMMMGKgsM83HyA_3qQ5Lgg3ynoecH3M,79
34
- sandwitches-1.4.2.dist-info/METADATA,sha256=p_b9GRyDSmtPb8WCFGs1pzj1vxBPyk1o9idnldR6NfQ,775
35
- sandwitches-1.4.2.dist-info/RECORD,,