src/hdalab/management/commands/query_category_inclusion.py
author ymh <ymh.work@gmail.com>
Wed, 11 Apr 2018 12:19:47 +0200
branchdocumentation
changeset 693 09e00f38d177
parent 683 59d49ab04ded
permissions -rw-r--r--
Add hdabo/hdalab documentations
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
204
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
     1
# -*- coding: utf-8 -*-
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
     2
'''
693
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 683
diff changeset
     3
Requête wikipedia pour reconstituer l'arbre des catégories.
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 683
diff changeset
     4
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 683
diff changeset
     5
Cette commande utilise directement `l'api wikipedia <https://www.mediawiki.org/wiki/API:Main_page>`_ pour faire ses requêtes.
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 683
diff changeset
     6
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 683
diff changeset
     7
**Usage**: ``django-admin query_category_inclusion [options]``
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 683
diff changeset
     8
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 683
diff changeset
     9
**Options spécifiques:**
204
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
    10
693
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 683
diff changeset
    11
    - *\-\-all* :               force à traiter toutes les catégories
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 683
diff changeset
    12
    - *\-\-force* :             ne pose aucune question
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 683
diff changeset
    13
    - *\-\-site=SITE_URL* :     url du site wikipedia (défaut: https://fr.wikipedia.org/w/api.php)
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 683
diff changeset
    14
    - *\-\-limit=LIMIT* :       Nombre de catégories à traiter
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 683
diff changeset
    15
    - *\-\-start=START* :       Nombre de catégories à ignorer
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 683
diff changeset
    16
    - *\-\-category=CATEGORY* : Limite le traitement à cette catégorie
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 683
diff changeset
    17
204
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
    18
'''
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
    19
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
    20
from django.conf import settings
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
    21
from django.core.management.base import NoArgsCommand
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
    22
from django.core.management.color import no_style
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
    23
from hdalab.models import WpCategory, WpCategoryInclusion
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
    24
from optparse import make_option
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
    25
from wikitools import api,wiki
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
    26
import sys
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
    27
import re
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
    28
import itertools
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
    29
from hdabo import utils
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
    30
from django.db.models import Count
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
    31
from django.db import transaction
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
    32
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
    33
CATEGORY_PREFIX = u'Catégorie:'
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
    34
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
    35
class Command(NoArgsCommand):
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
    36
    '''
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
    37
    query and update wikipedia for tag title.
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
    38
    '''
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
    39
    options = ''
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
    40
    help = """query and update wikipedia for tag title."""
693
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 683
diff changeset
    41
204
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
    42
    option_list = NoArgsCommand.option_list + (
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
    43
        make_option('--all',
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
    44
            action='store_true',
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
    45
            dest='all',
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
    46
            default=False,
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
    47
            help='force all categories to be updated, not only those not yet processed'),
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
    48
        make_option('--force',
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
    49
            action='store_true',
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
    50
            dest='force',
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
    51
            default=False,
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
    52
            help='ask no questions'),
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
    53
        make_option('--site',
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
    54
            action='store',
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
    55
            type='string',
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
    56
            dest='site_url',
683
59d49ab04ded use https for wikipedia api endpoint
ymh <ymh.work@gmail.com>
parents: 571
diff changeset
    57
            default="https://fr.wikipedia.org/w/api.php",
204
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
    58
            help='the url for the wikipedia site'),
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
    59
        make_option('--limit',
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
    60
            action='store',
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
    61
            type='int',
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
    62
            dest='limit',
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
    63
            default= -1,
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
    64
            help='number of categories to process'),
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
    65
        make_option('--start',
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
    66
            action='store',
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
    67
            type='int',
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
    68
            dest='start',
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
    69
            default=0,
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
    70
            help='number of categories to ignore'),
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
    71
        make_option('--category',
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
    72
            action='append',
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
    73
            dest='category',
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
    74
            type='string',
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
    75
            default=[],
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
    76
            help='the categories to query'),
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
    77
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
    78
    )
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
    79
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
    80
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
    81
    def query_all_categories(self, category_title, site):
693
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 683
diff changeset
    82
204
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
    83
        params = {'action':'query', 'cmtitle':category_title, 'list':'categorymembers', 'cmlimit': 'max'}
693
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 683
diff changeset
    84
204
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
    85
        res = []
693
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 683
diff changeset
    86
204
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
    87
        wpquery = api.APIRequest(site, params) #@UndefinedVariable
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
    88
        response = wpquery.query()
693
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 683
diff changeset
    89
204
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
    90
        if self.verbosity > 1:
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
    91
            print "Query category : " + repr(wpquery.request.get_full_url()+"?"+wpquery.request.get_data())
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
    92
            print repr(response)
693
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 683
diff changeset
    93
204
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
    94
        members = response.get('query', {}).get('categorymembers', [])
