From 1373264d9d3b95969f75a90eb74e23ef100ab20e Mon Sep 17 00:00:00 2001
From: Tom Teichler <tom.teichler@teckids.org>
Date: Sat, 10 Aug 2024 16:53:20 +0200
Subject: [PATCH] Update messagtes

---
 .../apps/kort/locale/ar/LC_MESSAGES/django.po | 154 ++++++++-----
 .../kort/locale/de_DE/LC_MESSAGES/django.po   | 210 +++++++++++-------
 .../apps/kort/locale/fr/LC_MESSAGES/django.po | 151 ++++++++-----
 .../apps/kort/locale/la/LC_MESSAGES/django.po | 151 ++++++++-----
 .../kort/locale/nb_NO/LC_MESSAGES/django.po   | 151 ++++++++-----
 .../apps/kort/locale/ru/LC_MESSAGES/django.po | 174 ++++++++-------
 .../kort/locale/tr_TR/LC_MESSAGES/django.po   | 151 ++++++++-----
 .../apps/kort/locale/uk/LC_MESSAGES/django.po | 175 +++++++--------
 8 files changed, 759 insertions(+), 558 deletions(-)

diff --git a/aleksis/apps/kort/locale/ar/LC_MESSAGES/django.po b/aleksis/apps/kort/locale/ar/LC_MESSAGES/django.po
index bfb7b49..d1efc5d 100644
--- a/aleksis/apps/kort/locale/ar/LC_MESSAGES/django.po
+++ b/aleksis/apps/kort/locale/ar/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-09-16 17:04+0200\n"
+"POT-Creation-Date: 2024-08-10 14:53+0000\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,10 @@ 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"
+"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
+#: aleksis/apps/kort/apps.py:32
 msgid "Access and manage printer status and print jobs"
 msgstr ""
 
@@ -55,11 +56,11 @@ msgstr ""
 msgid "Groups"
 msgstr ""
 
-#: aleksis/apps/kort/forms.py:51 aleksis/apps/kort/models.py:209
+#: aleksis/apps/kort/forms.py:51 aleksis/apps/kort/models/cards.py:208
 msgid "Card layout"
 msgstr ""
 
-#: aleksis/apps/kort/forms.py:53 aleksis/apps/kort/models.py:281
+#: aleksis/apps/kort/forms.py:53 aleksis/apps/kort/models/cards.py:280
 #: aleksis/apps/kort/tables.py:23
 #: aleksis/apps/kort/templates/kort/card/detail_content.html:24
 #: aleksis/apps/kort/templates/kort/card/short.html:12
@@ -82,43 +83,43 @@ msgstr ""
 msgid "Printer settings"
 msgstr ""
 
-#: aleksis/apps/kort/forms.py:138 aleksis/apps/kort/models.py:246
+#: aleksis/apps/kort/forms.py:138 aleksis/apps/kort/models/cards.py:245
 msgid "Required data fields"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:25
+#: aleksis/apps/kort/models/cards.py:25
 msgid "Online"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:26
+#: aleksis/apps/kort/models/cards.py:26
 msgid "Offline"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:27
+#: aleksis/apps/kort/models/cards.py:27
 msgid "With errors"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:28
+#: aleksis/apps/kort/models/cards.py:28
 msgid "Not registered"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:57
+#: aleksis/apps/kort/models/cards.py:57
 msgid "Registered"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:58
+#: aleksis/apps/kort/models/cards.py:58
 msgid "In progress"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:59
+#: aleksis/apps/kort/models/cards.py:59
 msgid "Finished"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:60
+#: aleksis/apps/kort/models/cards.py:60
 msgid "Failed"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:65 aleksis/apps/kort/models.py:241
+#: aleksis/apps/kort/models/cards.py:65 aleksis/apps/kort/models/cards.py:240
 #: 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
@@ -126,18 +127,18 @@ msgstr ""
 msgid "Name"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:66
+#: aleksis/apps/kort/models/cards.py:66
 #: aleksis/apps/kort/templates/kort/printer/detail_content.html:24
 msgid "Description"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:67
+#: aleksis/apps/kort/models/cards.py:67
 #: 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:71 aleksis/apps/kort/models.py:354
+#: aleksis/apps/kort/models/cards.py:71 aleksis/apps/kort/models/cards.py:355
 #: aleksis/apps/kort/tables.py:94
 #: aleksis/apps/kort/templates/kort/card/detail_content.html:38
 #: aleksis/apps/kort/templates/kort/printer/detail_content.html:38
@@ -146,143 +147,159 @@ msgstr ""
 msgid "Status"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:75 aleksis/apps/kort/models.py:358
+#: aleksis/apps/kort/models/cards.py:75 aleksis/apps/kort/models/cards.py:359
 msgid "Status text"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:76 aleksis/apps/kort/tables.py:52
+#: aleksis/apps/kort/models/cards.py:76 aleksis/apps/kort/tables.py:52
 #: aleksis/apps/kort/templates/kort/printer/detail_content.html:31
 msgid "Last seen at"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:81
+#: aleksis/apps/kort/models/cards.py:81
 msgid "OAuth2 application"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:89
+#: aleksis/apps/kort/models/cards.py:89
 msgid "OAuth2 client secret"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:95
+#: aleksis/apps/kort/models/cards.py:95
 msgid "CUPS printer"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:97
+#: aleksis/apps/kort/models/cards.py:97
 msgid "Leave blank to deactivate CUPS printing"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:100
+#: aleksis/apps/kort/models/cards.py:100
 msgid "Generate card number on server"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:102
+#: aleksis/apps/kort/models/cards.py:102
 msgid "Card detector"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:199
+#: aleksis/apps/kort/models/cards.py:198
 msgid "Card printer"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:200
+#: aleksis/apps/kort/models/cards.py:199
 #: 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:204
+#: aleksis/apps/kort/models/cards.py:203
 msgid "Media file"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:216
+#: aleksis/apps/kort/models/cards.py:215
 msgid "Media file for a card layout"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:217
+#: aleksis/apps/kort/models/cards.py:216
 msgid "Media files for card layouts"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:242
+#: aleksis/apps/kort/models/cards.py:241
 #: aleksis/apps/kort/templates/kort/card_layout/detail_content.html:43
 msgid "Template"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:243
+#: aleksis/apps/kort/models/cards.py:242
 #: aleksis/apps/kort/templates/kort/card_layout/detail_content.html:49
 msgid "Custom CSS"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:244
+#: aleksis/apps/kort/models/cards.py:243
 msgid "Width"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:244 aleksis/apps/kort/models.py:245
+#: aleksis/apps/kort/models/cards.py:243 aleksis/apps/kort/models/cards.py:244
 msgid "in mm"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:245
+#: aleksis/apps/kort/models/cards.py:244
 msgid "Height"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:266
+#: aleksis/apps/kort/models/cards.py:265
 msgid "Template is invalid: {}"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:272 aleksis/apps/kort/models.py:285
+#: aleksis/apps/kort/models/cards.py:271 aleksis/apps/kort/models/cards.py:286
 #: 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:273
+#: aleksis/apps/kort/models/cards.py:272
 msgid "Card Layouts"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:278 aleksis/apps/kort/tables.py:20
+#: aleksis/apps/kort/models/cards.py:277 aleksis/apps/kort/tables.py:20
 #: 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:280
+#: aleksis/apps/kort/models/cards.py:279
 msgid "Chip Number"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:282 aleksis/apps/kort/tables.py:24
+#: aleksis/apps/kort/models/cards.py:281 aleksis/apps/kort/tables.py:24
 msgid "Deactivated"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:288
+#: aleksis/apps/kort/models/cards.py:283
+msgid "Last read counter"
+msgstr ""
+
+#: aleksis/apps/kort/models/cards.py:289
 msgid "PDF file"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:321
+#: aleksis/apps/kort/models/cards.py:322
 msgid "There is no layout provided for the card."
 msgstr ""
 
-#: aleksis/apps/kort/models.py:340 aleksis/apps/kort/models.py:349
+#: aleksis/apps/kort/models/cards.py:341 aleksis/apps/kort/models/cards.py:350
 #: aleksis/apps/kort/templates/kort/card/detail.html:8
 #: aleksis/apps/kort/templates/kort/printer/detail_content.html:85
 msgid "Card"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:341
+#: aleksis/apps/kort/models/cards.py:342
 #: 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:346
+#: aleksis/apps/kort/models/cards.py:347
 msgid "Printer"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:361
+#: aleksis/apps/kort/models/cards.py:362
 msgid "Card print job"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:362
+#: aleksis/apps/kort/models/cards.py:363
 msgid "Card print jobs"
 msgstr ""
 
+#: aleksis/apps/kort/preferences.py:10
+msgid "Student ID Cards"
+msgstr ""
+
+#: aleksis/apps/kort/preferences.py:20
+msgid "SDM file read key"
+msgstr ""
+
+#: aleksis/apps/kort/preferences.py:31
+msgid "SDM meta read key"
+msgstr ""
+
 #: aleksis/apps/kort/tables.py:21
 #: aleksis/apps/kort/templates/kort/card/detail_content.html:17
 #: aleksis/apps/kort/templates/kort/card/short.html:8
@@ -365,8 +382,10 @@ 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 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 ""
@@ -415,8 +434,10 @@ 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"
+"          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 ""
@@ -424,7 +445,8 @@ 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"
+"          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 ""
@@ -490,7 +512,8 @@ 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"
+"      Please pay attention that this also will prevent the successful "
+"finishing of all active print jobs\n"
 "      which use these template.\n"
 "    "
 msgstr ""
@@ -527,7 +550,8 @@ 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"
+"      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 ""
@@ -537,7 +561,9 @@ 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."
+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
@@ -545,7 +571,9 @@ 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)."
+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
@@ -586,7 +614,8 @@ 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"
+"      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 ""
@@ -610,7 +639,8 @@ 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"
+"              To enable printing, you have to register the print client on "
+"the device\n"
 "              which the printer is connected to.\n"
 "            "
 msgstr ""
@@ -661,7 +691,9 @@ 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."
+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
diff --git a/aleksis/apps/kort/locale/de_DE/LC_MESSAGES/django.po b/aleksis/apps/kort/locale/de_DE/LC_MESSAGES/django.po
index 803fe03..32c1401 100644
--- a/aleksis/apps/kort/locale/de_DE/LC_MESSAGES/django.po
+++ b/aleksis/apps/kort/locale/de_DE/LC_MESSAGES/django.po
@@ -7,10 +7,11 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-09-16 17:04+0200\n"
+"POT-Creation-Date: 2024-08-10 14:53+0000\n"
 "PO-Revision-Date: 2023-09-16 15:16+0000\n"
 "Last-Translator: Jonathan Weth <teckids@jonathanweth.de>\n"
-"Language-Team: German <https://translate.edugit.org/projects/aleksis/aleksis-app-kort/de/>\n"
+"Language-Team: German <https://translate.edugit.org/projects/aleksis/aleksis-"
+"app-kort/de/>\n"
 "Language: de_DE\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -18,7 +19,7 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
 "X-Generator: Weblate 4.12.1\n"
 
-#: aleksis/apps/kort/apps.py:31
+#: aleksis/apps/kort/apps.py:32
 msgid "Access and manage printer status and print jobs"
 msgstr "Druckerstatus und Druckaufträge anzeigen und verwalten"
 
@@ -45,7 +46,9 @@ msgstr "Kartendrucker"
 
 #: aleksis/apps/kort/forms.py:23
 msgid "Select a printer to directly print the newly issued card."
-msgstr "Wählen Sie einen Drucker aus, um die neu ausgestellte Karte direkt zu drucken."
+msgstr ""
+"Wählen Sie einen Drucker aus, um die neu ausgestellte Karte direkt zu "
+"drucken."
 
 #: aleksis/apps/kort/forms.py:28
 msgid "Persons"
@@ -55,11 +58,11 @@ msgstr "Personen"
 msgid "Groups"
 msgstr "Gruppen"
 
-#: aleksis/apps/kort/forms.py:51 aleksis/apps/kort/models.py:209
+#: aleksis/apps/kort/forms.py:51 aleksis/apps/kort/models/cards.py:208
 msgid "Card layout"
 msgstr "Kartenlayout"
 
-#: aleksis/apps/kort/forms.py:53 aleksis/apps/kort/models.py:281
+#: aleksis/apps/kort/forms.py:53 aleksis/apps/kort/models/cards.py:280
 #: aleksis/apps/kort/tables.py:23
 #: aleksis/apps/kort/templates/kort/card/detail_content.html:24
 #: aleksis/apps/kort/templates/kort/card/short.html:12
@@ -82,43 +85,43 @@ msgstr "Allgemeine Attribute"
 msgid "Printer settings"
 msgstr "Druckereinstellungen"
 
