feat: admin panel

This commit is contained in:
2023-11-25 08:38:04 +03:00
parent 75a71953f1
commit 430cfad277
6 changed files with 103 additions and 3 deletions

View File

@@ -6,3 +6,4 @@ from routes.assembly import assembly_blueprint
from routes.general import general_blueprint
from routes.application import application_blueprint
from routes.sipro import sipro_blueprint
from routes.admin import admin_blueprint

89
routes/admin.py Normal file
View File

@@ -0,0 +1,89 @@
import json
from flask import Blueprint, request, make_response, jsonify
from flask_jwt_extended import get_jwt_identity, verify_jwt_in_request
from werkzeug.security import generate_password_hash
import database
import sipro.api.general
admin_blueprint = Blueprint('admin', __name__)
@admin_blueprint.before_request
def admin_check():
if request.method == 'OPTIONS':
return
if not verify_jwt_in_request(optional=True):
return {'error': 'Unauthorized'}, 401
user_id = get_jwt_identity()
is_admin = database.db.session.get(database.User, user_id).is_admin
if not is_admin:
return {'error': 'Unauthorized'}, 401
def format_user(user: database.User):
return {
'id': user.id,
'login': user.login,
'city_id': user.city_id,
'is_admin': user.is_admin
}
@admin_blueprint.get('/ping')
def ping():
return {"response": "pong"}
@admin_blueprint.get('/user')
def get_users():
response = make_response(jsonify(
[format_user(user) for user in database.User.query.all()]
))
response.headers['Content-Range'] = 'user 0-1/1'
return response
@admin_blueprint.get('/user/<int:user_id>')
def get_user(user_id):
user = database.db.session.get(database.User, user_id)
return format_user(user)
@admin_blueprint.put('/user/<int:user_id>')
def put_user(user_id):
params: dict = request.json
password = params.get('password').strip()
if password:
params['password_hash'] = generate_password_hash(password)
del params['password']
database.db.session.bulk_update_mappings(database.User, [params])
database.db.session.commit()
user = database.db.session.get(database.User, user_id)
return format_user(user)
@admin_blueprint.get('/city')
def get_cities():
filters = request.args.get('filter')
if filters:
filters = json.loads(filters)
else:
filters = {}
cities = sipro.api.general.get_cities()
for key, value in filters.items():
match key:
case 'id':
cities = list(filter(lambda city: city['id'] in value, cities))
total_cities = len(cities)
range_start, range_end = 0, total_cities - 1
range_raw = request.args.get('range')
if range_raw:
range_start, range_end = json.loads(range_raw)
cities = cities[range_start:range_end + 1]
response = make_response(jsonify(cities))
response.headers['Content-Range'] = f'city {range_start}-{range_end}/{total_cities}'
return response

View File

@@ -1,4 +1,7 @@
import database
from flask import Blueprint, jsonify, request
from flask_jwt_extended import get_jwt_identity
from routes.utils import jwt_protect_blueprint
import sipro.api.orders
@@ -30,8 +33,10 @@ def get_orders():
@orders_blueprint.get('/getByProductId')
def get_orders_by_supplier_product_id():
#user_id = get_jwt_identity()
#city_id = database.db.session.get(database.User, user_id).city_id
params = dict(request.args)
# product_id = args.get('productId')
#params['city'] = city_id
return sipro.api.orders.get_orders_from_barcode(params=params)