feat: add Models+Schema and User Controller

This commit is contained in:
2022-09-08 23:16:13 +02:00
parent 388cfbdc94
commit 990dd967dc
12 changed files with 236 additions and 64 deletions

View File

@@ -1,8 +1,11 @@
from flask import request from flask import request
from Models.User import User from Models.User import User
from Models.Role import Role
from Models.Tenant import Tenant
from Models.Schema import user_schema, users_schema from Models.Schema import user_schema, users_schema
from flask_restful import Resource, abort from flask_restful import Resource, abort
from app import db from app import db
from datetime import datetime
from werkzeug.security import generate_password_hash from werkzeug.security import generate_password_hash
from flask_jwt_extended import create_access_token, get_jwt_identity, jwt_required, JWTManager, current_user from flask_jwt_extended import create_access_token, get_jwt_identity, jwt_required, JWTManager, current_user
@@ -14,10 +17,22 @@ class UserListResource(Resource):
@jwt_required() @jwt_required()
def post(self): def post(self):
tenants_array= []
for tenant_id in request.json['tenants']:
tenants_array.append(Tenant.query.filter_by(id=tenant_id).first())
roles_array= []
for role_id in request.json['roles']:
roles_array.append(Role.query.filter_by(id=role_id).first())
new_user = User( new_user = User(
name=request.json['name'], firstname=request.json['firstname'],
lastname=request.json['lastname'],
username=request.json['username'],
email=request.json['email'], email=request.json['email'],
password=generate_password_hash(request.json['password']) password=generate_password_hash(request.json['password']),
tenants=tenants_array,
roles=roles_array,
creation=datetime.now(),
update=datetime.now()
) )
db.session.add(new_user) db.session.add(new_user)
db.session.commit() db.session.commit()
@@ -34,9 +49,22 @@ class UserResource(Resource):
def put(self, user_id): def put(self, user_id):
user = User.query.get_or_404(user_id) user = User.query.get_or_404(user_id)
user.name = request.json['name'] tenants_array= []
for tenant_id in request.json['tenants']:
tenants_array.append(Tenant.query.filter_by(id=tenant_id).first())
roles_array= []
for role_id in request.json['roles']:
roles_array.append(Role.query.filter_by(id=role_id).first())
user.firstname=request.json['firstname']
user.lastname=request.json['lastname']
user.username=request.json['username']
user.email=request.json['email'] user.email=request.json['email']
user.password=generate_password_hash(request.json['password']) user.password=generate_password_hash(request.json['password'])
user.tenants=tenants_array
user.roles=roles_array
user.creation=datetime.now()
user.update=datetime.now()
db.session.commit() db.session.commit()
return user_schema.dump(post) return user_schema.dump(post)
@@ -45,12 +73,28 @@ class UserResource(Resource):
def patch(self, user_id): def patch(self, user_id):
user = User.query.get_or_404(user_id) user = User.query.get_or_404(user_id)
if 'name' in request.json: if 'firstname' in request.json:
user.name = request.json['name'] user.firstname=request.json['firstname']
if 'lastname' in request.json:
user.lastname=request.json['lastname']
if 'username' in request.json:
user.username=request.json['username']
if 'email' in request.json: if 'email' in request.json:
user.email=request.json['email'] user.email=request.json['email']
if 'password' in request.json: if 'password' in request.json:
user.password=generate_password_hash(request.json['password']) user.password=generate_password_hash(request.json['password'])
if 'tenants' in request.json:
tenants_array= []
for tenant_id in request.json['tenants']:
tenants_array.append(Tenant.query.filter_by(id=tenant_id).first())
user.tenants=tenants_array
if 'roles' in request.json:
roles_array= []
for role_id in request.json['roles']:
roles_array.append(Role.query.filter_by(id=role_id).first())
user.roles=roles_array
user.update=datetime.now()
db.session.commit() db.session.commit()
return user_schema.dump(post) return user_schema.dump(post)

15
Models/IoC.py Normal file
View File

@@ -0,0 +1,15 @@
from app import db, ma
from Models.Tenant import Tenant
class IoC(db.Model):
__tablename__ = "iocs"
ioc_id = db.Column(db.Integer, primary_key=True)
value = db.Column(db.Text)
type = db.Column(db.String(50))
update = db.Column(db.DateTime)
creation = db.Column(db.DateTime)
tenant_id = db.Column(db.Integer, db.ForeignKey("tenants.tenant_id"))
tenant = db.relationship("Tenant", backref="iocs")
def __repr__(self):
return '<IoC %s>' % self.ioc_id

11
Models/Permission.py Normal file
View File

@@ -0,0 +1,11 @@
from app import db, ma
class Permission(db.Model):
__tablename__ = "permissions"
permission_id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(50))
def __repr__(self):
return '<Permission %s>' % self.permission_id

View File

