from django.shortcuts import render, redirect, get_object_or_404 from django.contrib.auth.decorators import login_required from django.views.generic import TemplateView from pathlib import Path import markdown import os import logging # 2025-04-14 Log 등록 from .models import IPManagementRecord from blog.models import Post from board_notice.models import BoardNotice from django.db.models import Q from opentelemetry import trace # 2025-04-14 Log & Trace 등록 logger = logging.getLogger(__name__) tracer = trace.get_tracer(__name__) # 트레이서 가져오기 class LandingPageView(TemplateView): template_name = "butler/landing.html" def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) # context['var'] var를 templates로 전달해서 보여지는 것. context['blog_posts'] = Post.objects.order_by('-created_at')[:3] context['board_notices'] = BoardNotice.objects.order_by('-created_at')[:3] return context # --- ip management --- # def ip_mgmt_view(request): # # records = IPManagementRecord.objects.all() # if request.user.is_authenticated: # # records = IPManagementRecord.objects.filter(author=request.user).order_by( # records = IPManagementRecord.objects.order_by( # "ip_addrs" # ) # else: # # records = IPManagementRecord.objects.none() # records = IPManagementRecord.objects.all().order_by("ip_addrs") # return render(request, "butler/ip_mgmt.html", {"records": records}) def ip_mgmt_view(request): query = request.GET.get("var_search", "").strip() records = IPManagementRecord.objects.order_by( "ip_addrs" ) if query: records = records.filter( # Q(author__username__icontains=query) | Q(author__email__icontains=query) Q(author__username__icontains=query) | Q(network_nm__icontains=query) ) """ SELECT * FROM ip_management_record AS ip JOIN auth_user AS au ON ip.author_id = au.id WHERE au.username LIKE CONCAT('%', 조회할 값, '%') OR au.email LIKE CONCAT('%', 조회할 값, '%') ORDER BY ip.ip_addrs; """ records = records.order_by("ip_addrs") return render(request, "butler/ip_mgmt.html", {"records": records, "var_search": query}) def add_ip_record(request): if request.method == "POST": network_nm = request.POST.get("network_nm") ip_addrs = request.POST.get("ip_addrs") svr_nm = request.POST.get("svr_nm") contents = request.POST.get("contents") remark = request.POST.get("remark") author = request.user # 2025-04-14 트레이스 span 생성 with tracer.start_as_current_span("create_ip_record") as span: # 데이터 저장 IPManagementRecord.objects.create( network_nm=network_nm, ip_addrs=ip_addrs, svr_nm=svr_nm, contents=contents, remark=remark, author=author, ) # 2025-04-14 Jaeger용 Event 추가 span.add_event( "Saved IPManagementRecord", attributes={ "ip_addrs": ip_addrs, "svr_nm": svr_nm, "desc": "jager logs test", } ) # 2025-04-14 로그 등록 (콘솔+FluentBit용) logger.info(f"Create_Record_IP_ADDRS: {ip_addrs}") return redirect("/ip_mgmt") def delete_ip_records(request): # print(f"Delete_Record_IP_ADDRS") if request.method == "POST": selected_ids = request.POST.getlist("selected_records") if selected_ids: IPManagementRecord.objects.filter(id__in=selected_ids).delete() # 2025-04-14 Log 등록 logger.info(f"Delete_Record_IP_ADDRS_idx: {selected_ids}") return redirect("/ip_mgmt") def edit_ip_record(request, pk): # print(f"Edit_Record_IP_ADDRS") record = get_object_or_404(IPManagementRecord, pk=pk) # 검색 키워드 유지 var_search = request.GET.get("var_search") or request.POST.get("var_search") if request.method == "POST": # 2025-04-14 trace span with tracer.start_as_current_span("edit_ip_record") as span: record.network_nm = request.POST.get("network_nm") record.ip_addrs = request.POST.get("ip_addrs") record.svr_nm = request.POST.get("svr_nm") record.contents = request.POST.get("contents") record.remark = request.POST.get("remark") record.save() # 2025-04-14 Jaeger용 Event 추가 span.add_event( "Edit IPManagementRecord", attributes={ "ip_addrs": record.ip_addrs, "svr_nm": record.svr_nm, "location": record.contents, "remark": record.remark, "desc": "jager event log insert", } ) # 2025-04-14 Log 등록 logger.info(f"Edit_Record_IP_ADDRS: {record.ip_addrs}") if var_search: return redirect(f"/ip_mgmt?var_search={var_search}") return redirect("/ip_mgmt") return render(request, "butler/ip_mgmt.html", {"record": record}) # --- privacy def privacy_view(request): # 'docs/privacy.md' 파일을 읽기 file_path = os.path.join("docs", "docs_md_files/privacy.md") with open(file_path, "r", encoding="utf-8") as file: text = file.read() file_path = Path("docs/docs_md_files/privacy.md") with file_path.open("r", encoding="utf-8") as file: text = file.read() # Markdown을 HTML로 변환 # html_content = markdown.markdown(text) # Markdown을 HTML로 변환, tables 확장 활성화 html_content = markdown.markdown( text, extensions=[ "tables", # 테이블 지원 확장 ], ) # 변환된 HTML을 템플릿에 전달 return render(request, "butler/privacy.html", {"content": html_content}) def test_view(request): return render( request, "butler/test.html", )