7608adf9472bfcdff43a30c7423fb85ad3ab3039
[mygpo.git] / mygpo / db / couchdb / management / commands / touch-couchdb-views.py
blob7608adf9472bfcdff43a30c7423fb85ad3ab3039
1 import sys
2 from datetime import datetime
3 from time import sleep
4 from urlparse import urlparse
5 from optparse import make_option
7 from couchdbkit import Database
8 from restkit import BasicAuth
9 from django.core.management.base import BaseCommand
10 from django.conf import settings
12 from mygpo.decorators import repeat_on_conflict
13 from mygpo.core.models import SanitizingRule
14 from mygpo.utils import progress
18 class Command(BaseCommand):
19 """ Queries a view in each design document to keep the view-files hot """
21 option_list = BaseCommand.option_list + (
22 make_option('--exclude', action='append', dest='exclude', default=[],
23 help='Exclude views that contain the text as substring'),
27 def handle(self, *args, **options):
28 db_urls = set(db[1] for db in settings.COUCHDB_DATABASES)
30 filters = []
32 exclude = options['exclude']
34 couchdb_admins = getattr(settings, 'COUCHDB_ADMINS', ())
35 if couchdb_admins:
36 username, passwd = couchdb_admins[0]
37 filters.append(BasicAuth(username, passwd))
39 for db_url in db_urls:
40 db = Database(db_url, filters=filters)
42 for sig, ddoc_name in self.get_design_docs(db, exclude):
43 ddoc = db['_design/' + ddoc_name]
44 if not ddoc.get('views', {}):
45 continue
47 view_name = ddoc['views'].keys()[0]
48 print 'touching %s %s/%s' % (sig[:5], ddoc_name, view_name),
49 self.touch_view(db, ddoc_name, view_name)
50 print
54 @staticmethod
55 def get_all_design_docs(db):
56 """ Returns all design documents in the database """
58 prefix = '_design/'
59 prefix_len = len(prefix)
60 return (ddoc['key'][prefix_len:] for ddoc in db.view('_all_docs', startkey='_design/', endkey='_design0'))
63 def get_design_docs(self, db, exclude=[]):
64 """
65 Return one design doc for each index file
66 """
67 ddocs = {}
68 for ddoc in self.get_all_design_docs(db):
69 if any(e in ddoc for e in exclude):
70 continue
72 sig = db.res.get('/_design/%s/_info' % ddoc).json_body['view_index']['signature']
73 ddocs[sig] = ddoc
75 return ddocs.items()
78 def touch_view(self, db, ddoc, view):
79 r = list(db.view('%s/%s' % (ddoc, view), limit=0, stale='update_after'))