fnschool 20251014.81348.830__py3-none-any.whl → 20251015.81127.817__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.

Potentially problematic release.


This version of fnschool might be problematic. Click here for more details.

Files changed (20) hide show
  1. fnschoo1/__init__.py +1 -1
  2. fnschoo1/canteen/migrations/0016_consumption_unique_ingredient_date_of_using.py +20 -0
  3. fnschoo1/canteen/models.py +6 -0
  4. fnschoo1/canteen/templates/canteen/consumption/_create.html +1 -1
  5. fnschoo1/canteen/templates/canteen/consumption/create.html +53 -72
  6. fnschoo1/canteen/views.py +20 -9
  7. fnschoo1/canteen/workbook/generate.py +21 -7
  8. fnschoo1/locale/zh_Hans/LC_MESSAGES/django.mo +0 -0
  9. fnschoo1/manage.py +1 -1
  10. {fnschool-20251014.81348.830.dist-info → fnschool-20251015.81127.817.dist-info}/METADATA +1 -1
  11. {fnschool-20251014.81348.830.dist-info → fnschool-20251015.81127.817.dist-info}/RECORD +20 -19
  12. {fnschool-20251014.81348.830.dist-info → fnschool-20251015.81127.817.dist-info}/SOURCES.txt.py +0 -0
  13. {fnschool-20251014.81348.830.dist-info → fnschool-20251015.81127.817.dist-info}/WHEEL +0 -0
  14. {fnschool-20251014.81348.830.dist-info → fnschool-20251015.81127.817.dist-info}/dependency_links.txt.py +0 -0
  15. {fnschool-20251014.81348.830.dist-info → fnschool-20251015.81127.817.dist-info}/entry_points.txt +0 -0
  16. {fnschool-20251014.81348.830.dist-info → fnschool-20251015.81127.817.dist-info}/entry_points.txt.py +0 -0
  17. {fnschool-20251014.81348.830.dist-info → fnschool-20251015.81127.817.dist-info}/licenses/LICENSE +0 -0
  18. {fnschool-20251014.81348.830.dist-info → fnschool-20251015.81127.817.dist-info}/requires.txt.py +0 -0
  19. {fnschool-20251014.81348.830.dist-info → fnschool-20251015.81127.817.dist-info}/top_level.txt +0 -0
  20. {fnschool-20251014.81348.830.dist-info → fnschool-20251015.81127.817.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__ = "20251014.81348.830"
9
+ __version__ = "20251015.81127.817"
@@ -0,0 +1,20 @@
1
+ # Generated by Django 4.2.25 on 2025-10-15 00:44
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ("canteen", "0015_alter_category_options_alter_category_priority"),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AddConstraint(
14
+ model_name="consumption",
15
+ constraint=models.UniqueConstraint(
16
+ fields=("ingredient", "date_of_using"),
17
+ name="unique_ingredient_date_of_using",
18
+ ),
19
+ ),
20
+ ]
@@ -189,6 +189,12 @@ class Consumption(models.Model):
189
189
  verbose_name = _("Consumption Record")
190
190
  verbose_name_plural = _("Consumption Records")
191
191
  ordering = ["-date_of_using"]
192
+ constraints = [
193
+ models.UniqueConstraint(
194
+ fields=["ingredient", "date_of_using"],
195
+ name="unique_ingredient_date_of_using",
196
+ )
197
+ ]
192
198
 
193
199
  def __str__(self):
