From a04ad940c8b0bede34c2488af74afc88e51f4d9d Mon Sep 17 00:00:00 2001 From: Caozhenhui <823914102@qq.com> Date: Tue, 11 Jan 2022 10:26:48 +0800 Subject: [PATCH] used bytesIO deal with qrcode --- myems-api/core/meter.py | 40 ++++++------------------------------- myems-api/core/utilities.py | 29 +++++++++++++++++++++++++-- 2 files changed, 33 insertions(+), 36 deletions(-) diff --git a/myems-api/core/meter.py b/myems-api/core/meter.py index 7fc0f6b0..915f2fc0 100644 --- a/myems-api/core/meter.py +++ b/myems-api/core/meter.py @@ -1,4 +1,5 @@ import base64 +import io import os import falcon @@ -10,6 +11,7 @@ import qrcode import qrcode.image.svg from core.useractivity import user_logger, access_control +from core.utilities import qrcode_to_base64 class MeterCollection: @@ -86,22 +88,7 @@ class MeterCollection: result = list() if rows_meters is not None and len(rows_meters) > 0: for row in rows_meters: - file_path = os.path.join(config.upload_path, row['uuid'] + ".svg") - try: - file = open(file_path, "rb") - except IOError: - meter_qrcode = qrcode.QRCode( - version=1, - error_correction=qrcode.ERROR_CORRECT_L, - box_size=10, - border=4 - ) - meter_qrcode.add_data("meter" + row['uuid']) - meter_qrcode.make_image(image_factory=qrcode.image.svg.SvgImage).save(file_path) - file = open(file_path, "rb") - finally: - qrcode_base64 = base64.b64encode(file.read()) - file.close() + meter_qrcode = qrcode_to_base64(data="meter" + row['uuid']) energy_category = energy_category_dict.get(row['energy_category_id'], None) cost_center = cost_center_dict.get(row['cost_center_id'], None) energy_item = energy_item_dict.get(row['energy_item_id'], None) @@ -117,7 +104,7 @@ class MeterCollection: "energy_item": energy_item, "master_meter": master_meter, "description": row['description'], - "qrcode": qrcode_base64} + "qrcode": meter_qrcode} result.append(meta_result) cursor.close() @@ -376,22 +363,7 @@ class MeterItem: raise falcon.HTTPError(falcon.HTTP_404, title='API.NOT_FOUND', description='API.METER_NOT_FOUND') else: - file_path = os.path.join(config.upload_path, row['uuid'] + ".svg") - try: - file = open(file_path, "rb") - except IOError: - meter_qrcode = qrcode.QRCode( - version=1, - error_correction=qrcode.ERROR_CORRECT_L, - box_size=10, - border=4 - ) - meter_qrcode.add_data("meter" + row['uuid']) - meter_qrcode.make_image(image_factory=qrcode.image.svg.SvgImage).save(file_path) - file = open(file_path, "rb") - finally: - qrcode_base64 = base64.b64encode(file.read()) - file.close() + meter_qrcode = qrcode_to_base64(data="meter"+row['uuid']) energy_category = energy_category_dict.get(row['energy_category_id'], None) cost_center = cost_center_dict.get(row['cost_center_id'], None) energy_item = energy_item_dict.get(row['energy_item_id'], None) @@ -407,7 +379,7 @@ class MeterItem: "energy_item": energy_item, "master_meter": master_meter, "description": row['description'], - "qrcode": qrcode_base64} + "qrcode": meter_qrcode} resp.text = json.dumps(meta_result) diff --git a/myems-api/core/utilities.py b/myems-api/core/utilities.py index edf55e4e..df129ac4 100644 --- a/myems-api/core/utilities.py +++ b/myems-api/core/utilities.py @@ -1,8 +1,13 @@ +import base64 import calendar +import io from datetime import datetime, timedelta import mysql.connector import collections from decimal import Decimal +import qrcode.image.svg +import qrcode + import config import statistics @@ -248,7 +253,7 @@ def get_energy_category_tariffs(cost_center_id, energy_category_id, start_dateti query_timeofuse_tariffs = (" SELECT tariff_id, start_time_of_day, end_time_of_day, price " " FROM tbl_tariffs_timeofuses " " WHERE tariff_id IN ( " + ', '.join(map(str, tariff_dict.keys())) + ")" - " ORDER BY tariff_id, start_time_of_day ") + " ORDER BY tariff_id, start_time_of_day ") cursor.execute(query_timeofuse_tariffs, ) rows_timeofuse_tariffs = cursor.fetchall() except Exception as e: @@ -352,7 +357,7 @@ def get_energy_category_peak_types(cost_center_id, energy_category_id, start_dat query_timeofuse_tariffs = (" SELECT tariff_id, start_time_of_day, end_time_of_day, peak_type " " FROM tbl_tariffs_timeofuses " " WHERE tariff_id IN ( " + ', '.join(map(str, tariff_dict.keys())) + ")" - " ORDER BY tariff_id, start_time_of_day ") + " ORDER BY tariff_id, start_time_of_day ") cursor.execute(query_timeofuse_tariffs, ) rows_timeofuse_tariffs = cursor.fetchall() except Exception as e: @@ -1001,3 +1006,23 @@ def statistics_hourly_data_by_period(rows_hourly, start_datetime_utc, end_dateti variance = statistics.variance(sample_data) return result_rows_yearly, mean, median, minimum, maximum, stdev, variance + + +def qrcode_to_base64(version=1, error_correction=qrcode.ERROR_CORRECT_L, box_size=10, border=4, + factory=qrcode.image.svg.SvgImage, data=None): + if version < 1 or version > 40 or \ + box_size < 0 or border < 0 or \ + error_correction not in \ + (qrcode.ERROR_CORRECT_L, qrcode.ERROR_CORRECT_M, qrcode.ERROR_CORRECT_H, qrcode.ERROR_CORRECT_Q): + return " " + qr = qrcode.QRCode( + version=1, + error_correction=qrcode.ERROR_CORRECT_L, + box_size=10, + border=4, + ) + qr.add_data(data) + img = qr.make_image(image_factory=factory) + f = io.BytesIO() + img.save(f) + return base64.b64encode(f.getvalue())