fnschool 20251016.81138.855__tar.gz → 20251111.81414.856__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (164) hide show
  1. {fnschool-20251016.81138.855 → fnschool-20251111.81414.856}/PKG-INFO +1 -1
  2. {fnschool-20251016.81138.855 → fnschool-20251111.81414.856}/src/fnschoo1/__init__.py +1 -1
  3. {fnschool-20251016.81138.855 → fnschool-20251111.81414.856}/src/fnschoo1/canteen/forms.py +3 -2
  4. fnschool-20251111.81414.856/src/fnschoo1/canteen/migrations/0017_ingredient_updated_at_alter_category_created_at_and_more.py +30 -0
  5. fnschool-20251111.81414.856/src/fnschoo1/canteen/migrations/0018_alter_ingredient_updated_at.py +23 -0
  6. fnschool-20251111.81414.856/src/fnschoo1/canteen/migrations/0019_category_updated_at_ingredient_created_at_and_more.py +48 -0
  7. fnschool-20251111.81414.856/src/fnschoo1/canteen/migrations/0020_alter_ingredient_created_at.py +20 -0
  8. fnschool-20251111.81414.856/src/fnschoo1/canteen/migrations/0021_alter_category_updated_at_and_more.py +41 -0
  9. fnschool-20251111.81414.856/src/fnschoo1/canteen/migrations/0022_alter_category_updated_at_and_more.py +41 -0
  10. {fnschool-20251016.81138.855 → fnschool-20251111.81414.856}/src/fnschoo1/canteen/models.py +40 -2
  11. {fnschool-20251016.81138.855 → fnschool-20251111.81414.856}/src/fnschoo1/canteen/templates/canteen/category/create.html +3 -1
  12. {fnschool-20251016.81138.855 → fnschool-20251111.81414.856}/src/fnschoo1/canteen/templates/canteen/category/delete.html +3 -1
  13. {fnschool-20251016.81138.855 → fnschool-20251111.81414.856}/src/fnschoo1/canteen/templates/canteen/category/list.html +1 -1
  14. {fnschool-20251016.81138.855 → fnschool-20251111.81414.856}/src/fnschoo1/canteen/templates/canteen/category/update.html +3 -1
  15. {fnschool-20251016.81138.855 → fnschool-20251111.81414.856}/src/fnschoo1/canteen/templates/canteen/consumption/create.html +64 -21
  16. {fnschool-20251016.81138.855 → fnschool-20251111.81414.856}/src/fnschoo1/canteen/templates/canteen/ingredient/create.html +6 -2
  17. {fnschool-20251016.81138.855 → fnschool-20251111.81414.856}/src/fnschoo1/canteen/templates/canteen/ingredient/create_one.html +3 -1
  18. {fnschool-20251016.81138.855 → fnschool-20251111.81414.856}/src/fnschoo1/canteen/templates/canteen/ingredient/delete.html +3 -1
  19. fnschool-20251111.81414.856/src/fnschoo1/canteen/templates/canteen/ingredient/list.html +183 -0
  20. {fnschool-20251016.81138.855 → fnschool-20251111.81414.856}/src/fnschoo1/canteen/templates/canteen/ingredient/update.html +3 -1
  21. {fnschool-20251016.81138.855 → fnschool-20251111.81414.856}/src/fnschoo1/canteen/templates/canteen/meal_type/create.html +3 -1
  22. {fnschool-20251016.81138.855 → fnschool-20251111.81414.856}/src/fnschoo1/canteen/templates/canteen/meal_type/delete.html +3 -1
  23. {fnschool-20251016.81138.855 → fnschool-20251111.81414.856}/src/fnschoo1/canteen/templates/canteen/meal_type/list.html +1 -1
  24. {fnschool-20251016.81138.855 → fnschool-20251111.81414.856}/src/fnschoo1/canteen/templates/canteen/meal_type/update.html +3 -1
  25. {fnschool-20251016.81138.855 → fnschool-20251111.81414.856}/src/fnschoo1/canteen/views.py +147 -42
  26. {fnschool-20251016.81138.855 → fnschool-20251111.81414.856}/src/fnschoo1/canteen/workbook/generate.py +706 -175
  27. fnschool-20251111.81414.856/src/fnschoo1/fnhome/admin.py +3 -0
  28. fnschool-20251111.81414.856/src/fnschoo1/fnhome/apps.py +6 -0
  29. fnschool-20251111.81414.856/src/fnschoo1/fnhome/models.py +3 -0
  30. fnschool-20251111.81414.856/src/fnschoo1/fnhome/templates/fnhome/home.html +7 -0
  31. fnschool-20251111.81414.856/src/fnschoo1/fnhome/urls.py +13 -0
  32. fnschool-20251111.81414.856/src/fnschoo1/fnhome/views.py +50 -0
  33. fnschool-20251111.81414.856/src/fnschoo1/fnprofile/admin.py +27 -0
  34. {fnschool-20251016.81138.855/src/fnschoo1/profiles → fnschool-20251111.81414.856/src/fnschoo1/fnprofile}/apps.py +3 -3
  35. fnschool-20251111.81414.856/src/fnschoo1/fnprofile/forms.py +74 -0
  36. fnschool-20251111.81414.856/src/fnschoo1/fnprofile/migrations/0001_initial.py +213 -0
  37. fnschool-20251111.81414.856/src/fnschoo1/fnprofile/migrations/0002_auto_20251026_2235.py +55 -0
  38. fnschool-20251111.81414.856/src/fnschoo1/fnprofile/migrations/0003_alter_fnuser_options_alter_fnuser_groups_and_more.py +45 -0
  39. fnschool-20251111.81414.856/src/fnschoo1/fnprofile/migrations/0004_alter_fnuser_options_alter_fnuser_created_at_and_more.py +59 -0
  40. fnschool-20251111.81414.856/src/fnschoo1/fnprofile/migrations/0005_alter_fnuser_options_alter_fnuser_created_at_and_more.py +62 -0
  41. fnschool-20251111.81414.856/src/fnschoo1/fnprofile/models.py +91 -0
  42. fnschool-20251111.81414.856/src/fnschoo1/fnprofile/signals.py +20 -0
  43. fnschool-20251111.81414.856/src/fnschoo1/fnprofile/templates/fnprofile/create.html +18 -0
  44. fnschool-20251111.81414.856/src/fnschoo1/fnprofile/templates/fnprofile/detail.html +16 -0
  45. fnschool-20251111.81414.856/src/fnschoo1/fnprofile/templates/fnprofile/edit.html +16 -0
  46. fnschool-20251111.81414.856/src/fnschoo1/fnprofile/templates/fnprofile/log_in.html +22 -0
  47. fnschool-20251111.81414.856/src/fnschoo1/fnprofile/templates/fnprofile/log_out.html +12 -0
  48. fnschool-20251111.81414.856/src/fnschoo1/fnprofile/tests.py +3 -0
  49. fnschool-20251111.81414.856/src/fnschoo1/fnprofile/urls.py +15 -0
  50. fnschool-20251111.81414.856/src/fnschoo1/fnprofile/views.py +74 -0
  51. fnschool-20251111.81414.856/src/fnschoo1/fnschool/settings.py +175 -0
  52. {fnschool-20251016.81138.855 → fnschool-20251111.81414.856}/src/fnschoo1/fnschool/urls.py +9 -3
  53. fnschool-20251111.81414.856/src/fnschoo1/fnschool/views.py +9 -0
  54. fnschool-20251111.81414.856/src/fnschoo1/locale/zh_Hans/LC_MESSAGES/django.mo +0 -0
  55. {fnschool-20251016.81138.855 → fnschool-20251111.81414.856}/src/fnschoo1/manage.py +22 -8
  56. fnschool-20251111.81414.856/src/fnschoo1/patches/202511012053_copy_profiles_to_fnprofile.py +71 -0
  57. fnschool-20251111.81414.856/src/fnschoo1/patches/202511012053_copy_profiles_to_fnprofile_data/profiles/apps.py +17 -0
  58. {fnschool-20251016.81138.855/src/fnschoo1 → fnschool-20251111.81414.856/src/fnschoo1/patches/202511012053_copy_profiles_to_fnprofile_data}/profiles/forms.py +7 -0
  59. fnschool-20251111.81414.856/src/fnschoo1/patches/202511012053_copy_profiles_to_fnprofile_data/profiles/migrations/0006_profile_created_at_profile_updated_at.py +27 -0
  60. fnschool-20251111.81414.856/src/fnschoo1/patches/202511012053_copy_profiles_to_fnprofile_data/profiles/migrations/0007_alter_profile_created_at.py +20 -0
  61. fnschool-20251111.81414.856/src/fnschoo1/patches/202511012053_copy_profiles_to_fnprofile_data/profiles/migrations/0008_alter_profile_created_at_alter_profile_updated_at.py +27 -0
  62. {fnschool-20251016.81138.855/src/fnschoo1 → fnschool-20251111.81414.856/src/fnschoo1/patches/202511012053_copy_profiles_to_fnprofile_data}/profiles/models.py +17 -2
  63. {fnschool-20251016.81138.855/src/fnschoo1 → fnschool-20251111.81414.856/src/fnschoo1/patches/202511012053_copy_profiles_to_fnprofile_data}/profiles/templates/profiles/create.html +4 -2
  64. {fnschool-20251016.81138.855/src/fnschoo1 → fnschool-20251111.81414.856/src/fnschoo1/patches/202511012053_copy_profiles_to_fnprofile_data}/profiles/templates/profiles/detail.html +4 -2
  65. {fnschool-20251016.81138.855/src/fnschoo1 → fnschool-20251111.81414.856/src/fnschoo1/patches/202511012053_copy_profiles_to_fnprofile_data}/profiles/templates/profiles/edit.html +7 -3
  66. {fnschool-20251016.81138.855/src/fnschoo1 → fnschool-20251111.81414.856/src/fnschoo1/patches/202511012053_copy_profiles_to_fnprofile_data}/profiles/templates/profiles/log_in.html +4 -2
  67. {fnschool-20251016.81138.855/src/fnschoo1 → fnschool-20251111.81414.856/src/fnschoo1/patches/202511012053_copy_profiles_to_fnprofile_data}/profiles/templates/profiles/log_out.html +1 -1
  68. fnschool-20251111.81414.856/src/fnschoo1/patches/202511012053_copy_profiles_to_fnprofile_data/profiles/tests.py +3 -0
  69. {fnschool-20251016.81138.855/src/fnschoo1 → fnschool-20251111.81414.856/src/fnschoo1/patches/202511012053_copy_profiles_to_fnprofile_data}/profiles/views.py +11 -2
  70. {fnschool-20251016.81138.855/src/fnschoo1/fnschool → fnschool-20251111.81414.856/src/fnschoo1/patches/202511012053_copy_profiles_to_fnprofile_data}/settings.py +9 -5
  71. fnschool-20251111.81414.856/src/fnschoo1/patches/__init__.py +4 -0
  72. {fnschool-20251016.81138.855 → fnschool-20251111.81414.856}/src/fnschoo1/static/css/fnschool.css +20 -0
  73. {fnschool-20251016.81138.855 → fnschool-20251111.81414.856}/src/fnschoo1/static/js/fnschool.js +65 -2
  74. fnschool-20251111.81414.856/src/fnschoo1/templates/base/_content.html +0 -0
  75. {fnschool-20251016.81138.855 → fnschool-20251111.81414.856}/src/fnschoo1/templates/home.html +1 -1
  76. {fnschool-20251016.81138.855 → fnschool-20251111.81414.856}/src/fnschoo1/templates/includes/_footer.html +12 -4
  77. {fnschool-20251016.81138.855 → fnschool-20251111.81414.856}/src/fnschoo1/templates/includes/_header.html +34 -8
  78. fnschool-20251111.81414.856/src/fnschoo1/templates/includes/_navigation.html +0 -0
  79. {fnschool-20251016.81138.855 → fnschool-20251111.81414.856}/src/fnschoo1/templates/includes/_paginator.html +3 -1
  80. fnschool-20251111.81414.856/src/fnschoo1/templates/registration/logged_out.html +0 -0
  81. fnschool-20251111.81414.856/src/fnschoo1/templates/registration/login.html +0 -0
  82. fnschool-20251111.81414.856/src/fnschool/locales/en_US/LC_MESSAGES/fnschool.mo +0 -0
  83. fnschool-20251111.81414.856/src/fnschool/locales/zh_CN/LC_MESSAGES/fnschool.mo +0 -0
  84. fnschool-20251111.81414.856/src/fnschool/locales/zh_HK/LC_MESSAGES/fnschool.mo +0 -0
  85. fnschool-20251111.81414.856/src/fnschool/locales/zh_SG/LC_MESSAGES/fnschool.mo +0 -0
  86. fnschool-20251111.81414.856/src/fnschool/locales/zh_TW/LC_MESSAGES/fnschool.mo +0 -0
  87. {fnschool-20251016.81138.855 → fnschool-20251111.81414.856}/src/fnschool.egg-info/PKG-INFO +1 -1
  88. fnschool-20251111.81414.856/src/fnschool.egg-info/SOURCES.txt +154 -0
  89. {fnschool-20251016.81138.855 → fnschool-20251111.81414.856}/src/fnschool.egg-info/top_level.txt +1 -0
  90. fnschool-20251016.81138.855/src/fnschoo1/canteen/templates/canteen/ingredient/list.html +0 -137
  91. fnschool-20251016.81138.855/src/fnschoo1/fnschool/views.py +0 -9
  92. fnschool-20251016.81138.855/src/fnschoo1/locale/zh_Hans/LC_MESSAGES/django.mo +0 -0
  93. fnschool-20251016.81138.855/src/fnschool.egg-info/SOURCES.txt +0 -112
  94. fnschool-20251016.81138.855/src/fnschool.egg-info/SOURCES.txt.py +0 -104
  95. fnschool-20251016.81138.855/src/fnschool.egg-info/entry_points.txt.py +0 -2
  96. fnschool-20251016.81138.855/src/fnschool.egg-info/requires.txt.py +0 -13
  97. fnschool-20251016.81138.855/src/fnschool.egg-info/top_level.txt.py +0 -1
  98. {fnschool-20251016.81138.855 → fnschool-20251111.81414.856}/LICENSE +0 -0
  99. {fnschool-20251016.81138.855 → fnschool-20251111.81414.856}/README.md +0 -0
  100. {fnschool-20251016.81138.855 → fnschool-20251111.81414.856}/pyproject.toml +0 -0
  101. {fnschool-20251016.81138.855 → fnschool-20251111.81414.856}/setup.cfg +0 -0
  102. {fnschool-20251016.81138.855 → fnschool-20251111.81414.856}/src/fnschoo1/canteen/__init__.py +0 -0
  103. {fnschool-20251016.81138.855 → fnschool-20251111.81414.856}/src/fnschoo1/canteen/admin.py +0 -0
  104. {fnschool-20251016.81138.855 → fnschool-20251111.81414.856}/src/fnschoo1/canteen/apps.py +0 -0
  105. {fnschool-20251016.81138.855 → fnschool-20251111.81414.856}/src/fnschoo1/canteen/migrations/0001_initial.py +0 -0
  106. {fnschool-20251016.81138.855 → fnschool-20251111.81414.856}/src/fnschoo1/canteen/migrations/0002_ingredient_is_disabled.py +0 -0
  107. {fnschool-20251016.81138.855 → fnschool-20251111.81414.856}/src/fnschoo1/canteen/migrations/0003_consumption_is_disabled_alter_ingredient_is_disabled.py +0 -0
  108. {fnschool-20251016.81138.855 → fnschool-20251111.81414.856}/src/fnschoo1/canteen/migrations/0004_alter_ingredient_name_category_and_more.py +0 -0
  109. {fnschool-20251016.81138.855 → fnschool-20251111.81414.856}/src/fnschoo1/canteen/migrations/0005_alter_category_created_at_alter_category_name_and_more.py +0 -0
  110. {fnschool-20251016.81138.855 → fnschool-20251111.81414.856}/src/fnschoo1/canteen/migrations/0006_category_is_disabled_alter_category_user_and_more.py +0 -0
  111. {fnschool-20251016.81138.855 → fnschool-20251111.81414.856}/src/fnschoo1/canteen/migrations/0007_alter_consumption_amount_used_and_more.py +0 -0
  112. {fnschool-20251016.81138.855 → fnschool-20251111.81414.856}/src/fnschoo1/canteen/migrations/0008_category_abbreviation_mealtype.py +0 -0
  113. {fnschool-20251016.81138.855 → fnschool-20251111.81414.856}/src/fnschoo1/canteen/migrations/0009_alter_category_abbreviation_and_more.py +0 -0
  114. {fnschool-20251016.81138.855 → fnschool-20251111.81414.856}/src/fnschoo1/canteen/migrations/0010_alter_consumption_options_alter_ingredient_options_and_more.py +0 -0
  115. {fnschool-20251016.81138.855 → fnschool-20251111.81414.856}/src/fnschoo1/canteen/migrations/0011_category_pin_to_consumptions_top.py +0 -0
  116. {fnschool-20251016.81138.855 → fnschool-20251111.81414.856}/src/fnschoo1/canteen/migrations/0012_alter_ingredient_storage_date.py +0 -0
  117. {fnschool-20251016.81138.855 → fnschool-20251111.81414.856}/src/fnschoo1/canteen/migrations/0013_alter_consumption_options_alter_ingredient_options_and_more.py +0 -0
  118. {fnschool-20251016.81138.855 → fnschool-20251111.81414.856}/src/fnschoo1/canteen/migrations/0014_category_priority.py +0 -0
  119. {fnschool-20251016.81138.855 → fnschool-20251111.81414.856}/src/fnschoo1/canteen/migrations/0015_alter_category_options_alter_category_priority.py +0 -0
  120. {fnschool-20251016.81138.855 → fnschool-20251111.81414.856}/src/fnschoo1/canteen/migrations/0016_consumption_unique_ingredient_date_of_using.py +0 -0
  121. {fnschool-20251016.81138.855 → fnschool-20251111.81414.856}/src/fnschoo1/canteen/migrations/__init__.py +0 -0
  122. {fnschool-20251016.81138.855 → fnschool-20251111.81414.856}/src/fnschoo1/canteen/templates/canteen/close.html +0 -0
  123. {fnschool-20251016.81138.855 → fnschool-20251111.81414.856}/src/fnschoo1/canteen/templates/canteen/consumption/_create.html +0 -0
  124. {fnschool-20251016.81138.855 → fnschool-20251111.81414.856}/src/fnschoo1/canteen/templates/canteen/ingredient/close.html +0 -0
  125. {fnschool-20251016.81138.855 → fnschool-20251111.81414.856}/src/fnschoo1/canteen/tests.py +0 -0
  126. {fnschool-20251016.81138.855 → fnschool-20251111.81414.856}/src/fnschoo1/canteen/urls.py +0 -0
  127. {fnschool-20251016.81138.855 → fnschool-20251111.81414.856}/src/fnschoo1/canteen/workbook/__init__.py +0 -0
  128. {fnschool-20251016.81138.855/src/fnschoo1/profiles → fnschool-20251111.81414.856/src/fnschoo1/fnhome}/__init__.py +0 -0
  129. {fnschool-20251016.81138.855/src/fnschoo1/profiles → fnschool-20251111.81414.856/src/fnschoo1/fnhome}/migrations/__init__.py +0 -0
  130. {fnschool-20251016.81138.855/src/fnschoo1/profiles → fnschool-20251111.81414.856/src/fnschoo1/fnhome}/tests.py +0 -0
  131. /fnschool-20251016.81138.855/src/fnschoo1/templates/base/_content.html → /fnschool-20251111.81414.856/src/fnschoo1/fnprofile/__init__.py +0 -0
  132. /fnschool-20251016.81138.855/src/fnschoo1/templates/includes/_navigation.html → /fnschool-20251111.81414.856/src/fnschoo1/fnprofile/migrations/__init__.py +0 -0
  133. {fnschool-20251016.81138.855 → fnschool-20251111.81414.856}/src/fnschoo1/fnschool/__init__.py +0 -0
  134. {fnschool-20251016.81138.855 → fnschool-20251111.81414.856}/src/fnschoo1/fnschool/asgi.py +0 -0
  135. {fnschool-20251016.81138.855 → fnschool-20251111.81414.856}/src/fnschoo1/fnschool/templatetags/__init__.py +0 -0
  136. {fnschool-20251016.81138.855 → fnschool-20251111.81414.856}/src/fnschoo1/fnschool/templatetags/fnschool_tags.py +0 -0
  137. {fnschool-20251016.81138.855 → fnschool-20251111.81414.856}/src/fnschoo1/fnschool/wsgi.py +0 -0
  138. {fnschool-20251016.81138.855 → fnschool-20251111.81414.856}/src/fnschoo1/locale/en/LC_MESSAGES/django.mo +0 -0
  139. /fnschool-20251016.81138.855/src/fnschool.egg-info/dependency_links.txt → /fnschool-20251111.81414.856/src/fnschoo1/patches/202511012053_copy_profiles_to_fnprofile_data/__init__.py +0 -0
  140. /fnschool-20251016.81138.855/src/fnschoo1/templates/registration/logged_out.html → /fnschool-20251111.81414.856/src/fnschoo1/patches/202511012053_copy_profiles_to_fnprofile_data/profiles/__init__.py +0 -0
  141. {fnschool-20251016.81138.855/src/fnschoo1 → fnschool-20251111.81414.856/src/fnschoo1/patches/202511012053_copy_profiles_to_fnprofile_data}/profiles/admin.py +0 -0
  142. {fnschool-20251016.81138.855/src/fnschoo1 → fnschool-20251111.81414.856/src/fnschoo1/patches/202511012053_copy_profiles_to_fnprofile_data}/profiles/migrations/0001_initial.py +0 -0
  143. {fnschool-20251016.81138.855/src/fnschoo1 → fnschool-20251111.81414.856/src/fnschoo1/patches/202511012053_copy_profiles_to_fnprofile_data}/profiles/migrations/0002_alter_profile_bio.py +0 -0
  144. {fnschool-20251016.81138.855/src/fnschoo1 → fnschool-20251111.81414.856/src/fnschoo1/patches/202511012053_copy_profiles_to_fnprofile_data}/profiles/migrations/0003_alter_profile_options_alter_profile_address_and_more.py +0 -0
  145. {fnschool-20251016.81138.855/src/fnschoo1 → fnschool-20251111.81414.856/src/fnschoo1/patches/202511012053_copy_profiles_to_fnprofile_data}/profiles/migrations/0004_profile_gender.py +0 -0
  146. {fnschool-20251016.81138.855/src/fnschoo1 → fnschool-20251111.81414.856/src/fnschoo1/patches/202511012053_copy_profiles_to_fnprofile_data}/profiles/migrations/0005_alter_profile_gender.py +0 -0
  147. /fnschool-20251016.81138.855/src/fnschoo1/templates/registration/login.html → /fnschool-20251111.81414.856/src/fnschoo1/patches/202511012053_copy_profiles_to_fnprofile_data/profiles/migrations/__init__.py +0 -0
  148. {fnschool-20251016.81138.855/src/fnschoo1 → fnschool-20251111.81414.856/src/fnschoo1/patches/202511012053_copy_profiles_to_fnprofile_data}/profiles/signals.py +0 -0
  149. {fnschool-20251016.81138.855/src/fnschoo1 → fnschool-20251111.81414.856/src/fnschoo1/patches/202511012053_copy_profiles_to_fnprofile_data}/profiles/urls.py +0 -0
  150. {fnschool-20251016.81138.855 → fnschool-20251111.81414.856}/src/fnschoo1/static/css/bootstrap.min.css +0 -0
  151. {fnschool-20251016.81138.855 → fnschool-20251111.81414.856}/src/fnschoo1/static/images/favicon.ico +0 -0
  152. {fnschool-20251016.81138.855 → fnschool-20251111.81414.856}/src/fnschoo1/static/js/bootstrap.bundle.min.js +0 -0
  153. {fnschool-20251016.81138.855 → fnschool-20251111.81414.856}/src/fnschoo1/static/js/bootstrap.min.js +0 -0
  154. {fnschool-20251016.81138.855 → fnschool-20251111.81414.856}/src/fnschoo1/static/js/jquery.min.js +0 -0
  155. {fnschool-20251016.81138.855 → fnschool-20251111.81414.856}/src/fnschoo1/static/js/jquery.slim.min.js +0 -0
  156. {fnschool-20251016.81138.855 → fnschool-20251111.81414.856}/src/fnschoo1/static/js/popper.min.js +0 -0
  157. {fnschool-20251016.81138.855 → fnschool-20251111.81414.856}/src/fnschoo1/templates/base/_css.html +0 -0
  158. {fnschool-20251016.81138.855 → fnschool-20251111.81414.856}/src/fnschoo1/templates/base/_js.html +0 -0
  159. {fnschool-20251016.81138.855 → fnschool-20251111.81414.856}/src/fnschoo1/templates/base/content.html +0 -0
  160. /fnschool-20251016.81138.855/src/fnschoo1/templates/base/header_content_footer.html → /fnschool-20251111.81414.856/src/fnschoo1/templates/base/document.html +0 -0
  161. {fnschool-20251016.81138.855 → fnschool-20251111.81414.856}/src/fnschoo1/templates/close.html +0 -0
  162. /fnschool-20251016.81138.855/src/fnschool.egg-info/dependency_links.txt.py → /fnschool-20251111.81414.856/src/fnschool.egg-info/dependency_links.txt +0 -0
  163. {fnschool-20251016.81138.855 → fnschool-20251111.81414.856}/src/fnschool.egg-info/entry_points.txt +0 -0
  164. {fnschool-20251016.81138.855 → fnschool-20251111.81414.856}/src/fnschool.egg-info/requires.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fnschool
