Add support for automatic bootstrap setup fixture metadata creation

This commit is contained in:
Roberto Rosario
2012-10-08 02:17:48 -04:00
parent 384d241ab2
commit 6966134c1d
5 changed files with 58 additions and 4 deletions

View File

@@ -73,3 +73,30 @@ class BootstrapModel(object):
# Do any clean up required on the fixture # Do any clean up required on the fixture
result = FIXTURE_TYPE_MODEL_PROCESS[serialization_format](result) result = FIXTURE_TYPE_MODEL_PROCESS[serialization_format](result)
return result return result
class FixtureMetadata(object):
_registry = {}
@classmethod
def get_all(cls):
return cls._registry.values()
@classmethod
def generate_all(cls, fixture_instance):
result = []
for fixture_metadata in cls.get_all():
result.append(fixture_metadata.generate(fixture_instance))
return '\n'.join(result)
def __init__(self, literal, generate_function):
self.literal = literal
self.generate_function = generate_function
self.__class__._registry[id(self)] = self
def generate(self, fixture_instance):
return '# %s: %s' % (self.literal, self.generate_function(fixture_instance))
def read_value(self, fixture_data):
return [line[line.find(self.literal) + len(self.literal) + 2:] for line in fixture_data.splitlines(False) if line.find(self.literal)]

View File

@@ -1,6 +1,7 @@
from __future__ import absolute_import from __future__ import absolute_import
import re import re
try: try:
import yaml import yaml
except ImportError: except ImportError:
@@ -61,3 +62,9 @@ COMMAND_LOADDATA = 'loaddata'
if YAML_AVAILABLE: if YAML_AVAILABLE:
FIXTURE_TYPES_CHOICES += (FIXTURE_TYPE_YAML, _(u'YAML')), FIXTURE_TYPES_CHOICES += (FIXTURE_TYPE_YAML, _(u'YAML')),
FIXTURE_TYPES_CHOICES += (FIXTURE_TYPE_BETTER_YAML, _(u'Better YAML')), FIXTURE_TYPES_CHOICES += (FIXTURE_TYPE_BETTER_YAML, _(u'Better YAML')),
FIXTURE_METADATA_EDITED = 'edited'
FIXTURE_METADATA_MAYAN_VERSION = 'mayan_edms_version'
FIXTURE_METADATA_FORMAT = 'format'
FIXTURE_METADATA_NAME = 'name'
FIXTURE_METADATA_DESCRIPTION = 'description'

View File

@@ -5,7 +5,7 @@ import logging
from django.db import models from django.db import models
from django.core import serializers from django.core import serializers
from .classes import BootstrapModel 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
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -19,11 +19,19 @@ class BootstrapSetupManager(models.Manager):
""" """
pass pass
def dump(self, serialization_format): def dump(self, serialization_format, instance):
metadata_text = []
# Add fixture metadata
metadata_text.append(FixtureMetadata.generate_all(instance))
metadata_text.append('\n')
result = [] result = []
for bootstrap_model in BootstrapModel.get_all(): for bootstrap_model in BootstrapModel.get_all():
model_fixture = bootstrap_model.dump(serialization_format) model_fixture = bootstrap_model.dump(serialization_format)
# Only add non empty model fixtures # Only add non empty model fixtures
if not FIXTURE_TYPE_EMPTY_FIXTURE[serialization_format](model_fixture): if not FIXTURE_TYPE_EMPTY_FIXTURE[serialization_format](model_fixture):
result.append(model_fixture) result.append(model_fixture)
return FIXTURE_TYPE_FIXTURE_PROCESS[serialization_format]('\n'.join(result)) return '%s\n%s' % (
'\n'.join(metadata_text),
FIXTURE_TYPE_FIXTURE_PROCESS[serialization_format]('\n'.join(result))
)

View File

@@ -1,12 +1,24 @@
from __future__ import absolute_import from __future__ import absolute_import
from time import gmtime, strftime
from navigation.api import register_links from navigation.api import register_links
from main import __version__
from .links import (link_bootstrap_setup_create, link_bootstrap_setup_execute, 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_list, link_bootstrap_setup_edit, link_bootstrap_setup_delete,
link_bootstrap_setup_view, link_bootstrap_setup_dump) link_bootstrap_setup_view, link_bootstrap_setup_dump)
from .models import BootstrapSetup from .models import BootstrapSetup
from .classes import FixtureMetadata
from .literals import (FIXTURE_METADATA_EDITED, FIXTURE_METADATA_MAYAN_VERSION,
FIXTURE_METADATA_FORMAT, FIXTURE_METADATA_NAME, FIXTURE_METADATA_DESCRIPTION)
register_links([BootstrapSetup], [link_bootstrap_setup_view, link_bootstrap_setup_edit, link_bootstrap_setup_delete, link_bootstrap_setup_execute]) register_links([BootstrapSetup], [link_bootstrap_setup_view, link_bootstrap_setup_edit, link_bootstrap_setup_delete, link_bootstrap_setup_execute])
register_links([BootstrapSetup], [link_bootstrap_setup_list, link_bootstrap_setup_create, link_bootstrap_setup_dump], menu_name='secondary_menu') register_links([BootstrapSetup], [link_bootstrap_setup_list, link_bootstrap_setup_create, link_bootstrap_setup_dump], menu_name='secondary_menu')
register_links(['bootstrap_setup_list', 'bootstrap_setup_create', 'bootstrap_setup_dump'], [link_bootstrap_setup_list, link_bootstrap_setup_create, link_bootstrap_setup_dump], menu_name='secondary_menu') register_links(['bootstrap_setup_list', 'bootstrap_setup_create', 'bootstrap_setup_dump'], [link_bootstrap_setup_list, link_bootstrap_setup_create, link_bootstrap_setup_dump], menu_name='secondary_menu')
FixtureMetadata(FIXTURE_METADATA_EDITED, generate_function=lambda fixture_instance: strftime("%a, %d %b %Y %H:%M:%S +0000", gmtime()))
FixtureMetadata(FIXTURE_METADATA_MAYAN_VERSION, generate_function=lambda fixture_instance: __version__)
FixtureMetadata(FIXTURE_METADATA_FORMAT, generate_function=lambda fixture_instance: fixture_instance.type)
FixtureMetadata(FIXTURE_METADATA_NAME, generate_function=lambda fixture_instance: fixture_instance.name)
FixtureMetadata(FIXTURE_METADATA_DESCRIPTION, generate_function=lambda fixture_instance: fixture_instance.description)

View File

@@ -186,7 +186,7 @@ def bootstrap_setup_dump(request):
if form.is_valid(): if form.is_valid():
bootstrap = form.save(commit=False) bootstrap = form.save(commit=False)
try: try:
bootstrap.fixture = BootstrapSetup.objects.dump(serialization_format=bootstrap.type) bootstrap.fixture = BootstrapSetup.objects.dump(serialization_format=bootstrap.type, instance=bootstrap)
except Exception as exception: except Exception as exception:
messages.error(request, _(u'Error dumping bootstrap setup; %s') % exception) messages.error(request, _(u'Error dumping bootstrap setup; %s') % exception)
raise raise