BookingService/utils/views.py

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