3
- Version: 20251016.81138.855
3
+ Version: 20251111.81414.856
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>
@@ -6,4 +6,4 @@ import random
6
6
  import sys
7
7
  from pathlib import Path
8
8
 
9
- __version__ = "20251016.81138.855"
9
+ __version__ = "20251111.81414.856"
@@ -1,6 +1,7 @@
1
1
  from datetime import date, datetime
2
2
 
3
3
  from django import forms
4
+
4
5
  from fnschool import _
5
6
 
6
7
  from .models import Category, Consumption, Ingredient, MealType
@@ -20,7 +21,7 @@ class IngredientForm(forms.ModelForm):
20
21
  fields = [
21
22
  f.name
22
23
  for f in Ingredient._meta.fields
23
- if f.name not in ["id", "user"]
24
+ if f.name not in ["id", "user", "updated_at", "created_at"]
24
25
  ]
25
26
 
26
27
  current_year = date.today().year
@@ -55,7 +56,7 @@ class ConsumptionForm(forms.ModelForm):
55
56
  widgets = {
56
57
  "amount_used": forms.NumberInput(
57
58
  attrs={
58
- "style": "width: 109px; text-align: center; font-family: Mono;"
59
+ "style": "width: 95px; text-align: center; font-family: Mono;"
59
60
  }
60
61
  ),
61
62
  "date_of_using": forms.HiddenInput(),
@@ -0,0 +1,30 @@
1
+ # Generated by Django 4.2.25 on 2025-10-19 02:03
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ("canteen", "0016_consumption_unique_ingredient_date_of_using"),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AddField(
14
+ model_name="ingredient",
15
+ name="updated_at",
16
+ field=models.DateTimeField(
17
+ auto_now=True, null=True, verbose_name="Time of updating"
18
+ ),
19
+ ),
20
+ migrations.AlterField(
21
+ model_name="category",
22
+ name="created_at",
23
+ field=models.DateTimeField(null=True, verbose_name="创建日期"),
24
+ ),
25
+ migrations.AlterField(
26
+ model_name="mealtype",
27
+ name="created_at",
28
+ field=models.DateTimeField(null=True, verbose_name="创建日期"),
29
+ ),
30
+ ]
@@ -0,0 +1,23 @@
1
+ # Generated by Django 4.2.25 on 2025-10-20 16:57
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ (
10
+ "canteen",
11
+ "0017_ingredient_updated_at_alter_category_created_at_and_more",
12
+ ),
13
+ ]
14
+
15
+ operations = [
16
+ migrations.AlterField(
17
+ model_name="ingredient",
18
+ name="updated_at",
19
+ field=models.DateTimeField(
20
+ auto_now=True, null=True, verbose_name="更新时间"
21
+ ),
22
+ ),
23
+ ]
@@ -0,0 +1,48 @@
1
+ # Generated by Django 4.2.25 on 2025-10-24 01:44
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ("canteen", "0018_alter_ingredient_updated_at"),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AddField(
14
+ model_name="category",
15
+ name="updated_at",
16
+ field=models.DateTimeField(
17
+ auto_now=True, null=True, verbose_name="更新时间"
18
+ ),
19
+ ),
20
+ migrations.AddField(
21
+ model_name="ingredient",
22
+ name="created_at",
23
+ field=models.DateTimeField(
24
+ auto_now_add=True, null=True, verbose_name="Time of creating"
25
+ ),
26
+ ),
27
+ migrations.AddField(
28
+ model_name="mealtype",
29
+ name="updated_at",
30
+ field=models.DateTimeField(
31
+ auto_now=True, null=True, verbose_name="更新时间"
32
+ ),
33
+ ),
34
+ migrations.AlterField(
35
+ model_name="category",
36
+ name="created_at",
37
+ field=models.DateTimeField(
38
+ auto_now_add=True, null=True, verbose_name="创建日期"
39
+ ),
40
+ ),
41
+ migrations.AlterField(
42
+ model_name="mealtype",
43
+ name="created_at",
44
+ field=models.DateTimeField(
45
+ auto_now_add=True, null=True, verbose_name="创建日期"
46
+ ),
47
+ ),
48
+ ]
@@ -0,0 +1,20 @@
1
+ # Generated by Django 4.2.25 on 2025-10-24 15:20
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ("canteen", "0019_category_updated_at_ingredient_created_at_and_more"),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AlterField(
14
+ model_name="ingredient",
15
+ name="created_at",
16
+ field=models.DateTimeField(
17
+ auto_now_add=True, null=True, verbose_name="创建时间"
18
+ ),
19
+ ),
20
+ ]
@@ -0,0 +1,41 @@
1
+ # Generated by Django 4.2.26 on 2025-11-10 02:09
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ("canteen", "0020_alter_ingredient_created_at"),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AlterField(
14
+ model_name="category",
15
+ name="updated_at",
16
+ field=models.DateTimeField(
17
+ auto_now=True, null=True, verbose_name="Time of updating"
18
+ ),
19
+ ),
20
+ migrations.AlterField(
21
+ model_name="ingredient",
22
+ name="created_at",
23
+ field=models.DateTimeField(
24
+ auto_now_add=True, null=True, verbose_name="Time of creating"
25
+ ),
26
+ ),
27
+ migrations.AlterField(
28
+ model_name="ingredient",
29
+ name="updated_at",
30
+ field=models.DateTimeField(
31
+ auto_now=True, null=True, verbose_name="Time of updating"
32
+ ),
33
+ ),
34
+ migrations.AlterField(
35
+ model_name="mealtype",
36
+ name="updated_at",
37
+ field=models.DateTimeField(
38
+ auto_now=True, null=True, verbose_name="Time of updating"
39
+ ),
40
+ ),
41
+ ]
@@ -0,0 +1,41 @@
1
+ # Generated by Django 4.2.26 on 2025-11-11 06:11
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ("canteen", "0021_alter_category_updated_at_and_more"),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AlterField(
14
+ model_name="category",
15
+ name="updated_at",
16
+ field=models.DateTimeField(
17
+ auto_now=True, null=True, verbose_name="更新时间"
18
+ ),
19
+ ),
20
+ migrations.AlterField(
21
+ model_name="ingredient",
22
+ name="created_at",
23
+ field=models.DateTimeField(
24
+ auto_now_add=True, null=True, verbose_name="创建时间"
25
+ ),
26
+ ),
27
+ migrations.AlterField(
28
+ model_name="ingredient",
29
+ name="updated_at",
30
+ field=models.DateTimeField(
31
+ auto_now=True, null=True, verbose_name="更新时间"
32
+ ),
33
+ ),
34
+ migrations.AlterField(
35
+ model_name="mealtype",
36
+ name="updated_at",
37
+ field=models.DateTimeField(
38
+ auto_now=True, null=True, verbose_name="更新时间"
39
+ ),
40
+ ),
41
+ ]
@@ -7,6 +7,7 @@ from django.core.validators import MinValueValidator
7
7
  # Create your models here.