-#: aleksis/apps/kort/forms.py:138 aleksis/apps/kort/models.py:246
+#: aleksis/apps/kort/forms.py:138 aleksis/apps/kort/models/cards.py:245
 msgid "Required data fields"
 msgstr "Benötigte Datenfelder"
 
-#: aleksis/apps/kort/models.py:25
+#: aleksis/apps/kort/models/cards.py:25
 msgid "Online"
 msgstr "Online"
 
-#: aleksis/apps/kort/models.py:26
+#: aleksis/apps/kort/models/cards.py:26
 msgid "Offline"
 msgstr "Offline"
 
-#: aleksis/apps/kort/models.py:27
+#: aleksis/apps/kort/models/cards.py:27
 msgid "With errors"
 msgstr "Mit Fehlern"
 
-#: aleksis/apps/kort/models.py:28
+#: aleksis/apps/kort/models/cards.py:28
 msgid "Not registered"
 msgstr "Nicht registriert"
 
-#: aleksis/apps/kort/models.py:57
+#: aleksis/apps/kort/models/cards.py:57
 msgid "Registered"
 msgstr "Registriert"
 
-#: aleksis/apps/kort/models.py:58
+#: aleksis/apps/kort/models/cards.py:58
 msgid "In progress"
 msgstr "In Bearbeitung"
 
-#: aleksis/apps/kort/models.py:59
+#: aleksis/apps/kort/models/cards.py:59
 msgid "Finished"
 msgstr "Beendet"
 
-#: aleksis/apps/kort/models.py:60
+#: aleksis/apps/kort/models/cards.py:60
 msgid "Failed"
 msgstr "Fehlgeschlagen"
 
-#: aleksis/apps/kort/models.py:65 aleksis/apps/kort/models.py:241
+#: aleksis/apps/kort/models/cards.py:65 aleksis/apps/kort/models/cards.py:240
 #: 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
@@ -126,18 +129,18 @@ msgstr "Fehlgeschlagen"
 msgid "Name"
 msgstr "Name"
 
-#: aleksis/apps/kort/models.py:66
+#: aleksis/apps/kort/models/cards.py:66
 #: aleksis/apps/kort/templates/kort/printer/detail_content.html:24
 msgid "Description"
 msgstr "Beschreibung"
 
-#: aleksis/apps/kort/models.py:67
+#: aleksis/apps/kort/models/cards.py:67
 #: aleksis/apps/kort/templates/kort/printer/detail_content.html:17
 #: aleksis/apps/kort/templates/kort/printer/short.html:8
 msgid "Location"
 msgstr "Ort"
 
-#: aleksis/apps/kort/models.py:71 aleksis/apps/kort/models.py:354
+#: aleksis/apps/kort/models/cards.py:71 aleksis/apps/kort/models/cards.py:355
 #: aleksis/apps/kort/tables.py:94
 #: aleksis/apps/kort/templates/kort/card/detail_content.html:38
 #: aleksis/apps/kort/templates/kort/printer/detail_content.html:38
@@ -146,143 +149,159 @@ msgstr "Ort"
 msgid "Status"
 msgstr "Status"
 
-#: aleksis/apps/kort/models.py:75 aleksis/apps/kort/models.py:358
+#: aleksis/apps/kort/models/cards.py:75 aleksis/apps/kort/models/cards.py:359
 msgid "Status text"
 msgstr "Statustext"
 
-#: aleksis/apps/kort/models.py:76 aleksis/apps/kort/tables.py:52
+#: aleksis/apps/kort/models/cards.py:76 aleksis/apps/kort/tables.py:52
 #: aleksis/apps/kort/templates/kort/printer/detail_content.html:31
 msgid "Last seen at"
 msgstr "Zuletzt gesehen am"
 
-#: aleksis/apps/kort/models.py:81
+#: aleksis/apps/kort/models/cards.py:81
 msgid "OAuth2 application"
 msgstr "OAuth2-Anwendung"
 
-#: aleksis/apps/kort/models.py:89
+#: aleksis/apps/kort/models/cards.py:89
 msgid "OAuth2 client secret"
 msgstr "OAuth2-Client-Secret"
 
-#: aleksis/apps/kort/models.py:95
+#: aleksis/apps/kort/models/cards.py:95
 msgid "CUPS printer"
 msgstr "CUPS-Drucker"
 
-#: aleksis/apps/kort/models.py:97
+#: aleksis/apps/kort/models/cards.py:97
 msgid "Leave blank to deactivate CUPS printing"
 msgstr "Leer lassen, um CUPS-Drucken zu deaktivieren"
 
-#: aleksis/apps/kort/models.py:100
+#: aleksis/apps/kort/models/cards.py:100
 msgid "Generate card number on server"
 msgstr "Kartennummer auf dem Server generieren"
 
-#: aleksis/apps/kort/models.py:102
+#: aleksis/apps/kort/models/cards.py:102
 msgid "Card detector"
 msgstr "Karten-Detektor"
 
-#: aleksis/apps/kort/models.py:199
+#: aleksis/apps/kort/models/cards.py:198
 msgid "Card printer"
 msgstr "Kartendrucker"
 
-#: aleksis/apps/kort/models.py:200
+#: aleksis/apps/kort/models/cards.py:199
 #: 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:204
+#: aleksis/apps/kort/models/cards.py:203
 msgid "Media file"
 msgstr "Mediendatei"
 
-#: aleksis/apps/kort/models.py:216
+#: aleksis/apps/kort/models/cards.py:215
 msgid "Media file for a card layout"
 msgstr "Mediendatei für ein Kartenlayout"
 
-#: aleksis/apps/kort/models.py:217
+#: aleksis/apps/kort/models/cards.py:216
 msgid "Media files for card layouts"
 msgstr "Mediendateien für Kartenlayouts"
 
-#: aleksis/apps/kort/models.py:242
+#: aleksis/apps/kort/models/cards.py:241
 #: aleksis/apps/kort/templates/kort/card_layout/detail_content.html:43
 msgid "Template"
 msgstr "Template"
 
-#: aleksis/apps/kort/models.py:243
+#: aleksis/apps/kort/models/cards.py:242
 #: aleksis/apps/kort/templates/kort/card_layout/detail_content.html:49
 msgid "Custom CSS"
 msgstr "Benutzerdefiniertes CSS"
 
-#: aleksis/apps/kort/models.py:244
+#: aleksis/apps/kort/models/cards.py:243
 msgid "Width"
 msgstr "Breite"
 
-#: aleksis/apps/kort/models.py:244 aleksis/apps/kort/models.py:245
+#: aleksis/apps/kort/models/cards.py:243 aleksis/apps/kort/models/cards.py:244
 msgid "in mm"
 msgstr "in mm"
 
-#: aleksis/apps/kort/models.py:245
+#: aleksis/apps/kort/models/cards.py:244
 msgid "Height"
 msgstr "Höhe"
 
-#: aleksis/apps/kort/models.py:266
+#: aleksis/apps/kort/models/cards.py:265
 msgid "Template is invalid: {}"
 msgstr "Template ist ungültig: {}"
 
-#: aleksis/apps/kort/models.py:272 aleksis/apps/kort/models.py:285
+#: aleksis/apps/kort/models/cards.py:271 aleksis/apps/kort/models/cards.py:286
 #: 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:273
+#: aleksis/apps/kort/models/cards.py:272
 msgid "Card Layouts"
 msgstr "Kartenlayouts"
 
-#: aleksis/apps/kort/models.py:278 aleksis/apps/kort/tables.py:20
+#: aleksis/apps/kort/models/cards.py:277 aleksis/apps/kort/tables.py:20
 #: 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:280
+#: aleksis/apps/kort/models/cards.py:279
 msgid "Chip Number"
 msgstr "Chip-Nummer"
 
-#: aleksis/apps/kort/models.py:282 aleksis/apps/kort/tables.py:24
+#: aleksis/apps/kort/models/cards.py:281 aleksis/apps/kort/tables.py:24
 msgid "Deactivated"
 msgstr "Deaktiviert"
 
-#: aleksis/apps/kort/models.py:288
+#: aleksis/apps/kort/models/cards.py:283
+msgid "Last read counter"
+msgstr ""
+
+#: aleksis/apps/kort/models/cards.py:289
 msgid "PDF file"
 msgstr "PDF-Datei"
 
-#: aleksis/apps/kort/models.py:321
+#: aleksis/apps/kort/models/cards.py:322
 msgid "There is no layout provided for the card."
 msgstr "Es wurde kein Layout für die Karte bereitgestellt."
 
-#: aleksis/apps/kort/models.py:340 aleksis/apps/kort/models.py:349
+#: aleksis/apps/kort/models/cards.py:341 aleksis/apps/kort/models/cards.py:350
 #: aleksis/apps/kort/templates/kort/card/detail.html:8
 #: aleksis/apps/kort/templates/kort/printer/detail_content.html:85
 msgid "Card"
 msgstr "Karte"
 
-#: aleksis/apps/kort/models.py:341
+#: aleksis/apps/kort/models/cards.py:342
 #: 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:346
+#: aleksis/apps/kort/models/cards.py:347
 msgid "Printer"
 msgstr "Drucker"
 
-#: aleksis/apps/kort/models.py:361
+#: aleksis/apps/kort/models/cards.py:362
 msgid "Card print job"
 msgstr "Karten-Druckauftrag"
 
-#: aleksis/apps/kort/models.py:362
+#: aleksis/apps/kort/models/cards.py:363
 msgid "Card print jobs"
 msgstr "Karten-Druckaufträge"
 
+#: aleksis/apps/kort/preferences.py:10
+msgid "Student ID Cards"
+msgstr "Schülerausweise"
+
+#: aleksis/apps/kort/preferences.py:20
+msgid "SDM file read key"
+msgstr ""
+
+#: aleksis/apps/kort/preferences.py:31
+msgid "SDM meta read key"
+msgstr ""
+
 #: aleksis/apps/kort/tables.py:21
 #: aleksis/apps/kort/templates/kort/card/detail_content.html:17
 #: aleksis/apps/kort/templates/kort/card/short.html:8
@@ -365,14 +384,19 @@ msgstr "Möchten Sie wirklich die folgende Karte löschen?"
 #: 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 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 ""
 "\n"
-"      Bitte beachten Sie, dass das Löschen einer Karte nicht rückgängig gemacht werden kann und nur zum Aufräumen von Fehldrucken benutzt werden sollte.\n"
-"Wenn Sie lediglich eine Karte unbenutzbar machen wollen, weil ein Schüler seine Karte verloren hat oder die Schule verlässt,\n"
+"      Bitte beachten Sie, dass das Löschen einer Karte nicht rückgängig "
+"gemacht werden kann und nur zum Aufräumen von Fehldrucken benutzt werden "
+"sollte.\n"
+"Wenn Sie lediglich eine Karte unbenutzbar machen wollen, weil ein Schüler "
+"seine Karte verloren hat oder die Schule verlässt,\n"
 "deaktivieren Sie die Karte bitte stattdessen.\n"
 "    "
 
@@ -420,27 +444,34 @@ msgstr "Karte(n) ausstellen"
 #: 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"
+"          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 ""
 "\n"
-"          Bitte wählen Sie die Personen und/oder die Gruppen aus, für die Sie neue Karten ausstellen wollen.\n"
-"Nachdem Sie auf 'Weiter' geklickt haben, können Sie prüfen, ob die Daten der Personen vollständig sind\n"
+"          Bitte wählen Sie die Personen und/oder die Gruppen aus, für die "
+"Sie neue Karten ausstellen wollen.\n"
+"Nachdem Sie auf 'Weiter' geklickt haben, können Sie prüfen, ob die Daten der "
+"Personen vollständig sind\n"
 "und alles Notwendige für die Karten enthalten.\n"
 "        "
 
 #: 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"
+"          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 ""
 "\n"
-"          In der folgenden Tabelle können Sie alle ausgewählten Personen und die zugehörigen Daten, die für die Karten benötigt werden, sehen.\n"
-"Bitte wählen Sie die Personen aus, für die Sie neue Karten ausstellen wollen.\n"
+"          In der folgenden Tabelle können Sie alle ausgewählten Personen und "
+"die zugehörigen Daten, die für die Karten benötigt werden, sehen.\n"
+"Bitte wählen Sie die Personen aus, für die Sie neue Karten ausstellen "
+"wollen.\n"
 "        "
 
 #: aleksis/apps/kort/templates/kort/card/issue.html:65
@@ -504,12 +535,14 @@ msgstr "Möchten Sie wirklich das folgende Kartenlayout löschen?"
 #: 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"
+"      Please pay attention that this also will prevent the successful "
+"finishing of all active print jobs\n"
 "      which use these template.\n"
 "    "
 msgstr ""
 "\n"
