2 from datetime
import datetime
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
['URL'] for db
in settings
.COUCHDB_DATABASES
.values())
32 exclude
= options
['exclude']
34 couchdb_admins
= getattr(settings
, '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', {}):
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
)
55 def get_all_design_docs(db
):
56 """ Returns all design documents in the database """
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
=[]):
65 Return one design doc for each index file
68 for ddoc
in self
.get_all_design_docs(db
):
69 if any(e
in ddoc
for e
in exclude
):
72 sig
= db
.res
.get('/_design/%s/_info' % ddoc
).json_body
['view_index']['signature']
78 def touch_view(self
, db
, ddoc
, view
):
79 r
= list(db
.view('%s/%s' % (ddoc
, view
), limit
=0, stale
='update_after'))