101 lines
3.1 KiB
Python
101 lines
3.1 KiB
Python
import os
|
|
import time
|
|
import zipfile
|
|
from io import BytesIO
|
|
|
|
import qrcode
|
|
from PIL import Image, ImageDraw, ImageFont
|
|
from django.conf import settings
|
|
from django.http.response import HttpResponse
|
|
from django.shortcuts import get_object_or_404
|
|
from rest_framework import permissions
|
|
from rest_framework import views
|
|
from rest_framework.exceptions import APIException
|
|
from rest_framework.response import Response
|
|
|
|
from booking.models import Room
|
|
from utils.models import UploadFile
|
|
|
|
|
|
class UploadFileAPI(views.APIView):
|
|
permission_classes = (permissions.IsAuthenticated,)
|
|
|
|
def post(self, request):
|
|
file = request.FILES['file']
|
|
filename = file.name
|
|
file.name = f'{int(time.time())}_{filename}'
|
|
f = UploadFile.objects.create(
|
|
name=filename,
|
|
file=file,
|
|
)
|
|
return Response({
|
|
'id': f.id,
|
|
'url': f.get_url()
|
|
})
|
|
|
|
|
|
class QRCodeAPI(views.APIView):
|
|
permission_classes = (permissions.IsAdminUser,)
|
|
|
|
def get(self, request):
|
|
data = {}
|
|
for key in request.query_params:
|
|
data[key] = request.query_params[key]
|
|
try:
|
|
stream = create_qrcode(data)
|
|
except Exception as e:
|
|
raise APIException(e)
|
|
return HttpResponse(stream.getvalue(), content_type="image/png")
|
|
|
|
|
|
class DownloadAllQRCodeByRoomAPI(views.APIView):
|
|
permission_classes = (permissions.IsAdminUser,)
|
|
|
|
def get(self, request):
|
|
room_id = request.query_params.get('room')
|
|
room = get_object_or_404(Room, id=room_id)
|
|
seat_qrcode_stream_list = []
|
|
seat_name_list = []
|
|
try:
|
|
for seat in room.seat_set.all():
|
|
data = {
|
|
'type': 'seat',
|
|
'name': seat.name,
|
|
'id': seat.id
|
|
}
|
|
seat_qrcode_stream_list.append(create_qrcode(data))
|
|
seat_name_list.append(seat.name)
|
|
|
|
zip = BytesIO()
|
|
with zipfile.ZipFile(zip, 'w', zipfile.ZIP_DEFLATED) as zf:
|
|
for index, file in enumerate(seat_qrcode_stream_list):
|
|
zf.writestr(f'座位-{seat_name_list[index]}.png', file.getvalue())
|
|
except Exception as e:
|
|
raise APIException(e)
|
|
return HttpResponse(zip.getvalue(), content_type="application/zip")
|
|
|
|
|
|
def _create_qrcode(data):
|
|
qr = qrcode.QRCode(
|
|
version=1,
|
|
error_correction=qrcode.constants.ERROR_CORRECT_H,
|
|
box_size=10,
|
|
border=4,
|
|
)
|
|
qr.add_data(data)
|
|
qr.make(fit=True)
|
|
qrcode_img = qr.make_image()
|
|
return qrcode_img
|
|
|
|
|
|
def create_qrcode(data):
|
|
img = _create_qrcode(data).convert('RGBA')
|
|
tagged_img = Image.new(img.mode, (img.size[0], img.size[1] + 40), (255, 255, 255))
|
|
tagged_img.paste(img, (0, 0))
|
|
draw = ImageDraw.Draw(tagged_img)
|
|
font = ImageFont.truetype(os.path.join(settings.BASE_DIR, 'utils', 'font', 'SourceHanSansCN.otf'), 40)
|
|
draw.text((40, img.size[1] - 20), f'{data["type"].upper()} - {data["name"]}', font=font, fill=(0, 0, 0))
|
|
stream = BytesIO()
|
|
tagged_img.save(stream, 'png')
|
|
return stream
|