removed old dB code and continued on group and user mgmt

This commit is contained in:
2019-04-11 16:18:46 +02:00
parent 2451a56403
commit cbc269edf2
13 changed files with 42 additions and 104 deletions

View File

@@ -101,7 +101,7 @@ def create_or_retrieve_user_from_userinfo(userinfo):
user = User(email=email, first_name=userinfo.get("given_name", ""), user = User(email=email, first_name=userinfo.get("given_name", ""),
last_name=userinfo.get("family_name", ""), external_user=True, last_name=userinfo.get("family_name", ""), external_user=True,
groups=userinfo.get("memberOf", [])) groups=user_groups)
app.logger.info("creating new user") app.logger.info("creating new user")

View File

@@ -10,12 +10,16 @@ from flask_restplus import fields, Resource
from backend import db from backend import db
from backend.api import api_group from backend.api import api_group
from backend.models.user_model import User, Group from backend.models.user_model import Group
group_model = api_group.model('Group', { group_model = api_group.model('Group', {
'id': fields.String(required=False, description='The group\'s identifier'), 'id': fields.String(required=False, description='The group\'s identifier'),
'name': fields.String(required=True, description='The group\'s name'), 'name': fields.String(required=True, description='The group\'s name'),
'description': fields.String(required=False, description='The group\'s description'),
'users': fields.List(fields.Nested(
{'id': fields.Integer(), 'first_name': fields.String(), 'last_name': fields.String()}),
required=False, description='Group members.')
}) })
@@ -57,7 +61,7 @@ class GroupResource(Resource):
return group return group
api_group.abort(404) api_group.abort(404)
@api_group.route('/') @api_group.route('')
class GroupList(Resource): class GroupList(Resource):
@jwt_required @jwt_required
@api_group.doc('groups') @api_group.doc('groups')
@@ -70,7 +74,7 @@ class GroupList(Resource):
return Group.get_all() return Group.get_all()
@jwt_required @jwt_required
@api_group.doc('create_todo') @api_group.doc('create_group')
@api_group.expect(group_model) @api_group.expect(group_model)
@api_group.marshal_with(group_model, code=201) @api_group.marshal_with(group_model, code=201)
def post(self): def post(self):

View File

@@ -16,16 +16,22 @@ from backend.api import api_bp, api_user
from backend.auth import oidc_auth from backend.auth import oidc_auth
from backend.models.user_model import User, Group from backend.models.user_model import User, Group
user = api_user.model('User', {
user_model = api_user.model('User', {
'id': fields.String(required=True, description='The user\'s identifier'), 'id': fields.String(required=True, description='The user\'s identifier'),
'first_name': fields.String(required=True, description='The user\'s first name'), 'first_name': fields.String(required=True, description='The user\'s first name'),
'last_name': fields.String(required=True, description='The user\'s last name'),
'email': fields.String(required=True, description='The user\'s email address'),
'nickname': fields.String(required=False, description='The user\'s nick name'),
'groups': fields.List(fields.Nested({'name': fields.String()}), required=False, description='Group memberships.'),
}) })
@api_user.route('/profile', methods=['GET']) @api_user.route('/profile', methods=['GET'])
class Profile(Resource): class Profile(Resource):
@jwt_auth.login_required @jwt_auth.login_required
@api_user.marshal_list_with(user) @api_user.marshal_list_with(user_model)
def get(self): def get(self):
"""Get infos about logged in user.""" """Get infos about logged in user."""
current_user_id = get_jwt_identity() current_user_id = get_jwt_identity()
@@ -33,7 +39,7 @@ class Profile(Resource):
return User.get_by_identifier(current_user_id) return User.get_by_identifier(current_user_id)
@api_user.route('/') @api_user.route('')
class UserList(Resource): class UserList(Resource):
""" """
This is a test class. This is a test class.
@@ -41,7 +47,7 @@ class UserList(Resource):
#@jwt_auth.login_required #@jwt_auth.login_required
@jwt_required @jwt_required
@api_user.doc('users') @api_user.doc('users')
@api_user.marshal_list_with(user) @api_user.marshal_list_with(user_model)
def get(self): def get(self):
""" """
just a test! just a test!
@@ -51,6 +57,16 @@ class UserList(Resource):
app.logger.info(current_user) app.logger.info(current_user)
return User.get_all() return User.get_all()
@jwt_required
@api_user.doc('create_group')
@api_user.expect(user_model)
@api_user.marshal_with(user_model, code=201)
def post(self):
user = User(**api_user.payload)
db.session.add(user)
db.session.commit()
return user
@api_user.route('/<id>') @api_user.route('/<id>')
@api_user.param('id', 'The user identifier') @api_user.param('id', 'The user identifier')
@@ -58,7 +74,7 @@ class UserList(Resource):
class UserResource(Resource): class UserResource(Resource):
@jwt_auth.login_required @jwt_auth.login_required
@api_user.doc('get_user') @api_user.doc('get_user')
@api_user.marshal_with(user) @api_user.marshal_with(user_model)
def get(self, id): def get(self, id):
"""Fetch a user given its identifier""" """Fetch a user given its identifier"""
user = User.get_by_id(id) user = User.get_by_id(id)

BIN
app.db

Binary file not shown.

View File

View File

@@ -1,20 +0,0 @@
from sqlalchemy import create_engine, MetaData
from sqlalchemy.orm import scoped_session, sessionmaker
from sqlalchemy.ext.declarative import declarative_base
engine = create_engine('sqlite:////tmp/test.db', convert_unicode=True)
db_session = scoped_session(sessionmaker(autocommit=False,
autoflush=False,
bind=engine))
Base = declarative_base()
Base.query = db_session.query_property()
metadata = MetaData()
def init_db():
# import all modules here that might define models so that
# they will be registered properly on the metadata. Otherwise
# you will have to import them first before calling init_db()
import backend.app.models.user
import backend.app.models.lock
metadata.create_all(bind=engine)