8
8
  from django.db import models
9
9
  from django.db.models import Q
10
+
10
11
  from fnschool import _
11
12
 
12
13
 
@@ -21,7 +22,16 @@ class MealType(models.Model):
21
22
  abbreviation = models.CharField(
22
23
  null=True, blank=True, max_length=100, verbose_name=_("Abbreviation")
23
24
  )
24
- created_at = models.DateField(verbose_name=_("Creating Date"))
25
+ created_at = models.DateTimeField(
26
+ null=True,
27
+ blank=True,
28
+ auto_now_add=True,
29
+ verbose_name=_("Creating Date"),
30
+ )
31
+ updated_at = models.DateTimeField(
32
+ null=True, blank=True, auto_now=True, verbose_name=_("Time of updating")
33
+ )
34
+
25
35
  is_disabled = models.BooleanField(
26
36
  default=False, verbose_name=_("Is Disabled")
27
37
  )
@@ -41,7 +51,13 @@ class Category(models.Model):
41
51
  abbreviation = models.CharField(
42
52
  null=True, blank=True, max_length=100, verbose_name=_("abbreviation")
43
53
  )
44
- created_at = models.DateField(verbose_name=_("Creating Date"))
54
+ created_at = models.DateTimeField(
55
+ null=True, auto_now_add=True, verbose_name=_("Creating Date")
56
+ )
57
+ updated_at = models.DateTimeField(
58
+ null=True, blank=True, auto_now=True, verbose_name=_("Time of updating")
59
+ )
60
+
45
61
  is_disabled = models.BooleanField(
46
62
  default=False, verbose_name=_("Is Disabled")
47
63
  )