194
200
  return _("{0} of {1} was consumed on {2} .").format(
@@ -6,7 +6,7 @@
6
6
  <form onkeydown="if(event.keyCode==13){return false;}"
7
7
  name="consumption_form"
8
8
  data-is_disabled="{{ form.instance.is_disabled }}"
9
- data-amount_used="{{ form.instance.amount_used }}"
9
+ data-amount_used="{{ form.instance.amount_used|default_if_none:0 }}"
10
10
  data-ingredient_unit_price="{{ form.instance.ingredient.unit_price }}"
11
11
  data-date_of_using="{{ form.instance.date_of_using|date:"Y-m-d" }}"
12
12
  data-ingredient_meal_type="{{ form.instance.ingredient.meal_type }}"
@@ -47,7 +47,13 @@
47
47
  <th class="">{% trans "Remaining Quantity" %}</th>
48
48
  {% endif %}
49
49
  {% for date_h in date_range %}
50
- <th data-date_of_using="{{ date_h }}" class="consumption-date">{{ date_h }}</th>
50
+ <th data-date_of_using="{{ date_h }}" class="consumption-date">
51
+ {{ date_h }}
52
+ <br />
53
+ |
54
+ <br />
55
+ |
56
+ </th>
51
57
  {% empty %}
52
58
  <th></th>
53
59
  {% endfor %}
@@ -85,8 +91,6 @@
85
91
  </table>
86
92
  </div>
87
93
  <div class="">
88
- <button onclick="submit_consumptions();"
89
- class="btn btn-submit-consumptions btn-primary float-start">{% trans "Submit" %}</button>
90
94
  <button onclick="generate_spreadsheet();"
91
95
  class="btn btn-submit-consumptions btn-success float-end">{% trans "Generate Spreadsheet" %}</button>
92
96
  <select class="workbook-month-select form-select float-end mx-2"
@@ -180,23 +184,53 @@
180
184
  });
181
185
  });
182
186
 
187
+ function submit_consumption_form(element) {
188
+ var element = $(element)
189
+ var form = $(element.closest("form"));
190
+ var formData = new FormData(form[0]);
191
+
192
+ $.ajax({
193
+ url: form.attr('action'),
194
+ method: 'POST',
195
+ data: formData,
196
+ processData: false,
197
+ contentType: false,
198
+ success(res) {
199
+ if (res == "OK") {
200
+ element.css({
201
+ 'border': "5px solid green",
202
+ "border-radius": "10px"
203
+ })
204
+ form.data("amount_used", element.val())
205
+ }
206
+ },
207
+ error(xhr) {
208
+ element.css({
209
+ 'border': "5px solid red",
210
+ "border-radius": "10px"
211
+ })
212
+ }
213
+ });
214
+
215
+ }
216
+
183
217
  function amount_used_input_blur(element) {
184
218
  element = $(element)
185
219
  var ingredient_quantity = element.closest('tr').data("ingredient_quantity")
186
220
  ingredient_quantity = parseInt(ingredient_quantity) || 0
187
- var amount_used = element.closest("form").data("amount_used")
188
- var new_amount_used = $.trim(element.val())
221
+ var $consumption_form = element.closest("form")
222
+ var amount_used = parseInt($consumption_form.data("amount_used")) || 0
223
+ var new_amount_used = parseInt($.trim(element.val())) || 0
189
224
  new_amount_used = parseInt(new_amount_used) || 0
190
225
  if (new_amount_used < 0) {
191
- element.val('0')
226
+ element.val('')
192
227
  new_amount_used = 0
193
228
  }
194
- if (new_amount_used === 0 && amount_used == "None") {
229
+ if (new_amount_used === 0 && amount_used === 0) {
195
230
  element.val('')
196
231
  }
197
232
  if (amount_used > 0 && new_amount_used === 0) {
198
233
  element.val('0')
199
- new_amount_used = 0
200
234
  }
201
235
  var $tds = element.parent().parent().siblings("td")
202
236
  var $amount_used_inputs = $tds.find("form input[name='amount_used']")
@@ -207,7 +241,11 @@
207
241
  });
208
242
  if ((total_consumed + new_amount_used) > ingredient_quantity) {
209
243
  var remaining_quantity = total_consumed < ingredient_quantity ? (ingredient_quantity - total_consumed) : 0
210
- element.val(remaining_quantity)
244
+ if (remaining_quantity === 0) {
245
+ element.val('')
246
+ } else {
247
+ element.val(remaining_quantity)
248
+ }
211
249
  new_amount_used = remaining_quantity
212
250
  }
213
251
  total_consumed = total_consumed + new_amount_used
@@ -215,7 +253,11 @@
215
253
  $(`td[name='remaining_${ingredient_id}']`).text(`${ingredient_quantity}-${total_consumed}=${ingredient_quantity-total_consumed}`)
216
254
  element.closest("tr").find('.ingredient-progress').css('width', `${parseInt((ingredient_quantity-total_consumed)*100/ingredient_quantity)}%`)
