1
+ import csv
1
2
from urllib .parse import urlparse
2
3
3
4
from data_platform_catalogue .client .exceptions import EntityDoesNotExist
4
5
from data_platform_catalogue .search_types import DomainOption
5
6
from django .conf import settings
6
- from django .http import Http404 , HttpResponseBadRequest
7
+ from django .http import Http404 , HttpResponse , HttpResponseBadRequest
7
8
from django .shortcuts import render
8
9
from django .utils .translation import gettext as _
9
10
from django .views .decorators .cache import cache_control
15
16
DatabaseDetailsService ,
16
17
DatasetDetailsService ,
17
18
)
19
+ from home .service .details_csv import (
20
+ DashboardDetailsCsvFormatter ,
21
+ DatabaseDetailsCsvFormatter ,
22
+ DatasetDetailsCsvFormatter ,
23
+ )
18
24
from home .service .domain_fetcher import DomainFetcher
19
25
from home .service .glossary import GlossaryService
20
26
from home .service .metadata_specification import MetadataSpecificationService
@@ -33,60 +39,56 @@ def home_view(request):
33
39
34
40
@cache_control (max_age = 300 , private = True )
35
41
def details_view (request , result_type , urn ):
36
- if result_type == "table" :
37
- service = dataset_service (urn )
38
- return render (request , service .template , service .context )
39
- if result_type == "database" :
40
- context = database_details (urn )
41
- return render (request , "details_database.html" , context )
42
- if result_type == "chart" :
43
- context = chart_details (urn )
44
- return render (request , "details_chart.html" , context )
45
- if result_type == "dashboard" :
46
- context = dashboard_details (urn )
47
- return render (request , "details_dashboard.html" , context )
48
-
49
-
50
- def database_details (urn ):
51
42
try :
52
- service = DatabaseDetailsService (urn )
53
- except EntityDoesNotExist :
54
- raise Http404 ("Asset does not exist" )
55
-
56
- context = service .context
57
-
58
- return context
59
-
43
+ if result_type == "table" :
44
+ service = DatasetDetailsService (urn )
45
+ template = service .template
46
+ elif result_type == "database" :
47
+ service = DatabaseDetailsService (urn )
48
+ template = "details_database.html"
49
+ elif result_type == "chart" :
50
+ service = ChartDetailsService (urn )
51
+ template = "details_chart.html"
52
+ elif result_type == "dashboard" :
53
+ service = DashboardDetailsService (urn )
54
+ template = "details_dashboard.html"
55
+ else :
56
+ raise Http404 ("Invalid result type" )
57
+
58
+ return render (request , template , service .context )
60
59
61
- def dataset_service (urn ):
62
- try :
63
- service = DatasetDetailsService (urn )
64
60
except EntityDoesNotExist :
65
- raise Http404 ("Asset does not exist" )
66
-
67
- return service
61
+ raise Http404 (f"{ result_type } '{ urn } ' does not exist" )
68
62
69
63
70
- def chart_details (urn ):
71
- try :
72
- service = ChartDetailsService (urn )
73
- except EntityDoesNotExist :
74
- raise Http404 ("Asset does not exist" )
75
-
76
- context = service .context
77
-
78
- return context
79
-
80
-
81
- def dashboard_details (urn ):
82
- try :
64
+ @cache_control (max_age = 300 , private = True )
65
+ def details_view_csv (request , result_type , urn ) -> HttpResponse :
66
+ if result_type == "table" :
67
+ service = DatasetDetailsService (urn )
68
+ csv_formatter = DatasetDetailsCsvFormatter (service )
69
+ elif result_type == "database" :
70
+ service = DatabaseDetailsService (urn )
71
+ csv_formatter = DatabaseDetailsCsvFormatter (service )
72
+ elif result_type == "dashboard" :
83
73
service = DashboardDetailsService (urn )
84
- except EntityDoesNotExist :
85
- raise Http404 ("Asset does not exist" )
74
+ csv_formatter = DashboardDetailsCsvFormatter (service )
75
+ else :
76
+ raise Http404 ("CSV not available" )
77
+
78
+ # In case there are any quotes in the filename, remove them in order to
79
+ # not to break the header.
80
+ unsavoury_characters = str .maketrans ({'"' : "" })
81
+ filename = urn .translate (unsavoury_characters ) + ".csv"
86
82
87
- context = service .context
83
+ response = HttpResponse (
84
+ content_type = "text/csv" ,
85
+ headers = {"Content-Disposition" : f'attachment; filename="{ filename } "' },
86
+ )
87
+ writer = csv .writer (response )
88
+ writer .writerow (csv_formatter .headers ())
89
+ writer .writerows (csv_formatter .data ())
88
90
89
- return context
91
+ return response
90
92
91
93
92
94
@cache_control (max_age = 60 , private = True )
0 commit comments