fnschool 20251027.81653.841__py3-none-any.whl → 20251101.82236.812__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 (61) hide show
  1. fnschoo1/__init__.py +1 -1
  2. fnschoo1/canteen/templates/canteen/ingredient/list.html +5 -2
  3. fnschoo1/fnhome/admin.py +3 -0
  4. fnschoo1/fnhome/apps.py +6 -0
  5. fnschoo1/fnhome/migrations/__init__.py +0 -0
  6. fnschoo1/fnhome/models.py +3 -0
  7. fnschoo1/fnhome/templates/fnhome/home.html +7 -0
  8. fnschoo1/fnhome/urls.py +13 -0
  9. fnschoo1/fnhome/views.py +50 -0
  10. fnschoo1/fnprofile/migrations/0001_initial.py +1 -1
  11. fnschoo1/fnprofile/migrations/0003_alter_fnuser_options_alter_fnuser_groups_and_more.py +45 -0
  12. fnschoo1/fnprofile/views.py +7 -5
  13. fnschoo1/fnschool/settings.py +3 -3
  14. fnschoo1/fnschool/urls.py +2 -1
  15. fnschoo1/fnschool/views.py +2 -2
  16. fnschoo1/locale/zh_Hans/LC_MESSAGES/django.mo +0 -0
  17. fnschoo1/manage.py +10 -0
  18. fnschoo1/patches/202511012053_copy_profiles_to_fnprofile.py +67 -0
  19. fnschoo1/patches/202511012053_copy_profiles_to_fnprofile_data/profiles/__init__.py +0 -0
  20. fnschoo1/{profiles → patches/202511012053_copy_profiles_to_fnprofile_data/profiles}/apps.py +2 -4
  21. fnschoo1/{profiles → patches/202511012053_copy_profiles_to_fnprofile_data/profiles}/migrations/0007_alter_profile_created_at.py +1 -1
  22. fnschoo1/patches/202511012053_copy_profiles_to_fnprofile_data/profiles/migrations/__init__.py +0 -0
  23. fnschoo1/{profiles → patches/202511012053_copy_profiles_to_fnprofile_data/profiles}/models.py +0 -16
  24. fnschoo1/patches/202511012053_copy_profiles_to_fnprofile_data/profiles/tests.py +3 -0
  25. fnschoo1/{fnschool/settings_fn_profile_migration_0001.py → patches/202511012053_copy_profiles_to_fnprofile_data/settings.py} +6 -5
  26. fnschoo1/patches/__init__.py +4 -0
  27. fnschoo1/static/js/fnschool.js +12 -3
  28. fnschoo1/templates/includes/_header.html +5 -3
  29. {fnschool-20251027.81653.841.dist-info → fnschool-20251101.82236.812.dist-info}/METADATA +1 -1
  30. {fnschool-20251027.81653.841.dist-info → fnschool-20251101.82236.812.dist-info}/RECORD +58 -47
  31. fnschool-20251101.82236.812.dist-info/dependency_links.txt.py +1 -0
  32. fnschoo1/fnprofile/migrations/0003_alter_fnuser_options.py +0 -20
  33. fnschoo1/profiles/__init__.py +0 -7
  34. fnschoo1/profiles/migrations/0008_alter_profile_groups_alter_profile_user_permissions.py +0 -38
  35. /fnschoo1/{profiles/migrations → fnhome}/__init__.py +0 -0
  36. /fnschoo1/{profiles → fnhome}/tests.py +0 -0
  37. /fnschool-20251027.81653.841.dist-info/dependency_links.txt.py → /fnschoo1/patches/202511012053_copy_profiles_to_fnprofile_data/__init__.py +0 -0
  38. /fnschoo1/{profiles → patches/202511012053_copy_profiles_to_fnprofile_data/profiles}/admin.py +0 -0
  39. /fnschoo1/{profiles → patches/202511012053_copy_profiles_to_fnprofile_data/profiles}/forms.py +0 -0
  40. /fnschoo1/{profiles → patches/202511012053_copy_profiles_to_fnprofile_data/profiles}/migrations/0001_initial.py +0 -0
  41. /fnschoo1/{profiles → patches/202511012053_copy_profiles_to_fnprofile_data/profiles}/migrations/0002_alter_profile_bio.py +0 -0
  42. /fnschoo1/{profiles → patches/202511012053_copy_profiles_to_fnprofile_data/profiles}/migrations/0003_alter_profile_options_alter_profile_address_and_more.py +0 -0
  43. /fnschoo1/{profiles → patches/202511012053_copy_profiles_to_fnprofile_data/profiles}/migrations/0004_profile_gender.py +0 -0
  44. /fnschoo1/{profiles → patches/202511012053_copy_profiles_to_fnprofile_data/profiles}/migrations/0005_alter_profile_gender.py +0 -0
  45. /fnschoo1/{profiles → patches/202511012053_copy_profiles_to_fnprofile_data/profiles}/migrations/0006_profile_created_at_profile_updated_at.py +0 -0
  46. /fnschoo1/{profiles → patches/202511012053_copy_profiles_to_fnprofile_data/profiles}/signals.py +0 -0
  47. /fnschoo1/{profiles → patches/202511012053_copy_profiles_to_fnprofile_data/profiles}/templates/profiles/create.html +0 -0
  48. /fnschoo1/{profiles → patches/202511012053_copy_profiles_to_fnprofile_data/profiles}/templates/profiles/detail.html +0 -0
  49. /fnschoo1/{profiles → patches/202511012053_copy_profiles_to_fnprofile_data/profiles}/templates/profiles/edit.html +0 -0
  50. /fnschoo1/{profiles → patches/202511012053_copy_profiles_to_fnprofile_data/profiles}/templates/profiles/log_in.html +0 -0
  51. /fnschoo1/{profiles → patches/202511012053_copy_profiles_to_fnprofile_data/profiles}/templates/profiles/log_out.html +0 -0
  52. /fnschoo1/{profiles → patches/202511012053_copy_profiles_to_fnprofile_data/profiles}/urls.py +0 -0
  53. /fnschoo1/{profiles → patches/202511012053_copy_profiles_to_fnprofile_data/profiles}/views.py +0 -0
  54. {fnschool-20251027.81653.841.dist-info → fnschool-20251101.82236.812.dist-info}/SOURCES.txt.py +0 -0
  55. {fnschool-20251027.81653.841.dist-info → fnschool-20251101.82236.812.dist-info}/WHEEL +0 -0
  56. {fnschool-20251027.81653.841.dist-info → fnschool-20251101.82236.812.dist-info}/entry_points.txt +0 -0
  57. {fnschool-20251027.81653.841.dist-info → fnschool-20251101.82236.812.dist-info}/entry_points.txt.py +0 -0
  58. {fnschool-20251027.81653.841.dist-info → fnschool-20251101.82236.812.dist-info}/licenses/LICENSE +0 -0
  59. {fnschool-20251027.81653.841.dist-info → fnschool-20251101.82236.812.dist-info}/requires.txt.py +0 -0
  60. {fnschool-20251027.81653.841.dist-info → fnschool-20251101.82236.812.dist-info}/top_level.txt +0 -0
  61. {fnschool-20251027.81653.841.dist-info → fnschool-20251101.82236.812.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__ = "20251027.81653.841"
9
+ __version__ = "20251101.82236.812"
@@ -36,7 +36,7 @@
36
36
  </div>
37
37
  <hr />
38
38
  <div class="container">
39
- <div class="table-responsive-lg table-container">
39
+ <div class="table-responsive table-responsive-lg table-container">
40
40
  <table class="table table-bordered table-ingredient table-striped table-hover table-condensed">
41
41
  <thead>
42
42
  <tr>
@@ -65,15 +65,17 @@
65
65
  <div class="form-check"
66
66
  title="{% trans 'It helps you check the ingredients.' %}">
67
67
  <input type="checkbox"
68
+ style="cursor: pointer"
68
69
  class="form-check-input"
69
70
  id="ingredient_free_nark_{{ ingredient.id }}" />
70
71
  <label class="form-check-label"
72
+ style="cursor: pointer"
71
73
  for="ingredient_free_nark_{{ ingredient.id }}">
72
74
  {{ forloop.counter }}
73
75
  </label>
74
76
  </div>
75
77
  </th>
76
- <td>{{ ingredient.storage_date }}</td>
78
+ <td>{{ ingredient.storage_date|date:"Y.m.d" }}</td>
77
79
  <td>{{ ingredient.name }}</td>
78
80
  <td>{{ ingredient.meal_type }}</td>
79
81
  <td>{{ ingredient.category }}</td>
@@ -169,6 +171,7 @@
169
171
  <style>
170
172
  .table-container {
171
173
  overflow: auto;
174
+
172
175
  }
173
176
 
174
177
  .table-container thead th {
@@ -0,0 +1,3 @@
1
+ from django.contrib import admin
2
+
3
+ # Register your models here.
@@ -0,0 +1,6 @@
1
+ from django.apps import AppConfig
2
+
3
+
4
+ class FnhomeConfig(AppConfig):
5
+ default_auto_field = "django.db.models.BigAutoField"
6
+ name = "fnhome"
File without changes
@@ -0,0 +1,3 @@
1
+ from django.db import models
2
+
3
+ # Create your models here.
@@ -0,0 +1,7 @@
1
+ {% extends "base/document.html" %}
2
+ {% load tz %}
3
+ {% load crispy_forms_tags %}
4
+ {% block title %}
5
+ {% trans "FNSCHOOL Home" %}
6
+ {% endblock %}
7
+ {% block content %}{% endblock %}
@@ -0,0 +1,13 @@
1
+ from django.contrib import admin
2
+ from django.urls import include, path
3
+
4
+ from . import views
5
+
6
+ app_name = "fnhome"
7
+
8
+ urlpatterns = [
9
+ path("#", views.home, name="home"),
10
+ path("", views.home, name="home"),
11
+ ]
12
+
13
+ # The end.
@@ -0,0 +1,50 @@
1
+ import io
2
+ import re
3
+ from datetime import date, datetime
4
+ from decimal import (
5
+ ROUND_DOWN,
6
+ ROUND_FLOOR,
7
+ ROUND_HALF_UP,
8
+ Decimal,
9
+ getcontext,
10
+ localcontext,
11
+ )
12
+ from pathlib import Path
13
+
14
+ import numpy as np
15
+ import pandas as pd
16
+ from dateutil import parser as date_parser
17
+ from dateutil.relativedelta import relativedelta
18
+ from django.conf import settings
19
+ from django.contrib.auth.decorators import login_required
20
+ from django.contrib.auth.mixins import LoginRequiredMixin
21
+ from django.contrib.staticfiles.storage import staticfiles_storage
22
+ from django.core.paginator import EmptyPage, PageNotAnInteger, Paginator
23
+ from django.db.models import (
24
+ DecimalField,
25
+ ExpressionWrapper,
26
+ F,
27
+ IntegerField,
28
+ Q,
29
+ Sum,
30
+ Value,
31
+ )
32
+ from django.db.models.functions import Coalesce
33
+ from django.http import HttpResponse
34
+ from django.shortcuts import get_object_or_404, redirect, render
35
+ from django.urls import reverse_lazy
36
+ from django.utils.encoding import escape_uri_path
37
+ from django.views.decorators.http import require_POST
38
+ from django.views.generic import (
39
+ CreateView,
40
+ DeleteView,
41
+ DetailView,
42
+ ListView,
43
+ UpdateView,
44
+ )
45
+
46
+ # Create your views here.
47
+
48
+
49
+ def home(request):
50
+ return render(request, "fnhome/home.html")
@@ -1,4 +1,4 @@
1
- # Generated by Django 4.2.25 on 2025-10-26 14:18
1
+ # Generated by Django 4.2.25 on 2025-10-27 13:10
2
2
 
3
3
  import django.contrib.auth.models
4
4
  import django.contrib.auth.validators
@@ -0,0 +1,45 @@
1
+ # Generated by Django 4.2.25 on 2025-10-27 13:34
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ("auth", "0012_alter_user_first_name_max_length"),
10
+ ("fnprofile", "0002_auto_20251026_2235"),
11
+ ]
12
+
13
+ operations = [
14
+ migrations.AlterModelOptions(
15
+ name="fnuser",
16
+ options={
17
+ "verbose_name": "用户信息",
18
+ "verbose_name_plural": "用户信息",
19
+ },
20
+ ),
21
+ migrations.AlterField(
22
+ model_name="fnuser",
23
+ name="groups",
24
+ field=models.ManyToManyField(
25
+ blank=True,
26
+ help_text="这个用户所属的组。",
27
+ related_name="fn_user_groups",
28
+ related_query_name="fn_user",
29
+ to="auth.group",
30
+ verbose_name="groups",
31
+ ),
32
+ ),
33
+ migrations.AlterField(
34
+ model_name="fnuser",
35
+ name="user_permissions",
36
+ field=models.ManyToManyField(
37
+ blank=True,
38
+ help_text="给这个用户指定权限。",
39
+ related_name="fn_user_permissions",
40
+ related_query_name="fn_user",
41
+ to="auth.permission",
42
+ verbose_name="user permissions",
43
+ ),
44
+ ),
45
+ ]
@@ -22,7 +22,7 @@ def fnprofile_new(request):
22
22
  user.username = form.cleaned_data["username"]
23
23
  user.save()
24
24
  login(request, user)
25
- return redirect("home")
25
+ return redirect("fnhome:home")
26
26
  else:
27
27
  form = FnuserForm()
28
28
 
@@ -38,7 +38,9 @@ def fnprofile_log_in(request):
38
38
  user = authenticate(request, username=username, password=password)
39
39
  if user is not None:
40
40
  login(request, user)
41
- next_url = request.POST.get("next") or reverse_lazy("home")
41
+ next_url = request.POST.get("next") or reverse_lazy(
42
+ "fnhome:home"
43
+ )
42
44
  return redirect(next_url)
43
45
  else:
44
46
  form = FnuserLoginForm()
@@ -47,7 +49,7 @@ def fnprofile_log_in(request):
47
49
 
48
50
  def fnprofile_log_out(request):
49
51
  logout(request)
50
- return redirect("home")
52
+ return redirect("fnhome:home")
51
53
 
52
54
 
53
55
  @login_required
@@ -58,9 +60,9 @@ def fnprofile_edit(request):
58
60
  if form.is_valid():
59
61
  form.save()
60
62
  messages.success(
61
- request, _("Fnuser has been updated successfully!")
63
+ request, _("Your information has been updated successfully!")
62
64
  )
63
- return redirect("home")
65
+ return redirect("fnhome:home")
64
66
  else:
65
67
  form = FnuserForm(instance=request.user)
66
68
  return render(request, "fnprofile/edit.html", {"form": form})
@@ -19,7 +19,6 @@ from django.utils.translation import gettext_lazy as _
19
19
  # Build paths inside the project like this: BASE_DIR / 'subdir'.
20
20
  BASE_DIR = Path(__file__).resolve().parent.parent
21
21
 
22
-
23
22
  # Quick-start development settings - unsuitable for production
24
23
  # See https://docs.djangoproject.com/en/4.2/howto/deployment/checklist/
25
24
 
@@ -49,8 +48,9 @@ INSTALLED_APPS = [
49
48
  # fnschool apps.
50
49
  "fnschool",
51
50
  "fnprofile",
52
- "profiles",
51
+ # "profiles",
53
52
  "canteen",
53
+ "fnhome",
54
54
  ]
55
55
 
56
56
  CRISPY_ALLOWED_TEMPLATE_PACKS = "bootstrap5"
@@ -108,7 +108,7 @@ DATABASES = {
108
108
  # Password validation
109
109
  # https://docs.djangoproject.com/en/4.2/ref/settings/#auth-password-validators
110
110
  AUTH_USER_MODEL = "fnprofile.Fnuser"
111
- ## AUTH_USER_MODEL = "profiles.Profile"
111
+ ## AUTH_USER_MODEL = "auth.User"
112
112
  AUTH_PASSWORD_VALIDATORS = [
113
113
  {
114
114
  "NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator",
fnschoo1/fnschool/urls.py CHANGED
@@ -25,7 +25,8 @@ from django.views.static import serve
25
25
  from . import views
26
26
 
27
27
  urlpatterns = [
28
- path("", views.home_view, name="home"),
28
+ path("", include("fnhome.urls", namespace="fnhome")),
29
+ path("home/", include("fnhome.urls", namespace="fnhome0")),
29
30
  path("admin/", admin.site.urls),
30
31
  path("i18n/", include("django.conf.urls.i18n")),
31
32
  path("fnprofile/", include("fnprofile.urls")),
@@ -1,9 +1,9 @@
1
1
  from django.http import HttpResponse
2
- from django.shortcuts import render
2
+ from django.shortcuts import get_object_or_404, redirect, render
3
3
 
4
4
 
5
5
  def home_view(request):
6
- return render(request, "home.html")
6
+ return redirect("fnhome:home")
7
7
 
8
8
 
9
9
  # The end.
fnschoo1/manage.py CHANGED
@@ -38,6 +38,16 @@ def main():
38
38
  os.chdir(FNSCHOOL_PATH)
39
39
  sys.argv[0] = "manage.py"
40
40
 
41
+ if "202511012053_copy_profiles_to_fnprofile" in sys.argv:
42
+ patche_path = (
43
+ FNSCHOOL_PATH
44
+ / "patches"
45
+ / "202511012053_copy_profiles_to_fnprofile.py"
46
+ )
47
+ patche_path = patche_path.as_posix()
48
+ os.system(f"python3 {patche_path} run")
49
+ return
50
+
41
51
  if len(sys.argv) < 2:
42
52
  local_port = "8230"
43
53
  local_url = "http://127.0.0.1:" + local_port
@@ -0,0 +1,67 @@
1
+ import os
2
+ import shutil
3
+ import sqlite3
4
+ import sys
5
+ from pathlib import Path
6
+
7
+ file_path = Path(__file__)
8
+ data_path = Path(file_path.with_suffix("").as_posix() + "_data")
9
+ data_name = data_path.stem
10
+
11
+ settings_temp_path = data_path / "settings.py"
12
+ profiles_path = data_path / "profiles"
13
+
14
+ patches_path = file_path.parent
15
+ fnscho1_path = patches_path.parent
16
+ src_path = fnscho1_path.parent
17
+ db_path = fnscho1_path / "db.sqlite3"
18
+
19
+ patch_name = file_path.stem
20
+ settings_temp_name = f"patches.{data_name}.settings"
21
+
22
+ conn = sqlite3.connect(db_path.as_posix())
23
+ cursor = conn.cursor()
24
+ cursor.execute(
25
+ "SELECT name FROM sqlite_master WHERE type='table' AND name=?",
26
+ ("fnprofile_fnuser",),
27
+ )
28
+ fnprofile_fnuser_exists = cursor.fetchone() is not None
29
+
30
+
31
+ def run():
32
+ if fnprofile_fnuser_exists:
33
+ print((f"Patch {0} had been applied successfully!").format(patch_name))
34
+ return
35
+
36
+ os.system(
37
+ ("python manage.py migrate --settings {0}").format(settings_temp_name)
38
+ )
39
+ os.system(
40
+ ("python manage.py makemigrations --settings {0}").format(
41
+ settings_temp_name
42
+ )
43
+ )
44
+ print((f"Patch {0} applied successfully!").format(patch_name))
45
+
46
+
47
+ def rollback():
48
+ print((f"Patch {0} rolled back!").format(patch_name))
49
+
50
+
51
+ def main():
52
+ if len(sys.argv) < 2:
53
+ print("Usage: python script.py <function_name>")
54
+ sys.exit(1)
55
+
56
+ func_name = sys.argv[1]
57
+
58
+ function_dict = {"run": run, "rollback": rollback}
59
+
60
+ if func_name in function_dict:
61
+ function_dict[func_name]()
62
+ else:
63
+ print(f"Error: Function '{func_name}' not found.")
64
+
65
+
66
+ if __name__ == "__main__":
67
+ main()
@@ -3,10 +3,8 @@ from django.apps import AppConfig
3
3
 
4
4
  class ProfilesConfig(AppConfig):
5
5
  default_auto_field = "django.db.models.BigAutoField"
6
- name = "profiles"
7
-
8
- def ready(self):
9
- import profiles.signals
6
+ # name = "profiles"
7
+ name = "patches.202511012053_copy_profiles_to_fnprofile_data.profiles"
10
8
 
11
9
 
12
10
  # The end.
@@ -1,4 +1,4 @@
1
- # Generated by Django 4.2.25 on 2025-10-26 14:16
1
+ # Generated by Django 4.2.25 on 2025-11-01 14:26
2
2
 
3
3
  from django.db import migrations, models
4
4
 
@@ -21,22 +21,6 @@ class Gender(models.TextChoices):
21
21
 
22
22
 
23
23
  class Profile(AbstractUser, PermissionsMixin):
24
- groups = models.ManyToManyField(
25
- "auth.Group",
26
- verbose_name="groups",
27
- blank=True,
28
- help_text=_("The groups this user belongs to."),
29
- related_name="profile_groups",
30
- related_query_name="profile",
31
- )
32
- user_permissions = models.ManyToManyField(
33
- "auth.Permission",
34
- verbose_name="user permissions",
35
- blank=True,
36
- help_text=_("Specific permissions for this user."),
37
- related_name="profile_permissions",
38
- related_query_name="profile",
39
- )
40
24
  phone = models.CharField(
41
25
  max_length=15, blank=True, null=True, verbose_name=_("Phone Number")
42
26
  )
@@ -0,0 +1,3 @@
1
+ from django.test import TestCase
2
+
3
+ # Create your tests here.
@@ -17,8 +17,8 @@ from django.urls import reverse_lazy
17
17
  from django.utils.translation import gettext_lazy as _
18
18
 
19
19
  # Build paths inside the project like this: BASE_DIR / 'subdir'.
20
- BASE_DIR = Path(__file__).resolve().parent.parent
21
-
20
+ BASE_DIR = Path(__file__).resolve().parent.parent.parent
21
+ print(BASE_DIR)
22
22
 
23
23
  # Quick-start development settings - unsuitable for production
24
24
  # See https://docs.djangoproject.com/en/4.2/howto/deployment/checklist/
@@ -49,8 +49,9 @@ INSTALLED_APPS = [
49
49
  # fnschool apps.
50
50
  "fnschool",
51
51
  "fnprofile",
52
- "profiles",
52
+ "patches.202511012053_copy_profiles_to_fnprofile_data.profiles",
53
53
  "canteen",
54
+ "fnhome",
54
55
  ]
55
56
 
56
57
  CRISPY_ALLOWED_TEMPLATE_PACKS = "bootstrap5"
@@ -107,7 +108,7 @@ DATABASES = {
107
108
 
108
109
  # Password validation
109
110
  # https://docs.djangoproject.com/en/4.2/ref/settings/#auth-password-validators
110
- ## AUTH_USER_MODEL = "fn_profile.FnUser"
111
+ ## AUTH_USER_MODEL = "fnprofile.Fnuser"
111
112
  AUTH_USER_MODEL = "profiles.Profile"
112
113
  AUTH_PASSWORD_VALIDATORS = [
113
114
  {
@@ -166,7 +167,7 @@ DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField"
166
167
  MEDIA_URL = "/media/"
167
168
  MEDIA_ROOT = os.path.join(BASE_DIR, "media")
168
169
 
169
- LOGIN_URL = reverse_lazy("profile:log_in")
170
+ LOGIN_URL = reverse_lazy("fnprofile:log_in")
170
171
 
171
172
  _settings_path = Path(__file__).parent / "_settings.py"
172
173
  if _settings_path.exists():
@@ -0,0 +1,4 @@
1
+ import os
2
+ import sqlite3
3
+ import sys
4
+ from pathlib import Path
@@ -3,7 +3,7 @@ $(document).ready(function () {
3
3
  if (messages.length) {
4
4
  messages.css({
5
5
  position: 'absolute',
6
- top: $('.navbar').height(),
6
+ top: $('.navbar').height() * 1.45,
7
7
  width: '100%',
8
8
  })
9
9
  setTimeout(function () {
@@ -95,8 +95,17 @@ function open_small_window(url) {
95
95
  const width = Math.round(screen.width * size_times)
96
96
  const height = Math.round(screen.height * size_times)
97
97
  const left = Math.round((screen.width - width) / 2)
98
- const top = Math.round((screen.height - height) / 2)
99
- const windowFeatures = `width=${width},height=${height},left=${left},top=${top},resizable=yes,scrollbars=yes`
98
+ const _top = Math.round((screen.height - height) / 2)
99
+
100
+ const left0 = Math.round((screen.width - height) / 2)
101
+ const _top0 = Math.round((screen.height - width) / 2)
102
+
103
+ var _width_ = width
104
+ var _height_ = height
105
+ var _left_ = left
106
+ var _top_ = _top
107
+
108
+ const windowFeatures = `width=${_width_},height=${_height_},left=${_left_},top=${_top_},resizable=yes,scrollbars=yes`
100
109
  window.open(url, '_blank', windowFeatures)
101
110
  }
102
111
 
@@ -2,7 +2,7 @@
2
2
  {% load i18n %}
3
3
  <nav class="navbar navbar-expand-lg navbar-dark bg-dark text-white fixed-top">
4
4
  <div class="container">
5
- <a class="navbar-brand" href="{% url 'home' %}">
5
+ <a class="navbar-brand" href="{% url 'fnhome:home' %}">
6
6
  <img src="{% static '/images/favicon.ico' %}"
7
7
  alt="Logo"
8
8
  width="30"
@@ -21,7 +21,9 @@
21
21
  <div class="collapse navbar-collapse" id="navbarSupportedContent">
22
22
  <ul class="navbar-nav me-auto mb-2 mb-lg-0">
23
23
  <li class="nav-item">
24
- <a class="nav-link active" aria-current="page" href="{% url 'home' %}">{% trans "Home" %}</a>
24
+ <a class="nav-link active"
25
+ aria-current="page"
26
+ href="{% url 'fnhome:home' %}">{% trans "Home" %}</a>
25
27
  </li>
26
28
  <li class="nav-item">
27
29
  <a class="nav-link" href="{% url 'canteen:list_ingredients' %}">{% trans "Canteen" %}</a>
@@ -92,7 +94,7 @@
92
94
  {% if messages %}
93
95
  <div class="messages">
94
96
  {% for message in messages %}
95
- <div class="alert alert-{{ message.tags }}">
97
+ <div class="alert alert-{{ message.tags }} p-2 m-0">
96
98
  {{ message }}
97
99
  <span class="btn-close mx-2" title="{% trans "Hide messages." %}"></span>
98
100
  </div>
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fnschool
3
- Version: 20251027.81653.841
3
+ Version: 20251101.82236.812
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=okBXJVxN7zEzkLb9Nrc-s1XXTG5nj62Bhpl_QJL_usQ,197
2
- fnschoo1/manage.py,sha256=VZIol9q_Dhg81_KJ9Jfq-L5O8ubQelShkA-cZVJ1S6E,1539
1
+ fnschoo1/__init__.py,sha256=QXiZ_JOJ0Aj0ambnFOhIZsMzXG3SfbguoKhBDn9GNx0,197
2
+ fnschoo1/manage.py,sha256=0zVlx8Y8tfc0tLAz9oeWDXHG-L0sy5AkI3cX6wYBPcY,1853
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
@@ -40,7 +40,7 @@ fnschoo1/canteen/templates/canteen/ingredient/close.html,sha256=pLYeJmGaOEJKMUJd
40
40
  fnschoo1/canteen/templates/canteen/ingredient/create.html,sha256=i4ajPDpXBTUp08lIiwn0wZoNEohyXlX3G64zG1lmIcs,839
41
41
  fnschoo1/canteen/templates/canteen/ingredient/create_one.html,sha256=y9EAKXmyIrlp5-DxHd86l1rMtB16KuOjPMbPiLAN_ag,615
42
42
  fnschoo1/canteen/templates/canteen/ingredient/delete.html,sha256=npUtDGV7KK2jvc2AkiNlK6F2wUsKwLB5DQuBULm1pW8,1227
43
- fnschoo1/canteen/templates/canteen/ingredient/list.html,sha256=7hUO0vK7-1Y_JmXsFW_RC-3vRFwdB7Ak_Pz7xe393WI,6057
43
+ fnschoo1/canteen/templates/canteen/ingredient/list.html,sha256=VqZv_VflBMTlGiZgyxN04sFMy8eqKsW0F_OsRkxh08o,6186
44
44
  fnschoo1/canteen/templates/canteen/ingredient/update.html,sha256=JwW8dVQ1fzvxjA32RvRSSqrYzPPaajObvy7D45gz5pc,835
45
45
  fnschoo1/canteen/templates/canteen/meal_type/create.html,sha256=OIxOcAa3Pp3OPT-Z0PRLINfZ08CO61ulNDU-YJA6EKI,612
46
46
  fnschoo1/canteen/templates/canteen/meal_type/delete.html,sha256=i9PBX3ShXU4Az62MEawAuDWM5jwOmKByywizhdvuSTI,1567
@@ -48,6 +48,15 @@ fnschoo1/canteen/templates/canteen/meal_type/list.html,sha256=RQ2HgB1BLL1Zc_l_ie
48
48
  fnschoo1/canteen/templates/canteen/meal_type/update.html,sha256=vqqyuC1m2CnPd3KrcjA8t4hbJslT001s4XvcYpkQmO0,834
49
49
  fnschoo1/canteen/workbook/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
50
50
  fnschoo1/canteen/workbook/generate.py,sha256=wmqt5eFxmZRZdasMTsuc1AbntwOpUN4uVOtjfpM2j1k,109350
51
+ fnschoo1/fnhome/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
52
+ fnschoo1/fnhome/admin.py,sha256=suMo4x8I3JBxAFBVIdE-5qnqZ6JAZV0FESABHOSc-vg,63
53
+ fnschoo1/fnhome/apps.py,sha256=5O2BYupjNlGLDUQQ7Bj8_7FmUttyq9u4LvMuVXH_C0Y,144
54
+ fnschoo1/fnhome/models.py,sha256=Vjc0p2XbAPgE6HyTF6vll98A4eDhA5AvaQqsc4kQ9AQ,57
55
+ fnschoo1/fnhome/tests.py,sha256=mrbGGRNg5jwbTJtWWa7zSKdDyeB4vmgZCRc2nk6VY-g,60
56
+ fnschoo1/fnhome/urls.py,sha256=Ba6QvsfD1R6X_Bl2nyvFjBitMwSVqyoKQstINBCH2JI,223
57
+ fnschoo1/fnhome/views.py,sha256=c3BTHRNIX3sZWr3zzcmAMPtZmLjthEoQabN9QsJbTUw,1252
58
+ fnschoo1/fnhome/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
59
+ fnschoo1/fnhome/templates/fnhome/home.html,sha256=qB1wliqu0QlBWFmXEOkCNTXn3QeCyWpbaspdrFs7hzo,175
51
60
  fnschoo1/fnprofile/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
52
61
  fnschoo1/fnprofile/admin.py,sha256=DdBM3Haggw2GwO2rxcQ16KT-QnTun8tQ8W0iELhQv2w,519
53
62
  fnschoo1/fnprofile/apps.py,sha256=cHx1hkuyEWo3ENyeWn8bdSNcvsir-dp__hl_ZjuNU0I,218
@@ -56,10 +65,10 @@ fnschoo1/fnprofile/models.py,sha256=IQO32PqmLle3XNSs4efA0pzhSBcY7yBvVFWol9C7nm8,
56
65
  fnschoo1/fnprofile/signals.py,sha256=n6PR2VdFNHUidD_k6S2xG2RHQjiguIAeK1foLRMhtbM,492
57
66
  fnschoo1/fnprofile/tests.py,sha256=mrbGGRNg5jwbTJtWWa7zSKdDyeB4vmgZCRc2nk6VY-g,60
58
67
  fnschoo1/fnprofile/urls.py,sha256=1vDGl43a5A1EGtpuUaqMbdAW8oa0fvx8RRVBw9Akxog,437
59
- fnschoo1/fnprofile/views.py,sha256=3XOa5jwSqaTh_H8IEbg8GAxC3vp-0PY10tgFJX7DvU4,2206
60
- fnschoo1/fnprofile/migrations/0001_initial.py,sha256=guAfLpQG4pGXXQHTqaEI8EMUiuCjsuheiHn-dV8iDtY,7484
68
+ fnschoo1/fnprofile/views.py,sha256=pBj4TtWGK-Wr_WNIAoZt9sjwLS5ohSrQCmcUiprgc9s,2282
69
+ fnschoo1/fnprofile/migrations/0001_initial.py,sha256=J7HU2Yajy9gO7w5Ox4t_e0-8tShUooMsiyjg65rjSno,7484
61
70
  fnschoo1/fnprofile/migrations/0002_auto_20251026_2235.py,sha256=kv0fO28-5NQx8nFSp39pTOm2zd5kKy8gIXisOzTrGwo,1239
62
- fnschoo1/fnprofile/migrations/0003_alter_fnuser_options.py,sha256=TpzLYSCGMnWl1iU4LqiP0xrSHhc6epy-DfBWad1T1-I,452
71
+ fnschoo1/fnprofile/migrations/0003_alter_fnuser_options_alter_fnuser_groups_and_more.py,sha256=KiV7B3XDXwPcxT10e83DTW40xaJlA2rOMuYGPzqwAPo,1362
63
72
  fnschoo1/fnprofile/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
64
73
  fnschoo1/fnprofile/templates/fnprofile/create.html,sha256=CO2zKX5Jqh2GXAyfF7AR0rzytYdczkbF6oO2ZoZG1Lo,546
65
74
  fnschoo1/fnprofile/templates/fnprofile/detail.html,sha256=F0_Tv0X890kIdlgUZNT4pB3NiR9vyd_mhERxTjCUelc,595
@@ -69,44 +78,46 @@ fnschoo1/fnprofile/templates/fnprofile/log_out.html,sha256=siA56sam_0XEanX40H7Oa
69
78
  fnschoo1/fnschool/__init__.py,sha256=TmHhzykpKNMoMf6eD-EKvbvmnlzs1XGHtvD55ae1sXs,287
70
79
  fnschoo1/fnschool/_settings.py,sha256=ajz1GSNU9xYVrFEDSz6Xwg7amWQ_yvW75tQa1ZvRIWc,3
71
80
  fnschoo1/fnschool/asgi.py,sha256=kzkqosS10uBlyBX53EXcsATcvEZmac6nsPzyOHCuucE,393
72
- fnschoo1/fnschool/settings.py,sha256=2eHR5jTq8QjK7mjfPnfESm7WXb-3vpHuwSjYeNhX-u8,4709
73
- fnschoo1/fnschool/settings_fn_profile_migration_0001.py,sha256=zQKGekBTRn2fDL7OBAC3mdLUrkXxybRcjJE2t1FmxCI,4708
74
- fnschoo1/fnschool/urls.py,sha256=5eqHzKZLzhVt3SXpSD7aNSZ4HT-B_9nLaT83-X_aJNo,1261
75
- fnschoo1/fnschool/views.py,sha256=MfujMhFkRLxT-saID1xTU16v0khzIl6ceDl7_JgrgFs,152
81
+ fnschoo1/fnschool/settings.py,sha256=a9QnpTktXgoC70i6QvApSHEUxtYK--66xxLZEAj8-yc,4717
82
+ fnschoo1/fnschool/urls.py,sha256=lSFq0ZQSkaVWFCnsVDjZeebnIRkpBgKdjLa6hQAZzwE,1339
83
+ fnschoo1/fnschool/views.py,sha256=yMtB28KadYBXHxl7rtDMX7LlAV94WMt_PqmPRWpy2S4,176
76
84
  fnschoo1/fnschool/wsgi.py,sha256=dQq4S0vZWCz8w5R9KooJeLYTVFXvEgJRYe7NFZwVxU8,393
77
85
  fnschoo1/fnschool/templatetags/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
78
86
  fnschoo1/fnschool/templatetags/fnschool_tags.py,sha256=l5Zov4VlQKpz-69SFftP4kXyMymz-a0D5F_ss_eiFc4,568
79
87
  fnschoo1/locale/en/LC_MESSAGES/django.mo,sha256=M8AB6fmjwlEd761iFlasNWdiEYfE-2nIwBoioGtEVUo,404
80
- fnschoo1/locale/zh_Hans/LC_MESSAGES/django.mo,sha256=avjNs-L9jVhH8JiFsgsPmyHvjIvnyc6wtb_BfXasQBs,23277
81
- fnschoo1/profiles/__init__.py,sha256=RvsEo5qK27vkdZjPQFM5LFsIo9IH7PzkbNU6DQjrYpw,178
82
- fnschoo1/profiles/admin.py,sha256=93UCvdODI63KzCDfFFnKmfvCMGCp6FCG9WErE91i79Y,522
83
- fnschoo1/profiles/apps.py,sha256=WDu6eceFnDkBFMqquAolMZMo7XPb0ah6l2q2AruTrl4,215
84
- fnschoo1/profiles/forms.py,sha256=ilTUlBySQgszWpUA9ioFQUr09uXZIuKTde_e_K57Ll8,2063
85
- fnschoo1/profiles/models.py,sha256=dSl0DA8ZlTJM3kiJcxpg-vKXWGXFjRAlK6aYPIj9l8M,2466
86
- fnschoo1/profiles/signals.py,sha256=u5cv6xoZ7PUrKoD6ZOVWLLKg_93w_FCgWIiC4DxJADA,486
87
- fnschoo1/profiles/tests.py,sha256=mrbGGRNg5jwbTJtWWa7zSKdDyeB4vmgZCRc2nk6VY-g,60
88
- fnschoo1/profiles/urls.py,sha256=IOQ6GaPdOB4E0J-plfqIFHkabXZwOJKyFCKS7m9uKMY,426
89
- fnschoo1/profiles/views.py,sha256=9SUJx_CL7XIQcHMiRap6XkqaFOFlDc6Pk4tZ5_FRDNw,2204
90
- fnschoo1/profiles/migrations/0001_initial.py,sha256=zZ7l2DxJHf7YpLBBX3ztUfCmdoRNz1O5oSrdbBOdPjI,6776
91
- fnschoo1/profiles/migrations/0002_alter_profile_bio.py,sha256=LD7FdqcJ747XuKfIrZpq7avfx7_uZXr_t-Obc7yntSU,444
92
- fnschoo1/profiles/migrations/0003_alter_profile_options_alter_profile_address_and_more.py,sha256=R8rIXtXgGgOQKaucoDz93tcrHlzq1B1_Fq5DlWHPDSw,2057
93
- fnschoo1/profiles/migrations/0004_profile_gender.py,sha256=n5eQwBDRcEORGM7HZOcjoY_m1pckuKbjrwk--J7-LjA,625
94
- fnschoo1/profiles/migrations/0005_alter_profile_gender.py,sha256=dPAoUEcwjYt6AxgBfRZTCJCnEsJgCAfx_jae32TVLD4,550
95
- fnschoo1/profiles/migrations/0006_profile_created_at_profile_updated_at.py,sha256=7cKGa_3H7bVtoO3AJ-5yWdhwBxNZqghSRO9dhOrsuXE,705
96
- fnschoo1/profiles/migrations/0007_alter_profile_created_at.py,sha256=9lDwP5DAnj_ucCGn2hCLGf8i7Zbf26gOErwvJJlNvkY,490
97
- fnschoo1/profiles/migrations/0008_alter_profile_groups_alter_profile_user_permissions.py,sha256=JIEvPtvbeF3j-5knJDv1BtAb8nOIB56uKZJv3vb1QCA,1158
98
- fnschoo1/profiles/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
99
- fnschoo1/profiles/templates/profiles/create.html,sha256=a5nh6eg0D32ufnbIXZiKn4pQWXl1x1TUZUYhlBiIhOc,544
100
- fnschoo1/profiles/templates/profiles/detail.html,sha256=IiBEs3gnPiA2MUWlt5I9BmeFbavVSBgtzyP3jCBB7eU,577
101
- fnschoo1/profiles/templates/profiles/edit.html,sha256=7kP4LlgwLFUnzNUJUTHs4yZfLEKK5TbBcumne2yFiCg,466
102
- fnschoo1/profiles/templates/profiles/log_in.html,sha256=r5ah5EuuNCiQ0ou-YJClD5irQPxqxul4LLIPq-8yA1A,723
103
- fnschoo1/profiles/templates/profiles/log_out.html,sha256=7cgmXbXR1CFnVdXn3U6BAemX_m8Vfy-8Mdn6Lsu-Zfg,307
88
+ fnschoo1/locale/zh_Hans/LC_MESSAGES/django.mo,sha256=CWhKOcM21iNxOHF8WgjAKPio1L5gVnNF4iOCmNPQZoI,23707
89
+ fnschoo1/patches/202511012053_copy_profiles_to_fnprofile.py,sha256=2Vyg1brUu5XX4N9FZ89jyRoq3t6YCBfzBzZ4PeAeeG4,1632
90
+ fnschoo1/patches/__init__.py,sha256=Zq9F_mCPtMKCrJ4r8hP3f7ZYULw6I1G8cKvEHLlxteA,61
91
+ fnschoo1/patches/202511012053_copy_profiles_to_fnprofile_data/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
92
+ fnschoo1/patches/202511012053_copy_profiles_to_fnprofile_data/settings.py,sha256=vCyfOPPUnYrYseULRB4fRUn-8NAFBmvglha483JqCDs,4798
93
+ fnschoo1/patches/202511012053_copy_profiles_to_fnprofile_data/profiles/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
94
+ fnschoo1/patches/202511012053_copy_profiles_to_fnprofile_data/profiles/admin.py,sha256=93UCvdODI63KzCDfFFnKmfvCMGCp6FCG9WErE91i79Y,522
95
+ fnschoo1/patches/202511012053_copy_profiles_to_fnprofile_data/profiles/apps.py,sha256=SJERY1f2q1xZljZZrPw1boFc3Zbv_lsSWoWUKel4-04,238
96
+ fnschoo1/patches/202511012053_copy_profiles_to_fnprofile_data/profiles/forms.py,sha256=ilTUlBySQgszWpUA9ioFQUr09uXZIuKTde_e_K57Ll8,2063
97
+ fnschoo1/patches/202511012053_copy_profiles_to_fnprofile_data/profiles/models.py,sha256=kwAzYWcg-uQ-_BaBsra32Oh4z4JXe8au9ki7qTflOm0,1933
98
+ fnschoo1/patches/202511012053_copy_profiles_to_fnprofile_data/profiles/signals.py,sha256=u5cv6xoZ7PUrKoD6ZOVWLLKg_93w_FCgWIiC4DxJADA,486
99
+ fnschoo1/patches/202511012053_copy_profiles_to_fnprofile_data/profiles/tests.py,sha256=mrbGGRNg5jwbTJtWWa7zSKdDyeB4vmgZCRc2nk6VY-g,60
100
+ fnschoo1/patches/202511012053_copy_profiles_to_fnprofile_data/profiles/urls.py,sha256=IOQ6GaPdOB4E0J-plfqIFHkabXZwOJKyFCKS7m9uKMY,426
101
+ fnschoo1/patches/202511012053_copy_profiles_to_fnprofile_data/profiles/views.py,sha256=9SUJx_CL7XIQcHMiRap6XkqaFOFlDc6Pk4tZ5_FRDNw,2204
102
+ fnschoo1/patches/202511012053_copy_profiles_to_fnprofile_data/profiles/migrations/0001_initial.py,sha256=zZ7l2DxJHf7YpLBBX3ztUfCmdoRNz1O5oSrdbBOdPjI,6776
103
+ fnschoo1/patches/202511012053_copy_profiles_to_fnprofile_data/profiles/migrations/0002_alter_profile_bio.py,sha256=LD7FdqcJ747XuKfIrZpq7avfx7_uZXr_t-Obc7yntSU,444
104
+ fnschoo1/patches/202511012053_copy_profiles_to_fnprofile_data/profiles/migrations/0003_alter_profile_options_alter_profile_address_and_more.py,sha256=R8rIXtXgGgOQKaucoDz93tcrHlzq1B1_Fq5DlWHPDSw,2057
105
+ fnschoo1/patches/202511012053_copy_profiles_to_fnprofile_data/profiles/migrations/0004_profile_gender.py,sha256=n5eQwBDRcEORGM7HZOcjoY_m1pckuKbjrwk--J7-LjA,625
106
+ fnschoo1/patches/202511012053_copy_profiles_to_fnprofile_data/profiles/migrations/0005_alter_profile_gender.py,sha256=dPAoUEcwjYt6AxgBfRZTCJCnEsJgCAfx_jae32TVLD4,550
107
+ fnschoo1/patches/202511012053_copy_profiles_to_fnprofile_data/profiles/migrations/0006_profile_created_at_profile_updated_at.py,sha256=7cKGa_3H7bVtoO3AJ-5yWdhwBxNZqghSRO9dhOrsuXE,705
108
+ fnschoo1/patches/202511012053_copy_profiles_to_fnprofile_data/profiles/migrations/0007_alter_profile_created_at.py,sha256=YHtCi5In5bP6vjQshbZU8EWt4AZidmdX1LhxDMoO2rA,490
109
+ fnschoo1/patches/202511012053_copy_profiles_to_fnprofile_data/profiles/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
110
+ fnschoo1/patches/202511012053_copy_profiles_to_fnprofile_data/profiles/templates/profiles/create.html,sha256=a5nh6eg0D32ufnbIXZiKn4pQWXl1x1TUZUYhlBiIhOc,544
111
+ fnschoo1/patches/202511012053_copy_profiles_to_fnprofile_data/profiles/templates/profiles/detail.html,sha256=IiBEs3gnPiA2MUWlt5I9BmeFbavVSBgtzyP3jCBB7eU,577
112
+ fnschoo1/patches/202511012053_copy_profiles_to_fnprofile_data/profiles/templates/profiles/edit.html,sha256=7kP4LlgwLFUnzNUJUTHs4yZfLEKK5TbBcumne2yFiCg,466
113
+ fnschoo1/patches/202511012053_copy_profiles_to_fnprofile_data/profiles/templates/profiles/log_in.html,sha256=r5ah5EuuNCiQ0ou-YJClD5irQPxqxul4LLIPq-8yA1A,723
114
+ fnschoo1/patches/202511012053_copy_profiles_to_fnprofile_data/profiles/templates/profiles/log_out.html,sha256=7cgmXbXR1CFnVdXn3U6BAemX_m8Vfy-8Mdn6Lsu-Zfg,307
104
115
  fnschoo1/static/css/bootstrap.min.css,sha256=eGY1FwN6FhXUvbmXraT1t_q2vcNlQa8g5xQDwg8mG6w,280591
105
116
  fnschoo1/static/css/fnschool.css,sha256=NmePHTMyKovvucCws_hC1w9b-7r4NMta-G13PiVUeDw,649
106
117
  fnschoo1/static/images/favicon.ico,sha256=S8Tf0NsUdHnoYO0SEn-sig6YjB0atIpEtSlm7p1HxjY,5014
107
118
  fnschoo1/static/js/bootstrap.bundle.min.js,sha256=6kw84LCFc4QJzifgkle0FsvQrpt2NVRNPNjSSc9caiM,125881
108
119
  fnschoo1/static/js/bootstrap.min.js,sha256=0SHpZTHghUOz_BNedMzuH00z5lgwOSRKP_KI9G5Ogbk,88597
109
- fnschoo1/static/js/fnschool.js,sha256=XqcvQS0GGtQmZya4E7rZESdloDm_0QIfmAoSstSR2fc,4445
120
+ fnschoo1/static/js/fnschool.js,sha256=IxP0-7T5G4LcOJ-00n_8M_Bx10qXF20SedxrWudEezg,4661
110
121
  fnschoo1/static/js/jquery.min.js,sha256=np_WnfpAmUmEO_iheFAJKf6mbm0_laW3Ns4x7kjSlt4,162505
111
122
  fnschoo1/static/js/jquery.slim.min.js,sha256=p5YkbOjgHxX3hTadKlGuDW58NvJ1ldjjokDuDQ_5yXs,129962
112
123
  fnschoo1/static/js/popper.min.js,sha256=O2xdmtEow7gq3I7-0lKjshvxHkBe0hTWrMkbX2fy0XQ,36887
@@ -118,19 +129,19 @@ fnschoo1/templates/base/_js.html,sha256=E2mgj6LQjd37r660iG2cAIOfofwuwMC6SZ59fj6w
118
129
  fnschoo1/templates/base/content.html,sha256=wbbZVWuZwL7EX0K6x5Ex1sYx0N2YteA0XMAdGsW_ScU,974
119
130
  fnschoo1/templates/base/document.html,sha256=8HyXN5B0u2bUtAXvnTkFsUhRHNA_Y3V87KuosQoPPJ4,1134
120
131
  fnschoo1/templates/includes/_footer.html,sha256=giWQqakjUWPe2Z9au-EVnKmu2dvxuLezQZXmWFEtngU,1562
121
- fnschoo1/templates/includes/_header.html,sha256=pjyq_WusbfNRTtTLXVPaOMxVGk8m9RfG5zXo4iZR8B0,3595
132
+ fnschoo1/templates/includes/_header.html,sha256=Mzke2KhZyJD3l3Bw8QXghvjELPZsNothhPxeISpqmxg,3643
122
133
  fnschoo1/templates/includes/_navigation.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
123
134
  fnschoo1/templates/includes/_paginator.html,sha256=Q-FRCODFNlETjn2yX18IfhctRWfqEgEnIc5LcdHzKSo,1262
124
135
  fnschoo1/templates/registration/logged_out.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
125
136
  fnschoo1/templates/registration/login.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
126
- fnschool-20251027.81653.841.dist-info/licenses/LICENSE,sha256=2n6rt7r999OuXp8iOqW9we7ORaxWncIbOwN1ILRGR2g,7651
127
- fnschool-20251027.81653.841.dist-info/METADATA,sha256=yLl7ZpplO_pG30_hmA9EWaVhVeDHyi8YQxGi8bOZDNQ,4752
128
- fnschool-20251027.81653.841.dist-info/SOURCES.txt.py,sha256=2LY2mshgNtxI3ICB-oBjyMYgJk2bQqeGFM5J5ay5TQs,4954
129
- fnschool-20251027.81653.841.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
130
- fnschool-20251027.81653.841.dist-info/dependency_links.txt.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
131
- fnschool-20251027.81653.841.dist-info/entry_points.txt,sha256=Ow5nChVFJY3O4TJAIE1ZydMev1MUtgRsT1b8eFP6728,54
132
- fnschool-20251027.81653.841.dist-info/entry_points.txt.py,sha256=7iOwIx_m9Y6xJt___BZHWJh27LV5hqWnUjmj77MoRys,47
133
- fnschool-20251027.81653.841.dist-info/requires.txt.py,sha256=PqRcHIQSMPUb271hacYrlSDHwB1WDZmlWUkh6RnBz_g,113
134
- fnschool-20251027.81653.841.dist-info/top_level.txt,sha256=s6ZKnNm94Q0-247a50eI7jDK98uPF6P2kC9Ovd3LUlM,9
135
- fnschool-20251027.81653.841.dist-info/top_level.txt.py,sha256=_7CbrSihm0dzBn_tTy2ass_Y2VlkVNT2eylE8mcfwHY,9
136
- fnschool-20251027.81653.841.dist-info/RECORD,,
137
+ fnschool-20251101.82236.812.dist-info/licenses/LICENSE,sha256=2n6rt7r999OuXp8iOqW9we7ORaxWncIbOwN1ILRGR2g,7651
138
+ fnschool-20251101.82236.812.dist-info/METADATA,sha256=j8tl5FAu8EnKxaFptiQ2LzQBCvdcoqlCk_vOFsB9SZI,4752
139
+ fnschool-20251101.82236.812.dist-info/SOURCES.txt.py,sha256=2LY2mshgNtxI3ICB-oBjyMYgJk2bQqeGFM5J5ay5TQs,4954
140
+ fnschool-20251101.82236.812.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
141
+ fnschool-20251101.82236.812.dist-info/dependency_links.txt.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
142
+ fnschool-20251101.82236.812.dist-info/entry_points.txt,sha256=Ow5nChVFJY3O4TJAIE1ZydMev1MUtgRsT1b8eFP6728,54
143
+ fnschool-20251101.82236.812.dist-info/entry_points.txt.py,sha256=7iOwIx_m9Y6xJt___BZHWJh27LV5hqWnUjmj77MoRys,47
144
+ fnschool-20251101.82236.812.dist-info/requires.txt.py,sha256=PqRcHIQSMPUb271hacYrlSDHwB1WDZmlWUkh6RnBz_g,113
145
+ fnschool-20251101.82236.812.dist-info/top_level.txt,sha256=s6ZKnNm94Q0-247a50eI7jDK98uPF6P2kC9Ovd3LUlM,9
146
+ fnschool-20251101.82236.812.dist-info/top_level.txt.py,sha256=_7CbrSihm0dzBn_tTy2ass_Y2VlkVNT2eylE8mcfwHY,9
147
+ fnschool-20251101.82236.812.dist-info/RECORD,,
@@ -1,20 +0,0 @@
1
- # Generated by Django 4.2.25 on 2025-10-26 15:42
2
-
3
- from django.db import migrations
4
-
5
-
6
- class Migration(migrations.Migration):
7
-
8
- dependencies = [
9
- ("fnprofile", "0002_auto_20251026_2235"),
10
- ]
11
-
12
- operations = [
13
- migrations.AlterModelOptions(
14
- name="fnuser",
15
- options={
16
- "verbose_name": "User Information",
17
- "verbose_name_plural": "User Information",
18
- },
19
- ),
20
- ]
@@ -1,7 +0,0 @@
1
- import warnings
2
-
3
- warnings.warn(
4
- "The 'profiles' app is deprecated and will be removed in the future. Use 'profile' app instead.",
5
- DeprecationWarning,
6
- stacklevel=2,
7
- )
@@ -1,38 +0,0 @@
1
- # Generated by Django 4.2.25 on 2025-10-26 14:35
2
-
3
- from django.db import migrations, models
4
-
5
-
6
- class Migration(migrations.Migration):
7
-
8
- dependencies = [
9
- ("auth", "0012_alter_user_first_name_max_length"),
10
- ("profiles", "0007_alter_profile_created_at"),
11
- ]
12
-
13
- operations = [
14
- migrations.AlterField(
15
- model_name="profile",
16
- name="groups",
17
- field=models.ManyToManyField(
18
- blank=True,
19
- help_text="The groups this user belongs to.",
20
- related_name="profile_groups",
21
- related_query_name="profile",
22
- to="auth.group",
23
- verbose_name="groups",
24
- ),
25
- ),
26
- migrations.AlterField(
27
- model_name="profile",
28
- name="user_permissions",
29
- field=models.ManyToManyField(
30
- blank=True,
31
- help_text="这个用户的特定权限。",
32
- related_name="profile_permissions",
33
- related_query_name="profile",
34
- to="auth.permission",
35
- verbose_name="user permissions",
36
- ),
37
- ),
38
- ]
File without changes
File without changes