View File

@@ -1,13 +0,0 @@
#!/usr/bin/env python
from migrate.versioning import api
from backend.config import SQLALCHEMY_DATABASE_URI
from backend.config import SQLALCHEMY_MIGRATE_REPO
from backend import db
import os.path
db.create_all()
if not os.path.exists(SQLALCHEMY_MIGRATE_REPO):
api.create(SQLALCHEMY_MIGRATE_REPO, 'database repository')
api.version_control(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO)
else:
api.version_control(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO, api.version(SQLALCHEMY_MIGRATE_REPO))

View File

@@ -1,9 +0,0 @@
#!/usr/bin/env python
from migrate.versioning import api
from backend.config import SQLALCHEMY_DATABASE_URI
from backend.config import SQLALCHEMY_MIGRATE_REPO
v = api.db_version(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO)
api.downgrade(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO, v - 1)
v = api.db_version(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO)
print('Current database version: ' + str(v))

View File

@@ -1,20 +0,0 @@
#!/usr/bin/env python
import imp
from migrate.versioning import api
from backend import db
from backend.config import SQLALCHEMY_DATABASE_URI
from backend.config import SQLALCHEMY_MIGRATE_REPO
v = api.db_version(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO)
migration = SQLALCHEMY_MIGRATE_REPO + ('/versions/%03d_migration.py' % (v+1))
tmp_module = imp.new_module('old_model')
old_model = api.create_model(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO)
exec(old_model, tmp_module.__dict__)
extra_imports = 'import datetime\n' # your imports
script = extra_imports + api.make_update_script_for_model(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO, tmp_module.meta, db.metadata)
open(migration, "wt").write(script)
api.upgrade(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO)
v = api.db_version(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO)
print('New migration saved as ' + migration)
print('Current database version: ' + str(v))

View File

@@ -1,13 +0,0 @@
#!/usr/bin/env python
from backend import db
from backend.models import example_model, user_model, post_model
user = user_model.User(nickname="tobi", email="privat@t-kurze.de")
user.set_password("abcxyz")
db.session.add(user)
example_data = example_model.ExampleDataItem(name="tolles data item", mac="12:34:56:78:90:AB")
db.session.add(example_data)
db.session.commit()

View File

@@ -1,8 +0,0 @@
#!/usr/bin/env python
from migrate.versioning import api
from backend.config import SQLALCHEMY_DATABASE_URI
from backend.config import SQLALCHEMY_MIGRATE_REPO
api.upgrade(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO)
v = api.db_version(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO)
print('Current database version: ' + str(v))

View File

@@ -0,0 +1,6 @@
"""
Import all models...
"""
from backend.models.example_model import *
from backend.models.user_model import *
from backend.models.post_model import *

View File

@@ -101,17 +101,10 @@ class User(UserMixin, db.Model):
super(User, self).__init__(**kwargs) super(User, self).__init__(**kwargs)
password = kwargs.get("password", None) password = kwargs.get("password", None)
external_user = kwargs.get("external_user", None) external_user = kwargs.get("external_user", None)
groups = kwargs.get("groups", None)
if password is not None: if password is not None:
self.password = sha256_crypt.encrypt(password) self.password = sha256_crypt.encrypt(password)
if external_user is not None: if external_user is not None:
self.external_user = external_user self.external_user = external_user
if groups is not None:
if isinstance(groups, list):
for g in groups:
self.groups.append(g)
elif isinstance(groups, str):
self.groups.append(groups)
@staticmethod @staticmethod
@login_manager.user_loader @login_manager.user_loader
@@ -417,13 +410,15 @@ class BlacklistToken(db.Model):
class Group(db.Model): class Group(db.Model):
id = db.Column(db.Integer, autoincrement=True, primary_key=True)
name = db.Column(db.Unicode(63), unique=True, nullable=False)
description = db.Column(db.Unicode(255), unique=False, nullable=True, default="")
users = db.relationship('User', secondary=user_group_table, back_populates='groups')
permissions = db.relationship('Permission', secondary=group_permission_table, back_populates='groups')
def __init__(self, **kwargs): def __init__(self, **kwargs):
super(Group, self).__init__(**kwargs) super(Group, self).__init__(**kwargs)
id = db.Column(db.Integer, autoincrement=True, primary_key=True)
name = db.Column(db.Unicode(63), unique=True, nullable=False)
users = db.relationship('User', secondary=user_group_table, back_populates='groups')
permissions = db.relationship('Permission', secondary=group_permission_table, back_populates='groups')
@staticmethod @staticmethod
def get_by_name(name): def get_by_name(name):
@@ -457,6 +452,6 @@ class Permission(db.Model):
"""Table containing permissions associated with groups.""" """Table containing permissions associated with groups."""
id = db.Column(db.Integer, autoincrement=True, primary_key=True) id = db.Column(db.Integer, autoincrement=True, primary_key=True)
name = db.Column(db.Unicode(63), unique=True, nullable=False) name = db.Column(db.Unicode(63), unique=True, nullable=False)
description = db.Column(db.Unicode(255)) description = db.Column(db.Unicode(511))
groups = db.relationship(Group, secondary=group_permission_table, groups = db.relationship(Group, secondary=group_permission_table,
back_populates='permissions') back_populates='permissions')