create "touch-couchdb-views" mgmt cmd
[mygpo.git] / mygpo / maintenance / management / commands / touch-couchdb-views.py
blobca234609807cf52964888b9f1ea245e2f34c6c8e
1 import sys
2 from datetime import datetime
3 from time import sleep
4 from urlparse import urlparse
6 from couchdbkit import Database
7 from restkit import BasicAuth
8 from django.core.management.base import BaseCommand
9 from django.conf import settings
11 from mygpo.decorators import repeat_on_conflict
12 from mygpo.core.models import SanitizingRule
13 from mygpo.utils import progress
17 class Command(BaseCommand):
18 """ Queries a view in each design document to keep the view-files hot """
20 def handle(self, *args, **options):
21 db_urls = set(db[1] for db in settings.COUCHDB_DATABASES)
23 filters = []
25 couchdb_admins = getattr(settings, 'COUCHDB_ADMINS', ())
26 if couchdb_admins:
27 username, passwd = couchdb_admins[0]
28 filters.append(BasicAuth(username, passwd))
30 for db_url in db_urls:
31 db = Database(db_url, filters=filters)
33 for sig, ddoc_name in self.get_design_docs(db):
34 ddoc = db['_design/' + ddoc_name]
35 if not ddoc.get('views', {}):
36 continue
38 view_name = ddoc['views'].keys()[0]
39 print 'touching %s %s/%s' % (sig[:5], ddoc_name, view_name),
40 self.touch_view(db, ddoc_name, view_name)
41 print
45 @staticmethod
46 def get_all_design_docs(db):
47 """ Returns all design documents in the database """
49 prefix = '_design/'
50 prefix_len = len(prefix)
51 return (ddoc['key'][prefix_len:] for ddoc in db.view('_all_docs', startkey='_design/', endkey='_design0'))
54 def get_design_docs(self, db):
55 """
56 Return one design doc for each index file
57 """
58 ddocs = {}
59 for ddoc in self.get_all_design_docs(db):
60 sig = db.res.get('/_design/%s/_info' % ddoc).json_body['view_index']['signature']
61 ddocs[sig] = ddoc
63 return ddocs.items()
66 def touch_view(self, db, ddoc, view):
67 r = list(db.view('%s/%s' % (ddoc, view), limit=0, stale='update_after'))