-"      Bitte beachten Sie, dass dies auch die erfolgreiche Fertigstellung aller aktiven Druckaufträge verhindern wird,\n"
+"      Bitte beachten Sie, dass dies auch die erfolgreiche Fertigstellung "
+"aller aktiven Druckaufträge verhindern wird,\n"
 " die dieses Template nutzen.\n"
 "    "
 
@@ -545,12 +578,14 @@ msgstr "Anweisungen zum Gestalten der Karte"
 #: 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"
+"      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 ""
 "\n"
-"      Sie können die folgenden Daten in Ihrem individuellen Template nutzen. Das Template muss in der\n"
+"      Sie können die folgenden Daten in Ihrem individuellen Template nutzen. "
+"Das Template muss in der\n"
 "Django-Template-Sprache geschrieben werden.\n"
 "    "
 
@@ -559,16 +594,24 @@ msgid "The chip number as string"
 msgstr "Die Chip-Nummer als Zeichenkette"
 
 #: 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 "Dies gibt Ihnen Zugriff zu allen Attributen des Personen-Objekts wie z. B. Name, persönliche Daten oder Kontaktdaten."
+msgid ""
+"This will give you access to any attributes of the person object like name, "
+"personal data or contact data."
+msgstr ""
+"Dies gibt Ihnen Zugriff zu allen Attributen des Personen-Objekts wie z. B. "
+"Name, persönliche Daten oder Kontaktdaten."
 
 #: aleksis/apps/kort/templates/kort/card_layout/instructions.html:19
 msgid "The date until when the card is valid"
 msgstr "Das Datum, bis wann die Karte gültig ist"
 
 #: 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 "Dies gibt Ihnen Zugriff auf die hochgeladenen Mediendateien. Ersetzen Sie 0 durch die Nummer Ihrer Mediendatei (startend mit 0)."
+msgid ""
+"This will give you access to the uploaded media files. Replace 0 by the "
+"number of your media file (starting with 0)."
+msgstr ""
+"Dies gibt Ihnen Zugriff auf die hochgeladenen Mediendateien. Ersetzen Sie 0 "
+"durch die Nummer Ihrer Mediendatei (startend mit 0)."
 
 #: aleksis/apps/kort/templates/kort/card_layout/list.html:8
 #: aleksis/apps/kort/templates/kort/card_layout/list.html:9
@@ -608,13 +651,16 @@ msgstr "Möchten Sie wirklich den folgenden Kartendrucker löschen?"
 #: 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"
+"      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 ""
 "\n"
-"      Bitte beachten Sie, dass dies auch den Zugriff für den Druckclient deaktivieren wird und Sie außerdem \n"
-"den Druckklient neu konfigurieren müssen, wenn Sie ihn weiter benutzen wollen.\n"
+"      Bitte beachten Sie, dass dies auch den Zugriff für den Druckclient "
+"deaktivieren wird und Sie außerdem \n"
+"den Druckklient neu konfigurieren müssen, wenn Sie ihn weiter benutzen "
+"wollen.\n"
 "    "
 
 #: aleksis/apps/kort/templates/kort/printer/detail.html:15
@@ -636,12 +682,14 @@ msgstr "Druckclient einrichten"
 #: 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"
+"              To enable printing, you have to register the print client on "
+"the device\n"
 "              which the printer is connected to.\n"
 "            "
 msgstr ""
 "\n"
-"              Um das Drucken zu aktivieren, müssen Sie den Druckklient auf dem Gerät\n"
+"              Um das Drucken zu aktivieren, müssen Sie den Druckklient auf "
+"dem Gerät\n"
 "registrieren, an das der Drucker angeschlossen ist.\n"
 "            "
 
@@ -691,12 +739,17 @@ msgid "The cards have been created successfully."
 msgstr "Die Karten wurden erfolgreich erstellt."
 
 #: 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 "Der Druckauftrag #{} für die Karte {} auf dem Drucker {} wurde erfolgreich erstellt."
+msgid ""
+"The print job #{} for the card {} on the printer {} has been created "
+"successfully."
+msgstr ""
+"Der Druckauftrag #{} für die Karte {} auf dem Drucker {} wurde erfolgreich "
+"erstellt."
 
 #: 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 "Der Druckauftrag konnte wegen folgendem Fehler nicht gestartet werden: {}"
+msgstr ""
+"Der Druckauftrag konnte wegen folgendem Fehler nicht gestartet werden: {}"
 
 #: aleksis/apps/kort/views.py:158
 msgid "The card has been deleted successfully."
@@ -757,9 +810,6 @@ msgstr "Das Kartenlayout wurde erfolgreich gelöscht."
 #~ msgid "The chip number is missing."
 #~ msgstr "Die Chip-Nummer fehlt."
 
-#~ msgid "Student ID Cards"
-#~ msgstr "Schülerausweise"
-
 #~ msgid "All Cards"
 #~ msgstr "Alle Karten"
 
diff --git a/aleksis/apps/kort/locale/fr/LC_MESSAGES/django.po b/aleksis/apps/kort/locale/fr/LC_MESSAGES/django.po
index 8caf4f6..19d6cab 100644
--- a/aleksis/apps/kort/locale/fr/LC_MESSAGES/django.po
+++ b/aleksis/apps/kort/locale/fr/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-09-16 17:04+0200\n"
+"POT-Creation-Date: 2024-08-10 14:53+0000\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"
@@ -18,7 +18,7 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n > 1);\n"
 
-#: aleksis/apps/kort/apps.py:31
+#: aleksis/apps/kort/apps.py:32
 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:209
+#: aleksis/apps/kort/forms.py:51 aleksis/apps/kort/models/cards.py:208
 msgid "Card layout"
 msgstr ""
 
-#: aleksis/apps/kort/forms.py:53 aleksis/apps/kort/models.py:281
+#: aleksis/apps/kort/forms.py:53 aleksis/apps/kort/models/cards.py:280
 #: aleksis/apps/kort/tables.py:23
 #: aleksis/apps/kort/templates/kort/card/detail_content.html:24
 #: aleksis/apps/kort/templates/kort/card/short.html:12
@@ -82,43 +82,43 @@ msgstr ""
 msgid "Printer settings"
 msgstr ""
 
-#: aleksis/apps/kort/forms.py:138 aleksis/apps/kort/models.py:246
+#: aleksis/apps/kort/forms.py:138 aleksis/apps/kort/models/cards.py:245
 msgid "Required data fields"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:25
+#: aleksis/apps/kort/models/cards.py:25
 msgid "Online"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:26
+#: aleksis/apps/kort/models/cards.py:26
 msgid "Offline"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:27
+#: aleksis/apps/kort/models/cards.py:27
 msgid "With errors"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:28
+#: aleksis/apps/kort/models/cards.py:28
 msgid "Not registered"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:57
+#: aleksis/apps/kort/models/cards.py:57
 msgid "Registered"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:58
+#: aleksis/apps/kort/models/cards.py:58
 msgid "In progress"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:59
+#: aleksis/apps/kort/models/cards.py:59
 msgid "Finished"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:60
+#: aleksis/apps/kort/models/cards.py:60
 msgid "Failed"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:65 aleksis/apps/kort/models.py:241
+#: aleksis/apps/kort/models/cards.py:65 aleksis/apps/kort/models/cards.py:240
 #: 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
@@ -126,18 +126,18 @@ msgstr ""
 msgid "Name"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:66
+#: aleksis/apps/kort/models/cards.py:66
 #: aleksis/apps/kort/templates/kort/printer/detail_content.html:24
 msgid "Description"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:67
+#: aleksis/apps/kort/models/cards.py:67
 #: 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:71 aleksis/apps/kort/models.py:354
+#: aleksis/apps/kort/models/cards.py:71 aleksis/apps/kort/models/cards.py:355
 #: aleksis/apps/kort/tables.py:94
 #: aleksis/apps/kort/templates/kort/card/detail_content.html:38
 #: aleksis/apps/kort/templates/kort/printer/detail_content.html:38
@@ -146,143 +146,159 @@ msgstr ""
 msgid "Status"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:75 aleksis/apps/kort/models.py:358
+#: aleksis/apps/kort/models/cards.py:75 aleksis/apps/kort/models/cards.py:359
 msgid "Status text"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:76 aleksis/apps/kort/tables.py:52
+#: aleksis/apps/kort/models/cards.py:76 aleksis/apps/kort/tables.py:52
 #: aleksis/apps/kort/templates/kort/printer/detail_content.html:31
 msgid "Last seen at"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:81
+#: aleksis/apps/kort/models/cards.py:81
 msgid "OAuth2 application"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:89
+#: aleksis/apps/kort/models/cards.py:89
 msgid "OAuth2 client secret"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:95
+#: aleksis/apps/kort/models/cards.py:95
 msgid "CUPS printer"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:97
+#: aleksis/apps/kort/models/cards.py:97
 msgid "Leave blank to deactivate CUPS printing"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:100
+#: aleksis/apps/kort/models/cards.py:100
 msgid "Generate card number on server"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:102
+#: aleksis/apps/kort/models/cards.py:102
 msgid "Card detector"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:199
+#: aleksis/apps/kort/models/cards.py:198
 msgid "Card printer"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:200
+#: aleksis/apps/kort/models/cards.py:199
 #: 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:204
+#: aleksis/apps/kort/models/cards.py:203
 msgid "Media file"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:216
+#: aleksis/apps/kort/models/cards.py:215
 msgid "Media file for a card layout"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:217
+#: aleksis/apps/kort/models/cards.py:216
 msgid "Media files for card layouts"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:242
+#: aleksis/apps/kort/models/cards.py:241
 #: aleksis/apps/kort/templates/kort/card_layout/detail_content.html:43
 msgid "Template"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:243
+#: aleksis/apps/kort/models/cards.py:242
 #: aleksis/apps/kort/templates/kort/card_layout/detail_content.html:49
 msgid "Custom CSS"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:244
+#: aleksis/apps/kort/models/cards.py:243
 msgid "Width"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:244 aleksis/apps/kort/models.py:245
+#: aleksis/apps/kort/models/cards.py:243 aleksis/apps/kort/models/cards.py:244
 msgid "in mm"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:245
+#: aleksis/apps/kort/models/cards.py:244
 msgid "Height"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:266
+#: aleksis/apps/kort/models/cards.py:265
 msgid "Template is invalid: {}"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:272 aleksis/apps/kort/models.py:285
+#: aleksis/apps/kort/models/cards.py:271 aleksis/apps/kort/models/cards.py:286
 #: 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:273
+#: aleksis/apps/kort/models/cards.py:272
 msgid "Card Layouts"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:278 aleksis/apps/kort/tables.py:20
+#: aleksis/apps/kort/models/cards.py:277 aleksis/apps/kort/tables.py:20
 #: 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:280
+#: aleksis/apps/kort/models/cards.py:279
 msgid "Chip Number"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:282 aleksis/apps/kort/tables.py:24
+#: aleksis/apps/kort/models/cards.py:281 aleksis/apps/kort/tables.py:24
 msgid "Deactivated"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:288
+#: aleksis/apps/kort/models/cards.py:283
+msgid "Last read counter"
+msgstr ""
+
+#: aleksis/apps/kort/models/cards.py:289
 msgid "PDF file"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:321
+#: aleksis/apps/kort/models/cards.py:322
 msgid "There is no layout provided for the card."
 msgstr ""
 
-#: aleksis/apps/kort/models.py:340 aleksis/apps/kort/models.py:349
+#: aleksis/apps/kort/models/cards.py:341 aleksis/apps/kort/models/cards.py:350
 #: aleksis/apps/kort/templates/kort/card/detail.html:8
 #: aleksis/apps/kort/templates/kort/printer/detail_content.html:85
 msgid "Card"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:341
+#: aleksis/apps/kort/models/cards.py:342
 #: 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:346
+#: aleksis/apps/kort/models/cards.py:347
 msgid "Printer"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:361
+#: aleksis/apps/kort/models/cards.py:362
 msgid "Card print job"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:362
+#: aleksis/apps/kort/models/cards.py:363
 msgid "Card print jobs"
 msgstr ""
 
+#: aleksis/apps/kort/preferences.py:10
+msgid "Student ID Cards"
+msgstr ""
+
+#: aleksis/apps/kort/preferences.py:20
+msgid "SDM file read key"
+msgstr ""
+
+#: aleksis/apps/kort/preferences.py:31
+msgid "SDM meta read key"
+msgstr ""
+
 #: aleksis/apps/kort/tables.py:21
 #: aleksis/apps/kort/templates/kort/card/detail_content.html:17
 #: aleksis/apps/kort/templates/kort/card/short.html:8
@@ -365,8 +381,10 @@ 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 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 ""
@@ -415,8 +433,10 @@ 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"
+"          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 ""
@@ -424,7 +444,8 @@ 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"
+"          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 ""
@@ -490,7 +511,8 @@ 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"
+"      Please pay attention that this also will prevent the successful "
+"finishing of all active print jobs\n"
 "      which use these template.\n"
 "    "
 msgstr ""
