diff -r 0a6c7c8f8490 -r 0a4e7d6ebe80 src/p4l/views.py --- a/src/p4l/views.py Mon Sep 23 00:38:16 2013 +0200 +++ b/src/p4l/views.py Wed Sep 25 22:14:51 2013 +0200 @@ -4,25 +4,49 @@ @author: tc ''' -from datetime import datetime import json import logging +import time from django.conf import settings from django.shortcuts import redirect, get_object_or_404 from django.views.generic import DetailView, View +from rest_framework.renderers import UnicodeJSONRenderer +from p4l.api.serializers import RecordSerializer from p4l.models import Record from p4l.utils import get_labels_for_uris logger = logging.getLogger(__name__) +QUERY_FIELDS_TRANSLATION = { + 'url': 'dataurl', + 'filter': 'dataquery', + 'root': 'datarootquery', + 'childs': 'datachildsquery', + 'child-count': 'datachildcountquery' +} + + +def get_record_uri_labels(record, lang): + uri_labels = get_labels_for_uris([s.uri for s in record.subjects.all()], settings.RDF_SCHEMES['subjects'], lang, False) + uri_labels.update(get_labels_for_uris([s.uri for s in record.themes.all()], settings.RDF_SCHEMES['themes'], lang, False)) + uri_labels.update(get_labels_for_uris([s.uri for s in record.countries.all()], settings.RDF_SCHEMES['countries'], lang, False)) + uri_labels.update(get_labels_for_uris([record.language.uri] if record.language else [], settings.RDF_SCHEMES['languages'], lang, False)) + uri_labels.update(get_labels_for_uris([s.uri for s in record.otherLanguages.all()], settings.RDF_SCHEMES['languages'], lang, False)) + uri_labels.update(get_labels_for_uris([s.uri for s in record.projectNames.all()], settings.RDF_SCHEMES['projects'], None, True)) + uri_labels.update(get_labels_for_uris([s.uri for s in record.subjectCorporateBodies.all()], settings.RDF_SCHEMES['organizations'], None, True)) + uri_labels.update(get_labels_for_uris([s.uri for s in record.corporateAuthors.all()], settings.RDF_SCHEMES['organizations'], None, True)) + uri_labels.update(get_labels_for_uris([record.recordType] if record.recordType else [], settings.RDF_SCHEMES['types'], lang, False)) + uri_labels.update(get_labels_for_uris([s.uri for s in record.audiences.all()], settings.RDF_SCHEMES['audiences'], None, True)) + return uri_labels + class RecordDetailView(DetailView): model = Record - template_name = "p4l/p4l_record_view.html" + template_name = "p4l/record_view.html" slug_field = "identifier" def get_context_data(self, **kwargs): @@ -33,50 +57,9 @@ lang = self.request.GET["lang"] elif hasattr(self.request, "LANGUAGE_CODE") and self.request.LANGUAGE_CODE in ["fr","en","es"]: lang = self.request.LANGUAGE_CODE - # self.object is the record entry - # We get the subjects'labels with the Thesaurus repository - uri_list = [s.uri for s in self.object.subjects.all()] - uris_labels = get_labels_for_uris(uri_list, "http://skos.um.es/unescothes/CS000", lang, False) - context['subjects_labels'] = uris_labels - # We get the themes'labels with the Themes repository - uri_list = [s.uri for s in self.object.themes.all()] - uris_labels = get_labels_for_uris(uri_list, "http://www.iiep.unesco.org/plan4learning/scheme/Themes", lang, False) - context['themes_labels'] = uris_labels - # We get the countries'labels with the Thesaurus repository - uri_list = [s.uri for s in self.object.countries.all()] - uris_labels = get_labels_for_uris(uri_list, "http://skos.um.es/unescothes/CS000/Countries", lang, False) - context['countries_labels'] = uris_labels - # We get the languages'labels with the Languages repository - if self.object.language: - uri_list = [self.object.language.uri] - uris_labels = get_labels_for_uris(uri_list, "http://www.iiep.unesco.org/plan4learning/scheme/Languages", lang, False) - context['language_label'] = uris_labels[self.object.language.uri] - # We get the other languages'labels with the Languages repository - uri_list = [s.uri for s in self.object.otherLanguages.all()] - uris_labels = get_labels_for_uris(uri_list, "http://www.iiep.unesco.org/plan4learning/scheme/Languages", lang, False) - context['otherLanguages_labels'] = uris_labels - # We get the project'labels with the Projects repository - uri_list = [s.uri for s in self.object.projectNames.all()] - uris_labels = get_labels_for_uris(uri_list, "http://www.iiep.unesco.org/plan4learning/scheme/Projects", None, True) - context['projects_labels'] = uris_labels - # We get the subjectCorporateBodies'labels with the Organizations repository - uri_list = [s.uri for s in self.object.subjectCorporateBodies.all()] - uris_labels = get_labels_for_uris(uri_list, "http://www.iiep.unesco.org/plan4learning/scheme/Organizations", None, True) - context['subjectCorporateBodies_labels'] = uris_labels - # We get the corporateAuthors'labels with the Organizations repository - uri_list = [s.uri for s in self.object.corporateAuthors.all()] - uris_labels = get_labels_for_uris(uri_list, "http://www.iiep.unesco.org/plan4learning/scheme/Organizations", None, True) - context['corporateAuthors_labels'] = uris_labels - # We get the recordType'labels with the DocumentType repository - if self.object.recordType: - uri_list = [self.object.recordType] - uris_labels = get_labels_for_uris(uri_list, "http://www.iiep.unesco.org/plan4learning/scheme/DocumentType", lang, False) - context['recordType_label'] = uris_labels[self.object.recordType] - # Here, in the future, there will be the request for audiences thesaurus - context['audiences_labels'] = {} - #uri_list = [s.uri for s in self.object.audiences.all()] - #uris_labels = get_labels_for_uris(uri_list, "http://www.iiep.unesco.org/plan4learning/scheme/Audiences", lang, False) - #context['audiences_labels'] = uris_labels + + context['uri_labels'] = get_record_uri_labels(self.object,lang) + return context @@ -85,9 +68,41 @@ template_name = 'p4l/record_update_form.html' model = Record slug_field = "identifier" + is_create_view = False + + def get_empty_object(self): + + obj = Record() + obj.id = -1 + obj.identifier = "T" + str(int(time.time())) + obj.uri = "http://www.iiep.unesco.org/plan4learning/record/" + obj.identifier + + return obj + + + def get_object(self, *args, **kwargs): + """ + Returns the object the view is displaying. + + By default this requires `self.queryset` and a `pk` or `slug` argument + in the URLconf, but subclasses can override this to return any object. + """ + if self.is_create_view: + return self.get_empty_object() + + return super(RecordEditView, self).get_object(*args, **kwargs) + def get_context_data(self, **kwargs): - context = DetailView.get_context_data(self, **kwargs) + + context = super(RecordEditView, self).get_context_data(**kwargs) + + if self.object: + serializer = RecordSerializer(self.object) + context['object_json'] = UnicodeJSONRenderer().render(serializer.data) + else: + context['object_json'] = "null" + # We get the language, "fr" by default lang = "fr" if "lang" in self.request.GET: @@ -95,77 +110,12 @@ elif hasattr(self.request, "LANGUAGE_CODE") and self.request.LANGUAGE_CODE in ["fr","en","es"]: lang = self.request.LANGUAGE_CODE - uri_labels = get_labels_for_uris([s.uri for s in self.object.subjects.all()], "http://skos.um.es/unescothes/CS000", lang, False) - 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)) - 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)) - 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)) - 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)) - 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)) - 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)) - 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)) - 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)) - context['uri_labels'] = json.dumps(uri_labels) + context['uri_labels'] = json.dumps(get_record_uri_labels(self.object,lang)) # lang must be like "XX" in the sparql request lang = '"' + lang + '"' - query_dicts = { - 'subjects': { - 'dataurl': settings.SPARQL_QUERY_ENDPOINT, - 'dataquery': settings.SPARQL_SUBJECT_QUERIES["filter"] % (lang, lang), - 'datarootquery': settings.SPARQL_SUBJECT_QUERIES["root"] % lang, - 'datachildsquery': settings.SPARQL_SUBJECT_QUERIES["childs"] % lang, - 'datachildcountquery': settings.SPARQL_SUBJECT_QUERIES["child-count"] - }, - 'themes' : { - 'dataurl': settings.SPARQL_QUERY_ENDPOINT, - 'dataquery': settings.SPARQL_THEME_QUERIES["filter"] % (lang, lang), - 'datarootquery': settings.SPARQL_THEME_QUERIES["root"] % lang, - 'datachildsquery': settings.SPARQL_THEME_QUERIES["childs"] % lang, - 'datachildcountquery': settings.SPARQL_THEME_QUERIES["child-count"] - }, - 'countries' : { - 'dataurl': settings.SPARQL_QUERY_ENDPOINT, - 'dataquery': settings.SPARQL_COUNTRY_QUERIES["filter"] % (lang, lang), - 'datarootquery': settings.SPARQL_COUNTRY_QUERIES["root"] % lang, - 'datachildsquery': settings.SPARQL_COUNTRY_QUERIES["childs"] % lang, - 'datachildcountquery': settings.SPARQL_COUNTRY_QUERIES["child-count"] - }, - 'languages' : { - 'dataurl': settings.SPARQL_QUERY_ENDPOINT, - 'dataquery': settings.SPARQL_LANGUAGE_QUERIES["filter"] % (lang, lang), - 'datarootquery': settings.SPARQL_LANGUAGE_QUERIES["root"] % lang, - 'datachildsquery': "", - 'datachildcountquery': "" - }, - 'projects' : { - 'dataurl': settings.SPARQL_QUERY_ENDPOINT, - 'dataquery': settings.SPARQL_PROJECT_QUERIES["filter"], - 'datarootquery': settings.SPARQL_PROJECT_QUERIES["root"], - 'datachildsquery': "", - 'datachildcountquery': "" - }, - 'organizations' : { - 'dataurl': settings.SPARQL_QUERY_ENDPOINT, - 'dataquery': settings.SPARQL_ORGANIZATION_QUERIES["filter"], - 'datarootquery': settings.SPARQL_ORGANIZATION_QUERIES["root"], - 'datachildsquery': "", - 'datachildcountquery': "" - }, - 'types' : { - 'dataurl': settings.SPARQL_QUERY_ENDPOINT, - 'dataquery': settings.SPARQL_TYPE_QUERIES["filter"] % (lang, lang), - 'datarootquery': settings.SPARQL_TYPE_QUERIES["root"] % lang, - 'datachildsquery': "", - 'datachildcountquery': "" - }, - 'audiences': { - 'dataurl': settings.SPARQL_QUERY_ENDPOINT, - 'dataquery': settings.SPARQL_AUDIENCE_QUERIES["filter"], - 'datarootquery': settings.SPARQL_AUDIENCE_QUERIES["root"], - 'datachildsquery': settings.SPARQL_AUDIENCE_QUERIES["childs"], - 'datachildcountquery': settings.SPARQL_AUDIENCE_QUERIES["child-count"] - } - } + + 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()]) context['query_dicts'] = json.dumps(query_dicts) # Languages list used in drop down list @@ -174,15 +124,6 @@ return context -class RecordNewView(View): - def get(self, request, *args, **kwargs): - rec = Record() - rec.identifier = "T" + datetime.now().strftime("%Y%m%d%H%M%S") - rec.uri = "http://www.iiep.unesco.org/plan4learning/record/" + rec.identifier - rec.save() - return redirect('p4l_record_edit', rec.identifier) - - class RecordDeleteView(View): def get(self, request, slug, **kwargs): rec = get_object_or_404(Record, identifier=slug)