# QR code

* refactors qr code generating into class
* refactors usage of former qr code method calls
This commit is contained in:
mpeltriaux 2025-12-14 16:43:31 +01:00
parent e4c459f92e
commit a2bda8d230
6 changed files with 100 additions and 58 deletions

View File

@ -14,7 +14,7 @@ from compensation.models import Compensation
from konova.contexts import BaseContext from konova.contexts import BaseContext
from konova.forms import SimpleGeomForm from konova.forms import SimpleGeomForm
from konova.sub_settings.context_settings import TAB_TITLE_IDENTIFIER from konova.sub_settings.context_settings import TAB_TITLE_IDENTIFIER
from konova.utils.generators import generate_qr_code from konova.utils.qrcode import QrCode
from konova.views.report import AbstractPublicReportView from konova.views.report import AbstractPublicReportView
@ -48,10 +48,14 @@ class CompensationPublicReportView(AbstractPublicReportView):
) )
parcels = comp.get_underlying_parcels() parcels = comp.get_underlying_parcels()
qrcode_url = request.build_absolute_uri(reverse("compensation:report", args=(id,))) qrcode = QrCode(
qrcode_img = generate_qr_code(qrcode_url, 10) content=request.build_absolute_uri(reverse("compensation:report", args=(id,))),
qrcode_lanis_url = comp.get_LANIS_link() size=10
qrcode_img_lanis = generate_qr_code(qrcode_lanis_url, 7) )
qrcode_lanis = QrCode(
content=comp.get_LANIS_link(),
size=7
)
# Order states by surface # Order states by surface
before_states = comp.before_states.all().order_by("-surface").prefetch_related("biotope_type") before_states = comp.before_states.all().order_by("-surface").prefetch_related("biotope_type")
@ -61,12 +65,12 @@ class CompensationPublicReportView(AbstractPublicReportView):
context = { context = {
"obj": comp, "obj": comp,
"qrcode": { "qrcode": {
"img": qrcode_img, "img": qrcode.get_img(),
"url": qrcode_url, "url": qrcode.get_content(),
}, },
"qrcode_lanis": { "qrcode_lanis": {
"img": qrcode_img_lanis, "img": qrcode_lanis.get_img(),
"url": qrcode_lanis_url, "url": qrcode_lanis.get_content(),
}, },
"is_entry_shared": False, # disables action buttons during rendering "is_entry_shared": False, # disables action buttons during rendering
"before_states": before_states, "before_states": before_states,

View File

@ -14,7 +14,7 @@ from compensation.models import EcoAccount
from konova.contexts import BaseContext from konova.contexts import BaseContext
from konova.forms import SimpleGeomForm from konova.forms import SimpleGeomForm
from konova.sub_settings.context_settings import TAB_TITLE_IDENTIFIER from konova.sub_settings.context_settings import TAB_TITLE_IDENTIFIER
from konova.utils.generators import generate_qr_code from konova.utils.qrcode import QrCode
from konova.views.report import AbstractPublicReportView from konova.views.report import AbstractPublicReportView
@ -48,10 +48,14 @@ class EcoAccountPublicReportView(AbstractPublicReportView):
) )
parcels = acc.get_underlying_parcels() parcels = acc.get_underlying_parcels()
qrcode_url = request.build_absolute_uri(reverse("compensation:acc:report", args=(id,))) qrcode = QrCode(
qrcode_img = generate_qr_code(qrcode_url, 10) content=request.build_absolute_uri(reverse("compensation:acc:report", args=(id,))),
qrcode_lanis_url = acc.get_LANIS_link() size=10
qrcode_img_lanis = generate_qr_code(qrcode_lanis_url, 7) )
qrcode_lanis = QrCode(
content=acc.get_LANIS_link(),
size=7
)
# Order states by surface # Order states by surface
before_states = acc.before_states.all().order_by("-surface").select_related("biotope_type__parent") before_states = acc.before_states.all().order_by("-surface").select_related("biotope_type__parent")
@ -67,12 +71,12 @@ class EcoAccountPublicReportView(AbstractPublicReportView):
context = { context = {
"obj": acc, "obj": acc,
"qrcode": { "qrcode": {
"img": qrcode_img, "img": qrcode.get_img(),
"url": qrcode_url, "url": qrcode.get_content(),
}, },
"qrcode_lanis": { "qrcode_lanis": {
"img": qrcode_img_lanis, "img": qrcode_lanis.get_img(),
"url": qrcode_lanis_url, "url": qrcode_lanis.get_content(),
}, },
"is_entry_shared": False, # disables action buttons during rendering "is_entry_shared": False, # disables action buttons during rendering
"before_states": before_states, "before_states": before_states,

View File

@ -14,7 +14,7 @@ from ema.models import Ema
from konova.contexts import BaseContext from konova.contexts import BaseContext
from konova.forms import SimpleGeomForm from konova.forms import SimpleGeomForm
from konova.sub_settings.context_settings import TAB_TITLE_IDENTIFIER from konova.sub_settings.context_settings import TAB_TITLE_IDENTIFIER
from konova.utils.generators import generate_qr_code from konova.utils.qrcode import QrCode
from konova.views.report import AbstractPublicReportView from konova.views.report import AbstractPublicReportView
@ -48,10 +48,14 @@ class EmaPublicReportView(AbstractPublicReportView):
) )
parcels = ema.get_underlying_parcels() parcels = ema.get_underlying_parcels()
qrcode_url = request.build_absolute_uri(reverse("ema:report", args=(id,))) qrcode = QrCode(
qrcode_img = generate_qr_code(qrcode_url, 10) content=request.build_absolute_uri(reverse("ema:report", args=(id,))),
qrcode_lanis_url = ema.get_LANIS_link() size=10
qrcode_img_lanis = generate_qr_code(qrcode_lanis_url, 7) )
qrcode_lanis = QrCode(
content=ema.get_LANIS_link(),
size=7
)
# Order states by surface # Order states by surface
before_states = ema.before_states.all().order_by("-surface").prefetch_related("biotope_type") before_states = ema.before_states.all().order_by("-surface").prefetch_related("biotope_type")
@ -61,12 +65,12 @@ class EmaPublicReportView(AbstractPublicReportView):
context = { context = {
"obj": ema, "obj": ema,
"qrcode": { "qrcode": {
"img": qrcode_img, "img": qrcode.get_img(),
"url": qrcode_url "url": qrcode.get_content(),
}, },
"qrcode_lanis": { "qrcode_lanis": {
"img": qrcode_img_lanis, "img": qrcode_lanis.get_img(),
"url": qrcode_lanis_url "url": qrcode_lanis.get_content(),
}, },
"is_entry_shared": False, # disables action buttons during rendering "is_entry_shared": False, # disables action buttons during rendering
"before_states": before_states, "before_states": before_states,

View File

@ -14,7 +14,7 @@ from intervention.models import Intervention
from konova.contexts import BaseContext from konova.contexts import BaseContext
from konova.forms import SimpleGeomForm from konova.forms import SimpleGeomForm
from konova.sub_settings.context_settings import TAB_TITLE_IDENTIFIER from konova.sub_settings.context_settings import TAB_TITLE_IDENTIFIER
from konova.utils.generators import generate_qr_code from konova.utils.qrcode import QrCode
from konova.views.report import AbstractPublicReportView from konova.views.report import AbstractPublicReportView
@ -52,21 +52,26 @@ class InterventionPublicReportView(AbstractPublicReportView):
distinct_deductions = intervention.deductions.all().distinct( distinct_deductions = intervention.deductions.all().distinct(
"account" "account"
) )
qrcode_url = request.build_absolute_uri(reverse("intervention:report", args=(id,)))
qrcode_img = generate_qr_code(qrcode_url, 10) qrcode = QrCode(
qrcode_lanis_url = intervention.get_LANIS_link() content=request.build_absolute_uri(reverse("intervention:report", args=(id,))),
qrcode_img_lanis = generate_qr_code(qrcode_lanis_url, 7) size=10
)
qrcode_lanis = QrCode(
content=intervention.get_LANIS_link(),
size=7
)
context = { context = {
"obj": intervention, "obj": intervention,
"deductions": distinct_deductions, "deductions": distinct_deductions,
"qrcode": { "qrcode": {
"img": qrcode_img, "img": qrcode.get_img(),
"url": qrcode_url, "url": qrcode.get_content(),
}, },
"qrcode_lanis": { "qrcode_lanis": {
"img": qrcode_img_lanis, "img": qrcode_lanis.get_img(),
"url": qrcode_lanis_url, "url": qrcode_lanis.get_content(),
}, },
"geom_form": geom_form, "geom_form": geom_form,
"parcels": parcels, "parcels": parcels,

View File

@ -42,28 +42,6 @@ def generate_random_string(length: int, use_numbers: bool = False, use_letters_l
ret_val = "".join(random.choice(elements) for i in range(length)) ret_val = "".join(random.choice(elements) for i in range(length))
return ret_val return ret_val
def generate_qr_code(content: str, size: int = 20) -> str:
""" Generates a qr code from given content
Args:
content (str): The content for the qr code
size (int): The image size
Returns:
qrcode_svg (str): The qr code as svg
"""
qrcode_factory = qrcode.image.svg.SvgImage
qrcode_img = qrcode.make(
content,
image_factory=qrcode_factory,
box_size=size
)
stream = BytesIO()
qrcode_img.save(stream)
return stream.getvalue().decode()
class IdentifierGenerator: class IdentifierGenerator:
_MODEL = None _MODEL = None

47
konova/utils/qrcode.py Normal file
View File

@ -0,0 +1,47 @@
"""
Author: Michel Peltriaux
Created on: 14.12.25
"""
from io import BytesIO
import qrcode
import qrcode.image.svg as svg
class QrCode:
""" A wrapping class for creating a qr code with content
"""
_content = None
_img = None
def __init__(self, content: str, size: int):
self._content = content
self._img = self._generate_qr_code(content, size)
def _generate_qr_code(self, content: str, size: int = 20) -> str:
""" Generates a qr code from given content
Args:
content (str): The content for the qr code
size (int): The image size
Returns:
qrcode_svg (str): The qr code as svg
"""
img_factory = svg.SvgImage
qrcode_img = qrcode.make(
content,
image_factory=img_factory,
box_size=size
)
stream = BytesIO()
qrcode_img.save(stream)
return stream.getvalue().decode()
def get_img(self):
return self._img
def get_content(self):
return self._content