src/hdalab/views/ajax.py
branchdocumentation
changeset 693 09e00f38d177
parent 620 f45d7494332e
--- a/src/hdalab/views/ajax.py	Thu Apr 12 01:27:16 2018 +0200
+++ b/src/hdalab/views/ajax.py	Wed Apr 11 12:19:47 2018 +0200
@@ -23,6 +23,23 @@
 logger = logging.getLogger(__name__)
 
 def tagtranslation(request):
+    """
+    Vue donnant des traductions de label de tag pour une langue.
+    la recherche se fait dans les objets :class:`hdalab.models.DbpediaFieldsTranslation`.
+
+    Paramêtres GET:
+        :var lang: La langue demandée
+        :var labels: Un ou plusieurs labels de tag (séparateur : ",")
+
+    Réponse (application/json):
+        Un dictionnaire sous la forme ::
+
+            {
+                "<label1>": "<translation>",
+                "<label2>": "<translation>"
+            }
+
+    """
 
     lang = request.GET.get('lang',request.LANGUAGE_CODE)
     labels = request.GET.get('labels',None)
@@ -46,7 +63,19 @@
 
     return HttpResponse(content=json.dumps(translations), content_type='application/json')
 
-def subcat(category, globtags, level, max_level ):
+
+
+def subcat(category, globtags, level, max_level):
+    """
+    Méthode récursive utilisée pour reconstruire un arbre de catégories.
+
+    :param object category: La catégorie racine.
+    :param dict globtags: dictionnaire flobal des tags.
+    :param int level: Niveau de récursion.
+    :param int max_level: Niveau maximum de récursion (level <= max_level)
+
+    :returns: L'arbre des catégories.
+    """
     # recursive function used by cattree
     catlabel = category.label
     tags = Tag.objects.filter(wp_categories__wp_category = category).distinct()
@@ -70,6 +99,15 @@
     return resobj
 
 def cleantags(category):
+    """
+    Methode annexe qui nettoie recursivement un arbre de catégorie. elle effectue les actions suivantes:
+      - retire les clefs correspondant à des listes vides ('contents' et 'themes')
+      - trie les listes 'themes' par label
+      - trie les listes 'contents' par score
+
+    :param category: la catégorie racine où commencer le traitement.
+
+    """
     if category.has_key('contents') and len(category['contents']) == 0:
         del category['contents']
     if category.has_key('contents'):
@@ -86,6 +124,37 @@
     return category
 
 def cattree(request):
+    """
+    Contruit l'arbre de catégorie pour un label.
+    Les contenus attachés aux noeud sont des listes de fiches hdalab triées par score.
+    Le score pour une fiche est fonction de ses tags, de leur ordre, de leur présence dnas l'arbre des catégories et de leur hauteur dans l'arbre des catégories.
+
+    Paramêtres GET :
+        :var label: Le label
+
+    Réponse (application/json):
+        Un json représentant l'arbre des catégories avec pour chaque noeud une liste ordonnée de fiches liée à la catégorie.
+
+        exemple ::
+
+            {
+                "label": "<label1>",
+                "themes": [ { "label": "<label1.1>", "themes": [...], "contents": [...]}, ...],
+                "contents": [
+                    {
+                        "organization": "Ciclic",
+                        "description": "Ciclic propose...",
+                        "score": 7,
+                        "title": "Vocabulaire de l'analyse filmique...",
+                        "url": "http://upopi.ciclic.fr/vocabulaire/definition/sceance-11",
+                        "hda_id": "5879",
+                        "organization_url": "http://www.ciclic.fr/",
+                        "id": 14852
+                    },
+                    ...
+                ]
+            }
+    """
     # Gets the category tree from a label
     ROOT_MAX_TAG_ORDER = 8
     MAX_TAG_ORDER = 8
@@ -146,7 +215,12 @@
 
     return HttpResponse(content=json.dumps(resobj), content_type='application/json')
 
