fnschool 20251018.80430.821__py3-none-any.whl → 20251019.81526.808__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 (22) hide show
  1. fnschoo1/__init__.py +1 -1
  2. fnschoo1/canteen/forms.py +1 -1
  3. fnschoo1/canteen/migrations/0017_ingredient_updated_at_alter_category_created_at_and_more.py +30 -0
  4. fnschoo1/canteen/models.py +9 -2
  5. fnschoo1/canteen/templates/canteen/consumption/create.html +5 -4
  6. fnschoo1/canteen/templates/canteen/ingredient/list.html +101 -69
  7. fnschoo1/canteen/views.py +51 -2
  8. fnschoo1/canteen/workbook/generate.py +4 -4
  9. fnschoo1/fnschool/settings.py +2 -1
  10. fnschoo1/static/css/fnschool.css +6 -0
  11. fnschoo1/static/js/fnschool.js +24 -0
  12. {fnschool-20251018.80430.821.dist-info → fnschool-20251019.81526.808.dist-info}/METADATA +1 -1
  13. {fnschool-20251018.80430.821.dist-info → fnschool-20251019.81526.808.dist-info}/RECORD +22 -21
  14. {fnschool-20251018.80430.821.dist-info → fnschool-20251019.81526.808.dist-info}/SOURCES.txt.py +0 -0
  15. {fnschool-20251018.80430.821.dist-info → fnschool-20251019.81526.808.dist-info}/WHEEL +0 -0
  16. {fnschool-20251018.80430.821.dist-info → fnschool-20251019.81526.808.dist-info}/dependency_links.txt.py +0 -0
  17. {fnschool-20251018.80430.821.dist-info → fnschool-20251019.81526.808.dist-info}/entry_points.txt +0 -0
  18. {fnschool-20251018.80430.821.dist-info → fnschool-20251019.81526.808.dist-info}/entry_points.txt.py +0 -0
  19. {fnschool-20251018.80430.821.dist-info → fnschool-20251019.81526.808.dist-info}/licenses/LICENSE +0 -0
  20. {fnschool-20251018.80430.821.dist-info → fnschool-20251019.81526.808.dist-info}/requires.txt.py +0 -0
  21. {fnschool-20251018.80430.821.dist-info → fnschool-20251019.81526.808.dist-info}/top_level.txt +0 -0
  22. {fnschool-20251018.80430.821.dist-info → fnschool-20251019.81526.808.dist-info}/top_level.txt.py +0 -0
fnschoo1/__init__.py CHANGED
@@ -6,4 +6,4 @@ import random
6
6
  import sys
7
7
  from pathlib import Path
8
8
 
9
- __version__ = "20251018.80430.821"
9
+ __version__ = "20251019.81526.808"
fnschoo1/canteen/forms.py CHANGED
@@ -20,7 +20,7 @@ class IngredientForm(forms.ModelForm):
20
20
  fields = [
21
21
  f.name
22
22
  for f in Ingredient._meta.fields
23
- if f.name not in ["id", "user"]
23
+ if f.name not in ["id", "user", "updated_at"]
24
24
  ]
25
25
 
26
26
  current_year = date.today().year
@@ -0,0 +1,30 @@
1
+ # Generated by Django 4.2.25 on 2025-10-19 02:03
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ("canteen", "0016_consumption_unique_ingredient_date_of_using"),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AddField(
14
+ model_name="ingredient",
15
+ name="updated_at",
16
+ field=models.DateTimeField(
17
+ auto_now=True, null=True, verbose_name="Time of updating"
18
+ ),
19
+ ),
20
+ migrations.AlterField(
21
+ model_name="category",
22
+ name="created_at",
23
+ field=models.DateTimeField(null=True, verbose_name="创建日期"),
24
+ ),
25
+ migrations.AlterField(
26
+ model_name="mealtype",
27
+ name="created_at",
28
+ field=models.DateTimeField(null=True, verbose_name="创建日期"),
29
+ ),
30
+ ]
@@ -21,7 +21,9 @@ class MealType(models.Model):
21
21
  abbreviation = models.CharField(
22
22
  null=True, blank=True, max_length=100, verbose_name=_("Abbreviation")
23
23
  )
24
- created_at = models.DateField(verbose_name=_("Creating Date"))
24
+ created_at = models.DateTimeField(
25
+ null=True, verbose_name=_("Creating Date")
26
+ )
25
27
  is_disabled = models.BooleanField(
26
28
  default=False, verbose_name=_("Is Disabled")
27
29
  )
@@ -41,7 +43,9 @@ class Category(models.Model):
41
43
  abbreviation = models.CharField(
42
44
  null=True, blank=True, max_length=100, verbose_name=_("abbreviation")
43
45
  )
