From 08556785a3cbb89d21bdb6bccd9487bcf38f4f54 Mon Sep 17 00:00:00 2001 From: Llloooggg Date: Mon, 21 Nov 2022 22:47:23 +0300 Subject: [PATCH] not working mess --- backend/requirements.txt | 12 ++++++ backend/scripts/init_data.json | 13 ++++++ backend/textsouls/__init__.py | 32 +++++++-------- backend/textsouls/actions/api.py | 10 ++--- backend/textsouls/characters/api.py | 15 +++++-- backend/textsouls/common/admin.py | 11 ++++++ backend/textsouls/common/api.py | 10 +---- backend/textsouls/common/celery.py | 18 +++++++++ backend/textsouls/common/database.py | 3 ++ backend/textsouls/telegram/tasks.py | 16 ++++++++ backend/textsouls/users/api.py | 2 +- backend/textsouls/users/models.py | 59 ++++++++++++++++++++++++++++ 12 files changed, 167 insertions(+), 34 deletions(-) create mode 100644 backend/textsouls/common/admin.py create mode 100644 backend/textsouls/common/celery.py create mode 100644 backend/textsouls/common/database.py create mode 100644 backend/textsouls/telegram/tasks.py diff --git a/backend/requirements.txt b/backend/requirements.txt index 80d6249..007ed15 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -1,6 +1,12 @@ alembic==1.8.1 +amqp==5.1.1 +billiard==3.6.4.0 +celery==5.2.7 cffi==1.15.1 click==8.1.3 +click-didyoumean==0.3.0 +click-plugins==1.1.1 +click-repl==0.2.0 cryptography==38.0.3 Flask==2.2.2 Flask-Admin==1.6.0 @@ -12,12 +18,18 @@ importlib-metadata==5.0.0 importlib-resources==5.10.0 itsdangerous==2.1.2 Jinja2==3.1.2 +kombu==5.2.4 Mako==1.2.4 MarkupSafe==2.1.1 +prompt-toolkit==3.0.33 pycparser==2.21 PyMySQL==1.0.2 +pytz==2022.6 +six==1.16.0 SQLAlchemy==1.4.44 SQLAlchemy-serializer==1.4.1 +vine==5.0.0 +wcwidth==0.2.5 Werkzeug==2.2.2 WTForms==3.0.1 zipp==3.10.0 diff --git a/backend/scripts/init_data.json b/backend/scripts/init_data.json index 9c2f97a..aee52bb 100644 --- a/backend/scripts/init_data.json +++ b/backend/scripts/init_data.json @@ -13,6 +13,19 @@ } ] }, + { + "table_name": "sendlists_destionations_statuses", + "records": [ + { + "id": 1, + "name": "В ожидании" + }, + { + "id": 1, + "name": "Отправлено" + } + ] + }, { "table_name": "character_races", "records": [ diff --git a/backend/textsouls/__init__.py b/backend/textsouls/__init__.py index aa61b3c..579df64 100644 --- a/backend/textsouls/__init__.py +++ b/backend/textsouls/__init__.py @@ -1,17 +1,22 @@ import json from flask import Flask -from flask_sqlalchemy import SQLAlchemy from flask_migrate import Migrate -from flask_admin import Admin + + +from textsouls.common.database import db +from textsouls.common.admin import admin + +from textsouls.actions.api import actions_bp +from textsouls.characters.api import characters_bp +from textsouls.users.api import users_bp + app = Flask( "__name__", ) -db = SQLAlchemy() migrate = Migrate(app, db, compare_type=True) -admin = Admin(name="TextSouls") with open("textsouls/config.json") as config_file: config_data = json.load(config_file) @@ -22,17 +27,12 @@ app.config.update(main_settings) db_settings = config_data["DB_SETTINGS"] app.config.update(db_settings) -admin.init_app(app) +celery_settings = config_data["CELERY_SETTINGS"] +app.config.update(celery_settings) + db.init_app(app) +admin.init_app(app) -from textsouls.actions.api import bp - -app.register_blueprint(bp) - -from textsouls.characters.api import bp - -app.register_blueprint(bp) - -from textsouls.users.api import bp - -app.register_blueprint(bp) +app.register_blueprint(actions_bp) +app.register_blueprint(characters_bp) +app.register_blueprint(users_bp) diff --git a/backend/textsouls/actions/api.py b/backend/textsouls/actions/api.py index 4248c1f..562d152 100644 --- a/backend/textsouls/actions/api.py +++ b/backend/textsouls/actions/api.py @@ -1,19 +1,19 @@ from flask import Blueprint -from textsouls import db from textsouls import admin +from textsouls.common.database import db from textsouls.common.api import register_api -from textsouls.common.api import CommonAdminView +from textsouls.common.admin import CommonAdminView from textsouls.actions.models import DuelParticipant from textsouls.actions.models import Duel -bp = Blueprint("actions", __name__) +actions_bp = Blueprint("actions", __name__) -register_api(bp, DuelParticipant, "duels_participant") -register_api(bp, Duel, "duels") +register_api(actions_bp, DuelParticipant, "duels_participant") +register_api(actions_bp, Duel, "duels") admin.add_view(CommonAdminView(DuelParticipant, db.session)) admin.add_view(CommonAdminView(Duel, db.session)) diff --git a/backend/textsouls/characters/api.py b/backend/textsouls/characters/api.py index 1fb77cf..1e55033 100644 --- a/backend/textsouls/characters/api.py +++ b/backend/textsouls/characters/api.py @@ -1,10 +1,10 @@ from flask import Blueprint -from textsouls import db -from textsouls import admin +from textsouls.common.database import db +from textsouls.common.admin import admin from textsouls.common.api import register_api -from textsouls.common.api import CommonAdminView +from textsouls.common.admin import CommonAdminView from textsouls.characters.models import CharacterRace from textsouls.characters.models import CharacterClass @@ -23,3 +23,12 @@ admin.add_view(CommonAdminView(CharacterRace, db.session)) admin.add_view(CommonAdminView(CharacterClass, db.session)) admin.add_view(CommonAdminView(CharacterState, db.session)) admin.add_view(CommonAdminView(Character, db.session)) + + +from textsouls.telegram.tasks import broadcast_message + + +@bp.route("/test", methods=["POST"]) +def run_task(): + task = broadcast_message.delay() + return str(task.id), 202 diff --git a/backend/textsouls/common/admin.py b/backend/textsouls/common/admin.py new file mode 100644 index 0000000..ec8f92f --- /dev/null +++ b/backend/textsouls/common/admin.py @@ -0,0 +1,11 @@ +from flask_admin import Admin +from flask_admin.contrib.sqla import ModelView + + +class CommonAdminView(ModelView): + def __init__(self, model, *args, **kwargs): + self.column_list = [c.key for c in model.__table__.columns] + super(CommonAdminView, self).__init__(model, *args, **kwargs) + + +admin = Admin(name="TextSouls") diff --git a/backend/textsouls/common/api.py b/backend/textsouls/common/api.py index c103c85..c75df11 100644 --- a/backend/textsouls/common/api.py +++ b/backend/textsouls/common/api.py @@ -1,15 +1,7 @@ from flask import request from flask.views import MethodView -from flask_admin.contrib.sqla import ModelView - -from textsouls import db - - -class CommonAdminView(ModelView): - def __init__(self, model, *args, **kwargs): - self.column_list = [c.key for c in model.__table__.columns] - super(CommonAdminView, self).__init__(model, *args, **kwargs) +from textsouls.common.database import db class ItemAPI(MethodView): diff --git a/backend/textsouls/common/celery.py b/backend/textsouls/common/celery.py new file mode 100644 index 0000000..9e487a9 --- /dev/null +++ b/backend/textsouls/common/celery.py @@ -0,0 +1,18 @@ +from celery import Celery + + +def make_celery(app): + celery = Celery( + app.import_name, + backend=app.config["CELERY_RESULT_BACKEND"], + broker=app.config["CELERY_BROKER_URL"], + ) + celery.conf.update(app.config) + + class ContextTask(celery.Task): + def __call__(self, *args, **kwargs): + with app.app_context(): + return self.run(*args, **kwargs) + + celery.Task = ContextTask + return celery diff --git a/backend/textsouls/common/database.py b/backend/textsouls/common/database.py new file mode 100644 index 0000000..f0b13d6 --- /dev/null +++ b/backend/textsouls/common/database.py @@ -0,0 +1,3 @@ +from flask_sqlalchemy import SQLAlchemy + +db = SQLAlchemy() diff --git a/backend/textsouls/telegram/tasks.py b/backend/textsouls/telegram/tasks.py new file mode 100644 index 0000000..149a436 --- /dev/null +++ b/backend/textsouls/telegram/tasks.py @@ -0,0 +1,16 @@ +from textsouls.common.database import db +from textsouls import celery + +from textsouls.users.models import User, Sendlist, SendlistDestination + + +@celery.task() +def broadcast_message(message): + sendlist = Sendlist(message=message) + db.session.add(sendlist) + db.session.commit() + for user in User.query.all(): + db.session.add( + SendlistDestination(sendlist_id=sendlist.id, user_id=user.id) + ) + db.session.commit() diff --git a/backend/textsouls/users/api.py b/backend/textsouls/users/api.py index 9f8957b..be5d1e7 100644 --- a/backend/textsouls/users/api.py +++ b/backend/textsouls/users/api.py @@ -2,7 +2,7 @@ from flask import Blueprint from flask_admin.contrib.sqla import ModelView -from textsouls import db +from textsouls.common.database import db from textsouls import admin from textsouls.common.api import register_api diff --git a/backend/textsouls/users/models.py b/backend/textsouls/users/models.py index f7ac2f9..15166cd 100644 --- a/backend/textsouls/users/models.py +++ b/backend/textsouls/users/models.py @@ -21,6 +21,65 @@ class User(db.Model, SerializerMixin): ) is_admin = db.Column(db.Boolean, nullable=False, default=False) characters = db.relationship("Character", backref="user", lazy="dynamic") + destinations = db.relationship( + "SendlistDestination", backref="sendlist", lazy="dynamic" + ) def __str__(self): return f"{self.id}: {self.username}" + + +class Sendlist(db.Model, SerializerMixin): + + __tablename__ = "sendlists" + + serialize_rules = ("-destination",) + + id = db.Column(db.BigInteger, primary_key=True) + message = db.Column(db.String(255), nullable=True) + destinations = db.relationship( + "SendlistDestination", backref="sendlist", lazy="dynamic" + ) + + def __str__(self): + return f"{self.message[:12]}..." + + +class SendlistDestinationStatus(db.Model, SerializerMixin): + + __tablename__ = "sendlists_destionations_statuses" + + serialize_rules = ("-destination",) + + id = db.Column(db.BigInteger, primary_key=True) + name = db.Column(db.String(255), nullable=False) + destinations = db.relationship( + "SendlistDestination", + backref="status", + lazy="dynamic", + ) + + def __str__(self): + return self.name + + +class SendlistDestination(db.Model, SerializerMixin): + + __tablename__ = "sendlists_destionations" + + id = db.Column(db.BigInteger, primary_key=True) + sendlist_id = db.Column( + db.Integer, + db.ForeignKey("sendlists.id", ondelete="CASCADE"), + ) + user_id = db.Column( + db.BigInteger, + db.ForeignKey("users.id", ondelete="CASCADE"), + ) + status_id = db.Column( + db.Integer, + db.ForeignKey("sendlists_destionations_types.id", ondelete="CASCADE"), + ) + + def __str__(self): + return f"{self.message[:12]}..."