217
255
  var date_of_using = element.closest("form").data("date_of_using")
256
+
218
257
  update_header(date_of_using)
258
+ if (new_amount_used != amount_used) {
259
+ submit_consumption_form(element, new_amount_used)
260
+ }
219
261
  }
220
262
 
221
263
  function update_header(date_of_using) {
@@ -321,69 +363,8 @@
321
363
  });
322
364
 
323
365
  function generate_spreadsheet() {
324
- submit_consumptions(function() {
325
- var month = $(".workbook-month-select").val()
326
- window.open(`/canteen/generate_spreadsheet/${month}`, '_blank');
327
- });
328
-
329
- }
330
-
331
- function submit_consumptions(fn) {
332
- if (dont_submit) {
333
- return false
334
- } else {
335
- dont_submit = true
336
- }
337
-
338
- var consumption_forms = $('form[name="consumption_form"]')
339
- var requests = [];
340
- var progress = 0
341
- consumption_forms_cp = []
342
- consumption_forms.each(function(index, element) {
343
- var form = $(element);
344
- var amount_used_init = parseInt(form.data("amount_used")) || 0
345
- var amount_used_new = parseInt(form.find("input[name='amount_used']").val()) || 0
346
- if (form.data("is_disabled") == "True") {
347
- return true;
348
- }
349
- if (form.find('input[name="amount_used"]').val().length < 1) {
350
- return true;
351
- }
352
- if (amount_used_new == amount_used_init) {
353
- return true;
354
- }
355
- consumption_forms_cp.push(form)
356
- });
357
-
358
- consumption_forms = consumption_forms_cp
359
- var consumption_forms_length = consumption_forms.length
360
- $(consumption_forms).each(function(index, element) {
361
- form = $(element)
362
- requests.push(
363
- $.ajax({
364
- url: form.attr('action'),
365
- type: form.attr('method') || 'POST',
366
- data: form.serialize(),
367
- success: function(response) {
368
- progress += 1
369
- var footer_progressbar = $('.progress-footer')
370
- if (footer_progressbar) {
371
- var width = `${parseInt(progress*100/consumption_forms_length)}%`
372
- $(footer_progressbar).css("width", width)
373
- }
374
- }
375
- }).catch(function(error) {
376
- return erroe;
377
- }));
378
- });
379
- $.when.apply($, requests)
380
- .done(function() {
381
- if (fn != undefined) {
382
- fn()
383
- }
384
- location.reload();
385
- })
386
- .fail(function() {});
366
+ var month = $(".workbook-month-select").val()
367
+ window.open(`/canteen/generate_spreadsheet/${month}`, 'generate_spreadsheet');
387
368
  }
388
369
 
389
370
  function set_consumptions_table_size() {
fnschoo1/canteen/views.py CHANGED
@@ -246,7 +246,7 @@ def create_consumptions(request, ingredient_id=None):
246
246
  & Q(is_ignorable=False)
247
247
  )
248
248
  ingredients = Ingredient.objects
