src/p4l/views.py
changeset 117 0a4e7d6ebe80
parent 113 c05567404888
child 119 ece69ca3ac24
--- 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)