Add support for import bootstrap setups from URLs
This commit is contained in:
@@ -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'),
|
||||
)
|
||||
|
||||
@@ -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]}
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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'),
|
||||
)
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user