|
1 | 1 | import os |
| 2 | +from app.modules.dataset.services import DOIMappingService, DSMetaDataService |
2 | 3 | from app.modules.flamapy.services import FlamapyService |
3 | 4 | from flask import current_app, jsonify, make_response, request, send_from_directory |
4 | 5 | from flask_login import current_user, login_required |
5 | 6 | from app.modules.hubfile import hubfile_bp |
6 | 7 | from app.modules.hubfile.services import HubfileDownloadRecordService, HubfileService |
7 | 8 | from flask import render_template |
| 9 | +from flask import abort, redirect, url_for |
8 | 10 |
|
9 | 11 | hubfile_download_record_service = HubfileDownloadRecordService() |
10 | 12 |
|
11 | 13 | flamapy_service = FlamapyService() |
| 14 | +doi_mapping_service = DOIMappingService() |
| 15 | +dsmetadata_service = DSMetaDataService() |
12 | 16 |
|
13 | 17 |
|
14 | 18 | @hubfile_bp.route("/hubfile/upload", methods=["POST"]) |
@@ -144,6 +148,59 @@ def view_uvl(file_id): |
144 | 148 | ) |
145 | 149 |
|
146 | 150 |
|
| 151 | +@hubfile_bp.route("/doi/<path:doi>/files/<string:filename>", methods=["GET"]) |
| 152 | +def view_uvl_with_doi(doi, filename): |
| 153 | + # 1. Comprobar si el DOI está redirigido a otro |
| 154 | + new_doi = doi_mapping_service.get_new_doi(doi) |
| 155 | + if new_doi: |
| 156 | + return redirect( |
| 157 | + url_for("hubfile.view_uvl_with_doi", doi=new_doi, filename=filename), |
| 158 | + code=302, |
| 159 | + ) |
| 160 | + |
| 161 | + # 2. Buscar dataset por DOI |
| 162 | + ds_meta_data = dsmetadata_service.filter_by_doi(doi) |
| 163 | + if not ds_meta_data: |
| 164 | + abort(404) |
| 165 | + |
| 166 | + dataset = ds_meta_data.dataset |
| 167 | + |
| 168 | + # 3. Buscar hubfile por nombre dentro del dataset |
| 169 | + selected_file = next( |
| 170 | + ( |
| 171 | + hf |
| 172 | + for fm in dataset.feature_models |
| 173 | + for hf in fm.hubfiles |
| 174 | + if hf.name == filename |
| 175 | + ), |
| 176 | + None, |
| 177 | + ) |
| 178 | + if not selected_file: |
| 179 | + abort(404) |
| 180 | + |
| 181 | + # 4. Construir ruta al archivo en disco |
| 182 | + directory_path = os.path.join( |
| 183 | + "uploads", f"user_{dataset.user_id}", f"dataset_{dataset.id}", "uvl" |
| 184 | + ) |
| 185 | + file_path = os.path.join( |
| 186 | + current_app.root_path, "..", directory_path, selected_file.name |
| 187 | + ) |
| 188 | + |
| 189 | + try: |
| 190 | + with open(file_path, "r") as f: |
| 191 | + content = f.read() |
| 192 | + except Exception as e: |
| 193 | + content = f"[Error reading file: {e}]" |
| 194 | + |
| 195 | + return render_template( |
| 196 | + "hubfile/view_file.html", |
| 197 | + selected_file=selected_file, |
| 198 | + hubfiles=dataset.files(), |
| 199 | + dataset=dataset, |
| 200 | + uvl_content=content, |
| 201 | + ) |
| 202 | + |
| 203 | + |
147 | 204 | @hubfile_bp.route("/hubfiles/raw/<int:file_id>", methods=["GET"]) |
148 | 205 | def raw_uvl(file_id): |
149 | 206 | selected_file = HubfileService().get_or_404(file_id) |
|
0 commit comments