2 ''' |
2 ''' |
3 Created on Aug 27, 2013 |
3 Created on Aug 27, 2013 |
4 |
4 |
5 @author: tc |
5 @author: tc |
6 ''' |
6 ''' |
7 from datetime import datetime |
|
8 import json |
7 import json |
9 import logging |
8 import logging |
|
9 import time |
10 |
10 |
11 from django.conf import settings |
11 from django.conf import settings |
12 from django.shortcuts import redirect, get_object_or_404 |
12 from django.shortcuts import redirect, get_object_or_404 |
13 from django.views.generic import DetailView, View |
13 from django.views.generic import DetailView, View |
|
14 from rest_framework.renderers import UnicodeJSONRenderer |
14 |
15 |
|
16 from p4l.api.serializers import RecordSerializer |
15 from p4l.models import Record |
17 from p4l.models import Record |
16 from p4l.utils import get_labels_for_uris |
18 from p4l.utils import get_labels_for_uris |
17 |
19 |
18 |
20 |
19 logger = logging.getLogger(__name__) |
21 logger = logging.getLogger(__name__) |
20 |
22 |
|
23 QUERY_FIELDS_TRANSLATION = { |
|
24 'url': 'dataurl', |
|
25 'filter': 'dataquery', |
|
26 'root': 'datarootquery', |
|
27 'childs': 'datachildsquery', |
|
28 'child-count': 'datachildcountquery' |
|
29 } |
|
30 |
|
31 |
|
32 def get_record_uri_labels(record, lang): |
|
33 uri_labels = get_labels_for_uris([s.uri for s in record.subjects.all()], settings.RDF_SCHEMES['subjects'], lang, False) |
|
34 uri_labels.update(get_labels_for_uris([s.uri for s in record.themes.all()], settings.RDF_SCHEMES['themes'], lang, False)) |
|
35 uri_labels.update(get_labels_for_uris([s.uri for s in record.countries.all()], settings.RDF_SCHEMES['countries'], lang, False)) |
|
36 uri_labels.update(get_labels_for_uris([record.language.uri] if record.language else [], settings.RDF_SCHEMES['languages'], lang, False)) |
|
37 uri_labels.update(get_labels_for_uris([s.uri for s in record.otherLanguages.all()], settings.RDF_SCHEMES['languages'], lang, False)) |
|
38 uri_labels.update(get_labels_for_uris([s.uri for s in record.projectNames.all()], settings.RDF_SCHEMES['projects'], None, True)) |
|
39 uri_labels.update(get_labels_for_uris([s.uri for s in record.subjectCorporateBodies.all()], settings.RDF_SCHEMES['organizations'], None, True)) |
|
40 uri_labels.update(get_labels_for_uris([s.uri for s in record.corporateAuthors.all()], settings.RDF_SCHEMES['organizations'], None, True)) |
|
41 uri_labels.update(get_labels_for_uris([record.recordType] if record.recordType else [], settings.RDF_SCHEMES['types'], lang, False)) |
|
42 uri_labels.update(get_labels_for_uris([s.uri for s in record.audiences.all()], settings.RDF_SCHEMES['audiences'], None, True)) |
|
43 return uri_labels |
|
44 |
21 |
45 |
22 class RecordDetailView(DetailView): |
46 class RecordDetailView(DetailView): |
23 |
47 |
24 model = Record |
48 model = Record |
25 template_name = "p4l/p4l_record_view.html" |
49 template_name = "p4l/record_view.html" |
26 slug_field = "identifier" |
50 slug_field = "identifier" |
27 |
51 |
28 def get_context_data(self, **kwargs): |
52 def get_context_data(self, **kwargs): |
29 context = DetailView.get_context_data(self, **kwargs) |
53 context = DetailView.get_context_data(self, **kwargs) |
30 # We get the language, "fr" by default |
54 # We get the language, "fr" by default |
31 lang = "fr" |
55 lang = "fr" |
32 if "lang" in self.request.GET: |
56 if "lang" in self.request.GET: |
33 lang = self.request.GET["lang"] |
57 lang = self.request.GET["lang"] |
34 elif hasattr(self.request, "LANGUAGE_CODE") and self.request.LANGUAGE_CODE in ["fr","en","es"]: |
58 elif hasattr(self.request, "LANGUAGE_CODE") and self.request.LANGUAGE_CODE in ["fr","en","es"]: |
35 lang = self.request.LANGUAGE_CODE |
59 lang = self.request.LANGUAGE_CODE |
36 # self.object is the record entry |
60 |
37 # We get the subjects'labels with the Thesaurus repository |
61 context['uri_labels'] = get_record_uri_labels(self.object,lang) |
38 uri_list = [s.uri for s in self.object.subjects.all()] |
62 |
39 uris_labels = get_labels_for_uris(uri_list, "http://skos.um.es/unescothes/CS000", lang, False) |
|
40 context['subjects_labels'] = uris_labels |
|
41 # We get the themes'labels with the Themes repository |
|
42 uri_list = [s.uri for s in self.object.themes.all()] |
|
43 uris_labels = get_labels_for_uris(uri_list, "http://www.iiep.unesco.org/plan4learning/scheme/Themes", lang, False) |
|
44 context['themes_labels'] = uris_labels |
|
45 # We get the countries'labels with the Thesaurus repository |
|
46 uri_list = [s.uri for s in self.object.countries.all()] |
|
47 uris_labels = get_labels_for_uris(uri_list, "http://skos.um.es/unescothes/CS000/Countries", lang, False) |
|
48 context['countries_labels'] = uris_labels |
|
49 # We get the languages'labels with the Languages repository |
|
50 if self.object.language: |
|
51 uri_list = [self.object.language.uri] |
|
52 uris_labels = get_labels_for_uris(uri_list, "http://www.iiep.unesco.org/plan4learning/scheme/Languages", lang, False) |
|
53 context['language_label'] = uris_labels[self.object.language.uri] |
|
54 # We get the other languages'labels with the Languages repository |
|
55 uri_list = [s.uri for s in self.object.otherLanguages.all()] |
|
56 uris_labels = get_labels_for_uris(uri_list, "http://www.iiep.unesco.org/plan4learning/scheme/Languages", lang, False) |
|
57 context['otherLanguages_labels'] = uris_labels |
|
58 # We get the project'labels with the Projects repository |
|
59 uri_list = [s.uri for s in self.object.projectNames.all()] |
|
60 uris_labels = get_labels_for_uris(uri_list, "http://www.iiep.unesco.org/plan4learning/scheme/Projects", None, True) |
|
61 context['projects_labels'] = uris_labels |
|
62 # We get the subjectCorporateBodies'labels with the Organizations repository |
|
63 uri_list = [s.uri for s in self.object.subjectCorporateBodies.all()] |
|
64 uris_labels = get_labels_for_uris(uri_list, "http://www.iiep.unesco.org/plan4learning/scheme/Organizations", None, True) |
|
65 context['subjectCorporateBodies_labels'] = uris_labels |
|
66 # We get the corporateAuthors'labels with the Organizations repository |
|
67 uri_list = [s.uri for s in self.object.corporateAuthors.all()] |
|
68 uris_labels = get_labels_for_uris(uri_list, "http://www.iiep.unesco.org/plan4learning/scheme/Organizations", None, True) |
|
69 context['corporateAuthors_labels'] = uris_labels |
|
70 # We get the recordType'labels with the DocumentType repository |
|
71 if self.object.recordType: |
|
72 uri_list = [self.object.recordType] |
|
73 uris_labels = get_labels_for_uris(uri_list, "http://www.iiep.unesco.org/plan4learning/scheme/DocumentType", lang, False) |
|
74 context['recordType_label'] = uris_labels[self.object.recordType] |
|
75 # Here, in the future, there will be the request for audiences thesaurus |
|
76 context['audiences_labels'] = {} |
|
77 #uri_list = [s.uri for s in self.object.audiences.all()] |
|
78 #uris_labels = get_labels_for_uris(uri_list, "http://www.iiep.unesco.org/plan4learning/scheme/Audiences", lang, False) |
|
79 #context['audiences_labels'] = uris_labels |
|
80 |
63 |
81 return context |
64 return context |
82 |
65 |
83 class RecordEditView(DetailView): |
66 class RecordEditView(DetailView): |
84 http_method_names = ['get'] |
67 http_method_names = ['get'] |
85 template_name = 'p4l/record_update_form.html' |
68 template_name = 'p4l/record_update_form.html' |
86 model = Record |
69 model = Record |
87 slug_field = "identifier" |
70 slug_field = "identifier" |
|
71 is_create_view = False |
|
72 |
|
73 def get_empty_object(self): |
|
74 |
|
75 obj = Record() |
|
76 obj.id = -1 |
|
77 obj.identifier = "T" + str(int(time.time())) |
|
78 obj.uri = "http://www.iiep.unesco.org/plan4learning/record/" + obj.identifier |
|
79 |
|
80 return obj |
|
81 |
|
82 |
|
83 def get_object(self, *args, **kwargs): |
|
84 """ |
|
85 Returns the object the view is displaying. |
|
86 |
|
87 By default this requires `self.queryset` and a `pk` or `slug` argument |
|
88 in the URLconf, but subclasses can override this to return any object. |
|
89 """ |
|
90 if self.is_create_view: |
|
91 return self.get_empty_object() |
|
92 |
|
93 return super(RecordEditView, self).get_object(*args, **kwargs) |
|
94 |
88 |
95 |
89 def get_context_data(self, **kwargs): |
96 def get_context_data(self, **kwargs): |
90 context = DetailView.get_context_data(self, **kwargs) |
97 |
|
98 context = super(RecordEditView, self).get_context_data(**kwargs) |
|
99 |
|
100 if self.object: |
|
101 serializer = RecordSerializer(self.object) |
|
102 context['object_json'] = UnicodeJSONRenderer().render(serializer.data) |
|
103 else: |
|
104 context['object_json'] = "null" |
|
105 |
91 # We get the language, "fr" by default |
106 # We get the language, "fr" by default |
92 lang = "fr" |
107 lang = "fr" |
93 if "lang" in self.request.GET: |
108 if "lang" in self.request.GET: |
94 lang = self.request.GET["lang"] |
109 lang = self.request.GET["lang"] |
95 elif hasattr(self.request, "LANGUAGE_CODE") and self.request.LANGUAGE_CODE in ["fr","en","es"]: |
110 elif hasattr(self.request, "LANGUAGE_CODE") and self.request.LANGUAGE_CODE in ["fr","en","es"]: |
96 lang = self.request.LANGUAGE_CODE |
111 lang = self.request.LANGUAGE_CODE |
97 |
112 |
98 uri_labels = get_labels_for_uris([s.uri for s in self.object.subjects.all()], "http://skos.um.es/unescothes/CS000", lang, False) |
113 context['uri_labels'] = json.dumps(get_record_uri_labels(self.object,lang)) |
99 uri_labels.update(get_labels_for_uris([s.uri for s in self.object.themes.all()], "http://www.iiep.unesco.org/plan4learning/scheme/Themes", lang, False)) |
|
100 uri_labels.update(get_labels_for_uris([s.uri for s in self.object.countries.all()], "http://skos.um.es/unescothes/CS000/Countries", lang, False)) |
|
101 uri_labels.update(get_labels_for_uris([self.object.language.uri] if self.object.language else [], "http://www.iiep.unesco.org/plan4learning/scheme/Languages", lang, False)) |
|
102 uri_labels.update(get_labels_for_uris([s.uri for s in self.object.otherLanguages.all()], "http://www.iiep.unesco.org/plan4learning/scheme/Languages", lang, False)) |
|
103 uri_labels.update(get_labels_for_uris([s.uri for s in self.object.projectNames.all()], "http://www.iiep.unesco.org/plan4learning/scheme/Projects", None, True)) |
|
104 uri_labels.update(get_labels_for_uris([s.uri for s in self.object.subjectCorporateBodies.all()], "http://www.iiep.unesco.org/plan4learning/scheme/Organizations", None, True)) |
|
105 uri_labels.update(get_labels_for_uris([s.uri for s in self.object.corporateAuthors.all()], "http://www.iiep.unesco.org/plan4learning/scheme/Organizations", None, True)) |
|
106 uri_labels.update(get_labels_for_uris([self.object.recordType] if self.object.recordType else [], "http://www.iiep.unesco.org/plan4learning/scheme/DocumentType", lang, False)) |
|
107 context['uri_labels'] = json.dumps(uri_labels) |
|
108 |
114 |
109 # lang must be like "XX" in the sparql request |
115 # lang must be like "XX" in the sparql request |
110 lang = '"' + lang + '"' |
116 lang = '"' + lang + '"' |
111 query_dicts = { |
117 |
112 'subjects': { |
118 query_dicts = dict([(k , dict([ (QUERY_FIELDS_TRANSLATION[key],value.format(lang=lang)) for key,value in v.items() ])) for k,v in settings.SPARQL_REF_QUERIES.items()]) |
113 'dataurl': settings.SPARQL_QUERY_ENDPOINT, |
|
114 'dataquery': settings.SPARQL_SUBJECT_QUERIES["filter"] % (lang, lang), |
|
115 'datarootquery': settings.SPARQL_SUBJECT_QUERIES["root"] % lang, |
|
116 'datachildsquery': settings.SPARQL_SUBJECT_QUERIES["childs"] % lang, |
|
117 'datachildcountquery': settings.SPARQL_SUBJECT_QUERIES["child-count"] |
|
118 }, |
|
119 'themes' : { |
|
120 'dataurl': settings.SPARQL_QUERY_ENDPOINT, |
|
121 'dataquery': settings.SPARQL_THEME_QUERIES["filter"] % (lang, lang), |
|
122 'datarootquery': settings.SPARQL_THEME_QUERIES["root"] % lang, |
|
123 'datachildsquery': settings.SPARQL_THEME_QUERIES["childs"] % lang, |
|
124 'datachildcountquery': settings.SPARQL_THEME_QUERIES["child-count"] |
|
125 }, |
|
126 'countries' : { |
|
127 'dataurl': settings.SPARQL_QUERY_ENDPOINT, |
|
128 'dataquery': settings.SPARQL_COUNTRY_QUERIES["filter"] % (lang, lang), |
|
129 'datarootquery': settings.SPARQL_COUNTRY_QUERIES["root"] % lang, |
|
130 'datachildsquery': settings.SPARQL_COUNTRY_QUERIES["childs"] % lang, |
|
131 'datachildcountquery': settings.SPARQL_COUNTRY_QUERIES["child-count"] |
|
132 }, |
|
133 'languages' : { |
|
134 'dataurl': settings.SPARQL_QUERY_ENDPOINT, |
|
135 'dataquery': settings.SPARQL_LANGUAGE_QUERIES["filter"] % (lang, lang), |
|
136 'datarootquery': settings.SPARQL_LANGUAGE_QUERIES["root"] % lang, |
|
137 'datachildsquery': "", |
|
138 'datachildcountquery': "" |
|
139 }, |
|
140 'projects' : { |
|
141 'dataurl': settings.SPARQL_QUERY_ENDPOINT, |
|
142 'dataquery': settings.SPARQL_PROJECT_QUERIES["filter"], |
|
143 'datarootquery': settings.SPARQL_PROJECT_QUERIES["root"], |
|
144 'datachildsquery': "", |
|
145 'datachildcountquery': "" |
|
146 }, |
|
147 'organizations' : { |
|
148 'dataurl': settings.SPARQL_QUERY_ENDPOINT, |
|
149 'dataquery': settings.SPARQL_ORGANIZATION_QUERIES["filter"], |
|
150 'datarootquery': settings.SPARQL_ORGANIZATION_QUERIES["root"], |
|
151 'datachildsquery': "", |
|
152 'datachildcountquery': "" |
|
153 }, |
|
154 'types' : { |
|
155 'dataurl': settings.SPARQL_QUERY_ENDPOINT, |
|
156 'dataquery': settings.SPARQL_TYPE_QUERIES["filter"] % (lang, lang), |
|
157 'datarootquery': settings.SPARQL_TYPE_QUERIES["root"] % lang, |
|
158 'datachildsquery': "", |
|
159 'datachildcountquery': "" |
|
160 }, |
|
161 'audiences': { |
|
162 'dataurl': settings.SPARQL_QUERY_ENDPOINT, |
|
163 'dataquery': settings.SPARQL_AUDIENCE_QUERIES["filter"], |
|
164 'datarootquery': settings.SPARQL_AUDIENCE_QUERIES["root"], |
|
165 'datachildsquery': settings.SPARQL_AUDIENCE_QUERIES["childs"], |
|
166 'datachildcountquery': settings.SPARQL_AUDIENCE_QUERIES["child-count"] |
|
167 } |
|
168 } |
|
169 context['query_dicts'] = json.dumps(query_dicts) |
119 context['query_dicts'] = json.dumps(query_dicts) |
170 |
120 |
171 # Languages list used in drop down list |
121 # Languages list used in drop down list |
172 context['languages_list'] = json.dumps(settings.LANGUAGES_LIST) |
122 context['languages_list'] = json.dumps(settings.LANGUAGES_LIST) |
173 |
123 |
174 return context |
124 return context |
175 |
125 |
176 |
126 |
177 class RecordNewView(View): |
|
178 def get(self, request, *args, **kwargs): |
|
179 rec = Record() |
|
180 rec.identifier = "T" + datetime.now().strftime("%Y%m%d%H%M%S") |
|
181 rec.uri = "http://www.iiep.unesco.org/plan4learning/record/" + rec.identifier |
|
182 rec.save() |
|
183 return redirect('p4l_record_edit', rec.identifier) |
|
184 |
|
185 |
|
186 class RecordDeleteView(View): |
127 class RecordDeleteView(View): |
187 def get(self, request, slug, **kwargs): |
128 def get(self, request, slug, **kwargs): |
188 rec = get_object_or_404(Record, identifier=slug) |
129 rec = get_object_or_404(Record, identifier=slug) |
189 rec.delete() |
130 rec.delete() |
190 return redirect('p4l_home') |
131 return redirect('p4l_home') |