Prepend a magic number to bootstrap setup to identify them as valid bootstrap setups
This commit is contained in:
@@ -7,9 +7,9 @@ from django.db import models
|
|||||||
from django.core import serializers
|
from django.core import serializers
|
||||||
from django.utils.datastructures import SortedDict
|
from django.utils.datastructures import SortedDict
|
||||||
|
|
||||||
from .exceptions import ExistingData
|
from .exceptions import ExistingData, NotABootstrapSetup
|
||||||
from .literals import (FIXTURE_TYPE_PK_NULLIFIER, FIXTURE_TYPE_MODEL_PROCESS,
|
from .literals import (FIXTURE_TYPE_PK_NULLIFIER, FIXTURE_TYPE_MODEL_PROCESS,
|
||||||
FIXTURE_METADATA_REMARK_CHARACTER)
|
FIXTURE_METADATA_REMARK_CHARACTER, BOOTSTRAP_SETUP_MAGIC_NUMBER)
|
||||||
from .utils import toposort2
|
from .utils import toposort2
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
@@ -38,6 +38,15 @@ class BootstrapModel(object):
|
|||||||
"""
|
"""
|
||||||
_registry = SortedDict()
|
_registry = SortedDict()
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def get_magic_number(cls):
|
||||||
|
return '%s %s' % (FIXTURE_METADATA_REMARK_CHARACTER, BOOTSTRAP_SETUP_MAGIC_NUMBER)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def check_magic_number(cls, data):
|
||||||
|
if not data.startswith(cls.get_magic_number()):
|
||||||
|
raise NotABootstrapSetup
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def check_for_data(cls):
|
def check_for_data(cls):
|
||||||
for model in cls.get_all():
|
for model in cls.get_all():
|
||||||
|
|||||||
@@ -8,3 +8,11 @@ class ExistingData(Exception):
|
|||||||
bootstrap's fixture.
|
bootstrap's fixture.
|
||||||
"""
|
"""
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class NotABootstrapSetup(Exception):
|
||||||
|
"""
|
||||||
|
Raised when an attempting to import a bootstrap setup without a proper
|
||||||
|
magic number metadata
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|||||||
@@ -74,3 +74,5 @@ FIXTURE_METADATA_NAME = 'name'
|
|||||||
FIXTURE_METADATA_SLUG = 'slug'
|
FIXTURE_METADATA_SLUG = 'slug'
|
||||||
FIXTURE_METADATA_DESCRIPTION = 'description'
|
FIXTURE_METADATA_DESCRIPTION = 'description'
|
||||||
BOOTSTRAP_EXTENSION = 'txt'
|
BOOTSTRAP_EXTENSION = 'txt'
|
||||||
|
|
||||||
|
BOOTSTRAP_SETUP_MAGIC_NUMBER = 'bootstrap setup'
|
||||||
|
|||||||
@@ -8,8 +8,7 @@ from django.db import models
|
|||||||
from django.core import serializers
|
from django.core import serializers
|
||||||
|
|
||||||
from .classes import BootstrapModel, FixtureMetadata
|
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__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
@@ -30,6 +29,7 @@ class BootstrapSetupManager(models.Manager):
|
|||||||
return FIXTURE_TYPE_FIXTURE_PROCESS[serialization_format]('\n'.join(result))
|
return FIXTURE_TYPE_FIXTURE_PROCESS[serialization_format]('\n'.join(result))
|
||||||
|
|
||||||
def import_setup(self, file_data):
|
def import_setup(self, file_data):
|
||||||
|
BootstrapModel.check_magic_number(file_data)
|
||||||
metadata = FixtureMetadata.read_all(file_data)
|
metadata = FixtureMetadata.read_all(file_data)
|
||||||
instance = self.model(fixture=file_data, **metadata)
|
instance = self.model(fixture=file_data, **metadata)
|
||||||
instance.save(update_metadata=False)
|
instance.save(update_metadata=False)
|
||||||
|
|||||||
@@ -91,7 +91,8 @@ class BootstrapSetup(models.Model):
|
|||||||
def save(self, *args, **kwargs):
|
def save(self, *args, **kwargs):
|
||||||
update_metadata = kwargs.pop('update_metadata', True)
|
update_metadata = kwargs.pop('update_metadata', True)
|
||||||
if update_metadata:
|
if update_metadata:
|
||||||
self.fixture = '%s\n%s' % (
|
self.fixture = '%s\n%s\n%s' % (
|
||||||
|
BootstrapModel.get_magic_number(),
|
||||||
self.get_metadata_string(),
|
self.get_metadata_string(),
|
||||||
self.cleaned_fixture
|
self.cleaned_fixture
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ from .permissions import (PERMISSION_BOOTSTRAP_VIEW, PERMISSION_BOOTSTRAP_CREATE
|
|||||||
PERMISSION_BOOTSTRAP_EXPORT, PERMISSION_BOOTSTRAP_IMPORT)
|
PERMISSION_BOOTSTRAP_EXPORT, PERMISSION_BOOTSTRAP_IMPORT)
|
||||||
from .forms import (BootstrapSetupForm, BootstrapSetupForm_view, BootstrapSetupForm_dump,
|
from .forms import (BootstrapSetupForm, BootstrapSetupForm_view, BootstrapSetupForm_dump,
|
||||||
BootstrapSetupForm_edit, BootstrapFileImportForm, BootstrapURLImportForm)
|
BootstrapSetupForm_edit, BootstrapFileImportForm, BootstrapURLImportForm)
|
||||||
from .exceptions import ExistingData
|
from .exceptions import ExistingData, NotABootstrapSetup
|
||||||
|
|
||||||
|
|
||||||
def bootstrap_setup_list(request):
|
def bootstrap_setup_list(request):
|
||||||
@@ -239,6 +239,8 @@ def bootstrap_setup_import_from_file(request):
|
|||||||
BootstrapSetup.objects.import_from_file(request.FILES['file'])
|
BootstrapSetup.objects.import_from_file(request.FILES['file'])
|
||||||
messages.success(request, _(u'Bootstrap setup imported successfully.'))
|
messages.success(request, _(u'Bootstrap setup imported successfully.'))
|
||||||
return HttpResponseRedirect(reverse('bootstrap_setup_list'))
|
return HttpResponseRedirect(reverse('bootstrap_setup_list'))
|
||||||
|
except NotABootstrapSetup:
|
||||||
|
messages.error(request, _(u'File is not a bootstrap setup.'))
|
||||||
except Exception as exception:
|
except Exception as exception:
|
||||||
messages.error(request, exception)
|
messages.error(request, exception)
|
||||||
return HttpResponseRedirect(previous)
|
return HttpResponseRedirect(previous)
|
||||||
@@ -265,6 +267,8 @@ def bootstrap_setup_import_from_url(request):
|
|||||||
BootstrapSetup.objects.import_from_url(form.cleaned_data['url'])
|
BootstrapSetup.objects.import_from_url(form.cleaned_data['url'])
|
||||||
messages.success(request, _(u'Bootstrap setup imported successfully.'))
|
messages.success(request, _(u'Bootstrap setup imported successfully.'))
|
||||||
return HttpResponseRedirect(reverse('bootstrap_setup_list'))
|
return HttpResponseRedirect(reverse('bootstrap_setup_list'))
|
||||||
|
except NotABootstrapSetup:
|
||||||
|
messages.error(request, _(u'Data from URL is not a bootstrap setup.'))
|
||||||
except Exception as exception:
|
except Exception as exception:
|
||||||
messages.error(request, exception)
|
messages.error(request, exception)
|
||||||
return HttpResponseRedirect(previous)
|
return HttpResponseRedirect(previous)
|
||||||
|
|||||||
Reference in New Issue
Block a user