Prepend a magic number to bootstrap setup to identify them as valid bootstrap setups

This commit is contained in:
Roberto Rosario
2012-10-16 02:44:01 -04:00
parent b076c73d2b
commit 1de90cfaa9
6 changed files with 30 additions and 6 deletions

View File

@@ -7,9 +7,9 @@ from django.db import models
from django.core import serializers
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,
FIXTURE_METADATA_REMARK_CHARACTER)
FIXTURE_METADATA_REMARK_CHARACTER, BOOTSTRAP_SETUP_MAGIC_NUMBER)
from .utils import toposort2
logger = logging.getLogger(__name__)
@@ -38,6 +38,15 @@ class BootstrapModel(object):
"""
_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
def check_for_data(cls):
for model in cls.get_all():

View File

@@ -8,3 +8,11 @@ class ExistingData(Exception):
bootstrap's fixture.
"""
pass
class NotABootstrapSetup(Exception):
"""
Raised when an attempting to import a bootstrap setup without a proper
magic number metadata
"""
pass

View File

@@ -74,3 +74,5 @@ FIXTURE_METADATA_NAME = 'name'
FIXTURE_METADATA_SLUG = 'slug'
FIXTURE_METADATA_DESCRIPTION = 'description'
BOOTSTRAP_EXTENSION = 'txt'
BOOTSTRAP_SETUP_MAGIC_NUMBER = 'bootstrap setup'

View File

@@ -8,8 +8,7 @@ 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,
DEFAULT_REPOSITORY)
from .literals import (FIXTURE_TYPE_FIXTURE_PROCESS, FIXTURE_TYPE_EMPTY_FIXTURE)
logger = logging.getLogger(__name__)
@@ -30,6 +29,7 @@ class BootstrapSetupManager(models.Manager):
return FIXTURE_TYPE_FIXTURE_PROCESS[serialization_format]('\n'.join(result))
def import_setup(self, file_data):
BootstrapModel.check_magic_number(file_data)
metadata = FixtureMetadata.read_all(file_data)
instance = self.model(fixture=file_data, **metadata)
instance.save(update_metadata=False)

View File

@@ -91,7 +91,8 @@ class BootstrapSetup(models.Model):
def save(self, *args, **kwargs):
update_metadata = kwargs.pop('update_metadata', True)
if update_metadata:
self.fixture = '%s\n%s' % (
self.fixture = '%s\n%s\n%s' % (
BootstrapModel.get_magic_number(),
self.get_metadata_string(),
self.cleaned_fixture
)

View File

@@ -20,7 +20,7 @@ from .permissions import (PERMISSION_BOOTSTRAP_VIEW, PERMISSION_BOOTSTRAP_CREATE
PERMISSION_BOOTSTRAP_EXPORT, PERMISSION_BOOTSTRAP_IMPORT)
from .forms import (BootstrapSetupForm, BootstrapSetupForm_view, BootstrapSetupForm_dump,
BootstrapSetupForm_edit, BootstrapFileImportForm, BootstrapURLImportForm)
from .exceptions import ExistingData
from .exceptions import ExistingData, NotABootstrapSetup
def bootstrap_setup_list(request):
@@ -239,6 +239,8 @@ def bootstrap_setup_import_from_file(request):
BootstrapSetup.objects.import_from_file(request.FILES['file'])
messages.success(request, _(u'Bootstrap setup imported successfully.'))
return HttpResponseRedirect(reverse('bootstrap_setup_list'))
except NotABootstrapSetup:
messages.error(request, _(u'File is not a bootstrap setup.'))
except Exception as exception:
messages.error(request, exception)
return HttpResponseRedirect(previous)
@@ -265,6 +267,8 @@ def bootstrap_setup_import_from_url(request):
BootstrapSetup.objects.import_from_url(form.cleaned_data['url'])
messages.success(request, _(u'Bootstrap setup imported successfully.'))
return HttpResponseRedirect(reverse('bootstrap_setup_list'))
except NotABootstrapSetup:
messages.error(request, _(u'Data from URL is not a bootstrap setup.'))
except Exception as exception:
messages.error(request, exception)
return HttpResponseRedirect(previous)