from peewee import * from flask_login import UserMixin import os import datetime import uuid USE_SQLITE = os.environ.get("USE_SQLITE") == "1" if USE_SQLITE: db = SqliteDatabase(os.environ.get("SQLITE_PATH", "survey.db")) else: db = PostgresqlDatabase( os.environ.get("POSTGRES_DB", "survey"), user=os.environ.get("POSTGRES_USER", "servey"), password=os.environ.get("POSTGRES_PASSWORD", "utOgbZ09servey"), host=os.environ.get("POSTGRES_HOST", "db"), port=5432 ) class BaseModel(Model): class Meta: database = db class User(BaseModel, UserMixin): username = CharField(unique=True) email = CharField(unique=True) password_hash = CharField() full_name = CharField(null=True) is_admin = BooleanField(default=False) def get_id(self): return str(self.id) @property def is_active(self): return True # ✅ теперь Flask-Login доволен class SurveyType(BaseModel): name = CharField(unique=True) class Product(BaseModel): name = CharField() survey_type = ForeignKeyField(SurveyType, backref='products', on_delete='CASCADE') class Feature(BaseModel): question_text = TextField() product = ForeignKeyField(Product, backref='features', on_delete='CASCADE') class Platform(BaseModel): name = CharField(unique=True) survey_type = ForeignKeyField(SurveyType, backref='platforms', on_delete='CASCADE') class PlatformFeature(BaseModel): platform = ForeignKeyField(Platform, backref='features', on_delete='CASCADE') feature = ForeignKeyField(Feature, backref='platforms', on_delete='CASCADE') supported = BooleanField(default=True) # 🔹 Опросы, созданные пользователями class UserSurvey(BaseModel): user = ForeignKeyField(User, backref='surveys', on_delete='CASCADE') survey_type = ForeignKeyField(SurveyType, on_delete='CASCADE') name = CharField() created_at = DateTimeField(default=datetime.datetime.now) # 🔹 Отправленные приглашения class SurveyInvite(BaseModel): survey = ForeignKeyField(UserSurvey, backref='invites', on_delete='CASCADE') recipient_email = CharField() uuid = UUIDField(default=uuid.uuid4, unique=True) show_result = BooleanField(default=False) ask_full_name = BooleanField(default=False) ask_phone = BooleanField(default=False) ask_organization = BooleanField(default=False) sent_at = DateTimeField(default=datetime.datetime.now) responded = BooleanField(default=False) # 🔹 Результаты прохождения опроса class SurveyResult(BaseModel): invite = ForeignKeyField(SurveyInvite, backref='result') full_name = CharField(null=True) phone = CharField(null=True) organization = CharField(null=True) answers = TextField(null=True) # JSON строка ответов platform_scores = TextField(null=True) # JSON: { "Platform1": 80, ... } unsupported = TextField(null=True) # JSON: { "Platform1": [q1, q2], ... } submitted_at = DateTimeField(default=datetime.datetime.now, null=False) comment = TextField(null=True) # ← вот это добавляем # Можно добавить поле для процента или JSON с ответами, если нужно def initialize_db(): db.connect() db.create_tables([ User, SurveyType, Product, Feature, Platform, PlatformFeature, UserSurvey, SurveyInvite, SurveyResult ], safe=True) db.close()