Coaster for Flask
Coaster contains functions and db models for recurring patterns in Flask apps. Documentation at http://coaster.readthedocs.org/
- NameTitle namedtuple and support in LabeledEnum for (value, name, title)
- Provide UglifyJS minifier to webassets via the UglipyJS wrapper
- views.get_next_url now considers subdomains as non-external.
- sqlalchemy.BaseMixin now provides a new query class with one_or_none
- Coaster now requires all dependencies used by submodules. They are no longer optional.
- LabeledEnums now have a .get method to emulate dictionaries.
- Moved utility functions into coaster.utils.
- Bugfix: make get_email_domain somewhat more reliable.
- Switched to using coaster.db in tests.
- New: MarkdownColumn composite column for Markdown content.
- Changed: JsonDict column will use PostgreSQL’s native JSON type if the server is PostgreSQL >= 9.2.
- TimestampMixin now uses datetime.utcnow instead of func.now because the now() function in PostgreSQL returns local time with timezone, not UTC time, and discards the timezone component if the column doesn’t store them. This made timestamps local, not in UTC.
- Database tests are now run against both SQLite3 and PostgreSQL.
- Bugfix: PermissionMixin was mutating inherited permissions.
- Bugfix: render_with no longer attempts to render pre-rendered responses.
- utils.make_name now takes caller-specified counter numbers.
- sqlalchemy.BaseNameMixin and BaseScopedNameMixin.make_name now take a reserved names list.
- New: utils.nullint, nullstr and nullunicode for returning int(v), str(v) and unicode(v) if v isn’t false.
- short_title method in BaseScopedNameMixin.
- assets.require now raises AssetNotFound on missing assets.
- New: coaster.db.db is an instance of Flask-SQLAlchemy.
- Bugfix: Support single-char usernames.
- New feature: Labeled enumerations.
- Enhancement: load_models allows choice of permissions and takes additional permissions.
- Rewrote requestargs view decorator for efficiency and ease of use.
- New render_with view decorator.
- New gfm module for GitHub Flavoured Markdown.
- load_models now supports “redirect” models.
- Logging now looks for MAIL_DEFAULT_SENDER before DEFAULT_MAIL_SENDER.
- Compatibility with Flask 0.10 for SandboxedFlask.
- Bugfix: PermissionMixin.permissions() now checks if parent is not None.
- New sorted_timezones function.
- New module for asset management, with testcases and documentation.
- coaster.logging.configure is now init_app in keeping with convention.
- Updated documentation.
- New SQLAlchemy column types and helpers.
- Use SQL expressions to set url_id in scoped id classes.
- Don’t use declared_attr for the id, created_at and updated_at columns.
- Rename newid to buid but retain old name for compatibility.
- New requestargs view wrapper to make working with request.args easier.
- New SandboxedFlask in coaster.app that uses Jinja’s SandboxedEnvironment.
- load_models now caches data to flask.g
- SQLAlchemy models now use declared_attr for all columns to work around a column duplication bug with joined table inheritance in SQLAlchemy < 0.8.
- Misc fixes.
- get_next_url now takes a default parameter. Pass default=None to return None if no suitable next URL can be found
- get_next_url no longer looks in the session by default. Pass session=True to look in the session. This was added since popping next from session modifies the session.
- load_models accepts ‘g.<name>’ notation for parameters to indicate that the parameter should be available as g.<name>. The view function will get called with just <name> as usual.
- If the view requires permissions, load_models caches available permissions as g.permissions.
- coaster.views.get_next_url now looks in the session for the next URL.
- New coaster.app.init_app function moves away from passing configuration status in environment variables.
- SQLAlchemy models now have a permissions method that load_models looks up.
- Added logging module
- First version