693
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 683
diff changeset
    95
204
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
    96
        for member in members:
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
    97
            title = member.get('title',"")
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
    98
            if re.match(CATEGORY_PREFIX, title):
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
    99
                res.append(re.sub(CATEGORY_PREFIX, "", title))
693
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 683
diff changeset
   100
204
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
   101
        if self.verbosity > 1:
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
   102
            print "Query categories result: "
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
   103
            print repr(res)
693
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 683
diff changeset
   104
204
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
   105
        return res
693
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 683
diff changeset
   106
204
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
   107
    def process_categories(self, cat_list, parent_cat):
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
   108
        for cat in cat_list:
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
   109
            child_cat,created = WpCategory.objects.get_or_create(label=cat) #@UnusedVariable
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
   110
            WpCategoryInclusion.objects.get_or_create(parent_category=parent_cat, child_category=child_cat)
693
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 683
diff changeset
   111
204
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
   112
    def handle_noargs(self, **options):
693
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 683
diff changeset
   113
204
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
   114
        self.style = no_style()
693
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 683
diff changeset
   115
204
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
   116
        interactive = options.get('interactive', True)
693
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 683
diff changeset
   117
204
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
   118
        self.verbosity = int(options.get('verbosity', '1'))
693
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 683
diff changeset
   119
204
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
   120
        force = options.get('force', False)
693
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 683
diff changeset
   121
204
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
   122
        limit = options.get("limit", -1)
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
   123
        start = options.get("start", 0)
693
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 683
diff changeset
   124
204
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
   125
        site_url = options.get('site_url', settings.WIKIPEDIA_API_URL)
693
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 683
diff changeset
   126
204
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
   127
        types_mask = 0
693
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 683
diff changeset
   128
204
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
   129
        if self.verbosity > 2:
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
   130
            print "option passed : " + repr(options)
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
   131
206
7070d3acc3d4 improved category filtering
veltr
parents: 204
diff changeset
   132
        queryset = WpCategory.objects.filter(tags__hidden = False).distinct()
693
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 683
diff changeset
   133
204
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
   134
        cat_list = options.get("category", []);
693
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 683
diff changeset
   135
204
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
   136
        if cat_list:
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
   137
            queryset = queryset.filter(label__in=cat_list)
693
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 683
diff changeset
   138
        elif options.get('all',False):
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 683
diff changeset
   139
            queryset = queryset.annotate(wpc=Count('child_categories')).filter(wpc = 0)
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 683
diff changeset
   140
206
7070d3acc3d4 improved category filtering
veltr
parents: 204
diff changeset
   141
        queryset = queryset.order_by("label")
693
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 683
diff changeset
   142
204
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
   143
        if limit >= 0:
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
   144
            queryset = queryset[start:limit]
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
   145
        elif start > 0:
693
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 683
diff changeset
   146
            queryset = queryset[start:]
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 683
diff changeset
   147
204
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
   148
        if self.verbosity > 2 :
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
   149
            print "Category Query is %s" % (queryset.query)
693
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 683
diff changeset
   150
204
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
   151
        site = wiki.Wiki(site_url) #@UndefinedVariable
693
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 683
diff changeset
   152
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 683
diff changeset
   153
204
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
   154
        count = queryset.count()
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
   155
        if self.verbosity > 1:
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
   156
            print "Processing %d categories" % (count)
693
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 683
diff changeset
   157
204
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
   158
        if not force and interactive:
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
   159
            confirm = raw_input("You have requested to query and replace the wikipedia information for %d categories.\n Are you sure you want to do this? \nType 'yes' to continue, or 'no' to cancel: " % (count))
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
   160
        else:
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
   161
            confirm = 'yes'
693
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 683
diff changeset
   162
204
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
   163
        if confirm != "yes":
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
   164
            print "wikipedia query cancelled"
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
   165
            return
693
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 683
diff changeset
   166
204
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
   167
        for i, category in enumerate(queryset):
693
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 683
diff changeset
   168
204
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
   169
            if self.verbosity > 1:
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
   170
                print "processing category %s (%d/%d)" % (category.label, i + 1, count)
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
   171
            else:
693
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 683
diff changeset
   172
                utils.show_progress(i + 1, count, category.label, 60)
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 683
diff changeset
   173
204
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
   174
            title = CATEGORY_PREFIX + category.label
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
   175
            # query categories
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
   176
571
d9642be7c937 replace commit_on_success with atomic
ymh <ymh.work@gmail.com>
parents: 271
diff changeset
   177
            with transaction.atomic():
204
0a1744477bc1 Added category tree Ajax API + Tables
veltr
parents:
diff changeset
   178
                res = self.query_all_categories(title, site)
693
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 683
diff changeset
   179
                self.process_categories(res, category)