@@ -1,23 +0,0 @@
from app import db, ma
from Models.User import User
from Models.Tag import Tag
tags_posts = db.Table('tags_posts_mapping',
db.Column('tag_id', db.Integer, db.ForeignKey('tags.id'), primary_key=True),
db.Column('post_id', db.Integer, db.ForeignKey('post.id'), primary_key=True)
)
class Post(db.Model):
__tablename__ = "post"
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(50))
content = db.Column(db.String(255))
tags = db.relationship('Tag', secondary=tags_posts, lazy='subquery',
backref=db.backref('posts', lazy=True))
author_id = db.Column(db.Integer, db.ForeignKey("user.id"))
author = db.relationship("User", backref="posts")
def __repr__(self):
return '<Post %s>' % self.title

19
Models/Role.py Normal file
View File

@@ -0,0 +1,19 @@
from app import db, ma
from Models.Permission import Permission
roles_permissions = db.Table('roles_permissions_mapping',
db.Column('role_id', db.Integer, db.ForeignKey('roles.role_id'), primary_key=True),
db.Column('permission_id', db.Integer, db.ForeignKey('permissions.permission_id'), primary_key=True)
)
class Role(db.Model):
__tablename__ = "roles"
role_id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(50))
tenant_id = db.Column(db.Integer, db.ForeignKey("tenants.tenant_id"))
tenant = db.relationship("Tenant", backref="roles")
permissions = db.relationship('Permission', secondary=roles_permissions, lazy='subquery',
backref=db.backref('roles', lazy=True))
def __repr__(self):
return '<Role %s>' % self.role_id

View File

@@ -1,7 +1,11 @@
from marshmallow_sqlalchemy import SQLAlchemyAutoSchema from marshmallow_sqlalchemy import SQLAlchemyAutoSchema
from Models.User import User from Models.User import User
from Models.Post import Post from Models.Ticket import Ticket
from Models.Tag import Tag from Models.Task import Task
from Models.IoC import IoC
from Models.Tenant import Tenant
from Models.Role import Role
from Models.Permission import Permission
class UserSchema(SQLAlchemyAutoSchema): class UserSchema(SQLAlchemyAutoSchema):
class Meta: class Meta:
@@ -11,23 +15,59 @@ class UserSchema(SQLAlchemyAutoSchema):
include_relationships = True include_relationships = True
load_instance = True load_instance = True
class PostSchema(SQLAlchemyAutoSchema): class TicketSchema(SQLAlchemyAutoSchema):
class Meta: class Meta:
model= Post model= Ticket
include_fk = True include_fk = True
include_relationships = True include_relationships = True
load_instance = True load_instance = True
class TagSchema(SQLAlchemyAutoSchema): class TaskSchema(SQLAlchemyAutoSchema):
class Meta: class Meta:
model= Tag model= Task
include_fk = True
include_relationships = True
load_instance = True
class IoCSchema(SQLAlchemyAutoSchema):
class Meta:
model= IoC
include_fk = True
include_relationships = True
load_instance = True
class TenantSchema(SQLAlchemyAutoSchema):
class Meta:
model= Tenant
include_fk = True
include_relationships = True
load_instance = True
class RoleSchema(SQLAlchemyAutoSchema):
class Meta:
model= Role
include_fk = True
include_relationships = True
load_instance = True
class PermissionSchema(SQLAlchemyAutoSchema):
class Meta:
model= Permission
include_fk = True include_fk = True
include_relationships = True include_relationships = True
load_instance = True load_instance = True
user_schema = UserSchema() user_schema = UserSchema()
users_schema = UserSchema(many=True) users_schema = UserSchema(many=True)
post_schema = PostSchema() ticket_schema = TicketSchema()
posts_schema = PostSchema(many=True) tickets_schema = TicketSchema(many=True)
tag_schema = TagSchema() task_schema = TaskSchema()
tags_schema = TagSchema(many=True) tasks_schema = TaskSchema(many=True)
ioc_schema = IoCSchema()
iocs_schema = IoCSchema(many=True)
tenant_schema = TenantSchema()
tenants_schema = TenantSchema(many=True)
role_schema = RoleSchema()
roles_schema = RoleSchema(many=True)
permission_schema = PermissionSchema()
permissions_schema = PermissionSchema(many=True)

View File

@@ -1,12 +0,0 @@
from app import db, ma
class Tag(db.Model):
__tablename__ = "tags"
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(50))
def __repr__(self):
return '<Tag %s>' % self.name

18
Models/Task.py Normal file
View File

@@ -0,0 +1,18 @@
from app import db, ma
from Models.Tenant import Tenant
from Models.Ticket import Ticket
class Task(db.Model):
__tablename__ = "tasks"
task_id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.Text)
priority = db.Column(db.String(50))
user_id = db.Column(db.Integer, db.ForeignKey("users.user_id"))
user = db.relationship("User", backref="tasks")
tenant_id = db.Column(db.Integer, db.ForeignKey("tenants.tenant_id"))
tenant = db.relationship("Tenant", backref="tasks")
ticket_id = db.Column(db.Integer, db.ForeignKey("tickets.ticket_id"))
ticket = db.relationship("Ticket", backref="tasks")
def __repr__(self):
return '<Task %s>' % self.task_id

