padma migration
This commit is contained in:
commit
272c228326
2 changed files with 229 additions and 0 deletions
155
import_padma.py
Executable file
155
import_padma.py
Executable file
|
@ -0,0 +1,155 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
from __future__ import division
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
|
||||||
|
import_dir = os.path.normpath(os.path.abspath(os.path.dirname(__file__)))
|
||||||
|
root_dir = os.path.normpath(os.path.abspath(sys.argv[1]))
|
||||||
|
os.chdir(root_dir)
|
||||||
|
|
||||||
|
#using virtualenv's activate_this.py to reorder sys.path
|
||||||
|
activate_this = os.path.join(root_dir, '..', 'bin', 'activate_this.py')
|
||||||
|
execfile(activate_this, dict(__file__=activate_this))
|
||||||
|
|
||||||
|
sys.path.insert(0, root_dir)
|
||||||
|
|
||||||
|
from django.core.management import setup_environ
|
||||||
|
try:
|
||||||
|
import settings # Assumed to be in the same directory.
|
||||||
|
except ImportError:
|
||||||
|
import sys
|
||||||
|
sys.stderr.write("Error: Can't find the file 'settings.py' in the directory containing %r. It appears you've customized things.\nYou'll have to run django-admin.py, passing it your settings module.\n(If the file settings.py does indeed exist, it's causing an ImportError somehow.)\n" % __file__)
|
||||||
|
sys.exit(1)
|
||||||
|
settings.DEBUG=False
|
||||||
|
|
||||||
|
setup_environ(settings)
|
||||||
|
|
||||||
|
from django.contrib.auth.models import User, Group
|
||||||
|
from datetime import datetime
|
||||||
|
from ox.utils import json
|
||||||
|
import ox
|
||||||
|
from item.models import Item
|
||||||
|
from annotation.models import Annotation, Layer
|
||||||
|
from archive.models import File
|
||||||
|
from urlalias.models import IDAlias, LayerAlias
|
||||||
|
from django.db import connection, transaction
|
||||||
|
|
||||||
|
|
||||||
|
os.chdir(import_dir)
|
||||||
|
|
||||||
|
with open('users.json') as f: users = json.load(f)
|
||||||
|
|
||||||
|
with open('padma_files.json') as f: padma = json.load(f)
|
||||||
|
|
||||||
|
with open('padma_data.json') as f: padma_data = json.load(f)
|
||||||
|
|
||||||
|
longest_username = max([len(u['username'].strip()) for u in users]) + 1
|
||||||
|
if longest_username > 255:
|
||||||
|
print "longer usernames, extending table to", longest_username, 'fix in monkey_patch/models.py'
|
||||||
|
cursor = connection.cursor()
|
||||||
|
cursor.execute('ALTER TABLE auth_user ALTER COLUMN username TYPE varchar(%d);'%longest_username)
|
||||||
|
transaction.commit_unless_managed()
|
||||||
|
|
||||||
|
print "now users"
|
||||||
|
for u in users:
|
||||||
|
username = u['username'].strip()
|
||||||
|
user, created = User.objects.get_or_create(username=username)
|
||||||
|
user.email = u['email']
|
||||||
|
user.password = u['password']
|
||||||
|
user.date_joined = datetime.strptime(u['created'], '%Y-%m-%dT%H:%M:%SZ')
|
||||||
|
user.save()
|
||||||
|
profile = user.get_profile()
|
||||||
|
if 'admin' in user['groups']:
|
||||||
|
profile.set_level('admin')
|
||||||
|
else:
|
||||||
|
profile.set_level('member')
|
||||||
|
profile.save()
|
||||||
|
for g in u['groups']:
|
||||||
|
if g and g.strip() and g not 'admin':
|
||||||
|
group, created = Group.objects.get_or_create(name=g)
|
||||||
|
user.groups.add(group)
|
||||||
|
|
||||||
|
def item_data(data):
|
||||||
|
d = {}
|
||||||
|
for key in data:
|
||||||
|
if key in data:
|
||||||
|
value = data[key]
|
||||||
|
if isinstance(value, basestring):
|
||||||
|
value = value.replace('\r\n', '\n').strip()
|
||||||
|
d[{
|
||||||
|
u'id': u'oldId',
|
||||||
|
u'categories': u'category',
|
||||||
|
u'languages': u'language',
|
||||||
|
}.get(key, key)] = value
|
||||||
|
if 'director' in d:
|
||||||
|
d['director'] = unicode(d['director']).strip().split(', ')
|
||||||
|
for key in ('layers', 'duration', 'size', 'public'):
|
||||||
|
if key in d:
|
||||||
|
del d[key]
|
||||||
|
return d
|
||||||
|
|
||||||
|
def import_layers(item, layers):
|
||||||
|
Annotation.objects.filter(item=item).delete()
|
||||||
|
print "importing %d annotations" % len(layers)
|
||||||
|
for layer in layers:
|
||||||
|
oldLayerId = layer['id']
|
||||||
|
annotation = Annotation(item=item, layer=layer['track'])
|
||||||
|
annotation.start = float(layer['time_in'])/1000
|
||||||
|
annotation.end = float(layer['time_out'])/1000
|
||||||
|
username = layer['creator'].strip()
|
||||||
|
annotation.user = User.objects.get(username=username)
|
||||||
|
annotation.value = layer['value']
|
||||||
|
annotation.created = datetime.fromtimestamp(int(layer['created']))
|
||||||
|
annotation.modified = datetime.fromtimestamp(int(layer['modified']))
|
||||||
|
annotation.save()
|
||||||
|
#migration alias
|
||||||
|
alias, created = LayerAlias.objects.get_or_create(old=oldLayerId)
|
||||||
|
alias.new = annotation.public_id
|
||||||
|
alias.save()
|
||||||
|
|
||||||
|
i=1
|
||||||
|
for oldId in sorted(padma, key=lambda x: padma[x]['created']):
|
||||||
|
itemId = ox.to26(i)
|
||||||
|
print '\n', itemId, oldId
|
||||||
|
qs = Item.objects.filter(itemId=itemId)
|
||||||
|
if qs.count() == 0:
|
||||||
|
item = Item(itemId=itemId)
|
||||||
|
else:
|
||||||
|
item = qs[0]
|
||||||
|
alias, created = IDAlias.objects.get_or_create(old=oldId)
|
||||||
|
alias.new = itemId
|
||||||
|
alias.save()
|
||||||
|
if True or not item.data:
|
||||||
|
data = padma_data[oldId]
|
||||||
|
_data = item_data(data)
|
||||||
|
for key in _data:
|
||||||
|
item.data[key] = _data[key]
|
||||||
|
if 'poster_frame' in data:
|
||||||
|
item.poster_frame = float(item.data.pop('poster_frame')) / 1000
|
||||||
|
if 'published' in data:
|
||||||
|
item.published = datetime.fromtimestamp(int(item.data.pop('published')))
|
||||||
|
if 'created' in data:
|
||||||
|
item.created = datetime.fromtimestamp(int(item.data.pop('created')))
|
||||||
|
if 'modified' in data:
|
||||||
|
item.modified = datetime.fromtimestamp(int(item.data.pop('modified')))
|
||||||
|
item.level = data.get('public', False) and 0 or 2
|
||||||
|
username = item.data.pop('creator').strip()
|
||||||
|
item.user = User.objects.get(username=username)
|
||||||
|
item.save()
|
||||||
|
import_layers(item, data['layers'])
|
||||||
|
#link file
|
||||||
|
if oldId in padma:
|
||||||
|
if padma[oldId]['oshash']:
|
||||||
|
print 'add file', padma[oldId]['oshash']
|
||||||
|
f, created = File.objects.get_or_create(oshash=padma[oldId]['oshash'],
|
||||||
|
item=item)
|
||||||
|
f.path = f.get('file', '')
|
||||||
|
f.save()
|
||||||
|
if 'ogg_oshash' in padma[oldId]:
|
||||||
|
print 'add file', padma[oldId]['ogg_oshash']
|
||||||
|
f, created = File.objects.get_or_create(oshash=padma[oldId]['ogg_oshash'],
|
||||||
|
item=item)
|
||||||
|
f.path = f.get('ogg', '')
|
||||||
|
f.save()
|
||||||
|
i += 1
|
||||||
|
print item, item.available
|
74
padma_dump.py
Executable file
74
padma_dump.py
Executable file
|
@ -0,0 +1,74 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# vi:si:et:sw=2:sts=2:ts=2
|
||||||
|
# GPL written 2008 by j@pad.ma
|
||||||
|
|
||||||
|
import pkg_resources
|
||||||
|
pkg_resources.require("TurboGears")
|
||||||
|
|
||||||
|
from turbogears import config, update_config, start_server
|
||||||
|
import cherrypy
|
||||||
|
cherrypy.lowercase_api = True
|
||||||
|
from os.path import *
|
||||||
|
import sys
|
||||||
|
|
||||||
|
# first look on the command line for a desired config file,
|
||||||
|
# if it's not on the command line, then
|
||||||
|
# look for setup.py in this directory. If it's not there, this script is
|
||||||
|
# probably installed
|
||||||
|
if len(sys.argv) > 1:
|
||||||
|
update_config(configfile=sys.argv[1],
|
||||||
|
modulename="padma.config")
|
||||||
|
elif exists(join(dirname(__file__), "setup.py")):
|
||||||
|
update_config(configfile="dev.cfg",modulename="padma.config")
|
||||||
|
else:
|
||||||
|
update_config(configfile="prod.cfg",modulename="padma.config")
|
||||||
|
config.update(dict(package="padma"))
|
||||||
|
|
||||||
|
from padma.model import *
|
||||||
|
|
||||||
|
import os
|
||||||
|
import ox
|
||||||
|
import simplejson as json
|
||||||
|
|
||||||
|
prefix = '/tmp/padma'
|
||||||
|
os.makedirs(prefix)
|
||||||
|
|
||||||
|
data = {}
|
||||||
|
for v in Video.select():
|
||||||
|
data[v.hid] = v.jsondump()
|
||||||
|
|
||||||
|
with open(os.path.join(prefix, 'padma_data.json'), 'w') as f:
|
||||||
|
json.dump(data, f)
|
||||||
|
|
||||||
|
users = []
|
||||||
|
for u in User.select().orderBy('id'):
|
||||||
|
users.append({
|
||||||
|
'id': u.id,
|
||||||
|
'username': u.user_name.strip(),
|
||||||
|
'email': u.email_address,
|
||||||
|
'password': 'sha1$$' + u.password,
|
||||||
|
'created': u.created.strftime('%Y-%m-%dT%H:%M:%SZ'),
|
||||||
|
'groups': [g.name for g in u.groups],
|
||||||
|
})
|
||||||
|
|
||||||
|
with open(os.path.join(prefix, 'users.json'), 'w') as f:
|
||||||
|
json.dump(users, f, indent=2)
|
||||||
|
|
||||||
|
|
||||||
|
files = []
|
||||||
|
for v in Video.select().orderBy('id'):
|
||||||
|
f = {
|
||||||
|
'sha1sum': v.source_hash,
|
||||||
|
'ogg': v.filename,
|
||||||
|
'id': v.hid,
|
||||||
|
'created': int(v.created.strftime('%s'))
|
||||||
|
}
|
||||||
|
info = ox.avinfo(v.filename)
|
||||||
|
f['oshash'] = info.get('metadata', {}).get('SOURCE_OSHASH', '')
|
||||||
|
f['ogg_oshash'] = info['oshash']
|
||||||
|
files.append(f)
|
||||||
|
|
||||||
|
with open(os.path.join(prefix, 'padma_files.json'), 'w') as f:
|
||||||
|
json.dump(files, f, indent=2)
|
||||||
|
|
Loading…
Reference in a new issue