src/p4l/management/commands/get_theme_label.py
author cavaliet
Fri, 30 Aug 2013 12:40:01 +0200
changeset 9 3bc55f57b2b1
child 12 57efd01f1715
permissions -rw-r--r--
add sparql request for subjects and themes labels
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
9
3bc55f57b2b1 add sparql request for subjects and themes labels
cavaliet
parents:
diff changeset
     1
# -*- coding: utf-8 -*-
3bc55f57b2b1 add sparql request for subjects and themes labels
cavaliet
parents:
diff changeset
     2
3bc55f57b2b1 add sparql request for subjects and themes labels
cavaliet
parents:
diff changeset
     3
from django.conf import settings
3bc55f57b2b1 add sparql request for subjects and themes labels
cavaliet
parents:
diff changeset
     4
from django.core.management import BaseCommand
3bc55f57b2b1 add sparql request for subjects and themes labels
cavaliet
parents:
diff changeset
     5
from p4l.models import Theme
3bc55f57b2b1 add sparql request for subjects and themes labels
cavaliet
parents:
diff changeset
     6
from p4l.utils import show_progress
3bc55f57b2b1 add sparql request for subjects and themes labels
cavaliet
parents:
diff changeset
     7
import logging
3bc55f57b2b1 add sparql request for subjects and themes labels
cavaliet
parents:
diff changeset
     8
import requests
3bc55f57b2b1 add sparql request for subjects and themes labels
cavaliet
parents:
diff changeset
     9
3bc55f57b2b1 add sparql request for subjects and themes labels
cavaliet
parents:
diff changeset
    10
logger = logging.getLogger(__name__)
3bc55f57b2b1 add sparql request for subjects and themes labels
cavaliet
parents:
diff changeset
    11
3bc55f57b2b1 add sparql request for subjects and themes labels
cavaliet
parents:
diff changeset
    12
class Command(BaseCommand):
3bc55f57b2b1 add sparql request for subjects and themes labels
cavaliet
parents:
diff changeset
    13
    
3bc55f57b2b1 add sparql request for subjects and themes labels
cavaliet
parents:
diff changeset
    14
    query = """
3bc55f57b2b1 add sparql request for subjects and themes labels
cavaliet
parents:
diff changeset
    15
PREFIX skos:<http://www.w3.org/2004/02/skos/core#>
3bc55f57b2b1 add sparql request for subjects and themes labels
cavaliet
parents:
diff changeset
    16
PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>
3bc55f57b2b1 add sparql request for subjects and themes labels
cavaliet
parents:
diff changeset
    17
PREFIX owl:<http://www.w3.org/2002/07/owl#>
3bc55f57b2b1 add sparql request for subjects and themes labels
cavaliet
parents:
diff changeset
    18
PREFIX rdfs:<http://www.w3.org/2000/01/rdf-schema#>
3bc55f57b2b1 add sparql request for subjects and themes labels
cavaliet
parents:
diff changeset
    19
SELECT ?uri ?label 
3bc55f57b2b1 add sparql request for subjects and themes labels
cavaliet
parents:
diff changeset
    20
WHERE {
3bc55f57b2b1 add sparql request for subjects and themes labels
cavaliet
parents:
diff changeset
    21
    ?uri skos:inScheme <http://www.iiep.unesco.org/plan4learning/scheme/Themes> .
3bc55f57b2b1 add sparql request for subjects and themes labels
cavaliet
parents:
diff changeset
    22
    ?uri skos:prefLabel|skos:label ?label .
3bc55f57b2b1 add sparql request for subjects and themes labels
cavaliet
parents:
diff changeset
    23
    FILTER (?uri = $root)
3bc55f57b2b1 add sparql request for subjects and themes labels
cavaliet
parents:
diff changeset
    24
}
3bc55f57b2b1 add sparql request for subjects and themes labels
cavaliet
parents:
diff changeset
    25
"""
3bc55f57b2b1 add sparql request for subjects and themes labels
cavaliet
parents:
diff changeset
    26
    
3bc55f57b2b1 add sparql request for subjects and themes labels
cavaliet
parents:
diff changeset
    27
    def fill_label(self):
3bc55f57b2b1 add sparql request for subjects and themes labels
cavaliet
parents:
diff changeset
    28
        # Loads Themes label from sparkl query
3bc55f57b2b1 add sparql request for subjects and themes labels
cavaliet
parents:
diff changeset
    29
        themes = Theme.objects.filter(label=None)
3bc55f57b2b1 add sparql request for subjects and themes labels
cavaliet
parents:
diff changeset
    30
        total_themes = len(themes)
3bc55f57b2b1 add sparql request for subjects and themes labels
cavaliet
parents:
diff changeset
    31
        writer = None
3bc55f57b2b1 add sparql request for subjects and themes labels
cavaliet
parents:
diff changeset
    32
        i = 0
3bc55f57b2b1 add sparql request for subjects and themes labels
cavaliet
parents:
diff changeset
    33
        found = 0
3bc55f57b2b1 add sparql request for subjects and themes labels
cavaliet
parents:
diff changeset
    34
        for t in themes:
3bc55f57b2b1 add sparql request for subjects and themes labels
cavaliet
parents:
diff changeset
    35
            i += 1