@@ -74,6 +90,18 @@ class Ingredient(models.Model):
74
90
  verbose_name=_("User"),
75
91
  )
76
92
  storage_date = models.DateField(verbose_name=_("Storage Date"))
93
+
94
+ created_at = models.DateTimeField(
95
+ null=True,
96
+ blank=True,
97
+ auto_now_add=True,
98
+ verbose_name=_("Time of creating"),
99
+ )
100
+
101
+ updated_at = models.DateTimeField(
102
+ null=True, blank=True, auto_now=True, verbose_name=_("Time of updating")
103
+ )
104
+
77
105
  name = models.CharField(max_length=100, verbose_name=_("Ingredient Name"))
78
106
  meal_type = models.ForeignKey(
79
107
  MealType,
@@ -113,6 +141,10 @@ class Ingredient(models.Model):
113
141
  default=False, verbose_name=_("Is Ingredient Disabled")
114
142
  )
115
143
 
144
+ def __init__(self, *args, **kwargs):
145
+ super().__init__(*args, **kwargs)
146
+ self.quantity_used = Decimal("0")
147
+
116
148
  @property
117
149
  def unit_price(self):
118
150
  if self.quantity > 0:
@@ -135,6 +167,9 @@ class Ingredient(models.Model):
135
167
  return quantity
