Skip to content

Instantly share code, notes, and snippets.

@pads
Last active December 20, 2015 17:18
Show Gist options
  • Save pads/6167532 to your computer and use it in GitHub Desktop.
Save pads/6167532 to your computer and use it in GitHub Desktop.
Archive tiddlers from one bag to another, based on age.
import logging
from datetime import datetime
from tiddlywebplugins.tiddlyspace.config import config
from tiddlyweb.store import Store
from tiddlyweb.model.tiddler import Tiddler
now = datetime.utcnow()
# Make sure this is writable by the user running this
filename = 'archive-%s-%s-%s.log' % (now.year, now.month, now.day)
logging.basicConfig(filename=filename, level=logging.INFO, format='%(asctime)s %(message)s')
# This uses the default DB config which is configured to tiddlyweb@localhost without a password
# Update the second value as required if this is different i.e.:
# { 'db_config': '<mysql-connection-string>'}
store = Store(config['server_store'][0], config['server_store'][1],
environ={'tiddlyweb.config': config})
def archive(from_bag, to_bag, max_days=90, filter=None):
if filter:
logging.info('using filter %s', filter)
tiddlers = list(store.search('bag:%s %s _limit:99999;sort=modified'
% (from_bag, filter)))
else:
tiddlers = list(store.search('bag:%s _limit:99999;sort=modified' % from_bag))
logging.info('found %s tiddlers in %s', len(tiddlers), from_bag)
counter = 0
for tiddler in tiddlers:
original_tiddler = store.get(tiddler)
tiddler_age = now - datetime.strptime(original_tiddler.modified,
'%Y%m%d%H%M%S')
if tiddler_age.days > max_days:
clone_tiddler(store, original_tiddler, to_bag)
store.delete(original_tiddler)
counter = counter + 1
logging.info('archived tiddler %s', original_tiddler.title)
logging.info('archived %s tiddlers', counter)
def clone_tiddler(store, original_tiddler, new_bag):
for revision_id in reversed(store.list_tiddler_revisions(original_tiddler)):
tiddler_revision = Tiddler(original_tiddler.title, original_tiddler.bag)
tiddler_revision.revision = revision_id
tiddler_revision = store.get(tiddler_revision)
tiddler_revision.bag = new_bag
tiddler_revision.revision = None
store.put(tiddler_revision)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment