Add support for import bootstrap setups from URLs

This commit is contained in:
Roberto Rosario
2012-10-16 02:22:39 -04:00
parent 7ce8652188
commit 85455e7647
7 changed files with 64 additions and 20 deletions

View File

@@ -45,7 +45,13 @@ class BootstrapSetupForm_dump(BootstrapSetupForm):
exclude = ('fixture',)
class BootstrapUploadForm(forms.Form):
class BootstrapFileImportForm(forms.Form):
file = forms.FileField(
label=_(u'Bootstrap setup file'),
)
class BootstrapURLImportForm(forms.Form):
url = forms.URLField(
label=_(u'Bootstrap setup URL'),
)

View File

@@ -17,5 +17,6 @@ link_bootstrap_setup_view = {'text': _(u'details'), 'view': 'bootstrap_setup_vie
link_bootstrap_setup_execute = {'text': _(u'execute'), 'view': 'bootstrap_setup_execute', 'args': 'object.pk', 'famfam': 'lightning_go', 'permissions': [PERMISSION_BOOTSTRAP_EXECUTE]}
link_bootstrap_setup_dump = {'text': _(u'dump current setup'), 'view': 'bootstrap_setup_dump', 'famfam': 'arrow_down', 'permissions': [PERMISSION_BOOTSTRAP_DUMP]}
link_bootstrap_setup_export = {'text': _(u'export'), 'view': 'bootstrap_setup_export', 'args': 'object.pk', 'famfam': 'disk', 'permissions': [PERMISSION_BOOTSTRAP_EXPORT]}
link_bootstrap_setup_import = {'text': _(u'import'), 'view': 'bootstrap_setup_import', 'famfam': 'folder', 'permissions': [PERMISSION_BOOTSTRAP_IMPORT]}
link_bootstrap_setup_import_from_file = {'text': _(u'import from file'), 'view': 'bootstrap_setup_import_from_file', 'famfam': 'folder', 'permissions': [PERMISSION_BOOTSTRAP_IMPORT]}
link_bootstrap_setup_import_from_url = {'text': _(u'import from URL'), 'view': 'bootstrap_setup_import_from_url', 'famfam': 'world', 'permissions': [PERMISSION_BOOTSTRAP_IMPORT]}
link_erase_database = {'text': _(u'erase database'), 'view': 'erase_database_view', 'icon': 'radioactivity.png', 'permissions': [PERMISSION_NUKE_DATABASE]}

View File

@@ -2,11 +2,14 @@ from __future__ import absolute_import
import logging
import requests
from django.db import models
from django.core import serializers
from .classes import BootstrapModel, FixtureMetadata
from .literals import FIXTURE_TYPE_FIXTURE_PROCESS, FIXTURE_TYPE_EMPTY_FIXTURE
from .literals import (FIXTURE_TYPE_FIXTURE_PROCESS, FIXTURE_TYPE_EMPTY_FIXTURE,
DEFAULT_REPOSITORY)
logger = logging.getLogger(__name__)
@@ -26,10 +29,18 @@ class BootstrapSetupManager(models.Manager):
result.append(model_fixture)
return FIXTURE_TYPE_FIXTURE_PROCESS[serialization_format]('\n'.join(result))
def import_setup(self, files):
file_data = files.read()
def import_setup(self, file_data):
metadata = FixtureMetadata.read_all(file_data)
instance = self.model(fixture=file_data, **metadata)
instance.save(update_metadata=False)
def import_from_file(self, files):
file_data = files.read()
self.import_setup(file_data)
def import_from_url(self, url):
response = requests.get(url)
if response.status_code == requests.codes.ok:
self.import_setup(response.text)
else:
response.raise_for_status()

View File

@@ -8,7 +8,7 @@ from main import __version__
from .links import (link_bootstrap_setup_create, link_bootstrap_setup_execute,
link_bootstrap_setup_list, link_bootstrap_setup_edit, link_bootstrap_setup_delete,
link_bootstrap_setup_view, link_bootstrap_setup_dump, link_bootstrap_setup_export,
link_bootstrap_setup_import)
link_bootstrap_setup_import_from_url, link_bootstrap_setup_import_from_file)
from .models import BootstrapSetup
from .classes import FixtureMetadata
from .literals import (FIXTURE_METADATA_CREATED, FIXTURE_METADATA_EDITED,
@@ -16,8 +16,8 @@ from .literals import (FIXTURE_METADATA_CREATED, FIXTURE_METADATA_EDITED,
FIXTURE_METADATA_DESCRIPTION, DATETIME_STRING_FORMAT, FIXTURE_METADATA_SLUG)
register_links([BootstrapSetup], [link_bootstrap_setup_view, link_bootstrap_setup_edit, link_bootstrap_setup_delete, link_bootstrap_setup_execute, link_bootstrap_setup_export])
register_links([BootstrapSetup], [link_bootstrap_setup_list, link_bootstrap_setup_create, link_bootstrap_setup_dump, link_bootstrap_setup_import], menu_name='secondary_menu')
register_links(['bootstrap_setup_list', 'bootstrap_setup_create', 'bootstrap_setup_dump', 'bootstrap_setup_import'], [link_bootstrap_setup_list, link_bootstrap_setup_create, link_bootstrap_setup_dump, link_bootstrap_setup_import], menu_name='secondary_menu')
register_links([BootstrapSetup], [link_bootstrap_setup_list, link_bootstrap_setup_create, link_bootstrap_setup_dump, link_bootstrap_setup_import_from_file, link_bootstrap_setup_import_from_url], menu_name='secondary_menu')
register_links(['bootstrap_setup_list', 'bootstrap_setup_create', 'bootstrap_setup_dump', 'bootstrap_setup_import_from_file', 'bootstrap_setup_import_from_url'], [link_bootstrap_setup_list, link_bootstrap_setup_create, link_bootstrap_setup_dump, link_bootstrap_setup_import_from_file, link_bootstrap_setup_import_from_url], menu_name='secondary_menu')
FixtureMetadata(FIXTURE_METADATA_CREATED, generate_function=lambda fixture_instance: fixture_instance.created.strftime(DATETIME_STRING_FORMAT), read_function=lambda x: datetime.datetime.strptime(x, DATETIME_STRING_FORMAT), property_name='created')
FixtureMetadata(FIXTURE_METADATA_EDITED, generate_function=lambda fixture_instance: datetime.datetime.now().strftime(DATETIME_STRING_FORMAT))

View File

@@ -9,6 +9,7 @@ urlpatterns = patterns('bootstrap.views',
url(r'^setup/(?P<bootstrap_setup_pk>\d+)/execute/$', 'bootstrap_setup_execute', (), 'bootstrap_setup_execute'),
url(r'^setup/(?P<bootstrap_setup_pk>\d+)/export/$', 'bootstrap_setup_export', (), 'bootstrap_setup_export'),
url(r'^setup/dump/$', 'bootstrap_setup_dump', (), 'bootstrap_setup_dump'),
url(r'^setup/import/$', 'bootstrap_setup_import', (), 'bootstrap_setup_import'),
url(r'^setup/import/file/$', 'bootstrap_setup_import_from_file', (), 'bootstrap_setup_import_from_file'),
url(r'^setup/import/url/$', 'bootstrap_setup_import_from_url', (), 'bootstrap_setup_import_from_url'),
url(r'^nuke/$', 'erase_database_view', (), 'erase_database_view'),
)

View File

@@ -19,7 +19,7 @@ from .permissions import (PERMISSION_BOOTSTRAP_VIEW, PERMISSION_BOOTSTRAP_CREATE
PERMISSION_BOOTSTRAP_EXECUTE, PERMISSION_NUKE_DATABASE, PERMISSION_BOOTSTRAP_DUMP,
PERMISSION_BOOTSTRAP_EXPORT, PERMISSION_BOOTSTRAP_IMPORT)
from .forms import (BootstrapSetupForm, BootstrapSetupForm_view, BootstrapSetupForm_dump,
BootstrapSetupForm_edit, BootstrapUploadForm)
BootstrapSetupForm_edit, BootstrapFileImportForm, BootstrapURLImportForm)
from .exceptions import ExistingData
@@ -227,27 +227,52 @@ def bootstrap_setup_export(request, bootstrap_setup_pk):
)
def bootstrap_setup_import(request):
def bootstrap_setup_import_from_file(request):
Permission.objects.check_permissions(request.user, [PERMISSION_BOOTSTRAP_IMPORT])
previous = request.POST.get('previous', request.GET.get('previous', request.META.get('HTTP_REFERER', '/')))
if request.method == 'POST':
form = BootstrapUploadForm(request.POST, request.FILES)
form = BootstrapFileImportForm(request.POST, request.FILES)
if form.is_valid():
try:
BootstrapSetup.objects.import_setup(request.FILES['file'])
BootstrapSetup.objects.import_from_file(request.FILES['file'])
messages.success(request, _(u'Bootstrap setup imported successfully.'))
return HttpResponseRedirect(reverse('bootstrap_setup_list'))
except Exception as exception:
messages.error(request, exception)
return HttpResponseRedirect(previous)
else:
form = BootstrapUploadForm()
form = BootstrapFileImportForm()
return render_to_response('generic_form.html', {
'title': _(u'Import bootstrap setup'),
'title': _(u'Import bootstrap setup from file'),
'form_icon': 'folder.png',
'form': form,
'previous': previous,
}, context_instance=RequestContext(request))
def bootstrap_setup_import_from_url(request):
Permission.objects.check_permissions(request.user, [PERMISSION_BOOTSTRAP_IMPORT])
previous = request.POST.get('previous', request.GET.get('previous', request.META.get('HTTP_REFERER', '/')))
if request.method == 'POST':
form = BootstrapURLImportForm(request.POST, request.FILES)
if form.is_valid():
try:
BootstrapSetup.objects.import_from_url(form.cleaned_data['url'])
messages.success(request, _(u'Bootstrap setup imported successfully.'))
return HttpResponseRedirect(reverse('bootstrap_setup_list'))
except Exception as exception:
messages.error(request, exception)
return HttpResponseRedirect(previous)
else:
form = BootstrapURLImportForm()
return render_to_response('generic_form.html', {
'title': _(u'Import bootstrap setup from URL'),
'form_icon': 'folder.png',
'form': form,
'previous': previous,