249
- print("by_week", by_week, "rapidly", rapidly)
249
+
250
250
  ingredients = (
251
251
  ingredients.filter(queries).order_by(
252
252
  "name", "storage_date", "meal_type__name", "category__name"
@@ -306,19 +306,19 @@ def create_consumptions(request, ingredient_id=None):
306
306
  @require_POST
307
307
  def new_consumption(request, consumption_id=None):
308
308
  form = None
309
+
310
+ posted_date_of_using = date_parser.parse(request.POST.get("date_of_using"))
311
+ posted_amount_used = request.POST.get("amount_used")
312
+
309
313
  if consumption_id:
310
314
  consumption = Consumption.objects.filter(
311
315
  Q(pk=consumption_id)
312
316
  & Q(ingredient__user=request.user)
317
+ & Q(date_of_using=posted_date_of_using)
313
318
  & Q(is_disabled=False)
314
319
  ).first()
315
320
  if consumption:
316
-
317
- posted_amount_used = request.POST.get("amount_used")
318
- if (
319
- posted_amount_used.replace(".", "").isnumeric()
320
- and Decimal(posted_amount_used).is_zero()
321
- ):
321
+ if Decimal(posted_amount_used).is_zero():
322
322
  consumption.delete()
323
323
  return HttpResponse("OK", status=201)
324
324
 
@@ -327,13 +327,24 @@ def new_consumption(request, consumption_id=None):
327
327
  return HttpResponse("Accepted", status=202)
328
328
 
329
329
  else:
330
+ ingredient_id = request.POST.get("ingredient")
330
331
  ingredient = Ingredient.objects.filter(
331
- Q(user=request.user) & Q(pk=request.POST.get("ingredient"))
332
+ Q(user=request.user) & Q(pk=ingredient_id)
332
333
  ).first()
333
334
  if not ingredient:
334
335
  return HttpResponse("Accepted", status=202)
335
336
 
336
- consumption = Consumption()
337
+ consumption = Consumption.objects.filter(
338
+ Q(date_of_using=posted_date_of_using)
339
+ & Q(ingredient__id=ingredient_id)
340
+ ).first()
341
+
342
+ if not consumption:
343
+ consumption = Consumption()
344
+ elif Decimal(posted_amount_used).is_zero():
345
+ consumption.delete()
346
+ return HttpResponse("OK", status=201)
347
+
337
348
  consumption.ingredient = ingredient
338
349
  form = ConsumptionForm(request.POST, instance=consumption)
339
350
 
@@ -880,7 +880,10 @@ class CanteenWorkBook:
880
880
 
881
881
  split_dated_consumptions = sorted(
882
882
  split_dated_consumptions,
883
- key=lambda i: (i.ingredient.category.name),
883
+ key=lambda c: (
884
+ c.ingredient.category.priority,
885
+ c.ingredient.category.name,
886
+ ),
884
887
  )
885
888
 
886
889
  consumption_date_index = sub_consumption_num
@@ -904,7 +907,7 @@ class CanteenWorkBook:
904
907
 
905
908
  title_cell_row_num = row_num
906
909
  title_cell = sheet.cell(title_cell_row_num, 1)
907
- title_cell.value = _("Storage List (Storage Sheet)")
910
+ title_cell.value = _("Consumption List Title (Consumption List Sheet)")
908
911
  title_cell.alignment = self.center_alignment
909
912
  title_cell.font = self.font_20_bold
910
913
  sheet.merge_cells(f"A{title_cell_row_num}:H{title_cell_row_num}")
@@ -1174,7 +1177,7 @@ class CanteenWorkBook:
1174
1177
  ).all()
1175
1178
  ingredient_row_height = 0.18
1176
1179
  ingredient_rows_height = ingredient_rows_count * 0.18
1177
- storage_dates = list(set([i.storage_date for i in ingredients]))
1180
+ storage_dates = sorted(list(set([i.storage_date for i in ingredients])))
1178
1181
 
1179
1182
  storaged_ingredients = []
1180
1183
  for storage_date in storage_dates:
@@ -1234,7 +1237,8 @@ class CanteenWorkBook:
1234
1237
  ]
1235
1238
 
1236
1239
  split_dated_ingredients = sorted(
1237
- split_dated_ingredients, key=lambda i: (i.category.name)
1240
+ split_dated_ingredients,
1241
+ key=lambda i: (i.category.priority, i.category.name),
1238
1242
  )
1239
1243
 
1240
1244
  storage_date_index = sub_storage_num
@@ -1822,7 +1826,14 @@ class CanteenWorkBook:
1822
1826
  _(
1823
1827
  "{meal_type} ({category}, Checked/Storaged at {storage_date})"
1824
1828
  ).format(
1825
- meal_type=ingredient.meal_type,
1829
+ meal_type=(
1830
+ (
1831
+ ingredient.meal_type.abbreviation
1832
+ or ingredient.meal_type.name
1833
+ )
1834
+ if ingredient.meal_type
1835
+ else ""
1836
+ ),
1826
1837
  category=ingredient.category,
1827
1838
  storage_date=ingredient.storage_date,
1828
1839
  ),
