Skip to content

Commit 5991a6c

Browse files
committed
INTEGRITY: Add button for bulk fileset deletion.
1 parent 58bcdd8 commit 5991a6c

File tree

4 files changed

+143
-30
lines changed

4 files changed

+143
-30
lines changed

src/app/fileset.py

Lines changed: 73 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1842,15 +1842,13 @@ def logs():
18421842
"text": "log",
18431843
}
18441844
logs_per_page = get_logs_per_page()
1845-
return render_template_string(
1846-
create_page(
1847-
filename, logs_per_page, records_table, select_query, order, filters
1848-
)
1845+
render_html_string, _, _ = create_page(
1846+
filename, logs_per_page, records_table, select_query, order, filters
18491847
)
1848+
return render_template_string(render_html_string)
18501849

18511850

1852-
@app.route("/fileset_search")
1853-
def fileset_search():
1851+
def get_fileset_search_details():
18541852
filename = "fileset_search"
18551853
records_table = "fileset"
18561854
select_query = """
@@ -1882,19 +1880,78 @@ def fileset_search():
18821880
"file.id": "filechecksum.file",
18831881
}
18841882
filesets_per_page = get_filesets_per_page()
1885-
return render_template_string(
1886-
create_page(
1887-
filename,
1888-
filesets_per_page,
1889-
records_table,
1890-
select_query,
1891-
order,
1892-
filters,
1893-
mapping,
1894-
)
1883+
1884+
return (
1885+
filename,
1886+
records_table,
1887+
select_query,
1888+
order,
1889+
filters,
1890+
mapping,
1891+
filesets_per_page,
18951892
)
18961893

18971894

1895+
@app.route("/fileset_search")
1896+
def fileset_search():
1897+
(
1898+
filename,
1899+
records_table,
1900+
select_query,
1901+
order,
1902+
filters,
1903+
mapping,
1904+
filesets_per_page,
1905+
) = get_fileset_search_details()
1906+
render_html_string, _, _ = create_page(
1907+
filename,
1908+
filesets_per_page,
1909+
records_table,
1910+
select_query,
1911+
order,
1912+
filters,
1913+
mapping,
1914+
)
1915+
return render_template_string(render_html_string)
1916+
1917+
1918+
@app.route("/delete_filtered_filesets", methods=["GET"])
1919+
def delete_filtered_filesets():
1920+
(
1921+
filename,
1922+
records_table,
1923+
select_query,
1924+
order,
1925+
filters,
1926+
mapping,
1927+
filesets_per_page,
1928+
) = get_fileset_search_details()
1929+
_, select_query, condition = create_page(
1930+
filename,
1931+
filesets_per_page,
1932+
records_table,
1933+
select_query,
1934+
order,
1935+
filters,
1936+
mapping,
1937+
)
1938+
query = f"{select_query} {condition}"
1939+
connection = db_connect()
1940+
with connection.cursor() as cursor:
1941+
cursor.execute(query)
1942+
filtered_filesets = cursor.fetchall()
1943+
filtered_filesets_id = [f["fileset"] for f in filtered_filesets]
1944+
placeholders = ",".join(["%s"] * len(filtered_filesets_id))
1945+
cursor.execute(
1946+
f"DELETE FROM fileset WHERE id IN ({placeholders})", filtered_filesets_id
1947+
)
1948+
user = f"cli:{getpass.getuser()}"
1949+
log_text = f"{len(filtered_filesets_id)} filesets deleted by moderator: {user}."
1950+
create_log("Filesets Deleted", user, log_text, connection)
1951+
connection.commit()
1952+
return redirect("/logs")
1953+
1954+
18981955
@app.route("/email_notification/<int:fileset_id>", methods=["GET"])
18991956
def email_notification(fileset_id):
19001957
connection = db_connect()

src/app/pagination.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,12 @@ def create_page(
138138
with open(navbar_path, "r") as f:
139139
html = f.read()
140140

141+
if records_table != "fileset":
142+
html = html.replace(
143+
'<button type="submit">Delete Filtered Filesets</button>',
144+
'<button type="submit" style="display:none;" disabled>Delete Filtered Filesets</button>',
145+
)
146+
141147
# Generate HTML
142148
html += """
143149
<form id='filters-form' method='GET' onsubmit='remove_empty_inputs()'>
@@ -319,4 +325,4 @@ def create_page(
319325
html += "<input type='submit' value='Submit'>"
320326
html += "</div></form>"
321327

322-
return html
328+
return html, select_query, condition

src/scripts/db_functions.py

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -324,12 +324,6 @@ def add_all_equal_checksums(checksize, checktype, checksum, file_id, conn):
324324
)
325325

326326

327-
def delete_filesets(conn):
328-
query = "DELETE FROM fileset WHERE `delete` = TRUE"
329-
with conn.cursor() as cursor:
330-
cursor.execute(query)
331-
332-
333327
def create_log(category, user, text, conn):
334328
with conn.cursor() as cursor:
335329
try:

static/navbar_string.html

Lines changed: 63 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,59 @@
11
<!DOCTYPE html>
2-
<html>
3-
<head>
4-
<link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='style.css') }}">
5-
<link rel="icon" type="image/png" sizes="32x32" href="/static/favicon-32x32.png">
6-
<link rel="icon" type="image/png" sizes="16x16" href="/static/favicon-16x16.png">
7-
</head>
8-
<body>
2+
<html>
3+
4+
<head>
5+
<link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='style.css') }}">
6+
<link rel="icon" type="image/png" sizes="32x32" href="/static/favicon-32x32.png">
7+
<link rel="icon" type="image/png" sizes="16x16" href="/static/favicon-16x16.png">
8+
<style>
9+
.dev {
10+
background-color: #fafeff;
11+
padding: 10px;
12+
border-radius: 5px;
13+
margin-left: auto;
14+
}
15+
16+
button {
17+
background-color: #d9534f;
18+
color: white;
19+
padding: 10px 20px;
20+
font-size: 16px;
21+
border: none;
22+
border-radius: 4px;
23+
cursor: pointer;
24+
transition: background-color 0.3s, box-shadow 0.3s;
25+
}
26+
27+
button:hover {
28+
background-color: #c9302c;
29+
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);
30+
}
31+
32+
@media (max-width: 768px) {
33+
.fileset_database {
34+
font-size: 48px;
35+
}
36+
}
37+
38+
@media (max-width: 480px) {
39+
.fileset_database {
40+
font-size: 32px;
41+
}
42+
43+
nav {
44+
padding: 10px;
45+
}
46+
47+
.nav-buttons a {
48+
margin-bottom: 5px;
49+
display: block;
50+
text-align: center;
51+
}
52+
}
53+
</style>
54+
</head>
55+
56+
<body>
957
<nav>
1058
<div class="logo">
1159
<a href="{{ url_for('home') }}">
@@ -19,4 +67,12 @@
1967
<a href="{{ url_for('logs') }}">Logs</a>
2068
<a href="{{ url_for('config') }}">Config</a>
2169
</div>
70+
<div class="dev">
71+
<form onsubmit="return confirm('Are you sure you want to delete the filtered filesets?');" action="{{ url_for('delete_filtered_filesets') }}" method="GET">
72+
{% for key, value in request.args.items() %}
73+
<input type="hidden" name="{{ key }}" value="{{ value }}">
74+
{% endfor %}
75+
<button type="submit">Delete Filtered Filesets</button>
76+
</form>
77+
</div>
2278
</nav>

0 commit comments

Comments
 (0)