Zine

open source content publishing system


Changeset 1314:41b85535ff5d


Ignore:
Timestamp:
07/13/09 17:50:37 (3 years ago)
Author:
s0undt3ch
Branch:
default
Message:

Cleaner implementation of database migrations that also supports plugin database migrations. So far only cli upgrades are working. Committing now because we're going to switch to the logging module for the messages.

Files:
10 added
5 edited

Legend:

Unmodified
Added
Removed
  • external-plugins/eric_the_fish/__init__.py

    r1129 r1314  
    5656# here we do the same for the shared files (css, fish images and javascript) 
    5757SHARED_FILES = join(dirname(__file__), 'shared') 
     58 
     59# here we do the same for our database upgrade's repository 
     60UPGRADES_REPO = dirname(__file__) 
    5861 
    5962# and that's just the list of skins we have. 
     
    119122    return {'fortune': choice(FORTUNES)} 
    120123 
     124def register_repository(): 
     125    print 'registering eric repo' 
     126    get_application().register_upgrade_repository('eric_the_fish', UPGRADES_REPO) 
    121127 
    122128def setup(app, plugin): 
    123     """This function is called by Zine in the application initialization 
     129    """This function is called by Zine in the application initialisation 
    124130    phase. Here we connect to the events and register our template paths, 
    125131    url rules, views etc. 
    126132    """ 
     133 
     134    # we need to register eric's database upgrades repository 
     135#    app.connect_event('register-upgrade-repository', register_repository) 
     136    app.register_upgrade_repository(plugin, UPGRADES_REPO) 
    127137 
    128138    # we want our fish to appear in the admin panel, so hook into the 
  • zine/_core.py

    r1259 r1314  
    2727    instance folder. 
    2828    """ 
     29 
     30class InstanceUpgradeRequired(RuntimeError): 
     31    """Zine requires a database upgrade""" 
    2932 
    3033 
     
    6063        try: 
    6164            app.__init__(instance_folder) 
     65            app.upgrade_required 
     66        except InstanceUpgradeRequired: 
     67            from zine.upgrades.webapp import WebUpgrades 
     68            _application = app = WebUpgrades(app) 
    6269        except: 
    6370            # if an exception happened, tear down the application 
     
    9299                    if key not in preserve and not key.startswith('__'): 
    93100                        module.__dict__.pop(key, None) 
    94             elif name.startswith('zine.') and name != 'zine._core': 
     101            elif name.startswith('zine.') and name not in ( 
     102                                'zine._core', 'zine.upgrades', 
     103                                'zine.upgrades.customisation'): 
    95104                # get rid of the module 
    96105                sys.modules.pop(name, None) 
  • zine/application.py

    r1259 r1314  
    638638                            self.__class__.__name__) 
    639639        self.instance_folder = path.abspath(instance_folder) 
     640        self.upgrade_lockfile = path.join(instance_folder, 
     641                                          '.upgrade_in_progress') 
    640642 
    641643        # create the event manager, this is the first thing we have to 
     
    834836            self.list_parsers() 
    835837 
     838        # Register Zine's upgrade repository 
     839        from zine.upgrades import REPOSITORY_PATH 
     840        self.register_upgrade_repository('Zine', REPOSITORY_PATH) 
     841        # Allow plugins to register their upgrade's repositories 
     842        emit_event('register-upgrade-repository') 
     843 
    836844        self.initialized = True 
    837845 
    838846        #! called after the application and all plugins are initialized 
    839847        emit_event('application-setup-done') 
     848 
     849    def register_upgrade_repository(self, repo_id, repo_path): 
     850        """This function is responsible for adding upgrade repositories to the 
     851        database. 
     852        """ 
     853        from zine.models import SchemaVersion 
     854        from zine.pluginsystem import Plugin 
     855        from zine.upgrades.customisation import Repository 
     856        if isinstance(repo_id, Plugin): 
     857            repo_id = repo_id.metadata.get('name') 
     858        Repository(repo_path, repo_id) 
     859        try: 
     860            sv = SchemaVersion.query.filter_by(repository_id=repo_id).first() 
     861            if not sv: 
     862                db.session.add(SchemaVersion(Repository(repo_path, repo_id))) 
     863                db.session.commit() 
     864        except (SQLAlchemyError, AttributeError): 
     865            # The schema_versions table does not yet exist. Let's create it 
     866            db.session.rollback() 
     867            from zine.database import metadata, schema_versions 
     868            metadata.bind = self.database_engine 
     869            if not schema_versions.exists(): 
     870                schema_versions.create(self.database_engine) 
     871            db.session.add(SchemaVersion(Repository(repo_path, repo_id))) 
     872            db.session.commit() 
     873 
     874 
     875    @property 
     876    def upgrade_required(self): 
     877        from zine.models import SchemaVersion 
     878        from zine.upgrades.customisation import Repository 
     879 
     880        for sv in SchemaVersion.query.all(): 
     881            repository = Repository(sv.repository_path, sv.repository_id) 
     882            try: 
     883                self.repository_has_upgrade(repository, sv) 
     884            except _core.InstanceUpgradeRequired: 
     885                # Set Zine in maintenance mode 
     886                cfg = self.cfg.edit() 
     887                cfg['maintenance_mode'] = True 
     888                cfg.commit() 
     889                raise _core.InstanceUpgradeRequired() 
     890 
     891        # We got here, let's check for a bad upgrade lockfile left behind 
     892        if path.isfile(self.upgrade_lockfile): 
     893            remove(self.upgrade_lockfile) 
     894 
     895    def repository_has_upgrade(self, repository, schema_version): 
     896        try: 
     897            print repository.__dict__, schema_version.version, repository.latest 
     898            if schema_version.version < repository.latest: 
     899                raise _core.InstanceUpgradeRequired() 
     900        except (SQLAlchemyError, AttributeError): 
     901            print 'WE EVEN GOT HERE???' 
     902            # The schema_versions table does not yet exist. Let's create it 
     903            db.session.rollback() 
     904            from zine.database import metadata, schema_versions 
     905            metadata.bind = self.database_engine 
     906            if not schema_versions.exists(): 
     907                schema_versions.create(self.database_engine) 
     908            db.session.add(SchemaVersion(Repository(repo_path))) 
     909            db.session.commit() 
     910            raise _core.InstanceUpgradeRequired() 
    840911 
    841912    @property 
  • zine/database.py

    r1081 r1314  
    251251metadata = db.MetaData() 
    252252 
     253schema_versions = db.Table('schema_versions', metadata, 
     254    db.Column('repository_id', db.String(255), primary_key=True), 
     255    db.Column('repository_path', db.Text), 
     256    db.Column('version', db.Integer) 
     257) 
    253258 
    254259users = db.Table('users', metadata, 
  • zine/models.py

    r1221 r1314  
    1818     post_categories, post_tags, tags, comments, groups, group_users, \ 
    1919     privileges, user_privileges, group_privileges, texts, \ 
    20      notification_subscriptions, db 
     20     notification_subscriptions, schema_versions, db 
    2121from zine.utils import zeml 
    2222from zine.utils.text import gen_slug, gen_timestamped_slug, build_tag_uri, \ 
     
    177177    def authors(self): 
    178178        return self.filter_by(is_author=True) 
     179 
     180 
     181class SchemaVersion(object): 
     182    """Represents a database schema version.""" 
     183 
     184    query = db.query_property(db.Query) 
     185 
     186    def __init__(self, repos, version=0): 
     187        self.repository_id = repos.config.get('repository_id') 
     188        self.repository_path = repos.path 
     189        self.version = version 
    179190 
    180191 
     
    12561267 
    12571268# connect the tables. 
     1269db.mapper(SchemaVersion, schema_versions) 
    12581270db.mapper(User, users, properties={ 
    12591271    'id':               users.c.user_id, 
Note: See TracChangeset for help on using the changeset viewer.