Allow the selecting of target dir when uploading or downloading files (#867)

Uses a single endpoint for downloading files
Adds a select field to pick target dir for both download and upload forms
Moves the Macproxy/Netatalk helptext into the helptext blocks, and the related status messages down into the page footer
This commit is contained in:
Daniel Markstedt 2022-09-27 17:38:34 -07:00 committed by GitHub
parent 3ac3abb13f
commit 3c8e7dbef0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 64 additions and 107 deletions

View File

@ -334,6 +334,7 @@
{% if bridge_configured %}
<li>{{ _("The <tt>rascsi_bridge</tt> network bridge is active and ready to be used by an emulated network adapter!") }}</li>
{% endif %}
<li>{{ _("To browse the modern web, install a vintage web proxy like <a href=\"%(url)s\">Macproxy</a>.", url="https://github.com/akuker/RASCSI/wiki/Vintage-Web-Proxy#macproxy") }}</li>
</li>
</ul>
<li>{{ _("The Printer and Host Services device are currently supported on compatible Atari systems, and require <a href=\"%(url)s\">driver software</a> to be installed on the host system.", url="https://www.hddriver.net/en/rascsi_tools.html") }}
@ -385,28 +386,31 @@
</tr>
{% endfor %}
</table>
{% if macproxy_configured %}
<p><small>{{ _("Macproxy is running at %(ip_addr)s (default port 5000)", ip_addr=ip_addr) }}</small></p>
{% else %}
<p><small>{{ _("Install <a href=\"%(url)s\">Macproxy</a> to browse the Web with any vintage browser. It's not just for Macs!", url="https://github.com/akuker/RASCSI/wiki/Vintage-Web-Proxy#macproxy") }}</small></p>
{% endif %}
<hr/>
<details>
<summary class="heading">
{{ _("Upload File") }}
{{ _("Upload File from Local Computer") }}
</summary>
<ul>
<li>{{ _("Files are uploaded to <tt>%(directory)s</tt>.", directory=base_dir) }}</li>
<li>{{ _("The largest file size accepted in this form is %(max_file_size)s MiB. Use other file transfer means for larger files.", max_file_size=max_file_size) }}</li>
<li>{{ _("File uploads will progress only if you stay on this page. If you navigate away before the transfer is completed, you will end up with an incomplete file.") }}</li>
<li>{{ _("Install <a href=\"%(url)s\">Netatalk</a> to use the AFP File Server.", url="https://github.com/akuker/RASCSI/wiki/AFP-File-Sharing") }}</li>
</ul>
</details>
<table style="border: none;">
<tr style="border: none;">
<td style="border: none; vertical-align:top;">
<form name="dropper" action="/files/upload" method="post" class="dropzone dz-clickable" enctype="multipart/form-data" id="dropper"></form>
<form name="dropper" action="/files/upload" method="post" class="dropzone dz-clickable" enctype="multipart/form-data" id="dropper">
<p>
<label for="destination">{{ _("Target directory:") }}</label>
<select name="destination">
<option value="images">{{ base_dir }}</option>
<option value="afp">{{ AFP_DIR }}</option>
</select>
</p>
</form>
</td>
</tr>
</table>
@ -443,20 +447,26 @@
<details>
<summary class="heading">
{{ _("Download File to Images") }}
{{ _("Download File from the Web") }}
</summary>
<ul>
<li>{{ _("Given a URL, download that file to the <tt>%(directory)s</tt> directory.", directory=base_dir) }}</li>
<li>{{ _("Choose the desination directory and download a file from the Web to your Raspberry Pi.") }}</li>
<li>{{ _("Install <a href=\"%(url)s\">Netatalk</a> to use the AFP File Server.", url="https://github.com/akuker/RASCSI/wiki/AFP-File-Sharing") }}</li>
</ul>
</details>
<table style="border: none">
<tr style="border: none">
<td style="border: none; vertical-align:top;">
<form action="/files/download_to_images" method="post">
<form action="/files/download_url" method="post">
<label for="destination">{{ _("Target directory:") }}</label>
<select name="destination">
<option value="images">{{ base_dir }}</option>
<option value="afp">{{ AFP_DIR }}</option>
</select>
<label for="url">{{ _("URL:") }}</label>
<input name="url" placeholder="{{ _("URL") }}" required="" type="url">
<input type="submit" value="{{ _("Download") }}" onclick="processNotify('{{ _("Downloading File to Images...") }}')">
<input type="submit" value="{{ _("Download") }}" onclick="processNotify('{{ _("Downloading File...") }}')">
</form>
</td>
</tr>
@ -464,43 +474,6 @@
<hr/>
<details>
<summary class="heading">
{{ _("Download File to AppleShare") }}
</summary>
<ul>
<li>{{ _("Given a URL, download that file to the <tt>%(directory)s</tt> directory and share it over AFP.", directory=AFP_DIR) }}</li>
<li>{{ _("Manage the files you download here through AppleShare on your vintage Mac.") }}</li>
<li>{{ _("Requires <a href=\"%(url)s\">Netatalk</a> to be installed and configured correctly for your network.", url="https://github.com/akuker/RASCSI/wiki/AFP-File-Sharing") }}</li>
</ul>
</details>
{% if netatalk_configured %}
<table style="border: none">
<tr style="border: none">
<td style="border: none; vertical-align:top;">
<form action="/files/download_to_afp" method="post">
<label for="url">{{ _("URL:") }}</label>
<input name="url" placeholder="{{ _("URL") }}" required="" type="url">
<input type="submit" value="{{ _("Download") }}" onclick="processNotify('{{ _("Downloading File to AppleShare...") }}')">
</form>
</td>
</tr>
</table>
{% if netatalk_configured == 1 %}
<p><small>{{ _("The AppleShare server is running. No active connections.") }}</small></p>
{% elif netatalk_configured == 2 %}
<p><small>{{ _("%(value)d active AFP connection", value=(netatalk_configured - 1)) }}</small></p>
{% elif netatalk_configured > 2 %}
<p><small>{{ _("%(value)d active AFP connections", value=(netatalk_configured - 1)) }}</small></p>
{% endif %}
{% else %}
<p>{{ _("Install <a href=\"%(url)s\">Netatalk</a> to use the AppleShare File Server.", url="https://github.com/akuker/RASCSI/wiki/AFP-File-Sharing") }}</p>
{% endif %}
<hr/>
<details>
<summary class="heading">
{{ _("Download File and Create CD-ROM image") }}
@ -725,4 +698,20 @@
</tr>
</table>
<center><tt>
{% if netatalk_configured == 1 %}
{{ _("The AppleShare server is running. No active connections.") }}
{% endif %}
{% if netatalk_configured == 2 %}
{{ _("%(value)d active AFP connection", value=(netatalk_configured - 1)) }}
{% elif netatalk_configured > 2 %}
{{ _("%(value)d active AFP connections", value=(netatalk_configured - 1)) }}
{% endif %}
</center></tt>
<center><tt>
{% if macproxy_configured %}
<center><tt>{{ _("Macproxy is running at %(ip_addr)s (default port 5000)", ip_addr=env['ip_addr']) }}</tt></center>
{% endif %}
</center></tt>
{% endblock content %}

View File

@ -824,34 +824,20 @@ def download_to_iso():
])
@APP.route("/files/download_to_images", methods=["POST"])
@APP.route("/files/download_url", methods=["POST"])
@login_required
def download_img():
def download_file():
"""
Downloads a remote file onto the images dir on the Pi
"""
destination = request.form.get("destination")
url = request.form.get("url")
server_info = ractl_cmd.get_server_info()
process = file_cmd.download_to_dir(url, server_info["image_dir"], Path(url).name)
process = ReturnCodeMapper.add_msg(process)
if process["status"]:
return response(message=process["msg"])
return response(error=True, message=[
(_("Failed to download file from %(url)s", url=url), "error"),
(process["msg"], "error"),
])
@APP.route("/files/download_to_afp", methods=["POST"])
@login_required
def download_afp():
"""
Downloads a remote file onto the AFP shared dir on the Pi
"""
url = request.form.get("url")
file_name = Path(url).name
process = file_cmd.download_to_dir(url, AFP_DIR, file_name)
if destination == "afp":
destination_dir = AFP_DIR
else:
server_info = ractl_cmd.get_server_info()
destination_dir = server_info["image_dir"]
process = file_cmd.download_to_dir(url, destination_dir, Path(url).name)
process = ReturnCodeMapper.add_msg(process)
if process["status"]:
return response(message=process["msg"])
@ -873,8 +859,13 @@ def upload_file():
if auth["status"] and "username" not in session:
return make_response(auth["msg"], 403)
server_info = ractl_cmd.get_server_info()
return upload_with_dropzonejs(server_info["image_dir"])
destination = request.form.get("destination")
if destination == "afp":
destination_dir = AFP_DIR
else:
server_info = ractl_cmd.get_server_info()
destination_dir = server_info["image_dir"]
return upload_with_dropzonejs(destination_dir)
@APP.route("/files/create", methods=["POST"])

