Last active
December 17, 2015 06:48
-
-
Save jacobg/5567873 to your computer and use it in GitHub Desktop.
Example migrate script for Django
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
''' | |
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