@@ -2147,13 +2158,16 @@ def get_workbook_zip(request, month):
2147
2158
  _(
2148
2159
  "Canteen {meal_type} Daybook WorkBook ({month}) of {affiliation}"
2149
2160
  ).format(
2150
- meal_type=meal_type.abbreviation or meal_type.name,
2161
+ meal_type=(
2162
+ (meal_type.abbreviation or meal_type.name)
2163
+ if meal_type
2164
+ else ""
2165
+ ),
2151
2166
  month=month.replace("-", ""),
2152
2167
  affiliation=request.user.affiliation,
2153
2168
  )
2154
2169
  + ".xlsx"
2155
2170
  )
2156
- # filename = escape_uri_path(filename)
2157
2171
 
2158
2172
  wb = CanteenWorkBook(request, month, meal_type).fill_in()
2159
2173
  excel_buffer = io.BytesIO()
fnschoo1/manage.py CHANGED
@@ -39,7 +39,7 @@ def main():
39
39
  sys.argv[0] = "manage.py"
40
40
 
41
41
  if len(sys.argv) < 2:
42
- local_port = str(random.randint(8080, 65530))
42
+ local_port = "8230"
43
43
  local_url = "http://127.0.0.1:" + local_port
44
44
  sys.argv.append("runserver")
45
45
  sys.argv.append(str(local_port))
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fnschool
3
- Version: 20251014.81348.830
3
+ Version: 20251015.81127.817
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=DqSX-bt_bz0BZ-kysbkSLYxAUXL5o08jka2CGFxXo4Y,197
2
- fnschoo1/manage.py,sha256=Cr5OtPrRWfEc7KEjW4yYnMKj_qlb0-qpwFRz3vFXvC0,1565
1
+ fnschoo1/__init__.py,sha256=Hx-9-YfTx_lziChxGNxSdlO4jOb42i66f9ajNcbIhUM,197
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
6
  fnschoo1/canteen/forms.py,sha256=PDPAzZZ_y533KtMxCixLXXsXok5gjUShCSXeonYgGqQ,2582
7
- fnschoo1/canteen/models.py,sha256=a4dCdTAcWu84D6PP8CWCSsAF4Q6ZMo74eDluwOmH_R8,5710
7
+ fnschoo1/canteen/models.py,sha256=l0E-kBNZxZnFnVVUbvfGYl39Le-poE218XyV4zFNWfU,5907
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=DGrbOZuU0XuMuTnldFrHpRsm-spYuBHZMzBQq3z_iC0,26284
10
+ fnschoo1/canteen/views.py,sha256=D80gYpQieIc45f0zeb3J803TrUftVdeDy-8MsP_Ff68,26631
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
@@ -23,14 +23,15 @@ fnschoo1/canteen/migrations/0012_alter_ingredient_storage_date.py,sha256=JvU9xrA
23
23
  fnschoo1/canteen/migrations/0013_alter_consumption_options_alter_ingredient_options_and_more.py,sha256=hKwsEJ_a1ezANJSrQoca2wEy22AZESwhqH9eonNfOm8,6735
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
+ fnschoo1/canteen/migrations/0016_consumption_unique_ingredient_date_of_using.py,sha256=kiNr4ISVoy99U7LuJMItJYtNyE4BPYR_jSdnKoXxWt4,520
26
27
  fnschoo1/canteen/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
27
28
  fnschoo1/canteen/templates/canteen/close.html,sha256=pLYeJmGaOEJKMUJdZmYzz_n--l28IRDQ4fXvetP_Vsc,200
28
29
  fnschoo1/canteen/templates/canteen/category/create.html,sha256=7Hq62BqEpamDt52_Ut7DTO74_3yEn8_CqXH4e4va6dY,593
29
30
  fnschoo1/canteen/templates/canteen/category/delete.html,sha256=gkEg3oiIbjVsZMKEywkAeXtb21oHTofi8cOER4dW6cc,1802
30
31
  fnschoo1/canteen/templates/canteen/category/list.html,sha256=QLO2GA13Co48Ijd0DCCN4lcMm1fgJqT2CprH5VdLZPw,2148
31
32
  fnschoo1/canteen/templates/canteen/category/update.html,sha256=8Nzdbe8UorrJHzElkrdqvLaPnUvcvGhrViZB4D86wqo,815