44
- created_at = models.DateField(verbose_name=_("Creating Date"))
46
+ created_at = models.DateTimeField(
47
+ null=True, verbose_name=_("Creating Date")
48
+ )
45
49
  is_disabled = models.BooleanField(
46
50
  default=False, verbose_name=_("Is Disabled")
47
51
  )
@@ -74,6 +78,9 @@ class Ingredient(models.Model):
74
78
  verbose_name=_("User"),
75
79
  )
76
80
  storage_date = models.DateField(verbose_name=_("Storage Date"))
81
+ updated_at = models.DateTimeField(
82
+ null=True, auto_now=True, verbose_name=_("Time of updating")
83
+ )
77
84
  name = models.CharField(max_length=100, verbose_name=_("Ingredient Name"))
78
85
  meal_type = models.ForeignKey(
79
86
  MealType,
@@ -42,7 +42,7 @@
42
42
  onclick="list_consumptions();">{% trans "Refresh" %}</button>
43
43
  </div>
44
44
  </div>
45
- <div class="table table-responsive table-container">
45
+ <div class="table-responsive table-container">
46
46
  <table class="table table-consumptions cotable-bordered table-striped table-hover table-condensed scroll-vertical ">
47
47
  <thead>
48
48
  <tr>
@@ -97,7 +97,8 @@
97
97
  </table>
98
98
  </div>
99
99
  <div class="">
100
- <button onclick="generate_spreadsheet();"
100
+ <button id="generate_spreadsheet_btn"
101
+ onclick="generate_spreadsheet();"
101
102
  class="btn btn-submit-consumptions btn-success float-end">
102
103
  {% trans "Generate Spreadsheet" %}
103
104
  </button>
@@ -405,11 +406,11 @@
405
406
  }
406
407
 
407
408
  function set_consumptions_table_size() {
408
- const submit_consumptions_btn = $(".btn-submit-consumptions")
409
+ const generate_spreadsheet_btn = $("#generate_spreadsheet_btn")
409
410
  const consumptions_table = $(".table-consumptions")
410
411
  const header = $("header")
411
412
  const footer = $("footer")
412
- const height = Math.round((footer.offset().top - submit_consumptions_btn.height() - consumptions_table.offset().top) * 0.95)
413
+ const height = Math.round((footer.offset().top - generate_spreadsheet_btn.height() - consumptions_table.offset().top) * 0.95)
413
414
  consumptions_table.parent().height(height)
414
415
  }