@@ -527,7 +549,8 @@ 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"
+"      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 ""
@@ -537,7 +560,9 @@ 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."
+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
@@ -545,7 +570,9 @@ 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)."
+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
@@ -586,7 +613,8 @@ 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"
+"      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 ""
@@ -610,7 +638,8 @@ 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"
+"              To enable printing, you have to register the print client on "
+"the device\n"
 "              which the printer is connected to.\n"
 "            "
 msgstr ""
@@ -661,7 +690,9 @@ 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."
+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
diff --git a/aleksis/apps/kort/locale/la/LC_MESSAGES/django.po b/aleksis/apps/kort/locale/la/LC_MESSAGES/django.po
index 0b716c8..029e152 100644
--- a/aleksis/apps/kort/locale/la/LC_MESSAGES/django.po
+++ b/aleksis/apps/kort/locale/la/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-09-16 17:04+0200\n"
+"POT-Creation-Date: 2024-08-10 14:53+0000\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:31
+#: aleksis/apps/kort/apps.py:32
 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:209
+#: aleksis/apps/kort/forms.py:51 aleksis/apps/kort/models/cards.py:208
 msgid "Card layout"
 msgstr ""
 
-#: aleksis/apps/kort/forms.py:53 aleksis/apps/kort/models.py:281
+#: aleksis/apps/kort/forms.py:53 aleksis/apps/kort/models/cards.py:280
 #: aleksis/apps/kort/tables.py:23
 #: aleksis/apps/kort/templates/kort/card/detail_content.html:24
 #: aleksis/apps/kort/templates/kort/card/short.html:12
@@ -81,43 +81,43 @@ msgstr ""
 msgid "Printer settings"
 msgstr ""
 
-#: aleksis/apps/kort/forms.py:138 aleksis/apps/kort/models.py:246
+#: aleksis/apps/kort/forms.py:138 aleksis/apps/kort/models/cards.py:245
 msgid "Required data fields"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:25
+#: aleksis/apps/kort/models/cards.py:25
 msgid "Online"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:26
+#: aleksis/apps/kort/models/cards.py:26
 msgid "Offline"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:27
+#: aleksis/apps/kort/models/cards.py:27
 msgid "With errors"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:28
+#: aleksis/apps/kort/models/cards.py:28
 msgid "Not registered"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:57
+#: aleksis/apps/kort/models/cards.py:57
 msgid "Registered"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:58
+#: aleksis/apps/kort/models/cards.py:58
 msgid "In progress"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:59
+#: aleksis/apps/kort/models/cards.py:59
 msgid "Finished"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:60
+#: aleksis/apps/kort/models/cards.py:60
 msgid "Failed"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:65 aleksis/apps/kort/models.py:241
+#: aleksis/apps/kort/models/cards.py:65 aleksis/apps/kort/models/cards.py:240
 #: 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
@@ -125,18 +125,18 @@ msgstr ""
 msgid "Name"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:66
+#: aleksis/apps/kort/models/cards.py:66
 #: aleksis/apps/kort/templates/kort/printer/detail_content.html:24
 msgid "Description"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:67
+#: aleksis/apps/kort/models/cards.py:67
 #: 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:71 aleksis/apps/kort/models.py:354
+#: aleksis/apps/kort/models/cards.py:71 aleksis/apps/kort/models/cards.py:355
 #: aleksis/apps/kort/tables.py:94
 #: aleksis/apps/kort/templates/kort/card/detail_content.html:38
 #: aleksis/apps/kort/templates/kort/printer/detail_content.html:38
@@ -145,143 +145,159 @@ msgstr ""
 msgid "Status"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:75 aleksis/apps/kort/models.py:358
+#: aleksis/apps/kort/models/cards.py:75 aleksis/apps/kort/models/cards.py:359
 msgid "Status text"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:76 aleksis/apps/kort/tables.py:52
+#: aleksis/apps/kort/models/cards.py:76 aleksis/apps/kort/tables.py:52
 #: aleksis/apps/kort/templates/kort/printer/detail_content.html:31
 msgid "Last seen at"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:81
+#: aleksis/apps/kort/models/cards.py:81
 msgid "OAuth2 application"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:89
+#: aleksis/apps/kort/models/cards.py:89
 msgid "OAuth2 client secret"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:95
+#: aleksis/apps/kort/models/cards.py:95
 msgid "CUPS printer"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:97
+#: aleksis/apps/kort/models/cards.py:97
 msgid "Leave blank to deactivate CUPS printing"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:100
+#: aleksis/apps/kort/models/cards.py:100
 msgid "Generate card number on server"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:102
+#: aleksis/apps/kort/models/cards.py:102
 msgid "Card detector"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:199
+#: aleksis/apps/kort/models/cards.py:198
 msgid "Card printer"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:200
+#: aleksis/apps/kort/models/cards.py:199
 #: 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:204
+#: aleksis/apps/kort/models/cards.py:203
 msgid "Media file"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:216
+#: aleksis/apps/kort/models/cards.py:215
 msgid "Media file for a card layout"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:217
+#: aleksis/apps/kort/models/cards.py:216
 msgid "Media files for card layouts"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:242
+#: aleksis/apps/kort/models/cards.py:241
 #: aleksis/apps/kort/templates/kort/card_layout/detail_content.html:43
 msgid "Template"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:243
+#: aleksis/apps/kort/models/cards.py:242
 #: aleksis/apps/kort/templates/kort/card_layout/detail_content.html:49
 msgid "Custom CSS"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:244
+#: aleksis/apps/kort/models/cards.py:243
 msgid "Width"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:244 aleksis/apps/kort/models.py:245
+#: aleksis/apps/kort/models/cards.py:243 aleksis/apps/kort/models/cards.py:244
 msgid "in mm"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:245
+#: aleksis/apps/kort/models/cards.py:244
 msgid "Height"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:266
+#: aleksis/apps/kort/models/cards.py:265
 msgid "Template is invalid: {}"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:272 aleksis/apps/kort/models.py:285
+#: aleksis/apps/kort/models/cards.py:271 aleksis/apps/kort/models/cards.py:286
 #: 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:273
+#: aleksis/apps/kort/models/cards.py:272
 msgid "Card Layouts"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:278 aleksis/apps/kort/tables.py:20
+#: aleksis/apps/kort/models/cards.py:277 aleksis/apps/kort/tables.py:20
 #: 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:280
+#: aleksis/apps/kort/models/cards.py:279
 msgid "Chip Number"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:282 aleksis/apps/kort/tables.py:24
+#: aleksis/apps/kort/models/cards.py:281 aleksis/apps/kort/tables.py:24
 msgid "Deactivated"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:288
+#: aleksis/apps/kort/models/cards.py:283
+msgid "Last read counter"
+msgstr ""
+
+#: aleksis/apps/kort/models/cards.py:289
 msgid "PDF file"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:321
+#: aleksis/apps/kort/models/cards.py:322
 msgid "There is no layout provided for the card."
 msgstr ""
 
-#: aleksis/apps/kort/models.py:340 aleksis/apps/kort/models.py:349
+#: aleksis/apps/kort/models/cards.py:341 aleksis/apps/kort/models/cards.py:350
 #: aleksis/apps/kort/templates/kort/card/detail.html:8
 #: aleksis/apps/kort/templates/kort/printer/detail_content.html:85
 msgid "Card"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:341
+#: aleksis/apps/kort/models/cards.py:342
 #: 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:346
+#: aleksis/apps/kort/models/cards.py:347
 msgid "Printer"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:361
+#: aleksis/apps/kort/models/cards.py:362
 msgid "Card print job"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:362
+#: aleksis/apps/kort/models/cards.py:363
 msgid "Card print jobs"
 msgstr ""
 
+#: aleksis/apps/kort/preferences.py:10
+msgid "Student ID Cards"
+msgstr ""
+
+#: aleksis/apps/kort/preferences.py:20
+msgid "SDM file read key"
+msgstr ""
+
+#: aleksis/apps/kort/preferences.py:31
+msgid "SDM meta read key"
+msgstr ""
+
 #: aleksis/apps/kort/tables.py:21
 #: aleksis/apps/kort/templates/kort/card/detail_content.html:17
 #: aleksis/apps/kort/templates/kort/card/short.html:8
@@ -364,8 +380,10 @@ 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 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 ""
@@ -414,8 +432,10 @@ 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"
+"          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 ""
@@ -423,7 +443,8 @@ 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"
+"          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 ""
@@ -489,7 +510,8 @@ 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"
+"      Please pay attention that this also will prevent the successful "
+"finishing of all active print jobs\n"
 "      which use these template.\n"
 "    "
 msgstr ""
@@ -526,7 +548,8 @@ 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"
+"      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 ""
@@ -536,7 +559,9 @@ 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."
+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
@@ -544,7 +569,9 @@ 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)."
+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
@@ -585,7 +612,8 @@ 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"
+"      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 ""
@@ -609,7 +637,8 @@ 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"
+"              To enable printing, you have to register the print client on "
+"the device\n"
 "              which the printer is connected to.\n"
 "            "
 msgstr ""
@@ -660,7 +689,9 @@ 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."
+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
diff --git a/aleksis/apps/kort/locale/nb_NO/LC_MESSAGES/django.po b/aleksis/apps/kort/locale/nb_NO/LC_MESSAGES/django.po
index 0b716c8..029e152 100644
--- a/aleksis/apps/kort/locale/nb_NO/LC_MESSAGES/django.po
+++ b/aleksis/apps/kort/locale/nb_NO/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-09-16 17:04+0200\n"
+"POT-Creation-Date: 2024-08-10 14:53+0000\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:31
+#: aleksis/apps/kort/apps.py:32
 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:209
+#: aleksis/apps/kort/forms.py:51 aleksis/apps/kort/models/cards.py:208
 msgid "Card layout"
 msgstr ""
 
-#: aleksis/apps/kort/forms.py:53 aleksis/apps/kort/models.py:281
+#: aleksis/apps/kort/forms.py:53 aleksis/apps/kort/models/cards.py:280
 #: aleksis/apps/kort/tables.py:23
 #: aleksis/apps/kort/templates/kort/card/detail_content.html:24
 #: aleksis/apps/kort/templates/kort/card/short.html:12
@@ -81,43 +81,43 @@ msgstr ""
 msgid "Printer settings"
 msgstr ""
 
-#: aleksis/apps/kort/forms.py:138 aleksis/apps/kort/models.py:246
+#: aleksis/apps/kort/forms.py:138 aleksis/apps/kort/models/cards.py:245
 msgid "Required data fields"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:25
+#: aleksis/apps/kort/models/cards.py:25
 msgid "Online"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:26
+#: aleksis/apps/kort/models/cards.py:26
 msgid "Offline"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:27
+#: aleksis/apps/kort/models/cards.py:27
 msgid "With errors"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:28
+#: aleksis/apps/kort/models/cards.py:28
 msgid "Not registered"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:57
+#: aleksis/apps/kort/models/cards.py:57
 msgid "Registered"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:58
+#: aleksis/apps/kort/models/cards.py:58
 msgid "In progress"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:59
+#: aleksis/apps/kort/models/cards.py:59
 msgid "Finished"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:60
+#: aleksis/apps/kort/models/cards.py:60
 msgid "Failed"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:65 aleksis/apps/kort/models.py:241
+#: aleksis/apps/kort/models/cards.py:65 aleksis/apps/kort/models/cards.py:240
 #: 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
@@ -125,18 +125,18 @@ msgstr ""
 msgid "Name"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:66
+#: aleksis/apps/kort/models/cards.py:66
 #: aleksis/apps/kort/templates/kort/printer/detail_content.html:24
 msgid "Description"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:67
+#: aleksis/apps/kort/models/cards.py:67
 #: 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:71 aleksis/apps/kort/models.py:354
+#: aleksis/apps/kort/models/cards.py:71 aleksis/apps/kort/models/cards.py:355
 #: aleksis/apps/kort/tables.py:94
 #: aleksis/apps/kort/templates/kort/card/detail_content.html:38
 #: aleksis/apps/kort/templates/kort/printer/detail_content.html:38
@@ -145,143 +145,159 @@ msgstr ""
 msgid "Status"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:75 aleksis/apps/kort/models.py:358
+#: aleksis/apps/kort/models/cards.py:75 aleksis/apps/kort/models/cards.py:359
 msgid "Status text"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:76 aleksis/apps/kort/tables.py:52
+#: aleksis/apps/kort/models/cards.py:76 aleksis/apps/kort/tables.py:52
 #: aleksis/apps/kort/templates/kort/printer/detail_content.html:31
 msgid "Last seen at"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:81
+#: aleksis/apps/kort/models/cards.py:81
 msgid "OAuth2 application"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:89
+#: aleksis/apps/kort/models/cards.py:89
 msgid "OAuth2 client secret"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:95