32
- fnschoo1/canteen/templates/canteen/consumption/_create.html,sha256=lpST1R0vL1PEI1YE9d0-bcWWpCMH-INjIF-7pweAHuU,1008
33
- fnschoo1/canteen/templates/canteen/consumption/create.html,sha256=k7E3SH9B605WlrJ7_ylncfoOe51qhHgIXKr_TYLukEs,15960
33
+ fnschoo1/canteen/templates/canteen/consumption/_create.html,sha256=tXlJcd566D9sYbsnj5KN-m0lyobT2AwwYt9oxUHbn4M,1026
34
+ fnschoo1/canteen/templates/canteen/consumption/create.html,sha256=wFa8hNpIGvK2bfzAMzQxR_EJ9Lya3OZNEU_mmUVnzEE,15059
34
35
  fnschoo1/canteen/templates/canteen/ingredient/close.html,sha256=pLYeJmGaOEJKMUJdZmYzz_n--l28IRDQ4fXvetP_Vsc,200
35
36
  fnschoo1/canteen/templates/canteen/ingredient/create.html,sha256=xZvh0tP_cv2HPQ96JSHChO6Ni23tzHc5YJCUhE2yEqM,807
36
37
  fnschoo1/canteen/templates/canteen/ingredient/create_one.html,sha256=O8EPSvAnEZ-4VJiwFdoyxJrMOoMpRkH6CyfvWwHaVgc,599
@@ -42,7 +43,7 @@ fnschoo1/canteen/templates/canteen/meal_type/delete.html,sha256=1UmCyXD-6lbYl-IE
42
43
  fnschoo1/canteen/templates/canteen/meal_type/list.html,sha256=c5kJUE1OgpRtSrMV4wFwL_gbRSaX_XMM4Zt1JTx34_g,1907
43
44
  fnschoo1/canteen/templates/canteen/meal_type/update.html,sha256=Rfv1TamSFIKHzvUNlgnmrPmfmzrehPpuo5Hv8VF0yek,818
44
45
  fnschoo1/canteen/workbook/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
45
- fnschoo1/canteen/workbook/generate.py,sha256=iCVe844tDqFZXn8eVwpgR7udZRfQJNoTalU-8jJH4x0,84475
46
+ fnschoo1/canteen/workbook/generate.py,sha256=EXWupVex_fj0zxK82hfews13t5R5yONQBbapl5lpZYc,85025
46
47
  fnschoo1/fnschool/__init__.py,sha256=TmHhzykpKNMoMf6eD-EKvbvmnlzs1XGHtvD55ae1sXs,287
47
48
  fnschoo1/fnschool/asgi.py,sha256=kzkqosS10uBlyBX53EXcsATcvEZmac6nsPzyOHCuucE,393
48
49
  fnschoo1/fnschool/settings.py,sha256=l9Y1iQCivSfmsNfnHltfXLzxP6gG4VMIL4GEZgAp8YM,4357
@@ -52,7 +53,7 @@ fnschoo1/fnschool/wsgi.py,sha256=dQq4S0vZWCz8w5R9KooJeLYTVFXvEgJRYe7NFZwVxU8,393
52
53
  fnschoo1/fnschool/templatetags/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
53
54
  fnschoo1/fnschool/templatetags/fnschool_tags.py,sha256=l5Zov4VlQKpz-69SFftP4kXyMymz-a0D5F_ss_eiFc4,568
54
55
  fnschoo1/locale/en/LC_MESSAGES/django.mo,sha256=M8AB6fmjwlEd761iFlasNWdiEYfE-2nIwBoioGtEVUo,404
55
- fnschoo1/locale/zh_Hans/LC_MESSAGES/django.mo,sha256=3Ipol-cSR0HI3vvp7gbK1jxLGR7ZzeKncXX__rzyJCw,20121
56
+ fnschoo1/locale/zh_Hans/LC_MESSAGES/django.mo,sha256=91oVaDDXdXDZEYghtggnPcBDiUOBphnuLm4QwMZJhIQ,20313
56
57
  fnschoo1/profiles/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
57
58
  fnschoo1/profiles/admin.py,sha256=93UCvdODI63KzCDfFFnKmfvCMGCp6FCG9WErE91i79Y,522
