From 6966134c1de6a8777df0bc30336df88e583e737c Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Mon, 8 Oct 2012 02:17:48 -0400 Subject: [PATCH] Add support for automatic bootstrap setup fixture metadata creation --- apps/bootstrap/classes.py | 27 +++++++++++++++++++++++++++ apps/bootstrap/literals.py | 7 +++++++ apps/bootstrap/managers.py | 14 +++++++++++--- apps/bootstrap/post_init.py | 12 ++++++++++++ apps/bootstrap/views.py | 2 +- 5 files changed, 58 insertions(+), 4 deletions(-) diff --git a/apps/bootstrap/classes.py b/apps/bootstrap/classes.py index b03fe52036..a520484845 100644 --- a/apps/bootstrap/classes.py +++ b/apps/bootstrap/classes.py @@ -73,3 +73,30 @@ class BootstrapModel(object): # Do any clean up required on the fixture result = FIXTURE_TYPE_MODEL_PROCESS[serialization_format](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)] diff --git a/apps/bootstrap/literals.py b/apps/bootstrap/literals.py index cf302be70d..825d8fdb03 100644 --- a/apps/bootstrap/literals.py +++ b/apps/bootstrap/literals.py @@ -1,6 +1,7 @@ from __future__ import absolute_import import re + try: import yaml except ImportError: @@ -61,3 +62,9 @@ COMMAND_LOADDATA = 'loaddata' if YAML_AVAILABLE: FIXTURE_TYPES_CHOICES += (FIXTURE_TYPE_YAML, _(u'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' diff --git a/apps/bootstrap/managers.py b/apps/bootstrap/managers.py index d046266cfd..fcf97b2153 100644 --- a/apps/bootstrap/managers.py +++ b/apps/bootstrap/managers.py @@ -5,7 +5,7 @@ import logging from django.db import models 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 logger = logging.getLogger(__name__) @@ -19,11 +19,19 @@ class BootstrapSetupManager(models.Manager): """ 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 = [] for bootstrap_model in BootstrapModel.get_all(): model_fixture = bootstrap_model.dump(serialization_format) # Only add non empty model fixtures if not FIXTURE_TYPE_EMPTY_FIXTURE[serialization_format](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)) + ) diff --git a/apps/bootstrap/post_init.py b/apps/bootstrap/post_init.py index 7894667e88..f29a68d06f 100644 --- a/apps/bootstrap/post_init.py +++ b/apps/bootstrap/post_init.py @@ -1,12 +1,24 @@ from __future__ import absolute_import +from time import gmtime, strftime + from navigation.api import register_links +from main import __version__ 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_view, link_bootstrap_setup_dump) 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_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) diff --git a/apps/bootstrap/views.py b/apps/bootstrap/views.py index 74d19c3c38..ef234d4b5f 100644 --- a/apps/bootstrap/views.py +++ b/apps/bootstrap/views.py @@ -186,7 +186,7 @@ def bootstrap_setup_dump(request): if form.is_valid(): bootstrap = form.save(commit=False) 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: messages.error(request, _(u'Error dumping bootstrap setup; %s') % exception) raise