mirror of
https://github.com/Llloooggg/TextSouls.git
synced 2026-03-06 04:26:23 +03:00
backend: теперь универсальные вью принимают параметр для фильтрации
This commit is contained in:
32
backend/migrations/versions/c42d8e7674e6_.py
Normal file
32
backend/migrations/versions/c42d8e7674e6_.py
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
"""empty message
|
||||||
|
|
||||||
|
Revision ID: c42d8e7674e6
|
||||||
|
Revises: 02142c549a8c
|
||||||
|
Create Date: 2022-11-19 02:48:49.436977
|
||||||
|
|
||||||
|
"""
|
||||||
|
from alembic import op
|
||||||
|
import sqlalchemy as sa
|
||||||
|
|
||||||
|
|
||||||
|
# revision identifiers, used by Alembic.
|
||||||
|
revision = 'c42d8e7674e6'
|
||||||
|
down_revision = '02142c549a8c'
|
||||||
|
branch_labels = None
|
||||||
|
depends_on = None
|
||||||
|
|
||||||
|
|
||||||
|
def upgrade():
|
||||||
|
# ### commands auto generated by Alembic - please adjust! ###
|
||||||
|
with op.batch_alter_table('characters', schema=None) as batch_op:
|
||||||
|
batch_op.create_unique_constraint(None, ['owner'])
|
||||||
|
|
||||||
|
# ### end Alembic commands ###
|
||||||
|
|
||||||
|
|
||||||
|
def downgrade():
|
||||||
|
# ### commands auto generated by Alembic - please adjust! ###
|
||||||
|
with op.batch_alter_table('characters', schema=None) as batch_op:
|
||||||
|
batch_op.drop_constraint(None, type_='unique')
|
||||||
|
|
||||||
|
# ### end Alembic commands ###
|
||||||
@@ -1,25 +1,27 @@
|
|||||||
from .. import db
|
from .. import db
|
||||||
|
|
||||||
from flask import request
|
from flask import request
|
||||||
from flask import jsonify
|
|
||||||
from flask.views import MethodView
|
from flask.views import MethodView
|
||||||
|
|
||||||
|
|
||||||
class ItemAPI(MethodView):
|
class ItemAPI(MethodView):
|
||||||
init_every_request = False
|
init_every_request = False
|
||||||
|
|
||||||
def __init__(self, model):
|
def __init__(self, model, filter_field):
|
||||||
self.model = model
|
self.model = model
|
||||||
|
self.filter_field = filter_field
|
||||||
|
|
||||||
def _get_item(self, id):
|
def _get_item(self, field_value):
|
||||||
return self.model.query.get_or_404(id)
|
return self.model.query.filter(
|
||||||
|
getattr(self.model, self.filter_field) == field_value
|
||||||
|
).first()
|
||||||
|
|
||||||
def get(self, id):
|
def get(self, field_value):
|
||||||
item = self._get_item(id)
|
item = self._get_item(field_value)
|
||||||
return item.to_dict()
|
return item.to_dict() if item else []
|
||||||
|
|
||||||
def delete(self, id):
|
def delete(self, field_value):
|
||||||
item = self._get_item(id)
|
item = self._get_item(field_value)
|
||||||
db.session.delete(item)
|
db.session.delete(item)
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
return "", 200
|
return "", 200
|
||||||
@@ -28,22 +30,26 @@ class ItemAPI(MethodView):
|
|||||||
class ListAPI(MethodView):
|
class ListAPI(MethodView):
|
||||||
init_every_request = False
|
init_every_request = False
|
||||||
|
|
||||||
def __init__(self, model):
|
def __init__(self, model, filter_field):
|
||||||
self.model = model
|
self.model = model
|
||||||
|
self.filter_field = filter_field
|
||||||
|
|
||||||
def _get_item(self, id):
|
def _get_item(self, field_value):
|
||||||
return self.model.query.filter_by(id=id).first()
|
return self.model.query.filter(
|
||||||
|
getattr(self.model, self.filter_field) == field_value
|
||||||
|
)
|
||||||
|
|
||||||
def get(self):
|
def get(self):
|
||||||
items = self.model.query.all()
|
items = self.model.query.all()
|
||||||
return jsonify([item.to_dict() for item in items])
|
return [item.to_dict() for item in items]
|
||||||
|
|
||||||
def post(self):
|
def post(self):
|
||||||
|
|
||||||
data = request.json
|
data = request.json
|
||||||
|
|
||||||
if data.get("id"):
|
field_value = data.get("field_value")
|
||||||
item = self._get_item(data["id"])
|
if field_value:
|
||||||
|
item = self._get_item(field_value)
|
||||||
|
|
||||||
if item:
|
if item:
|
||||||
return "Already exists!", 400
|
return "Already exists!", 400
|
||||||
@@ -53,8 +59,8 @@ class ListAPI(MethodView):
|
|||||||
return "", 200
|
return "", 200
|
||||||
|
|
||||||
|
|
||||||
def register_api(app, model, name):
|
def register_api(app, model, name, filter_field="id"):
|
||||||
item = ItemAPI.as_view(f"{name}-item", model)
|
item = ItemAPI.as_view(f"{name}-item", model, filter_field)
|
||||||
group = ListAPI.as_view(f"{name}-list", model)
|
group = ListAPI.as_view(f"{name}-list", model, filter_field)
|
||||||
app.add_url_rule(f"/{name}/<int:id>", view_func=item)
|
app.add_url_rule(f"/{name}/<int:field_value>", view_func=item)
|
||||||
app.add_url_rule(f"/{name}/", view_func=group)
|
app.add_url_rule(f"/{name}/", view_func=group)
|
||||||
|
|||||||
@@ -13,4 +13,4 @@ register_api(main, User, "users")
|
|||||||
|
|
||||||
register_api(main, CharacterRace, "character_races")
|
register_api(main, CharacterRace, "character_races")
|
||||||
register_api(main, CharacterClass, "character_classes")
|
register_api(main, CharacterClass, "character_classes")
|
||||||
register_api(main, Character, "characters")
|
register_api(main, Character, "characters", "owner")
|
||||||
|
|||||||
@@ -59,10 +59,13 @@ class Character(db.Model, SerializerMixin):
|
|||||||
|
|
||||||
__tablename__ = "characters"
|
__tablename__ = "characters"
|
||||||
|
|
||||||
|
serialize_rules = ("-user", "-race", "-class")
|
||||||
|
|
||||||
id = db.Column(db.Integer, primary_key=True)
|
id = db.Column(db.Integer, primary_key=True)
|
||||||
owner = db.Column(
|
owner = db.Column(
|
||||||
db.Integer,
|
db.Integer,
|
||||||
db.ForeignKey("users.id"),
|
db.ForeignKey("users.id"),
|
||||||
|
unique=True,
|
||||||
nullable=True,
|
nullable=True,
|
||||||
)
|
)
|
||||||
name = db.Column(db.String(255), nullable=False, unique=True)
|
name = db.Column(db.String(255), nullable=False, unique=True)
|
||||||
|
|||||||
Reference in New Issue
Block a user