Files
Quiz-for-Mont/models.py
2025-09-04 11:27:16 +03:00

98 lines
3.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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()