136
168
 
137
169
  def get_consuming_quantity(self, date_end):
170
+
171
+ if self.storage_date < date_end:
172
+ return 0
138
173
  consumptions = self.cleaned_consumptions
139
174
  if not consumptions:
140
175
  return 0
@@ -148,6 +183,8 @@ class Ingredient(models.Model):
148
183
  return quantity
149
184
 
150
185
  def get_remaining_quantity(self, date_end):
186
+ if self.storage_date < date_end:
187
+ return 0
151
188
  return self.quantity - self.get_consuming_quantity(date_end)
152
189
 
153
190
  @property
@@ -186,6 +223,7 @@ class Consumption(models.Model):
186
223
  )
187
224
 
188
225
  class Meta:
226
+
189
227
  verbose_name = _("Consumption Record")
190
228
  verbose_name_plural = _("Consumption Records")
191
229
  ordering = ["-date_of_using"]
@@ -11,7 +11,9 @@
11
11
  {{ form|crispy }}
12
12
  <div class="py-3 fixed-bottom text-end bg-dark">
13
13
  <button type="submit" class="btn btn-primary">{% trans "Save" %}</button>
14
- <button type="button" class="btn btn-danger" onclick="window.close();">{% trans "Cancel" %}</button>
14
+ <button type="button" class="btn btn-danger" onclick="window.close();">
15
+ {% trans "Cancel" %}
16
+ </button>
15
17
  </div>
