diff --git a/compensation/views/compensation/report.py b/compensation/views/compensation/report.py index 077367dd..f7fec85f 100644 --- a/compensation/views/compensation/report.py +++ b/compensation/views/compensation/report.py @@ -14,7 +14,7 @@ from compensation.models import Compensation from konova.contexts import BaseContext from konova.forms import SimpleGeomForm 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 @@ -48,10 +48,14 @@ class CompensationPublicReportView(AbstractPublicReportView): ) parcels = comp.get_underlying_parcels() - qrcode_url = request.build_absolute_uri(reverse("compensation:report", args=(id,))) - qrcode_img = generate_qr_code(qrcode_url, 10) - qrcode_lanis_url = comp.get_LANIS_link() - qrcode_img_lanis = generate_qr_code(qrcode_lanis_url, 7) + qrcode = QrCode( + content=request.build_absolute_uri(reverse("compensation:report", args=(id,))), + size=10 + ) + qrcode_lanis = QrCode( + content=comp.get_LANIS_link(), + size=7 + ) # Order states by surface before_states = comp.before_states.all().order_by("-surface").prefetch_related("biotope_type") @@ -61,12 +65,12 @@ class CompensationPublicReportView(AbstractPublicReportView): context = { "obj": comp, "qrcode": { - "img": qrcode_img, - "url": qrcode_url, + "img": qrcode.get_img(), + "url": qrcode.get_content(), }, "qrcode_lanis": { - "img": qrcode_img_lanis, - "url": qrcode_lanis_url, + "img": qrcode_lanis.get_img(), + "url": qrcode_lanis.get_content(), }, "is_entry_shared": False, # disables action buttons during rendering "before_states": before_states, diff --git a/compensation/views/eco_account/report.py b/compensation/views/eco_account/report.py index 494c4c8e..beb53cd9 100644 --- a/compensation/views/eco_account/report.py +++ b/compensation/views/eco_account/report.py @@ -14,7 +14,7 @@ from compensation.models import EcoAccount from konova.contexts import BaseContext from konova.forms import SimpleGeomForm 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 @@ -48,10 +48,14 @@ class EcoAccountPublicReportView(AbstractPublicReportView): ) parcels = acc.get_underlying_parcels() - qrcode_url = request.build_absolute_uri(reverse("compensation:acc:report", args=(id,))) - qrcode_img = generate_qr_code(qrcode_url, 10) - qrcode_lanis_url = acc.get_LANIS_link() - qrcode_img_lanis = generate_qr_code(qrcode_lanis_url, 7) + qrcode = QrCode( + content=request.build_absolute_uri(reverse("compensation:acc:report", args=(id,))), + size=10 + ) + qrcode_lanis = QrCode( + content=acc.get_LANIS_link(), + size=7 + ) # Order states by surface before_states = acc.before_states.all().order_by("-surface").select_related("biotope_type__parent") @@ -67,12 +71,12 @@ class EcoAccountPublicReportView(AbstractPublicReportView): context = { "obj": acc, "qrcode": { - "img": qrcode_img, - "url": qrcode_url, + "img": qrcode.get_img(), + "url": qrcode.get_content(), }, "qrcode_lanis": { - "img": qrcode_img_lanis, - "url": qrcode_lanis_url, + "img": qrcode_lanis.get_img(), + "url": qrcode_lanis.get_content(), }, "is_entry_shared": False, # disables action buttons during rendering "before_states": before_states, diff --git a/ema/views/report.py b/ema/views/report.py index e9c54f13..058b93b7 100644 --- a/ema/views/report.py +++ b/ema/views/report.py @@ -14,7 +14,7 @@ from ema.models import Ema from konova.contexts import BaseContext from konova.forms import SimpleGeomForm 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 @@ -48,10 +48,14 @@ class EmaPublicReportView(AbstractPublicReportView): ) parcels = ema.get_underlying_parcels() - qrcode_url = request.build_absolute_uri(reverse("ema:report", args=(id,))) - qrcode_img = generate_qr_code(qrcode_url, 10) - qrcode_lanis_url = ema.get_LANIS_link() - qrcode_img_lanis = generate_qr_code(qrcode_lanis_url, 7) + qrcode = QrCode( + content=request.build_absolute_uri(reverse("ema:report", args=(id,))), + size=10 + ) + qrcode_lanis = QrCode( + content=ema.get_LANIS_link(), + size=7 + ) # Order states by surface before_states = ema.before_states.all().order_by("-surface").prefetch_related("biotope_type") @@ -61,12 +65,12 @@ class EmaPublicReportView(AbstractPublicReportView): context = { "obj": ema, "qrcode": { - "img": qrcode_img, - "url": qrcode_url + "img": qrcode.get_img(), + "url": qrcode.get_content(), }, "qrcode_lanis": { - "img": qrcode_img_lanis, - "url": qrcode_lanis_url + "img": qrcode_lanis.get_img(), + "url": qrcode_lanis.get_content(), }, "is_entry_shared": False, # disables action buttons during rendering "before_states": before_states, diff --git a/intervention/views/report.py b/intervention/views/report.py index 01ad7025..708717a7 100644 --- a/intervention/views/report.py +++ b/intervention/views/report.py @@ -14,7 +14,7 @@ from intervention.models import Intervention from konova.contexts import BaseContext from konova.forms import SimpleGeomForm 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 @@ -52,21 +52,26 @@ class InterventionPublicReportView(AbstractPublicReportView): distinct_deductions = intervention.deductions.all().distinct( "account" ) - qrcode_url = request.build_absolute_uri(reverse("intervention:report", args=(id,))) - qrcode_img = generate_qr_code(qrcode_url, 10) - qrcode_lanis_url = intervention.get_LANIS_link() - qrcode_img_lanis = generate_qr_code(qrcode_lanis_url, 7) + + qrcode = QrCode( + content=request.build_absolute_uri(reverse("intervention:report", args=(id,))), + size=10 + ) + qrcode_lanis = QrCode( + content=intervention.get_LANIS_link(), + size=7 + ) context = { "obj": intervention, "deductions": distinct_deductions, "qrcode": { - "img": qrcode_img, - "url": qrcode_url, + "img": qrcode.get_img(), + "url": qrcode.get_content(), }, "qrcode_lanis": { - "img": qrcode_img_lanis, - "url": qrcode_lanis_url, + "img": qrcode_lanis.get_img(), + "url": qrcode_lanis.get_content(), }, "geom_form": geom_form, "parcels": parcels, diff --git a/konova/utils/generators.py b/konova/utils/generators.py index d21b0437..d1980bc2 100644 --- a/konova/utils/generators.py +++ b/konova/utils/generators.py @@ -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)) 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: _MODEL = None diff --git a/konova/utils/qrcode.py b/konova/utils/qrcode.py new file mode 100644 index 00000000..e1498553 --- /dev/null +++ b/konova/utils/qrcode.py @@ -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