3bc55f57b2b1 add sparql request for subjects and themes labels
cavaliet
parents:
diff changeset
    36
            res = requests.get(
3bc55f57b2b1 add sparql request for subjects and themes labels
cavaliet
parents:
diff changeset
    37
                settings.SPARQL_QUERY_ENDPOINT,
3bc55f57b2b1 add sparql request for subjects and themes labels
cavaliet
parents:
diff changeset
    38
                params={'query':self.query, 'timeout':10, '$root' : "<"+t.theme+">"},
3bc55f57b2b1 add sparql request for subjects and themes labels
cavaliet
parents:
diff changeset
    39
                headers={'accept':'application/sparql-results+json'},
3bc55f57b2b1 add sparql request for subjects and themes labels
cavaliet
parents:
diff changeset
    40
            )
3bc55f57b2b1 add sparql request for subjects and themes labels
cavaliet
parents:
diff changeset
    41
            if not res.ok:
3bc55f57b2b1 add sparql request for subjects and themes labels
cavaliet
parents:
diff changeset
    42
                continue
3bc55f57b2b1 add sparql request for subjects and themes labels
cavaliet
parents:
diff changeset
    43
            elif res.text:
3bc55f57b2b1 add sparql request for subjects and themes labels
cavaliet
parents:
diff changeset
    44
                json_res = res.json()
3bc55f57b2b1 add sparql request for subjects and themes labels
cavaliet
parents:
diff changeset
    45
                if 'results' in json_res and 'bindings' in json_res['results'] and len(json_res['results']['bindings'])>0:
3bc55f57b2b1 add sparql request for subjects and themes labels
cavaliet
parents:
diff changeset
    46
                    # json_res['results']['bindings'] has several languages. If we find french, we save the french label.
3bc55f57b2b1 add sparql request for subjects and themes labels
cavaliet
parents:
diff changeset
    47
                    # If not, we save the first one.
3bc55f57b2b1 add sparql request for subjects and themes labels
cavaliet
parents:
diff changeset
    48
                    tmp_dict = {}
3bc55f57b2b1 add sparql request for subjects and themes labels
cavaliet
parents:
diff changeset
    49
                    first_label = None
3bc55f57b2b1 add sparql request for subjects and themes labels
cavaliet
parents:
diff changeset
    50
                    # We create a temporary dict with the lang code and the label
3bc55f57b2b1 add sparql request for subjects and themes labels
cavaliet
parents:
diff changeset
    51
                    for b in json_res['results']['bindings']:
3bc55f57b2b1 add sparql request for subjects and themes labels
cavaliet
parents:
diff changeset
    52
                        if 'label' in b and 'value' in b['label'] and 'xml:lang' in b['label']:
3bc55f57b2b1 add sparql request for subjects and themes labels
cavaliet
parents:
diff changeset
    53
                            tmp_dict[b['label']['xml:lang']] = b['label']['value']
3bc55f57b2b1 add sparql request for subjects and themes labels
cavaliet
parents:
diff changeset
    54
                            if not first_label:
3bc55f57b2b1 add sparql request for subjects and themes labels
cavaliet
parents:
diff changeset
    55
                                first_label = b['label']['value']
3bc55f57b2b1 add sparql request for subjects and themes labels
cavaliet
parents:
diff changeset
    56
                    if 'fr' in tmp_dict or first_label:
3bc55f57b2b1 add sparql request for subjects and themes labels
cavaliet
parents:
diff changeset
    57
                        if 'fr' in tmp_dict:
3bc55f57b2b1 add sparql request for subjects and themes labels
cavaliet
parents:
diff changeset
    58
                            t.label = tmp_dict['fr']
3bc55f57b2b1 add sparql request for subjects and themes labels
cavaliet
parents:
diff changeset
    59
                        else:
3bc55f57b2b1 add sparql request for subjects and themes labels
cavaliet
parents:
diff changeset
    60
                            t.label = first_label
3bc55f57b2b1 add sparql request for subjects and themes labels
cavaliet
parents:
diff changeset
    61
                        l = t.label
3bc55f57b2b1 add sparql request for subjects and themes labels
cavaliet
parents:
diff changeset
    62
                        t.save()
3bc55f57b2b1 add sparql request for subjects and themes labels
cavaliet
parents:
diff changeset
    63
                        found += 1
3bc55f57b2b1 add sparql request for subjects and themes labels
cavaliet
parents:
diff changeset
    64
                        writer = show_progress(i, total_themes, l, 50, writer=writer)
3bc55f57b2b1 add sparql request for subjects and themes labels
cavaliet
parents:
diff changeset
    65
        print("Processing Themes Sparql Done. %d found on %d" % (found, total_themes))
3bc55f57b2b1 add sparql request for subjects and themes labels
cavaliet
parents:
diff changeset
    66
3bc55f57b2b1 add sparql request for subjects and themes labels
cavaliet
parents:
diff changeset
    67
    def handle(self, *args, **options):
3bc55f57b2b1 add sparql request for subjects and themes labels
cavaliet
parents:
diff changeset
    68
        self.fill_label()
3bc55f57b2b1 add sparql request for subjects and themes labels
cavaliet
parents:
diff changeset
    69