Zine

open source content publishing system


Changeset 1338:e3a2b003c799


Ignore:
Timestamp:
01/11/10 00:42:36 (2 years ago)
Author:
Georg Brandl <georg@…>
Branch:
default
Parents:
1337:d906b50d398e (diff), 1290:bc8054777437 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

merge with trunk

Location:
zine
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • zine/application.py

    r1287 r1338  
    1818from inspect import getdoc 
    1919from traceback import format_exception 
    20 from pprint import pprint 
    2120from StringIO import StringIO 
    2221 
     
    636635                            self.__class__.__name__) 
    637636        self.instance_folder = path.abspath(instance_folder) 
     637        self.upgrade_lockfile = path.join(instance_folder, 
     638                                          '.upgrade_in_progress') 
    638639 
    639640        # create the event manager, this is the first thing we have to 
     
    832833            self.list_parsers() 
    833834 
     835        # register Zine's upgrade repository 
     836        from zine.upgrades import REPOSITORY_PATH 
     837        self.register_upgrade_repository('Zine', REPOSITORY_PATH) 
     838        # allow plugins to register their upgrade repositories 
     839        emit_event('register-upgrade-repository') 
     840 
    834841        self.initialized = True 
    835842 
    836843        #! called after the application and all plugins are initialized 
    837844        emit_event('application-setup-done') 
     845 
     846    def register_upgrade_repository(self, repo_id, repo_path): 
     847        """This function is responsible for adding upgrade repositories to the 
     848        database. 
     849 
     850        repo_id can be either a string or a Plugin instance, in which case the 
     851        plugin name is used as the repository ID. 
     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        repo_path = path.abspath(repo_path) 
     859        try: 
     860            sv = SchemaVersion.query.filter_by(repository_id=repo_id).first() 
     861            if not sv: 
     862                # this always starts with version 0 
     863                db.session.add(SchemaVersion(Repository(repo_path, repo_id))) 
     864                db.session.commit() 
     865        except (SQLAlchemyError, AttributeError): 
     866            # the schema_versions table does not yet exist, let's create it 
     867            db.session.rollback() 
     868            from zine.database import metadata, schema_versions 
     869            metadata.bind = self.database_engine 
     870            if not schema_versions.exists(): 
     871                schema_versions.create(self.database_engine) 
     872            db.session.add(SchemaVersion(Repository(repo_path, repo_id))) 
     873            db.session.commit() 
     874 
     875    def check_if_upgrade_required(self): 
     876        """Check if all registered schema versions are the latest. 
     877 
     878        If an upgrade is required, this will raise 
     879        zine._core.InstanceUpgradeRequired. 
     880        """ 
     881        from zine.models import SchemaVersion 
     882        from zine.upgrades.customisation import Repository 
     883 
     884        to_upgrade = [] 
     885 
     886        for sv in SchemaVersion.query.all(): 
     887            repository = Repository(sv.repository_path, sv.repository_id) 
     888            try: 
     889                self.repository_has_upgrade(repository, sv) 
     890            except _core.InstanceUpgradeRequired: 
     891                to_upgrade.append(sv.repository_id) 
     892 
     893        if to_upgrade: 
     894            # set Zine in maintenance mode 
     895            cfg = self.cfg.edit() 
     896            cfg['maintenance_mode'] = True 
     897            cfg.commit() 
     898            raise _core.InstanceUpgradeRequired(to_upgrade) 
     899 
     900        # we got here, let's check for a bad upgrade lockfile left behind 
     901        if path.isfile(self.upgrade_lockfile): 
     902            remove(self.upgrade_lockfile) 
     903 
     904    def repository_has_upgrade(self, repository, schema_version): 
     905        """Check for available upgrades in one repository.""" 
     906        from zine.models import SchemaVersion 
     907        try: 
     908            if schema_version.version < repository.latest: 
     909                raise _core.InstanceUpgradeRequired() 
     910        except (SQLAlchemyError, AttributeError): 
     911            self.log.error('schema_versions table missing while checking ' 
     912                           'for upgrades?') 
     913            # the schema_versions table does not yet exist, let's create it 
     914            # XXX can this happen at all? 
     915            db.session.rollback() 
     916            from zine.database import metadata, schema_versions 
     917            metadata.bind = self.database_engine 
     918            if not schema_versions.exists(): 
     919                schema_versions.create(self.database_engine) 
     920            db.session.add(SchemaVersion(repository)) 
     921            db.session.commit() 
     922            raise _core.InstanceUpgradeRequired() 
    838923 
    839924    @property 
     
    12111296        from zine.notifications import send_notification_template, ZINE_ERROR 
    12121297        request_buffer = StringIO() 
    1213         pprint(request.__dict__, request_buffer) 
    12141298        request_buffer.seek(0) 
    12151299        send_notification_template( 
  • zine/application.py

    r1336 r1338  
    980980    @setuponly 
    981981    def add_importer(self, importer): 
    982         """Register an importer.  For more informations about importers 
     982        """Register an importer.  For more information about importers 
    983983        see the :mod:`zine.importers`. 
    984984        """ 
  • zine/database.py

    r1285 r1338  
    259259metadata = db.MetaData() 
    260260 
     261schema_versions = db.Table('schema_versions', metadata, 
     262    db.Column('repository_id', db.String(255), primary_key=True), 
     263    db.Column('repository_path', db.Text), 
     264    db.Column('version', db.Integer) 
     265) 
    261266 
    262267users = db.Table('users', metadata, 
  • zine/database.py

    r1327 r1338  
    44    ~~~~~~~~~~~~~ 
    55 
    6     This module is a rather complex layer on top of SQLAlchemy 0.4. 
    7     Basically you will never use the `zine.database` module except you 
    8     are a core developer, but always the high level 
    9     :mod:`~zine.database.db` module which you can import from the 
    10     :mod:`zine.api` module. 
    11  
     6    This module is a rather complex layer on top of SQLAlchemy. 
     7 
     8    Basically you will never use the `zine.database` module except if you 
     9    are a core developer, but always the high level :mod:`~zine.database.db` 
     10    module which you can import from the :mod:`zine.api` module. 
    1211 
    1312    :copyright: (c) 2010 by the Zine Team, see AUTHORS for more details. 
     
    207206 
    208207 
     208def mapper(cls, *args, **kwargs): 
     209    """Attaches a query and auto registers.""" 
     210    if not hasattr(cls, 'query'): 
     211        cls.query = session.query_property(Query) 
     212    old_init = getattr(cls, '__init__', None) 
     213    def register_init(self, *args, **kwargs): 
     214        old_init(self, *args, **kwargs) 
     215        session.add(self) 
     216    cls.__init__ = register_init 
     217    return orm.mapper(cls, *args, **kwargs) 
     218 
     219 
    209220# configure a declarative base.  This is unused in the code but makes it easier 
    210221# for plugins to work with the database. 
    211222class ModelBase(object): 
    212223    """Internal baseclass for `Model`.""" 
    213 Model = declarative_base(name='Model', cls=ModelBase, mapper=session.mapper) 
     224Model = declarative_base(name='Model', cls=ModelBase, mapper=mapper) 
    214225ModelBase.query = session.query_property(Query) 
    215226 
     
    237248db.session = session 
    238249db.ZEMLParserData = ZEMLParserData 
    239 db.mapper = session.mapper 
     250db.mapper = mapper 
    240251db.association_proxy = association_proxy 
    241252db.attribute_loaded = attribute_loaded 
  • zine/models.py

    r1284 r1338  
    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 
     
    12651276 
    12661277# connect the tables. 
     1278db.mapper(SchemaVersion, schema_versions) 
    12671279db.mapper(User, users, properties={ 
    12681280    'id':               users.c.user_id, 
  • zine/models.py

    r1327 r1338  
    779779            uid = build_tag_uri(app, self.pub_date, content_type, self.slug) 
    780780        self.uid = uid 
     781 
     782    @property 
     783    def comments_closed(self): 
     784        """True if commenting is no longer possible.""" 
     785        app = get_application() 
     786        open_for = app.cfg['comments_open_for'] 
     787        if open_for == 0: 
     788            return False 
     789        return self.pub_date + timedelta(days=open_for) < datetime.utcnow() 
    781790 
    782791 
Note: See TracChangeset for help on using the changeset viewer.