Changeset 1338:e3a2b003c799
- Timestamp:
- 01/11/10 00:42:36 (2 years ago)
- 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. - Location:
- zine
- Files:
-
- 6 edited
-
application.py (modified) (4 diffs)
-
application.py (modified) (1 diff)
-
database.py (modified) (1 diff)
-
database.py (modified) (3 diffs)
-
models.py (modified) (3 diffs)
-
models.py (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
zine/application.py
r1287 r1338 18 18 from inspect import getdoc 19 19 from traceback import format_exception 20 from pprint import pprint21 20 from StringIO import StringIO 22 21 … … 636 635 self.__class__.__name__) 637 636 self.instance_folder = path.abspath(instance_folder) 637 self.upgrade_lockfile = path.join(instance_folder, 638 '.upgrade_in_progress') 638 639 639 640 # create the event manager, this is the first thing we have to … … 832 833 self.list_parsers() 833 834 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 834 841 self.initialized = True 835 842 836 843 #! called after the application and all plugins are initialized 837 844 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() 838 923 839 924 @property … … 1211 1296 from zine.notifications import send_notification_template, ZINE_ERROR 1212 1297 request_buffer = StringIO() 1213 pprint(request.__dict__, request_buffer)1214 1298 request_buffer.seek(0) 1215 1299 send_notification_template( -
zine/application.py
r1336 r1338 980 980 @setuponly 981 981 def add_importer(self, importer): 982 """Register an importer. For more information sabout importers982 """Register an importer. For more information about importers 983 983 see the :mod:`zine.importers`. 984 984 """ -
zine/database.py
r1285 r1338 259 259 metadata = db.MetaData() 260 260 261 schema_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 ) 261 266 262 267 users = db.Table('users', metadata, -
zine/database.py
r1327 r1338 4 4 ~~~~~~~~~~~~~ 5 5 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. 12 11 13 12 :copyright: (c) 2010 by the Zine Team, see AUTHORS for more details. … … 207 206 208 207 208 def 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 209 220 # configure a declarative base. This is unused in the code but makes it easier 210 221 # for plugins to work with the database. 211 222 class ModelBase(object): 212 223 """Internal baseclass for `Model`.""" 213 Model = declarative_base(name='Model', cls=ModelBase, mapper= session.mapper)224 Model = declarative_base(name='Model', cls=ModelBase, mapper=mapper) 214 225 ModelBase.query = session.query_property(Query) 215 226 … … 237 248 db.session = session 238 249 db.ZEMLParserData = ZEMLParserData 239 db.mapper = session.mapper250 db.mapper = mapper 240 251 db.association_proxy = association_proxy 241 252 db.attribute_loaded = attribute_loaded -
zine/models.py
r1284 r1338 18 18 post_categories, post_tags, tags, comments, groups, group_users, \ 19 19 privileges, user_privileges, group_privileges, texts, \ 20 notification_subscriptions, db20 notification_subscriptions, schema_versions, db 21 21 from zine.utils import zeml 22 22 from zine.utils.text import gen_slug, gen_timestamped_slug, build_tag_uri, \ … … 177 177 def authors(self): 178 178 return self.filter_by(is_author=True) 179 180 181 class 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 179 190 180 191 … … 1265 1276 1266 1277 # connect the tables. 1278 db.mapper(SchemaVersion, schema_versions) 1267 1279 db.mapper(User, users, properties={ 1268 1280 'id': users.c.user_id, -
zine/models.py
r1327 r1338 779 779 uid = build_tag_uri(app, self.pub_date, content_type, self.slug) 780 780 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() 781 790 782 791
Note: See TracChangeset
for help on using the changeset viewer.