Skip to content
This repository has been archived by the owner on Jul 9, 2020. It is now read-only.

Commit

Permalink
Merge branch 'release/0.3.8'
Browse files Browse the repository at this point in the history
  • Loading branch information
klen committed Aug 24, 2012
2 parents b147ab2 + fa0b855 commit b4f7a6d
Show file tree
Hide file tree
Showing 11 changed files with 69 additions and 15 deletions.
4 changes: 3 additions & 1 deletion .travis.yml
Expand Up @@ -15,4 +15,6 @@ install:
- pip install -IM pylama
- pip install -IM -r requirements.txt

script: make test
script:
- make audit
- make test
5 changes: 5 additions & 0 deletions Changelog
@@ -1,3 +1,8 @@
2012-08-24 klen

* Add 'before_new', 'before_delete' model methods support
* Add FlaskMail log handler for production

2012-08-19 klen

* Update alembic, flask-cache, flask-principal
Expand Down
2 changes: 1 addition & 1 deletion Makefile
Expand Up @@ -31,7 +31,7 @@ audit:
pylama base -i E501

.PHONY: test
test: .env/ manage.py audit
test: .env/ manage.py
$(PYTHON) manage.py test -c base.config.test

.PHONY: clean
Expand Down
2 changes: 1 addition & 1 deletion base/auth/manager.py
Expand Up @@ -20,7 +20,7 @@ def register(self, app, *args, **kwargs):
if not self._login_manager or self.app != app:
self._login_manager = LoginManager()
self._login_manager.user_callback = self.user_loader
self._login_manager.setup_app(app)
self._login_manager.init_app(app)
self._login_manager.login_view = app.config.get('AUTH_LOGIN_VIEW', 'code.index')
self._login_manager.login_message = u'You need to be signed in for this page.'

Expand Down
8 changes: 8 additions & 0 deletions base/config/core.py
Expand Up @@ -17,3 +17,11 @@
# Auth
AUTH_USER_MIXINS = []
AUTH_LOGIN_VIEW = 'core.index'

# Mail
MAIL_SERVER = 'smtp.gmail.com'
MAIL_PORT = 465
MAIL_USE_SSL = True
MAIL_USERNAME = 'username@gmail.com'
MAIL_PASSWORD = 'password_here'
DEFAULT_MAIL_SENDER = 'Admin <%s>' % MAIL_USERNAME
10 changes: 1 addition & 9 deletions base/config/production.py
Expand Up @@ -6,14 +6,6 @@

SECRET_KEY = 'SecretKeyForSessionSigning'

# Mail (gmail config)
MAIL_SERVER = 'smtp.gmail.com'
MAIL_PORT = 465
MAIL_USE_SSL = True
MAIL_USERNAME = 'username@gmail.com'
MAIL_PASSWORD = '*********'
DEFAULT_MAIL_SENDER = 'Admin < %s >' % MAIL_USERNAME

ADMINS = frozenset([MAIL_USERNAME])
COLLECT_STATIC_ROOT = op.join(op.dirname(ROOTDIR), 'static')

Expand All @@ -28,5 +20,5 @@
consumer_secret='Pt1t2PjzKu8vsX5ixbFKu5gNEAekYrbpJrlsQMIwquc'
)


# pymode:lint_ignore=W0614,W404
# flake8: noqa
20 changes: 20 additions & 0 deletions base/core/__init__.py
@@ -1,4 +1,9 @@
" base.core "
from flask import request
from flaskext.mail import Message
from logging import Handler, ERROR

from ..ext import mail


def register_app(app):
Expand All @@ -17,4 +22,19 @@ def register_app(app):
from flask import render_template
app.errorhandler(404)(lambda e: (render_template('core/404.html'), 404))

if not app.debug:
mailhandler = FlaskMailHandler(ERROR)
app.logger.addHandler(mailhandler)

register_app.priority = 100.0


class FlaskMailHandler(Handler):

def emit(self, record):
sbj = "APP ERROR: %s%s" % (request.host_url.rstrip('/'), request.path)
msg = Message(sbj, body=self.format(record), recipients=mail.app.config.get('ADMINS', []))
mail.send(msg)


# pymode:lint_ignore=F0401
9 changes: 9 additions & 0 deletions base/core/models.py
@@ -1,8 +1,10 @@
from datetime import datetime

from sqlalchemy import event
from sqlalchemy.ext.declarative import declared_attr
from sqlalchemy.orm import object_mapper
from sqlalchemy.orm.session import object_session

from ..ext import db


Expand Down Expand Up @@ -105,3 +107,10 @@ def appstruct(self):
class Alembic(db.Model):
__tablename__ = 'alembic_version'
version_num = db.Column(db.String(32), nullable=False, primary_key=True)


def before_signal(session, *args):
map(lambda o: hasattr(o, 'before_new') and o.before_new(), session.new)
map(lambda o: hasattr(o, 'before_delete') and o.before_delete(), session.deleted)

event.listen(db.session.__class__, 'before_flush', before_signal)
18 changes: 18 additions & 0 deletions base/core/tests.py
Expand Up @@ -34,3 +34,21 @@ def test_cache(self):
cache.set('key', 'value')
testkey = cache.get('key')
self.assertEqual(testkey, 'value')

def test_after_change(self):
from .models import Alembic
from mock import Mock
Alembic.before_new = Mock()
a = Alembic()
a.version_num = '345'
db.session.add(a)
db.session.commit()
self.assertEqual(Alembic.before_new.call_count, 1)

def test_mail_handler(self):
from ..ext import mail
with mail.record_messages() as outbox:
self.app.logger.error('Attention!')
self.assertTrue(outbox)
msg = outbox[0]
self.assertEqual(msg.subject, 'APP ERROR: http://localhost/')
4 changes: 2 additions & 2 deletions base/ext.py
Expand Up @@ -13,7 +13,7 @@
babel = Babel()
cache = Cache()
db = SQLAlchemy()
main = Mail()
mail = Mail()

manager = Manager(create_app)
manager.add_option("-c", "--config", dest="config", required=False)
Expand All @@ -27,7 +27,7 @@ def config_extensions(app):

cache.init_app(app)
db.init_app(app)
main.init_app(app)
mail.init_app(app)
collect.init_app(app)

DebugToolbarExtension(app)
Expand Down
2 changes: 1 addition & 1 deletion requirements.txt
Expand Up @@ -5,7 +5,7 @@ Flask-SQLAlchemy>=0.16
Flask-Script>=0.3.3
Flask-Admin>=1.0.1
Flask-Babel>=0.8
Flask-Bootstrap>=2.0.4-3
Flask-Bootstrap>=2.1.0-1
Flask-Login>=0.1.3
Flask-Principal>=0.3.1
Flask-Cache>=0.6.0
Expand Down

0 comments on commit b4f7a6d

Please sign in to comment.