Skip to content

Instantly share code, notes, and snippets.

@jacobg
Last active December 17, 2015 06:48
Show Gist options
  • Save jacobg/5567873 to your computer and use it in GitHub Desktop.
Save jacobg/5567873 to your computer and use it in GitHub Desktop.
Example migrate script for Django
'''
Created on Oct 29, 2012
@author: jacobg
'''
from django.contrib.auth.decorators import login_required
from django.shortcuts import render_to_response
from django.template import RequestContext
from django.views.decorators.http import require_GET
from myapp.models import Employee
from myapp.decorators import app_admin_required
import logging
def _get_task_name():
return 'index-employees' #__name__
def _get_model():
return Employee
def _get_first_item():
return _get_model().objects.all().order_by('id')[0]
def _get_item_filter_from_id(item_id):
return _get_model().objects.filter(id__gte=item_id).order_by('id')
def _process_item(item):
employee = item
employee.save()
@require_GET
@login_required
@app_admin_required
def migrate_handler(request):
items_per_task = 100 # default
task_name = _get_task_name()
item_id = request.GET.get('id')
if item_id is not None:
item_id = int(item_id)
else:
# First request, just get the first item out of the datastore.
item = _get_first_item()
item_id = item.id
# check whether user only wants one task
stop = request.GET.get('stop', 'no') == 'yes'
if stop:
# check if query string sets different limit to items for this task.
# as the code demonstrates, this is only supported when we are using
# one task
limit = request.GET.get('limit')
if limit is not None:
items_per_task = int(limit)
# process items_per_task at a time, plus look ahead 1 entity to get next id to process
items = _get_item_filter_from_id(item_id)[:items_per_task+1]
item_count = items.count()
if item_count == items_per_task+1:
next_id = items[items_per_task-1].id if not stop else None
item_count = items_per_task
else:
next_id = None
for item in items:
_process_item(item)
next_url = None
if next_id is not None:
next_url = '/migrate/%s?id=%d' % (task_name, next_id)
context = {
'task_name': task_name,
'item_id': item_id,
'item_count': item_count,
'next_item_id': next_id,
'next_url': next_url
}
logging.info('%s.migrate_handler: started at id %d, queued task containing %d item(s), next id is %s' % (task_name, item_id, item_count, str(next_id)))
return render_to_response('migrate/redirecting_migrator.html', context, context_instance=RequestContext(request))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment