src/p4l/views.py
changeset 117 0a4e7d6ebe80
parent 113 c05567404888
child 119 ece69ca3ac24
equal deleted inserted replaced
116:0a6c7c8f8490 117:0a4e7d6ebe80
     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')