From cbc269edf2ec2892c740d820a4470e902ad09420 Mon Sep 17 00:00:00 2001 From: Tobias Date: Thu, 11 Apr 2019 16:18:46 +0200 Subject: [PATCH] removed old dB code and continued on group and user mgmt --- api/auth_api.py | 2 +- api/group_api.py | 10 +++++++--- api/user_api.py | 26 +++++++++++++++++++++----- app.db | Bin 102400 -> 102400 bytes database/__init__.py | 0 database/database.py | 20 -------------------- database/db_create.py | 13 ------------- database/db_downgrade.py | 9 --------- database/db_migrate.py | 20 -------------------- database/db_populate.py | 13 ------------- database/db_upgrade.py | 8 -------- models/__init__.py | 6 ++++++ models/user_model.py | 19 +++++++------------ 13 files changed, 42 insertions(+), 104 deletions(-) delete mode 100644 database/__init__.py delete mode 100644 database/database.py delete mode 100644 database/db_create.py delete mode 100644 database/db_downgrade.py delete mode 100644 database/db_migrate.py delete mode 100644 database/db_populate.py delete mode 100644 database/db_upgrade.py diff --git a/api/auth_api.py b/api/auth_api.py index 5e5fff6..75f9193 100644 --- a/api/auth_api.py +++ b/api/auth_api.py @@ -101,7 +101,7 @@ def create_or_retrieve_user_from_userinfo(userinfo): user = User(email=email, first_name=userinfo.get("given_name", ""), last_name=userinfo.get("family_name", ""), external_user=True, - groups=userinfo.get("memberOf", [])) + groups=user_groups) app.logger.info("creating new user") diff --git a/api/group_api.py b/api/group_api.py index 5c844f8..83584b2 100644 --- a/api/group_api.py +++ b/api/group_api.py @@ -10,12 +10,16 @@ from flask_restplus import fields, Resource from backend import db 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', { 'id': fields.String(required=False, description='The group\'s identifier'), '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 api_group.abort(404) -@api_group.route('/') +@api_group.route('') class GroupList(Resource): @jwt_required @api_group.doc('groups') @@ -70,7 +74,7 @@ class GroupList(Resource): return Group.get_all() @jwt_required - @api_group.doc('create_todo') + @api_group.doc('create_group') @api_group.expect(group_model) @api_group.marshal_with(group_model, code=201) def post(self): diff --git a/api/user_api.py b/api/user_api.py index 9673c70..06a8b81 100644 --- a/api/user_api.py +++ b/api/user_api.py @@ -16,16 +16,22 @@ from backend.api import api_bp, api_user from backend.auth import oidc_auth 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'), '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']) class Profile(Resource): @jwt_auth.login_required - @api_user.marshal_list_with(user) + @api_user.marshal_list_with(user_model) def get(self): """Get infos about logged in user.""" current_user_id = get_jwt_identity() @@ -33,7 +39,7 @@ class Profile(Resource): return User.get_by_identifier(current_user_id) -@api_user.route('/') +@api_user.route('') class UserList(Resource): """ This is a test class. @@ -41,7 +47,7 @@ class UserList(Resource): #@jwt_auth.login_required @jwt_required @api_user.doc('users') - @api_user.marshal_list_with(user) + @api_user.marshal_list_with(user_model) def get(self): """ just a test! @@ -51,6 +57,16 @@ class UserList(Resource): app.logger.info(current_user) 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('/') @api_user.param('id', 'The user identifier') @@ -58,7 +74,7 @@ class UserList(Resource): class UserResource(Resource): @jwt_auth.login_required @api_user.doc('get_user') - @api_user.marshal_with(user) + @api_user.marshal_with(user_model) def get(self, id): """Fetch a user given its identifier""" user = User.get_by_id(id) diff --git a/app.db b/app.db index 7f0f8df49c5d15e6e3918028e441f5e026541a8d..2eab981b9056ddd0152761e6b7df79d3797f2ac8 100644 GIT binary patch delta 610 zcmaJ-O=uHA7@f(?CfVK0d`V+mOVlh4DiKq6o2HsTsWvB3Xwmi{cre;Pb4aSK0V|4) zH&3n3LCD3JgO{9SQKX*gF(62(Cn4uhtieLtOF?ICt9Wsk;m!Bn`+oQq>fVLAcPSb& z5JJ839h{zLXHvrk>bEj1&_YL06Y)(x#y+#jz^c9+c&e@IiyG11`md`Wl~uo`%qt1H zMjw(7o*$kVYU1@b@4u@wZQBWv5168*4Xb^ApJ5pINn8Z=8{)Y(;wSd1bao3C&V>w@_D*v2>mr|1tLPQxJWY7^N5HFPm2UUE!OyPQZ+qd zoaHbPI_nefSk~F(J$JbR4FntT6jI|~g`@j{ z1RxYeqONj#rc^4F?*%;+onWJvMw3^r=8}_hh1n3M=+qzP;#8?v*5oo3SV7Q*Hhh8= z_;Rq_eRRxV9ggWFie+VY1jR?f?w|Te1iS5s(|&pKf)_&#LGAa?jYz$cN<=GV)&?Rzk^^$ t5*rZq6GOdRnSD^$E3l1VTMFMmS4porF>|Y!pJNUl{~2rC48FdD&0i9mnLYpj delta 790 zcmaix%}*0S7{+IJ+wJbQyVD}L0tOnX5<%MCZFgyFh_nO=Uz!k5A;w5)!CD1vONb;! znt1V`XeLI(1>(VrUQAx%f^P5cGXWnNr&&({a zGYjm)YL|)-ss#2&!=n@a78QAwkmz`a4xvRP6{U>0DfT*+?Qb3T?5urOs1=sDNxooR z=X$Jo7k35On8_8?I;91Tl%QBTqksrcE@`V%0yl^l- zYj30ITUK&jG$@ul5TioQZL!INJ}TEvE{Rp-jpQPCf%{?|?88D1F*f-W$hD@t?WiC& zse$OCo4-xlP35~-PBFwG9w(|)lP^kTH#r)wBD{`Q^DgHS_Fopp z)knAp$|f?|)~Q6y8&7z2PkLf6Zy9_=u+uCWVehObQzdAd?rpRaAC zw@;77)PXDAiE~>2(BSCVv3R7j`*fhQ|7tKbZFEef1{6(ELrqEmrdw$a>w&O(B;?hb zg8@VPS27hNsFAsia8U8P6+Ntn!m8>GYMS00_}%cA;#YNJ@7+5H|HM1+$gjAAQeZ6$27bI_3cEK*^H_IKT$5fEBO+3_!z0 OFY&X>PMFVcQ0`v@fV15I diff --git a/database/__init__.py b/database/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/database/database.py b/database/database.py deleted file mode 100644 index bd89b86..0000000 --- a/database/database.py +++ /dev/null @@ -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) diff --git a/database/db_create.py b/database/db_create.py deleted file mode 100644 index 512d1bf..0000000 --- a/database/db_create.py +++ /dev/null @@ -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)) diff --git a/database/db_downgrade.py b/database/db_downgrade.py deleted file mode 100644 index d958877..0000000 --- a/database/db_downgrade.py +++ /dev/null @@ -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)) \ No newline at end of file diff --git a/database/db_migrate.py b/database/db_migrate.py deleted file mode 100644 index 2608251..0000000 --- a/database/db_migrate.py +++ /dev/null @@ -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)) diff --git a/database/db_populate.py b/database/db_populate.py deleted file mode 100644 index 9bc96a7..0000000 --- a/database/db_populate.py +++ /dev/null @@ -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() diff --git a/database/db_upgrade.py b/database/db_upgrade.py deleted file mode 100644 index 4775489..0000000 --- a/database/db_upgrade.py +++ /dev/null @@ -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)) \ No newline at end of file diff --git a/models/__init__.py b/models/__init__.py index e69de29..4bfbabc 100644 --- a/models/__init__.py +++ b/models/__init__.py @@ -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 * diff --git a/models/user_model.py b/models/user_model.py index e2736e2..8b135a4 100644 --- a/models/user_model.py +++ b/models/user_model.py @@ -101,17 +101,10 @@ class User(UserMixin, db.Model): super(User, self).__init__(**kwargs) password = kwargs.get("password", None) external_user = kwargs.get("external_user", None) - groups = kwargs.get("groups", None) if password is not None: self.password = sha256_crypt.encrypt(password) if external_user is not None: 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 @login_manager.user_loader @@ -417,13 +410,15 @@ class BlacklistToken(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): 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 def get_by_name(name): @@ -457,6 +452,6 @@ class Permission(db.Model): """Table containing permissions associated with groups.""" 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)) + description = db.Column(db.Unicode(511)) groups = db.relationship(Group, secondary=group_permission_table, back_populates='permissions')