16
18
  </form>
17
19
  {% endblock %}
@@ -55,7 +55,9 @@
55
55
  style="display: inline">
56
56
  {% csrf_token %}
57
57
  <button type="submit" class="btn btn-danger">{% trans 'Delete' %}</button>
58
- <button type="button" class="btn btn-primary" onclick="window.close();">{% trans "Cancel" %}</button>
58
+ <button type="button" class="btn btn-primary" onclick="window.close();">
59
+ {% trans "Cancel" %}
60
+ </button>
59
61
  </form>
60
62
  </div>
61
63
  <script>
@@ -1,4 +1,4 @@
1
- {% extends "base/header_content_footer.html" %}
1
+ {% extends "base/document.html" %}
2
2
  {% load crispy_forms_tags %}
3
3
  {% block title %}
4
4
  {% trans "Category list" %}
@@ -17,7 +17,9 @@
17
17
  {% csrf_token %} {{ form|crispy }}
18
18
  <div class="py-3 fixed-bottom text-end bg-dark">
19
19
  <button type="submit" class="btn btn-primary">{% trans "Save" %}</button>
20
- <button type="button" class="btn btn-danger" onclick="window.close();">{% trans "Cancel" %}</button>
20
+ <button type="button" class="btn btn-danger" onclick="window.close();">
21
+ {% trans "Cancel" %}
22
+ </button>
21
23
  </div>
