Skip to content
Snippets Groups Projects
Commit 1712dd53 authored by Jonathan Weth's avatar Jonathan Weth :keyboard:
Browse files

Merge branch 'prepare-release-3.0b0' into 'master'

Prepare release 3.0b0

See merge request AlekSIS/official/AlekSIS-App-Alsijil!323
parents 7684a2db 6ab77cc6
Branches
No related tags found
No related merge requests found
Showing
with 1173 additions and 835 deletions
module.exports = {
extends: [
"eslint:recommended",
"plugin:vue/strongly-recommended",
// "plugin:prettier/recommended",
"plugin:@intlify/vue-i18n/recommended",
],
rules: {
"no-unused-vars": "warn",
"vue/no-unused-vars": "off",
"vue/multi-word-component-names": "off",
"@intlify/vue-i18n/key-format-style": [
"error",
"snake_case",
{
splitByDots: false,
},
],
// "@intlify/vue-i18n/no-unused-keys": ["warn", {}],
"@intlify/vue-i18n/no-raw-text": [
"error",
{
ignoreNodes: ["v-icon"],
ignorePattern: "^[-–—·#:()\\[\\]&\\.\\s]+$",
},
],
// Fixes for prettier (avoid eslint-config-prettier)
// The following rules can be used in some cases. See the README for more
// information. (These are marked with `0` instead of `"off"` so that a
// script can distinguish them.)
curly: 0,
"lines-around-comment": 0,
"max-len": 0,
"no-confusing-arrow": 0,
"no-mixed-operators": 0,
"no-tabs": 0,
"no-unexpected-multiline": 0,
quotes: 0,
"@typescript-eslint/quotes": 0,
"babel/quotes": 0,
"vue/html-self-closing": 0,
"vue/max-len": 0,
// The rest are rules that you never need to enable when using Prettier.
"array-bracket-newline": "off",
"array-bracket-spacing": "off",
"array-element-newline": "off",
"arrow-parens": "off",
"arrow-spacing": "off",
"block-spacing": "off",
"brace-style": "off",
"comma-dangle": "off",
"comma-spacing": "off",
"comma-style": "off",
"computed-property-spacing": "off",
"dot-location": "off",
"eol-last": "off",
"func-call-spacing": "off",
"function-call-argument-newline": "off",
"function-paren-newline": "off",
"generator-star": "off",
"generator-star-spacing": "off",
"implicit-arrow-linebreak": "off",
indent: "off",
"jsx-quotes": "off",
"key-spacing": "off",
"keyword-spacing": "off",
"linebreak-style": "off",
"multiline-ternary": "off",
"newline-per-chained-call": "off",
"new-parens": "off",
"no-arrow-condition": "off",
"no-comma-dangle": "off",
"no-extra-parens": "off",
"no-extra-semi": "off",
"no-floating-decimal": "off",
"no-mixed-spaces-and-tabs": "off",
"no-multi-spaces": "off",
"no-multiple-empty-lines": "off",
"no-reserved-keys": "off",
"no-space-before-semi": "off",
"no-trailing-spaces": "off",
"no-whitespace-before-property": "off",
"no-wrap-func": "off",
"nonblock-statement-body-position": "off",
"object-curly-newline": "off",
"object-curly-spacing": "off",
"object-property-newline": "off",
"one-var-declaration-per-line": "off",
"operator-linebreak": "off",
"padded-blocks": "off",
"quote-props": "off",
"rest-spread-spacing": "off",
semi: "off",
"semi-spacing": "off",
"semi-style": "off",
"space-after-function-name": "off",
"space-after-keywords": "off",
"space-before-blocks": "off",
"space-before-function-paren": "off",
"space-before-function-parentheses": "off",
"space-before-keywords": "off",
"space-in-brackets": "off",
"space-in-parens": "off",
"space-infix-ops": "off",
"space-return-throw-case": "off",
"space-unary-ops": "off",
"space-unary-word-ops": "off",
"switch-colon-spacing": "off",
"template-curly-spacing": "off",
"template-tag-spacing": "off",
"unicode-bom": "off",
"wrap-iife": "off",
"wrap-regex": "off",
"yield-star-spacing": "off",
"@babel/object-curly-spacing": "off",
"@babel/semi": "off",
"@typescript-eslint/brace-style": "off",
"@typescript-eslint/comma-dangle": "off",
"@typescript-eslint/comma-spacing": "off",
"@typescript-eslint/func-call-spacing": "off",
"@typescript-eslint/indent": "off",
"@typescript-eslint/keyword-spacing": "off",
"@typescript-eslint/member-delimiter-style": "off",
"@typescript-eslint/no-extra-parens": "off",
"@typescript-eslint/no-extra-semi": "off",
"@typescript-eslint/object-curly-spacing": "off",
"@typescript-eslint/semi": "off",
"@typescript-eslint/space-before-blocks": "off",
"@typescript-eslint/space-before-function-paren": "off",
"@typescript-eslint/space-infix-ops": "off",
"@typescript-eslint/type-annotation-spacing": "off",
"babel/object-curly-spacing": "off",
"babel/semi": "off",
"flowtype/boolean-style": "off",
"flowtype/delimiter-dangle": "off",
"flowtype/generic-spacing": "off",
"flowtype/object-type-curly-spacing": "off",
"flowtype/object-type-delimiter": "off",
"flowtype/quotes": "off",
"flowtype/semi": "off",
"flowtype/space-after-type-colon": "off",
"flowtype/space-before-generic-bracket": "off",
"flowtype/space-before-type-colon": "off",
"flowtype/union-intersection-spacing": "off",
"react/jsx-child-element-spacing": "off",
"react/jsx-closing-bracket-location": "off",
"react/jsx-closing-tag-location": "off",
"react/jsx-curly-newline": "off",
"react/jsx-curly-spacing": "off",
"react/jsx-equals-spacing": "off",
"react/jsx-first-prop-new-line": "off",
"react/jsx-indent": "off",
"react/jsx-indent-props": "off",
"react/jsx-max-props-per-line": "off",
"react/jsx-newline": "off",
"react/jsx-one-expression-per-line": "off",
"react/jsx-props-no-multi-spaces": "off",
"react/jsx-tag-spacing": "off",
"react/jsx-wrap-multilines": "off",
"standard/array-bracket-even-spacing": "off",
"standard/computed-property-even-spacing": "off",
"standard/object-curly-even-spacing": "off",
"unicorn/empty-brace-spaces": "off",
"unicorn/no-nested-ternary": "off",
"unicorn/number-literal-case": "off",
"vue/array-bracket-newline": "off",
"vue/array-bracket-spacing": "off",
"vue/arrow-spacing": "off",
"vue/block-spacing": "off",
"vue/block-tag-newline": "off",
"vue/brace-style": "off",
"vue/comma-dangle": "off",
"vue/comma-spacing": "off",
"vue/comma-style": "off",
"vue/dot-location": "off",
"vue/func-call-spacing": "off",
"vue/html-closing-bracket-newline": "off",
"vue/html-closing-bracket-spacing": "off",
"vue/html-end-tags": "off",
"vue/html-indent": "off",
"vue/html-quotes": "off",
"vue/key-spacing": "off",
"vue/keyword-spacing": "off",
"vue/max-attributes-per-line": "off",
"vue/multiline-html-element-content-newline": "off",
"vue/multiline-ternary": "off",
"vue/mustache-interpolation-spacing": "off",
"vue/no-extra-parens": "off",
"vue/no-multi-spaces": "off",
"vue/no-spaces-around-equal-signs-in-attribute": "off",
"vue/object-curly-newline": "off",
"vue/object-curly-spacing": "off",
"vue/object-property-newline": "off",
"vue/operator-linebreak": "off",
"vue/quote-props": "off",
"vue/script-indent": "off",
"vue/singleline-html-element-content-newline": "off",
"vue/space-in-parens": "off",
"vue/space-infix-ops": "off",
"vue/space-unary-ops": "off",
"vue/template-curly-spacing": "off",
},
settings: {
"vue-i18n": {
localeDir: "./aleksis/core/frontend/messages/*.{json}",
messageSyntaxVersion: "^8.0.0",
},
},
env: {
es2021: true,
},
parserOptions: {
ecmaVersion: "latest",
},
};
include: include:
- project: "AlekSIS/official/AlekSIS" - project: "AlekSIS/official/AlekSIS"
file: /ci/general.yml file: /ci/general.yml
- project: "AlekSIS/official/AlekSIS" - project: "AlekSIS/official/AlekSIS"
file: /ci/prepare/lock.yml file: /ci/prepare/lock.yml
- project: "AlekSIS/official/AlekSIS" - project: "AlekSIS/official/AlekSIS"
file: /ci/test/test.yml file: /ci/test/test.yml
- project: "AlekSIS/official/AlekSIS" - project: "AlekSIS/official/AlekSIS"
file: /ci/test/lint.yml file: /ci/test/lint.yml
- project: "AlekSIS/official/AlekSIS" - project: "AlekSIS/official/AlekSIS"
file: /ci/test/security.yml file: /ci/test/security.yml
- project: "AlekSIS/official/AlekSIS" - project: "AlekSIS/official/AlekSIS"
file: /ci/build/dist.yml file: /ci/build/dist.yml
- project: "AlekSIS/official/AlekSIS" - project: "AlekSIS/official/AlekSIS"
file: /ci/publish/pypi.yml file: /ci/publish/pypi.yml
- project: "AlekSIS/official/AlekSIS" - project: "AlekSIS/official/AlekSIS"
file: /ci/docker/image.yml file: /ci/docker/image.yml
# Byte-compiled / optimized / DLL files
*$py.class
*.py[cod]
__pycache__/
# Distribution / packaging
*.egg
*.egg-info/
.Python
.eggs/
.installed.cfg
build/
develop-eggs/
dist/
downloads/
eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
# Installer logs
pip-delete-this-directory.txt
pip-log.txt
# Translations
*.mo
*.pot
# Django stuff:
*.log
local_settings.py
# pyenv
.python-version
# Environments
.env
.venv
ENV/
env/
venv/
# Editors
*~
DEADJOE
\#*#
# IntelliJ
.idea
.idea/
# Database
db.sqlite3
# Sphinx
docs/_build/
# TeX
*.aux
# Generated files
/node_modules/
/static/
/whoosh_index/
poetry.lock
.coverage
.mypy_cache/
.tox/
htmlcov/
maintenance_mode_state.txt
media/
package-lock.json
yarn.lock
# VSCode
.vscode/
.history/
*.code-workspace
/cache
# Add HTML files to avoid problems with unsupported Django templates
*.html
# Do not check/reformat generated files
aleksis/core/util/licenses.json
.vite/
...@@ -6,21 +6,36 @@ All notable changes to this project will be documented in this file. ...@@ -6,21 +6,36 @@ All notable changes to this project will be documented in this file.
The format is based on `Keep a Changelog`_, The format is based on `Keep a Changelog`_,
and this project adheres to `Semantic Versioning`_. and this project adheres to `Semantic Versioning`_.
Breaking changes Unreleased
---------------- ----------
`3.0`_ - 2023-05-15
-------------------
Fixed
~~~~~
* In some cases, pages showing the count of extra marks and lessons with custom excuse types of
persons threw an error.
* The redirection to generated class register PDF printouts did not work.
* Some columns in the table showing statistics for the members of a group were labled wrongly.
* Absences with custom excuse types were not counted correctly.
* Tabs on the week overview page were not displayed.
`3.0b0`_ - 2023-02-28
---------------------
This version requires AlekSIS-Core 3.0. It is incompatible with any previous
version.
Removed Removed
~~~~~~~ ~~~~~~~
* Remove legacy menu entries. * Legacy menu integration for AlekSIS-Core pre-3.0
Unreleased
----------
Added Added
~~~~~ ~~~~~
* Add SPA support. * Add SPA support for AlekSIS-Core 3.0
Changed Changed
~~~~~~~ ~~~~~~~
...@@ -302,3 +317,5 @@ Fixed ...@@ -302,3 +317,5 @@ Fixed
.. _2.0.1: https://edugit.org/AlekSIS/Official/AlekSIS-App-Alsijil/-/tags/2.0.1 .. _2.0.1: https://edugit.org/AlekSIS/Official/AlekSIS-App-Alsijil/-/tags/2.0.1
.. _2.1: https://edugit.org/AlekSIS/Official/AlekSIS-App-Alsijil/-/tags/2.1 .. _2.1: https://edugit.org/AlekSIS/Official/AlekSIS-App-Alsijil/-/tags/2.1
.. _2.1.1: https://edugit.org/AlekSIS/Official/AlekSIS-App-Alsijil/-/tags/2.1.1 .. _2.1.1: https://edugit.org/AlekSIS/Official/AlekSIS-App-Alsijil/-/tags/2.1.1
.. _3.0b0: https://edugit.org/AlekSIS/Official/AlekSIS-App-Alsijil/-/tags/3.0b0
.. _3.0: https://edugit.org/AlekSIS/Official/AlekSIS-App-Alsijil/-/tags/3.0
import { notLoggedInValidator, hasPersonValidator } from "aleksis.core/routeValidators"; import {
notLoggedInValidator,
hasPersonValidator,
} from "aleksis.core/routeValidators";
export default export default {
{ meta: {
meta: { inMenu: true,
inMenu: true, titleKey: "alsijil.menu_title",
titleKey: "alsijil.menu_title", icon: "mdi-account-group-outline",
icon: "mdi-account-group-outline", validators: [hasPersonValidator],
validators: [ },
hasPersonValidator props: {
] byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
}, },
props: { children: [
byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true, {
}, path: "lesson",
children: [ component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
{ name: "alsijil.lessonPeriod",
path: "lesson", meta: {
component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"), inMenu: true,
name: "alsijil.lessonPeriod", titleKey: "alsijil.lesson.menu_title",
meta: { icon: "mdi-alarm",
inMenu: true, permission: "alsijil.view_lesson_menu_rule",
titleKey: "alsijil.lesson.menu_title", },
icon: "mdi-alarm", props: {
permission: "alsijil.view_lesson_menu_rule", byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
}, },
props: { },
byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true, {
}, path: "lesson/:year(\\d+)/:week(\\d+)/:id_(\\d+)",
}, component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
{ name: "alsijil.lessonPeriodByCWAndID",
path: "lesson/:year(\\d+)/:week(\\d+)/:id_(\\d+)", props: {
component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"), byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
name: "alsijil.lessonPeriodByCWAndID", },
props: { },
byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true, {
}, path: "extra_lesson/:id_(\\d+)/",
}, component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
{ name: "alsijil.extraLessonByID",
path: "extra_lesson/:id_(\\d+)/", props: {
component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"), byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
name: "alsijil.extraLessonByID", },
props: { },
byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true, {
}, path: "event/:id_(\\d+)/",
}, component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
{ name: "alsijil.eventByID",
path: "event/:id_(\\d+)/", props: {
component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"), byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
name: "alsijil.eventByID", },
props: { },
byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true, {
}, path: "week/",
}, component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
{ name: "alsijil.weekView",
path: "week/", meta: {
component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"), inMenu: true,
name: "alsijil.weekView", titleKey: "alsijil.week.menu_title",
meta: { icon: "mdi-view-week-outline",
inMenu: true, permission: "alsijil.view_week_menu_rule",
titleKey: "alsijil.week.menu_title", },
icon: "mdi-view-week-outline", props: {
permission: "alsijil.view_week_menu_rule", byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
}, },
props: { },
byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true, {
}, path: "week/:year(\\d+)/:week(\\d+)/",
}, component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
{ name: "alsijil.weekViewByWeek",
path: "week/:year(\\d+)/:week(\\d+)/", props: {
component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"), byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
name: "alsijil.weekViewByWeek", },
props: { },
byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true, {
}, path: "week/year/cw/",
}, component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
{ name: "alsijil.weekViewPlaceholders",
path: "week/year/cw/", props: {
component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"), byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
name: "alsijil.weekViewPlaceholders", },
props: { },
byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true, {
}, path: "week/:type_/:id_(\\d+)/",
}, component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
{ name: "alsijil.weekViewByTypeAndID",
path: "week/:type_/:id_(\\d+)/", props: {
component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"), byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
name: "alsijil.weekViewByTypeAndID", },
props: { },
byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true, {
}, path: "week/year/cw/:type_/:id_(\\d+)/",
}, component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
{ name: "alsijil.weekViewPlaceholdersByTypeAndID",
path: "week/year/cw/:type_/:id_(\\d+)/", props: {
component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"), byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
name: "alsijil.weekViewPlaceholdersByTypeAndID", },
props: { },
byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true, {
}, path: "week/:year(\\d+)/:week(\\d+)/:type_/:id_(\\d+)/",
}, component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
{ name: "alsijil.weekViewByWeekTypeAndID",
path: "week/:year(\\d+)/:week(\\d+)/:type_/:id_(\\d+)/", props: {
component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"), byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
name: "alsijil.weekViewByWeekTypeAndID", },
props: { },
byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true, {
}, path: "print/group/:id_(\\d+)",
}, component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
{ name: "alsijil.fullRegisterGroup",
path: "print/group/:id_(\\d+)", props: {
component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"), byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
name: "alsijil.fullRegisterGroup", },
props: { },
byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true, {
}, path: "groups/",
}, component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
{ name: "alsijil.myGroups",
path: "groups/", meta: {
component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"), inMenu: true,
name: "alsijil.myGroups", titleKey: "alsijil.groups.menu_title",
meta: { icon: "mdi-account-multiple-outline",
inMenu: true, permission: "alsijil.view_my_groups_rule",
titleKey: "alsijil.groups.menu_title", },
icon: "mdi-account-multiple-outline", props: {
permission: "alsijil.view_my_groups_rule", byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
}, },
props: { },
byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true, {
}, path: "groups/:pk(\\d+)/",
}, component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
{ name: "alsijil.studentsList",
path: "groups/:pk(\\d+)/", props: {
component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"), byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
name: "alsijil.studentsList", },
props: { },
byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true, {
}, path: "persons/",
}, component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
{ name: "alsijil.myStudents",
path: "persons/", meta: {
component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"), inMenu: true,
name: "alsijil.myStudents", titleKey: "alsijil.persons.menu_title",
meta: { icon: "mdi-account-school-outline",
inMenu: true, permission: "alsijil.view_my_students_rule",
titleKey: "alsijil.persons.menu_title", },
icon: "mdi-account-school-outline", props: {
permission: "alsijil.view_my_students_rule", byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
}, },
props: { },
byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true, {
}, path: "persons/:id_(\\d+)/",
}, component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
{ name: "alsijil.overviewPerson",
path: "persons/:id_(\\d+)/", props: {
component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"), byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
name: "alsijil.overviewPerson", },
props: { },
byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true, {
}, path: "me/",
}, component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
{ name: "alsijil.overviewMe",
path: "me/", meta: {
component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"), inMenu: true,
name: "alsijil.overviewMe", titleKey: "alsijil.my_overview.menu_title",
meta: { icon: "mdi-chart-box-outline",
inMenu: true, permission: "alsijil.view_person_overview_menu_rule",
titleKey: "alsijil.my_overview.menu_title", },
icon: "mdi-chart-box-outline", props: {
permission: "alsijil.view_person_overview_menu_rule", byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
}, },
props: { },
byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true, {
}, path: "notes/:pk(\\d+)/delete/",
}, component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
{ name: "alsijil.deletePersonalNote",
path: "notes/:pk(\\d+)/delete/", props: {
component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"), byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
name: "alsijil.deletePersonalNote", },
props: { },
byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true, {
}, path: "absence/new/:id_(\\d+)/",
}, component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
{ name: "alsijil.registerAbsenceWithID",
path: "absence/new/:id_(\\d+)/", props: {
component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"), byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
name: "alsijil.registerAbsenceWithID", },
props: { },
byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true, {
}, path: "absence/new/",
}, component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
{ name: "alsijil.registerAbsence",
path: "absence/new/", meta: {
component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"), inMenu: true,
name: "alsijil.registerAbsence", titleKey: "alsijil.absence.menu_title",
meta: { icon: "mdi-message-alert-outline",
inMenu: true, permission: "alsijil.view_register_absence_rule",
titleKey: "alsijil.absence.menu_title", },
icon: "mdi-message-alert-outline", props: {
permission: "alsijil.view_register_absence_rule", byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
}, },
props: { },
byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true, {
}, path: "extra_marks/",
}, component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
{ name: "alsijil.extraMarks",
path: "extra_marks/", meta: {
component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"), inMenu: true,
name: "alsijil.extraMarks", titleKey: "alsijil.extra_marks.menu_title",
meta: { icon: "mdi-label-variant-outline",
inMenu: true, permission: "alsijil.view_extramarks_rule",
titleKey: "alsijil.extra_marks.menu_title", },
icon: "mdi-label-variant-outline", props: {
permission: "alsijil.view_extramarks_rule", byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
}, },
props: { },
byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true, {
}, path: "extra_marks/create/",
}, component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
{ name: "alsijil.createExtraMark",
path: "extra_marks/create/", props: {
component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"), byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
name: "alsijil.createExtraMark", },
props: { },
byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true, {
}, path: "extra_marks/:pk(\\d+)/edit/",
}, component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
{ name: "alsijil.editExtraMark",
path: "extra_marks/:pk(\\d+)/edit/", props: {
component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"), byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
name: "alsijil.editExtraMark", },
props: { },
byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true, {
}, path: "extra_marks/:pk(\\d+)/delete/",
}, component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
{ name: "alsijil.deleteExtraMark",
path: "extra_marks/:pk(\\d+)/delete/", props: {
component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"), byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
name: "alsijil.deleteExtraMark", },
props: { },
byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true, {
}, path: "excuse_types/",
}, component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
{ name: "alsijil.excuseTypes",
path: "excuse_types/", meta: {
component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"), inMenu: true,
name: "alsijil.excuseTypes", titleKey: "alsijil.excuse_types.menu_title",
meta: { icon: "mdi-label-outline",
inMenu: true, permission: "alsijil.view_excusetypes_rule",
titleKey: "alsijil.excuse_types.menu_title", },
icon: "mdi-label-outline", props: {
permission: "alsijil.view_excusetypes_rule", byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
}, },
props: { },
byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true, {
}, path: "excuse_types/create/",
}, component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
{ name: "alsijil.createExcuseType",
path: "excuse_types/create/", props: {
component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"), byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
name: "alsijil.createExcuseType", },
props: { },
byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true, {
}, path: "excuse_types/:pk(\\d+)/edit/",
}, component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
{ name: "alsijil.editExcuseType",
path: "excuse_types/:pk(\\d+)/edit/", props: {
component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"), byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
name: "alsijil.editExcuseType", },
props: { },
byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true, {
}, path: "excuse_types/:pk(\\d+)/delete/",
}, component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
{ name: "alsijil.deleteExcuseType",
path: "excuse_types/:pk(\\d+)/delete/", props: {
component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"), byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
name: "alsijil.deleteExcuseType", },
props: { },
byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true, {
}, path: "group_roles/",
}, component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
{ name: "alsijil.groupRoles",
path: "group_roles/", meta: {
component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"), inMenu: true,
name: "alsijil.groupRoles", titleKey: "alsijil.group_roles.menu_title_manage",
meta: { icon: "mdi-clipboard-plus-outline",
inMenu: true, permission: "alsijil.view_grouproles_rule",
titleKey: "alsijil.group_roles.menu_title_manage", },
icon: "mdi-clipboard-plus-outline", props: {
permission: "alsijil.view_grouproles_rule", byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
}, },
props: { },
byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true, {
}, path: "group_roles/create/",
}, component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
{ name: "alsijil.createGroupRole",
path: "group_roles/create/", props: {
component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"), byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
name: "alsijil.createGroupRole", },
props: { },
byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true, {
}, path: "group_roles/:pk(\\d+)/edit/",
}, component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
{ name: "alsijil.editGroupRole",
path: "group_roles/:pk(\\d+)/edit/", props: {
component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"), byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
name: "alsijil.editGroupRole", },
props: { },
byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true, {
}, path: "group_roles/:pk(\\d+)/delete/",
}, component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
{ name: "alsijil.deleteGroupRole",
path: "group_roles/:pk(\\d+)/delete/", props: {
component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"), byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
name: "alsijil.deleteGroupRole", },
props: { },
byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true, {
}, path: "groups/:pk(\\d+)/group_roles/",
}, component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
{ name: "alsijil.assignedGroupRoles",
path: "groups/:pk(\\d+)/group_roles/", props: {
component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"), byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
name: "alsijil.assignedGroupRoles", },
props: { },
byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true, {
}, path: "groups/:pk(\\d+)/group_roles/assign/",
}, component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
{ name: "alsijil.assignGroupRole",
path: "groups/:pk(\\d+)/group_roles/assign/", props: {
component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"), byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
name: "alsijil.assignGroupRole", },
props: { },
byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true, {
}, path: "groups/:pk(\\d+)/group_roles/:role_pk(\\d+)/assign/",
}, component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
{ name: "alsijil.assignGroupRoleByRolePK",
path: "groups/:pk(\\d+)/group_roles/:role_pk(\\d+)/assign/", props: {
component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"), byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
name: "alsijil.assignGroupRoleByRolePK", },
props: { },
byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true, {
}, path: "group_roles/assignments/:pk(\\d+)/edit/",
}, component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
{ name: "alsijil.editGroupRoleAssignment",
path: "group_roles/assignments/:pk(\\d+)/edit/", props: {
component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"), byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
name: "alsijil.editGroupRoleAssignment", },
props: { },
byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true, {
}, path: "group_roles/assignments/:pk(\\d+)/stop/",
}, component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
{ name: "alsijil.stopGroupRoleAssignment",
path: "group_roles/assignments/:pk(\\d+)/stop/", props: {
component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"), byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
name: "alsijil.stopGroupRoleAssignment", },
props: { },
byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true, {
}, path: "group_roles/assignments/:pk(\\d+)/delete/",
}, component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
{ name: "alsijil.deleteGroupRoleAssignment",
path: "group_roles/assignments/:pk(\\d+)/delete/", props: {
component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"), byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
name: "alsijil.deleteGroupRoleAssignment", },
props: { },
byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true, {
}, path: "group_roles/assignments/assign/",
}, component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
{ name: "alsijil.assignGroupRoleMultiple",
path: "group_roles/assignments/assign/", meta: {
component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"), inMenu: true,
name: "alsijil.assignGroupRoleMultiple", titleKey: "alsijil.group_roles.menu_title_assign",
meta: { icon: "mdi-clipboard-account-outline",
inMenu: true, permission: "alsijil.assign_grouprole_for_multiple_rule",
titleKey: "alsijil.group_roles.menu_title_assign", },
icon: "mdi-clipboard-account-outline", props: {
permission: "alsijil.assign_grouprole_for_multiple_rule", byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
}, },
props: { },
byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true, {
}, path: "all/",
}, component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
{ name: "alsijil.allRegisterObjects",
path: "all/", meta: {
component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"), inMenu: true,
name: "alsijil.allRegisterObjects", titleKey: "alsijil.all_lessons.menu_title",
meta: { icon: "mdi-format-list-text",
inMenu: true, permission: "alsijil.view_register_objects_list_rule",
titleKey: "alsijil.all_lessons.menu_title", },
icon: "mdi-format-list-text", props: {
permission: "alsijil.view_register_objects_list_rule", byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
}, },
props: { },
byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true, ],
}, };
},
],
}
{ {
"alsijil": { "alsijil": {
"menu_title": "Klassenbuch", "menu_title": "Klassenbuch",
"lesson": { "lesson": {
"menu_title": "Aktuelle Unterrichtsstunde" "menu_title": "Aktuelle Unterrichtsstunde"
}, },
"week": { "week": {
"menu_title": "Aktuelle Woche" "menu_title": "Aktuelle Woche"
}, },
"groups": { "groups": {
"menu_title": "Meine Gruppen" "menu_title": "Meine Gruppen"
}, },
"persons": { "persons": {
"menu_title": "Meine Schülerinnen und Schüler" "menu_title": "Meine Schülerinnen und Schüler"
}, },
"absence": { "absence": {
"menu_title": "Abwesenheit eintragen" "menu_title": "Abwesenheit eintragen"
}, },
"my_overview": { "my_overview": {
"menu_title": "Meine Übersicht" "menu_title": "Meine Übersicht"
}, },
"excuse_types": { "excuse_types": {
"menu_title": "Entschuldigungsarten" "menu_title": "Entschuldigungsarten"
}, },
"group_roles": { "group_roles": {
"menu_title_assign": "Gruppenrollen zuweisen", "menu_title_assign": "Gruppenrollen zuweisen",
"menu_title_manage": "Gruppenrollen verwalten" "menu_title_manage": "Gruppenrollen verwalten"
}, },
"extra_marks": { "extra_marks": {
"menu_title": "Zusätzliche Markierungen" "menu_title": "Zusätzliche Markierungen"
}, },
"all_lessons": { "all_lessons": {
"menu_title": "Alle Stunden" "menu_title": "Alle Stunden"
}
} }
}
} }
{ {
"alsijil": { "alsijil": {
"my_overview": { "my_overview": {
"menu_title": "Мой обзор" "menu_title": "Мой обзор"
}, },
"group_roles": { "group_roles": {
"menu_title_manage": "Управление ролями групп", "menu_title_manage": "Управление ролями групп",
"menu_title_assign": "Назначить роль группы" "menu_title_assign": "Назначить роль группы"
}, },
"all_lessons": { "all_lessons": {
"menu_title": "Все уроки" "menu_title": "Все уроки"
}, },
"menu_title": "Классный журнал", "menu_title": "Классный журнал",
"lesson": { "lesson": {
"menu_title": "Текущий урок" "menu_title": "Текущий урок"
}, },
"week": { "week": {
"menu_title": "Текущая неделя" "menu_title": "Текущая неделя"
}, },
"groups": { "groups": {
"menu_title": "Мои группы" "menu_title": "Мои группы"
}, },
"persons": { "persons": {
"menu_title": "Мои студенты" "menu_title": "Мои студенты"
}, },
"absence": { "absence": {
"menu_title": "Регистрация отсутствия" "menu_title": "Регистрация отсутствия"
}, },
"extra_marks": { "extra_marks": {
"menu_title": "Дополнительные отметки" "menu_title": "Дополнительные отметки"
}, },
"excuse_types": { "excuse_types": {
"menu_title": "Типы объяснительных" "menu_title": "Типы объяснительных"
}
} }
}
} }
{ {
"alsijil": { "alsijil": {
"week": { "week": {
"menu_title": "Поточний тиждень" "menu_title": "Поточний тиждень"
}, },
"groups": { "groups": {
"menu_title": "Мої групи" "menu_title": "Мої групи"
}, },
"persons": { "persons": {
"menu_title": "Мої студенти" "menu_title": "Мої студенти"
}, },
"absence": { "absence": {
"menu_title": "Реєстрація відсутності" "menu_title": "Реєстрація відсутності"
}, },
"my_overview": { "my_overview": {
"menu_title": "Мій огляд" "menu_title": "Мій огляд"
}, },
"extra_marks": { "extra_marks": {
"menu_title": "Додаткові відмітки" "menu_title": "Додаткові відмітки"
}, },
"excuse_types": { "excuse_types": {
"menu_title": "Типи пояснень" "menu_title": "Типи пояснень"
}, },
"group_roles": { "group_roles": {
"menu_title_manage": "Керування ролями групи", "menu_title_manage": "Керування ролями групи",
"menu_title_assign": "Призначити роль групи" "menu_title_assign": "Призначити роль групи"
}, },
"all_lessons": { "all_lessons": {
"menu_title": "Усі уроки" "menu_title": "Усі уроки"
}, },
"menu_title": "Класний журнал", "menu_title": "Класний журнал",
"lesson": { "lesson": {
"menu_title": "Поточний урок" "menu_title": "Поточний урок"
}
} }
}
} }
...@@ -482,7 +482,7 @@ def generate_person_list_with_class_register_statistics( ...@@ -482,7 +482,7 @@ def generate_person_list_with_class_register_statistics(
persons = persons.annotate( persons = persons.annotate(
**{ **{
excuse_type.count_label: Count( excuse_type.count_label: Count(
"filtered_personal_notes__absent", "filtered_personal_notes",
filter=Q( filter=Q(
filtered_personal_notes__absent=True, filtered_personal_notes__absent=True,
filtered_personal_notes__excuse_type=excuse_type, filtered_personal_notes__excuse_type=excuse_type,
......
...@@ -66,7 +66,7 @@ class ExcuseType(ExtensibleModel): ...@@ -66,7 +66,7 @@ class ExcuseType(ExtensibleModel):
@property @property
def count_label(self): def count_label(self):
return f"{self.short_name}_count" return f"excuse_type_{self.id}_count"
class Meta: class Meta:
ordering = ["name"] ordering = ["name"]
...@@ -437,7 +437,7 @@ class ExtraMark(ExtensibleModel): ...@@ -437,7 +437,7 @@ class ExtraMark(ExtensibleModel):
@property @property
def count_label(self): def count_label(self):
return f"{self.short_name}_count" return f"extra_mark_{self.id}_count"
class Meta: class Meta:
ordering = ["short_name"] ordering = ["short_name"]
......
...@@ -9,52 +9,52 @@ table a.tr-link { ...@@ -9,52 +9,52 @@ table a.tr-link {
} }
.collapsible-icon-right { .collapsible-icon-right {
align-self: end; align-self: end;
flex-grow: 100; flex-grow: 100;
text-align: right!important; text-align: right !important;
} }
@media only screen and (min-width: 1201px) { @media only screen and (min-width: 1201px) {
.hide-on-extra-large-only { .hide-on-extra-large-only {
display: none; display: none;
} }
} }
@media only screen and (max-width: 1200px) { @media only screen and (max-width: 1200px) {
.show-on-extra-large { .show-on-extra-large {
display: none; display: none;
} }
} }
@media only screen and (max-width: 600px) { @media only screen and (max-width: 600px) {
.collection .collection-item.avatar { .collection .collection-item.avatar {
padding-left: 20px; padding-left: 20px;
} }
.collection .collection-item.avatar:not(.circle-clipper) > .circle { .collection .collection-item.avatar:not(.circle-clipper) > .circle {
position: relative; position: relative;
margin-bottom: 10px; margin-bottom: 10px;
} }
} }
.collapsible li .show-on-active { .collapsible li .show-on-active {
display: none; display: none;
} }
.collapsible li.active .show-on-active { .collapsible li.active .show-on-active {
display: block; display: block;
} }
th.chip-height { th.chip-height {
height: 67px; height: 67px;
line-height: 2.2; line-height: 2.2;
} }
.collection-item.chip-height { .collection-item.chip-height {
height: 52px; height: 52px;
line-height: 2.2; line-height: 2.2;
} }
li.collection-item.button-height { li.collection-item.button-height {
height: 58px; height: 58px;
line-height: 2.5; line-height: 2.5;
} }
table.small-print, td.small-print, th.small-print { table.small-print,
font-size: 10pt; td.small-print,
th.small-print {
font-size: 10pt;
} }
#signatures { #signatures {
padding-top: 3em; padding-top: 3em;
} }
#signatures .signature { #signatures .signature {
display: inline-block; display: inline-block;
width: 12em; width: 12em;
border-top: 1px solid; border-top: 1px solid;
margin-right: 20px; margin-right: 20px;
} }
tr { tr {
border-bottom: 1px solid rgba(0, 0, 0, 0.3); border-bottom: 1px solid rgba(0, 0, 0, 0.3);
} }
td, th { td,
padding: 1px; th {
padding: 1px;
} }
tr.lessons-day-first { tr.lessons-day-first {
border-top: 3px solid rgba(0, 0, 0, 0.3); border-top: 3px solid rgba(0, 0, 0, 0.3);
} }
td.rotate, th.rotate { td.rotate,
text-align: center; th.rotate {
transform: rotate(-90deg); text-align: center;
transform: rotate(-90deg);
} }
tr.lesson-cancelled td { tr.lesson-cancelled td {
background-color: #EF9A9A; background-color: #ef9a9a;
} }
tr.lesson-substituted td { tr.lesson-substituted td {
background-color: #ffb74d; background-color: #ffb74d;
} }
td.lesson-notes { td.lesson-notes {
font-size: 80%; font-size: 80%;
} }
td.lesson-notes span.lesson-note-absent { td.lesson-notes span.lesson-note-absent {
color: #cc0000; color: #cc0000;
} }
td.lesson-notes span.lesson-note-late { td.lesson-notes span.lesson-note-late {
color: #ff9933; color: #ff9933;
} }
td.lesson-notes span.lesson-note-excused { td.lesson-notes span.lesson-note-excused {
color: #009933; color: #009933;
} }
table.person-info { table.person-info {
border: none; border: none;
} }
table.person-info td.person-img { table.person-info td.person-img {
text-align: center; text-align: center;
} }
table.person-info td.person-img img { table.person-info td.person-img img {
max-height: 30mm; max-height: 30mm;
} }
img.max-size-600 { img.max-size-600 {
max-width: 600px; max-width: 600px;
max-height: 600px; max-height: 600px;
} }
.alsijil-check-box { .alsijil-check-box {
margin-right: 10px; margin-right: 10px;
} }
.alsijil-check-box [type="checkbox"] { .alsijil-check-box [type="checkbox"] {
padding-left: 30px; padding-left: 30px;
} }
.alsijil-lesson-cancelled { .alsijil-lesson-cancelled {
text-decoration: line-through; text-decoration: line-through;
} }
.alsijil-tardiness-text{ .alsijil-tardiness-text {
vertical-align: super; vertical-align: super;
} }
@media only screen and (max-width: 992px) { @media only screen and (max-width: 992px) {
.no-mobile-card { .no-mobile-card {
border: unset; border: unset;
padding: unset; padding: unset;
margin: unset; margin: unset;
box-shadow: unset; box-shadow: unset;
} }
.no-mobile-card .card-content { .no-mobile-card .card-content {
padding: unset; padding: unset;
} }
table.alsijil-table.horizontal-on-small { table.alsijil-table.horizontal-on-small {
display: block; display: block;
max-width: calc(100vw - 40px); max-width: calc(100vw - 40px);
} }
table.alsijil-table.horizontal-on-small thead { table.alsijil-table.horizontal-on-small thead {
display: none; display: none;
} }
table.alsijil-table.horizontal-on-small tbody { table.alsijil-table.horizontal-on-small tbody {
overflow-x: scroll; overflow-x: scroll;
display: flex; display: flex;
column-gap: 1rem; column-gap: 1rem;
flex-wrap: nowrap; flex-wrap: nowrap;
align-items: stretch; align-items: stretch;
scroll-snap-type: x proximity; scroll-snap-type: x proximity;
} }
table.alsijil-table.horizontal-on-small tr { table.alsijil-table.horizontal-on-small tr {
flex-basis: min(75vw, 400px); flex-basis: min(75vw, 400px);
flex-shrink: 0; flex-shrink: 0;
flex-grow: 1; flex-grow: 1;
border-radius: 8px; border-radius: 8px;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
justify-content: space-between; justify-content: space-between;
scroll-snap-align: center; scroll-snap-align: center;
transition: all .5s; transition: all 0.5s;
margin: 0.5rem 0 1rem 0; margin: 0.5rem 0 1rem 0;
background-color: #fff!important; background-color: #fff !important;
box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.12), 0 1px 5px 0 rgba(0, 0, 0, 0.2); box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14),
padding: 24px; 0 3px 1px -2px rgba(0, 0, 0, 0.12), 0 1px 5px 0 rgba(0, 0, 0, 0.2);
} padding: 24px;
table.alsijil-table.horizontal-on-small tr:first-of-type { }
margin-inline-start: .4rem; table.alsijil-table.horizontal-on-small tr:first-of-type {
-moz-margin-start: .4rem; margin-inline-start: 0.4rem;
-webkit-margin-start: .4rem; -moz-margin-start: 0.4rem;
} -webkit-margin-start: 0.4rem;
}
table.alsijil-table.horizontal-on-small tr:last-of-type {
margin-inline-end: .4rem; table.alsijil-table.horizontal-on-small tr:last-of-type {
-moz-margin-end: .4rem; margin-inline-end: 0.4rem;
-webkit-margin-end: .4rem; -moz-margin-end: 0.4rem;
} -webkit-margin-end: 0.4rem;
table.alsijil-table.horizontal-on-small td.center-align { }
text-align: left; table.alsijil-table.horizontal-on-small td.center-align {
} text-align: left;
table.alsijil-table.horizontal-on-small .person-name { }
font-size: 24px; table.alsijil-table.horizontal-on-small .person-name {
font-weight: 300; font-size: 24px;
display: block; font-weight: 300;
line-height: 32px;
margin-bottom: 8px;
}
}
.alsijil-time-head, .alsijil-object-head {
display: block; display: block;
line-height: 32px;
margin-bottom: 8px;
}
}
.alsijil-time-head,
.alsijil-object-head {
display: block;
} }
.alsijil-time-head { .alsijil-time-head {
font-size: 2rem; font-size: 2rem;
line-height: 1.1; line-height: 1.1;
} }
.alsijil-object-head { .alsijil-object-head {
font-size: 3rem; font-size: 3rem;
} }
@media only screen and (max-width: 600px) { @media only screen and (max-width: 600px) {
.alsijil-time-head { .alsijil-time-head {
font-size: 1.5rem; font-size: 1.5rem;
} }
.alsijil-object-head { .alsijil-object-head {
font-size: 2.2rem; font-size: 2.2rem;
line-height: 1.4; line-height: 1.4;
} }
} }
.alsijil-nav { .alsijil-nav {
line-height: 36px; line-height: 36px;
} }
.alsijil-header-nav-button { .alsijil-header-nav-button {
height: 66px; height: 66px;
padding: 0; padding: 0;
} }
.alsijil-header-nav-button.left { .alsijil-header-nav-button.left {
margin-right: 5px; margin-right: 5px;
} }
.alsijil-header-nav-button.right { .alsijil-header-nav-button.right {
margin-left: 5px; margin-left: 5px;
} }
.alsijil-header-nav-button i.material-icons { .alsijil-header-nav-button i.material-icons {
line-height: 60px; line-height: 60px;
height: 60px; height: 60px;
font-size: 40px; font-size: 40px;
} }
.alsijil-nav-header { .alsijil-nav-header {
width: calc(100% + 40px); width: calc(100% + 40px);
padding: 10px 20px; padding: 10px 20px;
margin: -10px -20px 0; margin: -10px -20px 0;
} }
.tabs-icons .tab svg.iconify { .tabs-icons .tab svg.iconify {
display: block; display: block;
} }
span.input-field.inline > .select-wrapper > input { span.input-field.inline > .select-wrapper > input {
color: red; color: red;
padding: 14px 0 0 0; padding: 14px 0 0 0;
line-height: 2px; line-height: 2px;
height: 36px; height: 36px;
vertical-align: middle; vertical-align: middle;
} }
span.input-field.inline > .select-wrapper .caret { span.input-field.inline > .select-wrapper .caret {
top: 12px !important; top: 12px !important;
} }
@media screen and (min-width: 1400px) { @media screen and (min-width: 1400px) {
li.collection-item form { li.collection-item form {
margin: -30px 0 -30px 0; margin: -30px 0 -30px 0;
} }
li.collection-item#title #select_all_span { li.collection-item#title #select_all_span {
margin-top: 5px; margin-top: 5px;
} }
} }
.collection { .collection {
overflow: visible; overflow: visible;
overflow-x: hidden; overflow-x: hidden;
} }
#select_all_container { #select_all_container {
display: none; display: none;
} }
#select_all_box:indeterminate + span:not(.lever):before { #select_all_box:indeterminate + span:not(.lever):before {
top: -4px; top: -4px;
left: -6px; left: -6px;
width: 10px; width: 10px;
height: 12px; height: 12px;
border-top: none; border-top: none;
border-left: none; border-left: none;
border-right: white 2px solid; border-right: white 2px solid;
border-bottom: none; border-bottom: none;
transform: rotate(90deg); transform: rotate(90deg);
backface-visibility: hidden; backface-visibility: hidden;
transform-origin: 100% 100%; transform-origin: 100% 100%;
} }
#select_all_box:indeterminate + span:not(.lever):after { #select_all_box:indeterminate + span:not(.lever):after {
top: 0; top: 0;
width: 20px; width: 20px;
height: 20px; height: 20px;
border: 2px solid currentColor; border: 2px solid currentColor;
background-color: currentColor; background-color: currentColor;
z-index: 0; z-index: 0;
} }
#select_all_box_text { #select_all_box_text {
color: #9e9e9e !important; color: #9e9e9e !important;
} }
td.material-icons { td.material-icons {
display: table-cell; display: table-cell;
} }
.medium-high { .medium-high {
position: relative; position: relative;
top: 50%; top: 50%;
left: 50%; left: 50%;
transform: translate(-50%, 50%); transform: translate(-50%, 50%);
} }
@media screen and (min-width: 600px) { @media screen and (min-width: 600px) {
/* On medium and up devices */ /* On medium and up devices */
.medium-high-right { .medium-high-right {
float: right; float: right;
transform: translate(0%, 50%); transform: translate(0%, 50%);
} }
} }
@media screen and (max-width: 600px) { @media screen and (max-width: 600px) {
/* Only on small devices */ /* Only on small devices */
.full-width-s { .full-width-s {
width: 100%; width: 100%;
} }
#heading { #heading {
display: block; display: block;
} }
#heading + a { #heading + a {
float: none!important; float: none !important;
} }
} }
.overflow-x-scroll { .overflow-x-scroll {
overflow-x: scroll; overflow-x: scroll;
} }
figure.modal-content figcaption { figure.modal-content figcaption {
font-weight: 300; font-weight: 300;
font-size: 2.28rem; font-size: 2.28rem;
line-height: 110%; line-height: 110%;
} }
@media screen and (max-width: 600px) { @media screen and (max-width: 600px) {
#toggle-row button[type=submit] { #toggle-row button[type="submit"] {
width: 100%; width: 100%;
margin-bottom: 1em; margin-bottom: 1em;
} }
} }
.horizontal-scroll-container { .horizontal-scroll-container {
overflow-x: scroll; overflow-x: scroll;
display: flex; display: flex;
column-gap: 1rem; column-gap: 1rem;
flex-wrap: nowrap; flex-wrap: nowrap;
align-items: stretch; align-items: stretch;
scroll-snap-type: x proximity; scroll-snap-type: x proximity;
} }
.horizontal-scroll-container.vertical { .horizontal-scroll-container.vertical {
flex-wrap: wrap; flex-wrap: wrap;
overflow-x: inherit; overflow-x: inherit;
} }
.horizontal-scroll-container.vertical .horizontal-scroll-card { .horizontal-scroll-container.vertical .horizontal-scroll-card {
margin-inline: 0; margin-inline: 0;
} }
dl { dl {
margin: 0; margin: 0;
padding: 0; padding: 0;
} }
dt { dt {
font-weight: bold; font-weight: bold;
} }
dd { dd {
margin: 0; margin: 0;
padding: unset; padding: unset;
} }
.horizontal-scroll-card { .horizontal-scroll-card {
flex-basis: min(75vw, 400px); flex-basis: min(75vw, 400px);
flex-shrink: 0; flex-shrink: 0;
flex-grow: 1; flex-grow: 1;
border-radius: 8px; border-radius: 8px;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
justify-content: space-between; justify-content: space-between;
scroll-snap-align: center; scroll-snap-align: center;
transition: all .5s; transition: all 0.5s;
} }
.horizontal-scroll-card:first-of-type { .horizontal-scroll-card:first-of-type {
margin-inline-start: .4rem; margin-inline-start: 0.4rem;
-moz-margin-start: .4rem; -moz-margin-start: 0.4rem;
-webkit-margin-start: .4rem; -webkit-margin-start: 0.4rem;
} }
.horizontal-scroll-card:last-of-type { .horizontal-scroll-card:last-of-type {
margin-inline-end: .4rem; margin-inline-end: 0.4rem;
-moz-margin-end: .4rem; -moz-margin-end: 0.4rem;
-webkit-margin-end: .4rem; -webkit-margin-end: 0.4rem;
} }
.horizontal-scroll-card .card-action { .horizontal-scroll-card .card-action {
margin-bottom: 5px; margin-bottom: 5px;
} }
.horizontal-scroll-card .card-content .card-title { .horizontal-scroll-card .card-content .card-title {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
} }
.horizontal-scroll-card .card-content .card-title .subject { .horizontal-scroll-card .card-content .card-title .subject {
flex-grow: 5; flex-grow: 5;
} }
.horizontal-scroll-card .one-line { .horizontal-scroll-card .one-line {
display: grid; display: grid;
grid-auto-flow: column; grid-auto-flow: column;
grid-template-rows: 1fr 1fr; grid-template-rows: 1fr 1fr;
} }
p.subtitle { p.subtitle {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
align-items: flex-end; align-items: flex-end;
} }
.btn-superflat ~ span { .btn-superflat ~ span {
line-height: 24px; line-height: 24px;
} }
.btn-superflat, .btn-superflat:focus, .btn-superflat:active { .btn-superflat,
border: none; .btn-superflat:focus,
line-height: 1; .btn-superflat:active {
height: 24px; border: none;
background: none; line-height: 1;
font-weight: normal; height: 24px;
background: none;
font-weight: normal;
} }
.btn-superflat i.material-icons { .btn-superflat i.material-icons {
vertical-align: middle; vertical-align: middle;
} }
.btn-superflat:hover { .btn-superflat:hover {
cursor: pointer; cursor: pointer;
} }
.unfold-trigger i.material-icons { .unfold-trigger i.material-icons {
transition: transform .5s 0s ease-in-out; transition: transform 0.5s 0s ease-in-out;
transform: rotate(-90deg); transform: rotate(-90deg);
} }
.unfold-trigger.vertical i.material-icons { .unfold-trigger.vertical i.material-icons {
transform: rotate(-180deg); transform: rotate(-180deg);
}
.tabs-icons .tab svg.iconify {
display: block;
} }
$(document).ready(function () { $(document).ready(function () {
$("#id_group").change(function () { $("#id_group").change(function () {
$("#id_teacher").val("").formSelect(); $("#id_teacher").val("").formSelect();
}); });
$("#id_teacher").change(function () { $("#id_teacher").change(function () {
$("#id_group").val("").formSelect(); $("#id_group").val("").formSelect();
}); });
$("#toggle-row.pre-hidden").hide(); $("#toggle-row.pre-hidden").hide();
}); });
$("#toggle-button").click(function () { $("#toggle-button").click(function () {
$("#toggle-row").toggle(); $("#toggle-row").toggle();
}) });
$(".unfold-trigger").click(function (event) { $(".unfold-trigger").click(function (event) {
let target = event.target; let target = event.target;
target.classList.toggle("vertical"); target.classList.toggle("vertical");
let next_container = $(target).parent().next(".horizontal-scroll-container"); let next_container = $(target).parent().next(".horizontal-scroll-container");
if (next_container.length >= 1) { if (next_container.length >= 1) {
next_container[0].classList.toggle("vertical"); next_container[0].classList.toggle("vertical");
} }
}) });
\ No newline at end of file
...@@ -11,35 +11,6 @@ ...@@ -11,35 +11,6 @@
<link rel="stylesheet" href="{% static 'css/alsijil/week_view.css' %}"/> <link rel="stylesheet" href="{% static 'css/alsijil/week_view.css' %}"/>
{% endblock %} {% endblock %}
{% block nav_content %}
{% if lesson_periods %}
<div class="">
<ul class="tabs tabs-transparent tabs-icons tabs-fixed-width">
<li class="tab col">
<a class="active" href="#week-overview">
<i class="material-icons iconify" data-icon="mdi:message-bulleted"></i>
{% trans "Lesson documentations" %}
</a>
</li>
<li class="tab col">
<a href="#personal-notes">
<i class="material-icons iconify" data-icon="mdi:account-multiple-outline"></i>
{% trans "Persons" %}
</a>
</li>
{% if group_roles %}
<li class="tab col">
<a href="#group-roles">
<i class="material-icons iconify" data-icon="mdi:clipboard-account-outline"></i>
{% trans "Group roles" %}
</a>
</li>
{% endif %}
</ul>
</div>
{% endif %}
{% endblock %}
{% block content %} {% block content %}
<script type="text/javascript" src="{% static "js/helper.js" %}"></script> <script type="text/javascript" src="{% static "js/helper.js" %}"></script>
{{ week_select|json_script:"week_select" }} {{ week_select|json_script:"week_select" }}
...@@ -97,6 +68,33 @@ ...@@ -97,6 +68,33 @@
</p> </p>
{% endif %} {% endif %}
{% if lesson_periods %}
<div class="col s12 margin-bottom">
<ul class="tabs tabs-icons tabs-fixed-width">
<li class="tab col">
<a class="active" href="#week-overview">
<i class="material-icons iconify" data-icon="mdi:message-bulleted"></i>
{% trans "Lesson documentations" %}
</a>
</li>
<li class="tab col">
<a href="#personal-notes">
<i class="material-icons iconify" data-icon="mdi:account-multiple-outline"></i>
{% trans "Persons" %}
</a>
</li>
{% if group_roles %}
<li class="tab col">
<a href="#group-roles">
<i class="material-icons iconify" data-icon="mdi:clipboard-account-outline"></i>
{% trans "Group roles" %}
</a>
</li>
{% endif %}
</ul>
</div>
{% endif %}
{% if lesson_periods %} {% if lesson_periods %}
<div class="row"> <div class="row">
<div class="col s12" id="week-overview"> <div class="col s12" id="week-overview">
......
...@@ -12,11 +12,13 @@ ...@@ -12,11 +12,13 @@
<th rowspan="2">{% trans "Name" %}</th> <th rowspan="2">{% trans "Name" %}</th>
<th rowspan="2">{% trans "Primary group" %}</th> <th rowspan="2">{% trans "Primary group" %}</th>
<th colspan="{{ excuse_types.count|add:4 }}">{% trans "Absences" %}</th> <th colspan="{{ excuse_types.count|add:4 }}">{% trans "Absences" %}</th>
<th colspan="{{ excuse_types_not_absent.count }}">{% trans "Uncounted Absences" %}</th> {% if excuse_types_not_absent %}
<th rowspan="2">{% trans "Tardiness" %}</th> <th colspan="{{ excuse_types_not_absent.count }}">{% trans "Uncounted Absences" %}</th>
{% endif %}
{% if extra_marks %} {% if extra_marks %}
<th colspan="{{ extra_marks.count }}">{% trans "Extra marks" %}</th> <th colspan="{{ extra_marks.count }}">{% trans "Extra marks" %}</th>
{% endif %} {% endif %}
<th rowspan="2">{% trans "Tardiness" %}</th>
<th rowspan="2"></th> <th rowspan="2"></th>
</tr> </tr>
<tr class="hide-on-large-only"> <tr class="hide-on-large-only">
...@@ -36,12 +38,12 @@ ...@@ -36,12 +38,12 @@
({{ excuse_type.short_name }}) ({{ excuse_type.short_name }})
</th> </th>
{% endfor %} {% endfor %}
<th class="truncate chip-height">{% trans "Tardiness" %}</th>
{% for extra_mark in extra_marks %} {% for extra_mark in extra_marks %}
<th class="chip-height"> <th class="chip-height">
{{ extra_mark.short_name }} {{ extra_mark.short_name }}
</th> </th>
{% endfor %} {% endfor %}
<th class="truncate chip-height">{% trans "Tardiness" %}</th>
<th rowspan="2"></th> <th rowspan="2"></th>
</tr> </tr>
<tr class="hide-on-med-and-down"> <tr class="hide-on-med-and-down">
...@@ -110,12 +112,6 @@ ...@@ -110,12 +112,6 @@
</span> </span>
</td> </td>
{% endfor %} {% endfor %}
<td>
<span class="chip orange white-text" title="{% trans "Tardiness" %}">
{% firstof person.tardiness|to_time|time:"H\h i\m" "–" %}
</span>
<span class="chip orange white-text" title="{% trans "Count of tardiness" %}">{{ person.tardiness_count }} &times;</span>
</td>
{% for extra_mark in extra_marks %} {% for extra_mark in extra_marks %}
<td> <td>
<span class="chip grey white-text" title="{{ extra_mark.name }}"> <span class="chip grey white-text" title="{{ extra_mark.name }}">
...@@ -123,6 +119,12 @@ ...@@ -123,6 +119,12 @@
</span> </span>
</td> </td>
{% endfor %} {% endfor %}
<td>
<span class="chip orange white-text" title="{% trans "Tardiness" %}">
{% firstof person.tardiness|to_time|time:"H\h i\m" "–" %}
</span>
<span class="chip orange white-text" title="{% trans "Count of tardiness" %}">{{ person.tardiness_count }} &times;</span>
</td>
<td> <td>
<a class="btn primary waves-effect waves-light" href="{% url "overview_person" person.pk %}"> <a class="btn primary waves-effect waves-light" href="{% url "overview_person" person.pk %}">
......
...@@ -41,7 +41,7 @@ from aleksis.core.mixins import ( ...@@ -41,7 +41,7 @@ from aleksis.core.mixins import (
from aleksis.core.models import Group, PDFFile, Person, SchoolTerm from aleksis.core.models import Group, PDFFile, Person, SchoolTerm
from aleksis.core.util import messages from aleksis.core.util import messages
from aleksis.core.util.celery_progress import render_progress_page from aleksis.core.util.celery_progress import render_progress_page
from aleksis.core.util.core_helpers import get_site_preferences, objectgetter_optional from aleksis.core.util.core_helpers import get_site_preferences, has_person, objectgetter_optional
from aleksis.core.util.predicates import check_global_permission from aleksis.core.util.predicates import check_global_permission
from .filters import PersonalNoteFilter from .filters import PersonalNoteFilter
...@@ -642,8 +642,11 @@ def full_register_group(request: HttpRequest, id_: int) -> HttpResponse: ...@@ -642,8 +642,11 @@ def full_register_group(request: HttpRequest, id_: int) -> HttpResponse:
group = get_object_or_404(Group, pk=id_) group = get_object_or_404(Group, pk=id_)
file_object = PDFFile.objects.create() file_object = PDFFile.objects.create()
if has_person(request):
file_object.person = request.user.person
file_object.save()
redirect_url = reverse("redirect_to_pdf_file", args=[file_object.pk]) redirect_url = f"/pdfs/{file_object.pk}"
result = generate_full_register_printout.delay(group.pk, file_object.pk) result = generate_full_register_printout.delay(group.pk, file_object.pk)
...@@ -883,7 +886,9 @@ def overview_person(request: HttpRequest, id_: Optional[int] = None) -> HttpResp ...@@ -883,7 +886,9 @@ def overview_person(request: HttpRequest, id_: Optional[int] = None) -> HttpResp
stats = [] stats = []
for school_term in school_terms: for school_term in school_terms:
stat = {} stat = {}
personal_notes = PersonalNote.objects.filter(person=person,).filter( personal_notes = PersonalNote.objects.filter(
person=person,
).filter(
Q(lesson_period__lesson__validity__school_term=school_term) Q(lesson_period__lesson__validity__school_term=school_term)
| Q(extra_lesson__school_term=school_term) | Q(extra_lesson__school_term=school_term)
| Q(event__school_term=school_term) | Q(event__school_term=school_term)
......
...@@ -29,9 +29,9 @@ copyright = "2019-2022 The AlekSIS team" ...@@ -29,9 +29,9 @@ copyright = "2019-2022 The AlekSIS team"
author = "The AlekSIS Team" author = "The AlekSIS Team"
# The short X.Y version # The short X.Y version
version = "2.1" version = "3.0"
# The full version, including alpha/beta/rc tags # The full version, including alpha/beta/rc tags
release = "2.2.dev0" release = "3.0.1.dev0"
# -- General configuration --------------------------------------------------- # -- General configuration ---------------------------------------------------
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment