Merge lp:~jderose/dmedia/project-stats into lp:dmedia

Proposed by Jason Gerard DeRose
Status: Merged
Merged at revision: 476
Proposed branch: lp:~jderose/dmedia/project-stats
Merge into: lp:dmedia
Diff against target: 179 lines (+48/-24)
4 files modified
dmedia/core.py (+27/-11)
dmedia/schema.py (+10/-0)
dmedia/tests/test_core.py (+5/-3)
ui/dmedia.js (+6/-10)
To merge this branch: bzr merge lp:~jderose/dmedia/project-stats
Reviewer Review Type Date Requested Status
James Raymond Approve
Review via email: mp+130232@code.launchpad.net

Description of the change

* Changes dmedia/project schema to include doc.count, doc.bytes

* Changes Importer.on_items() (in dmedia.js) to use count and bytes from project directory docs rather than hitting a view in each project database

* Changes Core.init_project_views() to update the doc.count, doc.type in the project doc in the project database, and also to sync the changes into the project directory doc in dmedia-0 if needed

To post a comment you must log in.
Revision history for this message
James Raymond (jamesmr) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'dmedia/core.py'
--- dmedia/core.py 2012-10-13 15:50:03 +0000
+++ dmedia/core.py 2012-10-17 21:36:22 +0000
@@ -96,8 +96,8 @@
96 log.info('** %.2f to snapshot all database', time.time() - start)96 log.info('** %.2f to snapshot all database', time.time() - start)
9797
9898
99def projects_iter(env):99def projects_iter(server):
100 server = Server(env)100 assert isinstance(server, Server)
101 for name in server.get('_all_dbs'):101 for name in server.get('_all_dbs'):
102 if name.startswith('_'):102 if name.startswith('_'):
103 continue103 continue
@@ -107,12 +107,21 @@
107 yield (name, _id)107 yield (name, _id)
108108
109109
110def update_count_and_bytes(db, doc):
111 stats = db.view('user', 'bytes', reduce=True)['rows'][0]['value']
112 if doc.get('count') != stats['count'] or doc.get('bytes') != stats['sum']:
113 doc['count'] = stats['count']
114 doc['bytes'] = stats['sum']
115 db.save(doc)
116
117
110class Core:118class Core:
111 def __init__(self, env, private=None, shared=None):119 def __init__(self, env, private=None, shared=None):
112 self.env = env120 self.env = env
113 self._private = (PRIVATE if private is None else private)121 self._private = (PRIVATE if private is None else private)
114 self._shared = (SHARED if shared is None else shared)122 self._shared = (SHARED if shared is None else shared)
115 self.db = util.get_db(env, init=True)123 self.db = util.get_db(env, init=True)
124 self.server = self.db.server()
116 self.ms = MetaStore(self.db)125 self.ms = MetaStore(self.db)
117 self.stores = LocalStores()126 self.stores = LocalStores()
118 self.queue = Queue()127 self.queue = Queue()
@@ -201,21 +210,28 @@
201 self.thread = start_thread(self._background_worker)210 self.thread = start_thread(self._background_worker)
202211
203 def init_project_views(self):212 def init_project_views(self):
213 start = time.time()
204 try:214 try:
205 for (name, _id) in projects_iter(self.env):215 self.db.view('project', 'atime')
206 db = util.get_project_db(_id, self.env, True)216 log.info('%.3f to prep project/atime view', time.time() - start)
217 for (name, _id) in projects_iter(self.server):
218 pdb = util.get_project_db(_id, self.env, True)
219 pdoc = pdb.get(_id, attachments=True)
220 update_count_and_bytes(pdb, pdoc)
221 del pdoc['_rev']
207 try:222 try:
208 doc = self.db.get(_id)223 doc = self.db.get(_id, attachments=True)
224 rev = doc.pop('_rev')
225 if doc != pdoc:
226 log.info('syncing project metadata for %s', _id)
227 pdoc['_rev'] = rev
228 self.db.save(pdoc)
209 except NotFound:229 except NotFound:
210 log.info('missing project doc for %s', _id)230 log.info('missing project doc for %s', _id)
211 doc = db.get(_id)231 self.db.save(pdoc)
212 del doc['_rev']232 log.info('%.3f for Core.init_project_views() to complete', time.time() - start)
213 self.db.save(doc)
214 except Exception:233 except Exception:
215 log.exception('Error in Core.init_project_views():')234 log.exception('Error in Core.init_project_views():')
216 log.info('prepping project/atime view...')
217 self.db.view('project', 'atime')
218 log.info('Core.init_project_views() complete')
219235
220 def snapshot(self, dumpdir, dbname):236 def snapshot(self, dumpdir, dbname):
221 start_process(snapshot_db, self.env, dumpdir, dbname)237 start_process(snapshot_db, self.env, dumpdir, dbname)
222238
=== modified file 'dmedia/schema.py'
--- dmedia/schema.py 2012-08-13 02:04:32 +0000
+++ dmedia/schema.py 2012-10-17 21:36:22 +0000
@@ -960,6 +960,8 @@
960 ... 'time': 1234567890,960 ... 'time': 1234567890,
961 ... 'db_name': 'dmedia-0-hb6ysckay27kiwutwkgkctni',961 ... 'db_name': 'dmedia-0-hb6ysckay27kiwutwkgkctni',
962 ... 'title': 'UDS-P',962 ... 'title': 'UDS-P',
963 ... 'count': 42,
964 ... 'bytes': 22020096000,
963 ... }965 ... }
964 ...966 ...
965 >>> check_project(doc)967 >>> check_project(doc)
@@ -976,6 +978,12 @@
976 (_equals, project_db_name(doc['_id'])),978 (_equals, project_db_name(doc['_id'])),
977 )979 )
978 _check(doc, ['title'], str),980 _check(doc, ['title'], str),
981 _check(doc, ['count'], int,
982 (_at_least, 0),
983 )
984 _check(doc, ['count'], int,
985 (_at_least, 0),
986 )
979987
980988
981def project_db_name(_id):989def project_db_name(_id):
@@ -1024,6 +1032,8 @@
1024 'atime': ts,1032 'atime': ts,
1025 'db_name': project_db_name(_id),1033 'db_name': project_db_name(_id),
1026 'title': title,1034 'title': title,
1035 'count': 0,
1036 'bytes': 0,
1027 }1037 }
10281038
10291039
10301040
=== modified file 'dmedia/tests/test_core.py'
--- dmedia/tests/test_core.py 2012-10-10 22:47:53 +0000
+++ dmedia/tests/test_core.py 2012-10-17 21:36:22 +0000
@@ -42,14 +42,14 @@
4242
43class TestCouchFunctions(CouchCase):43class TestCouchFunctions(CouchCase):
44 def test_projects_iter(self):44 def test_projects_iter(self):
45 self.assertEqual(list(core.projects_iter(self.env)), [])45 server = microfiber.Server(self.env)
46 self.assertEqual(list(core.projects_iter(server)), [])
46 ids = tuple(random_id() for i in range(20))47 ids = tuple(random_id() for i in range(20))
47 server = microfiber.Server(self.env)
48 for _id in ids:48 for _id in ids:
49 db_name = project_db_name(_id)49 db_name = project_db_name(_id)
50 server.put(None, db_name)50 server.put(None, db_name)
51 self.assertEqual(51 self.assertEqual(
52 list(core.projects_iter(self.env)),52 list(core.projects_iter(server)),
53 [(project_db_name(_id), _id) for _id in sorted(ids)]53 [(project_db_name(_id), _id) for _id in sorted(ids)]
54 )54 )
5555
@@ -59,6 +59,8 @@
59 inst = core.Core(self.env)59 inst = core.Core(self.env)
60 self.assertIsInstance(inst.db, microfiber.Database)60 self.assertIsInstance(inst.db, microfiber.Database)
61 self.assertEqual(inst.db.name, DB_NAME)61 self.assertEqual(inst.db.name, DB_NAME)
62 self.assertIsInstance(inst.server, microfiber.Server)
63 self.assertIs(inst.db.ctx, inst.server.ctx)
62 self.assertIsInstance(inst.stores, LocalStores)64 self.assertIsInstance(inst.stores, LocalStores)
63 self.assertEqual(inst.local, {'_id': '_local/dmedia', 'stores': {}})65 self.assertEqual(inst.local, {'_id': '_local/dmedia', 'stores': {}})
6466
6567
=== modified file 'ui/dmedia.js'
--- ui/dmedia.js 2012-08-21 18:21:45 +0000
+++ ui/dmedia.js 2012-10-17 21:36:22 +0000
@@ -106,20 +106,16 @@
106Importer.prototype = {106Importer.prototype = {
107 load_items: function() {107 load_items: function() {
108 var callback = $bind(this.on_items, this);108 var callback = $bind(this.on_items, this);
109 db.view(callback, 'project', 'title');109 db.view(callback, 'project', 'title', {'include_docs': true});
110 },110 },
111111
112 on_items: function(req) {112 on_items: function(req) {
113 this.items.replace(req.read().rows,113 this.items.replace(req.read().rows,
114 function(row, items) {114 function(row, items) {
115 var pdb = new couch.Database("dmedia-0-" + row.id.toLowerCase());115 var doc = row.doc;
116 try{116 var count = doc.count ? doc.count : 0;
117 var filecount = pdb.view_sync('doc', 'type', {key: 'dmedia/file'}).rows[0].value;117 var bytes = doc.bytes ? doc.bytes : 0;
118 }118
119 catch(e){
120 var filecount = 0;
121 }
122
123 var li = $el('li', {'class': 'project', 'id': row.id});119 var li = $el('li', {'class': 'project', 'id': row.id});
124120
125 var thumb = $el('div', {'class': 'thumbnail'});121 var thumb = $el('div', {'class': 'thumbnail'});
@@ -135,7 +131,7 @@
135 );131 );
136132
137 info.appendChild(133 info.appendChild(
138 $el('p', {'textContent': filecount + ' files'})134 $el('p', {'textContent': count_n_size(count, bytes)})
139 );135 );
140136
141 li.appendChild(thumb);137 li.appendChild(thumb);

Subscribers

People subscribed via source and target branches