+#: aleksis/apps/kort/models/cards.py:95
 msgid "CUPS printer"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:97
+#: aleksis/apps/kort/models/cards.py:97
 msgid "Leave blank to deactivate CUPS printing"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:100
+#: aleksis/apps/kort/models/cards.py:100
 msgid "Generate card number on server"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:102
+#: aleksis/apps/kort/models/cards.py:102
 msgid "Card detector"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:199
+#: aleksis/apps/kort/models/cards.py:198
 msgid "Card printer"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:200
+#: aleksis/apps/kort/models/cards.py:199
 #: 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:204
+#: aleksis/apps/kort/models/cards.py:203
 msgid "Media file"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:216
+#: aleksis/apps/kort/models/cards.py:215
 msgid "Media file for a card layout"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:217
+#: aleksis/apps/kort/models/cards.py:216
 msgid "Media files for card layouts"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:242
+#: aleksis/apps/kort/models/cards.py:241
 #: aleksis/apps/kort/templates/kort/card_layout/detail_content.html:43
 msgid "Template"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:243
+#: aleksis/apps/kort/models/cards.py:242
 #: aleksis/apps/kort/templates/kort/card_layout/detail_content.html:49
 msgid "Custom CSS"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:244
+#: aleksis/apps/kort/models/cards.py:243
 msgid "Width"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:244 aleksis/apps/kort/models.py:245
+#: aleksis/apps/kort/models/cards.py:243 aleksis/apps/kort/models/cards.py:244
 msgid "in mm"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:245
+#: aleksis/apps/kort/models/cards.py:244
 msgid "Height"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:266
+#: aleksis/apps/kort/models/cards.py:265
 msgid "Template is invalid: {}"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:272 aleksis/apps/kort/models.py:285
+#: aleksis/apps/kort/models/cards.py:271 aleksis/apps/kort/models/cards.py:286
 #: 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:273
+#: aleksis/apps/kort/models/cards.py:272
 msgid "Card Layouts"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:278 aleksis/apps/kort/tables.py:20
+#: aleksis/apps/kort/models/cards.py:277 aleksis/apps/kort/tables.py:20
 #: 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:280
+#: aleksis/apps/kort/models/cards.py:279
 msgid "Chip Number"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:282 aleksis/apps/kort/tables.py:24
+#: aleksis/apps/kort/models/cards.py:281 aleksis/apps/kort/tables.py:24
 msgid "Deactivated"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:288
+#: aleksis/apps/kort/models/cards.py:283
+msgid "Last read counter"
+msgstr ""
+
+#: aleksis/apps/kort/models/cards.py:289
 msgid "PDF file"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:321
+#: aleksis/apps/kort/models/cards.py:322
 msgid "There is no layout provided for the card."
 msgstr ""
 
-#: aleksis/apps/kort/models.py:340 aleksis/apps/kort/models.py:349
+#: aleksis/apps/kort/models/cards.py:341 aleksis/apps/kort/models/cards.py:350
 #: aleksis/apps/kort/templates/kort/card/detail.html:8
 #: aleksis/apps/kort/templates/kort/printer/detail_content.html:85
 msgid "Card"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:341
+#: aleksis/apps/kort/models/cards.py:342
 #: 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:346
+#: aleksis/apps/kort/models/cards.py:347
 msgid "Printer"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:361
+#: aleksis/apps/kort/models/cards.py:362
 msgid "Card print job"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:362
+#: aleksis/apps/kort/models/cards.py:363
 msgid "Card print jobs"
 msgstr ""
 
+#: aleksis/apps/kort/preferences.py:10
+msgid "Student ID Cards"
+msgstr ""
+
+#: aleksis/apps/kort/preferences.py:20
+msgid "SDM file read key"
+msgstr ""
+
+#: aleksis/apps/kort/preferences.py:31
+msgid "SDM meta read key"
+msgstr ""
+
 #: aleksis/apps/kort/tables.py:21
 #: aleksis/apps/kort/templates/kort/card/detail_content.html:17
 #: aleksis/apps/kort/templates/kort/card/short.html:8
@@ -364,8 +380,10 @@ 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 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 ""
@@ -414,8 +432,10 @@ 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"
+"          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 ""
@@ -423,7 +443,8 @@ 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"
+"          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 ""
@@ -489,7 +510,8 @@ 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"
+"      Please pay attention that this also will prevent the successful "
+"finishing of all active print jobs\n"
 "      which use these template.\n"
 "    "
 msgstr ""
@@ -526,7 +548,8 @@ 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"
+"      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 ""
@@ -536,7 +559,9 @@ 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."
+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
@@ -544,7 +569,9 @@ 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)."
+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
@@ -585,7 +612,8 @@ 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"
+"      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 ""
@@ -609,7 +637,8 @@ 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"
+"              To enable printing, you have to register the print client on "
+"the device\n"
 "              which the printer is connected to.\n"
 "            "
 msgstr ""
@@ -660,7 +689,9 @@ 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."
+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
diff --git a/aleksis/apps/kort/locale/ru/LC_MESSAGES/django.po b/aleksis/apps/kort/locale/ru/LC_MESSAGES/django.po
index b85bd6e..f31807f 100644
--- a/aleksis/apps/kort/locale/ru/LC_MESSAGES/django.po
+++ b/aleksis/apps/kort/locale/ru/LC_MESSAGES/django.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-09-16 17:04+0200\n"
+"POT-Creation-Date: 2024-08-10 14:53+0000\n"
 "PO-Revision-Date: 2023-05-26 04:37+0000\n"
 "Last-Translator: Serhii Horichenko <m@sgg.im>\n"
 "Language-Team: Russian <https://translate.edugit.org/projects/aleksis/"
@@ -16,12 +16,12 @@ msgstr ""
 "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"
+"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"
 "X-Generator: Weblate 4.12.1\n"
 
-#: aleksis/apps/kort/apps.py:31
+#: aleksis/apps/kort/apps.py:32
 msgid "Access and manage printer status and print jobs"
 msgstr "Управление доступом к принтеру, его состоянием и заданиями печати"
 
@@ -58,15 +58,14 @@ msgstr "Люди"
 msgid "Groups"
 msgstr "Группы"
 
-#: aleksis/apps/kort/forms.py:51 aleksis/apps/kort/models.py:191
+#: aleksis/apps/kort/forms.py:51 aleksis/apps/kort/models/cards.py:208
 msgid "Card layout"
 msgstr "Шаблон карты"
 
-#: aleksis/apps/kort/forms.py:53 aleksis/apps/kort/models.py:281
+#: aleksis/apps/kort/forms.py:53 aleksis/apps/kort/models/cards.py:280
 #: aleksis/apps/kort/tables.py:23
 #: aleksis/apps/kort/templates/kort/card/detail_content.html:24
 #: aleksis/apps/kort/templates/kort/card/short.html:12
-#: aleksis/apps/kort/models.py:263 aleksis/apps/kort/tables.py:30
 msgid "Valid until"
 msgstr "Действует до"
 
@@ -86,248 +85,256 @@ msgstr "Основные атрибуты"
 msgid "Printer settings"
 msgstr "Настройки принтера"
 
-#: aleksis/apps/kort/forms.py:138 aleksis/apps/kort/models.py:228
+#: aleksis/apps/kort/forms.py:138 aleksis/apps/kort/models/cards.py:245
 msgid "Required data fields"
 msgstr "Необходимые поля данных"
 
-#: aleksis/apps/kort/models.py:24
+#: aleksis/apps/kort/models/cards.py:25
 msgid "Online"
 msgstr "Онлайн"
 
-#: aleksis/apps/kort/models.py:25
+#: aleksis/apps/kort/models/cards.py:26
 msgid "Offline"
 msgstr "Офлайн"
 
-#: aleksis/apps/kort/models.py:26
+#: aleksis/apps/kort/models/cards.py:27
 msgid "With errors"
 msgstr "С ошибками"
 
-#: aleksis/apps/kort/models.py:27
+#: aleksis/apps/kort/models/cards.py:28
 msgid "Not registered"
 msgstr "Не зарегистрировано"
 
-#: aleksis/apps/kort/models.py:56
+#: aleksis/apps/kort/models/cards.py:57
 msgid "Registered"
 msgstr "Зарегистрировано"
 
-#: aleksis/apps/kort/models.py:57
+#: aleksis/apps/kort/models/cards.py:58
 msgid "In progress"
 msgstr "В процессе"
 
-#: aleksis/apps/kort/models.py:58
+#: aleksis/apps/kort/models/cards.py:59
 msgid "Finished"
 msgstr "Завершено"
 
-#: aleksis/apps/kort/models.py:59
+#: aleksis/apps/kort/models/cards.py:60
 msgid "Failed"
 msgstr "Сбой"
 
-#: aleksis/apps/kort/models.py:65 aleksis/apps/kort/models.py:241
+#: aleksis/apps/kort/models/cards.py:65 aleksis/apps/kort/models/cards.py:240
 #: 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
-#: aleksis/apps/kort/models.py:64 aleksis/apps/kort/models.py:223
 msgid "Name"
 msgstr "Полное имя"
 
-#: aleksis/apps/kort/models.py:66
+#: aleksis/apps/kort/models/cards.py:66
 #: aleksis/apps/kort/templates/kort/printer/detail_content.html:24
-#: aleksis/apps/kort/models.py:65
 msgid "Description"
 msgstr "Описание"
 
-#: aleksis/apps/kort/models.py:67
+#: aleksis/apps/kort/models/cards.py:67
 #: aleksis/apps/kort/templates/kort/printer/detail_content.html:17
 #: aleksis/apps/kort/templates/kort/printer/short.html:8
-#: aleksis/apps/kort/models.py:66
 msgid "Location"
 msgstr "Нас.пункт"
 
-#: aleksis/apps/kort/models.py:71 aleksis/apps/kort/models.py:354
+#: aleksis/apps/kort/models/cards.py:71 aleksis/apps/kort/models/cards.py:355
 #: aleksis/apps/kort/tables.py:94
 #: 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:91
 #: aleksis/apps/kort/templates/kort/printer/short.html:12
-#: aleksis/apps/kort/models.py:70 aleksis/apps/kort/models.py:336
-#: aleksis/apps/kort/tables.py:95
-#: aleksis/apps/kort/templates/kort/printer/detail_content.html:90
 msgid "Status"
 msgstr "Состояние"
 
-#: aleksis/apps/kort/models.py:74 aleksis/apps/kort/models.py:340
+#: aleksis/apps/kort/models/cards.py:75 aleksis/apps/kort/models/cards.py:359
 msgid "Status text"
 msgstr "Описание состояния"
 
-#: aleksis/apps/kort/models.py:75 aleksis/apps/kort/tables.py:58
+#: aleksis/apps/kort/models/cards.py:76 aleksis/apps/kort/tables.py:52
 #: aleksis/apps/kort/templates/kort/printer/detail_content.html:31
 msgid "Last seen at"
 msgstr "Последний раз на связи"
 
-#: aleksis/apps/kort/models.py:80
+#: aleksis/apps/kort/models/cards.py:81
 msgid "OAuth2 application"
 msgstr "Программа для OAuth2"
 
-#: aleksis/apps/kort/models.py:89
+#: aleksis/apps/kort/models/cards.py:89
 msgid "OAuth2 client secret"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:87
+#: aleksis/apps/kort/models/cards.py:95
 msgid "CUPS printer"
 msgstr "Принтер CUPS"
 
-#: aleksis/apps/kort/models.py:97
+#: aleksis/apps/kort/models/cards.py:97
 msgid "Leave blank to deactivate CUPS printing"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:89
+#: aleksis/apps/kort/models/cards.py:100
 msgid "Generate card number on server"
 msgstr "Генерировать номер карты на сервере"
 
-#: aleksis/apps/kort/models.py:91
+#: aleksis/apps/kort/models/cards.py:102
 msgid "Card detector"
 msgstr "Детектор карт"
 
-#: aleksis/apps/kort/models.py:181
+#: aleksis/apps/kort/models/cards.py:198
 msgid "Card printer"
 msgstr "Карточный принтер"
 
-#: aleksis/apps/kort/models.py:182
+#: aleksis/apps/kort/models/cards.py:199
 #: 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
+#: aleksis/apps/kort/models/cards.py:203
 msgid "Media file"
 msgstr "Медиафайл"
 
-#: aleksis/apps/kort/models.py:198
+#: aleksis/apps/kort/models/cards.py:215
 msgid "Media file for a card layout"
 msgstr "Медиафайл для шаблона карт"
 
-#: aleksis/apps/kort/models.py:199
+#: aleksis/apps/kort/models/cards.py:216
 msgid "Media files for card layouts"
 msgstr "Медифайлы для шаблонов карт"
 
