Resell1/main.py

204 lines
7.6 KiB
Python

import flet as ft
from modules import logger, login, backend, product_filter, export
from modules.setting_manager import SettingsManager
from modules.db_manager import DBeManager
import logging
# 전역 변수 (데모용 데이터 저장)
market_list = []
sold_products = []
filtered_products = []
sourced_products = []
def main(page: ft.Page):
page.title = "Modern Market and Product Manager"
page.window_width = 1000
page.window_height = 700
# 하단 로그 출력용 텍스트 위젯
log_display = ft.Text(value="", size=12)
def gui_log_callback(formatted_message: str):
log_display.value += formatted_message + "\n"
page.update()
# 로거, 설정 관리자, SupabaseManager 초기화
app_logger = logger.get_logger(gui_callback=gui_log_callback)
settings_manager = SettingsManager()
supabase_manager = DBeManager(app_logger)
# 로그인 다이얼로그 실행 (비동기)
async def do_login():
login_dialog = login.LoginDialog(page, app_logger, settings_manager, supabase_manager)
logged_in = await login_dialog.show()
if logged_in:
page.controls.clear()
page.add(ft.Text("로그인 성공! 메인 화면입니다."), log_display)
else:
page.add(ft.Text("로그인 실패!"), log_display)
page.async_run(do_login)
# 마켓 탭 UI 구성
market_tab_content = ft.Column([
ft.Row([
ft.ElevatedButton("마켓목록 가져오기", on_click=lambda e: load_market_list(page)),
ft.ElevatedButton("팔린상품 가져오기", on_click=lambda e: load_sold_products(page)),
ft.ElevatedButton("마켓추가하기", on_click=lambda e: add_market(page))
]),
ft.DataTable(
columns=[
ft.DataColumn(ft.Text("마켓이름")),
ft.DataColumn(ft.Text("마켓 URL")),
ft.DataColumn(ft.Text("메모"))
],
rows=[],
expand=True,
key="market_table"
)
], scroll=ft.ScrollMode.AUTO)
# 상품 탭 UI 구성
product_tab_content = ft.Column([
ft.Row([
ft.ElevatedButton("금지어필터링", on_click=lambda e: filter_forbidden(page)),
ft.ElevatedButton("카테고리 필터링", on_click=lambda e: filter_category(page)),
ft.Dropdown(
label="소싱몰 목록",
options=[
ft.dropdown.Option("타오바오"),
ft.dropdown.Option("1688")
],
key="sourcing_market"
),
ft.ElevatedButton("소싱하기", on_click=lambda e: sourcing_products(page)),
ft.ElevatedButton("출력", on_click=lambda e: export_products(page))
]),
ft.DataTable(
columns=[
ft.DataColumn(ft.Text("상품명")),
ft.DataColumn(ft.Text("카테고리")),
ft.DataColumn(ft.Text("이미지 URL")),
ft.DataColumn(ft.Text("소싱 URL"))
],
rows=[],
expand=True,
key="product_table"
)
], scroll=ft.ScrollMode.AUTO)
# 금지어 관리 탭 (추후 구현)
forbidden_tab_content = ft.Column([
ft.Text("금지어 관리 탭 내용 (추후 구현)")
])
# 카테고리 관리 탭 (추후 구현)
category_tab_content = ft.Column([
ft.Text("카테고리 관리 탭 내용 (추후 구현)")
])
# 메인 탭 생성
tabs = ft.Tabs(
selected_index=0,
tabs=[
ft.Tab(text="마켓", content=market_tab_content),
ft.Tab(text="상품", content=product_tab_content),
ft.Tab(text="금지어 관리", content=forbidden_tab_content),
ft.Tab(text="카테고리 관리", content=category_tab_content)
],
key="main_tabs"
)
# 페이지 레이아웃 구성
page.add(tabs, log_display)
# 로그 추가 함수 (각 모듈에서 호출 가능하도록 page.session에 저장)
def append_log(message: str):
current = log_display.value
log_display.value = current + message + "\n"
page.update()
page.session.set("append_log", append_log)
def load_market_list(page: ft.Page):
global market_list
page.session.get("append_log")("Fetching market list...")
market_list = backend.get_market_list()
market_rows = []
for m in market_list:
row = ft.DataRow(cells=[
ft.DataCell(ft.Text(m.get("name", ""))),
ft.DataCell(ft.Text(m.get("url", ""))),
ft.DataCell(ft.Text(m.get("memo", "")))
])
market_rows.append(row)
market_table: ft.DataTable = page.get_control("market_table")
market_table.rows = market_rows
page.session.get("append_log")("Market list loaded.")
page.update()
def load_sold_products(page: ft.Page):
global sold_products, filtered_products, sourced_products
page.session.get("append_log")("Fetching sold products for each market...")
sold_products = backend.get_sold_products(market_list)
filtered_products = sold_products.copy()
page.session.get("append_log")("Sold products loaded. Switching to 상품 탭.")
update_product_table(page, filtered_products)
tabs: ft.Tabs = page.get_control("main_tabs")
tabs.selected_index = 1
page.update()
def update_product_table(page: ft.Page, products):
product_rows = []
for p in products:
row = ft.DataRow(cells=[
ft.DataCell(ft.Text(p.get("name", ""))),
ft.DataCell(ft.Text(p.get("category", ""))),
ft.DataCell(ft.Text(p.get("image_url", ""))),
ft.DataCell(ft.Text(p.get("sourcing_url", "")))
])
product_rows.append(row)
product_table: ft.DataTable = page.get_control("product_table")
product_table.rows = product_rows
page.update()
def add_market(page: ft.Page):
page.session.get("append_log")("Add market functionality not implemented yet.")
page.update()
def filter_forbidden(page: ft.Page):
global filtered_products
page.session.get("append_log")("Filtering products with forbidden words...")
filtered_products = product_filter.filter_forbidden_words(filtered_products)
update_product_table(page, filtered_products)
page.session.get("append_log")("Forbidden words filtering applied.")
page.update()
def filter_category(page: ft.Page):
global filtered_products
page.session.get("append_log")("Filtering products with forbidden categories...")
filtered_products = product_filter.filter_forbidden_categories(filtered_products)
update_product_table(page, filtered_products)
page.session.get("append_log")("Category filtering applied.")
page.update()
def sourcing_products(page: ft.Page):
global sourced_products, filtered_products
sourcing_market: ft.Dropdown = page.get_control("sourcing_market")
selected_market = sourcing_market.value
page.session.get("append_log")(f"Starting sourcing using {selected_market}...")
sourced_products = []
for product in filtered_products:
sourcing_url = backend.sourcing_product(product.get("image_url", ""), selected_market)
product["sourcing_url"] = sourcing_url
sourced_products.append(product)
update_product_table(page, sourced_products)
page.session.get("append_log")("Sourcing completed.")
page.update()
def export_products(page: ft.Page):
page.session.get("append_log")("Exporting products to Excel...")
export.export_to_excel(sourced_products)
page.session.get("append_log")("Products exported and folder opened.")
page.update()
if __name__ == "__main__":
ft.app(target=main)