Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • AlekSIS/onboarding/AlekSIS-App-Kort
1 result
Show changes
Commits on Source (20)
Showing
with 1539 additions and 323 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:
- project: "AlekSIS/official/AlekSIS"
file: /ci/prepare/lock.yml
- project: "AlekSIS/official/AlekSIS"
file: /ci/general.yml
# - project: "AlekSIS/official/AlekSIS"
# file: /ci/test.yml
- project: "AlekSIS/official/AlekSIS"
file: /ci/test/lint.yml
- project: "AlekSIS/official/AlekSIS"
file: /ci/test/security.yml
- project: "AlekSIS/official/AlekSIS"
file: /ci/build/dist.yml
- project: "AlekSIS/official/AlekSIS"
file: /ci/general.yml
- project: "AlekSIS/official/AlekSIS"
file: /ci/prepare/lock.yml
# - project: "AlekSIS/official/AlekSIS"
# file: /ci/test/test.yml
- project: "AlekSIS/official/AlekSIS"
file: /ci/test/lint.yml
- project: "AlekSIS/official/AlekSIS"
file: /ci/test/security.yml
- project: "AlekSIS/official/AlekSIS"
file: /ci/build/dist.yml
- project: "AlekSIS/official/AlekSIS"
file: "/ci/docker/image.yml"
- project: "AlekSIS/official/AlekSIS"
file: /ci/publish/pypi.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,18 +6,26 @@ All notable changes to this project will be documented in this file.
The format is based on `Keep a Changelog`_,
and this project adheres to `Semantic Versioning`_.
`0.1.1`_ - 2023-03-20
---------------------
`1.0`_
------
Fixed
~~~~~
* Menu item 'Documents' was always shown.
`0.1`_ - 2023-03-19
-------------------
Added
~~~~~
* Initial release.
* Initial release.
.. _Keep a Changelog: https://keepachangelog.com/en/1.0.0/
.. _Semantic Versioning: https://semver.org/spec/v2.0.0.html
.. _1.0: https://edugit.org/AlekSIS/onboarding//AlekSIS-App-Kort/-/tags/1.0
.. _0.1: https://edugit.org/AlekSIS/onboarding/AlekSIS-App-Kort/-/tags/0.1
.. _0.1.1: https://edugit.org/AlekSIS/onboarding/AlekSIS-App-Kort/-/tags/0.1.1
......@@ -16,8 +16,8 @@ Licence
::
Copyright © 2021, 2022 Jonathan Weth <dev@jonathanweth.de>
Copyright © 2021 Margarete Grassl <grasslma@katharineum.de>
Copyright © 2021 Jonathan Weth <dev@jonathanweth.de>
Licenced under the EUPL, version 1.2 or later
......
......@@ -4,36 +4,71 @@ from django.utils import timezone
from celery.result import allow_join_result
from celery.states import SUCCESS
from oauth2_provider.contrib.rest_framework import TokenHasScope
from rest_framework import generics, permissions, serializers
from oauth2_provider.oauth2_backends import get_oauthlib_core
from oauthlib.common import Request as OauthlibRequest
from rest_framework import generics, serializers
from rest_framework.authentication import BaseAuthentication
from rest_framework.exceptions import APIException, ValidationError
from rest_framework.permissions import BasePermission
from rest_framework.response import Response
from rest_framework.views import APIView
from aleksis.apps.kort.models import Card, CardPrinter, CardPrintJob
from aleksis.core.util.auth_helpers import AppScopes
admin.autodiscover()
class CorrectPrinterPermission(BasePermission):
class OAuth2ClientAuthentication(BaseAuthentication):
"""OAuth 2 authentication backend using client credentials authentication."""
www_authenticate_realm = "api"
def authenticate(self, request):
"""Authenticate the request with client credentials."""
oauthlib_core = get_oauthlib_core()
uri, http_method, body, headers = oauthlib_core._extract_params(request)
oauth_request = OauthlibRequest(uri, http_method, body, headers)
# Verify general authentication of the client
if not oauthlib_core.server.request_validator.authenticate_client(oauth_request):
# Client credentials were invalid
return None
request.auth = oauth_request
return (oauth_request.client.client_id, oauth_request)
class ClientProtectedResourcePermission(BasePermission):
def has_object_permission(self, request, view, obj):
# Verify scopes of configured application
# The OAuth request was enriched with a reference to the Application when using the
# validator above.
if not request.auth.client.allowed_scopes:
# If there are no allowed scopes, the client is not allowed to access this resource
return None
required_scopes = set(self.get_scopes(request, view, obj) or [])
allowed_scopes = set(AppScopes().get_available_scopes(request.auth.client) or [])
return required_scopes.issubset(allowed_scopes)
def get_scopes(self, request, view, obj):
return view.get_scopes()
class CorrectPrinterPermission(ClientProtectedResourcePermission):
"""Check whether the OAuth2 application belongs to the printer."""
def has_object_permission(self, request, view, obj) -> bool:
token = request.auth
if token.application == obj.oauth2_application:
return True
return False
def get_scopes(self, request, view, obj):
return [obj.scope]
class CorrectJobPrinterPermission(BasePermission):
"""Check whether the OAuth2 application belongs to the job's printer."""
def has_object_permission(self, request, view, obj) -> bool:
token = request.auth
if token.application == obj.printer.oauth2_application:
return True
return False
def get_scopes(self, request, view, obj):
return [obj.printer.scope]
class CardPrinterSerializer(serializers.ModelSerializer):
......@@ -91,21 +126,22 @@ class CardChipNumberSerializer(serializers.ModelSerializer):
class CardPrinterDetails(generics.RetrieveAPIView):
"""Show details about the card printer."""
permission_classes = [permissions.IsAuthenticated, TokenHasScope, CorrectPrinterPermission]
required_scopes = ["card_printer"]
authentication_classes = [OAuth2ClientAuthentication]
permission_classes = [CorrectPrinterPermission]
serializer_class = CardPrinterSerializer
queryset = CardPrinter.objects.all()
def get_object(self):
token = self.request.auth
return token.application.card_printers.all().first()
return token.client.card_printers.all().first()
class CardPrinterUpdateStatus(generics.UpdateAPIView):
"""Update the status of the card printer."""
permission_classes = [permissions.IsAuthenticated, TokenHasScope, CorrectPrinterPermission]
required_scopes = ["card_printer"]
authentication_classes = [OAuth2ClientAuthentication]
permission_classes = [CorrectPrinterPermission]
serializer_class = CardPrinterStatusSerializer
queryset = CardPrinter.objects.all()
......@@ -120,8 +156,9 @@ class CardPrinterUpdateStatus(generics.UpdateAPIView):
class GetNextPrintJob(APIView):
"""Get the next print job."""
permission_classes = [permissions.IsAuthenticated, TokenHasScope, CorrectPrinterPermission]
required_scopes = ["card_printer"]
authentication_classes = [OAuth2ClientAuthentication]
permission_classes = [CorrectPrinterPermission]
serializer_class = CardPrinterSerializer
queryset = CardPrinter.objects.all()
......@@ -140,8 +177,9 @@ class GetNextPrintJob(APIView):
class CardPrintJobUpdateStatusView(generics.UpdateAPIView):
"""Update the status of the card printer."""
permission_classes = [permissions.IsAuthenticated, TokenHasScope, CorrectJobPrinterPermission]
required_scopes = ["card_printer"]
authentication_classes = [OAuth2ClientAuthentication]
permission_classes = [CorrectJobPrinterPermission]
serializer_class = CardPrintJobStatusSerializer
queryset = CardPrintJob.objects.all()
......@@ -149,8 +187,9 @@ class CardPrintJobUpdateStatusView(generics.UpdateAPIView):
class CardPrintJobSetChipNumberView(generics.UpdateAPIView):
"""Update the status of the card printer."""
permission_classes = [permissions.IsAuthenticated, TokenHasScope, CorrectJobPrinterPermission]
required_scopes = ["card_printer"]
authentication_classes = [OAuth2ClientAuthentication]
permission_classes = [CorrectJobPrinterPermission]
serializer_class = CardChipNumberSerializer
queryset = CardPrintJob.objects.all()
......
from django.apps import apps
from django.db import models
from django.db.models import functions
from django.utils.translation import gettext as _
from aleksis.core.util.apps import AppConfig
......@@ -13,15 +16,29 @@ class DefaultConfig(AppConfig):
}
licence = "EUPL-1.2+"
copyright_info = (
([2021], "Margarete Grassl", "grasslma@katharineum.de"),
(
[2021],
[2021, 2022],
"Jonathan Weth",
"dev@jonathanweth.de",
),
([2021], "Margarete Grassl", "grasslma@katharineum.de"),
)
@classmethod
def get_all_scopes(cls) -> dict[str, str]:
"""Return all OAuth scopes and their descriptions for this app."""
return {"card_printer": _("Access and manage printer status and print jobs")}
CardPrinter = apps.get_model("kort", "CardPrinter")
label_prefix = _("Access and manage printer status and print jobs")
scopes = dict(
CardPrinter.objects.annotate(
scope=functions.Concat(
models.Value(f"{CardPrinter.SCOPE_PREFIX}_"),
models.F("id"),
output_field=models.CharField(),
),
label=functions.Concat(models.Value(f"{label_prefix}: "), models.F("name")),
)
.values_list("scope", "label")
.distinct()
)
return scopes
......@@ -65,7 +65,7 @@ class CardIssueForm(forms.Form):
cleaned_data["all_persons"] = Person.objects.filter(
Q(pk__in=cleaned_data.get("persons", []))
| Q(member_of__in=cleaned_data.get("groups", []))
)
).distinct()
if not cleaned_data["all_persons"].exists():
raise forms.ValidationError(_("The selected groups don't have any members."))
......
export default {
meta: {
inMenu: true,
titleKey: "kort.menu_title",
icon: "mdi-card-account-details-outline",
permission: "kort.view_menu_rule",
},
children: [
{
path: "cards/",
component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
name: "kort.cards",
meta: {
inMenu: true,
titleKey: "kort.card.menu_title",
icon: "mdi-card-multiple-outline",
permission: "kort.view_cards_rule",
},
props: {
byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
},
},
{
path: "cards/create/",
component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
name: "kort.createCard",
props: {
byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
},
},
{
path: "cards/:pk/",
component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
name: "kort.card",
props: {
byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
},
},
{
path: "cards/:pk/generate_pdf/",
component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
name: "kort.generateCardPdf",
props: {
byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
},
},
{
path: "cards/:pk/deactivate/",
component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
name: "kort.deactivateCard",
props: {
byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
},
},
{
path: "cards/:pk/print/",
component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
name: "kort.printCard",
props: {
byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
},
},
{
path: "cards/:pk/delete/",
component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
name: "kort.deleteCard",
props: {
byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
},
},
{
path: "printers/",
component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
name: "kort.cardPrinters",
meta: {
inMenu: true,
titleKey: "kort.printer.menu_title",
icon: "mdi-printer-outline",
permission: "kort.view_cardprinters_rule",
},
props: {
byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
},
},
{
path: "printers/create/",
component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
name: "kort.createCardPrinter",
props: {
byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
},
},
{
path: "printers/:pk/",
component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
name: "kort.cardPrinter",
props: {
byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
},
},
{
path: "printers/:pk/edit/",
component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
name: "kort.editCardPrinter",
props: {
byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
},
},
{
path: "printers/:pk/delete/",
component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
name: "kort.deleteCardPrinter",
props: {
byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
},
},
{
path: "printers/:pk/config/",
component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
name: "kort.cardPrinterConfig",
props: {
byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
},
},
{
path: "layouts/",
component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
name: "kort.cardLayouts",
meta: {
inMenu: true,
titleKey: "kort.layout.menu_title",
icon: "mdi-card-account-details-star-outline",
permission: "kort.view_cardlayouts_rule",
},
props: {
byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
},
},
{
path: "layouts/create/",
component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
name: "kort.createCardLayout",
props: {
byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
},
},
{
path: "layouts/:pk/",
component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
name: "kort.cardLayout",
props: {
byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
},
},
{
path: "layouts/:pk/edit/",
component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
name: "kort.editCardLayout",
props: {
byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
},
},
{
path: "layouts/:pk/delete/",
component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
name: "kort.deleteCardLayout",
props: {
byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
},
},
],
};
{
"kort": {
"card": {
"menu_title": "Alle Karten"
},
"layout": {
"menu_title": "Kartenlayouts"
},
"menu_title": "Schülerausweise",
"printer": {
"menu_title": "Kartendrucker"
}
}
}
{
"kort": {
"menu_title": "Student ID Cards",
"card": {
"menu_title": "All Cards"
},
"printer": {
"menu_title": "Card Printers"
},
"layout": {
"menu_title": "Card Layouts"
}
}
}
{}
{}
......@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-08-12 23:11+0200\n"
"POT-Creation-Date: 2023-03-19 15:48+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
......@@ -16,9 +16,9 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
"&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n"
#: aleksis/apps/kort/apps.py:25
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n"
#: aleksis/apps/kort/apps.py:31
msgid "Access and manage printer status and print jobs"
msgstr ""
......@@ -55,11 +55,11 @@ msgstr ""
msgid "Groups"
msgstr ""
#: aleksis/apps/kort/forms.py:51 aleksis/apps/kort/models.py:185
#: aleksis/apps/kort/forms.py:51 aleksis/apps/kort/models.py:191
msgid "Card layout"
msgstr ""
#: aleksis/apps/kort/forms.py:53 aleksis/apps/kort/models.py:257
#: aleksis/apps/kort/forms.py:53 aleksis/apps/kort/models.py:263
#: aleksis/apps/kort/tables.py:30
#: aleksis/apps/kort/templates/kort/card/detail_content.html:24
#: aleksis/apps/kort/templates/kort/card/short.html:12
......@@ -82,26 +82,10 @@ msgstr ""
msgid "Printer settings"
msgstr ""
#: aleksis/apps/kort/forms.py:138 aleksis/apps/kort/models.py:222
#: aleksis/apps/kort/forms.py:138 aleksis/apps/kort/models.py:228
msgid "Required data fields"
msgstr ""
#: aleksis/apps/kort/menus.py:6
msgid "Student ID Cards"
msgstr ""
#: aleksis/apps/kort/menus.py:16
msgid "All Cards"
msgstr ""
#: aleksis/apps/kort/menus.py:27
msgid "Card Printers"
msgstr ""
#: aleksis/apps/kort/menus.py:38 aleksis/apps/kort/models.py:249
msgid "Card Layouts"
msgstr ""
#: aleksis/apps/kort/models.py:24
msgid "Online"
msgstr ""
......@@ -134,7 +118,7 @@ msgstr ""
msgid "Failed"
msgstr ""
#: aleksis/apps/kort/models.py:64 aleksis/apps/kort/models.py:217
#: aleksis/apps/kort/models.py:64 aleksis/apps/kort/models.py:223
#: aleksis/apps/kort/templates/kort/card_layout/detail_content.html:11
#: aleksis/apps/kort/templates/kort/card_layout/short.html:4
#: aleksis/apps/kort/templates/kort/printer/detail_content.html:11
......@@ -153,7 +137,7 @@ msgstr ""
msgid "Location"
msgstr ""
#: aleksis/apps/kort/models.py:70 aleksis/apps/kort/models.py:330
#: aleksis/apps/kort/models.py:70 aleksis/apps/kort/models.py:336
#: aleksis/apps/kort/tables.py:95
#: aleksis/apps/kort/templates/kort/card/detail_content.html:38
#: aleksis/apps/kort/templates/kort/printer/detail_content.html:38
......@@ -162,7 +146,7 @@ msgstr ""
msgid "Status"
msgstr ""
#: aleksis/apps/kort/models.py:74 aleksis/apps/kort/models.py:334
#: aleksis/apps/kort/models.py:74 aleksis/apps/kort/models.py:340
msgid "Status text"
msgstr ""
......@@ -187,103 +171,107 @@ msgstr ""
msgid "Card detector"
msgstr ""
#: aleksis/apps/kort/models.py:175
#: aleksis/apps/kort/models.py:181
msgid "Card printer"
msgstr ""
#: aleksis/apps/kort/models.py:176
#: aleksis/apps/kort/models.py:182
#: aleksis/apps/kort/templates/kort/printer/list.html:8
#: aleksis/apps/kort/templates/kort/printer/list.html:9
msgid "Card printers"
msgstr ""
#: aleksis/apps/kort/models.py:180
#: aleksis/apps/kort/models.py:186
msgid "Media file"
msgstr ""
#: aleksis/apps/kort/models.py:192
#: aleksis/apps/kort/models.py:198
msgid "Media file for a card layout"
msgstr ""
#: aleksis/apps/kort/models.py:193
#: aleksis/apps/kort/models.py:199
msgid "Media files for card layouts"
msgstr ""
#: aleksis/apps/kort/models.py:218
#: aleksis/apps/kort/models.py:224
#: aleksis/apps/kort/templates/kort/card_layout/detail_content.html:43
msgid "Template"
msgstr ""
#: aleksis/apps/kort/models.py:219
#: aleksis/apps/kort/models.py:225
#: aleksis/apps/kort/templates/kort/card_layout/detail_content.html:49
msgid "Custom CSS"
msgstr ""
#: aleksis/apps/kort/models.py:220
#: aleksis/apps/kort/models.py:226
msgid "Width"
msgstr ""
#: aleksis/apps/kort/models.py:220 aleksis/apps/kort/models.py:221
#: aleksis/apps/kort/models.py:226 aleksis/apps/kort/models.py:227
msgid "in mm"
msgstr ""
#: aleksis/apps/kort/models.py:221
#: aleksis/apps/kort/models.py:227
msgid "Height"
msgstr ""
#: aleksis/apps/kort/models.py:242
#: aleksis/apps/kort/models.py:248
msgid "Template is invalid: {}"
msgstr ""
#: aleksis/apps/kort/models.py:248 aleksis/apps/kort/models.py:261
#: aleksis/apps/kort/models.py:254 aleksis/apps/kort/models.py:267
#: aleksis/apps/kort/templates/kort/card/detail_content.html:31
#: aleksis/apps/kort/templates/kort/card_layout/detail.html:8
msgid "Card Layout"
msgstr ""
#: aleksis/apps/kort/models.py:254
#: aleksis/apps/kort/models.py:255
msgid "Card Layouts"
msgstr ""
#: aleksis/apps/kort/models.py:260
#: aleksis/apps/kort/templates/kort/card/detail_content.html:11
#: aleksis/apps/kort/templates/kort/card/short.html:4
msgid "Person"
msgstr ""
#: aleksis/apps/kort/models.py:256
#: aleksis/apps/kort/models.py:262
msgid "Chip Number"
msgstr ""
#: aleksis/apps/kort/models.py:258 aleksis/apps/kort/tables.py:31
#: aleksis/apps/kort/models.py:264 aleksis/apps/kort/tables.py:31
msgid "Deactivated"
msgstr ""
#: aleksis/apps/kort/models.py:264
#: aleksis/apps/kort/models.py:270
msgid "PDF file"
msgstr ""
#: aleksis/apps/kort/models.py:297
#: aleksis/apps/kort/models.py:303
msgid "There is no layout provided for the card."
msgstr ""
#: aleksis/apps/kort/models.py:316 aleksis/apps/kort/models.py:325
#: aleksis/apps/kort/models.py:322 aleksis/apps/kort/models.py:331
#: aleksis/apps/kort/templates/kort/card/detail.html:8
#: aleksis/apps/kort/templates/kort/printer/detail_content.html:84
msgid "Card"
msgstr ""
#: aleksis/apps/kort/models.py:317
#: aleksis/apps/kort/models.py:323
#: aleksis/apps/kort/templates/kort/card/list.html:8
#: aleksis/apps/kort/templates/kort/card/list.html:9
msgid "Cards"
msgstr ""
#: aleksis/apps/kort/models.py:322
#: aleksis/apps/kort/models.py:328
msgid "Printer"
msgstr ""
#: aleksis/apps/kort/models.py:337
#: aleksis/apps/kort/models.py:343
msgid "Card print job"
msgstr ""
#: aleksis/apps/kort/models.py:338
#: aleksis/apps/kort/models.py:344
msgid "Card print jobs"
msgstr ""
......
......@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-08-12 23:11+0200\n"
"POT-Creation-Date: 2023-03-19 15:48+0100\n"
"PO-Revision-Date: 2022-08-12 22:00+0000\n"
"Last-Translator: Jonathan Weth <teckids@jonathanweth.de>\n"
"Language-Team: German <https://translate.edugit.org/projects/aleksis/aleksis-app-kort/de/>\n"
......@@ -18,7 +18,7 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.12.1\n"
#: aleksis/apps/kort/apps.py:25
#: aleksis/apps/kort/apps.py:31
msgid "Access and manage printer status and print jobs"
msgstr "Druckerstatus und Druckaufträge anzeigen und verwalten"
......@@ -55,11 +55,11 @@ msgstr "Personen"
msgid "Groups"
msgstr "Gruppen"
#: aleksis/apps/kort/forms.py:51 aleksis/apps/kort/models.py:185
#: aleksis/apps/kort/forms.py:51 aleksis/apps/kort/models.py:191
msgid "Card layout"
msgstr "Kartenlayout"
#: aleksis/apps/kort/forms.py:53 aleksis/apps/kort/models.py:257
#: aleksis/apps/kort/forms.py:53 aleksis/apps/kort/models.py:263
#: aleksis/apps/kort/tables.py:30
#: aleksis/apps/kort/templates/kort/card/detail_content.html:24
#: aleksis/apps/kort/templates/kort/card/short.html:12
......@@ -82,26 +82,10 @@ msgstr "Allgemeine Attribute"
msgid "Printer settings"
msgstr "Druckereinstellungen"
#: aleksis/apps/kort/forms.py:138 aleksis/apps/kort/models.py:222
#: aleksis/apps/kort/forms.py:138 aleksis/apps/kort/models.py:228
msgid "Required data fields"
msgstr "Benötigte Datenfelder"
#: aleksis/apps/kort/menus.py:6
msgid "Student ID Cards"
msgstr "Schülerausweise"
#: aleksis/apps/kort/menus.py:16
msgid "All Cards"
msgstr "Alle Karten"
#: aleksis/apps/kort/menus.py:27
msgid "Card Printers"
msgstr "Kartendrucker"
#: aleksis/apps/kort/menus.py:38 aleksis/apps/kort/models.py:249
msgid "Card Layouts"
msgstr "Kartenlayouts"
#: aleksis/apps/kort/models.py:24
msgid "Online"
msgstr "Online"
......@@ -134,7 +118,7 @@ msgstr "Beendet"
msgid "Failed"
msgstr "Fehlgeschlagen"
#: aleksis/apps/kort/models.py:64 aleksis/apps/kort/models.py:217
#: aleksis/apps/kort/models.py:64 aleksis/apps/kort/models.py:223
#: aleksis/apps/kort/templates/kort/card_layout/detail_content.html:11
#: aleksis/apps/kort/templates/kort/card_layout/short.html:4
#: aleksis/apps/kort/templates/kort/printer/detail_content.html:11
......@@ -153,7 +137,7 @@ msgstr "Beschreibung"
msgid "Location"
msgstr "Ort"
#: aleksis/apps/kort/models.py:70 aleksis/apps/kort/models.py:330
#: aleksis/apps/kort/models.py:70 aleksis/apps/kort/models.py:336
#: aleksis/apps/kort/tables.py:95
#: aleksis/apps/kort/templates/kort/card/detail_content.html:38
#: aleksis/apps/kort/templates/kort/printer/detail_content.html:38
......@@ -162,7 +146,7 @@ msgstr "Ort"
msgid "Status"
msgstr "Status"
#: aleksis/apps/kort/models.py:74 aleksis/apps/kort/models.py:334
#: aleksis/apps/kort/models.py:74 aleksis/apps/kort/models.py:340
msgid "Status text"
msgstr "Statustext"
......@@ -187,103 +171,107 @@ msgstr "Kartennummer auf dem Server generieren"
msgid "Card detector"
msgstr "Karten-Detektor"
#: aleksis/apps/kort/models.py:175
#: aleksis/apps/kort/models.py:181
msgid "Card printer"
msgstr "Kartendrucker"
#: aleksis/apps/kort/models.py:176
#: aleksis/apps/kort/models.py:182
#: aleksis/apps/kort/templates/kort/printer/list.html:8
#: aleksis/apps/kort/templates/kort/printer/list.html:9
msgid "Card printers"
msgstr "Kartendrucker"
#: aleksis/apps/kort/models.py:180
#: aleksis/apps/kort/models.py:186
msgid "Media file"
msgstr "Mediendatei"
#: aleksis/apps/kort/models.py:192
#: aleksis/apps/kort/models.py:198
msgid "Media file for a card layout"
msgstr "Mediendatei für ein Kartenlayout"
#: aleksis/apps/kort/models.py:193
#: aleksis/apps/kort/models.py:199
msgid "Media files for card layouts"
msgstr "Mediendateien für Kartenlayouts"
#: aleksis/apps/kort/models.py:218
#: aleksis/apps/kort/models.py:224
#: aleksis/apps/kort/templates/kort/card_layout/detail_content.html:43
msgid "Template"
msgstr "Template"
#: aleksis/apps/kort/models.py:219
#: aleksis/apps/kort/models.py:225
#: aleksis/apps/kort/templates/kort/card_layout/detail_content.html:49
msgid "Custom CSS"
msgstr "Benutzerdefiniertes CSS"
#: aleksis/apps/kort/models.py:220
#: aleksis/apps/kort/models.py:226
msgid "Width"
msgstr "Breite"
#: aleksis/apps/kort/models.py:220 aleksis/apps/kort/models.py:221
#: aleksis/apps/kort/models.py:226 aleksis/apps/kort/models.py:227
msgid "in mm"
msgstr "in mm"
#: aleksis/apps/kort/models.py:221
#: aleksis/apps/kort/models.py:227
msgid "Height"
msgstr "Höhe"
#: aleksis/apps/kort/models.py:242
#: aleksis/apps/kort/models.py:248
msgid "Template is invalid: {}"
msgstr "Template ist ungültig: {}"
#: aleksis/apps/kort/models.py:248 aleksis/apps/kort/models.py:261
#: aleksis/apps/kort/models.py:254 aleksis/apps/kort/models.py:267
#: aleksis/apps/kort/templates/kort/card/detail_content.html:31
#: aleksis/apps/kort/templates/kort/card_layout/detail.html:8
msgid "Card Layout"
msgstr "Kartenlayout"
#: aleksis/apps/kort/models.py:254
#: aleksis/apps/kort/models.py:255
msgid "Card Layouts"
msgstr "Kartenlayouts"
#: aleksis/apps/kort/models.py:260
#: aleksis/apps/kort/templates/kort/card/detail_content.html:11
#: aleksis/apps/kort/templates/kort/card/short.html:4
msgid "Person"
msgstr "Person"
#: aleksis/apps/kort/models.py:256
#: aleksis/apps/kort/models.py:262
msgid "Chip Number"
msgstr "Chip-Nummer"
#: aleksis/apps/kort/models.py:258 aleksis/apps/kort/tables.py:31
#: aleksis/apps/kort/models.py:264 aleksis/apps/kort/tables.py:31
msgid "Deactivated"
msgstr "Deaktiviert"
#: aleksis/apps/kort/models.py:264
#: aleksis/apps/kort/models.py:270
msgid "PDF file"
msgstr "PDF-Datei"
#: aleksis/apps/kort/models.py:297
#: aleksis/apps/kort/models.py:303
msgid "There is no layout provided for the card."
msgstr "Es wurde kein Layout für die Karte bereitgestellt."
#: aleksis/apps/kort/models.py:316 aleksis/apps/kort/models.py:325
#: aleksis/apps/kort/models.py:322 aleksis/apps/kort/models.py:331
#: aleksis/apps/kort/templates/kort/card/detail.html:8
#: aleksis/apps/kort/templates/kort/printer/detail_content.html:84
msgid "Card"
msgstr "Karte"
#: aleksis/apps/kort/models.py:317
#: aleksis/apps/kort/models.py:323
#: aleksis/apps/kort/templates/kort/card/list.html:8
#: aleksis/apps/kort/templates/kort/card/list.html:9
msgid "Cards"
msgstr "Karten"
#: aleksis/apps/kort/models.py:322
#: aleksis/apps/kort/models.py:328
msgid "Printer"
msgstr "Drucker"
#: aleksis/apps/kort/models.py:337
#: aleksis/apps/kort/models.py:343
msgid "Card print job"
msgstr "Karten-Druckauftrag"
#: aleksis/apps/kort/models.py:338
#: aleksis/apps/kort/models.py:344
msgid "Card print jobs"
msgstr "Karten-Druckaufträge"
......@@ -739,3 +727,12 @@ msgstr "Das Kartenlayout wurde erfolgreich geändert."
#: aleksis/apps/kort/views.py:395
msgid "The card layout has been deleted successfully."
msgstr "Das Kartenlayout wurde erfolgreich gelöscht."
#~ msgid "Student ID Cards"
#~ msgstr "Schülerausweise"
#~ msgid "All Cards"
#~ msgstr "Alle Karten"
#~ msgid "Card Printers"
#~ msgstr "Kartendrucker"
......@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-08-12 23:11+0200\n"
"POT-Creation-Date: 2023-03-19 15:48+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
......@@ -17,7 +17,8 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
#: aleksis/apps/kort/apps.py:25
#: aleksis/apps/kort/apps.py:31
msgid "Access and manage printer status and print jobs"
msgstr ""
......@@ -54,11 +55,11 @@ msgstr ""
msgid "Groups"
msgstr ""
#: aleksis/apps/kort/forms.py:51 aleksis/apps/kort/models.py:185
#: aleksis/apps/kort/forms.py:51 aleksis/apps/kort/models.py:191
msgid "Card layout"
msgstr ""
#: aleksis/apps/kort/forms.py:53 aleksis/apps/kort/models.py:257
#: aleksis/apps/kort/forms.py:53 aleksis/apps/kort/models.py:263
#: aleksis/apps/kort/tables.py:30
#: aleksis/apps/kort/templates/kort/card/detail_content.html:24
#: aleksis/apps/kort/templates/kort/card/short.html:12
......@@ -81,26 +82,10 @@ msgstr ""
msgid "Printer settings"
msgstr ""
#: aleksis/apps/kort/forms.py:138 aleksis/apps/kort/models.py:222
#: aleksis/apps/kort/forms.py:138 aleksis/apps/kort/models.py:228
msgid "Required data fields"
msgstr ""
#: aleksis/apps/kort/menus.py:6
msgid "Student ID Cards"
msgstr ""
#: aleksis/apps/kort/menus.py:16
msgid "All Cards"
msgstr ""
#: aleksis/apps/kort/menus.py:27
msgid "Card Printers"
msgstr ""
#: aleksis/apps/kort/menus.py:38 aleksis/apps/kort/models.py:249
msgid "Card Layouts"
msgstr ""
#: aleksis/apps/kort/models.py:24
msgid "Online"
msgstr ""
......@@ -133,7 +118,7 @@ msgstr ""
msgid "Failed"
msgstr ""
#: aleksis/apps/kort/models.py:64 aleksis/apps/kort/models.py:217
#: aleksis/apps/kort/models.py:64 aleksis/apps/kort/models.py:223
#: aleksis/apps/kort/templates/kort/card_layout/detail_content.html:11
#: aleksis/apps/kort/templates/kort/card_layout/short.html:4
#: aleksis/apps/kort/templates/kort/printer/detail_content.html:11
......@@ -152,7 +137,7 @@ msgstr ""
msgid "Location"
msgstr ""
#: aleksis/apps/kort/models.py:70 aleksis/apps/kort/models.py:330
#: aleksis/apps/kort/models.py:70 aleksis/apps/kort/models.py:336
#: aleksis/apps/kort/tables.py:95
#: aleksis/apps/kort/templates/kort/card/detail_content.html:38
#: aleksis/apps/kort/templates/kort/printer/detail_content.html:38
......@@ -161,7 +146,7 @@ msgstr ""
msgid "Status"
msgstr ""
#: aleksis/apps/kort/models.py:74 aleksis/apps/kort/models.py:334
#: aleksis/apps/kort/models.py:74 aleksis/apps/kort/models.py:340
msgid "Status text"
msgstr ""
......@@ -186,103 +171,107 @@ msgstr ""
msgid "Card detector"
msgstr ""
#: aleksis/apps/kort/models.py:175
#: aleksis/apps/kort/models.py:181
msgid "Card printer"
msgstr ""
#: aleksis/apps/kort/models.py:176
#: aleksis/apps/kort/models.py:182
#: aleksis/apps/kort/templates/kort/printer/list.html:8
#: aleksis/apps/kort/templates/kort/printer/list.html:9
msgid "Card printers"
msgstr ""
#: aleksis/apps/kort/models.py:180
#: aleksis/apps/kort/models.py:186
msgid "Media file"
msgstr ""
#: aleksis/apps/kort/models.py:192
#: aleksis/apps/kort/models.py:198
msgid "Media file for a card layout"
msgstr ""
#: aleksis/apps/kort/models.py:193
#: aleksis/apps/kort/models.py:199
msgid "Media files for card layouts"
msgstr ""
#: aleksis/apps/kort/models.py:218
#: aleksis/apps/kort/models.py:224
#: aleksis/apps/kort/templates/kort/card_layout/detail_content.html:43
msgid "Template"
msgstr ""
#: aleksis/apps/kort/models.py:219
#: aleksis/apps/kort/models.py:225
#: aleksis/apps/kort/templates/kort/card_layout/detail_content.html:49
msgid "Custom CSS"
msgstr ""
#: aleksis/apps/kort/models.py:220
#: aleksis/apps/kort/models.py:226
msgid "Width"
msgstr ""
#: aleksis/apps/kort/models.py:220 aleksis/apps/kort/models.py:221
#: aleksis/apps/kort/models.py:226 aleksis/apps/kort/models.py:227
msgid "in mm"
msgstr ""
#: aleksis/apps/kort/models.py:221
#: aleksis/apps/kort/models.py:227
msgid "Height"
msgstr ""
#: aleksis/apps/kort/models.py:242
#: aleksis/apps/kort/models.py:248
msgid "Template is invalid: {}"
msgstr ""
#: aleksis/apps/kort/models.py:248 aleksis/apps/kort/models.py:261
#: aleksis/apps/kort/models.py:254 aleksis/apps/kort/models.py:267
#: aleksis/apps/kort/templates/kort/card/detail_content.html:31
#: aleksis/apps/kort/templates/kort/card_layout/detail.html:8
msgid "Card Layout"
msgstr ""
#: aleksis/apps/kort/models.py:254
#: aleksis/apps/kort/models.py:255
msgid "Card Layouts"
msgstr ""
#: aleksis/apps/kort/models.py:260
#: aleksis/apps/kort/templates/kort/card/detail_content.html:11
#: aleksis/apps/kort/templates/kort/card/short.html:4
msgid "Person"
msgstr ""
#: aleksis/apps/kort/models.py:256
#: aleksis/apps/kort/models.py:262
msgid "Chip Number"
msgstr ""
#: aleksis/apps/kort/models.py:258 aleksis/apps/kort/tables.py:31
#: aleksis/apps/kort/models.py:264 aleksis/apps/kort/tables.py:31
msgid "Deactivated"
msgstr ""
#: aleksis/apps/kort/models.py:264
#: aleksis/apps/kort/models.py:270
msgid "PDF file"
msgstr ""
#: aleksis/apps/kort/models.py:297
#: aleksis/apps/kort/models.py:303
msgid "There is no layout provided for the card."
msgstr ""
#: aleksis/apps/kort/models.py:316 aleksis/apps/kort/models.py:325
#: aleksis/apps/kort/models.py:322 aleksis/apps/kort/models.py:331
#: aleksis/apps/kort/templates/kort/card/detail.html:8
#: aleksis/apps/kort/templates/kort/printer/detail_content.html:84
msgid "Card"
msgstr ""
#: aleksis/apps/kort/models.py:317
#: aleksis/apps/kort/models.py:323
#: aleksis/apps/kort/templates/kort/card/list.html:8
#: aleksis/apps/kort/templates/kort/card/list.html:9
msgid "Cards"
msgstr ""
#: aleksis/apps/kort/models.py:322
#: aleksis/apps/kort/models.py:328
msgid "Printer"
msgstr ""
#: aleksis/apps/kort/models.py:337
#: aleksis/apps/kort/models.py:343
msgid "Card print job"
msgstr ""
#: aleksis/apps/kort/models.py:338
#: aleksis/apps/kort/models.py:344
msgid "Card print jobs"
msgstr ""
......
......@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-08-12 23:11+0200\n"
"POT-Creation-Date: 2023-03-19 15:48+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
......@@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: aleksis/apps/kort/apps.py:25
#: aleksis/apps/kort/apps.py:31
msgid "Access and manage printer status and print jobs"
msgstr ""
......@@ -54,11 +54,11 @@ msgstr ""
msgid "Groups"
msgstr ""
#: aleksis/apps/kort/forms.py:51 aleksis/apps/kort/models.py:185
#: aleksis/apps/kort/forms.py:51 aleksis/apps/kort/models.py:191
msgid "Card layout"
msgstr ""
#: aleksis/apps/kort/forms.py:53 aleksis/apps/kort/models.py:257
#: aleksis/apps/kort/forms.py:53 aleksis/apps/kort/models.py:263
#: aleksis/apps/kort/tables.py:30
#: aleksis/apps/kort/templates/kort/card/detail_content.html:24
#: aleksis/apps/kort/templates/kort/card/short.html:12
......@@ -81,26 +81,10 @@ msgstr ""
msgid "Printer settings"
msgstr ""
#: aleksis/apps/kort/forms.py:138 aleksis/apps/kort/models.py:222
#: aleksis/apps/kort/forms.py:138 aleksis/apps/kort/models.py:228
msgid "Required data fields"
msgstr ""
#: aleksis/apps/kort/menus.py:6
msgid "Student ID Cards"
msgstr ""
#: aleksis/apps/kort/menus.py:16
msgid "All Cards"
msgstr ""
#: aleksis/apps/kort/menus.py:27
msgid "Card Printers"
msgstr ""
#: aleksis/apps/kort/menus.py:38 aleksis/apps/kort/models.py:249
msgid "Card Layouts"
msgstr ""
#: aleksis/apps/kort/models.py:24
msgid "Online"
msgstr ""
......@@ -133,7 +117,7 @@ msgstr ""
msgid "Failed"
msgstr ""
#: aleksis/apps/kort/models.py:64 aleksis/apps/kort/models.py:217
#: aleksis/apps/kort/models.py:64 aleksis/apps/kort/models.py:223
#: aleksis/apps/kort/templates/kort/card_layout/detail_content.html:11
#: aleksis/apps/kort/templates/kort/card_layout/short.html:4
#: aleksis/apps/kort/templates/kort/printer/detail_content.html:11
......@@ -152,7 +136,7 @@ msgstr ""
msgid "Location"
msgstr ""
#: aleksis/apps/kort/models.py:70 aleksis/apps/kort/models.py:330
#: aleksis/apps/kort/models.py:70 aleksis/apps/kort/models.py:336
#: aleksis/apps/kort/tables.py:95
#: aleksis/apps/kort/templates/kort/card/detail_content.html:38
#: aleksis/apps/kort/templates/kort/printer/detail_content.html:38
......@@ -161,7 +145,7 @@ msgstr ""
msgid "Status"
msgstr ""
#: aleksis/apps/kort/models.py:74 aleksis/apps/kort/models.py:334
#: aleksis/apps/kort/models.py:74 aleksis/apps/kort/models.py:340
msgid "Status text"
msgstr ""
......@@ -186,103 +170,107 @@ msgstr ""
msgid "Card detector"
msgstr ""
#: aleksis/apps/kort/models.py:175
#: aleksis/apps/kort/models.py:181
msgid "Card printer"
msgstr ""
#: aleksis/apps/kort/models.py:176
#: aleksis/apps/kort/models.py:182
#: aleksis/apps/kort/templates/kort/printer/list.html:8
#: aleksis/apps/kort/templates/kort/printer/list.html:9
msgid "Card printers"
msgstr ""
#: aleksis/apps/kort/models.py:180
#: aleksis/apps/kort/models.py:186
msgid "Media file"
msgstr ""
#: aleksis/apps/kort/models.py:192
#: aleksis/apps/kort/models.py:198
msgid "Media file for a card layout"
msgstr ""
#: aleksis/apps/kort/models.py:193
#: aleksis/apps/kort/models.py:199
msgid "Media files for card layouts"
msgstr ""
#: aleksis/apps/kort/models.py:218
#: aleksis/apps/kort/models.py:224
#: aleksis/apps/kort/templates/kort/card_layout/detail_content.html:43
msgid "Template"
msgstr ""
#: aleksis/apps/kort/models.py:219
#: aleksis/apps/kort/models.py:225
#: aleksis/apps/kort/templates/kort/card_layout/detail_content.html:49
msgid "Custom CSS"
msgstr ""
#: aleksis/apps/kort/models.py:220
#: aleksis/apps/kort/models.py:226
msgid "Width"
msgstr ""
#: aleksis/apps/kort/models.py:220 aleksis/apps/kort/models.py:221
#: aleksis/apps/kort/models.py:226 aleksis/apps/kort/models.py:227
msgid "in mm"
msgstr ""
#: aleksis/apps/kort/models.py:221
#: aleksis/apps/kort/models.py:227
msgid "Height"
msgstr ""
#: aleksis/apps/kort/models.py:242
#: aleksis/apps/kort/models.py:248
msgid "Template is invalid: {}"
msgstr ""
#: aleksis/apps/kort/models.py:248 aleksis/apps/kort/models.py:261
#: aleksis/apps/kort/models.py:254 aleksis/apps/kort/models.py:267
#: aleksis/apps/kort/templates/kort/card/detail_content.html:31
#: aleksis/apps/kort/templates/kort/card_layout/detail.html:8
msgid "Card Layout"
msgstr ""
#: aleksis/apps/kort/models.py:254
#: aleksis/apps/kort/models.py:255
msgid "Card Layouts"
msgstr ""
#: aleksis/apps/kort/models.py:260
#: aleksis/apps/kort/templates/kort/card/detail_content.html:11
#: aleksis/apps/kort/templates/kort/card/short.html:4
msgid "Person"
msgstr ""
#: aleksis/apps/kort/models.py:256
#: aleksis/apps/kort/models.py:262
msgid "Chip Number"
msgstr ""
#: aleksis/apps/kort/models.py:258 aleksis/apps/kort/tables.py:31
#: aleksis/apps/kort/models.py:264 aleksis/apps/kort/tables.py:31
msgid "Deactivated"
msgstr ""
#: aleksis/apps/kort/models.py:264
#: aleksis/apps/kort/models.py:270
msgid "PDF file"
msgstr ""
#: aleksis/apps/kort/models.py:297
#: aleksis/apps/kort/models.py:303
msgid "There is no layout provided for the card."
msgstr ""
#: aleksis/apps/kort/models.py:316 aleksis/apps/kort/models.py:325
#: aleksis/apps/kort/models.py:322 aleksis/apps/kort/models.py:331
#: aleksis/apps/kort/templates/kort/card/detail.html:8
#: aleksis/apps/kort/templates/kort/printer/detail_content.html:84
msgid "Card"
msgstr ""
#: aleksis/apps/kort/models.py:317
#: aleksis/apps/kort/models.py:323
#: aleksis/apps/kort/templates/kort/card/list.html:8
#: aleksis/apps/kort/templates/kort/card/list.html:9
msgid "Cards"
msgstr ""
#: aleksis/apps/kort/models.py:322
#: aleksis/apps/kort/models.py:328
msgid "Printer"
msgstr ""
#: aleksis/apps/kort/models.py:337
#: aleksis/apps/kort/models.py:343
msgid "Card print job"
msgstr ""
#: aleksis/apps/kort/models.py:338
#: aleksis/apps/kort/models.py:344
msgid "Card print jobs"
msgstr ""
......
......@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-08-12 23:11+0200\n"
"POT-Creation-Date: 2023-03-19 15:48+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
......@@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: aleksis/apps/kort/apps.py:25
#: aleksis/apps/kort/apps.py:31
msgid "Access and manage printer status and print jobs"
msgstr ""
......@@ -54,11 +54,11 @@ msgstr ""
msgid "Groups"
msgstr ""
#: aleksis/apps/kort/forms.py:51 aleksis/apps/kort/models.py:185
#: aleksis/apps/kort/forms.py:51 aleksis/apps/kort/models.py:191
msgid "Card layout"
msgstr ""
#: aleksis/apps/kort/forms.py:53 aleksis/apps/kort/models.py:257
#: aleksis/apps/kort/forms.py:53 aleksis/apps/kort/models.py:263
#: aleksis/apps/kort/tables.py:30
#: aleksis/apps/kort/templates/kort/card/detail_content.html:24
#: aleksis/apps/kort/templates/kort/card/short.html:12
......@@ -81,26 +81,10 @@ msgstr ""
msgid "Printer settings"
msgstr ""
#: aleksis/apps/kort/forms.py:138 aleksis/apps/kort/models.py:222
#: aleksis/apps/kort/forms.py:138 aleksis/apps/kort/models.py:228
msgid "Required data fields"
msgstr ""
#: aleksis/apps/kort/menus.py:6
msgid "Student ID Cards"
msgstr ""
#: aleksis/apps/kort/menus.py:16
msgid "All Cards"
msgstr ""
#: aleksis/apps/kort/menus.py:27
msgid "Card Printers"
msgstr ""
#: aleksis/apps/kort/menus.py:38 aleksis/apps/kort/models.py:249
msgid "Card Layouts"
msgstr ""
#: aleksis/apps/kort/models.py:24
msgid "Online"
msgstr ""
......@@ -133,7 +117,7 @@ msgstr ""
msgid "Failed"
msgstr ""
#: aleksis/apps/kort/models.py:64 aleksis/apps/kort/models.py:217
#: aleksis/apps/kort/models.py:64 aleksis/apps/kort/models.py:223
#: aleksis/apps/kort/templates/kort/card_layout/detail_content.html:11
#: aleksis/apps/kort/templates/kort/card_layout/short.html:4
#: aleksis/apps/kort/templates/kort/printer/detail_content.html:11
......@@ -152,7 +136,7 @@ msgstr ""
msgid "Location"
msgstr ""
#: aleksis/apps/kort/models.py:70 aleksis/apps/kort/models.py:330
#: aleksis/apps/kort/models.py:70 aleksis/apps/kort/models.py:336
#: aleksis/apps/kort/tables.py:95
#: aleksis/apps/kort/templates/kort/card/detail_content.html:38
#: aleksis/apps/kort/templates/kort/printer/detail_content.html:38
......@@ -161,7 +145,7 @@ msgstr ""
msgid "Status"
msgstr ""
#: aleksis/apps/kort/models.py:74 aleksis/apps/kort/models.py:334
#: aleksis/apps/kort/models.py:74 aleksis/apps/kort/models.py:340
msgid "Status text"
msgstr ""
......@@ -186,103 +170,107 @@ msgstr ""
msgid "Card detector"
msgstr ""
#: aleksis/apps/kort/models.py:175
#: aleksis/apps/kort/models.py:181
msgid "Card printer"
msgstr ""
#: aleksis/apps/kort/models.py:176
#: aleksis/apps/kort/models.py:182
#: aleksis/apps/kort/templates/kort/printer/list.html:8
#: aleksis/apps/kort/templates/kort/printer/list.html:9
msgid "Card printers"
msgstr ""
#: aleksis/apps/kort/models.py:180
#: aleksis/apps/kort/models.py:186
msgid "Media file"
msgstr ""
#: aleksis/apps/kort/models.py:192
#: aleksis/apps/kort/models.py:198
msgid "Media file for a card layout"
msgstr ""
#: aleksis/apps/kort/models.py:193
#: aleksis/apps/kort/models.py:199
msgid "Media files for card layouts"
msgstr ""
#: aleksis/apps/kort/models.py:218
#: aleksis/apps/kort/models.py:224
#: aleksis/apps/kort/templates/kort/card_layout/detail_content.html:43
msgid "Template"
msgstr ""
#: aleksis/apps/kort/models.py:219
#: aleksis/apps/kort/models.py:225
#: aleksis/apps/kort/templates/kort/card_layout/detail_content.html:49
msgid "Custom CSS"
msgstr ""
#: aleksis/apps/kort/models.py:220
#: aleksis/apps/kort/models.py:226
msgid "Width"
msgstr ""
#: aleksis/apps/kort/models.py:220 aleksis/apps/kort/models.py:221
#: aleksis/apps/kort/models.py:226 aleksis/apps/kort/models.py:227
msgid "in mm"
msgstr ""
#: aleksis/apps/kort/models.py:221
#: aleksis/apps/kort/models.py:227
msgid "Height"
msgstr ""
#: aleksis/apps/kort/models.py:242
#: aleksis/apps/kort/models.py:248
msgid "Template is invalid: {}"
msgstr ""
#: aleksis/apps/kort/models.py:248 aleksis/apps/kort/models.py:261
#: aleksis/apps/kort/models.py:254 aleksis/apps/kort/models.py:267
#: aleksis/apps/kort/templates/kort/card/detail_content.html:31
#: aleksis/apps/kort/templates/kort/card_layout/detail.html:8
msgid "Card Layout"
msgstr ""
#: aleksis/apps/kort/models.py:254
#: aleksis/apps/kort/models.py:255
msgid "Card Layouts"
msgstr ""
#: aleksis/apps/kort/models.py:260
#: aleksis/apps/kort/templates/kort/card/detail_content.html:11
#: aleksis/apps/kort/templates/kort/card/short.html:4
msgid "Person"
msgstr ""
#: aleksis/apps/kort/models.py:256
#: aleksis/apps/kort/models.py:262
msgid "Chip Number"
msgstr ""
#: aleksis/apps/kort/models.py:258 aleksis/apps/kort/tables.py:31
#: aleksis/apps/kort/models.py:264 aleksis/apps/kort/tables.py:31
msgid "Deactivated"
msgstr ""
#: aleksis/apps/kort/models.py:264
#: aleksis/apps/kort/models.py:270
msgid "PDF file"
msgstr ""
#: aleksis/apps/kort/models.py:297
#: aleksis/apps/kort/models.py:303
msgid "There is no layout provided for the card."
msgstr ""
#: aleksis/apps/kort/models.py:316 aleksis/apps/kort/models.py:325
#: aleksis/apps/kort/models.py:322 aleksis/apps/kort/models.py:331
#: aleksis/apps/kort/templates/kort/card/detail.html:8
#: aleksis/apps/kort/templates/kort/printer/detail_content.html:84
msgid "Card"
msgstr ""
#: aleksis/apps/kort/models.py:317
#: aleksis/apps/kort/models.py:323
#: aleksis/apps/kort/templates/kort/card/list.html:8
#: aleksis/apps/kort/templates/kort/card/list.html:9
msgid "Cards"
msgstr ""
#: aleksis/apps/kort/models.py:322
#: aleksis/apps/kort/models.py:328
msgid "Printer"
msgstr ""
#: aleksis/apps/kort/models.py:337
#: aleksis/apps/kort/models.py:343
msgid "Card print job"
msgstr ""
#: aleksis/apps/kort/models.py:338
#: aleksis/apps/kort/models.py:344
msgid "Card print jobs"
msgstr ""
......
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-03-19 15:48+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
"n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || "
"(n%100>=11 && n%100<=14)? 2 : 3);\n"
#: aleksis/apps/kort/apps.py:31
msgid "Access and manage printer status and print jobs"
msgstr ""
#: aleksis/apps/kort/forms.py:15
msgid "Select person(s) or group(s)"
msgstr ""
#: aleksis/apps/kort/forms.py:16
msgid "Select validity"
msgstr ""
#: aleksis/apps/kort/forms.py:17
msgid "Select layout"
msgstr ""
#: aleksis/apps/kort/forms.py:18
msgid "Select printer (optional)"
msgstr ""
#: aleksis/apps/kort/forms.py:22 aleksis/apps/kort/forms.py:111
#: aleksis/apps/kort/templates/kort/printer/detail.html:8
msgid "Card Printer"
msgstr ""
#: aleksis/apps/kort/forms.py:23
msgid "Select a printer to directly print the newly issued card."
msgstr ""
#: aleksis/apps/kort/forms.py:28
msgid "Persons"
msgstr ""
#: aleksis/apps/kort/forms.py:41
msgid "Groups"
msgstr ""
#: aleksis/apps/kort/forms.py:51 aleksis/apps/kort/models.py:191
msgid "Card layout"
msgstr ""
#: aleksis/apps/kort/forms.py:53 aleksis/apps/kort/models.py:263
#: aleksis/apps/kort/tables.py:30
#: aleksis/apps/kort/templates/kort/card/detail_content.html:24
#: aleksis/apps/kort/templates/kort/card/short.html:12
msgid "Valid until"
msgstr ""
#: aleksis/apps/kort/forms.py:63
msgid "You must select at least one person or group."
msgstr ""
#: aleksis/apps/kort/forms.py:71
msgid "The selected groups don't have any members."
msgstr ""
#: aleksis/apps/kort/forms.py:91
msgid "Generic attributes"
msgstr ""
#: aleksis/apps/kort/forms.py:93
msgid "Printer settings"
msgstr ""
#: aleksis/apps/kort/forms.py:138 aleksis/apps/kort/models.py:228
msgid "Required data fields"
msgstr ""
#: aleksis/apps/kort/models.py:24
msgid "Online"
msgstr ""
#: aleksis/apps/kort/models.py:25
msgid "Offline"
msgstr ""
#: aleksis/apps/kort/models.py:26
msgid "With errors"
msgstr ""
#: aleksis/apps/kort/models.py:27
msgid "Not registered"
msgstr ""
#: aleksis/apps/kort/models.py:56
msgid "Registered"
msgstr ""
#: aleksis/apps/kort/models.py:57
msgid "In progress"
msgstr ""
#: aleksis/apps/kort/models.py:58
msgid "Finished"
msgstr ""
#: aleksis/apps/kort/models.py:59
msgid "Failed"
msgstr ""
#: aleksis/apps/kort/models.py:64 aleksis/apps/kort/models.py:223
#: aleksis/apps/kort/templates/kort/card_layout/detail_content.html:11
#: aleksis/apps/kort/templates/kort/card_layout/short.html:4
#: aleksis/apps/kort/templates/kort/printer/detail_content.html:11
#: aleksis/apps/kort/templates/kort/printer/short.html:4
msgid "Name"
msgstr ""
#: aleksis/apps/kort/models.py:65
#: aleksis/apps/kort/templates/kort/printer/detail_content.html:24
msgid "Description"
msgstr ""
#: aleksis/apps/kort/models.py:66
#: aleksis/apps/kort/templates/kort/printer/detail_content.html:17
#: aleksis/apps/kort/templates/kort/printer/short.html:8
msgid "Location"
msgstr ""
#: aleksis/apps/kort/models.py:70 aleksis/apps/kort/models.py:336
#: aleksis/apps/kort/tables.py:95
#: aleksis/apps/kort/templates/kort/card/detail_content.html:38
#: aleksis/apps/kort/templates/kort/printer/detail_content.html:38
#: aleksis/apps/kort/templates/kort/printer/detail_content.html:90
#: aleksis/apps/kort/templates/kort/printer/short.html:12
msgid "Status"
msgstr ""
#: aleksis/apps/kort/models.py:74 aleksis/apps/kort/models.py:340
msgid "Status text"
msgstr ""
#: aleksis/apps/kort/models.py:75 aleksis/apps/kort/tables.py:58
#: aleksis/apps/kort/templates/kort/printer/detail_content.html:31
msgid "Last seen at"
msgstr ""
#: aleksis/apps/kort/models.py:80
msgid "OAuth2 application"
msgstr ""
#: aleksis/apps/kort/models.py:87
msgid "CUPS printer"
msgstr ""
#: aleksis/apps/kort/models.py:89
msgid "Generate card number on server"
msgstr ""
#: aleksis/apps/kort/models.py:91
msgid "Card detector"
msgstr ""
#: aleksis/apps/kort/models.py:181
msgid "Card printer"
msgstr ""
#: aleksis/apps/kort/models.py:182
#: aleksis/apps/kort/templates/kort/printer/list.html:8
#: aleksis/apps/kort/templates/kort/printer/list.html:9
msgid "Card printers"
msgstr ""
#: aleksis/apps/kort/models.py:186
msgid "Media file"
msgstr ""
#: aleksis/apps/kort/models.py:198
msgid "Media file for a card layout"
msgstr ""
#: aleksis/apps/kort/models.py:199
msgid "Media files for card layouts"
msgstr ""
#: aleksis/apps/kort/models.py:224
#: aleksis/apps/kort/templates/kort/card_layout/detail_content.html:43
msgid "Template"
msgstr ""
#: aleksis/apps/kort/models.py:225
#: aleksis/apps/kort/templates/kort/card_layout/detail_content.html:49
msgid "Custom CSS"
msgstr ""
#: aleksis/apps/kort/models.py:226
msgid "Width"
msgstr ""
#: aleksis/apps/kort/models.py:226 aleksis/apps/kort/models.py:227
msgid "in mm"
msgstr ""
#: aleksis/apps/kort/models.py:227
msgid "Height"
msgstr ""
#: aleksis/apps/kort/models.py:248
msgid "Template is invalid: {}"
msgstr ""
#: aleksis/apps/kort/models.py:254 aleksis/apps/kort/models.py:267
#: aleksis/apps/kort/templates/kort/card/detail_content.html:31
#: aleksis/apps/kort/templates/kort/card_layout/detail.html:8
msgid "Card Layout"
msgstr ""
#: aleksis/apps/kort/models.py:255
msgid "Card Layouts"
msgstr ""
#: aleksis/apps/kort/models.py:260
#: aleksis/apps/kort/templates/kort/card/detail_content.html:11
#: aleksis/apps/kort/templates/kort/card/short.html:4
msgid "Person"
msgstr ""
#: aleksis/apps/kort/models.py:262
msgid "Chip Number"
msgstr ""
#: aleksis/apps/kort/models.py:264 aleksis/apps/kort/tables.py:31
msgid "Deactivated"
msgstr ""
#: aleksis/apps/kort/models.py:270
msgid "PDF file"
msgstr ""
#: aleksis/apps/kort/models.py:303
msgid "There is no layout provided for the card."
msgstr ""
#: aleksis/apps/kort/models.py:322 aleksis/apps/kort/models.py:331
#: aleksis/apps/kort/templates/kort/card/detail.html:8
#: aleksis/apps/kort/templates/kort/printer/detail_content.html:84
msgid "Card"
msgstr ""
#: aleksis/apps/kort/models.py:323
#: aleksis/apps/kort/templates/kort/card/list.html:8
#: aleksis/apps/kort/templates/kort/card/list.html:9
msgid "Cards"
msgstr ""
#: aleksis/apps/kort/models.py:328
msgid "Printer"
msgstr ""
#: aleksis/apps/kort/models.py:343
msgid "Card print job"
msgstr ""
#: aleksis/apps/kort/models.py:344
msgid "Card print jobs"
msgstr ""
#: aleksis/apps/kort/tables.py:28
#: aleksis/apps/kort/templates/kort/card/detail_content.html:17
#: aleksis/apps/kort/templates/kort/card/short.html:8
msgid "Chip number"
msgstr ""
#: aleksis/apps/kort/tables.py:29 aleksis/apps/kort/tables.py:57
msgid "Current status"
msgstr ""
#: aleksis/apps/kort/tables.py:32 aleksis/apps/kort/tables.py:61
#: aleksis/apps/kort/tables.py:85
msgid "Actions"
msgstr ""
#: aleksis/apps/kort/tables.py:54
msgid "Printer name"
msgstr ""
#: aleksis/apps/kort/tables.py:55
msgid "Printer location"
msgstr ""
#: aleksis/apps/kort/tables.py:59
msgid "Running jobs"
msgstr ""
#: aleksis/apps/kort/tables.py:81
msgid "Layout name"
msgstr ""
#: aleksis/apps/kort/templates/kort/card/actions.html:8
#: aleksis/apps/kort/templates/kort/card/detail.html:9
#, python-format
msgid "Card of %(person)s"
msgstr ""
#: aleksis/apps/kort/templates/kort/card/actions.html:14
#: aleksis/apps/kort/templates/kort/card/actions.html:31
#: aleksis/apps/kort/templates/kort/card_layout/actions.html:11
#: aleksis/apps/kort/templates/kort/printer/actions.html:11
msgid "Close"
msgstr ""
#: aleksis/apps/kort/templates/kort/card/actions.html:20
#: aleksis/apps/kort/templates/kort/card_layout/actions.html:17
#: aleksis/apps/kort/templates/kort/printer/actions.html:17
msgid "Show"
msgstr ""
#: aleksis/apps/kort/templates/kort/card/actions.html:25
msgid "Do you really want to deactivate the following card?"
msgstr ""
#: aleksis/apps/kort/templates/kort/card/actions.html:35
#: aleksis/apps/kort/templates/kort/card/actions.html:41
msgid "Deactivate"
msgstr ""
#: aleksis/apps/kort/templates/kort/card/actions.html:47
#: aleksis/apps/kort/templates/kort/card/delete.html:30
#: aleksis/apps/kort/templates/kort/card_layout/actions.html:33
#: aleksis/apps/kort/templates/kort/card_layout/delete.html:29
#: aleksis/apps/kort/templates/kort/card_layout/detail.html:31
#: aleksis/apps/kort/templates/kort/printer/actions.html:33
#: aleksis/apps/kort/templates/kort/printer/delete.html:29
#: aleksis/apps/kort/templates/kort/printer/detail.html:31
msgid "Delete"
msgstr ""
#: aleksis/apps/kort/templates/kort/card/delete.html:8
msgid "Delete Card"
msgstr ""
#: aleksis/apps/kort/templates/kort/card/delete.html:12
msgid "Do you really want to delete the following card?"
msgstr ""
#: aleksis/apps/kort/templates/kort/card/delete.html:16
msgid ""
"\n"
" Please pay attention that a deletion of a card is irreversible and should be only used to clean up misprints.\n"
" If you just want to make a card unusable because a student has lost his card or left the school,\n"
" please deactivate the card instead.\n"
" "
msgstr ""
#: aleksis/apps/kort/templates/kort/card/delete.html:26
#: aleksis/apps/kort/templates/kort/card_layout/delete.html:25
#: aleksis/apps/kort/templates/kort/printer/delete.html:25
msgid "Go back"
msgstr ""
#: aleksis/apps/kort/templates/kort/card/detail_content.html:6
msgid "Card details"
msgstr ""
#: aleksis/apps/kort/templates/kort/card/detail_content.html:19
msgid "not set yet"
msgstr ""
#: aleksis/apps/kort/templates/kort/card/detail_content.html:53
msgid "Show card as PDF"
msgstr ""
#: aleksis/apps/kort/templates/kort/card/detail_content.html:61
msgid "Generate card as PDF"
msgstr ""
#: aleksis/apps/kort/templates/kort/card/edit.html:12
#: aleksis/apps/kort/templates/kort/card/edit.html:13
msgid "Edit card"
msgstr ""
#: aleksis/apps/kort/templates/kort/card/issue.html:12
#: aleksis/apps/kort/templates/kort/card/issue.html:13
msgid "Issue card(s)"
msgstr ""
#: aleksis/apps/kort/templates/kort/card/issue.html:23
msgid ""
"\n"
" Please select the persons and/or the groups to whom you want to issue new cards.\n"
" After clicking on 'Next', you will be able to check whether the data of the persons\n"
" are complete and include everything needed for the cards.\n"
" "
msgstr ""
#: aleksis/apps/kort/templates/kort/card/issue.html:32
msgid ""
"\n"
" In the following table you can see all selected persons and the related data needed for the cards.\n"
" Please select the persons to whom you want to issue new cards.\n"
" "
msgstr ""
#: aleksis/apps/kort/templates/kort/card/issue.html:65
msgid "Previous step"
msgstr ""
#: aleksis/apps/kort/templates/kort/card/issue.html:71
msgid "Issue cards for selected persons"
msgstr ""
#: aleksis/apps/kort/templates/kort/card/issue.html:77
msgid "Next step"
msgstr ""
#: aleksis/apps/kort/templates/kort/card/issue.html:83
msgid "Cancel"
msgstr ""
#: aleksis/apps/kort/templates/kort/card/list.html:17
msgid "Issue new card(s)"
msgstr ""
#: aleksis/apps/kort/templates/kort/card/print_form.html:8
#: aleksis/apps/kort/templates/kort/card/print_form.html:16
msgid "Print card"
msgstr ""
#: aleksis/apps/kort/templates/kort/card/status.html:3
msgid "Valid"
msgstr ""
#: aleksis/apps/kort/templates/kort/card/status.html:5
msgid "Not valid"
msgstr ""
#: aleksis/apps/kort/templates/kort/card_layout/actions.html:26
#: aleksis/apps/kort/templates/kort/card_layout/detail.html:24
#: aleksis/apps/kort/templates/kort/printer/actions.html:27
#: aleksis/apps/kort/templates/kort/printer/detail.html:24
msgid "Edit"
msgstr ""
#: aleksis/apps/kort/templates/kort/card_layout/create.html:12
#: aleksis/apps/kort/templates/kort/card_layout/create.html:13
msgid "Create card layout"
msgstr ""
#: aleksis/apps/kort/templates/kort/card_layout/create.html:23
#: aleksis/apps/kort/templates/kort/card_layout/edit.html:23
msgid "Media Files"
msgstr ""
#: aleksis/apps/kort/templates/kort/card_layout/delete.html:8
msgid "Delete Card Layout"
msgstr ""
#: aleksis/apps/kort/templates/kort/card_layout/delete.html:12
msgid "Do you really want to delete the following card layout?"
msgstr ""
#: aleksis/apps/kort/templates/kort/card_layout/delete.html:16
msgid ""
"\n"
" Please pay attention that this also will prevent the successful finishing of all active print jobs\n"
" which use these template.\n"
" "
msgstr ""
#: aleksis/apps/kort/templates/kort/card_layout/detail.html:15
msgid "Back to all layouts"
msgstr ""
#: aleksis/apps/kort/templates/kort/card_layout/detail_content.html:6
msgid "Layout details"
msgstr ""
#: aleksis/apps/kort/templates/kort/card_layout/detail_content.html:17
msgid "Size (w × h)"
msgstr ""
#: aleksis/apps/kort/templates/kort/card_layout/detail_content.html:24
msgid "Media files"
msgstr ""
#: aleksis/apps/kort/templates/kort/card_layout/detail_content.html:31
msgid "No media files uploaded."
msgstr ""
#: aleksis/apps/kort/templates/kort/card_layout/edit.html:12
#: aleksis/apps/kort/templates/kort/card_layout/edit.html:13
msgid "Edit card layout"
msgstr ""
#: aleksis/apps/kort/templates/kort/card_layout/instructions.html:4
msgid "Instructions on templating the card"
msgstr ""
#: aleksis/apps/kort/templates/kort/card_layout/instructions.html:5
msgid ""
"\n"
" You will be able to use the following data in your individual template. The template has to been written in the\n"
" Django template language.\n"
" "
msgstr ""
#: aleksis/apps/kort/templates/kort/card_layout/instructions.html:11
msgid "The chip number as string"
msgstr ""
#: aleksis/apps/kort/templates/kort/card_layout/instructions.html:15
msgid "This will give you access to any attributes of the person object like name, personal data or contact data."
msgstr ""
#: aleksis/apps/kort/templates/kort/card_layout/instructions.html:19
msgid "The date until when the card is valid"
msgstr ""
#: aleksis/apps/kort/templates/kort/card_layout/instructions.html:24
msgid "This will give you access to the uploaded media files. Replace 0 by the number of your media file (starting with 0)."
msgstr ""
#: aleksis/apps/kort/templates/kort/card_layout/list.html:8
#: aleksis/apps/kort/templates/kort/card_layout/list.html:9
msgid "Card layouts"
msgstr ""
#: aleksis/apps/kort/templates/kort/card_layout/list.html:17
msgid "Create new card layout"
msgstr ""
#: aleksis/apps/kort/templates/kort/person_status.html:5
#, python-format
msgid "%(count)s missing data fields"
msgstr ""
#: aleksis/apps/kort/templates/kort/person_status.html:10
msgid "Data complete"
msgstr ""
#: aleksis/apps/kort/templates/kort/picture.html:4
msgid "Person picture"
msgstr ""
#: aleksis/apps/kort/templates/kort/printer/create.html:12
#: aleksis/apps/kort/templates/kort/printer/create.html:13
msgid "Create card"
msgstr ""
#: aleksis/apps/kort/templates/kort/printer/delete.html:8
msgid "Delete Card Printer"
msgstr ""
#: aleksis/apps/kort/templates/kort/printer/delete.html:12
msgid "Do you really want to delete the following card printer?"
msgstr ""
#: aleksis/apps/kort/templates/kort/printer/delete.html:16
msgid ""
"\n"
" Please pay attention that this also will deactivate the access for the print client and you would have to\n"
" reconfigure the client if you want to use it further.\n"
" "
msgstr ""
#: aleksis/apps/kort/templates/kort/printer/detail.html:15
msgid "Back to all printers"
msgstr ""
#: aleksis/apps/kort/templates/kort/printer/detail_content.html:6
msgid "Printer details"
msgstr ""
#: aleksis/apps/kort/templates/kort/printer/detail_content.html:33
msgid "never seen yet"
msgstr ""
#: aleksis/apps/kort/templates/kort/printer/detail_content.html:60
msgid "Setup printer client"
msgstr ""
#: aleksis/apps/kort/templates/kort/printer/detail_content.html:62
msgid ""
"\n"
" To enable printing, you have to register the print client on the device\n"
" which the printer is connected to.\n"
" "
msgstr ""
#: aleksis/apps/kort/templates/kort/printer/detail_content.html:67
msgid "1. Download print client"
msgstr ""
#: aleksis/apps/kort/templates/kort/printer/detail_content.html:68
msgid "2. Download configuration file"
msgstr ""
#: aleksis/apps/kort/templates/kort/printer/detail_content.html:71
msgid "Download configuration"
msgstr ""
#: aleksis/apps/kort/templates/kort/printer/detail_content.html:73
msgid "3. Setup client"
msgstr ""
#: aleksis/apps/kort/templates/kort/printer/detail_content.html:80
msgid "Print jobs"
msgstr ""
#: aleksis/apps/kort/templates/kort/printer/detail_content.html:87
msgid "Created at"
msgstr ""
#: aleksis/apps/kort/templates/kort/printer/edit.html:12
#: aleksis/apps/kort/templates/kort/printer/edit.html:13
msgid "Edit card printer"
msgstr ""
#: aleksis/apps/kort/templates/kort/printer/list.html:17
msgid "Register new card printer"
msgstr ""
#: aleksis/apps/kort/views.py:69
msgid "The cards have been created successfully."
msgstr ""
#: aleksis/apps/kort/views.py:137 aleksis/apps/kort/views.py:193
msgid "The print job #{} for the card {} on the printer {} has been created successfully."
msgstr ""
#: aleksis/apps/kort/views.py:145 aleksis/apps/kort/views.py:200
msgid "The print job couldn't be started because of the following error: {}"
msgstr ""
#: aleksis/apps/kort/views.py:158
msgid "The card has been deleted successfully."
msgstr ""
#: aleksis/apps/kort/views.py:171
msgid "The card has been deactivated successfully."
msgstr ""
#: aleksis/apps/kort/views.py:220
msgid "The chip number is missing."
msgstr ""
#: aleksis/apps/kort/views.py:232
msgid "Progress: Generate card layout as PDF file"
msgstr ""
#: aleksis/apps/kort/views.py:233
msgid "Generating PDF file …"
msgstr ""
#: aleksis/apps/kort/views.py:234
msgid "The PDF file with the card layout has been generated successfully."
msgstr ""
#: aleksis/apps/kort/views.py:235
msgid "There was a problem while generating the PDF file."
msgstr ""
#: aleksis/apps/kort/views.py:237
msgid "Show card"
msgstr ""
#: aleksis/apps/kort/views.py:275
msgid "The card printer has been created successfully."
msgstr ""
#: aleksis/apps/kort/views.py:288
msgid "The card printer has been changed successfully."
msgstr ""
#: aleksis/apps/kort/views.py:301
msgid "The card printer has been deleted successfully."
msgstr ""
#: aleksis/apps/kort/views.py:364
msgid "The card layout has been created successfully."
msgstr ""
#: aleksis/apps/kort/views.py:382
msgid "The card layout has been changed successfully."
msgstr ""
#: aleksis/apps/kort/views.py:395
msgid "The card layout has been deleted successfully."
msgstr ""
......@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-08-12 23:11+0200\n"
"POT-Creation-Date: 2023-03-19 15:48+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
......@@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: aleksis/apps/kort/apps.py:25
#: aleksis/apps/kort/apps.py:31
msgid "Access and manage printer status and print jobs"
msgstr ""
......@@ -54,11 +54,11 @@ msgstr ""
msgid "Groups"
msgstr ""
#: aleksis/apps/kort/forms.py:51 aleksis/apps/kort/models.py:185
#: aleksis/apps/kort/forms.py:51 aleksis/apps/kort/models.py:191
msgid "Card layout"
msgstr ""
#: aleksis/apps/kort/forms.py:53 aleksis/apps/kort/models.py:257
#: aleksis/apps/kort/forms.py:53 aleksis/apps/kort/models.py:263
#: aleksis/apps/kort/tables.py:30
#: aleksis/apps/kort/templates/kort/card/detail_content.html:24
#: aleksis/apps/kort/templates/kort/card/short.html:12
......@@ -81,26 +81,10 @@ msgstr ""
msgid "Printer settings"
msgstr ""
#: aleksis/apps/kort/forms.py:138 aleksis/apps/kort/models.py:222
#: aleksis/apps/kort/forms.py:138 aleksis/apps/kort/models.py:228
msgid "Required data fields"
msgstr ""
#: aleksis/apps/kort/menus.py:6
msgid "Student ID Cards"
msgstr ""
#: aleksis/apps/kort/menus.py:16
msgid "All Cards"
msgstr ""
#: aleksis/apps/kort/menus.py:27
msgid "Card Printers"
msgstr ""
#: aleksis/apps/kort/menus.py:38 aleksis/apps/kort/models.py:249
msgid "Card Layouts"
msgstr ""
#: aleksis/apps/kort/models.py:24
msgid "Online"
msgstr ""
......@@ -133,7 +117,7 @@ msgstr ""
msgid "Failed"
msgstr ""
#: aleksis/apps/kort/models.py:64 aleksis/apps/kort/models.py:217
#: aleksis/apps/kort/models.py:64 aleksis/apps/kort/models.py:223
#: aleksis/apps/kort/templates/kort/card_layout/detail_content.html:11
#: aleksis/apps/kort/templates/kort/card_layout/short.html:4
#: aleksis/apps/kort/templates/kort/printer/detail_content.html:11
......@@ -152,7 +136,7 @@ msgstr ""
msgid "Location"
msgstr ""
#: aleksis/apps/kort/models.py:70 aleksis/apps/kort/models.py:330
#: aleksis/apps/kort/models.py:70 aleksis/apps/kort/models.py:336
#: aleksis/apps/kort/tables.py:95
#: aleksis/apps/kort/templates/kort/card/detail_content.html:38
#: aleksis/apps/kort/templates/kort/printer/detail_content.html:38
......@@ -161,7 +145,7 @@ msgstr ""
msgid "Status"
msgstr ""
#: aleksis/apps/kort/models.py:74 aleksis/apps/kort/models.py:334
#: aleksis/apps/kort/models.py:74 aleksis/apps/kort/models.py:340
msgid "Status text"
msgstr ""
......@@ -186,103 +170,107 @@ msgstr ""
msgid "Card detector"
msgstr ""
#: aleksis/apps/kort/models.py:175
#: aleksis/apps/kort/models.py:181
msgid "Card printer"
msgstr ""
#: aleksis/apps/kort/models.py:176
#: aleksis/apps/kort/models.py:182
#: aleksis/apps/kort/templates/kort/printer/list.html:8
#: aleksis/apps/kort/templates/kort/printer/list.html:9
msgid "Card printers"
msgstr ""
#: aleksis/apps/kort/models.py:180
#: aleksis/apps/kort/models.py:186
msgid "Media file"
msgstr ""
#: aleksis/apps/kort/models.py:192
#: aleksis/apps/kort/models.py:198
msgid "Media file for a card layout"
msgstr ""
#: aleksis/apps/kort/models.py:193
#: aleksis/apps/kort/models.py:199
msgid "Media files for card layouts"
msgstr ""
#: aleksis/apps/kort/models.py:218
#: aleksis/apps/kort/models.py:224
#: aleksis/apps/kort/templates/kort/card_layout/detail_content.html:43
msgid "Template"
msgstr ""
#: aleksis/apps/kort/models.py:219
#: aleksis/apps/kort/models.py:225
#: aleksis/apps/kort/templates/kort/card_layout/detail_content.html:49
msgid "Custom CSS"
msgstr ""
#: aleksis/apps/kort/models.py:220
#: aleksis/apps/kort/models.py:226
msgid "Width"
msgstr ""
#: aleksis/apps/kort/models.py:220 aleksis/apps/kort/models.py:221
#: aleksis/apps/kort/models.py:226 aleksis/apps/kort/models.py:227
msgid "in mm"
msgstr ""
#: aleksis/apps/kort/models.py:221
#: aleksis/apps/kort/models.py:227
msgid "Height"
msgstr ""
#: aleksis/apps/kort/models.py:242
#: aleksis/apps/kort/models.py:248
msgid "Template is invalid: {}"
msgstr ""
#: aleksis/apps/kort/models.py:248 aleksis/apps/kort/models.py:261
#: aleksis/apps/kort/models.py:254 aleksis/apps/kort/models.py:267
#: aleksis/apps/kort/templates/kort/card/detail_content.html:31
#: aleksis/apps/kort/templates/kort/card_layout/detail.html:8
msgid "Card Layout"
msgstr ""
#: aleksis/apps/kort/models.py:254
#: aleksis/apps/kort/models.py:255
msgid "Card Layouts"
msgstr ""
#: aleksis/apps/kort/models.py:260
#: aleksis/apps/kort/templates/kort/card/detail_content.html:11
#: aleksis/apps/kort/templates/kort/card/short.html:4
msgid "Person"
msgstr ""
#: aleksis/apps/kort/models.py:256
#: aleksis/apps/kort/models.py:262
msgid "Chip Number"
msgstr ""
#: aleksis/apps/kort/models.py:258 aleksis/apps/kort/tables.py:31
#: aleksis/apps/kort/models.py:264 aleksis/apps/kort/tables.py:31
msgid "Deactivated"
msgstr ""
#: aleksis/apps/kort/models.py:264
#: aleksis/apps/kort/models.py:270
msgid "PDF file"
msgstr ""
#: aleksis/apps/kort/models.py:297
#: aleksis/apps/kort/models.py:303
msgid "There is no layout provided for the card."
msgstr ""
#: aleksis/apps/kort/models.py:316 aleksis/apps/kort/models.py:325
#: aleksis/apps/kort/models.py:322 aleksis/apps/kort/models.py:331
#: aleksis/apps/kort/templates/kort/card/detail.html:8
#: aleksis/apps/kort/templates/kort/printer/detail_content.html:84
msgid "Card"
msgstr ""
#: aleksis/apps/kort/models.py:317
#: aleksis/apps/kort/models.py:323
#: aleksis/apps/kort/templates/kort/card/list.html:8
#: aleksis/apps/kort/templates/kort/card/list.html:9
msgid "Cards"
msgstr ""
#: aleksis/apps/kort/models.py:322
#: aleksis/apps/kort/models.py:328
msgid "Printer"
msgstr ""
#: aleksis/apps/kort/models.py:337
#: aleksis/apps/kort/models.py:343
msgid "Card print job"
msgstr ""
#: aleksis/apps/kort/models.py:338
#: aleksis/apps/kort/models.py:344
msgid "Card print jobs"
msgstr ""
......