-#: aleksis/apps/kort/models.py:224
+#: aleksis/apps/kort/models/cards.py:241
 #: aleksis/apps/kort/templates/kort/card_layout/detail_content.html:43
 msgid "Template"
 msgstr "Шаблон"
 
-#: aleksis/apps/kort/models.py:225
+#: aleksis/apps/kort/models/cards.py:242
 #: aleksis/apps/kort/templates/kort/card_layout/detail_content.html:49
 msgid "Custom CSS"
 msgstr "Настраиваемый CSS"
 
-#: aleksis/apps/kort/models.py:226
+#: aleksis/apps/kort/models/cards.py:243
 msgid "Width"
 msgstr "Ширина"
 
-#: aleksis/apps/kort/models.py:226 aleksis/apps/kort/models.py:227
+#: aleksis/apps/kort/models/cards.py:243 aleksis/apps/kort/models/cards.py:244
 msgid "in mm"
 msgstr "в мм"
 
-#: aleksis/apps/kort/models.py:227
+#: aleksis/apps/kort/models/cards.py:244
 msgid "Height"
 msgstr "Высота"
 
-#: aleksis/apps/kort/models.py:248
+#: aleksis/apps/kort/models/cards.py:265
 msgid "Template is invalid: {}"
 msgstr "Шаблон неправильный: {}"
 
-#: aleksis/apps/kort/models.py:254 aleksis/apps/kort/models.py:267
+#: aleksis/apps/kort/models/cards.py:271 aleksis/apps/kort/models/cards.py:286
 #: 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
+#: aleksis/apps/kort/models/cards.py:272
 msgid "Card Layouts"
 msgstr "Шаблоны карт"
 
-#: aleksis/apps/kort/models.py:278 aleksis/apps/kort/tables.py:20
+#: aleksis/apps/kort/models/cards.py:277 aleksis/apps/kort/tables.py:20
 #: aleksis/apps/kort/templates/kort/card/detail_content.html:11
 #: aleksis/apps/kort/templates/kort/card/short.html:4
-#: aleksis/apps/kort/models.py:260
 msgid "Person"
 msgstr "Физлицо"
 
-#: aleksis/apps/kort/models.py:262
+#: aleksis/apps/kort/models/cards.py:279
 msgid "Chip Number"
 msgstr "Номер чипа"
 
-#: aleksis/apps/kort/models.py:264 aleksis/apps/kort/tables.py:31
+#: aleksis/apps/kort/models/cards.py:281 aleksis/apps/kort/tables.py:24
 msgid "Deactivated"
 msgstr "Деактивировано"
 
-#: aleksis/apps/kort/models.py:288 aleksis/apps/kort/models.py:270
+#: aleksis/apps/kort/models/cards.py:283
+msgid "Last read counter"
+msgstr ""
+
+#: aleksis/apps/kort/models/cards.py:289
 msgid "PDF file"
 msgstr "Файл PDF"
 
-#: aleksis/apps/kort/models.py:303
+#: aleksis/apps/kort/models/cards.py:322
 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/models/cards.py:341 aleksis/apps/kort/models/cards.py:350
 #: aleksis/apps/kort/templates/kort/card/detail.html:8
-#: aleksis/apps/kort/templates/kort/printer/detail_content.html:84
+#: aleksis/apps/kort/templates/kort/printer/detail_content.html:85
 msgid "Card"
 msgstr "Карта"
 
-#: aleksis/apps/kort/models.py:323
+#: aleksis/apps/kort/models/cards.py:342
 #: 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
+#: aleksis/apps/kort/models/cards.py:347
 msgid "Printer"
 msgstr "Принтер"
 
-#: aleksis/apps/kort/models.py:343
+#: aleksis/apps/kort/models/cards.py:362
 msgid "Card print job"
 msgstr "Задание на печать карты"
 
-#: aleksis/apps/kort/models.py:344
+#: aleksis/apps/kort/models/cards.py:363
 msgid "Card print jobs"
 msgstr "Задания на печать карт"
 
-#: aleksis/apps/kort/tables.py:28
+#: aleksis/apps/kort/preferences.py:10
+msgid "Student ID Cards"
+msgstr ""
+
+#: aleksis/apps/kort/preferences.py:20
+msgid "SDM file read key"
+msgstr ""
+
+#: aleksis/apps/kort/preferences.py:31
+msgid "SDM meta read key"
+msgstr ""
+
+#: aleksis/apps/kort/tables.py:21
 #: 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
+#: aleksis/apps/kort/tables.py:22 aleksis/apps/kort/tables.py:51
 msgid "Current status"
 msgstr "Текущее состояние"
 
 #: aleksis/apps/kort/tables.py:25 aleksis/apps/kort/tables.py:55
-#: aleksis/apps/kort/tables.py:81 aleksis/apps/kort/tables.py:32
-#: aleksis/apps/kort/tables.py:61 aleksis/apps/kort/tables.py:85
+#: aleksis/apps/kort/tables.py:81
 msgid "Actions"
 msgstr "Действия"
 
-#: aleksis/apps/kort/tables.py:54
+#: aleksis/apps/kort/tables.py:48
 msgid "Printer name"
 msgstr "Название принтера"
 
-#: aleksis/apps/kort/tables.py:55
+#: aleksis/apps/kort/tables.py:49
 msgid "Printer location"
 msgstr "Размещение принтера"
 
-#: aleksis/apps/kort/tables.py:59
+#: aleksis/apps/kort/tables.py:53
 msgid "Running jobs"
 msgstr "Текущие задания"
 
-#: aleksis/apps/kort/tables.py:81
+#: aleksis/apps/kort/tables.py:77
 msgid "Layout name"
 msgstr "Название шаблона"
 
 #: aleksis/apps/kort/templates/kort/card/actions.html:8
-#: aleksis/apps/kort/templates/kort/card/detail.html:9
+#: aleksis/apps/kort/templates/kort/card/detail.html:13
 #, python-format
 msgid "Card of %(person)s"
 msgstr "Карта для %(person)s"
@@ -703,7 +710,7 @@ msgstr "3. Настроить клиента"
 msgid "Print jobs"
 msgstr "Задания печати"
 
-#: aleksis/apps/kort/templates/kort/printer/detail_content.html:87
+#: aleksis/apps/kort/templates/kort/printer/detail_content.html:88
 msgid "Created at"
 msgstr "Создано в"
 
@@ -746,35 +753,35 @@ msgstr "Карта успешно удалена."
 msgid "The card has been deactivated successfully."
 msgstr "Карта успешно деактивирована."
 
-#: aleksis/apps/kort/views.py:232
+#: aleksis/apps/kort/views.py:238
 msgid "Progress: Generate card layout as PDF file"
 msgstr "Прогресс: Сохранение шаблона карты в файл PDF"
 
-#: aleksis/apps/kort/views.py:239 aleksis/apps/kort/views.py:233
+#: aleksis/apps/kort/views.py:239
 msgid "Generating PDF file …"
 msgstr "Создание файла PDF …"
 
-#: aleksis/apps/kort/views.py:234
+#: aleksis/apps/kort/views.py:240
 msgid "The PDF file with the card layout has been generated successfully."
 msgstr "Файл PDF c шаблоном карты успешно сохранен."
 
-#: aleksis/apps/kort/views.py:241 aleksis/apps/kort/views.py:235
+#: aleksis/apps/kort/views.py:241
 msgid "There was a problem while generating the PDF file."
 msgstr "Во время создания файла PDF возникла проблема."
 
-#: aleksis/apps/kort/views.py:237
+#: aleksis/apps/kort/views.py:243
 msgid "Show card"
 msgstr "Показать карту"
 
-#: aleksis/apps/kort/views.py:275
+#: aleksis/apps/kort/views.py:281
 msgid "The card printer has been created successfully."
 msgstr "Принтер для карт успешно создан."
 
-#: aleksis/apps/kort/views.py:288
+#: aleksis/apps/kort/views.py:294
 msgid "The card printer has been changed successfully."
 msgstr "Принтер для карт успешно изменён."
 
-#: aleksis/apps/kort/views.py:301
+#: aleksis/apps/kort/views.py:307
 msgid "The card printer has been deleted successfully."
 msgstr "Принтер для карт успешно удалён."
 
@@ -782,18 +789,17 @@ msgstr "Принтер для карт успешно удалён."
 msgid "The card print job has been deleted successfully."
 msgstr ""
 
-#: aleksis/apps/kort/views.py:364
+#: aleksis/apps/kort/views.py:380
 msgid "The card layout has been created successfully."
 msgstr "Шаблон карты успешно создан."
 
-#: aleksis/apps/kort/views.py:382
+#: aleksis/apps/kort/views.py:398
 msgid "The card layout has been changed successfully."
 msgstr "Шаблон карт успешно изменён."
 
-#: aleksis/apps/kort/views.py:395
+#: aleksis/apps/kort/views.py:411
 msgid "The card layout has been deleted successfully."
 msgstr "Шаблон карт успешно удалён."
 
-#: aleksis/apps/kort/views.py:220
-msgid "The chip number is missing."
-msgstr "Номер чипа отсутствует."
+#~ msgid "The chip number is missing."
+#~ msgstr "Номер чипа отсутствует."
diff --git a/aleksis/apps/kort/locale/tr_TR/LC_MESSAGES/django.po b/aleksis/apps/kort/locale/tr_TR/LC_MESSAGES/django.po
index 0b716c8..029e152 100644
--- a/aleksis/apps/kort/locale/tr_TR/LC_MESSAGES/django.po
+++ b/aleksis/apps/kort/locale/tr_TR/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-09-16 17:04+0200\n"
+"POT-Creation-Date: 2024-08-10 14:53+0000\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:31
+#: aleksis/apps/kort/apps.py:32
 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:209
+#: aleksis/apps/kort/forms.py:51 aleksis/apps/kort/models/cards.py:208
 msgid "Card layout"
 msgstr ""
 
-#: aleksis/apps/kort/forms.py:53 aleksis/apps/kort/models.py:281
+#: aleksis/apps/kort/forms.py:53 aleksis/apps/kort/models/cards.py:280
 #: aleksis/apps/kort/tables.py:23
 #: aleksis/apps/kort/templates/kort/card/detail_content.html:24
 #: aleksis/apps/kort/templates/kort/card/short.html:12
@@ -81,43 +81,43 @@ msgstr ""
 msgid "Printer settings"
 msgstr ""
 
-#: aleksis/apps/kort/forms.py:138 aleksis/apps/kort/models.py:246
+#: aleksis/apps/kort/forms.py:138 aleksis/apps/kort/models/cards.py:245
 msgid "Required data fields"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:25
+#: aleksis/apps/kort/models/cards.py:25
 msgid "Online"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:26
+#: aleksis/apps/kort/models/cards.py:26
 msgid "Offline"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:27
+#: aleksis/apps/kort/models/cards.py:27
 msgid "With errors"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:28
+#: aleksis/apps/kort/models/cards.py:28
 msgid "Not registered"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:57
+#: aleksis/apps/kort/models/cards.py:57
 msgid "Registered"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:58
+#: aleksis/apps/kort/models/cards.py:58
 msgid "In progress"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:59
+#: aleksis/apps/kort/models/cards.py:59
 msgid "Finished"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:60
+#: aleksis/apps/kort/models/cards.py:60
 msgid "Failed"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:65 aleksis/apps/kort/models.py:241
+#: aleksis/apps/kort/models/cards.py:65 aleksis/apps/kort/models/cards.py:240
 #: 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
@@ -125,18 +125,18 @@ msgstr ""
 msgid "Name"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:66
+#: aleksis/apps/kort/models/cards.py:66
 #: aleksis/apps/kort/templates/kort/printer/detail_content.html:24
 msgid "Description"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:67
+#: aleksis/apps/kort/models/cards.py:67
 #: 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:71 aleksis/apps/kort/models.py:354
+#: aleksis/apps/kort/models/cards.py:71 aleksis/apps/kort/models/cards.py:355
 #: aleksis/apps/kort/tables.py:94
 #: aleksis/apps/kort/templates/kort/card/detail_content.html:38
 #: aleksis/apps/kort/templates/kort/printer/detail_content.html:38
@@ -145,143 +145,159 @@ msgstr ""
 msgid "Status"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:75 aleksis/apps/kort/models.py:358
+#: aleksis/apps/kort/models/cards.py:75 aleksis/apps/kort/models/cards.py:359
 msgid "Status text"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:76 aleksis/apps/kort/tables.py:52
+#: aleksis/apps/kort/models/cards.py:76 aleksis/apps/kort/tables.py:52
 #: aleksis/apps/kort/templates/kort/printer/detail_content.html:31
 msgid "Last seen at"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:81
+#: aleksis/apps/kort/models/cards.py:81
 msgid "OAuth2 application"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:89
+#: aleksis/apps/kort/models/cards.py:89
 msgid "OAuth2 client secret"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:95
