Hot-keys on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
1import logging
3from actstream import actions
4from actstream.models import followers
5from django.contrib.auth.decorators import login_required
6from django.http import Http404, HttpResponse, HttpResponseForbidden
7from django.shortcuts import get_object_or_404, redirect, render
8from django.utils.translation import gettext as _
9from django_sendfile import sendfile
11from discuss_data.core.decorators import dd_tou_accepted
12from discuss_data.core.helpers import check_perms, is_curator_or_check_perms_for_ds
13from discuss_data.core.views import core_search_view
14from discuss_data.dddatasets.models import (
15 Category,
16 DataFile,
17 DataSet,
18 DataSetAccessRequest,
19 DataSetManagementObject,
20)
21from discuss_data.dddatasets.utils import check_published
23logger = logging.getLogger(__name__)
26# ************
27# public views
28# ************
31def search(request):
32 return core_search_view(request, "dataset_index", 10)
35# unused?
36def listing(request):
37 dsmos = DataSetManagementObject.objects.select_related("main_published_ds")
38 datasets = list()
39 for dsmo in dsmos:
40 if dsmo.main_published_ds:
41 datasets.append(dsmo.main_published_ds)
43 return render(
44 request,
45 "dddatasets/listing.html",
46 {"datasets": datasets, "pagetitle": _("Datasets")},
47 )
50def category_list(request):
51 categories = Category.objects.all()
52 return render(
53 request,
54 "dddatasets/category_list.html",
55 {"categories": categories, "pagetitle": _("Categories")},
56 )
59def category_page(request, slug):
60 logger.debug("category slug: {}".format(slug))
61 category = Category.objects.get(slug=slug)
62 return core_search_view(request, "dataset_index", 10, category=category)
65def detail(request, uuid):
66 ds = check_published(uuid)
67 return render(request, "dddatasets/detail.html", {"ds": ds, "type": "description"})
70def metadata(request, uuid):
71 ds = check_published(uuid)
72 return render(
73 request,
74 "dddatasets/metadata.html",
75 {"ds": ds, "updated": True, "type": "metadata"},
76 )
79def access(request, uuid):
80 ds = check_published(uuid)
81 return render(
82 request,
83 "dddatasets/access.html",
84 {"ds": ds, "updated": True, "type": "access"},
85 )
88def files(request, uuid):
89 ds = check_published(uuid)
90 datafiles = list()
91 for datafile in ds.get_datafiles():
92 if datafile.data_file_type in (
93 datafile.FILE_TYPE_DATA,
94 datafile.FILE_TYPE_CONVERTED,
95 ):
96 # if dataset is RA check permissions
97 if (
98 ds.data_access != ds.RESTRICTED_ACCESS
99 or is_curator_or_check_perms_for_ds(
100 "ra_view_dataset", request.user, datafile.dataset
101 )
102 ):
103 datafiles.append(
104 (datafile, datafile.file.size, datafile.get_file_format())
105 )
106 else:
107 datafiles.append(("RA", datafile.file.size, datafile.get_file_format()))
108 else:
109 datafiles.append((datafile, datafile.file.size, datafile.get_file_format()))
111 return render(
112 request,
113 "dddatasets/files.html",
114 {"ds": ds, "updated": True, "type": "files", "datafiles": datafiles},
115 )
118def files_pdf(request, uuid):
119 ds = get_object_or_404(DataSet, uuid=uuid)
121 try:
122 pdf_file = DataFile.objects.filter(dataset=ds, data_file_type="PDF")[0]
123 except DataFile.DoesNotExist as e:
124 raise Http404 from e
126 return download(request, pdf_file)
129def files_zip(request, uuid):
130 ds = get_object_or_404(DataSet, uuid=uuid)
131 try:
132 datafile = DataFile.objects.get(dataset=ds, data_file_type="ZIP")
133 except DataFile.DoesNotExist as e:
134 raise Http404 from e
136 if ds.data_access != ds.RESTRICTED_ACCESS or is_curator_or_check_perms_for_ds(
137 "ra_view_dataset", request.user, datafile.dataset
138 ):
139 return download(request, datafile)
141 return HttpResponseForbidden()
144def files_download(request, uuid, df_uuid):
145 # REFACTOR!!!!1!
146 ds = get_object_or_404(DataSet, uuid=uuid)
147 datafile = DataFile.objects.get(uuid=df_uuid, dataset=ds)
148 logger.info("datafile.file.path: %s", datafile.file.path, exc_info=1)
149 logger.info(
150 "datafile.get_download_file_name(): %s", datafile.get_download_file_name()
151 )
152 # check permissions for the dataset if it is of filetype DATA or CONVERTED
153 if datafile.data_file_type in (
154 datafile.FILE_TYPE_DATA,
155 datafile.FILE_TYPE_CONVERTED,
156 ):
157 # if dataset is RA check permissions
158 if ds.data_access != ds.RESTRICTED_ACCESS or is_curator_or_check_perms_for_ds(
159 "ra_view_dataset", request.user, datafile.dataset
160 ):
161 return download(request, datafile)
163 return HttpResponseForbidden()
165 return download(request, datafile)
168def download(request, datafile):
169 """sendfile download wrapper
170 """
171 return sendfile(
172 request,
173 datafile.file.path,
174 attachment=True,
175 attachment_filename=datafile.get_download_file_name(),
176 )
179def publications(request, uuid):
180 ds = check_published(uuid)
181 return render(
182 request, "dddatasets/publications.html", {"ds": ds, "type": "publications"},
183 )
186def versions(request, uuid):
187 ds = check_published(uuid)
188 published_versions = ds.get_published_versions()
189 return render(
190 request,
191 # 'dataset/versions/versions_tab.html',
192 "dddatasets/versions.html",
193 {"ds": ds, "type": "versions", "versions": published_versions},
194 )
197def discuss(request, uuid):
198 ds = check_published(uuid)
199 return render(request, "dddatasets/discuss.html", {"ds": ds, "type": "discuss"})
202# ************
203# views that require log-in
204# ************
205@login_required
206@dd_tou_accepted
207def follow(request, uuid):
208 # redirect if no intercooler request
209 if not request.is_intercooler():
210 return redirect("dddatasets:search")
211 try:
212 dataset = DataSet.objects.get(uuid=uuid)
213 except Exception:
214 raise Http404("Page not found.")
216 if request.user in followers(dataset):
217 actions.unfollow(request.user, dataset)
218 else:
219 actions.follow(request.user, dataset)
220 return render(
221 request,
222 "ddusers/_follow_button.html",
223 {
224 "object": dataset,
225 "follow_url": "dddatasets:follow",
226 "follow_text": "Follow this Dataset",
227 },
228 )
231@login_required
232@dd_tou_accepted
233def access_request(request, uuid):
234 ds = check_published(uuid)
235 # check restricted access view permissions for the dataset
236 if check_perms("ra_view_dataset", request.user, ds):
237 # user has already access
238 return HttpResponse(
239 '<button class="btn btn-success" disabled>{}</button>'.format(
240 _("You have access to this Dataset")
241 )
242 )
244 if request.method == "POST":
245 ds_access_request = DataSetAccessRequest(dataset=ds, user=request.user)
246 ds_access_request.save()
248 return HttpResponse(
249 '<button class="btn btn-secondary" disabled>{}</button>'.format(
250 ds_access_request
251 )
252 )
253 else:
254 ds_access_request = ds.get_access_request(request.user)
255 if ds_access_request:
256 return HttpResponse(
257 '<button class="btn btn-secondary" disabled>{}</button>'.format(
258 ds_access_request
259 )
260 )
261 return render(
262 request,
263 "dddatasets/_access_request.html",
264 {
265 "add_url": "dddatasets:access_request",
266 "object": ds,
267 "btn_text": "Request Access",
268 },
269 )