From 990dd967dc305be07f33437c352fa69835561fb6 Mon Sep 17 00:00:00 2001 From: Pierre VERBAERE Date: Thu, 8 Sep 2022 23:16:13 +0200 Subject: [PATCH] feat: add Models+Schema and User Controller --- Controllers/User.py | 62 +++++++++++++++++++++++++++++++++++++------- Models/IoC.py | 15 +++++++++++ Models/Permission.py | 11 ++++++++ Models/Post.py | 23 ---------------- Models/Role.py | 19 ++++++++++++++ Models/Schema.py | 60 +++++++++++++++++++++++++++++++++++------- Models/Tag.py | 12 --------- Models/Task.py | 18 +++++++++++++ Models/Tenant.py | 9 +++++++ Models/Ticket.py | 36 +++++++++++++++++++++++++ Models/User.py | 30 +++++++++++++++++---- app.py | 5 ---- 12 files changed, 236 insertions(+), 64 deletions(-) create mode 100644 Models/IoC.py create mode 100644 Models/Permission.py delete mode 100644 Models/Post.py create mode 100644 Models/Role.py delete mode 100644 Models/Tag.py create mode 100644 Models/Task.py create mode 100644 Models/Tenant.py create mode 100644 Models/Ticket.py diff --git a/Controllers/User.py b/Controllers/User.py index 2648d9e..5cdb4fc 100644 --- a/Controllers/User.py +++ b/Controllers/User.py @@ -1,8 +1,11 @@ from flask import request from Models.User import User +from Models.Role import Role +from Models.Tenant import Tenant from Models.Schema import user_schema, users_schema from flask_restful import Resource, abort from app import db +from datetime import datetime from werkzeug.security import generate_password_hash 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() 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( - name=request.json['name'], + firstname=request.json['firstname'], + lastname=request.json['lastname'], + username=request.json['username'], 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.commit() @@ -34,9 +49,22 @@ class UserResource(Resource): def put(self, user_id): user = User.query.get_or_404(user_id) - user.name = request.json['name'] - user.email = request.json['email'] - user.password = generate_password_hash(request.json['password']) + 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.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() return user_schema.dump(post) @@ -45,12 +73,28 @@ class UserResource(Resource): def patch(self, user_id): user = User.query.get_or_404(user_id) - if 'name' in request.json: - user.name = request.json['name'] + if 'firstname' in request.json: + 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: - user.email = request.json['email'] + user.email=request.json['email'] 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() return user_schema.dump(post) diff --git a/Models/IoC.py b/Models/IoC.py new file mode 100644 index 0000000..49e5e39 --- /dev/null +++ b/Models/IoC.py @@ -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 '' % self.ioc_id diff --git a/Models/Permission.py b/Models/Permission.py new file mode 100644 index 0000000..519de70 --- /dev/null +++ b/Models/Permission.py @@ -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 '' % self.permission_id \ No newline at end of file diff --git a/Models/Post.py b/Models/Post.py deleted file mode 100644 index ba1bb40..0000000 --- a/Models/Post.py +++ /dev/null @@ -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 '' % self.title - diff --git a/Models/Role.py b/Models/Role.py new file mode 100644 index 0000000..e7b5a39 --- /dev/null +++ b/Models/Role.py @@ -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 '' % self.role_id \ No newline at end of file diff --git a/Models/Schema.py b/Models/Schema.py index eb9d4b8..766da98 100644 --- a/Models/Schema.py +++ b/Models/Schema.py @@ -1,7 +1,11 @@ from marshmallow_sqlalchemy import SQLAlchemyAutoSchema from Models.User import User -from Models.Post import Post -from Models.Tag import Tag +from Models.Ticket import Ticket +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 Meta: @@ -11,23 +15,59 @@ class UserSchema(SQLAlchemyAutoSchema): include_relationships = True load_instance = True -class PostSchema(SQLAlchemyAutoSchema): +class TicketSchema(SQLAlchemyAutoSchema): class Meta: - model= Post + model= Ticket include_fk = True include_relationships = True load_instance = True -class TagSchema(SQLAlchemyAutoSchema): +class TaskSchema(SQLAlchemyAutoSchema): 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_relationships = True load_instance = True user_schema = UserSchema() users_schema = UserSchema(many=True) -post_schema = PostSchema() -posts_schema = PostSchema(many=True) -tag_schema = TagSchema() -tags_schema = TagSchema(many=True) \ No newline at end of file +ticket_schema = TicketSchema() +tickets_schema = TicketSchema(many=True) +task_schema = TaskSchema() +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) \ No newline at end of file diff --git a/Models/Tag.py b/Models/Tag.py deleted file mode 100644 index 959b45f..0000000 --- a/Models/Tag.py +++ /dev/null @@ -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 '' % self.name - - diff --git a/Models/Task.py b/Models/Task.py new file mode 100644 index 0000000..5b4181e --- /dev/null +++ b/Models/Task.py @@ -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 '' % self.task_id diff --git a/Models/Tenant.py b/Models/Tenant.py new file mode 100644 index 0000000..354242e --- /dev/null +++ b/Models/Tenant.py @@ -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 '' % self.name \ No newline at end of file diff --git a/Models/Ticket.py b/Models/Ticket.py new file mode 100644 index 0000000..8cb1fb3 --- /dev/null +++ b/Models/Ticket.py @@ -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 '' % self.title + diff --git a/Models/User.py b/Models/User.py index 6a7cca7..6fb768f 100644 --- a/Models/User.py +++ b/Models/User.py @@ -1,15 +1,35 @@ from app import db, ma 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): - __tablename__ = "user" - id = db.Column(db.Integer, primary_key=True) - name = db.Column(db.String(50)) - email = db.Column(db.String(255)) + __tablename__ = "users" + user_id = db.Column(db.Integer, primary_key=True) + firstname = db.Column(db.String(50)) + 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)) + 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): - return '' % self.name + return '' % self.username def check_password(self, password): return check_password_hash(self.password, password) diff --git a/app.py b/app.py index 092e629..0b290ce 100644 --- a/app.py +++ b/app.py @@ -16,18 +16,13 @@ ma = Marshmallow(app) api = Api(app) jwt = JWTManager(app) -from Controllers.Post import PostListResource, PostResource from Controllers.User import UserListResource, UserResource -from Controllers.Tag import TagListResource from Controllers.Login import Login, Refresh api.add_resource(UserListResource, '/v1/user') api.add_resource(UserResource, '/v1/user/') api.add_resource(Login, '/v1/login') api.add_resource(Refresh, '/v1/refresh') -api.add_resource(PostListResource, '/v1/posts') -api.add_resource(PostResource, '/v1/posts/') -api.add_resource(TagListResource, '/v1/tags') db.create_all()