+
 def sessioninfo(request):
+    """
+    Vue gérant les session Hda permettant de sauvegarder un état d'interface.
+    Note : Cette vue n'est pas mappée dans le module `hdalab.url`.
+    """
 
     data = json.loads(request.GET.get('data', "{}"))
     write = False
@@ -188,6 +262,41 @@
 
 
 def tagsearch(request):
+    """
+    Vue permettant la recherche dans les tag.
+    La recherche se fait dans les objets :class:`hdabo.models.Tag`, :class:`hdalab.models.DbpediaFields` et :class:`hdalab.models.DbpediaFieldsTranslation`.
+
+    Paramêtres GET:
+        :var (str) term: Le terme à rechercher.
+        :var (str) lang: La langue dans laquelle il faut faire la recherche.
+        :var (int) count: Le nombre maximum de résultat.
+        :var (bool) count_notices: Ajoute ou pas le nombre de notices par tag.
+
+    Réponse (application/json):
+        Une liste comprenant les résultats de la recherche.
+
+        exemple ::
+
+            [
+                {
+                    "original_label": "Cathédrale Notre-Dame de Chartres",
+                    "url": "http://fr.wikipedia.org/wiki/Cath%C3%A9drale_Notre-Dame_de_Chartres",
+                    "abstract": "La cathédrale Notre-Dame de Chartres ...",
+                    "value": "Cathédrale Notre-Dame de Chartres",
+                    "thumbnail": "http://commons.wikimedia.org/wiki/Special:FilePath/Chartres_Cath+Gare.JPG?width=300",
+                    "nb": 7
+                },
+                {
+                    "original_label": "Cathédrale Notre-Dame de Paris",
+                    "url": "http://fr.wikipedia.org/wiki/Cath%C3%A9drale_Notre-Dame_de_Paris",
+                    "abstract": "La cathédrale Notre-Dame de Paris...",
+                    "value": "Cathédrale Notre-Dame de Paris",
+                    "thumbnail": "http://commons.wikimedia.org/wiki/Special:FilePath/Notre_Dame_de_Paris_DSC_0846w.jpg?width=300",
+                    "nb": 6
+                },
+                ...
+            ]
+    """
 
     q = request.GET.get('term',None)
     maxcount = int(request.GET.get('count','40'))
@@ -252,7 +361,29 @@
 
     return HttpResponse(content=json.dumps(res), content_type='application/json')
 
+
+
 def catsearch(request):
+    """
+    Vue permettant la recherche de catégorie. On se restreint aux catégories qui sont aussi des tags.
+
+    Paramêtres GET:
+        :var (str) term: Le terme à rechercher.
+
+    Réponse (application/json):
+        Une liste comprenant le résultat de la recherche.
+
+        exemple ::
+
+            [
+                { "value": "1982 au cinéma" },
+                { "value": "Cinéma italien" },
+                { "value": "2003 au cinéma" },
+                ...
+            ]
+
+    """
+
 
     q = request.GET.get('term',None)
 
@@ -268,7 +399,27 @@
 
     return HttpResponse(content=json.dumps(res), content_type='application/json')
 
+
+
 def filter(request):
+    """
+    Vue permettant de filtrer par facette des fiches HDA.
+    Cette méthode est en fait un simple wrapper pour la méthode `filter_generic`.
+
+    Paramêtres GET:
+        :var lang: la langue de recherche (défaut: fr-fr).
+        :var period: Période dans laquelle doit se faire la recherche.
+        :var label: un mot-clef.
+        :var country: Une liste de pays limitant la recherche.
+        :var contentlist: Liste de fiches limitant la recherche.
+        :var mto: Ordre maximum des tags (défaut: 12).
+        :var contentcount: nombre de fiches maximum (défaut : 8).
+        :var tagcount: nombre maximum de tag (défaut: 30).
+
+    Réponse (application/json):
+        Un objet comprenant le résultat de la recherche.
+    """
+
 
     lang = request.GET.get('lang',request.LANGUAGE_CODE)
     periode = request.GET.get('period',None)
