From 9672952d344b795163848a40dfaa60f2eb601de3 Mon Sep 17 00:00:00 2001 From: Llloooggg Date: Sat, 19 Nov 2022 02:53:32 +0300 Subject: [PATCH] =?UTF-8?q?backend:=20=D1=82=D0=B5=D0=BF=D0=B5=D1=80=D1=8C?= =?UTF-8?q?=20=D1=83=D0=BD=D0=B8=D0=B2=D0=B5=D1=80=D1=81=D0=B0=D0=BB=D1=8C?= =?UTF-8?q?=D0=BD=D1=8B=D0=B5=20=D0=B2=D1=8C=D1=8E=20=D0=BF=D1=80=D0=B8?= =?UTF-8?q?=D0=BD=D0=B8=D0=BC=D0=B0=D1=8E=D1=82=20=D0=BF=D0=B0=D1=80=D0=B0?= =?UTF-8?q?=D0=BC=D0=B5=D1=82=D1=80=20=D0=B4=D0=BB=D1=8F=20=D1=84=D0=B8?= =?UTF-8?q?=D0=BB=D1=8C=D1=82=D1=80=D0=B0=D1=86=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/migrations/versions/c42d8e7674e6_.py | 32 ++++++++++++++ backend/textsouls/common/views.py | 44 +++++++++++--------- backend/textsouls/main.py | 2 +- backend/textsouls/models.py | 3 ++ 4 files changed, 61 insertions(+), 20 deletions(-) create mode 100644 backend/migrations/versions/c42d8e7674e6_.py diff --git a/backend/migrations/versions/c42d8e7674e6_.py b/backend/migrations/versions/c42d8e7674e6_.py new file mode 100644 index 0000000..64eab2a --- /dev/null +++ b/backend/migrations/versions/c42d8e7674e6_.py @@ -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 ### diff --git a/backend/textsouls/common/views.py b/backend/textsouls/common/views.py index 47d664e..4c7bc79 100644 --- a/backend/textsouls/common/views.py +++ b/backend/textsouls/common/views.py @@ -1,25 +1,27 @@ from .. import db from flask import request -from flask import jsonify from flask.views import MethodView class ItemAPI(MethodView): init_every_request = False - def __init__(self, model): + def __init__(self, model, filter_field): self.model = model + self.filter_field = filter_field - def _get_item(self, id): - return self.model.query.get_or_404(id) + def _get_item(self, field_value): + return self.model.query.filter( + getattr(self.model, self.filter_field) == field_value + ).first() - def get(self, id): - item = self._get_item(id) - return item.to_dict() + def get(self, field_value): + item = self._get_item(field_value) + return item.to_dict() if item else [] - def delete(self, id): - item = self._get_item(id) + def delete(self, field_value): + item = self._get_item(field_value) db.session.delete(item) db.session.commit() return "", 200 @@ -28,22 +30,26 @@ class ItemAPI(MethodView): class ListAPI(MethodView): init_every_request = False - def __init__(self, model): + def __init__(self, model, filter_field): self.model = model + self.filter_field = filter_field - def _get_item(self, id): - return self.model.query.filter_by(id=id).first() + def _get_item(self, field_value): + return self.model.query.filter( + getattr(self.model, self.filter_field) == field_value + ) def get(self): 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): data = request.json - if data.get("id"): - item = self._get_item(data["id"]) + field_value = data.get("field_value") + if field_value: + item = self._get_item(field_value) if item: return "Already exists!", 400 @@ -53,8 +59,8 @@ class ListAPI(MethodView): 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}/", view_func=item) +def register_api(app, model, name, filter_field="id"): + item = ItemAPI.as_view(f"{name}-item", model, filter_field) + group = ListAPI.as_view(f"{name}-list", model, filter_field) + app.add_url_rule(f"/{name}/", view_func=item) app.add_url_rule(f"/{name}/", view_func=group) diff --git a/backend/textsouls/main.py b/backend/textsouls/main.py index e706b0f..104e8de 100644 --- a/backend/textsouls/main.py +++ b/backend/textsouls/main.py @@ -13,4 +13,4 @@ register_api(main, User, "users") register_api(main, CharacterRace, "character_races") register_api(main, CharacterClass, "character_classes") -register_api(main, Character, "characters") +register_api(main, Character, "characters", "owner") diff --git a/backend/textsouls/models.py b/backend/textsouls/models.py index ead9701..3a12a2a 100644 --- a/backend/textsouls/models.py +++ b/backend/textsouls/models.py @@ -59,10 +59,13 @@ class Character(db.Model, SerializerMixin): __tablename__ = "characters" + serialize_rules = ("-user", "-race", "-class") + id = db.Column(db.Integer, primary_key=True) owner = db.Column( db.Integer, db.ForeignKey("users.id"), + unique=True, nullable=True, ) name = db.Column(db.String(255), nullable=False, unique=True)