diff --git "a/app.py" "b/app.py" --- "a/app.py" +++ "b/app.py" @@ -1,5 +1,4 @@ -# -*- coding: utf-8 -*- -from flask import Flask, render_template_string, request, redirect, url_for, send_file +from flask import Flask, render_template_string, request, redirect, url_for import json import os import logging @@ -9,76 +8,42 @@ from datetime import datetime from huggingface_hub import HfApi, hf_hub_download from huggingface_hub.utils import RepositoryNotFoundError from werkzeug.utils import secure_filename -from urllib.parse import quote app = Flask(__name__) -DATA_FILE = 'data.json' +DATA_FILE = 'data_fabrics.json' -REPO_ID = "Kgshop/Mebelhause" +REPO_ID = "Kgshop/Konka" HF_TOKEN_WRITE = os.getenv("HF_TOKEN") HF_TOKEN_READ = os.getenv("HF_TOKEN_READ") -LOGO_URL = "https://huggingface.co/spaces/Mebelhause/Kg/resolve/main/Screenshot_20250411-112027.png" -WHATSAPP_NUMBER = "+996700253966" - -logging.basicConfig(level=logging.INFO) +logging.basicConfig(level=logging.DEBUG) def load_data(): try: download_db_from_hf() with open(DATA_FILE, 'r', encoding='utf-8') as file: data = json.load(file) - logging.info("Данные успешно загружены из JSON") if not isinstance(data, dict) or 'products' not in data or 'categories' not in data: - logging.warning("Структура данных некорректна, используется структура по умолчанию.") return {'products': [], 'categories': []} - # Ensure products and categories are lists - if not isinstance(data.get('products'), list): - data['products'] = [] - if not isinstance(data.get('categories'), list): - data['categories'] = [] return data except FileNotFoundError: - logging.warning("Локальный файл базы данных не найден. Создание пустой базы.") return {'products': [], 'categories': []} except json.JSONDecodeError: - logging.error("Ошибка: Невозможно декодировать JSON файл. Возврат пустой базы.") return {'products': [], 'categories': []} except RepositoryNotFoundError: - logging.error("Репозиторий Hugging Face не найден. Создание локальной базы данных.") - # Create an empty file if it doesn't exist locally after repo not found - if not os.path.exists(DATA_FILE): - with open(DATA_FILE, 'w', encoding='utf-8') as f: - json.dump({'products': [], 'categories': []}, f) return {'products': [], 'categories': []} - except Exception as e: - logging.error(f"Произошла ошибка при загрузке данных: {e}. Возврат пустой базы.") + except Exception: return {'products': [], 'categories': []} def save_data(data): try: - # Ensure structure is correct before saving - if 'products' not in data or not isinstance(data['products'], list): - data['products'] = [] - if 'categories' not in data or not isinstance(data['categories'], list): - data['categories'] = [] - with open(DATA_FILE, 'w', encoding='utf-8') as file: json.dump(data, file, ensure_ascii=False, indent=4) - logging.info("Данные успешно сохранены в JSON") upload_db_to_hf() - except Exception as e: - logging.error(f"Ошибка при сохранении данных: {e}") - # Optionally re-raise or handle differently - # raise + except Exception: + raise def upload_db_to_hf(): - if not HF_TOKEN_WRITE: - logging.warning("HF_TOKEN (write) не установлен. Загрузка на Hugging Face пропущена.") - return - if not os.path.exists(DATA_FILE): - logging.warning(f"Файл {DATA_FILE} не найден для загрузки.") - return try: api = HfApi() api.upload_file( @@ -87,22 +52,12 @@ def upload_db_to_hf(): repo_id=REPO_ID, repo_type="dataset", token=HF_TOKEN_WRITE, - commit_message=f"Автоматическое резервное копирование базы данных {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}" + commit_message=f"Backup {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}" ) - logging.info("Резервная копия JSON базы успешно загружена на Hugging Face.") - except RepositoryNotFoundError: - logging.error(f"Репозиторий {REPO_ID} не найден на Hugging Face. Не удалось загрузить.") - except Exception as e: - logging.error(f"Ошибка при загрузке резервной копии на Hugging Face: {e}") - + except Exception: + pass def download_db_from_hf(): - if not HF_TOKEN_READ: - logging.warning("HF_TOKEN_READ не установлен. Скачивание с Hugging Face пропущено.") - # Attempt to create an empty file if none exists - if not os.path.exists(DATA_FILE): - save_data({'products': [], 'categories': []}) # Save an empty structure - return try: hf_hub_download( repo_id=REPO_ID, @@ -110,585 +65,22 @@ def download_db_from_hf(): repo_type="dataset", token=HF_TOKEN_READ, local_dir=".", - local_dir_use_symlinks=False, - force_download=True, # Ensure we get the latest version - resume_download=False # Avoid issues with partial downloads + local_dir_use_symlinks=False ) - logging.info("JSON база успешно скачана из Hugging Face.") - # Verify file integrity after download - try: - with open(DATA_FILE, 'r', encoding='utf-8') as f: - json.load(f) - logging.info("Проверка целостности JSON после скачивания: OK") - except (json.JSONDecodeError, FileNotFoundError) as e: - logging.error(f"Ошибка проверки JSON после скачивания: {e}. Файл может быть поврежден или пуст.") - # Attempt to create a default empty file if it's broken - save_data({'products': [], 'categories': []}) - - except RepositoryNotFoundError as e: - logging.error(f"Репозиторий {REPO_ID} не найден на Hugging Face: {e}") - if not os.path.exists(DATA_FILE): - save_data({'products': [], 'categories': []}) # Save an empty structure - # Do not raise here, allow fallback to local/empty data - except Exception as e: - # Catch specific hf_hub exceptions if needed, e.g., HTTPError - logging.error(f"Ошибка при скачивании JSON базы из Hugging Face: {e}") - if not os.path.exists(DATA_FILE): - save_data({'products': [], 'categories': []}) # Save an empty structure - # Do not raise here, allow fallback to local/empty data + except RepositoryNotFoundError: + raise + except Exception: + raise def periodic_backup(): while True: - time.sleep(800) # Sleep first to avoid immediate backup on start - logging.info("Запуск периодического резервного копирования...") - # Ensure data is loaded before backup attempt - try: - load_data() # Reload potentially updated data - except Exception as e: - logging.error(f"Ошибка загрузки данных перед бэкапом: {e}") - # Now attempt upload upload_db_to_hf() + time.sleep(800) -# --- Global Styles --- -GLOBAL_STYLES = """ - - - - -""" - -# --- Landing Page --- @app.route('/') -def landing(): - landing_html = ''' - - - - - - Mebel Hause KG - Изготовление мебели на заказ - ''' + GLOBAL_STYLES + ''' - - - -
- - -
- -
-

