GGGISfolio / src /node_functions.py
miniwa00's picture
아이디어 생성 및 λ…Έλ“œ 관리 κΈ°λŠ₯ κ°œμ„ : λ…Έλ“œ 필터링 κΈ°λŠ₯ μΆ”κ°€, μ‚¬μš©λœ λ…Έλ“œ 및 ν•„ν„° 정보 ν‘œμ‹œ, 아이디어 생성 λ‘œμ§μ—μ„œ ν•„ν„°λ§λœ λ…Έλ“œ μ‚¬μš©, UI μ—…λ°μ΄νŠΈ 및 μƒνƒœ μ΄ˆκΈ°ν™” κΈ°λŠ₯ κ°•ν™”
b1f9932
Raw
History Blame Contribute Delete
7.75 kB
import pandas as pd
import gradio as gr
import src.data_manager as dm
from datetime import datetime
def add_keyword(keyword, current_tags):
"""ν‚€μ›Œλ“œ μΆ”κ°€ (콀마둜 κ΅¬λΆ„λœ μ—¬λŸ¬ ν‚€μ›Œλ“œ 지원)"""
if not keyword:
return current_tags, "", ""
# κΈ°μ‘΄ νƒœκ·Έ 리슀트 κ°€μ Έμ˜€κΈ°
if current_tags:
tags_list = [tag.strip() for tag in current_tags.split(",") if tag.strip()]
else:
tags_list = []
# μž…λ ₯된 ν‚€μ›Œλ“œλ₯Ό 콀마둜 λΆ„ν• ν•˜μ—¬ 처리
new_keywords = [kw.strip() for kw in keyword.split(",") if kw.strip()]
# 쀑볡 ν‚€μ›Œλ“œ 체크
duplicate_keywords = []
added_keywords = []
for new_keyword in new_keywords:
if new_keyword:
if new_keyword in tags_list:
duplicate_keywords.append(new_keyword)
else:
tags_list.append(new_keyword)
added_keywords.append(new_keyword)
# 쀑볡 ν‚€μ›Œλ“œκ°€ μžˆλŠ” 경우 κ²½κ³  λ©”μ‹œμ§€ ν‘œμ‹œ
if duplicate_keywords and not added_keywords:
# λͺ¨λ“  ν‚€μ›Œλ“œκ°€ 쀑볡인 경우
duplicate_list = ", ".join(duplicate_keywords)
return current_tags, "", f"❌ 이미 μ‘΄μž¬ν•˜λŠ” ν‚€μ›Œλ“œμž…λ‹ˆλ‹€: {duplicate_list}"
elif duplicate_keywords and added_keywords:
# 일뢀 ν‚€μ›Œλ“œλ§Œ 쀑볡인 경우
duplicate_list = ", ".join(duplicate_keywords)
updated_tags = ", ".join(tags_list)
return (
updated_tags,
"",
f"⚠️ 일뢀 ν‚€μ›Œλ“œκ°€ μ€‘λ³΅λ˜μ–΄ μ œμ™Έλ˜μ—ˆμŠ΅λ‹ˆλ‹€: {duplicate_list}",
)
# μ—…λ°μ΄νŠΈλœ νƒœκ·Έ λ¦¬μŠ€νŠΈμ™€ 빈 ν‚€μ›Œλ“œ μž…λ ₯ ν•„λ“œ, 성곡 λ©”μ‹œμ§€ λ°˜ν™˜
updated_tags = ", ".join(tags_list)
added_list = ", ".join(added_keywords)
return updated_tags, "", f"βœ… ν‚€μ›Œλ“œκ°€ μΆ”κ°€λ˜μ—ˆμŠ΅λ‹ˆλ‹€: {added_list}"
def create_node(title, description, tenant, tags):
"""μ‚¬μš©μž μž…λ ₯으둜 μƒˆ λ…Έλ“œ 생성"""
if not title or not description:
return (
"❌ ν”„λ‘œμ νŠΈ 제λͺ©κ³Ό μ„€λͺ…을 λͺ¨λ‘ μž…λ ₯ν•΄μ£Όμ„Έμš”.",
title,
description,
tenant,
"",
tags,
"",
)
# ν…Œλ„ŒνŠΈ ν•„μˆ˜ 검증
if not tenant:
return (
"❌ ν…Œλ„ŒνŠΈ(κ·Έλ£Ή)λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš”.",
title,
description,
tenant,
"",
tags,
"",
)
# νƒœκ·Έλ₯Ό 리슀트둜 λ³€ν™˜
tags_list = [tag.strip() for tag in tags.split(",") if tag.strip()] if tags else []
# ν‚€μ›Œλ“œ ν•„μˆ˜ 검증
if not tags_list:
return (
"❌ ν‚€μ›Œλ“œλ₯Ό μ΅œμ†Œ 1개 이상 μž…λ ₯ν•΄μ£Όμ„Έμš”!",
title,
description,
tenant,
"",
tags,
"",
)
new_node = {
"title": title,
"description": description,
"tenant": tenant.strip(),
"tags": tags_list,
"created_at": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
}
dm.nodes_data.append(new_node)
dm.save_nodes()
# μ„±κ³΅μ‹œ λͺ¨λ“  ν•„λ“œ μ΄ˆκΈ°ν™”
return "βœ… μƒˆ λ…Έλ“œκ°€ μ„±κ³΅μ μœΌλ‘œ μƒμ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€!", "", "", "", "", "", ""
def get_nodes_dataframe(search_text="", selected_tenants=None, selected_tags=None):
"""μ €μž₯된 λ…Έλ“œλ“€μ„ λ°μ΄ν„°ν”„λ ˆμž„μœΌλ‘œ λ³€ν™˜ (닀쀑 ν•„ν„° 지원)"""
# 컬럼λͺ… μ •μ˜
columns = ["μƒμ„±μΌμž", "λ…Έλ“œ 이름", "ν…Œλ„ŒνŠΈ", "μ„€λͺ…", "νƒœκ·Έ"]
if not dm.nodes_data:
return pd.DataFrame(columns=columns)
# ν•„ν„°λ§λœ λ…Έλ“œλ“€
filtered_nodes = []
for node in dm.nodes_data:
# ν…μŠ€νŠΈ 검색 ν•„ν„° (λ…Έλ“œ μ΄λ¦„μ—μ„œ 검색)
if search_text and search_text.lower() not in node["title"].lower():
continue
# ν…Œλ„ŒνŠΈ ν•„ν„°
if selected_tenants and node.get("tenant", "λ―Έμ§€μ •") not in selected_tenants:
continue
# νƒœκ·Έ ν•„ν„° (μ„ νƒλœ νƒœκ·Έ 쀑 ν•˜λ‚˜λΌλ„ ν¬ν•¨λ˜μ–΄μ•Ό 함)
if selected_tags:
node_tags = node.get("tags", [])
if not any(tag in node_tags for tag in selected_tags):
continue
filtered_nodes.append(
{
"μƒμ„±μΌμž": node.get("created_at", "미상"),
"λ…Έλ“œ 이름": node["title"],
"ν…Œλ„ŒνŠΈ": node.get("tenant", "λ―Έμ§€μ •"),
"μ„€λͺ…": (
node["description"][:100] + "..."
if len(node["description"]) > 100
else node["description"]
),
"νƒœκ·Έ": ", ".join(node.get("tags", [])),
}
)
# 필터링 κ²°κ³Όκ°€ 없어도 컬럼λͺ…이 μœ μ§€λ˜λ„λ‘ 빈 DataFrame λ°˜ν™˜
if not filtered_nodes:
return pd.DataFrame(columns=columns)
return pd.DataFrame(filtered_nodes)
def filter_nodes_multi(search_text, selected_tenants, selected_tags):
"""닀쀑 ν•„ν„°λ‘œ λ…Έλ“œ 필터링"""
df = get_nodes_dataframe(search_text, selected_tenants, selected_tags)
return gr.update(value=df)
def get_all_tags():
"""λͺ¨λ“  λ…Έλ“œμ˜ νƒœκ·Έ λͺ©λ‘ λ°˜ν™˜"""
all_tags = set()
for node in dm.nodes_data:
all_tags.update(node.get("tags", []))
return sorted(list(all_tags))
def get_all_tenants():
"""λͺ¨λ“  λ…Έλ“œμ˜ ν…Œλ„ŒνŠΈ λͺ©λ‘ λ°˜ν™˜"""
all_tenants = set()
for node in dm.nodes_data:
tenant = node.get("tenant", "λ―Έμ§€μ •")
if tenant:
all_tenants.add(tenant)
return sorted(list(all_tenants))
def refresh_nodes():
"""λ…Έλ“œ λͺ©λ‘ μƒˆλ‘œκ³ μΉ¨"""
dm.load_nodes()
return get_nodes_dataframe(), get_all_tags(), get_all_tenants()
def get_node_details_by_index(index):
"""인덱슀둜 λ…Έλ“œ 상세 정보 κ°€μ Έμ˜€κΈ°"""
if 0 <= index < len(dm.nodes_data):
node = dm.nodes_data[index]
return (
node.get("title", ""),
node.get("description", ""),
node.get("tenant", ""),
", ".join(node.get("tags", [])),
node.get("created_at", ""),
)
return ("λ…Έλ“œλ₯Ό μ„ νƒν•΄μ£Όμ„Έμš”.", "", "", "", "")
def update_node(index, title, description, tenant, tags_str):
"""λ…Έλ“œ 정보 μ—…λ°μ΄νŠΈ"""
if not title or not description:
return "❌ λ…Έλ“œ 제λͺ©κ³Ό μ„€λͺ…을 λͺ¨λ‘ μž…λ ₯ν•΄μ£Όμ„Έμš”.", get_nodes_dataframe()
if not tenant:
return "❌ ν…Œλ„ŒνŠΈλ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš”.", get_nodes_dataframe()
# νƒœκ·Έλ₯Ό 리슀트둜 λ³€ν™˜
tags_list = (
[tag.strip() for tag in tags_str.split(",") if tag.strip()] if tags_str else []
)
if not tags_list:
return "❌ νƒœκ·Έλ₯Ό μ΅œμ†Œ 1개 이상 μž…λ ₯ν•΄μ£Όμ„Έμš”.", get_nodes_dataframe()
if 0 <= index < len(dm.nodes_data):
dm.nodes_data[index].update(
{
"title": title,
"description": description,
"tenant": tenant.strip(),
"tags": tags_list,
}
)
dm.save_nodes()
return "βœ… λ…Έλ“œκ°€ μ„±κ³΅μ μœΌλ‘œ μˆ˜μ •λ˜μ—ˆμŠ΅λ‹ˆλ‹€.", get_nodes_dataframe()
return "❌ μˆ˜μ •ν•  λ…Έλ“œλ₯Ό 찾을 수 μ—†μŠ΅λ‹ˆλ‹€.", get_nodes_dataframe()
def delete_node(index):
"""λ…Έλ“œ μ‚­μ œ"""
if 0 <= index < len(dm.nodes_data):
deleted_node = dm.nodes_data.pop(index)
dm.save_nodes()
return (
f"λ…Έλ“œ '{deleted_node.get('title', 'μ•Œ 수 μ—†μŒ')}'κ°€ μ‚­μ œλ˜μ—ˆμŠ΅λ‹ˆλ‹€.",
get_nodes_dataframe(),
)
return "❌ μ‚­μ œν•  λ…Έλ“œλ₯Ό 찾을 수 μ—†μŠ΅λ‹ˆλ‹€.", get_nodes_dataframe()