Skip to content

Commit

Permalink
Merge pull request #895 from sul-dlss/855-file-downloads
Browse files Browse the repository at this point in the history
Template and View for downloading data exports MARC files
  • Loading branch information
jgreben committed Mar 14, 2024
2 parents c7f21db + f1229e7 commit 331f74e
Show file tree
Hide file tree
Showing 6 changed files with 122 additions and 6 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
import json
import pathlib
from flask_appbuilder import expose, BaseView as AppBuilderBaseView


parent = pathlib.Path(__file__).resolve().parent
vendor_file = open(parent / "vendors.json")
vendors = json.load(vendor_file)


def path_parent(full_path: pathlib.Path) -> str:
parts = full_path.parts

return parts[len(parts) - 2]


class DataExportDownloadView(AppBuilderBaseView):
default_view = "data_export_download_home"
route_base = "/data_export_download"

@expose("/")
def data_export_download_home(self):
content = []
for vendor in vendors['vendors']:
for path in pathlib.Path(f"data-export-files/{vendor}/marc-files").glob(
"*"
):
content.append({vendor: [path_parent(path), path.name]})

for path in pathlib.Path(f"data-export-files/{vendor}/transmitted").glob(
"*"
):
content.append({vendor: [path_parent(path), path.name]})

return self.render_template("data-export-download/index.html", content=content)

@expose("/downloads/<vendor>/<folder>/<filename>")
def vendor_marc_record(self, vendor, folder, filename):
file_bytes = pathlib.Path(
f"data-export-files/{vendor}/{folder}/{filename}"
).read_bytes() # noqa
return file_bytes
Original file line number Diff line number Diff line change
@@ -1,12 +1,17 @@
import json
import pandas as pd
import pathlib
import re

from flask import flash, request
from flask_appbuilder import expose, BaseView as AppBuilderBaseView

from libsys_airflow.plugins.data_exports.instance_ids import save_ids

vendors = ['gobi', 'google', 'hathi', 'nielsen', 'oclc', 'pod', 'sharevde', 'west']

parent = pathlib.Path(__file__).resolve().parent
vendor_file = open(parent / "vendors.json")
vendors = json.load(vendor_file)


def upload_data_export_ids(ids_df: pd.DataFrame, vendor: str) -> str:
Expand All @@ -25,7 +30,9 @@ def upload_data_export_ids(ids_df: pd.DataFrame, vendor: str) -> str:


def default_rendered_page(self):
return self.render_template("data-export-upload/index.html", vendors=vendors)
return self.render_template(
"data-export-upload/index.html", vendors=vendors['vendors']
)


class DataExportUploadView(AppBuilderBaseView):
Expand Down
12 changes: 12 additions & 0 deletions libsys_airflow/plugins/data_exports/apps/vendors.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"vendors": [
"gobi",
"google",
"hathi",
"nielsen",
"oclc",
"pod",
"sharevde",
"west"
]
}
32 changes: 29 additions & 3 deletions libsys_airflow/plugins/data_exports/main.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,19 @@
from airflow.plugins_manager import AirflowPlugin
from flask import Blueprint

from libsys_airflow.plugins.data_exports.data_export_upload_view import (
from libsys_airflow.plugins.data_exports.apps.data_export_upload_view import (
DataExportUploadView,
)
from libsys_airflow.plugins.data_exports.apps.data_export_download_view import (
DataExportDownloadView,
)

fileupload_bp = Blueprint("data_export_upload", __name__, template_folder="templates")
data_export_upload_bp = Blueprint(
"data_export_upload", __name__, template_folder="templates"
)
data_export_download_bp = Blueprint(
"data_export_download", __name__, template_folder="templates"
)

data_export_upload_view = DataExportUploadView()
data_export_upload_view_package = {
Expand All @@ -14,13 +22,31 @@
"view": data_export_upload_view,
}

data_export_download_view = DataExportDownloadView()
data_export_download_view_package = {
"name": "Data Export MARC Download",
"category": "FOLIO",
"view": data_export_download_view,
}


class DataExportUploadPlugin(AirflowPlugin):
name = "Data Export CSV Upload"
operators = [] # type: ignore
flask_blueprints = [fileupload_bp]
flask_blueprints = [data_export_upload_bp]
hooks = []
executors = []
admin_views = []
appbuilder_views = [data_export_upload_view_package]
appbuilder_menu_items = []


class DataExportDownloadPlugin(AirflowPlugin):
name = "Data Export MARC Download"
operators = [] # type: ignore
flask_blueprints = [data_export_download_bp]
hooks = []
executors = []
admin_views = []
appbuilder_views = [data_export_download_view_package]
appbuilder_menu_items = []
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
{% extends "appbuilder/base.html" %}

{% block content %}
<div>
<h2>Vendor MARC files</h2>
<table class="table table-striped">
<tr>
<th>Vendor</th>
<th>Status</th>
<th>MARC file (download)</th>
</tr>
{% for item in content %}
{% for vendor, marcfile in item.items() %}
<tr>
<td>
{{ vendor }}
</td>
<td>
{{ marcfile[0] }}
</td>
<td>
<a href="{{ url_for('DataExportDownloadView.vendor_marc_record', vendor=vendor, folder=marcfile[0], filename=marcfile[1]) }}" download>{{ marcfile[1] }}</a>
</td>
</tr>
{% endfor %}
{% endfor %}
</table>
</div>
{% endblock %}
2 changes: 1 addition & 1 deletion tests/data_exports/test_save_instance_ids.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import pytest

from libsys_airflow.plugins.data_exports.instance_ids import save_ids_to_fs
from libsys_airflow.plugins.data_exports.data_export_upload_view import (
from libsys_airflow.plugins.data_exports.apps.data_export_upload_view import (
upload_data_export_ids,
)

Expand Down

0 comments on commit 331f74e

Please sign in to comment.