View File

@ -122,8 +122,9 @@ def test_extract_file(
)
http_client.post(
"/files/download_to_images",
"/files/download_url",
data={
"destination": "images",
"url": url,
},
)
@ -200,7 +201,10 @@ def test_upload_file(http_client, delete_file):
def test_download_file(http_client, create_test_image):
file_name = create_test_image()
response = http_client.post("/files/download", data={"file": f"{IMAGES_DIR}/{file_name}"})
response = http_client.post(
"/files/download",
data={"file": f"{IMAGES_DIR}/{file_name}"}
)
assert response.status_code == 200
assert response.headers["content-type"] == "application/octet-stream"
@ -208,36 +212,8 @@ def test_download_file(http_client, create_test_image):
assert response.headers["content-length"] == str(FILE_SIZE_1_MIB)
# route("/files/download_to_afp", methods=["POST"])
def test_download_url_to_afp_dir(httpserver, http_client):
file_name = str(uuid.uuid4())
http_path = f"/images/{file_name}"
url = httpserver.url_for(http_path)
with open("tests/assets/test_image.hds", mode="rb") as file:
file_data = file.read()
httpserver.expect_request(http_path).respond_with_data(
file_data,
mimetype="application/octet-stream",
)
response = http_client.post(
"/files/download_to_afp",
data={
"url": url,
},
)
response_data = response.json()
assert response.status_code == 200
assert response_data["status"] == STATUS_SUCCESS
assert response_data["messages"][0]["message"] == f"{file_name} downloaded to {AFP_DIR}"
# route("/files/download_to_images", methods=["POST"])
def test_download_url_to_images_dir(httpserver, http_client, list_files, delete_file):
# route("/files/download_url", methods=["POST"])
def test_download_url_to_dir(httpserver, http_client, list_files, delete_file):
file_name = str(uuid.uuid4())
http_path = f"/images/{file_name}"
url = httpserver.url_for(http_path)
@ -251,8 +227,9 @@ def test_download_url_to_images_dir(httpserver, http_client, list_files, delete_
)
response = http_client.post(
"/files/download_to_images",
"/files/download_url",
data={
"destination": "images",
"url": url,
},
)