22
24
  </form>
23
25
  {% endblock %}
@@ -1,4 +1,4 @@
1
- {% extends "base/header_content_footer.html" %}
1
+ {% extends "base/document.html" %}
2
2
  {% load crispy_forms_tags %}
3
3
  {% block title %}
4
4
  {% trans "Consume Ingredients" %}
@@ -9,15 +9,24 @@
9
9
  <div class="container">
10
10
  <div class="row justify-content-end">
11
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>
12
+ onclick="list_consumptions_by_week();">
13
+ {% trans "Consume by Week" %}
14
+ </button>
13
15
 
14
16
  <button class="btn btn-outline-success col-md-1 col-lg-1 col-2"
15
- onclick="list_consumptions_rapidly();">{% trans "Rapid Consumption" %}</button>
17
+ onclick="list_consumptions_rapidly();">
18
+ {% trans "Rapid Consumption" %}
19
+ </button>
16
20
 
17
21
  <a class="btn btn-success col-md-1 col-lg-1 col-2 mx-2"
18
22
  target="canteen_list_categories"
19
23
  href="{% url "canteen:list_categories" %}">{% trans "Ingredient Categories" %}</a>
20
24
 
25
+ <a class="btn btn-primary col-md-1 col-lg-1 col-2 "
26
+ target="canteen_list_meal_types"
27
+ href="{% url "canteen:list_meal_types" %}">{% trans "Ingredient Meal Types" %}</a>
28
+
29
+
21
30
  <div class="col col-3 col-md-2 col-lg-2">
22
31
  <input class=" form-control"
23
32
  onkeydown="if(event.keyCode==13){list_consumptions();}"
@@ -38,7 +47,7 @@
38
47
  onclick="list_consumptions();">{% trans "Refresh" %}</button>
39
48
  </div>
40
49
  </div>
41
- <div class="table table-responsive table-container">
50
+ <div class="table-responsive table-container">
42
51
  <table class="table table-consumptions cotable-bordered table-striped table-hover table-condensed scroll-vertical ">
43
52
  <thead>
44
53
  <tr>
@@ -49,10 +58,10 @@
49
58
  {% for date_h in date_range %}
50
59
  <th data-date_of_using="{{ date_h }}" class="consumption-date">
51
60
  {{ date_h }}
52
- <br />
53
- |
54
- <br />
55
- |
61
+ {% for meal_type in meal_types %}
62
+ <br />
63
+ |
64
+ {% endfor %}
56
65
  </th>
57
66
  {% empty %}
58
67
  <th></th>
@@ -65,6 +74,9 @@
65
74
  data-ingredient_id="{{ ingredient.id }}"
66
75
  data-ingredient_name="{{ ingredient.name }}"
67
76
  data-ingredient_quantity="{{ ingredient.quantity }}"
77
+ data-ingredient_quantity_used="{{ ingredient.quantity_used }}"
78
+ data-ingredient_remaining_quantity="{{ ingredient.remaining_quantity }}"
79
+ data-ingredient_consuming_quantity="{{ ingredient.consuming_quantity }}"
68
80
  data-ingredient_total_price="{{ ingredient.total_price }}"
69
81
  data-ingredient_meal_type="{{ ingredient.meal_type }}"
70
82
  data-ingredient_quantity_unit_name="{{ ingredient.quantity_unit_name }}"
@@ -73,16 +85,15 @@
73
85
  <td title="{% blocktrans with storage_date=ingredient.storage_date %}Storaged on {{ storage_date }} .{% endblocktrans %}"
74
86
  class="">
75
87
  <div class='ingredient-progress'
76
- style="width:{% widthratio ingredient.remaining_quantity ingredient.quantity 100 %}%"></div>
88
+ style="width:{% widthratio ingredient.remaining_quantity ingredient.quantity 100 %}%">
89
+ </div>
77
90
  {{ ingredient.name }}
78
- {% if ingredient.meal_type %}
91
+ {% if ingredient.meal_type != meal_type_name_0 %}
79
92
  <br />
80
93
  ({{ ingredient.meal_type }})
81
94
  {% endif %}
82
95
  </td>
83
- <td name="remaining_{{ ingredient.id }}">
84
- {{ ingredient.quantity }}-{{ ingredient.consuming_quantity }}={{ ingredient.remaining_quantity }}
85
- </td>
96
+ <td name="remaining_{{ ingredient.id }}"></td>
86
97
  </tr>
87
98
  {% empty %}
88
99
  <tr>{% trans "No ingredient found." %}</tr>
@@ -91,10 +102,22 @@
91
102
  </table>
92
103
  </div>
93
104
  <div class="">
94
- <button onclick="generate_spreadsheet();"
95
- class="btn btn-submit-consumptions btn-success float-end">{% trans "Generate Spreadsheet" %}</button>
105
+ <button id="generate_spreadsheet_btn"
106
+ onclick="generate_spreadsheet();"
107
+ class="btn btn-submit-consumptions btn-success float-end">
108
+ {% trans "Generate Spreadsheet" %}
109
+ </button>
96
110
  <select class="workbook-month-select form-select float-end mx-2"
