final stage of the app

This commit is contained in:
2025-07-15 14:32:57 +03:00
parent 94f006d458
commit b94d2ebbd6
29 changed files with 1498 additions and 1124 deletions

95
app/utils/qr_generator.py Normal file
View File

@@ -0,0 +1,95 @@
"""
QR Code generation utilities
"""
import os
import qrcode
from qrcode.image.styledpil import StyledPilImage
from qrcode.image.styles.moduledrawers import RoundedModuleDrawer, CircleModuleDrawer, SquareModuleDrawer
from PIL import Image
class QRCodeGenerator:
def __init__(self):
self.default_settings = {
'size': 10,
'border': 4,
'error_correction': qrcode.constants.ERROR_CORRECT_M,
'foreground_color': '#000000',
'background_color': '#FFFFFF',
'style': 'square'
}
def generate_qr_code(self, data, settings=None):
"""Generate QR code with custom settings"""
if settings is None:
settings = self.default_settings.copy()
else:
merged_settings = self.default_settings.copy()
merged_settings.update(settings)
settings = merged_settings
# Create QR code instance
qr = qrcode.QRCode(
version=1,
error_correction=settings['error_correction'],
box_size=settings['size'],
border=settings['border'],
)
qr.add_data(data)
qr.make(fit=True)
# For styled QR codes with custom module drawer
if settings['style'] != 'square':
# Choose module drawer based on style
module_drawer = None
if settings['style'] == 'rounded':
module_drawer = RoundedModuleDrawer()
elif settings['style'] == 'circle':
module_drawer = CircleModuleDrawer()
# Generate the styled image
img = qr.make_image(
image_factory=StyledPilImage,
module_drawer=module_drawer,
fill_color=settings['foreground_color'],
back_color=settings['background_color']
)
else:
# Generate standard image with custom colors
img = qr.make_image(
fill_color=settings['foreground_color'],
back_color=settings['background_color']
)
return img
def add_logo(self, qr_img, logo_path, logo_size_ratio=0.2):
"""Add logo to QR code"""
try:
logo = Image.open(logo_path)
# Calculate logo size
qr_width, qr_height = qr_img.size
logo_size = int(min(qr_width, qr_height) * logo_size_ratio)
# Resize logo
logo = logo.resize((logo_size, logo_size), Image.Resampling.LANCZOS)
# Create a white background for the logo
logo_bg = Image.new('RGB', (logo_size + 20, logo_size + 20), 'white')
logo_bg.paste(logo, (10, 10))
# Calculate position to center the logo
logo_pos = (
(qr_width - logo_bg.width) // 2,
(qr_height - logo_bg.height) // 2
)
# Paste logo onto QR code
qr_img.paste(logo_bg, logo_pos)
return qr_img
except Exception as e:
print(f"Error adding logo: {e}")
return qr_img