Skip to content
This repository has been archived by the owner on Oct 1, 2022. It is now read-only.

Commit

Permalink
Merge pull request #19.
Browse files Browse the repository at this point in the history
  • Loading branch information
Guilherme Gondim committed Dec 11, 2011
1 parent caecbac commit 948ed4a
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 38 deletions.
36 changes: 20 additions & 16 deletions smuggler/utils.py
Expand Up @@ -5,23 +5,15 @@
# Django Smuggler is free software under terms of the GNU Lesser
# General Public License version 3 (LGPLv3) as published by the Free
# Software Foundation. See the file README for copying conditions.

import os
from django.core import serializers

from django.core.exceptions import PermissionDenied
from django.core.management.color import no_style
from django.db import connections, router, transaction
from django.db.models import get_model
from django.db.utils import DEFAULT_DB_ALIAS
from django.core.management.commands.dumpdata import Command as DumpData
from django.http import HttpResponse
from smuggler.settings import (SMUGGLER_EXCLUDE_LIST, SMUGGLER_FORMAT,
SMUGGLER_INDENT)

def get_excluded_models_set():
excluded_models = set([])
for label in SMUGGLER_EXCLUDE_LIST:
app_label, model_label = label.split('.')
excluded_models.add(get_model(app_label, model_label))
return excluded_models
from smuggler.settings import (SMUGGLER_FORMAT, SMUGGLER_INDENT)


def get_file_list(path):
file_list = []
Expand All @@ -33,23 +25,33 @@ def get_file_list(path):
file_list.sort()
return file_list


def save_uploaded_file_on_disk(uploaded_file, destination_path):
destination = open(destination_path, 'w')
for chunk in uploaded_file.chunks():
destination.write(chunk)
destination.close()

def serialize_to_response(queryset,
response=HttpResponse(mimetype='text/plain'),

def serialize_to_response(app_labels=[], exclude=[], response=None,
format=SMUGGLER_FORMAT, indent=SMUGGLER_INDENT):
serializers.serialize(format, queryset, indent=indent, stream=response)
response = response or HttpResponse(mimetype='text/plain')
response.write(DumpData().handle(*app_labels, **{
'exclude': exclude,
'format': format,
'indent': indent,
'show_traceback': True,
'use_natural_keys': True
}))
return response


def load_requested_data(data):
"""
Load the given data dumps and return the number of imported objects.
Wraps the entire action in a big transaction.
"""
style = no_style()

Expand Down Expand Up @@ -86,10 +88,12 @@ def load_requested_data(data):
connection.close()
return counter


def superuser_required(function):
"""
Decorator for views that checks if the logged user is a superuser. In other
words, deny access from non-superusers.
"""
def _inner(request, *args, **kwargs):
if not request.user.is_superuser:
Expand Down
33 changes: 11 additions & 22 deletions smuggler/views.py
Expand Up @@ -9,58 +9,47 @@
import os
from datetime import datetime
from django.core import serializers
from django.db.models import get_app, get_apps, get_model, get_models
from django.shortcuts import render_to_response
from django.template import RequestContext
from django.utils.translation import ugettext as _
from django.contrib import messages

from smuggler.forms import ImportFileForm
from smuggler.settings import SMUGGLER_FORMAT, SMUGGLER_FIXTURE_DIR
from smuggler.utils import (get_excluded_models_set, get_file_list,
from smuggler.settings import (SMUGGLER_FORMAT, SMUGGLER_FIXTURE_DIR,
SMUGGLER_EXCLUDE_LIST)
from smuggler.utils import (get_file_list,
save_uploaded_file_on_disk, serialize_to_response,
superuser_required, load_requested_data)


def dump_to_response(objects, filename_prefix=None):
"""Utility function that dumps the given objects to an HttpResponse.
def dump_to_response(app_label=None, exclude=[], filename_prefix=None):
"""Utility function that dumps the given app/model to an HttpResponse.
"""
filename = '%s.%s' % (datetime.now().isoformat(), SMUGGLER_FORMAT)
if filename_prefix:
filename = '%s_%s' % (filename_prefix, filename)
response = serialize_to_response(objects)
response = serialize_to_response(app_label and [app_label] or [], exclude)
response['Content-Disposition'] = 'attachment; filename=%s' % filename
return response

def dump_data(request):
"""Exports data from whole project.
"""
objects = []
for app in get_apps():
models = set(get_models(app)) - get_excluded_models_set()
for model in models:
if not model._meta.proxy:
objects.extend(model._default_manager.all())
return dump_to_response(objects)
return dump_to_response(exclude=SMUGGLER_EXCLUDE_LIST)
dump_data = superuser_required(dump_data)

def dump_app_data(request, app_label):
"""Exports data from a application.
"""
objects = []
models = set(get_models(get_app(app_label))) - get_excluded_models_set()
for model in models:
if not model._meta.proxy:
objects.extend(model._default_manager.all())
return dump_to_response(objects, app_label)
return dump_to_response(app_label, SMUGGLER_EXCLUDE_LIST, app_label)
dump_app_data = superuser_required(dump_app_data)

def dump_model_data(request, app_label, model_label):
"""Exports data from a model.
"""
model = get_model(app_label, model_label)
objects = model._default_manager.all()
return dump_to_response(objects, '-'.join((app_label, model_label)))
return dump_to_response('%s.%s' % (app_label, model_label),
[],
'-'.join((app_label, model_label)))
dump_model_data = superuser_required(dump_model_data)

def load_data(request):
Expand Down

0 comments on commit 948ed4a

Please sign in to comment.