From 8f47f0248e5ddec9c9afcb8e08e87ddf1118aa66 Mon Sep 17 00:00:00 2001 From: Rostislav Orlovskyi Date: Thu, 27 Jun 2024 16:51:28 +0300 Subject: [PATCH] first_commit --- db_to_xlsx.py | 67 ++++++++++++++++++++++++++++ models.py | 114 +++++++++++++++++++++++++++++++++++++++++++++++ requirements.txt | Bin 0 -> 210 bytes 3 files changed, 181 insertions(+) create mode 100644 db_to_xlsx.py create mode 100644 models.py create mode 100644 requirements.txt diff --git a/db_to_xlsx.py b/db_to_xlsx.py new file mode 100644 index 0000000..1b13e30 --- /dev/null +++ b/db_to_xlsx.py @@ -0,0 +1,67 @@ +import openpyxl +from openpyxl.drawing.image import Image +import requests +from io import BytesIO + +from models import Product + +# Отримання товарів із фото +try: + selected_products = Product.select().where(Product.photo_url.is_null(False)).limit(20) +except Exception as e: + print(f"Виникла помилка: {e}") + + +# Створення воркбуку та аркушу +wb = openpyxl.Workbook() +ws = wb.active +ws.title = "Sheet" +# Захист об'єктів +ws.protection.objects = True +ws.protection.password = '' + +# Зміна ширини стовпця до 200px +ws.column_dimensions["A"].width = ws.column_dimensions["B"].width = 200 / 7 # встановлюємо ширину стовпця у символах + +# Додавання назви та фото товару до аркушу ws +def add_to_file(product, row_num): + + # Встановлення висоти рядка 200px + ws.row_dimensions[row_num].height = 200 * 0.75 + + try: + # Отримання зображення + response = requests.get(product.photo_url) + img_data = BytesIO(response.content) + # Об'єкт зображення + img = Image(img_data) + + # Додаємо зображення на лист + ws.add_image(img, 'B' + str(row_num)) + + except requests.exceptions.HTTPError as http_err: + print(f"HTTP помилка: {http_err}") + except requests.exceptions.RequestException as req_err: + print(f"Помилка запиту: {req_err}") + + + # Координати клітинки назви товару + name_coordinates = 'A' + str(row_num) + # Запис назви товару + ws[name_coordinates] = selected_products[i].product_name + # Стилізація: перенесення тексту, позиціювання по центру у вертикалі + ws[name_coordinates].alignment = openpyxl.styles.Alignment(vertical='center', wrap_text=True) + +#Запис до файлу +for i in range(len(selected_products)): + + # Виклик функції запису + add_to_file(selected_products[i], i+1) + + + + +# Встановлюємо захист для всього листа з паролем +ws.protection.enable() +# Збережння файлу +wb.save("products.xlsx") diff --git a/models.py b/models.py new file mode 100644 index 0000000..2912a48 --- /dev/null +++ b/models.py @@ -0,0 +1,114 @@ +import os +import datetime +from dotenv import load_dotenv +from peewee import * + + +load_dotenv() + +DATABASE_L = os.getenv("DATABASE_L") +DB_HOST_L = os.getenv("DB_HOST_L") +USERS_L = os.getenv("USERS_L") +PASSW_L = os.getenv("PASSW_L") + +db = MySQLDatabase( + database=DATABASE_L, user=USERS_L, password=PASSW_L, host=DB_HOST_L, port=3306, autocommit=True +) + + +class ProductParameter(Model): + id = AutoField(primary_key=True) + parameter_name = CharField(max_length=50, unique=True) # Название параметра + + class Meta: + database = db + table_name = "product_parameters" + + +# Модель для хранения информации о категориях товаров +class ProductCategory(Model): + id = AutoField(primary_key=True) + category_name = CharField(max_length=50) # Название категории + id_1c_d = CharField(max_length=50, unique=True) + is_active = BooleanField(default=1, null=True) + + class Meta: + database = db + table_name = "product_categories" + + +# Модель для хранения информации о товарах +class Product(Model): + id = AutoField(primary_key=True) + id_1c = CharField(max_length=50, unique=True) # ID из 1C + vendor_code = CharField(max_length=50, null=True) + product_name = CharField(max_length=255, null=True) # Название товара + description = TextField(null=True) # Описание товара + price_rrc = FloatField(null=True) # Цена 1 + price_drop = FloatField(null=True) # Цена 2 + price_opt = FloatField(null=True) # Цена 3 + price_large_opt = FloatField(null=True) # Цена 4 + price_drop_pro = FloatField(null=True) # Цена 5 + price_os_kripto_to = FloatField(null=True) # Цена 6 + price_hot = FloatField(null=True) # Цена 6 + price_rozetka = FloatField(null=True) + price_epicenter = FloatField(null=True) + price_allo = FloatField(null=True) + category = ForeignKeyField(ProductCategory, backref='products') + os_lugi = CharField(max_length=50, null=True) # ID площадки 1 + prom_lugi = CharField(max_length=50, null=True) # ID площадки 2 + prom_hot = CharField(max_length=50, null=True) # ID площадки 3 + rozetka = CharField(max_length=50, null=True) # ID площадки 4 + crm_id = CharField(max_length=50, null=True) # ID площадки 5 + platform_6_id = CharField(max_length=50, null=True) # ID площадки 6 + photo_url = TextField(null=True) # Ссылка на фото + url_to_shop = TextField(null=True) + weight = FloatField(null=True) # Вес + length = FloatField(null=True) # Длина + width = FloatField(null=True) # Ширина + height = FloatField(null=True) # Высота + quantity = IntegerField(null=True) # Количество + last_updated = DateTimeField(default=datetime.datetime.now) + sort = IntegerField(default=55, null=True) + + class Meta: + database = db + table_name = "products_lugi" + + +# Модель для хранения значений параметров товаров +class ProductParameterValue(Model): + id = AutoField(primary_key=True) + product = ForeignKeyField(Product, backref='product_parameter_values') + parameter = ForeignKeyField(ProductParameter, backref='parameter_values') + value = CharField() # Значение параметра + + class Meta: + database = db + table_name = "product_parameter_values" + + +# Модель для хранения информации об акциях +class ProductPromotion(Model): + id = AutoField(primary_key=True) + product_id = ForeignKeyField(Product, backref='product_promotions') + discount_rrc = IntegerField(null=True) # Скидка в процентах + discount_drop = IntegerField(null=True) + discount_drop_pro = IntegerField(null=True) + discount_opt = IntegerField(null=True) + discount_large_opt = IntegerField(null=True) + discount_hot = IntegerField(null=True) + discount_prom = IntegerField(null=True) + start_date = DateTimeField(null=True) # Дата начала акции + end_date = DateTimeField(null=True) # Дата окончания акции + last_updated = DateTimeField(default=datetime.datetime.now) + + class Meta: + database = db + table_name = "product_promotion" + + +# Создание таблиц в базе данных +if __name__ == "__main__": + with db: + db.create_tables([Product, ProductParameter, ProductParameterValue, ProductPromotion, ProductCategory]) diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000000000000000000000000000000000000..5ebf193ed5ba986be9513b58d0bccc3dbcf68009 GIT binary patch literal 210 zcmYk0Q3}E^7=!aHcofC0ich%_PAN!3TL;wH) literal 0 HcmV?d00001