diff --git a/apps/bootstrap/classes.py b/apps/bootstrap/classes.py index f40230b017..f8d701a1ef 100644 --- a/apps/bootstrap/classes.py +++ b/apps/bootstrap/classes.py @@ -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(): diff --git a/apps/bootstrap/exceptions.py b/apps/bootstrap/exceptions.py index bb709a7a5f..09698c6397 100644 --- a/apps/bootstrap/exceptions.py +++ b/apps/bootstrap/exceptions.py @@ -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 diff --git a/apps/bootstrap/literals.py b/apps/bootstrap/literals.py index 8c0ca8fe61..250a84db63 100644 --- a/apps/bootstrap/literals.py +++ b/apps/bootstrap/literals.py @@ -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' diff --git a/apps/bootstrap/managers.py b/apps/bootstrap/managers.py index 563fdaf112..ed94be0dd2 100644 --- a/apps/bootstrap/managers.py +++ b/apps/bootstrap/managers.py @@ -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) diff --git a/apps/bootstrap/models.py b/apps/bootstrap/models.py index 3954a05527..990f73da4c 100644 --- a/apps/bootstrap/models.py +++ b/apps/bootstrap/models.py @@ -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 ) diff --git a/apps/bootstrap/views.py b/apps/bootstrap/views.py index 569d16ae41..a6fb813fac 100644 --- a/apps/bootstrap/views.py +++ b/apps/bootstrap/views.py @@ -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)