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.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():

View File

@@ -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

View File

@@ -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'

View File

@@ -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)

View File

@@ -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
) )

View File

@@ -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)