@@ -285,6 +436,128 @@
 
 
 def filter_generic(lang="fr-fr", periode=None, label=None, country=None, contentlist=None, max_tag_order=12, content_count=8, tag_count=30):
+    """
+    Méthode de recherche par facette sur les fiches HDA.
+
+    :param str lang: La langue de recherche (défaut: "fr-fr").
+    :param str period: Période d'année limitant la recherche. Le format est `<année-début>,<année-fin>` (défaut: None).
+    :param str label: Limite la recherche à un label de tag (défaut: None).
+    :param str country: Liste de pays où limiter la recherche. Le format est `<uri dbpedia pays 1>,<uri dbpedia pays 2>...` (défaut: None).
+    :param str contentlist: Liste d'id de fiche HDA (:class:`hdabo.models.Datasheet`) limitant la recherche. Le format est `<id1>,<id2>...` (défaut: None)
+    :param int max_tag_order: Limite le nombre maximum de tag par fiche (défaut: 12).
+    :param int content_count: Limite le nombre de fiches résultat (défaut: 8).
+    :param int tag_count: Limite le nombre de tag dans le résultat (défaut: 30).
+    :rtype: string
+    :returns: Un objet json sérialisé comprenant les résultats de la recherche pour les différentes facettes.
+
+
+    Clefs de l'objet:
+        - :count: Nombre total de fiches.
+        - :disciplines: Liste de disciplines artistiques en relation avec les reesultats, triée par score.
+        - :countries: Objet dont les clef sont des uri dbpedia de pays et les valeurs sont le nombre de fiches.
+        - :tags: Liste de tag triés par score.
+        - :sparkline: Liste d'année avec un score, triés par année. Le score est lié au nombre de fiche dont le contenu couvre l'année en question.
+        - :contents: Liste de fiches HDA répondant à la recherche, classée par score. Chaque fiche comporte une liste de tag.
+        - :tagtranslations: Objet donnant les traductions de label de tag rencontrés dans les résultats.
+
+    exemple::
+
+        {
+            "count": 936,
+            "disciplines": [
+                {
+                "translated_label": "Peinture",
+                "score": 936,
+                "label": "Peinture"
+                },
+                {
+                "translated_label": "Sculpture",
+                "score": 88,
+                "label": "Sculpture"
+                },
+                ...
+            ],
+            "countries": {
+                "http://fr.dbpedia.org/resource/Iran": 1,
+                "http://fr.dbpedia.org/resource/Espagne": 16,
+                ...
+            },
+            "tags": [
+                {
+                "url": "http://fr.dbpedia.org/resource/Portrait",
+                "id": 63452,
+                "translated_label": "Portrait",
+                "score": 179,
+                "wkpd_url": "http://fr.wikipedia.org/wiki/Portrait",
+                "label": "Portrait",
+                "thumbnail": "http://commons.wikimedia.org/wiki/Special:FilePath/Fayum02.jpg?width=300"
+                },
+                ...
+            ],
+            "sparkline": [
+                {
+                "score": 2,
+                "year": -600
+                },
+                {
+                "score": 4,
+                "year": -500
+                },
+                ...
+                {
+                "score": 18,
+                "year": 2001
+                }
+            ],
+            "contents": [
+                {
+                "description": "Le palais Fesch, ...",
+                "title": "Histoires bibliques",
+                "url": "http://www.musee-fesch.com/index.php/musee_fesch/content/view/ef_catalogue_sommaire/1513/%28node_id_theme%29/33459",
+                "tags": [
+                    {
+                    "url": "http://fr.dbpedia.org/resource/Peinture",
+                    "id": 54648,
+                    "translated_label": "Peinture",
+                    "wkpd_url": "http://fr.wikipedia.org/wiki/Peinture",
+                    "label": "Peinture",
+                    "order": 1,
+                    "match": true
+                    },
+                    ...
+                ],
+                "score": 23,
+                "coords": {
+                    "city_name": "Ajaccio",
+                    "latitude": 41.916667,
+                    "longitude": 8.733333
+                },
+                "hda_id": "4448",
+                "id": 13855
+                },
+                {
+                "description": "...",
+                "title": "Le XIXe siècle",
+                "url": "http://www.grandpalais.fr/fr/article/le-xixe-siecle",
+                "tags": [ ... ],
+                "score": 22,
+                "hda_id": "5217",
+                "id": 13582
+                },
+                ...
+            ],
+            "tagtranslations": {
+                "Paul Cézanne": "Paul Cézanne",
+                "Politique": "Politique",
+                "Poésie": "Poésie",
+                "Religion": "Religion",
+                "Empereur": "Empereur",
+                "Saint": "Saint",
+                ...
+            }
+        }
+
+    """
 
     no_translate_langs = [ 'fr' ]
 
