init commit
This commit is contained in:
15
app/models/__init__.py
Normal file
15
app/models/__init__.py
Normal file
@@ -0,0 +1,15 @@
|
||||
from .base import Base
|
||||
from .group import Group
|
||||
from .message import Message
|
||||
from .message_group import MessageGroup
|
||||
from .group_members import GroupMember, GroupKeyword, GroupStatistics
|
||||
|
||||
__all__ = [
|
||||
'Base',
|
||||
'Group',
|
||||
'Message',
|
||||
'MessageGroup',
|
||||
'GroupMember',
|
||||
'GroupKeyword',
|
||||
'GroupStatistics'
|
||||
]
|
||||
3
app/models/base.py
Normal file
3
app/models/base.py
Normal file
@@ -0,0 +1,3 @@
|
||||
from sqlalchemy.orm import declarative_base
|
||||
|
||||
Base = declarative_base()
|
||||
33
app/models/group.py
Normal file
33
app/models/group.py
Normal file
@@ -0,0 +1,33 @@
|
||||
from sqlalchemy import Column, Integer, String, Float, DateTime, Boolean
|
||||
from sqlalchemy.orm import relationship
|
||||
from datetime import datetime
|
||||
from .base import Base
|
||||
|
||||
|
||||
class Group(Base):
|
||||
"""Модель для хранения Telegram групп"""
|
||||
__tablename__ = 'groups'
|
||||
|
||||
id = Column(Integer, primary_key=True)
|
||||
chat_id = Column(String, unique=True, nullable=False) # ID группы в Telegram
|
||||
title = Column(String, nullable=False) # Название группы
|
||||
slow_mode_delay = Column(Integer, default=0) # Задержка между сообщениями (сек)
|
||||
last_message_time = Column(DateTime, nullable=True) # Время последнего отправленного сообщения
|
||||
is_active = Column(Boolean, default=True) # Активна ли группа
|
||||
description = Column(String, nullable=True) # Описание группы (для поиска)
|
||||
member_count = Column(Integer, default=0) # Количество участников
|
||||
creator_id = Column(String, nullable=True) # ID создателя группы
|
||||
created_at = Column(DateTime, default=datetime.utcnow)
|
||||
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
|
||||
|
||||
# Связь со многими сообщениями (через таблицу связей)
|
||||
messages = relationship('MessageGroup', back_populates='group', cascade='all, delete-orphan')
|
||||
# Связь с участниками группы
|
||||
members = relationship('GroupMember', back_populates='group', cascade='all, delete-orphan')
|
||||
# Связь с ключевыми словами
|
||||
keywords = relationship('GroupKeyword', back_populates='group', cascade='all, delete-orphan')
|
||||
# Связь со статистикой
|
||||
statistics = relationship('GroupStatistics', back_populates='group', cascade='all, delete-orphan', uselist=False)
|
||||
|
||||
def __repr__(self):
|
||||
return f'<Group {self.chat_id} - {self.title}>'
|
||||
73
app/models/group_members.py
Normal file
73
app/models/group_members.py
Normal file
@@ -0,0 +1,73 @@
|
||||
from sqlalchemy import Column, Integer, String, ForeignKey, DateTime, Boolean, Text
|
||||
from sqlalchemy.orm import relationship
|
||||
from datetime import datetime
|
||||
from .base import Base
|
||||
|
||||
|
||||
class GroupMember(Base):
|
||||
"""Модель для хранения участников группы"""
|
||||
__tablename__ = 'group_members'
|
||||
|
||||
id = Column(Integer, primary_key=True)
|
||||
group_id = Column(Integer, ForeignKey('groups.id'), nullable=False)
|
||||
user_id = Column(String, nullable=False) # Telegram user ID
|
||||
username = Column(String, nullable=True) # Username если есть
|
||||
first_name = Column(String, nullable=True) # Имя
|
||||
last_name = Column(String, nullable=True) # Фамилия
|
||||
is_bot = Column(Boolean, default=False) # Это бот?
|
||||
is_admin = Column(Boolean, default=False) # Администратор группы?
|
||||
is_owner = Column(Boolean, default=False) # Владелец группы?
|
||||
joined_at = Column(DateTime, nullable=True) # Когда присоединился
|
||||
last_activity = Column(DateTime, default=datetime.utcnow) # Последняя активность
|
||||
created_at = Column(DateTime, default=datetime.utcnow)
|
||||
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
|
||||
|
||||
# Обратная связь
|
||||
group = relationship('Group', back_populates='members')
|
||||
|
||||
def __repr__(self):
|
||||
return f'<GroupMember {self.user_id} in group {self.group_id}>'
|
||||
|
||||
|
||||
class GroupKeyword(Base):
|
||||
"""Модель для ключевых слов поиска групп"""
|
||||
__tablename__ = 'group_keywords'
|
||||
|
||||
id = Column(Integer, primary_key=True)
|
||||
group_id = Column(Integer, ForeignKey('groups.id'), nullable=False, unique=True)
|
||||
keywords = Column(Text, nullable=False) # JSON массив ключевых слов
|
||||
description = Column(String, nullable=True) # Описание для поиска
|
||||
last_parsed = Column(DateTime, nullable=True) # Когда последний раз парсили
|
||||
is_active = Column(Boolean, default=True)
|
||||
created_at = Column(DateTime, default=datetime.utcnow)
|
||||
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
|
||||
|
||||
# Обратная связь
|
||||
group = relationship('Group', back_populates='keywords', foreign_keys=[group_id])
|
||||
|
||||
def __repr__(self):
|
||||
return f'<GroupKeyword group_id={self.group_id}>'
|
||||
|
||||
|
||||
class GroupStatistics(Base):
|
||||
"""Модель для статистики групп"""
|
||||
__tablename__ = 'group_statistics'
|
||||
|
||||
id = Column(Integer, primary_key=True)
|
||||
group_id = Column(Integer, ForeignKey('groups.id'), nullable=False, unique=True)
|
||||
total_members = Column(Integer, default=0) # Всего участников
|
||||
total_admins = Column(Integer, default=0) # Всего администраторов
|
||||
total_bots = Column(Integer, default=0) # Всего ботов
|
||||
messages_sent = Column(Integer, default=0) # Отправлено сообщений
|
||||
messages_failed = Column(Integer, default=0) # Ошибок при отправке
|
||||
messages_via_client = Column(Integer, default=0) # Отправлено через Pyrogram
|
||||
can_send_as_bot = Column(Boolean, default=True) # Может ли бот отправлять?
|
||||
can_send_as_client = Column(Boolean, default=False) # Может ли клиент отправлять?
|
||||
last_updated = Column(DateTime, default=datetime.utcnow)
|
||||
created_at = Column(DateTime, default=datetime.utcnow)
|
||||
|
||||
# Обратная связь
|
||||
group = relationship('Group', back_populates='statistics', foreign_keys=[group_id])
|
||||
|
||||
def __repr__(self):
|
||||
return f'<GroupStatistics group_id={self.group_id}>'
|
||||
23
app/models/message.py
Normal file
23
app/models/message.py
Normal file
@@ -0,0 +1,23 @@
|
||||
from sqlalchemy import Column, Integer, String, DateTime, Boolean
|
||||
from sqlalchemy.orm import relationship
|
||||
from datetime import datetime
|
||||
from .base import Base
|
||||
|
||||
|
||||
class Message(Base):
|
||||
"""Модель для хранения сообщений для рассылки"""
|
||||
__tablename__ = 'messages'
|
||||
|
||||
id = Column(Integer, primary_key=True)
|
||||
text = Column(String, nullable=False) # Текст сообщения
|
||||
title = Column(String, nullable=False) # Название/описание сообщения
|
||||
is_active = Column(Boolean, default=True) # Активно ли сообщение
|
||||
parse_mode = Column(String, default='HTML') # Режим парсинга (HTML, Markdown, None)
|
||||
created_at = Column(DateTime, default=datetime.utcnow)
|
||||
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
|
||||
|
||||
# Связь со многими группами (через таблицу связей)
|
||||
groups = relationship('MessageGroup', back_populates='message', cascade='all, delete-orphan')
|
||||
|
||||
def __repr__(self):
|
||||
return f'<Message {self.id} - {self.title}>'
|
||||
24
app/models/message_group.py
Normal file
24
app/models/message_group.py
Normal file
@@ -0,0 +1,24 @@
|
||||
from sqlalchemy import Column, Integer, String, ForeignKey, DateTime, Boolean
|
||||
from sqlalchemy.orm import relationship
|
||||
from datetime import datetime
|
||||
from .base import Base
|
||||
|
||||
|
||||
class MessageGroup(Base):
|
||||
"""Модель для связи между сообщениями и группами"""
|
||||
__tablename__ = 'message_groups'
|
||||
|
||||
id = Column(Integer, primary_key=True)
|
||||
message_id = Column(Integer, ForeignKey('messages.id'), nullable=False)
|
||||
group_id = Column(Integer, ForeignKey('groups.id'), nullable=False)
|
||||
is_sent = Column(Boolean, default=False) # Было ли отправлено в эту группу
|
||||
sent_at = Column(DateTime, nullable=True) # Время отправки
|
||||
error = Column(String, nullable=True) # Ошибка при отправке, если была
|
||||
created_at = Column(DateTime, default=datetime.utcnow)
|
||||
|
||||
# Обратные связи
|
||||
message = relationship('Message', back_populates='groups')
|
||||
group = relationship('Group', back_populates='messages')
|
||||
|
||||
def __repr__(self):
|
||||
return f'<MessageGroup msg_id={self.message_id} group_id={self.group_id}>'
|
||||
Reference in New Issue
Block a user