fnschool 20251013.81257.813__py3-none-any.whl → 20251013.81959.843__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 +1 -45
- fnschoo1/canteen/templates/canteen/consumption/create.html +56 -20
- fnschoo1/canteen/views.py +97 -93
- fnschoo1/canteen/workbook/generate.py +4 -2
- fnschoo1/locale/zh_Hans/LC_MESSAGES/django.mo +0 -0
- fnschoo1/manage.py +33 -0
- fnschoo1/static/js/fnschool.js +11 -2
- {fnschool-20251013.81257.813.dist-info → fnschool-20251013.81959.843.dist-info}/METADATA +1 -1
- {fnschool-20251013.81257.813.dist-info → fnschool-20251013.81959.843.dist-info}/RECORD +18 -13
- fnschool-20251013.81959.843.dist-info/SOURCES.txt.py +104 -0
- fnschool-20251013.81959.843.dist-info/dependency_links.txt.py +1 -0
- fnschool-20251013.81959.843.dist-info/entry_points.txt +2 -0
- fnschool-20251013.81959.843.dist-info/entry_points.txt.py +2 -0
- fnschool-20251013.81959.843.dist-info/requires.txt.py +13 -0
- fnschool-20251013.81959.843.dist-info/top_level.txt.py +1 -0
- fnschool-20251013.81257.813.dist-info/entry_points.txt +0 -2
- {fnschool-20251013.81257.813.dist-info → fnschool-20251013.81959.843.dist-info}/WHEEL +0 -0
- {fnschool-20251013.81257.813.dist-info → fnschool-20251013.81959.843.dist-info}/licenses/LICENSE +0 -0
- {fnschool-20251013.81257.813.dist-info → fnschool-20251013.81959.843.dist-info}/top_level.txt +0 -0
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.
|
|
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.81959.843"
|
|
@@ -8,15 +8,22 @@
|
|
|
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
|
-
|
|
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"
|
|
16
23
|
onkeydown="if(event.keyCode==13){list_consumptions();}"
|
|
17
24
|
title="{% trans 'The starting date of storage.' %}"
|
|
18
|
-
id="
|
|
19
|
-
value="{{
|
|
25
|
+
id="storage_date_start_input"
|
|
26
|
+
value="{{ storage_date_start|date:"Y/m/d" }}">
|
|
20
27
|
</input>
|
|
21
28
|
</div>
|
|
22
29
|
<div class="col col-3 col-md-2 col-lg-2">
|
|
@@ -89,14 +96,36 @@
|
|
|
89
96
|
{{ months|json_script:'months' }}
|
|
90
97
|
{{ meal_types|json_script:'meal_types' }}
|
|
91
98
|
{{ date_range|json_script:'date_range' }}
|
|
99
|
+
{{ storage_date_start|json_script:'storage_date_start' }}
|
|
92
100
|
<script>
|
|
93
101
|
var ingredient_ids = JSON.parse($("#ingredient_ids").text())
|
|
94
102
|
var ingredient_ids_length = ingredient_ids.length
|
|
95
103
|
var months = JSON.parse($("#months").text())
|
|
96
104
|
var meal_types = JSON.parse($("#meal_types").text())
|
|
105
|
+
var date_range = JSON.parse($("#date_range").text())
|
|
106
|
+
|
|
107
|
+
var storage_date_start = $('#storage_date_start').text().replace(new RegExp('"', 'g'), "")
|
|
108
|
+
|
|
97
109
|
var dont_submit = false
|
|
98
110
|
|
|
99
|
-
|
|
111
|
+
|
|
112
|
+
function list_consumptions_rapidly() {
|
|
113
|
+
query = {
|
|
114
|
+
'by_week': 'false',
|
|
115
|
+
"rapidly": 'true'
|
|
116
|
+
}
|
|
117
|
+
set_cookies(query)
|
|
118
|
+
update_href(query)
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
function list_consumptions_by_week() {
|
|
122
|
+
query = {
|
|
123
|
+
'by_week': 'true',
|
|
124
|
+
"rapidly": 'false'
|
|
125
|
+
}
|
|
126
|
+
set_cookies(query)
|
|
127
|
+
update_href(query)
|
|
128
|
+
}
|
|
100
129
|
|
|
101
130
|
function get_previous_month_date(date = new Date()) {
|
|
102
131
|
const prevMonthDate = new Date(date);
|
|
@@ -110,6 +139,12 @@
|
|
|
110
139
|
return dayOfWeek === 0 || dayOfWeek === 6;
|
|
111
140
|
}
|
|
112
141
|
|
|
142
|
+
$(document).ready(function() {
|
|
143
|
+
var td1 = $(".table tr > :nth-child(1):first")
|
|
144
|
+
$(".table tr > :nth-child(2)").css("left", td1.width() * 1.05)
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
|
|
113
148
|
$(document).ready(function() {
|
|
114
149
|
$(months).each(function(index, value) {
|
|
115
150
|
$('.workbook-month-select').append(`<option>${value}</option>`)
|
|
@@ -123,6 +158,13 @@
|
|
|
123
158
|
|
|
124
159
|
});
|
|
125
160
|
|
|
161
|
+
$(document).ready(function() {
|
|
162
|
+
if (get_cookie('storage_date_start') === null) {
|
|
163
|
+
set_cookies({
|
|
164
|
+
"storage_date_start": storage_date_start
|
|
165
|
+
})
|
|
166
|
+
}
|
|
167
|
+
});
|
|
126
168
|
|
|
127
169
|
$(document).ready(function() {
|
|
128
170
|
var last_meal_type = ""
|
|
@@ -200,12 +242,6 @@
|
|
|
200
242
|
}
|
|
201
243
|
|
|
202
244
|
|
|
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
245
|
$(document).ready(function() {
|
|
210
246
|
dont_submit = true
|
|
211
247
|
var progress = 0
|
|
@@ -366,20 +402,20 @@
|
|
|
366
402
|
});
|
|
367
403
|
|
|
368
404
|
function list_consumptions() {
|
|
369
|
-
var
|
|
370
|
-
var
|
|
405
|
+
var new_storage_date_start = $('#storage_date_start_input').val()
|
|
406
|
+
var new_storage_date_end = $('#storage_date_end_input').val()
|
|
371
407
|
query = {}
|
|
372
|
-
if (
|
|
373
|
-
query["storage_date_start"] =
|
|
374
|
-
set_simple_cookie("storage_date_start",
|
|
408
|
+
if (new_storage_date_start) {
|
|
409
|
+
query["storage_date_start"] = new_storage_date_start
|
|
410
|
+
set_simple_cookie("storage_date_start", new_storage_date_start)
|
|
375
411
|
} else {
|
|
376
412
|
query["storage_date_start"] = ""
|
|
377
413
|
delete_cookie("storage_date_start")
|
|
378
414
|
}
|
|
379
415
|
|
|
380
|
-
if (
|
|
381
|
-
query["storage_date_end"] =
|
|
382
|
-
set_simple_cookie("storage_date_end",
|
|
416
|
+
if (new_storage_date_end) {
|
|
417
|
+
query["storage_date_end"] = new_storage_date_end
|
|
418
|
+
set_simple_cookie("storage_date_end", new_storage_date_end)
|
|
383
419
|
} else {
|
|
384
420
|
query["storage_date_end"] = ""
|
|
385
421
|
delete_cookie("storage_date_end")
|
|
@@ -395,7 +431,7 @@
|
|
|
395
431
|
position: absolute;
|
|
396
432
|
}
|
|
397
433
|
|
|
398
|
-
#
|
|
434
|
+
#storage_date_start_input,
|
|
399
435
|
#storage_date_end {
|
|
400
436
|
text-align: center;
|
|
401
437
|
font-family: Mono;
|
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
|
-
|
|
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
|
-
|
|
164
|
-
|
|
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
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
@@ -337,10 +297,54 @@ def create_consumptions(request, ingredient_id=None):
|
|
|
337
297
|
"meal_types": meal_types,
|
|
338
298
|
"ingredient_ids": ingredient_ids,
|
|
339
299
|
"months": months,
|
|
300
|
+
"storage_date_start": date_start,
|
|
340
301
|
},
|
|
341
302
|
)
|
|
342
303
|
|
|
343
304
|
|
|
305
|
+
@login_required
|
|
306
|
+
@require_POST
|
|
307
|
+
def new_consumption(request, consumption_id=None):
|
|
308
|
+
form = None
|
|
309
|
+
if consumption_id:
|
|
310
|
+
consumption = Consumption.objects.filter(
|
|
311
|
+
Q(pk=consumption_id)
|
|
312
|
+
& Q(ingredient__user=request.user)
|
|
313
|
+
& Q(is_disabled=False)
|
|
314
|
+
).first()
|
|
315
|
+
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
|
+
):
|
|
322
|
+
consumption.delete()
|
|
323
|
+
return HttpResponse("OK", status=201)
|
|
324
|
+
|
|
325
|
+
form = ConsumptionForm(request.POST, instance=consumption)
|
|
326
|
+
else:
|
|
327
|
+
return HttpResponse("Accepted", status=202)
|
|
328
|
+
|
|
329
|
+
else:
|
|
330
|
+
ingredient = Ingredient.objects.filter(
|
|
331
|
+
Q(user=request.user) & Q(pk=request.POST.get("ingredient"))
|
|
332
|
+
).first()
|
|
333
|
+
if not ingredient:
|
|
334
|
+
return HttpResponse("Accepted", status=202)
|
|
335
|
+
|
|
336
|
+
consumption = Consumption()
|
|
337
|
+
consumption.ingredient = ingredient
|
|
338
|
+
form = ConsumptionForm(request.POST, instance=consumption)
|
|
339
|
+
|
|
340
|
+
if form.is_valid() and not form.instance.is_disabled:
|
|
341
|
+
consumption = form.save(commit=False)
|
|
342
|
+
consumption.save()
|
|
343
|
+
return HttpResponse("OK", status=201)
|
|
344
|
+
|
|
345
|
+
return HttpResponse("Accepted", status=202)
|
|
346
|
+
|
|
347
|
+
|
|
344
348
|
@login_required()
|
|
345
349
|
def delete_ingredient(request, ingredient_id):
|
|
346
350
|
ingredient = get_object_or_404(Ingredient, pk=ingredient_id)
|
|
@@ -1819,10 +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
|
-
_(
|
|
1822
|
+
_(
|
|
1823
|
+
"{meal_type} ({category}, Checked/Storaged at {storage_date})"
|
|
1824
|
+
).format(
|
|
1823
1825
|
meal_type=ingredient.meal_type,
|
|
1824
1826
|
category=ingredient.category,
|
|
1825
|
-
storage_date
|
|
1827
|
+
storage_date=ingredient.storage_date,
|
|
1826
1828
|
),
|
|
1827
1829
|
user.username,
|
|
1828
1830
|
)
|
|
Binary file
|
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
|
|
fnschoo1/static/js/fnschool.js
CHANGED
|
@@ -9,7 +9,16 @@ function get_cookie(name) {
|
|
|
9
9
|
return null
|
|
10
10
|
}
|
|
11
11
|
function delete_cookie(name) {
|
|
12
|
-
document.cookie =
|
|
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.
|
|
3
|
+
Version: 20251013.81959.843
|
|
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=
|
|
2
|
-
fnschoo1/manage.py,sha256=
|
|
1
|
+
fnschoo1/__init__.py,sha256=P5QYmb7ozN6bO6SBiWzHKv5mAxye_K2A3X_5bGBmfXc,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=
|
|
10
|
+
fnschoo1/canteen/views.py,sha256=AXMO6dEMjBMTO-D6sWEV2sDwYZcms0L6hSgq8NHvVfw,26315
|
|
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=
|
|
31
|
+
fnschoo1/canteen/templates/canteen/consumption/create.html,sha256=NOUKb48EueRHHN3tb1KwTkCsmpWwdWWCwX3Kwqi-A7o,15954
|
|
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=
|
|
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=
|
|
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=
|
|
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.
|
|
97
|
-
fnschool-20251013.
|
|
98
|
-
fnschool-20251013.
|
|
99
|
-
fnschool-20251013.
|
|
100
|
-
fnschool-20251013.
|
|
101
|
-
fnschool-20251013.
|
|
96
|
+
fnschool-20251013.81959.843.dist-info/licenses/LICENSE,sha256=2n6rt7r999OuXp8iOqW9we7ORaxWncIbOwN1ILRGR2g,7651
|
|
97
|
+
fnschool-20251013.81959.843.dist-info/METADATA,sha256=DC-zwFsEtLabNxJmkbl26HyKqHjaJ_6S-Mm5MvvktP8,4752
|
|
98
|
+
fnschool-20251013.81959.843.dist-info/SOURCES.txt.py,sha256=2LY2mshgNtxI3ICB-oBjyMYgJk2bQqeGFM5J5ay5TQs,4954
|
|
99
|
+
fnschool-20251013.81959.843.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
100
|
+
fnschool-20251013.81959.843.dist-info/dependency_links.txt.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
|
|
101
|
+
fnschool-20251013.81959.843.dist-info/entry_points.txt,sha256=Ow5nChVFJY3O4TJAIE1ZydMev1MUtgRsT1b8eFP6728,54
|
|
102
|
+
fnschool-20251013.81959.843.dist-info/entry_points.txt.py,sha256=7iOwIx_m9Y6xJt___BZHWJh27LV5hqWnUjmj77MoRys,47
|
|
103
|
+
fnschool-20251013.81959.843.dist-info/requires.txt.py,sha256=PqRcHIQSMPUb271hacYrlSDHwB1WDZmlWUkh6RnBz_g,113
|
|
104
|
+
fnschool-20251013.81959.843.dist-info/top_level.txt,sha256=s6ZKnNm94Q0-247a50eI7jDK98uPF6P2kC9Ovd3LUlM,9
|
|
105
|
+
fnschool-20251013.81959.843.dist-info/top_level.txt.py,sha256=_7CbrSihm0dzBn_tTy2ass_Y2VlkVNT2eylE8mcfwHY,9
|
|
106
|
+
fnschool-20251013.81959.843.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 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
XXXXXXXX
|
|
File without changes
|
{fnschool-20251013.81257.813.dist-info → fnschool-20251013.81959.843.dist-info}/licenses/LICENSE
RENAMED
|
File without changes
|
{fnschool-20251013.81257.813.dist-info → fnschool-20251013.81959.843.dist-info}/top_level.txt
RENAMED
|
File without changes
|