removed old dB code and continued on group and user mgmt
This commit is contained in:
@@ -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")
|
||||||
|
|
||||||
|
|||||||
@@ -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):
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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)
|
|
||||||
@@ -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))
|
|
||||||
@@ -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))
|
|
||||||
@@ -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))
|
|
||||||
@@ -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()
|
|
||||||
@@ -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))
|
|
||||||
@@ -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 *
|
||||||
|
|||||||
@@ -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')
|
||||||
|
|||||||
Reference in New Issue
Block a user