@@ -474,6 +747,66 @@
 
 
 def subtree(tree):
+    """
+    Methode récursive permettant de remplir un arbre ce catégories avec les fiches HDA correspondantes.
+
+    :param tree: L'arbre de catégorie
+
+    :returns:Un arbre de catégorie rempli de fiches HDA.
+
+    format du paramêtre `tree` ::
+
+        {
+            "label": "secteur urbain",
+            "contents": [
+                { "label": "banlieue",
+                    "contents": [
+                        { "label": "faubourg" }
+                    ] },
+                { "label": "îlot" },
+                ...
+            ]
+        }
+
+    Exemple de retour ::
+
+
+        {
+            "label": "secteur urbain",
+            "contents": [
+                {
+                    "score": 6,
+                    "organization": "Institut national de l'audiovisuel ( INA )",
+                    "description": "Pour faire face à la ...",
+                    "title": "La construction des grands ensembles de banlieue : l'exemple de Sarcelles",
+                    "url": "http://fresques.ina.fr/jalons/fiche-media/InaEdu01075/la-construction-des-grands-ensembles-de-banlieue--l-exemple-de-sarcelles",
+                    "hda_id": "2090",
+                    "organization_url": "http://www.ina.fr",
+                    "id": 12360
+                },
+                {
+                    "score": 6,
+                    "organization": "Maison de banlieue et d'architecture",
+                    "description": "La Maison de banlieue et d'architecture...",
+                    "title": "Des ensembles assez grands. Mémoire et projets en Essonne",
+                    "url": "http://maisondebanlieue.fr/wp-content/uploads/2011/05/Cahier11_grands_ensembles.pdf",
+                    "hda_id": "5893",
+                    "organization_url": "http://www.maisondebanlieue.fr/",
+                    "id": 14821
+                },
+                ...
+            ]
+            "themes": [
+                {
+                    "label": "faubourg",
+                    "content":  [...],
+                    "themes": [...]
+                },
+                ...
+            ]
+        }
+
+    """
     MAX_TAG_ORDER = 16
     label = tree['label']
     sub = tree.get('contents',[])
@@ -497,6 +830,31 @@
     return res
 
 def filltree(request):
+    """
+    Vue permettant d'ajouter des fiches à un arbre de catégories.
+    Cette méthode est en fait un simple wrapper pour la méthode :meth:`subtree`.
+
+    Paramêtres GET:
+        :var tree: Serialisation json d'un arbre de catégories à remplir. exemple:
+
+        ::
+
+            {
+                "label": "secteur urbain",
+                "contents": [
+                    { "label": "banlieue",
+                      "contents": [
+                          { "label": "faubourg" }
+                      ] },
+                    { "label": "îlot" },
+                    ...
+                ]
+            }
+
+    Réponse (application/json):
+        L'arbre de catégories remplis de fiches HDA (c.f. retour methode :meth:`subtree`)
+
+    """
 
     tree = request.GET.get('tree','{}')