Compare commits
No commits in common. "88e3f0280d366abdc59e436a9643bbdb6b6d28fb" and "9d388cd0c5b49f1d256535422bcd46e6b9365cae" have entirely different histories.
88e3f0280d
...
9d388cd0c5
41
README.md
41
README.md
@ -3,36 +3,20 @@
|
|||||||
# Deployment (from source)
|
# Deployment (from source)
|
||||||
|
|
||||||
- ``git clone https://github.com/grimhilt/artemio-server.git``
|
- ``git clone https://github.com/grimhilt/artemio-server.git``
|
||||||
-
|
|
||||||
python3 -m venv .venv
|
python3 -m venv .venv
|
||||||
source .venv/bin/activate
|
source .venv/bin/activate
|
||||||
python -m pip install -r requirements.txt
|
python -m pip install -r requirements.txt
|
||||||
|
|
||||||
sudo apt install libjpeg-dev zlib1g-dev
|
|
||||||
pip install Pillow
|
|
||||||
|
|
||||||
sudo apt install libmpv-dev
|
|
||||||
|
|
||||||
gunicorn -w 1 -b 0.0.0.0:5500 index:api --access-logfile access.log --error-logfile error.log
|
|
||||||
# Documentation
|
# Documentation
|
||||||
## API
|
## API
|
||||||
|
|
||||||
### Permissions
|
/api/login
|
||||||
|
/api/logout
|
||||||
| Name | Child Of | Description
|
|
||||||
| --- | --- | ---
|
|
||||||
CREATE_USER |
|
|
||||||
CREATE_ROLE |
|
|
||||||
CREATE_PLAYLIST |
|
|
||||||
VIEW_PLAYLIST | EDIT_PLAYLIST
|
|
||||||
OWN_PLAYLIST |
|
|
||||||
EDIT_PLAYLIST | OWN_PLAYLIST
|
|
||||||
ACTIVATE_PLAYLIST |
|
|
||||||
|
|
||||||
|
|
||||||
### Playlists (*/api/playlists*)
|
### Playlists (*/api/playlists*)
|
||||||
|
|
||||||
*The user need to be logged in for every routes.*
|
The user need to be logged in for every routes
|
||||||
|
|
||||||
| Method | Endpoint | Permission | Description
|
| Method | Endpoint | Permission | Description
|
||||||
| --- | --- | --- | --- |
|
| --- | --- | --- | --- |
|
||||||
@ -42,24 +26,13 @@ ACTIVATE_PLAYLIST |
|
|||||||
| POST | ``/api/playlists/:id`` | EDIT_PLAYLIST | Add file to playlist
|
| POST | ``/api/playlists/:id`` | EDIT_PLAYLIST | Add file to playlist
|
||||||
| POST | ``/api/playlists/:id/order`` | EDIT_PLAYLIST | Change file order
|
| POST | ``/api/playlists/:id/order`` | EDIT_PLAYLIST | Change file order
|
||||||
| POST | ``/api/playlists/:id/seconds`` | EDIT_PLAYLIST | Change display time of a file
|
| POST | ``/api/playlists/:id/seconds`` | EDIT_PLAYLIST | Change display time of a file
|
||||||
| POST | ``/api/playlists/:id/remove_file`` | EDIT_PLAYLIST | Remove file from the playlist
|
| POST | ``/api/playlists/:id/remove_file`` | EDIT_PLAYLIST |
|
||||||
| PUT | ``/api/playlists/:id/update`` | OWN_PLAYLIST | Update properties of the playlist
|
| PUT | ``/api/playlists/:id/update`` | OWN_PLAYLIST |
|
||||||
| POST | ``/api/playlists/:id/activate`` | ACTIVATE_PLAYLIST |
|
| POST | ``/api/playlists/:id/activate`` | ACTIVATE_PLAYLIST |
|
||||||
| POST | ``/api/playlists/:id/disactivate`` | ACTIVATE_PLAYLIST |
|
| POST | ``/api/playlists/:id/disactivate`` | ACTIVATE_PLAYLIST |
|
||||||
|
|
||||||
### Users
|
### Users
|
||||||
### Playlists (*/api/playlists*)
|
|
||||||
|
|
||||||
*The user need to be logged in for every routes.*
|
|
||||||
|
|
||||||
| Method | Endpoint | Permission | Description
|
|
||||||
| --- | --- | --- | --- |
|
|
||||||
| GET | ``/api/files`` | EDIT_PLAYLIST | List all existing files
|
|
||||||
| GET | ``/api/files/:id`` | VIEW_PLAYLIST | Return the file
|
|
||||||
| POST | ``/api/files/upload`` | EDIT_PLAYLIST | Upload one or multiple files
|
|
||||||
| DELETE | ``/api/files/:id`` | OWN_PLAYLIST | Delete the file
|
|
||||||
|
|
||||||
|
|
||||||
### Roles
|
### Roles
|
||||||
|
|
||||||
### Files
|
###
|
@ -3,7 +3,6 @@ from flask_sqlalchemy import SQLAlchemy
|
|||||||
from flask_cors import CORS
|
from flask_cors import CORS
|
||||||
from flask_login import LoginManager
|
from flask_login import LoginManager
|
||||||
from os import path
|
from os import path
|
||||||
from config.config import get_secret_key
|
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
|
|
||||||
@ -16,7 +15,7 @@ def create_api():
|
|||||||
CORS(app)
|
CORS(app)
|
||||||
logging.getLogger('flask_cors').level = logging.DEBUG
|
logging.getLogger('flask_cors').level = logging.DEBUG
|
||||||
app.config['SQLALCHEMY_DATABASE_URI'] = f'sqlite:///{DB_NAME}'
|
app.config['SQLALCHEMY_DATABASE_URI'] = f'sqlite:///{DB_NAME}'
|
||||||
app.secret_key = get_secret_key()
|
app.secret_key = b'_5#y2L"F4Qfj8zxec]'
|
||||||
|
|
||||||
login_manager = LoginManager()
|
login_manager = LoginManager()
|
||||||
login_manager.init_app(app)
|
login_manager.init_app(app)
|
||||||
|
@ -3,7 +3,6 @@ from ..models import Playlist, PlaylistFile, File, Role
|
|||||||
from .. import db
|
from .. import db
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from ..dao.Playlist import PlaylistDao
|
from ..dao.Playlist import PlaylistDao
|
||||||
from ..dao.UsersDao import UsersDao
|
|
||||||
from flask_login import current_user
|
from flask_login import current_user
|
||||||
from screen.ScreenManager import ScreenManager
|
from screen.ScreenManager import ScreenManager
|
||||||
|
|
||||||
@ -51,18 +50,17 @@ class PlaylistAbl:
|
|||||||
def get_playlist(playlist_id):
|
def get_playlist(playlist_id):
|
||||||
(query, files) = PlaylistDao.get_playlist(playlist_id)
|
(query, files) = PlaylistDao.get_playlist(playlist_id)
|
||||||
query = query.as_dict_with_roles()
|
query = query.as_dict_with_roles()
|
||||||
return jsonify({
|
return jsonify({ \
|
||||||
'id': query['id'],
|
'id': query['id'], \
|
||||||
'name': query['name'],
|
'name': query['name'], \
|
||||||
'owner_id': query['owner_id'],
|
'owner_id': query['owner_id'], \
|
||||||
'view': query['view'],
|
'view': query['view'], \
|
||||||
'edit': query['edit'],
|
'edit': query['edit'], \
|
||||||
'files': files})
|
'files': files})
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def list():
|
def list():
|
||||||
user_id = current_user.as_dict()['id']
|
playlists = db.session.query(Playlist).all()
|
||||||
playlists = UsersDao.playlists(user_id)
|
|
||||||
res = []
|
res = []
|
||||||
for playlist in playlists:
|
for playlist in playlists:
|
||||||
p = playlist.as_dict()
|
p = playlist.as_dict()
|
||||||
@ -75,11 +73,11 @@ class PlaylistAbl:
|
|||||||
# EDIT PLAYLIST CONTENT
|
# EDIT PLAYLIST CONTENT
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def add_file(playlist_id, data):
|
def add_file(playlist_id, data):
|
||||||
new_playlist_file = PlaylistFile(
|
new_playlist_file = PlaylistFile( \
|
||||||
playlist_id=playlist_id,
|
playlist_id=playlist_id, \
|
||||||
file_id=data['file_id'],
|
file_id=data['file_id'], \
|
||||||
position=data['position'],
|
position=data['position'], \
|
||||||
seconds=data['seconds']
|
seconds=data['seconds'] \
|
||||||
)
|
)
|
||||||
|
|
||||||
db.session.add(new_playlist_file)
|
db.session.add(new_playlist_file)
|
||||||
@ -89,7 +87,7 @@ class PlaylistAbl:
|
|||||||
@staticmethod
|
@staticmethod
|
||||||
def change_order(playlist_id, data):
|
def change_order(playlist_id, data):
|
||||||
db.session.query(PlaylistFile) \
|
db.session.query(PlaylistFile) \
|
||||||
.filter(PlaylistFile.id == data['pfid']) \
|
.filter(PlaylistFile.file_id == data['file_id']) \
|
||||||
.filter(PlaylistFile.playlist_id == playlist_id) \
|
.filter(PlaylistFile.playlist_id == playlist_id) \
|
||||||
.update({'position': data['position']})
|
.update({'position': data['position']})
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
@ -98,7 +96,7 @@ class PlaylistAbl:
|
|||||||
@staticmethod
|
@staticmethod
|
||||||
def change_seconds(playlist_id, data):
|
def change_seconds(playlist_id, data):
|
||||||
db.session.query(PlaylistFile) \
|
db.session.query(PlaylistFile) \
|
||||||
.filter(PlaylistFile.id == data['pfid']) \
|
.filter(PlaylistFile.file_id == data['file_id']) \
|
||||||
.filter(PlaylistFile.playlist_id == playlist_id) \
|
.filter(PlaylistFile.playlist_id == playlist_id) \
|
||||||
.update({'seconds': data['seconds']})
|
.update({'seconds': data['seconds']})
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
@ -107,7 +105,7 @@ class PlaylistAbl:
|
|||||||
@staticmethod
|
@staticmethod
|
||||||
def remove_file(playlist_id, data):
|
def remove_file(playlist_id, data):
|
||||||
query = db.session.query(PlaylistFile) \
|
query = db.session.query(PlaylistFile) \
|
||||||
.filter(PlaylistFile.id == data['pfid']) \
|
.filter(PlaylistFile.id == data['file_id']) \
|
||||||
.first()
|
.first()
|
||||||
db.session.delete(query)
|
db.session.delete(query)
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
|
@ -1,13 +1,13 @@
|
|||||||
from flask import Blueprint, request, jsonify
|
from flask import Blueprint, request, jsonify
|
||||||
from werkzeug.security import check_password_hash
|
from werkzeug.security import generate_password_hash, check_password_hash
|
||||||
from flask_login import current_user
|
from flask_login import current_user
|
||||||
from ..models import User, Role
|
from ..models import User, Role
|
||||||
from api.dao.UsersDao import UsersDao
|
|
||||||
from .. import db
|
from .. import db
|
||||||
|
|
||||||
def is_current_admin():
|
def is_current_admin():
|
||||||
return current_user.as_dict()['roles'][0]['parent_id'] is None
|
return current_user.as_dict()['roles'][0]['parent_id'] is None
|
||||||
|
|
||||||
|
|
||||||
class UserAbl:
|
class UserAbl:
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
@ -27,14 +27,30 @@ class UserAbl:
|
|||||||
if bit == '1' and bit != user_perms[position]:
|
if bit == '1' and bit != user_perms[position]:
|
||||||
return jsonify(message="You don't have the permission to give permission(s) you don't have"), 403
|
return jsonify(message="You don't have the permission to give permission(s) you don't have"), 403
|
||||||
|
|
||||||
# create user
|
# create the user
|
||||||
new_user = UsersDao.create(login, password, permissions, current_user)
|
new_user = User( \
|
||||||
|
login=login, \
|
||||||
|
password=generate_password_hash(password, method='sha256') \
|
||||||
|
)
|
||||||
|
|
||||||
|
db.session.add(new_user)
|
||||||
|
db.session.flush()
|
||||||
|
|
||||||
|
# create the permissions for the user
|
||||||
|
new_role = Role( \
|
||||||
|
name=login, \
|
||||||
|
user_id=new_user.as_dict()['id'], \
|
||||||
|
parent_id=current_user.as_dict()['roles'][0]['id'], \
|
||||||
|
permissions=permissions)
|
||||||
|
db.session.add(new_role)
|
||||||
|
new_user.roles.append(new_role)
|
||||||
|
db.session.flush()
|
||||||
|
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
return jsonify(new_user.as_dict())
|
return jsonify(new_user.as_dict())
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def update(user_id, data):
|
def update(user_id, data):
|
||||||
# todo
|
|
||||||
return jsonify()
|
return jsonify()
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
|
@ -1,15 +1,11 @@
|
|||||||
from flask import Blueprint, request, jsonify, send_file
|
from flask import Blueprint, request, jsonify, send_file
|
||||||
from flask_login import login_required
|
|
||||||
from ..permissions import Perm, permissions
|
|
||||||
from ..models import File
|
from ..models import File
|
||||||
from .. import db
|
from .. import db
|
||||||
|
|
||||||
files = Blueprint('files', __name__)
|
files = Blueprint('files', __name__)
|
||||||
FILE_DIR = '../data/'
|
FILE_DIR = './data/'
|
||||||
|
|
||||||
@files.route('/files', methods=['POST'])
|
@files.route('/files', methods=['POST'])
|
||||||
@login_required
|
|
||||||
@permissions.require([Perm.EDIT_PLAYLIST])
|
|
||||||
def upload():
|
def upload():
|
||||||
res = []
|
res = []
|
||||||
for file_key in request.files:
|
for file_key in request.files:
|
||||||
@ -26,8 +22,6 @@ def upload():
|
|||||||
return jsonify(res)
|
return jsonify(res)
|
||||||
|
|
||||||
@files.route('/files', methods=['GET'])
|
@files.route('/files', methods=['GET'])
|
||||||
@login_required
|
|
||||||
@permissions.require([Perm.EDIT_PLAYLIST])
|
|
||||||
def list():
|
def list():
|
||||||
files = db.session.query(File).all()
|
files = db.session.query(File).all()
|
||||||
res = []
|
res = []
|
||||||
@ -36,17 +30,12 @@ def list():
|
|||||||
return jsonify(res)
|
return jsonify(res)
|
||||||
|
|
||||||
@files.route('/files/<int:file_id>', methods=['GET'])
|
@files.route('/files/<int:file_id>', methods=['GET'])
|
||||||
@login_required
|
|
||||||
@permissions.require([Perm.VIEW_PLAYLIST])
|
|
||||||
def load(file_id):
|
def load(file_id):
|
||||||
file = db.session.query(File).filter(File.id == file_id).first()
|
file = db.session.query(File).filter(File.id == file_id).first()
|
||||||
return send_file(('../../data/' + file.name), mimetype=file.type)
|
return send_file(('../../data/' + file.name), mimetype=file.type)
|
||||||
|
|
||||||
@files.route('/files/<int:file_id>', methods=['DELETE'])
|
@files.route('/files/<int:file_id>', methods=['DELETE'])
|
||||||
@login_required
|
|
||||||
@permissions.require([Perm.OWN_PLAYLIST])
|
|
||||||
def delete(file_id):
|
def delete(file_id):
|
||||||
# todo warning if file is still in use
|
|
||||||
rows = db.session.query(File).filter(File.id == file_id).all()
|
rows = db.session.query(File).filter(File.id == file_id).all()
|
||||||
for row in rows:
|
for row in rows:
|
||||||
db.session.delete(row)
|
db.session.delete(row)
|
||||||
|
@ -20,7 +20,6 @@ def create():
|
|||||||
|
|
||||||
@playlist.route('/playlists', methods=["GET"])
|
@playlist.route('/playlists', methods=["GET"])
|
||||||
@login_required
|
@login_required
|
||||||
@permissions.require([Perm.VIEW_PLAYLIST])
|
|
||||||
def list():
|
def list():
|
||||||
return PlaylistAbl.list()
|
return PlaylistAbl.list()
|
||||||
|
|
||||||
|
@ -1,15 +0,0 @@
|
|||||||
from .. import db
|
|
||||||
from ..models import User, Role, Playlist, ParentRole
|
|
||||||
|
|
||||||
class ParentRoleDao:
|
|
||||||
def get_children(role_id):
|
|
||||||
children = db.session.query(ParentRole) \
|
|
||||||
.filter(ParentRole.parent_id == role_id) \
|
|
||||||
.all()
|
|
||||||
return children
|
|
||||||
|
|
||||||
def get_parents(role_id):
|
|
||||||
parents = db.session.query(ParentRole) \
|
|
||||||
.filter(ParentRole.child_id == role_id) \
|
|
||||||
.all()
|
|
||||||
return parents
|
|
@ -13,32 +13,3 @@ class PlaylistDao:
|
|||||||
files.append(file)
|
files.append(file)
|
||||||
|
|
||||||
return (query, files)
|
return (query, files)
|
||||||
|
|
||||||
def get_playlist_q(playlist_id):
|
|
||||||
query = db.session.query(Playlist).filter(Playlist.id == playlist_id).first()
|
|
||||||
return query
|
|
||||||
|
|
||||||
def has_role_view_d(playlist_id, user_id):
|
|
||||||
has_role_to_view = db.session.query(Playlist) \
|
|
||||||
.filter(Playlist.id == playlist_id) \
|
|
||||||
.filter(
|
|
||||||
Playlist.view.any(
|
|
||||||
# check if a role belongs to this user
|
|
||||||
Role.user_id == user_id or
|
|
||||||
# check if a this user has a role to view
|
|
||||||
Role.users.any(User.id == user_id)
|
|
||||||
)) \
|
|
||||||
.first()
|
|
||||||
return has_role_to_view
|
|
||||||
|
|
||||||
def has_role_edit_d(playlist_id, user_id):
|
|
||||||
has_role_to_edit = db.session.query(Playlist) \
|
|
||||||
.filter(
|
|
||||||
Playlist.edit.any(
|
|
||||||
# check if a role belongs to this user
|
|
||||||
Role.user_id == user_id or
|
|
||||||
# check if a this user has a role to edit
|
|
||||||
Role.users.any(User.id == user_id)
|
|
||||||
)) \
|
|
||||||
.first()
|
|
||||||
return has_role_to_edit
|
|
||||||
|
@ -1,31 +0,0 @@
|
|||||||
from .. import db
|
|
||||||
from ..models import User, Role, Playlist, ParentRole
|
|
||||||
from .ParentRoleDao import ParentRoleDao
|
|
||||||
|
|
||||||
class RolesDao:
|
|
||||||
|
|
||||||
def create(name, user_id, parent_id, permissions):
|
|
||||||
new_role = Role(
|
|
||||||
name=name,
|
|
||||||
user_id=user_id,
|
|
||||||
parent_id=parent_id,
|
|
||||||
permissions=permissions)
|
|
||||||
db.session.add(new_role)
|
|
||||||
|
|
||||||
# get all parents
|
|
||||||
parents = ParentRoleDao.get_parents(parent_id)
|
|
||||||
parent_ids = [parent_id]
|
|
||||||
for parent in parents:
|
|
||||||
parent_ids.append(parent.as_dict()['parent_id'])
|
|
||||||
|
|
||||||
# add all parents
|
|
||||||
for id in parent_ids:
|
|
||||||
parent_role = ParentRole(
|
|
||||||
parent_id=id,
|
|
||||||
child_id=user_id
|
|
||||||
)
|
|
||||||
db.session.add(parent_role)
|
|
||||||
|
|
||||||
db.session.flush()
|
|
||||||
return new_role
|
|
||||||
|
|
@ -1,74 +0,0 @@
|
|||||||
from .. import db
|
|
||||||
from werkzeug.security import generate_password_hash, check_password_hash
|
|
||||||
from ..models import User, Role, Playlist
|
|
||||||
from .RolesDao import RolesDao
|
|
||||||
|
|
||||||
class UsersDao:
|
|
||||||
|
|
||||||
def create(login, password, permissions, current_user):
|
|
||||||
# create the user
|
|
||||||
new_user = User(
|
|
||||||
login=login,
|
|
||||||
password=generate_password_hash(password, method='sha256')
|
|
||||||
)
|
|
||||||
|
|
||||||
db.session.add(new_user)
|
|
||||||
db.session.flush()
|
|
||||||
|
|
||||||
# create role for the user
|
|
||||||
new_role = RolesDao.create(
|
|
||||||
name=login,
|
|
||||||
user_id=new_user.as_dict()['id'],
|
|
||||||
parent_id=current_user.as_dict()['roles'][0]['id'],
|
|
||||||
permissions=permissions)
|
|
||||||
|
|
||||||
new_user.roles.append(new_role)
|
|
||||||
db.session.flush()
|
|
||||||
return new_user
|
|
||||||
|
|
||||||
|
|
||||||
def has_role_view_q(user_id):
|
|
||||||
has_role_to_view = db.session.query(User) \
|
|
||||||
.filter(User.id == user_id) \
|
|
||||||
.filter(
|
|
||||||
User.roles.any(
|
|
||||||
Role.users.any(Role.playlists_view is not None)
|
|
||||||
)) \
|
|
||||||
.first()
|
|
||||||
return has_role_to_view
|
|
||||||
|
|
||||||
def has_role_edit_q(user_id):
|
|
||||||
has_role_to_edit = db.session.query(User) \
|
|
||||||
.filter(User.id == user_id) \
|
|
||||||
.filter(
|
|
||||||
User.roles.any(
|
|
||||||
Role.users.any(Role.playlists_edit is not None)
|
|
||||||
)) \
|
|
||||||
.first()
|
|
||||||
return has_role_to_edit
|
|
||||||
|
|
||||||
def playlists(user_id):
|
|
||||||
# todo recursion on user parenting
|
|
||||||
playlists = db.session.query(Playlist) \
|
|
||||||
.filter(
|
|
||||||
# all playlist where user can view
|
|
||||||
Playlist.view.any(
|
|
||||||
# check if a role belongs to this user
|
|
||||||
Role.user_id == user_id or
|
|
||||||
# check if a this user has a role to view
|
|
||||||
Role.users.any(User.id == user_id) \
|
|
||||||
) |
|
|
||||||
# all playlist where user can edit
|
|
||||||
Playlist.edit.any(
|
|
||||||
# check if a role belongs to this user
|
|
||||||
Role.user_id == user_id or
|
|
||||||
# check if a this user has a role to edit
|
|
||||||
Role.users.any(User.id == user_id)
|
|
||||||
|
|
||||||
) |
|
|
||||||
(Playlist.owner_id == user_id)
|
|
||||||
) \
|
|
||||||
.all()
|
|
||||||
return playlists
|
|
||||||
|
|
||||||
|
|
@ -55,36 +55,16 @@ class UserRole(db.Model):
|
|||||||
user_id = db.Column(db.Integer, db.ForeignKey('user.id'), primary_key=True)
|
user_id = db.Column(db.Integer, db.ForeignKey('user.id'), primary_key=True)
|
||||||
role_id = db.Column(db.Integer, db.ForeignKey('role.id'), primary_key=True)
|
role_id = db.Column(db.Integer, db.ForeignKey('role.id'), primary_key=True)
|
||||||
|
|
||||||
class ParentRole(db.Model):
|
|
||||||
__tablename__ = 'ParentRole'
|
|
||||||
parent_id = db.Column(db.Integer, db.ForeignKey('role.id'), primary_key=True)
|
|
||||||
child_id = db.Column(db.Integer, db.ForeignKey('role.id'), primary_key=True)
|
|
||||||
|
|
||||||
def as_dict(self):
|
|
||||||
return {c.name: getattr(self, c.name) for c in self.__table__.columns}
|
|
||||||
|
|
||||||
|
|
||||||
class Role(db.Model):
|
class Role(db.Model):
|
||||||
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
|
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
|
||||||
name = db.Column(db.String)
|
name = db.Column(db.String)
|
||||||
user_id = db.Column(db.Integer, db.ForeignKey('user.id'), default=None)
|
user_id = db.Column(db.Integer, db.ForeignKey('user.id'), default=None)
|
||||||
permissions = db.Column(db.Integer, default=0)
|
permissions = db.Column(db.Integer, default=0)
|
||||||
parent_id = db.Column(db.Integer, db.ForeignKey('role.id'), default=None)
|
parent_id = db.Column(db.Integer, db.ForeignKey('role.id'), default=None)
|
||||||
children = db.relationship('Role', secondary="ParentRole",
|
|
||||||
primaryjoin=id == ParentRole.parent_id,
|
|
||||||
secondaryjoin=id == ParentRole.child_id,
|
|
||||||
backref='parents')
|
|
||||||
|
|
||||||
users = db.relationship('User', secondary='UserRole', back_populates='roles')
|
users = db.relationship('User', secondary='UserRole', back_populates='roles')
|
||||||
playlists_view = db.relationship('Playlist', secondary='PlaylistView', back_populates='view')
|
playlists_view = db.relationship('Playlist', secondary='PlaylistView', back_populates='view')
|
||||||
playlists_edit = db.relationship('Playlist', secondary='PlaylistEdit', back_populates='edit')
|
playlists_edit = db.relationship('Playlist', secondary='PlaylistEdit', back_populates='edit')
|
||||||
|
|
||||||
def as_full_dict(self):
|
|
||||||
res = self.as_dict()
|
|
||||||
res['parents'] = [parent.as_dict() for parent in self.parents]
|
|
||||||
res['children'] = [child.as_dict() for child in self.children]
|
|
||||||
return res
|
|
||||||
|
|
||||||
def as_dict(self):
|
def as_dict(self):
|
||||||
return {c.name: getattr(self, c.name) for c in self.__table__.columns}
|
return {c.name: getattr(self, c.name) for c in self.__table__.columns}
|
||||||
|
|
||||||
@ -96,7 +76,7 @@ class User(db.Model, UserMixin):
|
|||||||
|
|
||||||
def as_dict(self):
|
def as_dict(self):
|
||||||
res = self.as_dict_unsafe()
|
res = self.as_dict_unsafe()
|
||||||
res['roles'] = [role.as_full_dict() for role in self.roles]
|
res['roles'] = [role.as_dict() for role in self.roles]
|
||||||
del res['password']
|
del res['password']
|
||||||
return res
|
return res
|
||||||
|
|
||||||
|
@ -4,9 +4,6 @@ from flask import request, jsonify
|
|||||||
from flask_login import current_user
|
from flask_login import current_user
|
||||||
from . import db
|
from . import db
|
||||||
from .models import Playlist, PlaylistFile, User, Role, UserRole
|
from .models import Playlist, PlaylistFile, User, Role, UserRole
|
||||||
from .dao.Playlist import PlaylistDao
|
|
||||||
from .dao.UsersDao import UsersDao
|
|
||||||
|
|
||||||
|
|
||||||
class Perm(IntEnum):
|
class Perm(IntEnum):
|
||||||
CREATE_USER = 0
|
CREATE_USER = 0
|
||||||
@ -29,7 +26,7 @@ class permissions:
|
|||||||
check_perm = CheckPermissionFactory(perm)
|
check_perm = CheckPermissionFactory(perm)
|
||||||
print(args, kwargs)
|
print(args, kwargs)
|
||||||
if not check_perm.is_valid(kwargs):
|
if not check_perm.is_valid(kwargs):
|
||||||
return jsonify(
|
return jsonify( \
|
||||||
message=check_perm.message), \
|
message=check_perm.message), \
|
||||||
check_perm.status_code
|
check_perm.status_code
|
||||||
return func(*args, **kwargs)
|
return func(*args, **kwargs)
|
||||||
@ -62,10 +59,11 @@ def CheckPermissionFactory(perm):
|
|||||||
def get_playlist_id(args):
|
def get_playlist_id(args):
|
||||||
if 'playlist_id' in args:
|
if 'playlist_id' in args:
|
||||||
return args['playlist_id']
|
return args['playlist_id']
|
||||||
json = request.get_json(silent=True)
|
json = request.get_json()
|
||||||
if json is not None and 'playlist_id' in json:
|
if 'playlist_id' in json:
|
||||||
|
print("in")
|
||||||
return json['playlist_id']
|
return json['playlist_id']
|
||||||
return None
|
return
|
||||||
|
|
||||||
def checkBit(permissions, index):
|
def checkBit(permissions, index):
|
||||||
binStr = bin(permissions)
|
binStr = bin(permissions)
|
||||||
@ -86,14 +84,12 @@ class CheckOwnPlaylist:
|
|||||||
|
|
||||||
def is_valid(self, args):
|
def is_valid(self, args):
|
||||||
playlist_id = get_playlist_id(args)
|
playlist_id = get_playlist_id(args)
|
||||||
if playlist_id is None:
|
query = db.session.query(Playlist).filter(Playlist.id == playlist_id).first()
|
||||||
return False
|
|
||||||
|
|
||||||
query = PlaylistDao.get_playlist_q(playlist_id)
|
|
||||||
if query is None:
|
if query is None:
|
||||||
self.message = "This playlist doesn't exist"
|
self.message = "This playlist doesn't exist"
|
||||||
self.status_code = 404
|
self.status_code = 404
|
||||||
return False
|
return False
|
||||||
|
print(query.as_dict())
|
||||||
return query.as_dict()['owner_id'] == current_user.as_dict()['id']
|
return query.as_dict()['owner_id'] == current_user.as_dict()['id']
|
||||||
|
|
||||||
class CheckViewPlaylist:
|
class CheckViewPlaylist:
|
||||||
@ -113,18 +109,15 @@ class CheckViewPlaylist:
|
|||||||
|
|
||||||
playlist_id = get_playlist_id(args)
|
playlist_id = get_playlist_id(args)
|
||||||
user_id = current_user.as_dict()['id']
|
user_id = current_user.as_dict()['id']
|
||||||
|
has_role_to_view = db.session.query(Playlist) \
|
||||||
# if playlist_id is none then there is not precise playlist
|
.filter( \
|
||||||
# to compare the permissions, so we check if the user has
|
Playlist.view.any( \
|
||||||
# a permission on any playlist
|
# check if a role belongs to this user
|
||||||
has_role_to_view = None
|
Role.user_id == user_id or \
|
||||||
if playlist_id is not None:
|
# check if a this user has a role to view
|
||||||
# check if has role on one precise playlist
|
Role.users.any(User.id == user_id) \
|
||||||
has_role_to_view = PlaylistDao.has_role_to_view(playlist_id, user_id)
|
)) \
|
||||||
else:
|
.first()
|
||||||
# check if has role to view any playlist
|
|
||||||
has_role_to_view = UsersDao.has_role_view_q(user_id)
|
|
||||||
|
|
||||||
return has_role_to_view is not None
|
return has_role_to_view is not None
|
||||||
|
|
||||||
class CheckEditPlaylist:
|
class CheckEditPlaylist:
|
||||||
@ -143,18 +136,15 @@ class CheckEditPlaylist:
|
|||||||
|
|
||||||
playlist_id = get_playlist_id(args)
|
playlist_id = get_playlist_id(args)
|
||||||
user_id = current_user.as_dict()['id']
|
user_id = current_user.as_dict()['id']
|
||||||
|
has_role_to_edit = db.session.query(Playlist) \
|
||||||
# if playlist_id is none then there is not precise playlist
|
.filter( \
|
||||||
# to compare the permissions, so we check if the user has
|
Playlist.edit.any( \
|
||||||
# a permission on any playlist
|
# check if a role belongs to this user
|
||||||
has_role_to_edit = None
|
Role.user_id == user_id or \
|
||||||
if playlist_id is not None:
|
# check if a this user has a role to edit
|
||||||
# check if has role on one precise playlist
|
Role.users.any(User.id == user_id) \
|
||||||
has_role_to_edit = PlaylistDao.has_role_to_edit(playlist_id, user_id)
|
)) \
|
||||||
else:
|
.first()
|
||||||
# check if has role to view any playlist
|
|
||||||
has_role_to_edit = UsersDao.has_role_edit_q(user_id)
|
|
||||||
|
|
||||||
return has_role_to_edit is not None
|
return has_role_to_edit is not None
|
||||||
|
|
||||||
class CheckCreateUser:
|
class CheckCreateUser:
|
||||||
|
@ -1 +0,0 @@
|
|||||||
b'Dn\xe2\x96\xd9\xe7Z;\xd7;\x03\xbe\xa8J\xc7\xda\xd2\xe6\xfa\xe6HU( '
|
|
@ -1,19 +0,0 @@
|
|||||||
import os
|
|
||||||
import random
|
|
||||||
import string
|
|
||||||
|
|
||||||
SECRET_KEY_FILE = './config/SECRET_KEY'
|
|
||||||
|
|
||||||
def get_secret_key():
|
|
||||||
if os.path.isfile(SECRET_KEY_FILE):
|
|
||||||
# read the secret key from the file
|
|
||||||
with open(SECRET_KEY_FILE, 'r') as file:
|
|
||||||
secret_key = file.read().strip()
|
|
||||||
return secret_key
|
|
||||||
else:
|
|
||||||
# generate a new secret key
|
|
||||||
secret_key = os.urandom(24)
|
|
||||||
# save it to the file
|
|
||||||
with open(SECRET_KEY_FILE, 'w') as file:
|
|
||||||
file.write(str(secret_key))
|
|
||||||
return secret_key
|
|
10
src/index.py
10
src/index.py
@ -1,16 +1,12 @@
|
|||||||
from api import create_api
|
from api import create_api
|
||||||
from screen.ScreenManager import ScreenManager
|
from screen.ScreenManager import ScreenManager
|
||||||
|
|
||||||
api = create_api()
|
#api = create_api()
|
||||||
screen_manager = ScreenManager().getInstance()
|
#screen_manager = ScreenManager().getInstance()
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
#api.run(host="0.0.0.0", port=5500, debug=True)
|
#api.run(host="0.0.0.0", port=5500, debug=True)
|
||||||
#api.run()
|
#api.run(host="0.0.0.0", port=5500)
|
||||||
|
|
||||||
api.run(host="0.0.0.0", port=5500)
|
|
||||||
|
|
||||||
def test():
|
|
||||||
from screen.SlideShow import SlideShow
|
from screen.SlideShow import SlideShow
|
||||||
import tkinter as tk
|
import tkinter as tk
|
||||||
import mpv
|
import mpv
|
||||||
|
@ -7,8 +7,6 @@ import imageio
|
|||||||
import vlc
|
import vlc
|
||||||
import mpv
|
import mpv
|
||||||
|
|
||||||
DATA_DIR = "../data/"
|
|
||||||
|
|
||||||
class SlideShow:
|
class SlideShow:
|
||||||
def __init__(self, root, files):
|
def __init__(self, root, files):
|
||||||
print(files)
|
print(files)
|
||||||
@ -64,7 +62,7 @@ class MediaFactory:
|
|||||||
|
|
||||||
def image_player(self):
|
def image_player(self):
|
||||||
print("image player")
|
print("image player")
|
||||||
path = DATA_DIR + self.file['name']
|
path = './data/' + self.file['name']
|
||||||
image = Image.open(path)
|
image = Image.open(path)
|
||||||
|
|
||||||
image = self.parent.resize_full_screen(image)
|
image = self.parent.resize_full_screen(image)
|
||||||
@ -80,7 +78,7 @@ class VideoPlayer:
|
|||||||
def __init__(self, parent, file):
|
def __init__(self, parent, file):
|
||||||
self.file = file
|
self.file = file
|
||||||
self.parent = parent
|
self.parent = parent
|
||||||
self.path = DATA_DIR + self.file['name']
|
self.path = './data/' + self.file['name']
|
||||||
#self.mpv_instance = mpv.MPV(wid=str(self.parent.canvas.winfo_id()))
|
#self.mpv_instance = mpv.MPV(wid=str(self.parent.canvas.winfo_id()))
|
||||||
instance = vlc.Instance()
|
instance = vlc.Instance()
|
||||||
player = instance.media_player_new()
|
player = instance.media_player_new()
|
||||||
|
Loading…
Reference in New Issue
Block a user