+#: aleksis/apps/kort/models/cards.py:95
 msgid "CUPS printer"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:97
+#: aleksis/apps/kort/models/cards.py:97
 msgid "Leave blank to deactivate CUPS printing"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:100
+#: aleksis/apps/kort/models/cards.py:100
 msgid "Generate card number on server"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:102
+#: aleksis/apps/kort/models/cards.py:102
 msgid "Card detector"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:199
+#: aleksis/apps/kort/models/cards.py:198
 msgid "Card printer"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:200
+#: aleksis/apps/kort/models/cards.py:199
 #: 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:204
+#: aleksis/apps/kort/models/cards.py:203
 msgid "Media file"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:216
+#: aleksis/apps/kort/models/cards.py:215
 msgid "Media file for a card layout"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:217
+#: aleksis/apps/kort/models/cards.py:216
 msgid "Media files for card layouts"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:242
+#: aleksis/apps/kort/models/cards.py:241
 #: aleksis/apps/kort/templates/kort/card_layout/detail_content.html:43
 msgid "Template"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:243
+#: aleksis/apps/kort/models/cards.py:242
 #: aleksis/apps/kort/templates/kort/card_layout/detail_content.html:49
 msgid "Custom CSS"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:244
+#: aleksis/apps/kort/models/cards.py:243
 msgid "Width"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:244 aleksis/apps/kort/models.py:245
+#: aleksis/apps/kort/models/cards.py:243 aleksis/apps/kort/models/cards.py:244
 msgid "in mm"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:245
+#: aleksis/apps/kort/models/cards.py:244
 msgid "Height"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:266
+#: aleksis/apps/kort/models/cards.py:265
 msgid "Template is invalid: {}"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:272 aleksis/apps/kort/models.py:285
+#: aleksis/apps/kort/models/cards.py:271 aleksis/apps/kort/models/cards.py:286
 #: 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:273
+#: aleksis/apps/kort/models/cards.py:272
 msgid "Card Layouts"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:278 aleksis/apps/kort/tables.py:20
+#: aleksis/apps/kort/models/cards.py:277 aleksis/apps/kort/tables.py:20
 #: 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:280
+#: aleksis/apps/kort/models/cards.py:279
 msgid "Chip Number"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:282 aleksis/apps/kort/tables.py:24
+#: aleksis/apps/kort/models/cards.py:281 aleksis/apps/kort/tables.py:24
 msgid "Deactivated"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:288
+#: aleksis/apps/kort/models/cards.py:283
+msgid "Last read counter"
+msgstr ""
+
+#: aleksis/apps/kort/models/cards.py:289
 msgid "PDF file"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:321
+#: aleksis/apps/kort/models/cards.py:322
 msgid "There is no layout provided for the card."
 msgstr ""
 
-#: aleksis/apps/kort/models.py:340 aleksis/apps/kort/models.py:349
+#: aleksis/apps/kort/models/cards.py:341 aleksis/apps/kort/models/cards.py:350
 #: aleksis/apps/kort/templates/kort/card/detail.html:8
 #: aleksis/apps/kort/templates/kort/printer/detail_content.html:85
 msgid "Card"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:341
+#: aleksis/apps/kort/models/cards.py:342
 #: 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:346
+#: aleksis/apps/kort/models/cards.py:347
 msgid "Printer"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:361
+#: aleksis/apps/kort/models/cards.py:362
 msgid "Card print job"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:362
+#: aleksis/apps/kort/models/cards.py:363
 msgid "Card print jobs"
 msgstr ""
 
+#: aleksis/apps/kort/preferences.py:10
+msgid "Student ID Cards"
+msgstr ""
+
+#: aleksis/apps/kort/preferences.py:20
+msgid "SDM file read key"
+msgstr ""
+
+#: aleksis/apps/kort/preferences.py:31
+msgid "SDM meta read key"
+msgstr ""
+
 #: aleksis/apps/kort/tables.py:21
 #: aleksis/apps/kort/templates/kort/card/detail_content.html:17
 #: aleksis/apps/kort/templates/kort/card/short.html:8
@@ -364,8 +380,10 @@ 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 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 ""
@@ -414,8 +432,10 @@ 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"
+"          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 ""
@@ -423,7 +443,8 @@ 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"
+"          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 ""
@@ -489,7 +510,8 @@ 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"
+"      Please pay attention that this also will prevent the successful "
+"finishing of all active print jobs\n"
 "      which use these template.\n"
 "    "
 msgstr ""
@@ -526,7 +548,8 @@ 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"
+"      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 ""
@@ -536,7 +559,9 @@ 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."
+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
@@ -544,7 +569,9 @@ 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)."
+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
@@ -585,7 +612,8 @@ 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"
+"      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 ""
@@ -609,7 +637,8 @@ 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"
+"              To enable printing, you have to register the print client on "
+"the device\n"
 "              which the printer is connected to.\n"
 "            "
 msgstr ""
@@ -660,7 +689,9 @@ 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."
+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
diff --git a/aleksis/apps/kort/locale/uk/LC_MESSAGES/django.po b/aleksis/apps/kort/locale/uk/LC_MESSAGES/django.po
index c0646a3..5931821 100644
--- a/aleksis/apps/kort/locale/uk/LC_MESSAGES/django.po
+++ b/aleksis/apps/kort/locale/uk/LC_MESSAGES/django.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-09-16 17:04+0200\n"
+"POT-Creation-Date: 2024-08-10 14:53+0000\n"
 "PO-Revision-Date: 2023-04-13 23:05+0000\n"
 "Last-Translator: Serhii Horichenko <m@sgg.im>\n"
 "Language-Team: Ukrainian <https://translate.edugit.org/projects/aleksis/"
@@ -22,7 +22,7 @@ msgstr ""
 "(n % 100 >=11 && n % 100 <=14 )) ? 2: 3);\n"
 "X-Generator: Weblate 4.12.1\n"
 
-#: aleksis/apps/kort/apps.py:31
+#: aleksis/apps/kort/apps.py:32
 msgid "Access and manage printer status and print jobs"
 msgstr "Керування станом принтера, доступом та завданнями друку"
 
@@ -59,16 +59,14 @@ msgstr "Особи"
 msgid "Groups"
 msgstr "Групи"
 
-#: aleksis/apps/kort/forms.py:51 aleksis/apps/kort/models.py:209
-#: aleksis/apps/kort/models.py:191
+#: aleksis/apps/kort/forms.py:51 aleksis/apps/kort/models/cards.py:208
 msgid "Card layout"
 msgstr "Шаблон картки"
 
-#: aleksis/apps/kort/forms.py:53 aleksis/apps/kort/models.py:281
+#: aleksis/apps/kort/forms.py:53 aleksis/apps/kort/models/cards.py:280
 #: aleksis/apps/kort/tables.py:23
 #: aleksis/apps/kort/templates/kort/card/detail_content.html:24
 #: aleksis/apps/kort/templates/kort/card/short.html:12
-#: aleksis/apps/kort/models.py:263 aleksis/apps/kort/tables.py:30
 msgid "Valid until"
 msgstr "Діє до"
 
@@ -88,263 +86,256 @@ msgstr "Основні атрибути"
 msgid "Printer settings"
 msgstr "Налаштування принтера"
 
-#: aleksis/apps/kort/forms.py:138 aleksis/apps/kort/models.py:246
-#: aleksis/apps/kort/models.py:228
+#: aleksis/apps/kort/forms.py:138 aleksis/apps/kort/models/cards.py:245
 msgid "Required data fields"
 msgstr "Необхідні поля даних"
 
-#: aleksis/apps/kort/models.py:25 aleksis/apps/kort/models.py:24
+#: aleksis/apps/kort/models/cards.py:25
 msgid "Online"
 msgstr "Онлайн"
 
-#: aleksis/apps/kort/models.py:26 aleksis/apps/kort/models.py:25
+#: aleksis/apps/kort/models/cards.py:26
 msgid "Offline"
 msgstr "Офлайн"
 
-#: aleksis/apps/kort/models.py:27 aleksis/apps/kort/models.py:26
+#: aleksis/apps/kort/models/cards.py:27
 msgid "With errors"
 msgstr "З помилками"
 
-#: aleksis/apps/kort/models.py:28 aleksis/apps/kort/models.py:27
+#: aleksis/apps/kort/models/cards.py:28
 msgid "Not registered"
 msgstr "Не зареєстровано"
 
-#: aleksis/apps/kort/models.py:57 aleksis/apps/kort/models.py:56
+#: aleksis/apps/kort/models/cards.py:57
 msgid "Registered"
 msgstr "Зареєстровано"
 
-#: aleksis/apps/kort/models.py:58 aleksis/apps/kort/models.py:57
+#: aleksis/apps/kort/models/cards.py:58
 msgid "In progress"
 msgstr "Обробляється"
 
-#: aleksis/apps/kort/models.py:59 aleksis/apps/kort/models.py:58
+#: aleksis/apps/kort/models/cards.py:59
 msgid "Finished"
 msgstr "Завершено"
 
-#: aleksis/apps/kort/models.py:60 aleksis/apps/kort/models.py:59
+#: aleksis/apps/kort/models/cards.py:60
 msgid "Failed"
 msgstr "Збій"
 
-#: aleksis/apps/kort/models.py:65 aleksis/apps/kort/models.py:241
+#: aleksis/apps/kort/models/cards.py:65 aleksis/apps/kort/models/cards.py:240
 #: 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
-#: aleksis/apps/kort/models.py:64 aleksis/apps/kort/models.py:223
 msgid "Name"
 msgstr "Повне ім'я"
 
-#: aleksis/apps/kort/models.py:66
+#: aleksis/apps/kort/models/cards.py:66
 #: aleksis/apps/kort/templates/kort/printer/detail_content.html:24
-#: aleksis/apps/kort/models.py:65
 msgid "Description"
 msgstr "Опис"
 
-#: aleksis/apps/kort/models.py:67
+#: aleksis/apps/kort/models/cards.py:67
 #: aleksis/apps/kort/templates/kort/printer/detail_content.html:17
 #: aleksis/apps/kort/templates/kort/printer/short.html:8
-#: aleksis/apps/kort/models.py:66
 msgid "Location"
 msgstr "Нас.пункт"
 
-#: aleksis/apps/kort/models.py:71 aleksis/apps/kort/models.py:354
+#: aleksis/apps/kort/models/cards.py:71 aleksis/apps/kort/models/cards.py:355
 #: aleksis/apps/kort/tables.py:94
 #: 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:91
 #: aleksis/apps/kort/templates/kort/printer/short.html:12
-#: aleksis/apps/kort/models.py:70 aleksis/apps/kort/models.py:336
-#: aleksis/apps/kort/tables.py:95
-#: aleksis/apps/kort/templates/kort/printer/detail_content.html:90
 msgid "Status"
 msgstr "Стан"
 
-#: aleksis/apps/kort/models.py:75 aleksis/apps/kort/models.py:358
-#: aleksis/apps/kort/models.py:74 aleksis/apps/kort/models.py:340
+#: aleksis/apps/kort/models/cards.py:75 aleksis/apps/kort/models/cards.py:359
 msgid "Status text"
 msgstr "Опис стану"
 
-#: aleksis/apps/kort/models.py:76 aleksis/apps/kort/tables.py:52
+#: aleksis/apps/kort/models/cards.py:76 aleksis/apps/kort/tables.py:52
 #: aleksis/apps/kort/templates/kort/printer/detail_content.html:31
-#: aleksis/apps/kort/models.py:75 aleksis/apps/kort/tables.py:58
 msgid "Last seen at"
 msgstr "Востаннє на зв'язку о"
 
-#: aleksis/apps/kort/models.py:81 aleksis/apps/kort/models.py:80
+#: aleksis/apps/kort/models/cards.py:81
 msgid "OAuth2 application"
 msgstr "Програма для OAuth2"
 
-#: aleksis/apps/kort/models.py:89
+#: aleksis/apps/kort/models/cards.py:89
 msgid "OAuth2 client secret"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:95 aleksis/apps/kort/models.py:87
+#: aleksis/apps/kort/models/cards.py:95
 msgid "CUPS printer"
 msgstr "Принтер CUPS"
 
-#: aleksis/apps/kort/models.py:97
+#: aleksis/apps/kort/models/cards.py:97
 msgid "Leave blank to deactivate CUPS printing"
 msgstr ""
 
-#: aleksis/apps/kort/models.py:100 aleksis/apps/kort/models.py:89
+#: aleksis/apps/kort/models/cards.py:100
 msgid "Generate card number on server"
 msgstr "Генерувати номер картки на сервері"
 
-#: aleksis/apps/kort/models.py:102 aleksis/apps/kort/models.py:91
+#: aleksis/apps/kort/models/cards.py:102
 msgid "Card detector"
 msgstr "Детектор карток"
 
