fnschool 20251013.81200.824__py3-none-any.whl → 20251013.81919.815__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.
fnschoo1/__init__.py CHANGED
@@ -6,48 +6,4 @@ import random
6
6
  import sys
7
7
  from pathlib import Path
8
8
 
9
- __version__ = "20251013.81200.824"
10
-
11
- FNSCHOOL_PATH = Path(__file__).parent
12
- if FNSCHOOL_PATH.as_posix() not in sys.path:
13
- sys.path.insert(0, FNSCHOOL_PATH.as_posix())
14
-
15
- system_name = platform.system()
16
- is_linux = False
17
- is_windows = False
18
- is_macos = False
19
-
20
- if system_name == "Linux":
21
- is_linux = True
22
- elif system_name == "Windows":
23
- is_windows = True
24
- elif system_name == "Darwin":
25
- is_macos = True
26
-
27
-
28
- def main():
29
- """Run administrative tasks."""
30
- os.environ.setdefault("DJANGO_SETTINGS_MODULE", "fnschool.settings")
31
- try:
32
- from django.core.management import execute_from_command_line
33
- except ImportError as exc:
34
- raise ImportError(
35
- "Couldn't import Django. Are you sure it's installed and "
36
- "available on your PYTHONPATH environment variable? Did you "
37
- "forget to activate a virtual environment?"
38
- ) from exc
39
-
40
- if len(sys.argv) < 2:
41
- local_port = str(random.randint(8080, 65530))
42
- local_url = "http://127.0.0.1:" + local_port
43
- sys.argv.append("runserver")
44
- sys.argv.append(str(local_port))
45
- try:
46
- if is_windows:
47
- os.startfile(local_url)
48
- else:
49
- os.system("sleep 5 && open " + local_url)
50
- except Exception as e:
51
- print(e)
52
-
53
- execute_from_command_line(sys.argv)
9
+ __version__ = "20251013.81919.815"
@@ -8,8 +8,15 @@
8
8
  <hr>
9
9
  <div class="container">
10
10
  <div class="row justify-content-end">
11
- <button class="btn btn-success col-md-1 col-lg-1 col-2"
12
- onclick="list_consumptions();">{% trans "Refresh" %}</button>
11
+ <button class="btn btn-outline-success col-md-1 col-lg-1 col-2 mx-2"
12
+ onclick="list_consumptions_by_week();">{% trans "Consume by Week" %}</button>
13
+
14
+ <button class="btn btn-outline-success col-md-1 col-lg-1 col-2"
15
+ onclick="list_consumptions_rapidly();">{% trans "Rapid Consumption" %}</button>
16
+
17
+ <a class="btn btn-success col-md-1 col-lg-1 col-2 mx-2"
18
+ target="canteen_list_categories"
19
+ href="{% url "canteen:list_categories" %}">{% trans "Ingredient Categories" %}</a>
13
20
 
14
21
  <div class="col col-3 col-md-2 col-lg-2">
15
22
  <input class=" form-control"
@@ -98,6 +105,24 @@
98
105
 
99
106
  date_range = JSON.parse($("#date_range").text())
100
107
 
108
+ function list_consumptions_rapidly() {
109
+ query = {
110
+ 'by_week': 'false',
111
+ "rapidly": 'true'
112
+ }
113
+ set_cookies(query)
114
+ update_href(query)
115
+ }
116
+
117
+ function list_consumptions_by_week() {
118
+ query = {
119
+ 'by_week': 'true',
120
+ "rapidly": 'false'
121
+ }
122
+ set_cookies(query)
123
+ update_href(query)
124
+ }
125
+
101
126
  function get_previous_month_date(date = new Date()) {
102
127
  const prevMonthDate = new Date(date);
103
128
  prevMonthDate.setDate(1);
@@ -110,6 +135,12 @@
110
135
  return dayOfWeek === 0 || dayOfWeek === 6;
111
136
  }
112
137
 
