From d1d5c7a4bfd26be3ea9a2011c4e9e75d12d61389 Mon Sep 17 00:00:00 2001 From: brettlangdon Date: Fri, 29 Jul 2016 09:58:39 -0400 Subject: [PATCH] update base user models --- ...s.py => 4b1620436a9f_initial_migration.py} | 22 ++++++++++------- .../requirements.txt | 1 + .../models/__init__.py | 24 +++++++++++++++++-- .../models/user.py | 3 ++- 4 files changed, 38 insertions(+), 12 deletions(-) rename {{cookiecutter.project_name}}/migrations/versions/{70bd704dcb5c_setup_user_and_role_tables.py => 4b1620436a9f_initial_migration.py} (59%) diff --git a/{{cookiecutter.project_name}}/migrations/versions/70bd704dcb5c_setup_user_and_role_tables.py b/{{cookiecutter.project_name}}/migrations/versions/4b1620436a9f_initial_migration.py similarity index 59% rename from {{cookiecutter.project_name}}/migrations/versions/70bd704dcb5c_setup_user_and_role_tables.py rename to {{cookiecutter.project_name}}/migrations/versions/4b1620436a9f_initial_migration.py index c6ebedb..d4931a1 100644 --- a/{{cookiecutter.project_name}}/migrations/versions/70bd704dcb5c_setup_user_and_role_tables.py +++ b/{{cookiecutter.project_name}}/migrations/versions/4b1620436a9f_initial_migration.py @@ -1,24 +1,26 @@ -"""Setup user and role tables +"""initial migration -Revision ID: 70bd704dcb5c +Revision ID: 4b1620436a9f Revises: None -Create Date: 2016-07-26 10:07:41.130632 +Create Date: 2016-07-29 09:48:02.751483 """ # revision identifiers, used by Alembic. -revision = '70bd704dcb5c' +revision = '4b1620436a9f' down_revision = None from alembic import op import sqlalchemy as sa -from sqlalchemy.dialects.postgresql import UUID +from sqlalchemy.dialects import postgresql def upgrade(): op.create_table( 'role', - sa.Column('id', UUID(), nullable=False), + sa.Column('created_at', sa.DateTime(timezone=True), nullable=False), + sa.Column('updated_at', sa.DateTime(timezone=True), nullable=False), + sa.Column('id', postgresql.UUID(), nullable=False), sa.Column('name', sa.String(length=80), nullable=True), sa.Column('description', sa.String(length=255), nullable=True), sa.PrimaryKeyConstraint('id'), @@ -26,7 +28,9 @@ def upgrade(): ) op.create_table( 'user', - sa.Column('id', UUID(), nullable=False), + sa.Column('created_at', sa.DateTime(timezone=True), nullable=False), + sa.Column('updated_at', sa.DateTime(timezone=True), nullable=False), + sa.Column('id', postgresql.UUID(), nullable=False), sa.Column('email', sa.String(length=255), nullable=True), sa.Column('password', sa.String(length=255), nullable=True), sa.Column('active', sa.Boolean(), nullable=True), @@ -36,8 +40,8 @@ def upgrade(): ) op.create_table( 'user_role', - sa.Column('user_id', UUID(), nullable=True), - sa.Column('role_id', UUID(), nullable=True), + sa.Column('user_id', postgresql.UUID(), nullable=True), + sa.Column('role_id', postgresql.UUID(), nullable=True), sa.ForeignKeyConstraint(['role_id'], ['role.id'], ), sa.ForeignKeyConstraint(['user_id'], ['user.id'], ), ) diff --git a/{{cookiecutter.project_name}}/requirements.txt b/{{cookiecutter.project_name}}/requirements.txt index 6f13b39..2045e6c 100644 --- a/{{cookiecutter.project_name}}/requirements.txt +++ b/{{cookiecutter.project_name}}/requirements.txt @@ -1,3 +1,4 @@ +blinker==1.4 Flask==0.11.1 # Waiting on next release for a fix for libsass -e git+https://github.com/miracle2k/flask-assets@36da5c90cf99293ac632cfab58db52cab1c8cc83#egg=flask_assets diff --git a/{{cookiecutter.project_name}}/{{cookiecutter.project_name}}/models/__init__.py b/{{cookiecutter.project_name}}/{{cookiecutter.project_name}}/models/__init__.py index 33d28a4..3eaecc7 100644 --- a/{{cookiecutter.project_name}}/{{cookiecutter.project_name}}/models/__init__.py +++ b/{{cookiecutter.project_name}}/{{cookiecutter.project_name}}/models/__init__.py @@ -1,10 +1,30 @@ +import datetime import uuid +from sqlalchemy import event from sqlalchemy.ext.declarative import AbstractConcreteBase +from .. import db + class Base(AbstractConcreteBase): - def __init__(self, id=None, *args, **kwargs): + created_at = db.Column(db.DateTime(timezone=True), nullable=False) + updated_at = db.Column(db.DateTime(timezone=True), nullable=False) + + def __init__(self, id=None, created_at=None, updated_at=None, *args, **kwargs): if id is None: id = str(uuid.uuid4()) - super(Base, self).__init__(id=id, *args, **kwargs) + + if created_at is None: + created_at = datetime.datetime.now(tz=datetime.timezone.utc) + if updated_at is None: + updated_at = created_at + + super(Base, self).__init__(id=id, created_at=created_at, updated_at=updated_at, *args, **kwargs) + + +# Before we update our model, update its `updated_at` value +@event.listens_for(Base, 'before_update', propagate=True) +def base_update_updated_at(mapper, connection, model): + """When we update a base model, update the `updated_at` timestamp""" + model.updated_at = datetime.datetime.now(tz=datetime.timezone.utc) diff --git a/{{cookiecutter.project_name}}/{{cookiecutter.project_name}}/models/user.py b/{{cookiecutter.project_name}}/{{cookiecutter.project_name}}/models/user.py index 332d69a..b7e3291 100644 --- a/{{cookiecutter.project_name}}/{{cookiecutter.project_name}}/models/user.py +++ b/{{cookiecutter.project_name}}/{{cookiecutter.project_name}}/models/user.py @@ -1,8 +1,8 @@ from flask_security import UserMixin from sqlalchemy.dialects.postgresql import UUID -from . import Base from .. import db +from . import Base from .user_role import user_role_map @@ -12,5 +12,6 @@ class User(Base, db.Model, UserMixin): password = db.Column(db.String(255)) active = db.Column(db.Boolean()) confirmed_at = db.Column(db.DateTime()) + roles = db.relationship('Role', secondary=user_role_map, backref=db.backref('users', lazy='dynamic'))