backend+ telegram: регистрация переведена на классы

This commit is contained in:
2022-11-18 18:27:53 +03:00
parent 82dfc158e9
commit 210938fd78
10 changed files with 94 additions and 49 deletions

View File

@@ -16,10 +16,10 @@ admin = Admin(name="TextSouls")
with open("textsouls/config.json") as config_file:
config_data = json.load(config_file)
main_settings = config_data["main_settings"]
main_settings = config_data["MAIN_SETTINGS"]
app.config.update(main_settings)
db_settings = config_data["db_settings"]
db_settings = config_data["DB_SETTINGS"]
app.config.update(db_settings)
admin.init_app(app)

View File

@@ -7,4 +7,12 @@ from textsouls.models import User
ts_admin = Blueprint("ts_admin", __name__)
admin.add_view(ModelView(User, db.session))
class AdminView(ModelView):
def __init__(self, model, *args, **kwargs):
self.column_list = [c.key for c in model.__table__.columns]
self.form_columns = self.column_list
super(AdminView, self).__init__(model, *args, **kwargs)
admin.add_view(AdminView(User, db.session))

View File

@@ -1,9 +1,9 @@
{
"main_settings": {
"MAIN_SETTINGS": {
"SECRET_KEY": "some-very-secret-key",
"SQLALCHEMY_TRACK_MODIFICATIONS": false
},
"db_settings": {
"DB_SETTINGS": {
"SQLALCHEMY_DATABASE_URI": "mysql+pymysql://ownername:pass@localhost/textsouls"
}
}

View File

@@ -1,5 +1,7 @@
from flask import Blueprint
from flask import request
from flask import jsonify
from flask.views import MethodView
from . import db
from textsouls.models import User
@@ -7,34 +9,67 @@ from textsouls.models import User
main = Blueprint("main", __name__)
@main.route("/")
def index():
return "Nice!", 200
class ItemAPI(MethodView):
init_every_request = False
def __init__(self, model):
self.model = model
@main.route("/registration", methods=["POST"])
def registration():
data = request.get_json()
def _get_item(self, id):
return self.model.query.get_or_404(id)
tg_id = data.get("tg_id")
first_name = data.get("first_name")
last_name = data.get("last_name")
username = data.get("username")
def get(self, id):
item = self._get_item(id)
return item.to_dict()
existed_user = User.query.filter_by(tg_id=tg_id).first()
def patch(self, id):
item = self._get_item(id)
errors = self.validator.validate(item, request.json)
if not existed_user:
new_user = User(
tg_id=tg_id,
first_name=first_name,
last_name=last_name,
username=username,
)
if errors:
return jsonify(errors), 400
db.session.add(new_user)
item.update_from_json(request.json)
db.session.commit()
return item.to_dict()
return {"created": True, "id": new_user.id}
def delete(self, id):
item = self._get_item(id)
db.session.delete(item)
db.session.commit()
return "", 200
else:
return {"created": False, "id": existed_user.id}
class ListAPI(MethodView):
init_every_request = False
def __init__(self, model):
self.model = model
def _get_item(self, id):
return self.model.query.filter_by(id=id).first()
def get(self):
items = self.model.query.all()
return jsonify([item.to_dict() for item in items])
def post(self):
item = self._get_item(request.json["id"])
if item:
return "Already exists!", 400
db.session.add(self.model(**request.json))
db.session.commit()
return "", 200
def register_api(app, model, name):
item = ItemAPI.as_view(f"{name}-item", model)
group = ListAPI.as_view(f"{name}-list", model)
app.add_url_rule(f"/{name}/<int:id>", view_func=item)
app.add_url_rule(f"/{name}/", view_func=group)
register_api(main, User, "users")

View File

@@ -1,16 +1,17 @@
import datetime
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy_serializer import SerializerMixin
db = SQLAlchemy()
class User(db.Model):
class User(db.Model, SerializerMixin):
__tablename__ = "users"
id = db.Column(db.Integer, primary_key=True)
tg_id = db.Column(db.Integer, unique=True, nullable=False)
id = db.Column(db.Integer, primary_key=True, autoincrement=False)
first_name = db.Column(db.String(255), nullable=True)
last_name = db.Column(db.String(255), nullable=True)
username = db.Column(db.String(255), nullable=False)