138
+ $(document).ready(function() {
139
+ var td1 = $(".table tr > :nth-child(1):first")
140
+ $(".table tr > :nth-child(2)").css("left", td1.width() * 1.05)
141
+ });
142
+
143
+
113
144
  $(document).ready(function() {
114
145
  $(months).each(function(index, value) {
115
146
  $('.workbook-month-select').append(`<option>${value}</option>`)
@@ -200,12 +231,6 @@
200
231
  }
201
232
 
202
233
 
203
-
204
- $(document).ready(function() {
205
- var td1 = $(".table tr > :nth-child(1):first")
206
- $(".table tr > :nth-child(2)").css("left", td1.width() * 1.05)
207
- });
208
-
209
234
  $(document).ready(function() {
210
235
  dont_submit = true
211
236
  var progress = 0
fnschoo1/canteen/views.py CHANGED
@@ -156,113 +156,40 @@ def split_price(total_price, quantity, prec=2):
156
156
  return [[total_price0, quantity0], [total_price1, quantity1]]
157
157
 
158
158
 
159
- def get_consumption_ingredients(request):
159
+ @login_required
160
+ def create_consumptions(request, ingredient_id=None):
160
161
  date_start = request.GET.get(
161
162
  "storage_date_start", None
162
163
  ) or request.COOKIES.get("storage_date_start", None)
163
- date_end = request.GET.get("storage_date_end", None) or request.COOKIES.get(
164
- "storage_date_end", None
165
- )
166
- ingredients = Ingredient.objects
167
- queries = Q()
168
- queries = (
169
- Q(user=request.user) & Q(is_disabled=False) & Q(is_ignorable=False)
170
- )
171
- if date_start:
172
- date_start = date_parser.parse(date_start).date()
173
- queries &= Q(storage_date__gte=date_start)
174
- if date_end:
175
- date_end = date_parser.parse(date_end).date()
176
- queries &= Q(storage_date__lte=date_end)
177
-
178
- if not date_start and not date_end:
179
- queries &= Q(quantity__gt=F("total_consumed"))
180
- ingredients = ingredients.annotate(
164
+ if not date_start:
165
+ ingredients = Ingredient.objects.annotate(
181
166
  total_consumed=Coalesce(
182
167
  Sum("consumptions__amount_used"), 0, output_field=IntegerField()
183
168
  )
184
- )
185
-
186
- ingredients = ingredients.filter(queries).order_by(
187
- "name", "storage_date", "meal_type__name", "category__name"
188
- )
189
-
190
- return ingredients
191
-
192
-
193
- def get_date_range(ingredients):
194
- date_start = ingredients.order_by("storage_date").first().storage_date
195
- today = datetime.now().date()
196
- date_end = (today.replace(day=1) + relativedelta(months=2)) - relativedelta(
197
- days=1
198
- )
199
- date_range = list(pd.date_range(start=date_start, end=date_end))
200
- date_range = [d.date() for d in date_range]
201
-
202
- return date_range
203
-
204
-
205
- @login_required
206
- @require_POST
207
- def new_consumption(request, consumption_id=None):
208
- form = None
209
- if consumption_id:
210
- consumption = Consumption.objects.filter(
211
- Q(pk=consumption_id)
212
- & Q(ingredient__user=request.user)
169
+ ).filter(
170
+ Q(quantity__gt=F("total_consumed"))
213
171
  & Q(is_disabled=False)
214
- ).first()
215
- if consumption:
216
-
217
- posted_amount_used = request.POST.get("amount_used")
218
- if (
219
- posted_amount_used.replace(".", "").isnumeric()
220
- and Decimal(posted_amount_used).is_zero()
221
- ):
222
- consumption.delete()
223
- return HttpResponse("OK", status=201)
224
-
225
- form = ConsumptionForm(request.POST, instance=consumption)
226
- else:
227
- return HttpResponse("Accepted", status=202)
172
+ & Q(is_ignorable=False)
173
+ & Q(user=request.user)
174
+ )
175
+ date_start = ingredients.order_by("storage_date").first().storage_date
228
176
 
229
177
  else:
230
- ingredient = Ingredient.objects.filter(
231
- Q(user=request.user) & Q(pk=request.POST.get("ingredient"))
232
- ).first()
233
- if not ingredient:
234
- return HttpResponse("Accepted", status=202)
235
-
236
- consumption = Consumption()
237
- consumption.ingredient = ingredient
238
- form = ConsumptionForm(request.POST, instance=consumption)
239
-
240
- if form.is_valid() and not form.instance.is_disabled:
241
- consumption = form.save(commit=False)
242
- consumption.save()
243
- return HttpResponse("OK", status=201)
244
-
245
- return HttpResponse("Accepted", status=202)
246
-
247
-
248
- @login_required
249
- def create_consumptions(request, ingredient_id=None):
250
- ingredients = get_consumption_ingredients(request)
251
- date_range = None
252
- if not ingredients:
253
- return render(
254
- request,
255
- "canteen/consumption/create.html",
256
- {"ingredients": ingredients, "date_range": date_range},
257
- )
178
+ date_start = date_parser.parse(date_start).date()
258
179
 
259
- date_range = get_date_range(ingredients)
260
180
  date_end = request.GET.get("storage_date_end", None) or request.COOKIES.get(
261
181
  "storage_date_end", None
262
182
  )
263
- if date_end:
183
+ if not date_end:
184
+ today = datetime.now().date()
185
+ date_end = (
186
+ today.replace(day=1) + relativedelta(months=2)
187
+ ) - relativedelta(days=1)
188
+ else:
264
189
  date_end = date_parser.parse(date_end).date()
265
- date_range = [d for d in date_range if d <= date_end]
190
+
191
+ date_range = list(pd.date_range(start=date_start, end=date_end))
192
+ date_range = [d.date() for d in date_range]
266
193
 
267
194
  if ingredient_id:
268
195
  ingredient = get_object_or_404(Ingredient, pk=ingredient_id)
@@ -304,8 +231,41 @@ def create_consumptions(request, ingredient_id=None):
304
231
  "canteen/consumption/_create.html",
305
232
  {"form_list": form_list},
306
233
  )
234
+ by_week = (
235
+ request.GET.get("by_week", "") or request.COOKIES.get("by_week", "")
236
+ ) == "true"
237
+ rapidly = (
238
+ request.GET.get("rapidly", "") or request.COOKIES.get("rapidly", "")
239
+ ) == "true" or not by_week
240
+
241
+ queries = (
242
+ Q(storage_date__gte=date_start)
243
+ & Q(storage_date__lte=date_end)
244
+ & Q(user=request.user)
245
+ & Q(is_disabled=False)
246
+ & Q(is_ignorable=False)
247
+ )
248
+ ingredients = Ingredient.objects
249
+ print("by_week", by_week, "rapidly", rapidly)
250
+ ingredients = (
251
+ ingredients.filter(queries).order_by(
252
+ "name", "storage_date", "meal_type__name", "category__name"
253
+ )
254
+ if rapidly
255
+ else ingredients.filter(queries).order_by(
256
+ "storage_date", "meal_type__name", "name", "category__name"
257
+ )
258
+ )
307
259
 
308
260
  ingredients = ingredients.all()
261
+
262
+ if not ingredients:
263
+ return render(
264
+ request,
265
+ "canteen/consumption/create.html",
266
+ {"ingredients": ingredients, "date_range": date_range},
267
+ )
268
+
309
269
  ingredients_pinned = []
310
270
  ingredients_unpinned = []
311
271
  categories_top = Category.objects.filter(
@@ -341,6 +301,49 @@ def create_consumptions(request, ingredient_id=None):
341
301
  )
342
302
 
343
303
 
304
+ @login_required
305
+ @require_POST
306
+ def new_consumption(request, consumption_id=None):
307
+ form = None
308
+ if consumption_id:
309
+ consumption = Consumption.objects.filter(
310
+ Q(pk=consumption_id)
311
+ & Q(ingredient__user=request.user)
312
+ & Q(is_disabled=False)
313
+ ).first()
314
+ if consumption:
315
+
316
+ posted_amount_used = request.POST.get("amount_used")
317
+ if (
318
+ posted_amount_used.replace(".", "").isnumeric()
319
+ and Decimal(posted_amount_used).is_zero()
320
+ ):
321
+ consumption.delete()
322
+ return HttpResponse("OK", status=201)
323
+
324
+ form = ConsumptionForm(request.POST, instance=consumption)
325
+ else:
326
+ return HttpResponse("Accepted", status=202)
327
+
328
+ else:
329
+ ingredient = Ingredient.objects.filter(
330
+ Q(user=request.user) & Q(pk=request.POST.get("ingredient"))
331
+ ).first()
332
+ if not ingredient:
333
+ return HttpResponse("Accepted", status=202)
334
+
335
+ consumption = Consumption()
336
+ consumption.ingredient = ingredient
337
+ form = ConsumptionForm(request.POST, instance=consumption)
338
+
339
+ if form.is_valid() and not form.instance.is_disabled:
340
+ consumption = form.save(commit=False)
341
+ consumption.save()
342
+ return HttpResponse("OK", status=201)
343
+
344
+ return HttpResponse("Accepted", status=202)
345
+
346
+
344
347
  @login_required()
345
348
  def delete_ingredient(request, ingredient_id):
346
349
  ingredient = get_object_or_404(Ingredient, pk=ingredient_id)
@@ -1819,9 +1819,12 @@ class CanteenWorkBook:
1819
1819
  ingredient_name_cell.value = ingredient.name
1820
1820
  if ingredient.name:
1821
1821
  ingredient_name_cell.comment = Comment(
1822
- _("{meal_type} ({category})").format(
1822
+ _(
1823
+ "{meal_type} ({category}, Checked/Storaged at {storage_date})"
1824
+ ).format(
1823
1825
  meal_type=ingredient.meal_type,
1824
1826
  category=ingredient.category,
1827
+ storage_date=ingredient.storage_date,
1825
1828
  ),
1826
1829
  user.username,
1827
1830
  )
fnschoo1/manage.py CHANGED
@@ -4,6 +4,23 @@ import os
4
4
  import platform
5
5
  import random
6
6
  import sys
7
+ from pathlib import Path
8
+
9
+ FNSCHOOL_PATH = Path(__file__).parent
10
+ if FNSCHOOL_PATH.as_posix() not in sys.path:
11
+ sys.path.insert(0, FNSCHOOL_PATH.as_posix())
12
+
13
+ system_name = platform.system()
14
+ is_linux = False
15
+ is_windows = False
16
+ is_macos = False
17
+
18
+ if system_name == "Linux":
19
+ is_linux = True
20
+ elif system_name == "Windows":
21
+ is_windows = True
22
+ elif system_name == "Darwin":
23
+ is_macos = True
7
24
 
8
25
 
9
26
  def main():
@@ -18,6 +35,22 @@ def main():
18
35
  "forget to activate a virtual environment?"
19
36
  ) from exc
20
37
 
38
+ os.chdir(FNSCHOOL_PATH)
39
+ sys.argv[0] = "manage.py"
40
+
41
+ if len(sys.argv) < 2:
42
+ local_port = str(random.randint(8080, 65530))
43
+ local_url = "http://127.0.0.1:" + local_port
44
+ sys.argv.append("runserver")
45
+ sys.argv.append(str(local_port))
46
+ try:
47
+ if is_windows:
48
+ os.startfile(local_url)
49
+ else:
50
+ os.system("open " + local_url + "&")
51
+ except Exception as e:
52
+ print(e)
53
+
21
54
  execute_from_command_line(sys.argv)
22
55
 
23
56
 
@@ -9,7 +9,16 @@ function get_cookie(name) {
9
9
  return null
10
10
  }
11
11
  function delete_cookie(name) {
12
- document.cookie = name + '=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/'
12
+ document.cookie =
13
+ name +
14
+ `=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=${window.location.pathname}`
15
+ }
16
+
17
+ function set_cookies(cookies) {
18
+ cookies = new Map(Object.entries(cookies))
19
+ for (var [key, value] of cookies) {
20
+ set_simple_cookie(key, value)
21
+ }
13
22
  }
14
23
 
15
24
  function set_simple_cookie(key, value) {
@@ -19,7 +28,7 @@ function set_simple_cookie(key, value) {
19
28
  }
20
29
  const expiryDate = new Date()
21
30
  expiryDate.setFullYear(expiryDate.getFullYear() + 20)
22
- document.cookie = `${key}=${value}; expires=${expiryDate.toUTCString()}; path=/`
31
+ document.cookie = `${key}=${value}; expires=${expiryDate.toUTCString()}; path=${window.location.pathname}`
23
32
  }
24
33
  function update_href(query) {
25
34
  query = new Map(Object.entries(query))
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fnschool
3
- Version: 20251013.81200.824
3
+ Version: 20251013.81919.815
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,5 +1,5 @@
1
- fnschoo1/__init__.py,sha256=SbSXFTr7zEcgWFHg92chlgThEpDfsUOXtDTKRjyh-Ns,1507
2
- fnschoo1/manage.py,sha256=pMv0yE2eTcNrgskSHDUdRrnY51iTm1DXg32I8mWDDqw,696
1
+ fnschoo1/__init__.py,sha256=WSDGaE349YUVvVkCJW2Z7ZyVBVTTahlxerGH_D7vSY0,197
2
+ fnschoo1/manage.py,sha256=Cr5OtPrRWfEc7KEjW4yYnMKj_qlb0-qpwFRz3vFXvC0,1565
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
@@ -7,7 +7,7 @@ fnschoo1/canteen/forms.py,sha256=4Y75VHpnONdN5hM8aShyr7tbQSElLa-22PQK7fDRflw,229
7
7
  fnschoo1/canteen/models.py,sha256=20r24iNJW0hmPwhY96pQLYaIgqf8kc_Tx76IqORR_LE,5219
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=jQQDyH3yqNUAkzDc9w-cBuKmcYosuAev5RXK3mf0irQ,26196
10
+ fnschoo1/canteen/views.py,sha256=gY-dcBqIAxvZS5ToIHNijU-DDj2GAAaSnP31VTYHF_w,26269
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
@@ -28,7 +28,7 @@ fnschoo1/canteen/templates/canteen/category/delete.html,sha256=MnPyFzjO3HonOljwx
28
28
  fnschoo1/canteen/templates/canteen/category/list.html,sha256=aj81uoA-jmdv8mZT-Y9DxjOHVGrSfI1z0DB1YnJWb4w,2045
29
29
  fnschoo1/canteen/templates/canteen/category/update.html,sha256=8Nzdbe8UorrJHzElkrdqvLaPnUvcvGhrViZB4D86wqo,815
30
30
  fnschoo1/canteen/templates/canteen/consumption/_create.html,sha256=lpST1R0vL1PEI1YE9d0-bcWWpCMH-INjIF-7pweAHuU,1008
31
- fnschoo1/canteen/templates/canteen/consumption/create.html,sha256=KQbx4htFR_KjBJXqVvcZcZFDmRdASD5Hltu7NZF7-g0,14849
31
+ fnschoo1/canteen/templates/canteen/consumption/create.html,sha256=UQOwZ5yS5g98LSxzSdRxUCzzR5R_RID0DGkbq9M_HFc,15568
32
32
  fnschoo1/canteen/templates/canteen/ingredient/close.html,sha256=pLYeJmGaOEJKMUJdZmYzz_n--l28IRDQ4fXvetP_Vsc,200
33
33
  fnschoo1/canteen/templates/canteen/ingredient/create.html,sha256=xZvh0tP_cv2HPQ96JSHChO6Ni23tzHc5YJCUhE2yEqM,807
34
34
  fnschoo1/canteen/templates/canteen/ingredient/create_one.html,sha256=O8EPSvAnEZ-4VJiwFdoyxJrMOoMpRkH6CyfvWwHaVgc,599
@@ -40,7 +40,7 @@ fnschoo1/canteen/templates/canteen/meal_type/delete.html,sha256=1UmCyXD-6lbYl-IE
40
40
  fnschoo1/canteen/templates/canteen/meal_type/list.html,sha256=c5kJUE1OgpRtSrMV4wFwL_gbRSaX_XMM4Zt1JTx34_g,1907
41
41
  fnschoo1/canteen/templates/canteen/meal_type/update.html,sha256=Rfv1TamSFIKHzvUNlgnmrPmfmzrehPpuo5Hv8VF0yek,818
42
42
  fnschoo1/canteen/workbook/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
43
- fnschoo1/canteen/workbook/generate.py,sha256=n6q0s3qoHbKQ-DpaqcJarnTHsomndOb3DtfC66vHprE,83946
43
+ fnschoo1/canteen/workbook/generate.py,sha256=1UUXdeGLdHFzZDGzMFOcoD6rsZtjRAzYFfKLpiRpVps,84102
44
44
  fnschoo1/fnschool/__init__.py,sha256=TmHhzykpKNMoMf6eD-EKvbvmnlzs1XGHtvD55ae1sXs,287
45
45
  fnschoo1/fnschool/asgi.py,sha256=kzkqosS10uBlyBX53EXcsATcvEZmac6nsPzyOHCuucE,393
46
46
  fnschoo1/fnschool/settings.py,sha256=l9Y1iQCivSfmsNfnHltfXLzxP6gG4VMIL4GEZgAp8YM,4357
@@ -50,7 +50,7 @@ fnschoo1/fnschool/wsgi.py,sha256=dQq4S0vZWCz8w5R9KooJeLYTVFXvEgJRYe7NFZwVxU8,393
50
50
  fnschoo1/fnschool/templatetags/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
51
51
  fnschoo1/fnschool/templatetags/fnschool_tags.py,sha256=l5Zov4VlQKpz-69SFftP4kXyMymz-a0D5F_ss_eiFc4,568
52
52
  fnschoo1/locale/en/LC_MESSAGES/django.mo,sha256=M8AB6fmjwlEd761iFlasNWdiEYfE-2nIwBoioGtEVUo,404
53
- fnschoo1/locale/zh_Hans/LC_MESSAGES/django.mo,sha256=P0tb0kB1WEjdQ87eI-sm0GD4l-MI5JKFsKJA1tcNJs8,19747
53
+ fnschoo1/locale/zh_Hans/LC_MESSAGES/django.mo,sha256=LMXr4V7PzsK1AkSxnQmV1a6mDIdXRTJv3H-Om092BHc,19994
54
54
  fnschoo1/profiles/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
55
55
  fnschoo1/profiles/admin.py,sha256=93UCvdODI63KzCDfFFnKmfvCMGCp6FCG9WErE91i79Y,522
56
56
  fnschoo1/profiles/apps.py,sha256=WDu6eceFnDkBFMqquAolMZMo7XPb0ah6l2q2AruTrl4,215
@@ -76,7 +76,7 @@ fnschoo1/static/css/fnschool.css,sha256=nPjOh0vWuuFnZWrXcT2E3j3adL77v_PRyeml65Mv
76
76
  fnschoo1/static/images/favicon.ico,sha256=S8Tf0NsUdHnoYO0SEn-sig6YjB0atIpEtSlm7p1HxjY,5014
77
77
  fnschoo1/static/js/bootstrap.bundle.min.js,sha256=6kw84LCFc4QJzifgkle0FsvQrpt2NVRNPNjSSc9caiM,125881
78
78
  fnschoo1/static/js/bootstrap.min.js,sha256=0SHpZTHghUOz_BNedMzuH00z5lgwOSRKP_KI9G5Ogbk,88597
79
- fnschoo1/static/js/fnschool.js,sha256=T8qklr48qTIfGPAK7y2A8F3x7mb4p3FJKD0ofZEBEOQ,2803
79
+ fnschoo1/static/js/fnschool.js,sha256=A_IsEK7F_X83P-maARL5jDaQm90e1K48zAIv5r-34Vw,3019
80
80
  fnschoo1/static/js/jquery.min.js,sha256=np_WnfpAmUmEO_iheFAJKf6mbm0_laW3Ns4x7kjSlt4,162505
81
81
  fnschoo1/static/js/jquery.slim.min.js,sha256=p5YkbOjgHxX3hTadKlGuDW58NvJ1ldjjokDuDQ_5yXs,129962
82
82
  fnschoo1/static/js/popper.min.js,sha256=O2xdmtEow7gq3I7-0lKjshvxHkBe0hTWrMkbX2fy0XQ,36887
@@ -93,9 +93,14 @@ fnschoo1/templates/includes/_navigation.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRk
93
93
  fnschoo1/templates/includes/_paginator.html,sha256=Z-Hxcdmun4SJ1YcHnWTDLfW8wrngROiBTwr4NZWaPP4,1246
94
94
  fnschoo1/templates/registration/logged_out.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
95
95
  fnschoo1/templates/registration/login.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
96
- fnschool-20251013.81200.824.dist-info/licenses/LICENSE,sha256=2n6rt7r999OuXp8iOqW9we7ORaxWncIbOwN1ILRGR2g,7651
97
- fnschool-20251013.81200.824.dist-info/METADATA,sha256=b-copPlDf-Am6WcOCl1KGXm7KtzvYxL59wSYY5TL9Kk,4752
98
- fnschool-20251013.81200.824.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
99
- fnschool-20251013.81200.824.dist-info/entry_points.txt,sha256=To2PDA9r0qhE0Wq1-M8hEE8uXxTrTe16BOcpKPT-q5g,47
100
- fnschool-20251013.81200.824.dist-info/top_level.txt,sha256=s6ZKnNm94Q0-247a50eI7jDK98uPF6P2kC9Ovd3LUlM,9
101
- fnschool-20251013.81200.824.dist-info/RECORD,,
96
+ fnschool-20251013.81919.815.dist-info/licenses/LICENSE,sha256=2n6rt7r999OuXp8iOqW9we7ORaxWncIbOwN1ILRGR2g,7651
97
+ fnschool-20251013.81919.815.dist-info/METADATA,sha256=yixkF9j3Fzj8y4Qz2QpRMoMB9rQwEV3_vJvgLfl7KZU,4752
98
+ fnschool-20251013.81919.815.dist-info/SOURCES.txt.py,sha256=2LY2mshgNtxI3ICB-oBjyMYgJk2bQqeGFM5J5ay5TQs,4954
99
+ fnschool-20251013.81919.815.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
100
+ fnschool-20251013.81919.815.dist-info/dependency_links.txt.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
101
+ fnschool-20251013.81919.815.dist-info/entry_points.txt,sha256=Ow5nChVFJY3O4TJAIE1ZydMev1MUtgRsT1b8eFP6728,54
102
+ fnschool-20251013.81919.815.dist-info/entry_points.txt.py,sha256=7iOwIx_m9Y6xJt___BZHWJh27LV5hqWnUjmj77MoRys,47
103
+ fnschool-20251013.81919.815.dist-info/requires.txt.py,sha256=PqRcHIQSMPUb271hacYrlSDHwB1WDZmlWUkh6RnBz_g,113
104
+ fnschool-20251013.81919.815.dist-info/top_level.txt,sha256=s6ZKnNm94Q0-247a50eI7jDK98uPF6P2kC9Ovd3LUlM,9
105
+ fnschool-20251013.81919.815.dist-info/top_level.txt.py,sha256=_7CbrSihm0dzBn_tTy2ass_Y2VlkVNT2eylE8mcfwHY,9
106
+ fnschool-20251013.81919.815.dist-info/RECORD,,
@@ -0,0 +1,104 @@
1
+ XXXXXXX
2
+ XXXXXXXXX
3
+ XXXXXXXXXXXXXX
4
+ XXXXXXXXXXXXXXXXXXXXXXXX
5
+ XXXXXXXXXXXXXXXXXXXXXX
6
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
7
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXX
8
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXX
9
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXX
10
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
11
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXX
12
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXX
13
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXX
14
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
15
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
16
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
17
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
18
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
19
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
20
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
21
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
22
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
23
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
24
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
25
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
26
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
27
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
28
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
29
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
30
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
31
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
32
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
33
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
34
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
35
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
36
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
37
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
38
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
39
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
40
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
41
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
42
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
43
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
44
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
45
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
46
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
47
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
48
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXX
49
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
50
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXX
51
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
52
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXX
53
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
54
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
55
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
56
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
57
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
58
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
59
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXX
60
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
61
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
62
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
63
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
64
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXX
65
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
66
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
67
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
68
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
69
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
70
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
71
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
72
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
73
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
74
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
75
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
76
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
77
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
78
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
79
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
80
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
81
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
82
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
83
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
84
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
85
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
86
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
87
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
88
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
89
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
90
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
91
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
92
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
93
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
94
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
95
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
96
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
97
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
98
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
99
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
100
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
101
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
102
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
103
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
104
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ fnschool-cli = fnschoo1.manage:main
@@ -0,0 +1,2 @@
1
+ XXXXXXXXXXXXXXXXX
2
+ XXXXXXXXXXXX X XXXXXXXXXXXXX
@@ -0,0 +1,13 @@
1
+ XXXXXX
2
+ XXXXXX
3
+ XXXXXXXXXX
4
+ XXXXX
5
+ XXXXXXXX
6
+ XXXXXXXXXXXX
7
+ XXXXXXX
8
+ XXXXXXXXXXXXXXXXXXX
9
+ XXXXXXXXXXXXXXXXX
10
+
11
+ XXXXX
12
+
13
+ XXXXX
@@ -0,0 +1 @@
1
+ XXXXXXXX
@@ -1,2 +0,0 @@
1
- [console_scripts]
2
- fnschool-cli = fnschoo1:main