-#: aleksis/apps/kort/models.py:199 aleksis/apps/kort/models.py:181
+#: aleksis/apps/kort/models/cards.py:198
 msgid "Card printer"
 msgstr "Принтер для карток"
 
-#: aleksis/apps/kort/models.py:200
+#: aleksis/apps/kort/models/cards.py:199
 #: aleksis/apps/kort/templates/kort/printer/list.html:8
 #: aleksis/apps/kort/templates/kort/printer/list.html:9
-#: aleksis/apps/kort/models.py:182
 msgid "Card printers"
 msgstr "Принтери для карток"
 
-#: aleksis/apps/kort/models.py:204 aleksis/apps/kort/models.py:186
+#: aleksis/apps/kort/models/cards.py:203
 msgid "Media file"
 msgstr "Медіафайл"
 
-#: aleksis/apps/kort/models.py:216 aleksis/apps/kort/models.py:198
+#: aleksis/apps/kort/models/cards.py:215
 msgid "Media file for a card layout"
 msgstr "Медіафайл для шаблона карток"
 
-#: aleksis/apps/kort/models.py:217 aleksis/apps/kort/models.py:199
+#: aleksis/apps/kort/models/cards.py:216
 msgid "Media files for card layouts"
 msgstr "Медіафайли для шаблонів карток"
 
-#: aleksis/apps/kort/models.py:242
+#: aleksis/apps/kort/models/cards.py:241
 #: aleksis/apps/kort/templates/kort/card_layout/detail_content.html:43
-#: aleksis/apps/kort/models.py:224
 msgid "Template"
 msgstr "Шаблон"
 
-#: aleksis/apps/kort/models.py:243
+#: aleksis/apps/kort/models/cards.py:242
 #: aleksis/apps/kort/templates/kort/card_layout/detail_content.html:49
-#: aleksis/apps/kort/models.py:225
 msgid "Custom CSS"
 msgstr "Власний CSS"
 
-#: aleksis/apps/kort/models.py:244 aleksis/apps/kort/models.py:226
+#: aleksis/apps/kort/models/cards.py:243
 msgid "Width"
 msgstr "Ширина"
 
-#: aleksis/apps/kort/models.py:244 aleksis/apps/kort/models.py:245
-#: aleksis/apps/kort/models.py:226 aleksis/apps/kort/models.py:227
+#: aleksis/apps/kort/models/cards.py:243 aleksis/apps/kort/models/cards.py:244
 msgid "in mm"
 msgstr "в мм"
 
-#: aleksis/apps/kort/models.py:245 aleksis/apps/kort/models.py:227
+#: aleksis/apps/kort/models/cards.py:244
 msgid "Height"
 msgstr "Висота"
 
-#: aleksis/apps/kort/models.py:266 aleksis/apps/kort/models.py:248
+#: aleksis/apps/kort/models/cards.py:265
 msgid "Template is invalid: {}"
 msgstr "Шаблон неправильний: {}"
 
-#: aleksis/apps/kort/models.py:272 aleksis/apps/kort/models.py:285
+#: aleksis/apps/kort/models/cards.py:271 aleksis/apps/kort/models/cards.py:286
 #: aleksis/apps/kort/templates/kort/card/detail_content.html:31
 #: aleksis/apps/kort/templates/kort/card_layout/detail.html:8
-#: aleksis/apps/kort/models.py:254 aleksis/apps/kort/models.py:267
 msgid "Card Layout"
 msgstr "Шаблон картки"
 
-#: aleksis/apps/kort/models.py:273 aleksis/apps/kort/models.py:255
+#: aleksis/apps/kort/models/cards.py:272
 msgid "Card Layouts"
 msgstr "Шаблони карток"
 
-#: aleksis/apps/kort/models.py:278 aleksis/apps/kort/tables.py:20
+#: aleksis/apps/kort/models/cards.py:277 aleksis/apps/kort/tables.py:20
 #: aleksis/apps/kort/templates/kort/card/detail_content.html:11
 #: aleksis/apps/kort/templates/kort/card/short.html:4
-#: aleksis/apps/kort/models.py:260
 msgid "Person"
 msgstr "Особа"
 
-#: aleksis/apps/kort/models.py:280 aleksis/apps/kort/models.py:262
+#: aleksis/apps/kort/models/cards.py:279
 msgid "Chip Number"
 msgstr "Номер чипа"
 
-#: aleksis/apps/kort/models.py:282 aleksis/apps/kort/tables.py:24
-#: aleksis/apps/kort/models.py:264 aleksis/apps/kort/tables.py:31
+#: aleksis/apps/kort/models/cards.py:281 aleksis/apps/kort/tables.py:24
 msgid "Deactivated"
 msgstr "Деактивовано"
 
-#: aleksis/apps/kort/models.py:288 aleksis/apps/kort/models.py:270
+#: aleksis/apps/kort/models/cards.py:283
+msgid "Last read counter"
+msgstr ""
+
+#: aleksis/apps/kort/models/cards.py:289
 msgid "PDF file"
 msgstr "Файл PDF"
 
-#: aleksis/apps/kort/models.py:321 aleksis/apps/kort/models.py:303
+#: aleksis/apps/kort/models/cards.py:322
 msgid "There is no layout provided for the card."
 msgstr "Для картки не задано шаблон."
 
-#: aleksis/apps/kort/models.py:340 aleksis/apps/kort/models.py:349
+#: aleksis/apps/kort/models/cards.py:341 aleksis/apps/kort/models/cards.py:350
 #: aleksis/apps/kort/templates/kort/card/detail.html:8
 #: aleksis/apps/kort/templates/kort/printer/detail_content.html:85
-#: aleksis/apps/kort/models.py:322 aleksis/apps/kort/models.py:331
-#: aleksis/apps/kort/templates/kort/printer/detail_content.html:84
 msgid "Card"
 msgstr "Картка"
 
-#: aleksis/apps/kort/models.py:341
+#: aleksis/apps/kort/models/cards.py:342
 #: aleksis/apps/kort/templates/kort/card/list.html:8
 #: aleksis/apps/kort/templates/kort/card/list.html:9
-#: aleksis/apps/kort/models.py:323
 msgid "Cards"
 msgstr "Картки"
 
-#: aleksis/apps/kort/models.py:346 aleksis/apps/kort/models.py:328
+#: aleksis/apps/kort/models/cards.py:347
 msgid "Printer"
 msgstr "Принтер"
 
-#: aleksis/apps/kort/models.py:361 aleksis/apps/kort/models.py:343
+#: aleksis/apps/kort/models/cards.py:362
 msgid "Card print job"
 msgstr "Завдання на друк картки"
 
-#: aleksis/apps/kort/models.py:362 aleksis/apps/kort/models.py:344
+#: aleksis/apps/kort/models/cards.py:363
 msgid "Card print jobs"
 msgstr "Завдання на друк карток"
 
+#: aleksis/apps/kort/preferences.py:10
+msgid "Student ID Cards"
+msgstr ""
+
+#: aleksis/apps/kort/preferences.py:20
+msgid "SDM file read key"
+msgstr ""
+
+#: aleksis/apps/kort/preferences.py:31
+msgid "SDM meta read key"
+msgstr ""
+
 #: aleksis/apps/kort/tables.py:21
 #: aleksis/apps/kort/templates/kort/card/detail_content.html:17
 #: aleksis/apps/kort/templates/kort/card/short.html:8
-#: aleksis/apps/kort/tables.py:28
 msgid "Chip number"
 msgstr "Номер чипа"
 
 #: aleksis/apps/kort/tables.py:22 aleksis/apps/kort/tables.py:51
-#: aleksis/apps/kort/tables.py:29 aleksis/apps/kort/tables.py:57
 msgid "Current status"
 msgstr "Поточний стан"
 
 #: aleksis/apps/kort/tables.py:25 aleksis/apps/kort/tables.py:55
-#: aleksis/apps/kort/tables.py:81 aleksis/apps/kort/tables.py:32
-#: aleksis/apps/kort/tables.py:61 aleksis/apps/kort/tables.py:85
+#: aleksis/apps/kort/tables.py:81
 msgid "Actions"
 msgstr "Дії"
 
-#: aleksis/apps/kort/tables.py:48 aleksis/apps/kort/tables.py:54
+#: aleksis/apps/kort/tables.py:48
 msgid "Printer name"
 msgstr "Назва принтера"
 
-#: aleksis/apps/kort/tables.py:49 aleksis/apps/kort/tables.py:55
+#: aleksis/apps/kort/tables.py:49
 msgid "Printer location"
 msgstr "Розташування принтера"
 
-#: aleksis/apps/kort/tables.py:53 aleksis/apps/kort/tables.py:59
+#: aleksis/apps/kort/tables.py:53
 msgid "Running jobs"
 msgstr "Поточні завдання"
 
-#: aleksis/apps/kort/tables.py:77 aleksis/apps/kort/tables.py:81
+#: aleksis/apps/kort/tables.py:77
 msgid "Layout name"
 msgstr "Назва шаблону"
 
 #: aleksis/apps/kort/templates/kort/card/actions.html:8
 #: aleksis/apps/kort/templates/kort/card/detail.html:13
-#: aleksis/apps/kort/templates/kort/card/detail.html:9
 #, python-format
 msgid "Card of %(person)s"
 msgstr "Картка для %(person)s"
@@ -723,7 +714,6 @@ msgid "Print jobs"
 msgstr "Завдання друку"
 
 #: aleksis/apps/kort/templates/kort/printer/detail_content.html:88
-#: aleksis/apps/kort/templates/kort/printer/detail_content.html:87
 msgid "Created at"
 msgstr "Створено о"
 
@@ -768,35 +758,35 @@ msgstr "Картка успішно видалена."
 msgid "The card has been deactivated successfully."
 msgstr "Картка була успішно деактивована."
 
-#: aleksis/apps/kort/views.py:238 aleksis/apps/kort/views.py:232
+#: aleksis/apps/kort/views.py:238
 msgid "Progress: Generate card layout as PDF file"
 msgstr "Прогрес: Збереження шаблону картки у файл PDF"
 
-#: aleksis/apps/kort/views.py:239 aleksis/apps/kort/views.py:233
+#: aleksis/apps/kort/views.py:239
 msgid "Generating PDF file …"
 msgstr "Створення файлу PDF …"
 
-#: aleksis/apps/kort/views.py:240 aleksis/apps/kort/views.py:234
+#: aleksis/apps/kort/views.py:240
 msgid "The PDF file with the card layout has been generated successfully."
 msgstr "Файл PDF з шаблоном картки успішно збережений."
 
-#: aleksis/apps/kort/views.py:241 aleksis/apps/kort/views.py:235
+#: aleksis/apps/kort/views.py:241
 msgid "There was a problem while generating the PDF file."
 msgstr "Під час створення файлу PDF виникла проблема."
 
-#: aleksis/apps/kort/views.py:243 aleksis/apps/kort/views.py:237
+#: aleksis/apps/kort/views.py:243
 msgid "Show card"
 msgstr "Показати картку"
 
-#: aleksis/apps/kort/views.py:281 aleksis/apps/kort/views.py:275
+#: aleksis/apps/kort/views.py:281
 msgid "The card printer has been created successfully."
 msgstr "Принтер для карток успішно створений."
 
-#: aleksis/apps/kort/views.py:294 aleksis/apps/kort/views.py:288
+#: aleksis/apps/kort/views.py:294
 msgid "The card printer has been changed successfully."
 msgstr "Принтер для карток успішно змінений."
 
-#: aleksis/apps/kort/views.py:307 aleksis/apps/kort/views.py:301
+#: aleksis/apps/kort/views.py:307
 msgid "The card printer has been deleted successfully."
 msgstr "Принтер для карток успішно видалений."
 
@@ -805,18 +795,17 @@ msgstr "Принтер для карток успішно видалений."
 msgid "The card print job has been deleted successfully."
 msgstr "Принтер для карток успішно видалений."
 
-#: aleksis/apps/kort/views.py:380 aleksis/apps/kort/views.py:364
+#: aleksis/apps/kort/views.py:380
 msgid "The card layout has been created successfully."
 msgstr "Шаблон картки успішно створений."
 
-#: aleksis/apps/kort/views.py:398 aleksis/apps/kort/views.py:382
+#: aleksis/apps/kort/views.py:398
 msgid "The card layout has been changed successfully."
 msgstr "Шаблон картки успішно змінений."
 
-#: aleksis/apps/kort/views.py:411 aleksis/apps/kort/views.py:395
+#: aleksis/apps/kort/views.py:411
 msgid "The card layout has been deleted successfully."
 msgstr "Шаблон картки успішно видалений."
 
-#: aleksis/apps/kort/views.py:220
-msgid "The chip number is missing."
-msgstr "Номер чипа відсутній."
+#~ msgid "The chip number is missing."
+#~ msgstr "Номер чипа відсутній."
-- 
GitLab