415
416
  $(window).resize(function() {
@@ -1,4 +1,5 @@
1
1
  {% extends "base/header_content_footer.html" %}
2
+ {% load tz %}
2
3
  {% load crispy_forms_tags %}
3
4
  {% block title %}
4
5
  {% trans "Ingredient List" %}
@@ -34,77 +35,97 @@
34
35
  onclick="open_small_window('{% url 'canteen:create_ingredient' %}')">{% trans "Add one" %}</a>
35
36
  </div>
36
37
  <hr />
37
- <table class="table table-bordered table-striped table-hover table-condensed">
38
- <thead>
39
- <tr>
40
- <th scope="col">#</th>
41
- {% for name,sort, header in headers %}
42
- <th scope="col"
43
- data-sort="sort_{{ name }} {{ sort }}"
44
- onclick="sort_ingredients(this.dataset.sort);">
45
- {{ header }}
46
- {% if sort == "+" %}
47
- &#8593;
48
- {% elif sort == "-" %}
49
- &#8595;
50
- {% endif %}
51
- </th>
52
- {% endfor %}
53
- <th scope="col"></th>
54
- </tr>
55
- </thead>
56
- <tbody>
57
- {% for ingredient in page_obj %}
58
- <tr>
59
- <th scope="row">
60
- <div class="form-check"
61
- title="{% trans 'It helps you check the ingredients.' %}">
62
- <input type="checkbox"
63
- class="form-check-input"
64
- id="ingredient_free_nark_{{ ingredient.id }}" />
65
- <label class="form-check-label"
66
- for="ingredient_free_nark_{{ ingredient.id }}">
67
- {{ forloop.counter }}
68
- </label>
69
- </div>
70
- </th>
71
- <td>{{ ingredient.storage_date }}</td>
72
- <td>{{ ingredient.name }}</td>
73
- <td>{{ ingredient.meal_type }}</td>
74
- <td>{{ ingredient.category }}</td>
75
- <td>{{ ingredient.quantity }}</td>
76
- <td>{{ ingredient.quantity_unit_name }}</td>
77
- <td>{{ ingredient.total_price }}</td>
78
- <td>
79
- {% if ingredient.is_ignorable %}
80
- {% trans "Yes" %}
81
- {% endif %}
82
- </td>
83
- <td>
84
- {% if ingredient.is_disabled %}
85
- {% trans "Yes" %}
86
- {% endif %}
87
- </td>
88
- <td class="">
89
- <a class=""
90
- target="_blank"
91
- onclick="open_small_window('{% url 'canteen:edit_ingredient' ingredient.id %}'); return false;">
92
- {% trans "Edit" %}
93
- </a>
94
- |
95
- <a class="text-danger"
96
- target="_blank"
97
- onclick="open_small_window('{% url 'canteen:delete_ingredient' ingredient.id %}'); return false;">
98
- {% trans "Delete" %}
99
- </a>
100
- </td>
101
- </tr>
102
- {% empty %}
103
- {% endfor %}
104
- </tbody>
105
- </table>
38
+ <div class="container">
39
+ <div class="table-responsive-lg table-container">
40
+ <table class="table table-bordered table-ingredient table-striped table-hover table-condensed">
41
+ <thead>
42
+ <tr>
43
+ <th scope="col">#</th>
44
+ {% for name,sort, header in headers %}
45
+ <th scope="col"
46
+ data-sort="sort_{{ name }} {{ sort }}"
47
+ onclick="sort_ingredients(this.dataset.sort);">
48
+ {{ header }}
49
+ {% if sort == "+" %}
50
+ &#8593;
51
+ {% elif sort == "-" %}
52
+ &#8595;
53
+ {% endif %}
54
+ </th>
55
+ {% endfor %}
56
+ <th scope="col"></th>
57
+ </tr>
58
+ </thead>
59
+ <tbody>
60
+ {% for ingredient in page_obj %}
61
+ <tr class="tr-ingredient"
62
+ data-ingredient_updated_at="{{ ingredient.updated_at|localtime|date:'Y/m/d H:i:s' }}"
63
+ data-ingredient_storage_date="{{ ingredient.storage_date|localtime|date:'Y/m/d' }}">
64
+ <th scope="row">
65
+ <div class="form-check"
66
+ title="{% trans 'It helps you check the ingredients.' %}">
67
+ <input type="checkbox"
68
+ class="form-check-input"
69
+ id="ingredient_free_nark_{{ ingredient.id }}" />
70
+ <label class="form-check-label"
71
+ for="ingredient_free_nark_{{ ingredient.id }}">
72
+ {{ forloop.counter }}
73
+ </label>
74
+ </div>
75
+ </th>
76
+ <td>{{ ingredient.storage_date }}</td>
77
+ <td>{{ ingredient.name }}</td>
78
+ <td>{{ ingredient.meal_type }}</td>
79
+ <td>{{ ingredient.category }}</td>
80
+ <td>{{ ingredient.quantity }}</td>
81
+ <td>{{ ingredient.quantity_unit_name }}</td>
82
+ <td>{{ ingredient.total_price }}</td>
83
+ <td>
84
+ {% if ingredient.is_ignorable %}
85
+ {% trans "Yes" %}
86
+ {% endif %}
87
+ </td>
88
+ <td>
89
+ {% if ingredient.is_disabled %}
90
+ {% trans "Yes" %}
91
+ {% endif %}
92
+ </td>
93
+ <td class="">
94
+ <a class=""
95
+ target="_blank"
96
+ onclick="open_small_window('{% url 'canteen:edit_ingredient' ingredient.id %}'); return false;">
97
+ {% trans "Edit" %}
98
+ </a>
99
+ |
100
+ <a class="text-danger"
101
+ target="_blank"
102
+ onclick="open_small_window('{% url 'canteen:delete_ingredient' ingredient.id %}'); return false;">
103
+ {% trans "Delete" %}
104
+ </a>
105
+ </td>
106
+ </tr>
107
+ {% empty %}
108
+ {% endfor %}
109
+ </tbody>
110
+ </table>
111
+ </div>
112
+ </div>
106
113
  {% include 'includes/_paginator.html' %}
107
114
  <script>
115
+ $(document).ready(function() {
116
+ var ingredient_table = $('.table-ingredient')
117
+ var pagination = $('.pagination')
118
+ var footer = $("footer")
119
+ var height = Math.round((footer.offset().top - pagination.height() - ingredient_table.offset().top) * 0.98)
120
+ ingredient_table.parent().height(
121
+ height
122
+ );
123
+ });
124
+ $(document).ready(
125
+ function() {
126
+ make_highlight(".tr-ingredient", "ingredient_updated_at")
127
+ });
128
+
108
129
  function clear_q() {
109
130
  update_href({
110
131
  "q": ""
@@ -136,4 +157,15 @@
136
157
  update_href(i_sort);
137
158
  }
138
159
  </script>
160
+ <style>
161
+ .table-container {
162
+ overflow: auto;
163
+ }
164
+
165
+ .table-container thead th {
166
+ position: sticky;
167
+ top: 0;
168
+ }
169
+ </style>
170
+
139
171
  {% endblock %}
fnschoo1/canteen/views.py CHANGED
@@ -395,7 +395,31 @@ def edit_ingredient(request, ingredient_id):
395
395
  ingredient = get_object_or_404(Ingredient, pk=ingredient_id)
396
396
 
397
397
  if request.method == "POST":
398
+
398
399
  form = IngredientForm(request.POST, instance=ingredient)
400
+
401
+ total_price = form.instance.total_price
402
+ quantity = form.instance.quantity
403
+
404
+ [total_price0, quantity0], [total_price1, quantity1] = split_price(
405
+ total_price, quantity
406
+ )
407
+
408
+ if total_price1:
409
+ unit_price_error_msg = _(
410
+ "The unit pricei ({unit_price}) has more than 3 decimal places and cannot be saved. Please modify it again."
411
+ ).format(
412
+ unit_price=(
413
+ Decimal(str(total_price)) / Decimal(str(float(quantity)))
414
+ ).normalize()
415
+ )
416
+ form.add_error("total_price", unit_price_error_msg)
417
+ form.add_error("quantity", unit_price_error_msg)
418
+ return render(
419
+ request, "canteen/ingredient/update.html", {"form": form}
420
+ )
421
+
422
+ form.instance.user = request.user
399
423
  if form.is_valid():
400
424
  form.save()
401
425
  return render(
@@ -413,9 +437,10 @@ def list_ingredients(request):
413
437
  search_query = request.GET.get("q", "")
414
438
  search_query_cp = search_query
415
439
  fields = [
416
- f for f in Ingredient._meta.fields if f.name not in ["id", "user"]
440
+ f
441
+ for f in Ingredient._meta.fields
442
+ if f.name in IngredientForm._meta.fields
417
443
  ]
418
-
419
444
  if search_query:
420
445
  queries = Q(user=request.user)
421
446
 
@@ -846,6 +871,30 @@ class IngredientCreateView(LoginRequiredMixin, CreateView):
846
871
 
847
872
  def form_valid(self, form):
848
873
  form.instance.user = self.request.user
874
+ total_price = form.instance.total_price
875
+ quantity = form.instance.quantity
876
+
877
+ [total_price0, quantity0], [total_price1, quantity1] = split_price(
878
+ total_price, quantity
879
+ )
880
+
881
+ if form.is_valid() and total_price1:
882
+ Ingredient.objects.create(
883
+ user=form.instance.user,
884
+ storage_date=form.instance.storage_date,
885
+ name=form.instance.name + _("(2)"),
886
+ meal_type=form.instance.meal_type,
887
+ category=form.instance.category,
888
+ quantity=quantity1,
889
+ total_price=total_price1,
890
+ quantity_unit_name=form.instance.quantity_unit_name,
891
+ is_ignorable=form.instance.is_ignorable,
892
+ )
893
+ form.instance.name = form.instance.name + _("(1)")
894
+
895
+ form.instance.total_price = total_price0
896
+ form.instance.quantity = quantity0
897
+
849
898
  return super().form_valid(form)
850
899
 
851
900
 
@@ -2417,16 +2417,16 @@ class CanteenWorkBook:
2417
2417
 
2418
2418
  sheet.cell(
2419
2419
  month_surplus_header_row_num,
2420
- 4,
2420
+ 10,
2421
2421
  remaining_quantity_last_month,
2422
2422
  )
2423
2423
  sheet.cell(
2424
2424
  month_surplus_header_row_num,
2425
- 6,
2425
+ 12,
2426
2426
  remaining_total_price_last_month,
2427
2427
  )
2428
2428
  sheet.cell(
2429
- month_surplus_header_row_num, 5, unit_price.normalize()
2429
+ month_surplus_header_row_num, 11, unit_price.normalize()
2430
2430
  )
2431
2431
 
2432
2432
  month_ingredients = []
@@ -2680,7 +2680,7 @@ class CanteenWorkBook:
2680
2680
  self.fill_in_consumption_sheet()
2681
2681
  self.fill_in_consumption_list_sheet()
2682
2682
  self.fill_in_surplus_sheet()
2683
- if self.request.GET.get("include_food_sheets") == "true":
2683
+ if self.request.GET.get("include_food_sheets", "") == "true":
2684
2684
  self.fill_in_food_sheets()
2685
2685
 
2686
2686
  return self.wb
@@ -126,7 +126,8 @@ AUTH_PASSWORD_VALIDATORS = [
126
126
  # Internationalization
127
127
  # https://docs.djangoproject.com/en/4.2/topics/i18n/
128
128
 
129
- TIME_ZONE = "UTC"
129
+ USE_TZ = True
130
+ TIME_ZONE = "Asia/Shanghai"
130
131
 
131
132
  USE_I18N = True
132
133
  USE_L10N = True
@@ -1,3 +1,7 @@
1
+ .fn-highlight > td {
2
+ color: #00adff;
3
+ }
4
+
1
5
  main {
2
6
  padding-top: 60px;
3
7
  padding-bottom: 120px;
@@ -24,3 +28,5 @@ main {
24
28
  padding: 1rem;
25
29
  display: none;
26
30
  }
31
+
32
+ /* The end. */
@@ -1,3 +1,25 @@
1
+ function make_highlight(query, time_data) {
2
+ var highlight_elements = $(query)
3
+ var highlight_elements_toggled = []
4
+ highlight_elements.each(function (index, element) {
5
+ var element = $(element)
6
+ var time_value = element.data(time_data)
7
+ var seconds_diff = Math.floor((new Date() - new Date(time_value)) / 1000)
8
+ if (seconds_diff < 46) {
9
+ highlight_elements_toggled.push(element)
10
+ element.toggleClass('fn-highlight')
11
+ $('html,body').animate({ scrollTop: element.offset().top }, 1)
12
+ }
13
+ })
14
+
15
+ setTimeout(function () {
16
+ $(highlight_elements_toggled).each(function (index, element) {
17
+ element = $(element)
18
+ element.toggleClass('fn-highlight')
19
+ })
20
+ }, 10 * 1000)
21
+ }
22
+
1
23
  function get_cookie(name) {
2
24
  const cookies = document.cookie.split(';')
3
25
  for (const cookie of cookies) {
@@ -89,3 +111,5 @@ $(document).ready(function () {
89
111
  function set_page(num) {
90
112
  update_href({ page: num })
91
113
  }
114
+
115
+ // The end.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fnschool
3
- Version: 20251018.80430.821
3
+ Version: 20251019.81526.808
4
4
  Summary: Just some school related scripts, without any ambition.
5
5
  Author-email: larryw3i <larryw3i@163.com>, Larry Wei <larryw3i@126.com>, Larry W3i <larryw3i@yeah.net>
6
6
  Maintainer-email: larryw3i <larryw3i@163.com>, Larry Wei <larryw3i@126.com>
@@ -1,13 +1,13 @@
1
- fnschoo1/__init__.py,sha256=Pi_r5hmFJR0XScaHz6S3PM59J9kzXP8DDGlLmoPa97o,197
1
+ fnschoo1/__init__.py,sha256=3uZNnXdN943uWbtfJhdf4iLpV-akwekm2ysAMBUoD-0,197
2
2
  fnschoo1/manage.py,sha256=VZIol9q_Dhg81_KJ9Jfq-L5O8ubQelShkA-cZVJ1S6E,1539
3
3
  fnschoo1/canteen/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
4
  fnschoo1/canteen/admin.py,sha256=suMo4x8I3JBxAFBVIdE-5qnqZ6JAZV0FESABHOSc-vg,63
5
5
  fnschoo1/canteen/apps.py,sha256=zUjM0ZJwHW4i72vOm87QewRlvFQORQo5yb053u4YIGs,146
6
- fnschoo1/canteen/forms.py,sha256=PDPAzZZ_y533KtMxCixLXXsXok5gjUShCSXeonYgGqQ,2582
7
- fnschoo1/canteen/models.py,sha256=wvlmLzY2X7ez2hbCDkjxYCO3O12oJKuuIZyS1rXERgQ,6034
6
+ fnschoo1/canteen/forms.py,sha256=JaN6SX9KIrJeUKRfTMf6bA0Op3mEGCc6xqUE6yWC8TU,2596
7
+ fnschoo1/canteen/models.py,sha256=gk3Lk8Li6P7YlYU2yAQeI7WVG8Jm8jxRgI2uyYJwbBA,6206
8
8
  fnschoo1/canteen/tests.py,sha256=mrbGGRNg5jwbTJtWWa7zSKdDyeB4vmgZCRc2nk6VY-g,60
9
9
  fnschoo1/canteen/urls.py,sha256=4GtrqC9L59c8zopfjRgqhbcvA5iPnGcAUVuM6CrKWpk,2797
10
- fnschoo1/canteen/views.py,sha256=S7ByVMcbmpisH50mF38YaeEUYSIuK15z-vwqvFiKRM8,27368
10
+ fnschoo1/canteen/views.py,sha256=9qsNiCM4sUEUpV_8g874msSamrp-dqTb5mdUtyWvZmQ,29171
11
11
  fnschoo1/canteen/migrations/0001_initial.py,sha256=IHlyfT9sNc-kRQZy7NyjgWzp4EGus405QCAUw4oNdAQ,3943
12
12
  fnschoo1/canteen/migrations/0002_ingredient_is_disabled.py,sha256=j8oGWb2b99YwsEk-uwESLA_JRITEcz6b35ekoYOUGGc,444
13
13
  fnschoo1/canteen/migrations/0003_consumption_is_disabled_alter_ingredient_is_disabled.py,sha256=9RB5SHjINgrrqtDpcVIUXEBa3C_MTcR_keXLGG_PcOs,619
@@ -24,6 +24,7 @@ fnschoo1/canteen/migrations/0013_alter_consumption_options_alter_ingredient_opti
24
24
  fnschoo1/canteen/migrations/0014_category_priority.py,sha256=AywjPQhwtwm8xttEEOGQ3yyQ8j890hL5J-wCUNEwbkE,677
25
25
  fnschoo1/canteen/migrations/0015_alter_category_options_alter_category_priority.py,sha256=l8WVVTaDDbB3-xBMdU402gsQo3mhfeUUEcIp_hYVEPk,720
26
26
  fnschoo1/canteen/migrations/0016_consumption_unique_ingredient_date_of_using.py,sha256=kiNr4ISVoy99U7LuJMItJYtNyE4BPYR_jSdnKoXxWt4,520
27
+ fnschoo1/canteen/migrations/0017_ingredient_updated_at_alter_category_created_at_and_more.py,sha256=fvbJV9uf8lUrqASwPO2EsyW3ApXkFk4zBE1vlT2UV0o,872
27
28
  fnschoo1/canteen/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
28
29
  fnschoo1/canteen/templates/canteen/close.html,sha256=pLYeJmGaOEJKMUJdZmYzz_n--l28IRDQ4fXvetP_Vsc,200
29
30
  fnschoo1/canteen/templates/canteen/category/create.html,sha256=T33zbHRYUrWlLYSLAYZ14Y03Gw2tGMoYzBWUVv-I8pk,609
@@ -31,22 +32,22 @@ fnschoo1/canteen/templates/canteen/category/delete.html,sha256=iPmGAB2r8K9DqBTp9
31
32
  fnschoo1/canteen/templates/canteen/category/list.html,sha256=QLO2GA13Co48Ijd0DCCN4lcMm1fgJqT2CprH5VdLZPw,2148
32
33
  fnschoo1/canteen/templates/canteen/category/update.html,sha256=UnCI95eqsQXfdUMdJXWUf1qNVWM9ZgsP03ayZ_Nrak8,831
33
34
  fnschoo1/canteen/templates/canteen/consumption/_create.html,sha256=tXlJcd566D9sYbsnj5KN-m0lyobT2AwwYt9oxUHbn4M,1026
34
- fnschoo1/canteen/templates/canteen/consumption/create.html,sha256=Wy30E3bnOcP7D1LdqtZhp6WUCuJfuCiUmmSmlj6HhGQ,16707
35
+ fnschoo1/canteen/templates/canteen/consumption/create.html,sha256=LSxyYQZfQLAekD84AQaJp_JRYge8I4IBF7DkTGLIGEI,16744
35
36
  fnschoo1/canteen/templates/canteen/ingredient/close.html,sha256=pLYeJmGaOEJKMUJdZmYzz_n--l28IRDQ4fXvetP_Vsc,200
36
37
  fnschoo1/canteen/templates/canteen/ingredient/create.html,sha256=i4ajPDpXBTUp08lIiwn0wZoNEohyXlX3G64zG1lmIcs,839
37
38
  fnschoo1/canteen/templates/canteen/ingredient/create_one.html,sha256=y9EAKXmyIrlp5-DxHd86l1rMtB16KuOjPMbPiLAN_ag,615
38
39
  fnschoo1/canteen/templates/canteen/ingredient/delete.html,sha256=npUtDGV7KK2jvc2AkiNlK6F2wUsKwLB5DQuBULm1pW8,1227
39
- fnschoo1/canteen/templates/canteen/ingredient/list.html,sha256=GVHpYU1aghnntVRrukbIq49ArwgbRiuVQ2pMYHU7Q7c,4655
40
+ fnschoo1/canteen/templates/canteen/ingredient/list.html,sha256=QqPvNbfQCv74jOWpgMX9I-m-Omg3HR_k51XlDFMv3YE,5900
40
41
  fnschoo1/canteen/templates/canteen/ingredient/update.html,sha256=JwW8dVQ1fzvxjA32RvRSSqrYzPPaajObvy7D45gz5pc,835
41
42
  fnschoo1/canteen/templates/canteen/meal_type/create.html,sha256=OIxOcAa3Pp3OPT-Z0PRLINfZ08CO61ulNDU-YJA6EKI,612
42
43
  fnschoo1/canteen/templates/canteen/meal_type/delete.html,sha256=i9PBX3ShXU4Az62MEawAuDWM5jwOmKByywizhdvuSTI,1567
43
44
  fnschoo1/canteen/templates/canteen/meal_type/list.html,sha256=c5kJUE1OgpRtSrMV4wFwL_gbRSaX_XMM4Zt1JTx34_g,1907
44
45
  fnschoo1/canteen/templates/canteen/meal_type/update.html,sha256=vqqyuC1m2CnPd3KrcjA8t4hbJslT001s4XvcYpkQmO0,834
45
46
  fnschoo1/canteen/workbook/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
46
- fnschoo1/canteen/workbook/generate.py,sha256=Jc22Fpg-xAcAOgkzl-LK81NxxaNR05x1Js9kMTtG5XM,109427
47
+ fnschoo1/canteen/workbook/generate.py,sha256=sRJ_r6DLh0DiUr1FTBST17YUqB7G6P_XUCpw2YQn0BA,109434
47
48
  fnschoo1/fnschool/__init__.py,sha256=TmHhzykpKNMoMf6eD-EKvbvmnlzs1XGHtvD55ae1sXs,287
48
49
  fnschoo1/fnschool/asgi.py,sha256=kzkqosS10uBlyBX53EXcsATcvEZmac6nsPzyOHCuucE,393
49
- fnschoo1/fnschool/settings.py,sha256=l9Y1iQCivSfmsNfnHltfXLzxP6gG4VMIL4GEZgAp8YM,4357
50
+ fnschoo1/fnschool/settings.py,sha256=VJJFsbLReFDbOqhqC1zWX_xZSw9hcboXQD2oJaXrPqE,4381
50
51
  fnschoo1/fnschool/urls.py,sha256=8WPemtCUuStd0R9gDP70c-NRQ5k7G4ksq6dYGH6xCDM,1036
51
52
  fnschoo1/fnschool/views.py,sha256=MfujMhFkRLxT-saID1xTU16v0khzIl6ceDl7_JgrgFs,152
52
53
  fnschoo1/fnschool/wsgi.py,sha256=dQq4S0vZWCz8w5R9KooJeLYTVFXvEgJRYe7NFZwVxU8,393
@@ -75,11 +76,11 @@ fnschoo1/profiles/templates/profiles/edit.html,sha256=49afyNH7OsqEKfD9TFrDKbRZ7r
75
76
  fnschoo1/profiles/templates/profiles/log_in.html,sha256=9hcuxdxAUHdFBxrJTJ_X6IVwKC_Jw6mfA5Sqx9a4bZA,736
76
77
  fnschoo1/profiles/templates/profiles/log_out.html,sha256=RRb6K-0G1Jm4RhfY9VwftJgNwgI8jsKb_N5Gvp5XtiE,320
77
78
  fnschoo1/static/css/bootstrap.min.css,sha256=eGY1FwN6FhXUvbmXraT1t_q2vcNlQa8g5xQDwg8mG6w,280591
78
- fnschoo1/static/css/fnschool.css,sha256=nPjOh0vWuuFnZWrXcT2E3j3adL77v_PRyeml65MvkEE,418
79
+ fnschoo1/static/css/fnschool.css,sha256=k71DBJi4EwUQSOPyXX6G-15m8HN_z4_Ac72Du0Zf9Co,476
79
80
  fnschoo1/static/images/favicon.ico,sha256=S8Tf0NsUdHnoYO0SEn-sig6YjB0atIpEtSlm7p1HxjY,5014
80
81
  fnschoo1/static/js/bootstrap.bundle.min.js,sha256=6kw84LCFc4QJzifgkle0FsvQrpt2NVRNPNjSSc9caiM,125881
81
82
  fnschoo1/static/js/bootstrap.min.js,sha256=0SHpZTHghUOz_BNedMzuH00z5lgwOSRKP_KI9G5Ogbk,88597
82
- fnschoo1/static/js/fnschool.js,sha256=tq9QzYsq8S3CvCqLk2U9tQuwQTcE-hYpf5YanqIHi4g,2959
83
+ fnschoo1/static/js/fnschool.js,sha256=M2hdpT_g6f77bDLzN3zWxjPybcfrWHRSpo6deNSxkH4,3684
83
84
  fnschoo1/static/js/jquery.min.js,sha256=np_WnfpAmUmEO_iheFAJKf6mbm0_laW3Ns4x7kjSlt4,162505
84
85
  fnschoo1/static/js/jquery.slim.min.js,sha256=p5YkbOjgHxX3hTadKlGuDW58NvJ1ldjjokDuDQ_5yXs,129962
85
86
  fnschoo1/static/js/popper.min.js,sha256=O2xdmtEow7gq3I7-0lKjshvxHkBe0hTWrMkbX2fy0XQ,36887
@@ -96,14 +97,14 @@ fnschoo1/templates/includes/_navigation.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRk
96
97
  fnschoo1/templates/includes/_paginator.html,sha256=Q-FRCODFNlETjn2yX18IfhctRWfqEgEnIc5LcdHzKSo,1262
97
98
  fnschoo1/templates/registration/logged_out.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
98
99
  fnschoo1/templates/registration/login.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
99
- fnschool-20251018.80430.821.dist-info/licenses/LICENSE,sha256=2n6rt7r999OuXp8iOqW9we7ORaxWncIbOwN1ILRGR2g,7651
100
- fnschool-20251018.80430.821.dist-info/METADATA,sha256=B1JtREEGlCidGobUBN1c7_kJtw1UkNVfAn_KSkB3h0Q,4752
101
- fnschool-20251018.80430.821.dist-info/SOURCES.txt.py,sha256=2LY2mshgNtxI3ICB-oBjyMYgJk2bQqeGFM5J5ay5TQs,4954
102
- fnschool-20251018.80430.821.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
103
- fnschool-20251018.80430.821.dist-info/dependency_links.txt.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
104
- fnschool-20251018.80430.821.dist-info/entry_points.txt,sha256=Ow5nChVFJY3O4TJAIE1ZydMev1MUtgRsT1b8eFP6728,54
105
- fnschool-20251018.80430.821.dist-info/entry_points.txt.py,sha256=7iOwIx_m9Y6xJt___BZHWJh27LV5hqWnUjmj77MoRys,47
106
- fnschool-20251018.80430.821.dist-info/requires.txt.py,sha256=PqRcHIQSMPUb271hacYrlSDHwB1WDZmlWUkh6RnBz_g,113
107
- fnschool-20251018.80430.821.dist-info/top_level.txt,sha256=s6ZKnNm94Q0-247a50eI7jDK98uPF6P2kC9Ovd3LUlM,9
108
- fnschool-20251018.80430.821.dist-info/top_level.txt.py,sha256=_7CbrSihm0dzBn_tTy2ass_Y2VlkVNT2eylE8mcfwHY,9
109
- fnschool-20251018.80430.821.dist-info/RECORD,,
100
+ fnschool-20251019.81526.808.dist-info/licenses/LICENSE,sha256=2n6rt7r999OuXp8iOqW9we7ORaxWncIbOwN1ILRGR2g,7651
101
+ fnschool-20251019.81526.808.dist-info/METADATA,sha256=YmFIFr7SUfIaw_itWuS1Ob4vM70tpTj4N2wsFt5-4fk,4752
102
+ fnschool-20251019.81526.808.dist-info/SOURCES.txt.py,sha256=2LY2mshgNtxI3ICB-oBjyMYgJk2bQqeGFM5J5ay5TQs,4954
103
+ fnschool-20251019.81526.808.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
104
+ fnschool-20251019.81526.808.dist-info/dependency_links.txt.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
105
+ fnschool-20251019.81526.808.dist-info/entry_points.txt,sha256=Ow5nChVFJY3O4TJAIE1ZydMev1MUtgRsT1b8eFP6728,54
106
+ fnschool-20251019.81526.808.dist-info/entry_points.txt.py,sha256=7iOwIx_m9Y6xJt___BZHWJh27LV5hqWnUjmj77MoRys,47
107
+ fnschool-20251019.81526.808.dist-info/requires.txt.py,sha256=PqRcHIQSMPUb271hacYrlSDHwB1WDZmlWUkh6RnBz_g,113
108
+ fnschool-20251019.81526.808.dist-info/top_level.txt,sha256=s6ZKnNm94Q0-247a50eI7jDK98uPF6P2kC9Ovd3LUlM,9
109
+ fnschool-20251019.81526.808.dist-info/top_level.txt.py,sha256=_7CbrSihm0dzBn_tTy2ass_Y2VlkVNT2eylE8mcfwHY,9
110
+ fnschool-20251019.81526.808.dist-info/RECORD,,