Skip to content
Snippets Groups Projects

Compare revisions

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

Source

Select target project
No results found

Target

Select target project
  • AlekSIS/libs/kort-client
1 result
Show changes
Commits on Source (4)
import urllib
from typing import Any, Optional, Sequence
from urllib.parse import urljoin
......@@ -91,7 +92,10 @@ class KortAPI:
r = request(
method,
url,
auth=(self.settings.client_id, self.settings.client_secret),
auth=(
urllib.parse.quote(self.settings.client_id),
urllib.parse.quote(self.settings.client_secret),
),
**kwargs
)
if not r.ok:
......
import os
import subprocess # noqa
import time
from binascii import hexlify
import click
from nfc import ContactlessFrontend
from .usb_barcode_scanner.scanner import BarcodeReader
class CardDetector:
id_ = None
interactive = False
def read_id(self):
raise NotImplementedError()
......@@ -100,3 +106,38 @@ class EvolisCardDetector(CardDetector):
def abort(self):
self.clear()
class NfcReadUidDetector(CardDetector):
id_ = "nfc_read_uid"
def read_id(self):
reader = ContactlessFrontend()
reader.open("usb")
from kort_client.run import KortClientException
try:
click.secho("→ Please hold your card to the reader")
tag = reader.connect(rdwr={"on-connect": lambda tag: False})
uid = hexlify(tag._nfcid).decode("utf-8")
click.secho("Card successfully detected", fg="green")
click.secho(f"UID: {uid}", fg="white")
click.secho("Please remove the card from the reader", fg="red")
while True:
started = time.time()
after5s = lambda: time.time() - started > 0.5
tag = reader.connect(
rdwr={"on-connect": lambda tag: False}, terminate=after5s
)
if not tag:
break
new_uid = hexlify(tag._nfcid).decode("utf-8")
if uid != new_uid:
break
click.secho("The card has been removed.", fg="green")
except Exception as e:
raise KortClientException(e.args)
return uid
......@@ -18,9 +18,12 @@ IPP_CODES = {y: x for x, y in cups.__dict__.items() if x.startswith("IPP_JOB")}
class PrintClient:
def __init__(self, settings, api):
def __init__(self, settings, api, interactive=False):
self.settings = settings
self.api = api
self.interactive = interactive
self.with_printer = True
self.printer_id = None
self.conn = cups.Connection()
self.card_detectors = CardDetector.get_card_detectors()
......@@ -36,7 +39,7 @@ class PrintClient:
printer_status = "with_errors"
status_text = str(e)
click.secho(
"An error occured, try again in five seconds: {}".format(e),
"An error occurred, try again in five seconds: {}".format(e),
fg="red",
)
if self.card_detector_in_process and self.card_detector:
......@@ -67,16 +70,27 @@ class PrintClient:
raise
def _validate_printer(self):
self.with_printer = self.printer_config.get("cups_printer")
self.card_detector = self.card_detectors.get(
self.printer_config["card_detector"], None
)
if not self.printer_config.get("cups_printer"):
raise KortClientException("No CUPS printer configured")
cups_printers = self.conn.getPrinters()
if self.printer_config["cups_printer"] not in cups_printers:
if not self.with_printer and not self.card_detector:
raise KortClientException(
"CUPS printer {} not found".format(self.printer_config["cups_printer"]),
"No printer or card detector configured for printer {}".format(
self.printer_config["name"]
)
)
if self.with_printer:
cups_printers = self.conn.getPrinters()
if self.printer_config["cups_printer"] not in cups_printers:
raise KortClientException(
"CUPS printer {} not found".format(
self.printer_config["cups_printer"]
),
)
def step(self):
self.printer_config = self.api.get_printer()
print(self.printer_config)
......@@ -85,11 +99,9 @@ class PrintClient:
self._validate_printer()
self.card_detector = self.card_detectors.get(
self.printer_config["card_detector"], None
)
self.card_detector_in_process = False
if self.card_detector:
self.interactive = self.card_detector.interactive
self.card_detector.clear()
next_job = self.api.get_next_job(self.printer_id)
......@@ -118,7 +130,7 @@ class PrintClient:
else:
raise KortClientException("No card detector configured")
if next_job["card"]["chip_number"]:
if self.with_printer and next_job["card"]["chip_number"]:
# Download PDF file
with tempfile.NamedTemporaryFile("wb") as f:
r = requests.get(
......
......@@ -16,13 +16,14 @@ usersettings = "^1.1.5"
requests = "^2.27.1"
pycups = "^2.0.1"
usb-barcode-scanner-julz = "^0.2"
nfcpy = "^1.0.4"
[tool.poetry.dev-dependencies]
safety = "^1.8.5"
flake8 = "^4.0.0"
flake8-fixme = "^1.1.1"
flake8-mypy = "^17.8.0"
flake8-bandit = "^3.0.0"
flake8-bandit = "^4.0.0"
flake8-builtins = "^2.0.0"
flake8-docstrings = "^1.5.0"
flake8-rst-docstrings = "^0.3.0"
......