Compare commits
9 Commits
Author | SHA1 | Date | |
---|---|---|---|
4e66b1b957 | |||
c12d1b527c | |||
fb02b8dc8d | |||
928758c20d | |||
a65758a9a8 | |||
72b1dd8d37 | |||
7d1c508828 | |||
fc8bfc9db6 | |||
aacd0e47d2 |
@ -1,19 +1,39 @@
|
||||
{% extends "components/base.html" %}
|
||||
|
||||
{% block title %}Post{% endblock %}
|
||||
{% block title %}Blog Posts{% endblock %}
|
||||
|
||||
{% block main_area %}
|
||||
<h1 class="pt-3">Blog Posts</h1>
|
||||
{% if request.user.is_authenticated %}
|
||||
<a href="{% url 'blog:create_post' %}" class="btn btn-primary mb-3">Create New Post</a>
|
||||
{% endif %}
|
||||
<ul class="list-group">
|
||||
{% for post in posts %}
|
||||
<li class="list-group-item">
|
||||
<h5>{{ post.title }}</h5>
|
||||
<p>{{ post.summary }}</p>
|
||||
<a href="{{ post.get_absolute_url }}" class="btn btn-secondary">Read More</a>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% endblock %}
|
||||
<h1 class="pt-3 mb-4 fw-bold">📝 Latest Posts</h1>
|
||||
|
||||
{% if request.user.is_authenticated %}
|
||||
<div class="mb-4">
|
||||
<a href="{% url 'blog:create_post' %}" class="btn btn-success">
|
||||
<i class="bi bi-pencil-square"></i> Write a New Post
|
||||
</a>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<div class="row row-cols-1 row-cols-md-2 row-cols-lg-3 g-4">
|
||||
{% for post in posts %}
|
||||
<div class="col">
|
||||
<div class="card h-100 shadow-sm">
|
||||
<div class="card-body d-flex flex-column">
|
||||
<h5 class="card-title fw-bold">{{ post.title }}</h5>
|
||||
<p class="card-text text-muted">{{ post.summary }}</p>
|
||||
<p class="card-text text-muted">{{ post.contents|truncatechars:50 }}</p>
|
||||
<div class="mt-auto">
|
||||
<a href="{{ post.get_absolute_url }}" class="btn btn-outline-primary w-100">
|
||||
Read More →
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-footer text-end small text-muted">
|
||||
{{ post.author }} · {{ post.created_at|date:"Y-m-d" }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% empty %}
|
||||
<p class="text-muted">No posts available yet.</p>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
@ -7,7 +7,7 @@ class IPManagementRecord(models.Model):
|
||||
network_nm = models.CharField(max_length=100) # NETWORK_NM
|
||||
ip_addrs = models.CharField(max_length=50) # IP_ADDRS
|
||||
svr_nm = models.CharField(max_length=100) # SVR_NM
|
||||
contents = models.TextField(blank=True, null=True) # DESC
|
||||
contents = models.TextField(blank=True, null=True) # desc -> contents
|
||||
remark = models.TextField(blank=True, null=True) # REMARK
|
||||
created_at = models.DateTimeField(auto_now_add=True) # 생성 시간 자동 기록
|
||||
updated_at = models.DateTimeField(auto_now=True) # 수정 시간 자동 기록
|
||||
|
200
butler/templates/butler/_unused_ip_mgmt.html
Normal file
200
butler/templates/butler/_unused_ip_mgmt.html
Normal file
@ -0,0 +1,200 @@
|
||||
{% extends "components/base.html" %}
|
||||
|
||||
{% block title %}IP Management{% endblock %}
|
||||
|
||||
{% block main_area %}
|
||||
<h2 class="fw-bold pt-3 pb-2">IP 관리 대장</h2>
|
||||
{% if not request.user.is_authenticated %}
|
||||
<p class="text-danger">비로그인 익명사용자로 접근 중입니다.
|
||||
<br>로그인시 로그인 사용자가 등록한 데이터만 조회됩니다.
|
||||
</p>
|
||||
{% endif %}
|
||||
<!-- 검색 폼 -->
|
||||
<div class="row">
|
||||
<div class="col-4">
|
||||
</div>
|
||||
<div class="col-4">
|
||||
</div>
|
||||
<div class="col-4">
|
||||
<form method="get" class="mb-3">
|
||||
<div class="input-group">
|
||||
<input type="text" name="var_search" class="form-control" placeholder="Search by Author or Network Name..."
|
||||
value="{{ var_search }}">
|
||||
<button type="submit" class="btn btn-outline-primary">Search</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<!-- IP 레코드 목록 -->
|
||||
<form id="recordForm" method="post" action="">
|
||||
{% csrf_token %}
|
||||
<table class="table table-striped table-hover table-bordered">
|
||||
<thead class="table-dark">
|
||||
<tr>
|
||||
<th scope="col">Select</th>
|
||||
<th scope="col">Network Name</th>
|
||||
<th scope="col">Location</th>
|
||||
<th scope="col">Server Name</th>
|
||||
<th scope="col">IP Address</th>
|
||||
<th scope="col">Remark</th>
|
||||
<th scope="col">Author</th>
|
||||
<th scope="col">Updated At</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for record in records %}
|
||||
<tr data-record-id="{{ record.id }}">
|
||||
<td class="text-center">
|
||||
<input type="checkbox" name="selected_records" value="{{ record.id }}"
|
||||
class="form-check-input record-checkbox">
|
||||
</td>
|
||||
<td>{{ record.network_nm }}</td>
|
||||
<td>{{ record.contents }}</td>
|
||||
<td>{{ record.svr_nm }}</td>
|
||||
<td>{{ record.ip_addrs }}</td>
|
||||
<td>{{ record.remark }}</td>
|
||||
<td>{{ record.author }}</td>
|
||||
<td>{{ record.updated_at|date:"Y-m-d H:i" }}</td>
|
||||
</tr>
|
||||
|
||||
<!-- 수정 모달 -->
|
||||
<div class="modal fade" id="editDataModal-{{ record.id }}" tabindex="-1"
|
||||
aria-labelledby="editDataModalLabel-{{ record.id }}" aria-hidden="true">
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header bg-warning text-dark">
|
||||
<h5 class="modal-title" id="editDataModalLabel-{{ record.id }}">Edit IP Record</h5>
|
||||
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<!-- 데이터 수정 폼 -->
|
||||
<form id="editDataForm-{{ record.id }}" method="post" action="{% url 'butler:ip_mgmt_edit' record.id %}">
|
||||
{% csrf_token %}
|
||||
<div class="mb-3">
|
||||
<label for="networkNm-{{ record.id }}" class="form-label">Network Name</label>
|
||||
<input type="text" class="form-control" id="networkNm-{{ record.id }}" name="network_nm"
|
||||
value="{{ record.network_nm }}" required="required">
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="ipAddrs-{{ record.id }}" class="form-label">IP Address</label>
|
||||
<input type="text" class="form-control" id="ipAddrs-{{ record.id }}" name="ip_addrs"
|
||||
value="{{ record.ip_addrs }}" required="required">
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="svrNm-{{ record.id }}" class="form-label">Server Name</label>
|
||||
<input type="text" class="form-control" id="svrNm-{{ record.id }}" name="svr_nm"
|
||||
value="{{ record.svr_nm }}" required="required">
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="contents-{{ record.id }}" class="form-label">Location</label>
|
||||
<textarea class="form-control" id="contents-{{ record.id }}" name="contents">{{ record.contents }}</textarea>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="remark-{{ record.id }}" class="form-label">Remark</label>
|
||||
<textarea class="form-control" id="remark-{{ record.id }}"
|
||||
name="remark">{{ record.remark }}</textarea>
|
||||
</div>
|
||||
<button type="submit" class="btn btn-primary">Save Changes</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% empty %}
|
||||
<tr>
|
||||
<td colspan="9" class="text-center">No records found.</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
{% if request.user.is_authenticated %}
|
||||
<!-- 버튼 컨테이너 -->
|
||||
<div class="d-flex justify-content-between align-items-center mb-3">
|
||||
<!-- 데이터 등록 버튼 -->
|
||||
<button type="button" class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#addDataModal">
|
||||
<i class="bi bi-plus-lg"></i>
|
||||
Add New IP Record
|
||||
</button>
|
||||
|
||||
<!-- 전체 삭제 버튼 -->
|
||||
<button type="submit" formaction="{% url 'butler:ip_mgmt_delete' %}" class="btn btn-danger">
|
||||
<i class="bi bi-trash"></i>
|
||||
Delete Selected
|
||||
</button>
|
||||
|
||||
<!-- 수정 버튼 -->
|
||||
<button type="button" id="editSelectedButton" class="btn btn-warning" disabled="disabled">
|
||||
<i class="bi bi-pencil-square"></i>
|
||||
Edit Selected
|
||||
</button>
|
||||
</div>
|
||||
{% endif %}
|
||||
</form>
|
||||
|
||||
<!-- 데이터 등록 모달 -->
|
||||
<div class="modal fade" id="addDataModal" tabindex="-1" aria-labelledby="addDataModalLabel" aria-hidden="true">
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header bg-success text-white">
|
||||
<h5 class="modal-title" id="addDataModalLabel">Add New IP Record</h5>
|
||||
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<!-- 데이터 등록 폼 -->
|
||||
<form id="addDataForm" method="post" action="{% url 'butler:ip_mgmt_add' %}">
|
||||
{% csrf_token %}
|
||||
<div class="mb-3">
|
||||
<label for="networkNm" class="form-label">Network Name</label>
|
||||
<input type="text" class="form-control" id="networkNm" name="network_nm" required="required">
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="ipAddrs" class="form-label">IP Address</label>
|
||||
<input type="text" class="form-control" id="ipAddrs" name="ip_addrs" required="required">
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="svrNm" class="form-label">Server Name</label>
|
||||
<input type="text" class="form-control" id="svrNm" name="svr_nm" required="required">
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="contents" class="form-label">Location</label>
|
||||
<textarea class="form-control" id="contents" name="contents"></textarea>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="remark" class="form-label">Remark</label>
|
||||
<textarea class="form-control" id="remark" name="remark"></textarea>
|
||||
</div>
|
||||
<button type="submit" class="btn btn-primary">Submit</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function () {
|
||||
const editButton = document.getElementById('editSelectedButton');
|
||||
const checkboxes = document.querySelectorAll('.record-checkbox');
|
||||
|
||||
// Event listener to enable/disable the edit button
|
||||
document.addEventListener('change', function () {
|
||||
const selected = [...checkboxes].filter(checkbox => checkbox.checked);
|
||||
if (selected.length === 1) {
|
||||
editButton.disabled = false;
|
||||
editButton.dataset.recordId = selected[0].value;
|
||||
} else {
|
||||
editButton.disabled = true;
|
||||
delete editButton.dataset.recordId;
|
||||
}
|
||||
});
|
||||
|
||||
// Event listener to open the edit modal
|
||||
editButton.addEventListener('click', function () {
|
||||
const recordId = editButton.dataset.recordId;
|
||||
if (recordId) {
|
||||
const modal = new bootstrap.Modal(document.getElementById(`editDataModal-${recordId}`));
|
||||
modal.show();
|
||||
}
|
||||
});
|
||||
});
|
||||
</script>
|
||||
{% endblock %}
|
@ -11,10 +11,8 @@
|
||||
{% endif %}
|
||||
<!-- 검색 폼 -->
|
||||
<div class="row">
|
||||
<div class="col-4">
|
||||
</div>
|
||||
<div class="col-4">
|
||||
</div>
|
||||
<div class="col-4"></div>
|
||||
<div class="col-4"></div>
|
||||
<div class="col-4">
|
||||
<form method="get" class="mb-3">
|
||||
<div class="input-group">
|
||||
@ -25,6 +23,7 @@
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- IP 레코드 목록 -->
|
||||
<form id="recordForm" method="post" action="">
|
||||
{% csrf_token %}
|
||||
@ -33,9 +32,9 @@
|
||||
<tr>
|
||||
<th scope="col">Select</th>
|
||||
<th scope="col">Network Name</th>
|
||||
<th scope="col">IP Address</th>
|
||||
<th scope="col">Server Name</th>
|
||||
<th scope="col">Description</th>
|
||||
<th scope="col">Location</th>
|
||||
<th scope="col">IP Address</th>
|
||||
<th scope="col">Remark</th>
|
||||
<th scope="col">Author</th>
|
||||
<th scope="col">Updated At</th>
|
||||
@ -49,57 +48,13 @@
|
||||
class="form-check-input record-checkbox">
|
||||
</td>
|
||||
<td>{{ record.network_nm }}</td>
|
||||
<td>{{ record.ip_addrs }}</td>
|
||||
<td>{{ record.contents }}</td>
|
||||
<td>{{ record.svr_nm }}</td>
|
||||
<td>{{ record.desc }}</td>
|
||||
<td>{{ record.ip_addrs }}</td>
|
||||
<td>{{ record.remark }}</td>
|
||||
<td>{{ record.author }}</td>
|
||||
<td>{{ record.updated_at|date:"Y-m-d H:i" }}</td>
|
||||
</tr>
|
||||
|
||||
<!-- 수정 모달 -->
|
||||
<div class="modal fade" id="editDataModal-{{ record.id }}" tabindex="-1"
|
||||
aria-labelledby="editDataModalLabel-{{ record.id }}" aria-hidden="true">
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header bg-warning text-dark">
|
||||
<h5 class="modal-title" id="editDataModalLabel-{{ record.id }}">Edit IP Record</h5>
|
||||
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<!-- 데이터 수정 폼 -->
|
||||
<form id="editDataForm-{{ record.id }}" method="post" action="{% url 'butler:ip_mgmt_edit' record.id %}">
|
||||
{% csrf_token %}
|
||||
<div class="mb-3">
|
||||
<label for="networkNm-{{ record.id }}" class="form-label">Network Name</label>
|
||||
<input type="text" class="form-control" id="networkNm-{{ record.id }}" name="network_nm"
|
||||
value="{{ record.network_nm }}" required="required">
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="ipAddrs-{{ record.id }}" class="form-label">IP Address</label>
|
||||
<input type="text" class="form-control" id="ipAddrs-{{ record.id }}" name="ip_addrs"
|
||||
value="{{ record.ip_addrs }}" required="required">
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="svrNm-{{ record.id }}" class="form-label">Server Name</label>
|
||||
<input type="text" class="form-control" id="svrNm-{{ record.id }}" name="svr_nm"
|
||||
value="{{ record.svr_nm }}" required="required">
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="desc-{{ record.id }}" class="form-label">Description</label>
|
||||
<textarea class="form-control" id="desc-{{ record.id }}" name="desc">{{ record.desc }}</textarea>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="remark-{{ record.id }}" class="form-label">Remark</label>
|
||||
<textarea class="form-control" id="remark-{{ record.id }}"
|
||||
name="remark">{{ record.remark }}</textarea>
|
||||
</div>
|
||||
<button type="submit" class="btn btn-primary">Save Changes</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% empty %}
|
||||
<tr>
|
||||
<td colspan="9" class="text-center">No records found.</td>
|
||||
@ -108,30 +63,67 @@
|
||||
</tbody>
|
||||
</table>
|
||||
{% if request.user.is_authenticated %}
|
||||
<!-- 버튼 컨테이너 -->
|
||||
<div class="d-flex justify-content-between align-items-center mb-3">
|
||||
<!-- 데이터 등록 버튼 -->
|
||||
<button type="button" class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#addDataModal">
|
||||
<i class="bi bi-plus-lg"></i>
|
||||
Add New IP Record
|
||||
<i class="bi bi-plus-lg"></i> Add New IP Record
|
||||
</button>
|
||||
|
||||
<!-- 전체 삭제 버튼 -->
|
||||
<button type="submit" formaction="{% url 'butler:ip_mgmt_delete' %}" class="btn btn-danger">
|
||||
<i class="bi bi-trash"></i>
|
||||
Delete Selected
|
||||
<i class="bi bi-trash"></i> Delete Selected
|
||||
</button>
|
||||
|
||||
<!-- 수정 버튼 -->
|
||||
<button type="button" id="editSelectedButton" class="btn btn-warning" disabled="disabled">
|
||||
<i class="bi bi-pencil-square"></i>
|
||||
Edit Selected
|
||||
<i class="bi bi-pencil-square"></i> Edit Selected
|
||||
</button>
|
||||
</div>
|
||||
{% endif %}
|
||||
</form>
|
||||
|
||||
<!-- 데이터 등록 모달 -->
|
||||
<!-- 수정 모달들 (form 중첩 제거) -->
|
||||
{% for record in records %}
|
||||
<div class="modal fade" id="editDataModal-{{ record.id }}" tabindex="-1"
|
||||
aria-labelledby="editDataModalLabel-{{ record.id }}" aria-hidden="true">
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header bg-warning text-dark">
|
||||
<h5 class="modal-title" id="editDataModalLabel-{{ record.id }}">Edit IP Record</h5>
|
||||
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<form id="editDataForm-{{ record.id }}" method="post"
|
||||
action="{% url 'butler:ip_mgmt_edit' record.id %}{% if var_search %}?var_search={{ var_search }}{% endif %}">
|
||||
{% csrf_token %}
|
||||
{% if var_search %}<input type="hidden" name="var_search" value="{{ var_search }}">{% endif %}
|
||||
<div class="mb-3">
|
||||
<label for="networkNm-{{ record.id }}" class="form-label">Network Name</label>
|
||||
<input type="text" class="form-control" id="networkNm-{{ record.id }}" name="network_nm"
|
||||
value="{{ record.network_nm }}" required>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="ipAddrs-{{ record.id }}" class="form-label">IP Address</label>
|
||||
<input type="text" class="form-control" id="ipAddrs-{{ record.id }}" name="ip_addrs"
|
||||
value="{{ record.ip_addrs }}" required>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="svrNm-{{ record.id }}" class="form-label">Server Name</label>
|
||||
<input type="text" class="form-control" id="svrNm-{{ record.id }}" name="svr_nm"
|
||||
value="{{ record.svr_nm }}" required>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="contents-{{ record.id }}" class="form-label">Location</label>
|
||||
<textarea class="form-control" id="contents-{{ record.id }}" name="contents">{{ record.contents }}</textarea>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="remark-{{ record.id }}" class="form-label">Remark</label>
|
||||
<textarea class="form-control" id="remark-{{ record.id }}" name="remark">{{ record.remark }}</textarea>
|
||||
</div>
|
||||
<button type="submit" class="btn btn-primary">Save Changes</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
|
||||
<!-- 등록 모달 -->
|
||||
<div class="modal fade" id="addDataModal" tabindex="-1" aria-labelledby="addDataModalLabel" aria-hidden="true">
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content">
|
||||
@ -140,24 +132,23 @@
|
||||
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<!-- 데이터 등록 폼 -->
|
||||
<form id="addDataForm" method="post" action="{% url 'butler:ip_mgmt_add' %}">
|
||||
{% csrf_token %}
|
||||
<div class="mb-3">
|
||||
<label for="networkNm" class="form-label">Network Name</label>
|
||||
<input type="text" class="form-control" id="networkNm" name="network_nm" required="required">
|
||||
<input type="text" class="form-control" id="networkNm" name="network_nm" required>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="ipAddrs" class="form-label">IP Address</label>
|
||||
<input type="text" class="form-control" id="ipAddrs" name="ip_addrs" required="required">
|
||||
<input type="text" class="form-control" id="ipAddrs" name="ip_addrs" required>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="svrNm" class="form-label">Server Name</label>
|
||||
<input type="text" class="form-control" id="svrNm" name="svr_nm" required="required">
|
||||
<input type="text" class="form-control" id="svrNm" name="svr_nm" required>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="desc" class="form-label">Description</label>
|
||||
<textarea class="form-control" id="desc" name="desc"></textarea>
|
||||
<label for="contents" class="form-label">Location</label>
|
||||
<textarea class="form-control" id="contents" name="contents"></textarea>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="remark" class="form-label">Remark</label>
|
||||
@ -175,7 +166,6 @@
|
||||
const editButton = document.getElementById('editSelectedButton');
|
||||
const checkboxes = document.querySelectorAll('.record-checkbox');
|
||||
|
||||
// Event listener to enable/disable the edit button
|
||||
document.addEventListener('change', function () {
|
||||
const selected = [...checkboxes].filter(checkbox => checkbox.checked);
|
||||
if (selected.length === 1) {
|
||||
@ -187,7 +177,6 @@
|
||||
}
|
||||
});
|
||||
|
||||
// Event listener to open the edit modal
|
||||
editButton.addEventListener('click', function () {
|
||||
const recordId = editButton.dataset.recordId;
|
||||
if (recordId) {
|
||||
@ -197,4 +186,4 @@
|
||||
});
|
||||
});
|
||||
</script>
|
||||
{% endblock %}
|
||||
{% endblock %}
|
||||
|
@ -8,7 +8,7 @@
|
||||
<!-- Grafana IFrame -->
|
||||
<div class="ratio ratio-16x9">
|
||||
<iframe
|
||||
src="https://grafana.nativedeck.com/d/PwMJtdvnz/1-k8s-for-prometheus-dashboard-20211010-en?orgId=2&from=1731468637504&to=1731470437504&kiosk"
|
||||
src="https://grafana.icurfer.com/public-dashboards/40d2a2615010433d81f5cf40caa03541"
|
||||
width="100%"
|
||||
height="800"
|
||||
frameborder="0"
|
||||
|
@ -16,5 +16,5 @@ urlpatterns = [
|
||||
path('ip-mgmt/delete/', views.delete_ip_records, name='ip_mgmt_delete'), # 삭제 URL 추가
|
||||
path('ip-mgmt/edit/<int:pk>/', views.edit_ip_record, name='ip_mgmt_edit'), # 수정 URL 추가
|
||||
path('privacy/', views.privacy_view, name='privacy'),
|
||||
path('test/', views.test_view, name='test'),
|
||||
# path('test/', views.test_view, name='test'),
|
||||
]
|
||||
|
@ -62,7 +62,7 @@ def add_ip_record(request):
|
||||
network_nm = request.POST.get("network_nm")
|
||||
ip_addrs = request.POST.get("ip_addrs")
|
||||
svr_nm = request.POST.get("svr_nm")
|
||||
desc = request.POST.get("desc")
|
||||
contents = request.POST.get("contents")
|
||||
remark = request.POST.get("remark")
|
||||
# 작성자 (author)는 로그인된 사용자로 설정
|
||||
author = request.user
|
||||
@ -71,7 +71,7 @@ def add_ip_record(request):
|
||||
network_nm=network_nm,
|
||||
ip_addrs=ip_addrs,
|
||||
svr_nm=svr_nm,
|
||||
desc=desc,
|
||||
contents=contents,
|
||||
remark=remark,
|
||||
author=author,
|
||||
)
|
||||
@ -90,19 +90,26 @@ def delete_ip_records(request):
|
||||
def edit_ip_record(request, pk):
|
||||
print(f"수정동작")
|
||||
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":
|
||||
# 디버깅 메시지 추가
|
||||
# print(f"체크: {request.POST}")
|
||||
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.desc = request.POST.get("desc")
|
||||
record.contents = request.POST.get("contents")
|
||||
record.remark = request.POST.get("remark")
|
||||
record.save()
|
||||
|
||||
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' 파일을 읽기
|
||||
|
@ -16,7 +16,17 @@ from pathlib import Path
|
||||
# Build paths inside the project like this: BASE_DIR / 'subdir'.
|
||||
BASE_DIR = Path(__file__).resolve().parent.parent
|
||||
|
||||
load_dotenv(os.path.join(BASE_DIR, '.env.dev'))
|
||||
# 우선순위: .env.dev > .env.prd > .env
|
||||
if os.path.exists(os.path.join(BASE_DIR, '.env.dev')):
|
||||
print("Read Environment File > Used : .env.dev")
|
||||
load_dotenv(os.path.join(BASE_DIR, '.env.dev'))
|
||||
elif os.path.exists(os.path.join(BASE_DIR, '.env.prd')):
|
||||
print("Read Environment File > Used : .env.prd")
|
||||
load_dotenv(os.path.join(BASE_DIR, '.env.prd'))
|
||||
else:
|
||||
print("None Environment File > Used : local_env")
|
||||
|
||||
# load_dotenv(os.path.join(BASE_DIR, '.env.dev'))
|
||||
|
||||
# Quick-start development settings - unsuitable for production
|
||||
# See https://docs.djangoproject.com/en/4.2/howto/deployment/checklist/
|
||||
@ -52,6 +62,7 @@ INSTALLED_APPS = [
|
||||
'mm_msg',
|
||||
'ansible_manager',
|
||||
'obs_minio',
|
||||
'telemetry_dashboard',
|
||||
]
|
||||
|
||||
MIDDLEWARE = [
|
||||
|
@ -31,6 +31,7 @@ urlpatterns = [
|
||||
path('mm_msg/', include('mm_msg.urls')),
|
||||
path('ansible_manager/', include('ansible_manager.urls')),
|
||||
path('obs_minio/', include('obs_minio.urls')),
|
||||
path('tm_dsbd/', include('telemetry_dashboard.urls')),
|
||||
]
|
||||
|
||||
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
|
||||
|
@ -20,7 +20,7 @@
|
||||
<a class="d-inline-flex align-items-center rounded" href="/ip_mgmt">IP관리대장</a>
|
||||
</li>
|
||||
<li>
|
||||
<a class="d-inline-flex align-items-center rounded" href="/game/">game(kimchirun)</a>
|
||||
<a class="d-inline-flex align-items-center rounded" href="/game/" target="_blank">game(kimchirun)</a>
|
||||
</li>
|
||||
{% if request.user.is_authenticated and request.user.is_staff %}
|
||||
<li>
|
||||
@ -28,6 +28,8 @@
|
||||
</li>
|
||||
{% endif %}
|
||||
</ul>
|
||||
<hr>
|
||||
{% include "components/_sidebar_tm_dashboard.html" %}
|
||||
</li>
|
||||
<hr>
|
||||
<li class="my-2">
|
||||
@ -37,81 +39,88 @@
|
||||
<li>
|
||||
<a class="d-inline-flex align-items-center rounded" href="/nhncloud/test">출력결과 검토</a>
|
||||
</li>
|
||||
<li>
|
||||
<a class="d-inline-flex align-items-center rounded" href="/nhncloud/preparations">주의 사항</a>
|
||||
</li>
|
||||
<hr>
|
||||
<span>관리대장</span>
|
||||
<li>
|
||||
<a class="d-inline-flex align-items-center rounded" href="/nhnc_mgmt/igw">인터넷 게이트웨이</a>
|
||||
</li>
|
||||
<hr>
|
||||
<span>Network</span>
|
||||
<li>
|
||||
<a class="d-inline-flex align-items-center rounded" href="/nhncloud/infoVpcListRequest">VPC 조회 및 삭제</a>
|
||||
</li>
|
||||
<li>
|
||||
<a class="d-inline-flex align-items-center rounded" href="/nhncloud/createVpcRequest">VPC 생성</a>
|
||||
</li>
|
||||
<li>
|
||||
<a class="d-inline-flex align-items-center rounded" href="/nhncloud/infoClusterListRequest">NKS Cluseter 조회 및 삭제</a>
|
||||
</li>
|
||||
<li>
|
||||
<a class="d-inline-flex align-items-center rounded" href="/nhncloud/createClusterOnlyRequest">NKS Cluseter 생성</a>
|
||||
</li>
|
||||
<hr>
|
||||
<span>k8s Components deploy</span>
|
||||
<li>
|
||||
<a class="d-inline-flex align-items-center rounded" href="/nhncloud/nksApply">Ingress Deploy</a>
|
||||
</li>
|
||||
<li>
|
||||
<a class="d-inline-flex align-items-center rounded" href="/nhncloud/nksApply">FluentBit Deploy</a>
|
||||
</li>
|
||||
<li>
|
||||
<a class="text-secondary d-inline-flex align-items-center rounded disabled" href="#">Logging Deploy(미구현)</a>
|
||||
</li>
|
||||
<li>
|
||||
<a class="text-secondary d-inline-flex align-items-center rounded disabled" href="#">Monitoring Deploy(미구현)</a>
|
||||
</li>
|
||||
{% else %}
|
||||
<p>로그인이 필요합니다.</p>
|
||||
<a class="d-inline-flex align-items-center rounded" href="/notice/2/" target="_blank">사용가이드</a>
|
||||
{% endif %}
|
||||
<li>
|
||||
<a class="d-inline-flex align-items-center rounded" href="/nhncloud/preparations">주의 사항</a>
|
||||
</li>
|
||||
<hr>
|
||||
<span>관리대장</span>
|
||||
<li>
|
||||
<a class="d-inline-flex align-items-center rounded" href="/nhnc_mgmt/igw">인터넷 게이트웨이</a>
|
||||
</li>
|
||||
<hr>
|
||||
<span>Network</span>
|
||||
<li>
|
||||
<a class="d-inline-flex align-items-center rounded" href="/nhncloud/infoVpcListRequest">VPC 조회 및 삭제</a>
|
||||
</li>
|
||||
<li>
|
||||
<a class="d-inline-flex align-items-center rounded" href="/nhncloud/createVpcRequest">VPC 생성</a>
|
||||
</li>
|
||||
<li>
|
||||
<a class="d-inline-flex align-items-center rounded" href="/nhncloud/infoClusterListRequest">NKS Cluseter 조회 및 삭제</a>
|
||||
</li>
|
||||
<li>
|
||||
<a class="d-inline-flex align-items-center rounded" href="/nhncloud/createClusterOnlyRequest">NKS Cluseter 생성</a>
|
||||
</li>
|
||||
<hr>
|
||||
<span>k8s Components deploy</span>
|
||||
<li>
|
||||
<a class="d-inline-flex align-items-center rounded" href="/nhncloud/nksApply">Ingress Deploy</a>
|
||||
</li>
|
||||
<li>
|
||||
<a class="d-inline-flex align-items-center rounded" href="/nhncloud/nksApply">FluentBit Deploy</a>
|
||||
</li>
|
||||
<li>
|
||||
<a class="text-secondary d-inline-flex align-items-center rounded disabled" href="#">Logging Deploy(미구현)</a>
|
||||
</li>
|
||||
<li>
|
||||
<a class="text-secondary d-inline-flex align-items-center rounded disabled" href="#">Monitoring Deploy(미구현)</a>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
<hr>
|
||||
<li class="my-2">
|
||||
<button class="btn d-inline-flex align-items-center collapsed" data-bs-toggle="collapse" aria-expanded="false" data-bs-target="#components-collapse" aria-controls="components-collapse">DevOpsTools ▽</button>
|
||||
<ul class="list-unstyled ps-3 collapse" id="components-collapse">
|
||||
<span>Dev</span>
|
||||
<li>
|
||||
<a class="d-inline-flex align-items-center rounded" href="{{request.user.url_gitea}}" target="_blank">Repository - Gitea</a>
|
||||
</li>
|
||||
<li>
|
||||
<a class="d-inline-flex align-items-center rounded" href="{{request.user.url_harbor}}" target="_blank">Registry - Harbor</a>
|
||||
</li>
|
||||
<li>
|
||||
<a class="d-inline-flex align-items-center rounded" href="{{request.user.url_argocd}}" target="_blank">Deploy - ArgoCD</a>
|
||||
</li>
|
||||
<hr>
|
||||
<span>Ops</span>
|
||||
{% if request.user.is_authenticated and request.user.is_staff %}
|
||||
<span>Dev</span>
|
||||
<li>
|
||||
<a class="d-inline-flex align-items-center rounded" href="{{request.user.url_gitea}}" target="_blank">Repository - Gitea</a>
|
||||
</li>
|
||||
<li>
|
||||
<a class="d-inline-flex align-items-center rounded" href="{{request.user.url_harbor}}" target="_blank">Registry - Harbor</a>
|
||||
</li>
|
||||
<li>
|
||||
<a class="d-inline-flex align-items-center rounded" href="{{request.user.url_argocd}}" target="_blank">Deploy - ArgoCD</a>
|
||||
</li>
|
||||
<hr>
|
||||
<span>Ops</span>
|
||||
<li>
|
||||
<a class="d-inline-flex align-items-center rounded" href="{{request.user.url_web_ide}}" target="_blank">Web VScode - CodeServer</a>
|
||||
</li>
|
||||
|
||||
<li>
|
||||
<a class="d-inline-flex align-items-center rounded" href="{{request.user.url_rancher}}" target="_blank">Cluster Management - Rancher</a>
|
||||
</li>
|
||||
<li>
|
||||
<a class="d-inline-flex align-items-center rounded" href="{{request.user.url_grafana}}" target="_blank">Monitoring - Grafana</a>
|
||||
</li>
|
||||
<li>
|
||||
<a class="d-inline-flex align-items-center rounded" href="{{request.user.url_prometheus}}" target="_blank">Metrics - Prometheus</a>
|
||||
</li>
|
||||
<li>
|
||||
<a class="d-inline-flex align-items-center rounded" href="{{request.user.url_opensearch}}" target="_blank">Container Log - OpenSearch</a>
|
||||
</li>
|
||||
<li>
|
||||
<a class="d-inline-flex align-items-center rounded" href="{{request.user.url_kiali}}" target="_blank">Main Cluster Traffic - Kiali</a>
|
||||
</li>
|
||||
{% else %}
|
||||
<p>로그인이 필요합니다.</p>
|
||||
<a class="d-inline-flex align-items-center rounded" href="/notice/2/" target="_blank">사용가이드</a>
|
||||
{% endif %}
|
||||
<li>
|
||||
<a class="d-inline-flex align-items-center rounded" href="{{request.user.url_rancher}}" target="_blank">Cluster Management - Rancher</a>
|
||||
</li>
|
||||
<li>
|
||||
<a class="d-inline-flex align-items-center rounded" href="{{request.user.url_grafana}}" target="_blank">Monitoring - Grafana</a>
|
||||
</li>
|
||||
<li>
|
||||
<a class="d-inline-flex align-items-center rounded" href="{{request.user.url_prometheus}}" target="_blank">Metrics - Prometheus</a>
|
||||
</li>
|
||||
<li>
|
||||
<a class="d-inline-flex align-items-center rounded" href="{{request.user.url_opensearch}}" target="_blank">Container Log - OpenSearch</a>
|
||||
</li>
|
||||
<li>
|
||||
<a class="d-inline-flex align-items-center rounded" href="{{request.user.url_kiali}}" target="_blank">Main Cluster Traffic - Kiali</a>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
<hr>
|
||||
|
@ -1,5 +1,5 @@
|
||||
<li class="my-2">
|
||||
<button class="btn d-inline-flex align-items-center collapsed" data-bs-toggle="collapse" aria-expanded="false" data-bs-target="#ansible-collapse" aria-controls="ansible-collapse">On-premise Ansible</button>
|
||||
<button class="btn d-inline-flex align-items-center collapsed" data-bs-toggle="collapse" aria-expanded="false" data-bs-target="#ansible-collapse" aria-controls="ansible-collapse">On-premise Ansible ▽</button>
|
||||
|
||||
<ul class="list-unstyled ps-3 collapse" id="ansible-collapse">
|
||||
<li>
|
||||
|
@ -0,0 +1,8 @@
|
||||
<li class="my-2">
|
||||
<button class="btn d-inline-flex align-items-center collapsed" data-bs-toggle="collapse" aria-expanded="false" data-bs-target="#tm_dsbd-collapse" aria-controls="tm_dsbd-collapse">Telemetry Dashboard ▽</button>
|
||||
<ul class="list-unstyled ps-3 collapse" id="tm_dsbd-collapse">
|
||||
<li>
|
||||
<a class="d-inline-flex align-items-center rounded" href="/tm_dsbd/grafana">grafana</a>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
0
telemetry_dashboard/__init__.py
Normal file
0
telemetry_dashboard/__init__.py
Normal file
3
telemetry_dashboard/admin.py
Normal file
3
telemetry_dashboard/admin.py
Normal file
@ -0,0 +1,3 @@
|
||||
from django.contrib import admin
|
||||
|
||||
# Register your models here.
|
6
telemetry_dashboard/apps.py
Normal file
6
telemetry_dashboard/apps.py
Normal file
@ -0,0 +1,6 @@
|
||||
from django.apps import AppConfig
|
||||
|
||||
|
||||
class TelemetryDashboardConfig(AppConfig):
|
||||
default_auto_field = 'django.db.models.BigAutoField'
|
||||
name = 'telemetry_dashboard'
|
0
telemetry_dashboard/migrations/__init__.py
Normal file
0
telemetry_dashboard/migrations/__init__.py
Normal file
3
telemetry_dashboard/models.py
Normal file
3
telemetry_dashboard/models.py
Normal file
@ -0,0 +1,3 @@
|
||||
from django.db import models
|
||||
|
||||
# Create your models here.
|
@ -0,0 +1,19 @@
|
||||
{% extends "components/base.html" %}
|
||||
|
||||
{% block title %}Landing Page{% endblock %}
|
||||
|
||||
{% block main_area %}
|
||||
<article class="pt-3">
|
||||
<h2 class="fw-bold pb-2">Grafana</h2>
|
||||
<!-- Grafana IFrame -->
|
||||
<div class="ratio ratio-16x9">
|
||||
<iframe
|
||||
src="https://grafana.icurfer.com/public-dashboards/40d2a2615010433d81f5cf40caa03541"
|
||||
width="100%"
|
||||
height="800"
|
||||
frameborder="0"
|
||||
allowfullscreen
|
||||
></iframe>
|
||||
</div>
|
||||
</article>
|
||||
{% endblock %}
|
3
telemetry_dashboard/tests.py
Normal file
3
telemetry_dashboard/tests.py
Normal file
@ -0,0 +1,3 @@
|
||||
from django.test import TestCase
|
||||
|
||||
# Create your tests here.
|
8
telemetry_dashboard/urls.py
Normal file
8
telemetry_dashboard/urls.py
Normal file
@ -0,0 +1,8 @@
|
||||
from django.urls import path
|
||||
from . import views
|
||||
|
||||
app_name = 'tm_dsbd'
|
||||
|
||||
urlpatterns = [
|
||||
path('grafana/', views.grafana_view, name='grafana'),
|
||||
]
|
11
telemetry_dashboard/views.py
Normal file
11
telemetry_dashboard/views.py
Normal file
@ -0,0 +1,11 @@
|
||||
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 django.db.models import Q
|
||||
|
||||
|
||||
def grafana_view(request):
|
||||
return render(
|
||||
request,
|
||||
"telemetry_dashboard/grafana.html",
|
||||
)
|
Loading…
Reference in New Issue
Block a user