97
111
  style="width:118px"></select>
112
+ <div class="form-check float-end mx-1 pt-2">
113
+ <label class="form-check-label" for="include_food_sheets">
114
+ {% trans 'Ingredient Sheets are also included.' %}
115
+ </label>
116
+ <input class="form-check-input"
117
+ type="checkbox"
118
+ value=""
119
+ id="include_food_sheets">
120
+ </div>
98
121
  </div>
99
122
  {{ ingredient_ids|json_script:'ingredient_ids' }}
100
123
  {{ months|json_script:'months' }}
@@ -107,11 +130,24 @@
107
130
  var months = JSON.parse($("#months").text())
108
131
  var meal_types = JSON.parse($("#meal_types").text())
109
132
  var date_range = JSON.parse($("#date_range").text())
110
-
111
133
  var storage_date_start = $('#storage_date_start').text().replace(new RegExp('"', 'g'), "")
112
134
 
113
135
  var dont_submit = false
114
136
 
137
+ $(document).ready(function() {
138
+ $(ingredient_ids).each(function(index, ingredient_id) {
139
+ var td = $(`td[name='remaining_${ingredient_id}']`)
140
+ var tr = $(td.closest("tr"))
141
+ var ingredient_quantity = parseInt(tr.data("ingredient_quantity")) || 0
142
+ var ingredient_quantity_used = parseInt(tr.data("ingredient_quantity_used")) || 0
143
+ var ingredient_consuming_quantity = parseInt(tr.data("ingredient_consuming_quantity")) || 0
144
+ var ingredient_remaining_quantity = parseInt(tr.data("ingredient_remaining_quantity")) || 0
145
+ td.text(
146
+ `${ingredient_quantity-ingredient_quantity_used}-${ingredient_consuming_quantity-ingredient_quantity_used}=${ingredient_remaining_quantity}`
147
+ )
148
+ });
149
+
150
+ });
115
151
 
116
152
  function list_consumptions_rapidly() {
117
153
  query = {
@@ -216,8 +252,10 @@
216
252
 
217
253
  function amount_used_input_blur(element) {
218
254
  element = $(element)
219
- var ingredient_quantity = element.closest('tr').data("ingredient_quantity")
220
- ingredient_quantity = parseInt(ingredient_quantity) || 0
255
+ var ingredient_quantity = parseInt(element.closest('tr').data("ingredient_quantity")) || 0
256
+ var ingredient_quantity_used = parseInt(element.closest("tr").data("ingredient_quantity_used")) || 0
257
+ ingredient_quantity = ingredient_quantity - ingredient_quantity_used
258
+
221
259
  var $consumption_form = element.closest("form")
222
260
  var amount_used = parseInt($consumption_form.data("amount_used")) || 0
223
261
  var new_amount_used = parseInt($.trim(element.val())) || 0
@@ -363,16 +401,21 @@
363
401
  });
364
402
 
365
403
  function generate_spreadsheet() {
404
+ var include_food_sheets = $("#include_food_sheets").is(':checked')
366
405
  var month = $(".workbook-month-select").val()
367
- window.open(`/canteen/generate_spreadsheet/${month}`, 'generate_spreadsheet');
406
+ if (include_food_sheets) {
407
+ window.open(`/canteen/generate_spreadsheet/${month}?include_food_sheets=true`, 'generate_spreadsheet');
408
+ } else {
409
+ window.open(`/canteen/generate_spreadsheet/${month}`, 'generate_spreadsheet');
410
+ }
368
411
  }
369
412
 
370
413
  function set_consumptions_table_size() {
371
- const submit_consumptions_btn = $(".btn-submit-consumptions")
414
+ const generate_spreadsheet_btn = $("#generate_spreadsheet_btn")
372
415
  const consumptions_table = $(".table-consumptions")
373
416
  const header = $("header")
374
417
  const footer = $("footer")
375
- const height = Math.round((footer.offset().top - submit_consumptions_btn.height() - consumptions_table.offset().top) * 0.95)
418
+ const height = Math.round((footer.offset().top - generate_spreadsheet_btn.height() - consumptions_table.offset().top) * 0.95)
376
419
  consumptions_table.parent().height(height)
377
420
  }
378
421
  $(window).resize(function() {
@@ -12,8 +12,12 @@
12
12
  <form method="post" enctype="multipart/form-data">
13
13
  {% csrf_token %} {{ form|crispy }}
14
14
  <div class="py-3 fixed-bottom text-end bg-dark">
15
- <button type="submit button" class="btn btn-outline-primary">{% trans "Upload" %}</button>
16
- <button type="button" class="btn btn-danger" onclick="window.close();">{% trans "Cancel" %}</button>
15
+ <button type="submit button" class="btn btn-outline-primary">
16
+ {% trans "Upload" %}
17
+ </button>
18
+ <button type="button" class="btn btn-danger" onclick="window.close();">
19
+ {% trans "Cancel" %}
20
+ </button>
17
21
  </div>
18
22
  </form>
19
23
  {% endblock %}
@@ -11,7 +11,9 @@
11
11
  {{ form|crispy }}
12
12
  <div class="py-3 fixed-bottom text-end bg-dark">
13
13
  <button type="submit" class="btn btn-primary">{% trans "Save" %}</button>
14
- <button type="button" class="btn btn-danger" onclick="window.close();">{% trans "Cancel" %}</button>
14
+ <button type="button" class="btn btn-danger" onclick="window.close();">
15
+ {% trans "Cancel" %}
16
+ </button>
15
17
  </div>
16
18
  </form>
17
19
  {% endblock %}
@@ -32,7 +32,9 @@
32
32
  style="display: inline">
33
33
  {% csrf_token %}
34
34
  <button type="submit" class="btn btn-danger">{% trans 'Delete' %}</button>
35
- <button type="button" class="btn btn-primary" onclick="window.close();">{% trans "Cancel" %}</button>
35
+ <button type="button" class="btn btn-primary" onclick="window.close();">
36
+ {% trans "Cancel" %}
37
+ </button>
36
38
  </form>
37
39
  </div>
38
40
  <script>