Spaces:
Sleeping
Sleeping
| 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() | |