Skip to content

Commit 641b926

Browse files
committed
Add file_url and json_url to File model and refactor
1 parent 5a9c22a commit 641b926

File tree

10 files changed

+98
-121
lines changed

10 files changed

+98
-121
lines changed

isimip_data/caveats/viewsets.py

Lines changed: 28 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
from rest_framework.response import Response
66
from rest_framework.viewsets import GenericViewSet, ReadOnlyModelViewSet
77

8-
from isimip_data.core.utils import get_file_base_url
98
from isimip_data.metadata.models import Dataset, File
109

1110
from .models import Caveat
@@ -30,43 +29,47 @@ def index(self, request):
3029
@action(detail=True, url_path='datasets', renderer_classes=[JSONRenderer])
3130
def detail_datasets(self, request, pk):
3231
caveat = self.get_object()
33-
metadata_url_template = request.build_absolute_uri('/datasets/') + '{}/'
34-
datasets = [
35-
dict(**dataset, metadata_url=metadata_url_template.format(dataset['id']))
36-
for dataset in Dataset.objects.using('metadata').filter(id__in=caveat.datasets)
37-
.values('id', 'path', 'version', 'public')
38-
]
39-
40-
response = Response(datasets)
32+
base_url = request.build_absolute_uri()
33+
datasets = Dataset.objects.using('metadata').filter(id__in=caveat.datasets)
34+
response = Response([
35+
{
36+
'id': dataset.id,
37+
'path': dataset.path,
38+
'version': dataset.version,
39+
'public': dataset.public,
40+
'metadata_url': base_url + dataset.get_absolute_url(),
41+
} for dataset in datasets
42+
])
4143
response['Content-Disposition'] = f'attachment; filename=caveat-{caveat.id}.datasets.json'
4244
return response
4345

4446
@action(detail=True, url_path='files', renderer_classes=[JSONRenderer])
4547
def detail_files(self, request, pk):
4648
caveat = self.get_object()
47-
metadata_url_template = request.build_absolute_uri('/files/') + '{}/'
48-
file_url_template = get_file_base_url(request)
49-
datasets = [
50-
dict(
51-
**file,
52-
metadata_url=metadata_url_template.format(file['id']),
53-
file_url=file_url_template + file['path']
54-
)
55-
for file in File.objects.using('metadata').filter(dataset__id__in=caveat.datasets)
56-
.values('id', 'dataset_id', 'path', 'version')
57-
]
58-
59-
response = Response(datasets)
49+
base_url = request.build_absolute_uri()
50+
files = File.objects.using('metadata').select_related('dataset').filter(dataset__id__in=caveat.datasets)
51+
response = Response([
52+
{
53+
'id': file.id,
54+
'dataset_id': file.dataset_id,
55+
'path': file.path,
56+
'version': file.version,
57+
'public': file.public,
58+
'metadata_url': base_url + file.get_absolute_url(),
59+
'file_url': file.file_url,
60+
'json_url': file.json_url
61+
} for file in files
62+
])
6063
response['Content-Disposition'] = f'attachment; filename=caveat-{caveat.id}.files.json'
6164
return response
6265

6366
@action(detail=True, url_path='filelist', renderer_classes=[TemplateHTMLRenderer])
6467
def detail_filelist(self, request, pk):
6568
caveat = self.get_object()
66-
69+
files = File.objects.using('metadata').select_related('dataset') \
70+
.filter(dataset__id__in=caveat.datasets, dataset__public=True)
6771
response = Response({
68-
'file_base_url': get_file_base_url(request),
69-
'files': File.objects.using('metadata').filter(dataset__id__in=caveat.datasets, dataset__public=True)
72+
'files': files
7073
}, template_name='metadata/filelist.txt', content_type='text/plain; charset=utf-8')
7174
response['Content-Disposition'] = f'attachment; filename=caveat-{caveat.id}.txt'
7275
return response

isimip_data/core/utils.py

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -5,27 +5,6 @@
55
from django.template.loader import get_template
66

77