Mebel Hause KG

-

Создаем мебель вашей мечты с любовью и мастерством

- Смотреть готовые изделия -
- -
-
-

Почему выбирают нас?

-
-
- -

Индивидуальный дизайн

-

Разработаем уникальный проект под ваш интерьер и пожелания.

-
-
- -

Точные замеры

-

Гарантируем идеальное соответствие мебели вашему пространству.

-
-
- -

Качественные материалы

-

Используем только проверенные и долговечные материалы.

-
-
- -

Своевременная доставка

-

Доставим и соберем вашу новую мебель точно в срок.

-
-
-
- -
-

Рассчитать стоимость мебели

-

Заполните форму ниже, и мы свяжемся с вами для уточнения деталей и расчета.

-
- - - - - - - - - - - - - -
-
- -
-

Свяжитесь с нами

-

Готовы обсудить ваш проект? Напишите нам в WhatsApp или позвоните!

-

Телефон / WhatsApp: {{ whatsapp_number_display }}

-

Мы находимся в Бишкеке.

-
- -
- - - - - - - - - - - - ''' - # Format number for display - whatsapp_display = f"+{WHATSAPP_NUMBER[0]} ({WHATSAPP_NUMBER[1:4]}) {WHATSAPP_NUMBER[4:7]}-{WHATSAPP_NUMBER[7:10]}-{WHATSAPP_NUMBER[10:]}" - return render_template_string( - landing_html, - logo_url=LOGO_URL, - whatsapp_number=WHATSAPP_NUMBER, - whatsapp_number_display=whatsapp_display, - current_year=datetime.now().year - ) - -# --- Catalog Page --- -@app.route('/catalog') def catalog(): data = load_data() - products = data.get('products', []) - categories = data.get('categories', []) + products = data['products'] catalog_html = ''' @@ -696,317 +88,133 @@ def catalog(): - Каталог готовой мебели - Mebel Hause KG - ''' + GLOBAL_STYLES + ''' + Учет и Каталог Тканей + + + -
- - - - -
- -
-

Каталог готовых изделий

-

Ознакомьтесь с нашими работами. Возможно, что-то из этого подойдет именно вам!

- -
- - {% for category in categories %} - - {% endfor %} +
+
+

Каталог Тканей

+ +
+
+

Наш адрес

+

Рынок Мадина, ряд 5, контейнер 42

- +
{% for product in products %}
+ + {% if product.get('photos') and product['photos']|length > 0 %}
- {% if product.get('photos') and product['photos']|length > 0 %} - {{ product['name'] }} +
+ {% endif %} + {% if product.get('wholesale_price') and product.get('min_wholesale') %} + Опт от {{ product['min_wholesale'] }} рул. + {% endif %} + {% if product.get('discount') %} + Скидка {{ product['discount'] }}% + {% endif %} +

{{ product.get('name', '') }}

+
+ {% if product.get('discount') %} + {{ product.get('price', 0) }} с + {{ (product.get('price', 0) * (1 - product['discount'] / 100))|round(2) }} с / рул. + Скидка: {{ product['discount'] }}% {% else %} - Нет фото + {{ product.get('price', 0) }} с / рул. + {% endif %} + {% if product.get('wholesale_price') and product.get('min_wholesale') %} + Опт: {{ product['wholesale_price'] }} с {% endif %}
-
-
-

{{ product['name'] }}

-
{{ product['price'] }} сом
-

{{ product['description'] }}

-
-
- - -
-
+

{{ product.get('description', '')[:50] }}{% if product.get('description', '')|length > 50 %}...{% endif %}

+
- {% else %} -

В каталоге пока нет товаров.

{% endfor %}
@@ -1021,635 +229,561 @@ def catalog():