9
Models/Tenant.py Normal file
View File

@@ -0,0 +1,9 @@
from app import db, ma
class Tenant(db.Model):
__tablename__ = "tenants"
tenant_id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(50))
def __repr__(self):
return '<Tenant %s>' % self.name

36
Models/Ticket.py Normal file
View File

@@ -0,0 +1,36 @@
from app import db, ma
from Models.User import User
from Models.IoC import IoC
from Models.Tenant import Tenant
tickets_iocs = db.Table('tickets_iocs_mapping',
db.Column('ticket_id', db.Integer, db.ForeignKey('tickets.ticket_id'), primary_key=True),
db.Column('ioc_id', db.Integer, db.ForeignKey('iocs.ioc_id'), primary_key=True)
)
tickets_users = db.Table('tickets_users_mapping',
db.Column('ticket_id', db.Integer, db.ForeignKey('tickets.ticket_id'), primary_key=True),
db.Column('user_id', db.Integer, db.ForeignKey('users.user_id'), primary_key=True)
)
class Ticket(db.Model):
__tablename__ = "tickets"
ticket_id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(50))
priority = db.Column(db.String(50))
severity = db.Column(db.String(50))
description = db.Column(db.Text)
update = db.Column(db.DateTime)
creation = db.Column(db.DateTime)
status = db.Column(db.String(50))
iocs = db.relationship('IoC', secondary=tickets_iocs, lazy='subquery',
backref=db.backref('tickets', lazy=True))
users = db.relationship('User', secondary=tickets_users, lazy='subquery',
backref=db.backref('tickets', lazy=True))
tenant_id = db.Column(db.Integer, db.ForeignKey("tenants.tenant_id"))
tenant = db.relationship("Tenant", backref="tickets")
def __repr__(self):
return '<Ticket %s>' % self.title

View File

@@ -1,15 +1,35 @@
from app import db, ma from app import db, ma
from werkzeug.security import check_password_hash from werkzeug.security import check_password_hash
from Models.Tenant import Tenant
from Models.Role import Role
tenants_users = db.Table('tenants_users_mapping',
db.Column('tenant_id', db.Integer, db.ForeignKey('tenants.tenant_id'), primary_key=True),
db.Column('user_id', db.Integer, db.ForeignKey('users.user_id'), primary_key=True)
)
roles_users = db.Table('roles_users_mapping',
db.Column('role_id', db.Integer, db.ForeignKey('roles.role_id'), primary_key=True),
db.Column('user_id', db.Integer, db.ForeignKey('users.user_id'), primary_key=True)
)
class User(db.Model): class User(db.Model):
__tablename__ = "user" __tablename__ = "users"
id = db.Column(db.Integer, primary_key=True) user_id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(50)) firstname = db.Column(db.String(50))
email = db.Column(db.String(255)) lastname = db.Column(db.String(50))
update = db.Column(db.DateTime)
creation = db.Column(db.DateTime)
username = db.Column(db.String(255), unique=True)
email = db.Column(db.String(255), unique=True)
password = db.Column(db.String(255)) password = db.Column(db.String(255))
tenants = db.relationship('Tenant', secondary=tenants_users, lazy='subquery',
backref=db.backref('users', lazy=True))
roles = db.relationship('Role', secondary=roles_users, lazy='subquery',
backref=db.backref('users', lazy=True))
def __repr__(self): def __repr__(self):
return '<User %s>' % self.name return '<User %s>' % self.username
def check_password(self, password): def check_password(self, password):
return check_password_hash(self.password, password) return check_password_hash(self.password, password)

5
app.py
View File

@@ -16,18 +16,13 @@ ma = Marshmallow(app)
api = Api(app) api = Api(app)
jwt = JWTManager(app) jwt = JWTManager(app)
from Controllers.Post import PostListResource, PostResource
from Controllers.User import UserListResource, UserResource from Controllers.User import UserListResource, UserResource
from Controllers.Tag import TagListResource
from Controllers.Login import Login, Refresh from Controllers.Login import Login, Refresh
api.add_resource(UserListResource, '/v1/user') api.add_resource(UserListResource, '/v1/user')
api.add_resource(UserResource, '/v1/user/<int:post_id>') api.add_resource(UserResource, '/v1/user/<int:post_id>')
api.add_resource(Login, '/v1/login') api.add_resource(Login, '/v1/login')
api.add_resource(Refresh, '/v1/refresh') api.add_resource(Refresh, '/v1/refresh')
api.add_resource(PostListResource, '/v1/posts')
api.add_resource(PostResource, '/v1/posts/<int:post_id>')
api.add_resource(TagListResource, '/v1/tags')
db.create_all() db.create_all()