58
59
  fnschoo1/profiles/apps.py,sha256=WDu6eceFnDkBFMqquAolMZMo7XPb0ah6l2q2AruTrl4,215
@@ -95,14 +96,14 @@ fnschoo1/templates/includes/_navigation.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRk
95
96
  fnschoo1/templates/includes/_paginator.html,sha256=Z-Hxcdmun4SJ1YcHnWTDLfW8wrngROiBTwr4NZWaPP4,1246
96
97
  fnschoo1/templates/registration/logged_out.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
97
98
  fnschoo1/templates/registration/login.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
98
- fnschool-20251014.81348.830.dist-info/licenses/LICENSE,sha256=2n6rt7r999OuXp8iOqW9we7ORaxWncIbOwN1ILRGR2g,7651
99
- fnschool-20251014.81348.830.dist-info/METADATA,sha256=E1lDNu8EaNtE1fm1upQC0oIHHDKJBRGMUxl_ghQxR5c,4752
100
- fnschool-20251014.81348.830.dist-info/SOURCES.txt.py,sha256=2LY2mshgNtxI3ICB-oBjyMYgJk2bQqeGFM5J5ay5TQs,4954
101
- fnschool-20251014.81348.830.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
102
- fnschool-20251014.81348.830.dist-info/dependency_links.txt.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
103
- fnschool-20251014.81348.830.dist-info/entry_points.txt,sha256=Ow5nChVFJY3O4TJAIE1ZydMev1MUtgRsT1b8eFP6728,54
104
- fnschool-20251014.81348.830.dist-info/entry_points.txt.py,sha256=7iOwIx_m9Y6xJt___BZHWJh27LV5hqWnUjmj77MoRys,47
105
- fnschool-20251014.81348.830.dist-info/requires.txt.py,sha256=PqRcHIQSMPUb271hacYrlSDHwB1WDZmlWUkh6RnBz_g,113
106
- fnschool-20251014.81348.830.dist-info/top_level.txt,sha256=s6ZKnNm94Q0-247a50eI7jDK98uPF6P2kC9Ovd3LUlM,9
107
- fnschool-20251014.81348.830.dist-info/top_level.txt.py,sha256=_7CbrSihm0dzBn_tTy2ass_Y2VlkVNT2eylE8mcfwHY,9
108
- fnschool-20251014.81348.830.dist-info/RECORD,,
99
+ fnschool-20251015.81127.817.dist-info/licenses/LICENSE,sha256=2n6rt7r999OuXp8iOqW9we7ORaxWncIbOwN1ILRGR2g,7651
100
+ fnschool-20251015.81127.817.dist-info/METADATA,sha256=Whacwebcw_8mlsKLCHqqO8KFOlWFouQh9rkNMhdkCSU,4752
101
+ fnschool-20251015.81127.817.dist-info/SOURCES.txt.py,sha256=2LY2mshgNtxI3ICB-oBjyMYgJk2bQqeGFM5J5ay5TQs,4954
102
+ fnschool-20251015.81127.817.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
103
+ fnschool-20251015.81127.817.dist-info/dependency_links.txt.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
104
+ fnschool-20251015.81127.817.dist-info/entry_points.txt,sha256=Ow5nChVFJY3O4TJAIE1ZydMev1MUtgRsT1b8eFP6728,54
105
+ fnschool-20251015.81127.817.dist-info/entry_points.txt.py,sha256=7iOwIx_m9Y6xJt___BZHWJh27LV5hqWnUjmj77MoRys,47
106
+ fnschool-20251015.81127.817.dist-info/requires.txt.py,sha256=PqRcHIQSMPUb271hacYrlSDHwB1WDZmlWUkh6RnBz_g,113
107
+ fnschool-20251015.81127.817.dist-info/top_level.txt,sha256=s6ZKnNm94Q0-247a50eI7jDK98uPF6P2kC9Ovd3LUlM,9
108
+ fnschool-20251015.81127.817.dist-info/top_level.txt.py,sha256=_7CbrSihm0dzBn_tTy2ass_Y2VlkVNT2eylE8mcfwHY,9
109
+ fnschool-20251015.81127.817.dist-info/RECORD,,