8-
def trailing_slash(string):
9-
if string is None:
10-
return string
11-
else:
12-
return string.rstrip('/') + '/'
13-
14-
15-
def via_proxy(request):
16-
remote_addr = request.META.get('HTTP_X_FORWARDED_FOR') or request.META.get('REMOTE_ADDR')
17-
return settings.PROXY and (remote_addr in settings.PROXY)
18-
19-
20-
def get_file_base_url(request):
21-
url = settings.PROXY_FILES_BASE_URL if via_proxy(request) else settings.FILES_BASE_URL
22-
return trailing_slash(url)
23-
24-
25-
def get_file_api_url(request):
26-
url = settings.PROXY_FILES_API_URL if via_proxy(request) else settings.FILES_API_URL
27-
return trailing_slash(url)
28-
298
def get_download_operations(request):
309
return [
3110
{

isimip_data/core/viewsets.py

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from rest_framework.viewsets import GenericViewSet
55

66
from .serializers import SettingsSerializer
7-
from .utils import get_download_operations, get_file_api_url, get_file_base_url
7+
from .utils import get_download_operations
88

99

1010
class SettingsViewSet(ListModelMixin, GenericViewSet):
@@ -13,14 +13,6 @@ class SettingsViewSet(ListModelMixin, GenericViewSet):
1313

1414
def get_queryset(self):
1515
return [
16-
{
17-
'key': 'FILES_BASE_URL',
18-
'value': get_file_base_url(self.request),
19-
},
20-
{
21-
'key': 'FILES_API_URL',
22-
'value': get_file_api_url(self.request),
23-
},
2416
{
2517
'key': 'DOWNLOAD_OPERATIONS',
2618
'value': get_download_operations(self.request),
@@ -30,6 +22,8 @@ def get_queryset(self):
3022
'key': key,
3123
'value': getattr(settings, key)
3224
} for key in [
25+
'FILES_BASE_URL',
26+
'FILES_API_URL',
3327
'METADATA_PAGE_SIZE',
3428
'METADATA_MAX_COUNT',
3529
'DOWNLOAD_OPERATIONS_HELP',

isimip_data/download/views.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1+
from django.conf import settings
12
from django.shortcuts import render
23
from django.views.decorators.csrf import csrf_exempt
34

4-
from isimip_data.core.utils import get_file_api_url
55
from isimip_data.metadata.models import File
66

77

@@ -12,7 +12,7 @@ def download(request, job_id=None):
1212

1313
return render(request, 'download/download.html', {
1414
'title': 'Configure download',
15-
'job_url': get_file_api_url(request) + job_id if job_id else None,
15+
'job_url': settings.FILE_API_URL + job_id if job_id else None,
1616
'files': [
1717
{
1818
'path': file.path,

isimip_data/metadata/models.py

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from datetime import datetime
22
from pathlib import Path
33

4+
from django.conf import settings
45
from django.contrib.postgres.fields import ArrayField
56
from django.contrib.postgres.search import SearchVectorField
67
from django.db import models
@@ -197,6 +198,20 @@ def json_ld(self):
197198
'isPartOf': self.dataset.json_ld
198199
}
199200

201+
@cached_property
202+
def file_url(self):
203+
if self.dataset.restricted:
204+
return f'{settings.FILES_BASE_URL}/restricted/{self.path}'
205+
else:
206+
return f'{settings.FILES_BASE_URL}/{self.path}'
207+
208+
@cached_property
209+
def json_url(self):
210+
if self.dataset.restricted:
211+
return f'{settings.FILES_BASE_URL}/restricted/{self.json_path}'
212+
else:
213+
return f'{settings.FILES_BASE_URL}/{self.json_path}'
214+
200215
def get_absolute_url(self):
201216
return reverse('file', kwargs={'pk': self.pk})
202217

@@ -333,9 +348,6 @@ def terms_of_use(self):
333348
def is_external(self):
334349
return self.datacite is None
335350

336-
def get_absolute_url(self):
337-
return reverse('resource', kwargs={'doi': self.doi})
338-
339351
@cached_property
340352
def json_ld(self):
341353
data = {
@@ -379,6 +391,9 @@ def json_ld(self):
379391

380392
return data
381393

394+
def get_absolute_url(self):
395+
return reverse('resource', kwargs={'doi': self.doi})
396+
382397

383398
class Tree(models.Model):
384399

isimip_data/metadata/serializers.py

Lines changed: 14 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,13 @@
33

44
from isimip_data.annotations.models import Annotation, Download, Figure, Reference
55
from isimip_data.caveats.models import Caveat
6-
from isimip_data.core.utils import get_file_base_url
76

87
from .models import Dataset, File, Identifier, Resource
98

109

1110
class DatasetFileSerializer(serializers.ModelSerializer):
1211

1312
metadata_url = serializers.SerializerMethodField()
14-
file_url = serializers.SerializerMethodField()
1513
rights = serializers.JSONField(source='rights_dict')
1614

1715
class Meta:
@@ -28,17 +26,13 @@ class Meta:
2826
'url',
2927
'metadata_url',
3028
'file_url',
29+
'json_url',
3130
'rights',
3231
'terms_of_use'
3332
)
3433

3534
def get_metadata_url(self, obj):
36-
return reverse('file', args=[obj.id], request=self.context['request'])
37-
38-
def get_file_url(self, obj):
39-
if obj.dataset.public:
40-
base_url = get_file_base_url(self.context['request'])
41-
return f'{base_url}restricted/{obj.path}' if obj.dataset.restricted else f'{base_url}{obj.path}'
35+
return reverse('file', args=[obj.id], request=self.context.get('request'))
4236

4337

4438
class DatasetResourceSerializer(serializers.ModelSerializer):
@@ -204,11 +198,11 @@ class Meta:
204198
)
205199

206200
def get_metadata_url(self, obj):
207-
return reverse('dataset', args=[obj.id], request=self.context['request'])
201+
return reverse('dataset', args=[obj.id], request=self.context.get('request'))
208202

209203
def get_filelist_url(self, obj):
210204
if obj.public:
211-
return reverse('dataset-detail-filelist', args=[obj.id], request=self.context['request'])
205+
return reverse('dataset-detail-filelist', args=[obj.id], request=self.context.get('request'))
212206

213207
def get_caveats(self, obj):
214208
if self.context.get('request').GET.get('caveats'):
@@ -259,8 +253,6 @@ class FileSerializer(serializers.ModelSerializer):
259253
links = FileLinkSerializer(many=True)
260254
search_rank = serializers.FloatField(required=False, default=0.0)
261255
metadata_url = serializers.SerializerMethodField()
262-
file_url = serializers.SerializerMethodField()
263-
json_url = serializers.SerializerMethodField()
264256
rights = serializers.JSONField(source='rights_dict')
265257

266258
class Meta:
@@ -289,17 +281,7 @@ class Meta:
289281
)
290282

291283
def get_metadata_url(self, obj):
292-
return reverse('file', args=[obj.id], request=self.context['request'])
293-
294-
def get_file_url(self, obj):
295-
if obj.dataset.public:
296-
base_url = get_file_base_url(self.context['request'])
297-
return f'{base_url}restricted/{obj.path}' if obj.dataset.restricted else f'{base_url}{obj.path}'
298-
299-
def get_json_url(self, obj):
300-
if obj.dataset.public:
301-
base_url = get_file_base_url(self.context['request'])
302-
return f'{base_url}restricted/{obj.json_path}' if obj.dataset.restricted else f'{base_url}{obj.json_path}'
284+
return reverse('file', args=[obj.id], request=self.context.get('request'))
303285

304286

305287
class ResourceIndexSerializer(serializers.ModelSerializer):
@@ -319,17 +301,20 @@ class Meta:
319301
'previous_version',
320302
'new_version',
321303
'is_external',
304+
'url',
322305
'resource_url',
323306
'creators_str',
324307
'publication_date'
325308
)
326309

327310
def get_resource_url(self, obj):
328-
return reverse('resource', args=[str(obj.doi)], request=self.context['request'])
311+
return reverse('resource', args=[str(obj.doi)], request=self.context.get('request'))
329312

330313

331314
class ResourceSerializer(serializers.ModelSerializer):
332315

316+
resource_url = serializers.SerializerMethodField()
317+
333318
class Meta:
334319
model = Resource
335320
fields = (
@@ -348,9 +333,14 @@ class Meta:
348333
'previous_version',
349334
'new_version',
350335
'is_external',
336+
'url',
337+
'resource_url',
351338
'datacite',
352339
)
353340

341+
def get_resource_url(self, obj):
342+
return reverse('resource', args=[str(obj.doi)], request=self.context.get('request'))
343+
354344

355345
class IdentifierSerializer(serializers.ModelSerializer):
356346

isimip_data/metadata/templates/metadata/file.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,10 +96,10 @@ <h3>{% trans 'Download' %}</h3>
9696
<div class="card">
9797
<ul class="list-group list-group-flush">
9898
<li class="list-group-item">
99-
<a href="{{ file_base_url }}{{ file.path }}">{% trans 'Download file' %}</a>
99+
<a href="{{ file.file_url }}">{% trans 'Download file' %}</a>
100100
</li>
101101
<li class="list-group-item">
102-
<a href="{{ file_base_url }}{{ file.json_path }}">{% trans 'Download metadata file' %}</a>
102+
<a href="{{ file.json_url }}">{% trans 'Download metadata file' %}</a>
103103
</li>
104104
{% if file.is_global and file.is_netcdf %}
105105
<li class="list-group-item">
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
{% for file in files %}{{ file_base_url }}{{ file.path }}
1+
{% for file in files %}{{ file.file_url }}
22
{% endfor %}

isimip_data/metadata/views.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
from isimip_data.access.utils import check_access
1313
from isimip_data.annotations.models import Download, Figure, Reference
1414
from isimip_data.caveats.models import Caveat
15-
from isimip_data.core.utils import get_file_base_url
1615

1716
from .models import Dataset, File, Identifier, Resource
1817
from .utils import render_bibtex
@@ -74,7 +73,6 @@ def dataset(request, pk=None, path=None):
7473
return render(request, 'metadata/dataset.html', {
7574
'title': f'Dataset {obj.name}',
7675
'dataset': obj,
77-
'file_base_url': get_file_base_url(request),
7876
'versions': versions,
7977
'public_version': versions.exclude(id=obj.id).filter(public=True).first(),
8078
'figures': Figure.objects.filter(annotations__datasets__contains=[obj.id]),
@@ -116,7 +114,6 @@ def file(request, pk=None, path=None):
116114
return render(request, 'metadata/file.html', {
117115
'title': f'File {obj.name}',
118116
'file': obj,
119-
'file_base_url': get_file_base_url(request),
120117
'parents': [obj.dataset],
121118
'versions': versions,
122119
'public_version': versions.exclude(id=obj.id).filter(dataset__public=True).first(),

0 commit comments

Comments
 (0)