452 lines
16 KiB
Python
452 lines
16 KiB
Python
"""Enhanced features migration
|
|
|
|
Revision ID: 002
|
|
Revises: 001
|
|
Create Date: 2025-07-01 14:00:00.000000
|
|
|
|
"""
|
|
|
|
from typing import Sequence, Union
|
|
|
|
from alembic import op
|
|
import sqlalchemy as sa
|
|
|
|
# revision identifiers, used by Alembic.
|
|
revision: str = "002"
|
|
down_revision: Union[str, None] = "001"
|
|
branch_labels: Union[str, Sequence[str], None] = None
|
|
depends_on: Union[str, Sequence[str], None] = None
|
|
|
|
|
|
def upgrade() -> None:
|
|
# Create notifications table
|
|
op.create_table(
|
|
"notifications",
|
|
sa.Column("id", sa.Integer(), nullable=False),
|
|
sa.Column("recipient_id", sa.Integer(), nullable=False),
|
|
sa.Column("sender_id", sa.Integer(), nullable=True),
|
|
sa.Column(
|
|
"type",
|
|
sa.Enum(
|
|
"CONNECTION_REQUEST",
|
|
"CONNECTION_ACCEPTED",
|
|
"POST_LIKE",
|
|
"POST_COMMENT",
|
|
"EVENT_INVITATION",
|
|
"EVENT_REMINDER",
|
|
"PRAYER_REQUEST",
|
|
"MINISTRY_ASSIGNMENT",
|
|
"DONATION_REMINDER",
|
|
"BIRTHDAY_REMINDER",
|
|
"ANNOUNCEMENT",
|
|
name="notificationtype",
|
|
),
|
|
nullable=False,
|
|
),
|
|
sa.Column("title", sa.String(), nullable=False),
|
|
sa.Column("message", sa.Text(), nullable=False),
|
|
sa.Column("data", sa.Text(), nullable=True),
|
|
sa.Column("is_read", sa.Boolean(), nullable=True),
|
|
sa.Column("created_at", sa.DateTime(), nullable=False),
|
|
sa.Column("read_at", sa.DateTime(), nullable=True),
|
|
sa.ForeignKeyConstraint(
|
|
["recipient_id"],
|
|
["users.id"],
|
|
),
|
|
sa.ForeignKeyConstraint(
|
|
["sender_id"],
|
|
["users.id"],
|
|
),
|
|
sa.PrimaryKeyConstraint("id"),
|
|
)
|
|
op.create_index(op.f("ix_notifications_id"), "notifications", ["id"], unique=False)
|
|
|
|
# Create notification_settings table
|
|
op.create_table(
|
|
"notification_settings",
|
|
sa.Column("id", sa.Integer(), nullable=False),
|
|
sa.Column("user_id", sa.Integer(), nullable=False),
|
|
sa.Column("email_notifications", sa.Boolean(), nullable=True),
|
|
sa.Column("push_notifications", sa.Boolean(), nullable=True),
|
|
sa.Column("connection_requests", sa.Boolean(), nullable=True),
|
|
sa.Column("post_interactions", sa.Boolean(), nullable=True),
|
|
sa.Column("event_reminders", sa.Boolean(), nullable=True),
|
|
sa.Column("prayer_requests", sa.Boolean(), nullable=True),
|
|
sa.Column("ministry_updates", sa.Boolean(), nullable=True),
|
|
sa.Column("donation_reminders", sa.Boolean(), nullable=True),
|
|
sa.Column("birthday_reminders", sa.Boolean(), nullable=True),
|
|
sa.Column("announcements", sa.Boolean(), nullable=True),
|
|
sa.ForeignKeyConstraint(
|
|
["user_id"],
|
|
["users.id"],
|
|
),
|
|
sa.PrimaryKeyConstraint("id"),
|
|
)
|
|
op.create_index(
|
|
op.f("ix_notification_settings_id"),
|
|
"notification_settings",
|
|
["id"],
|
|
unique=False,
|
|
)
|
|
|
|
# Create ministries table
|
|
op.create_table(
|
|
"ministries",
|
|
sa.Column("id", sa.Integer(), nullable=False),
|
|
sa.Column("name", sa.String(), nullable=False),
|
|
sa.Column("description", sa.Text(), nullable=True),
|
|
sa.Column("vision", sa.Text(), nullable=True),
|
|
sa.Column("mission", sa.Text(), nullable=True),
|
|
sa.Column("meeting_day", sa.String(), nullable=True),
|
|
sa.Column("meeting_time", sa.String(), nullable=True),
|
|
sa.Column("meeting_location", sa.String(), nullable=True),
|
|
sa.Column("leader_id", sa.Integer(), nullable=False),
|
|
sa.Column("is_active", sa.Boolean(), nullable=True),
|
|
sa.Column("created_at", sa.DateTime(), nullable=False),
|
|
sa.Column("updated_at", sa.DateTime(), nullable=False),
|
|
sa.ForeignKeyConstraint(
|
|
["leader_id"],
|
|
["users.id"],
|
|
),
|
|
sa.PrimaryKeyConstraint("id"),
|
|
)
|
|
op.create_index(op.f("ix_ministries_id"), "ministries", ["id"], unique=False)
|
|
|
|
# Create ministry_members table
|
|
op.create_table(
|
|
"ministry_members",
|
|
sa.Column("id", sa.Integer(), nullable=False),
|
|
sa.Column("ministry_id", sa.Integer(), nullable=False),
|
|
sa.Column("user_id", sa.Integer(), nullable=False),
|
|
sa.Column(
|
|
"role",
|
|
sa.Enum("LEADER", "CO_LEADER", "MEMBER", "VOLUNTEER", name="ministryrole"),
|
|
nullable=True,
|
|
),
|
|
sa.Column("joined_at", sa.DateTime(), nullable=False),
|
|
sa.Column("is_active", sa.Boolean(), nullable=True),
|
|
sa.ForeignKeyConstraint(
|
|
["ministry_id"],
|
|
["ministries.id"],
|
|
),
|
|
sa.ForeignKeyConstraint(
|
|
["user_id"],
|
|
["users.id"],
|
|
),
|
|
sa.PrimaryKeyConstraint("id"),
|
|
)
|
|
op.create_index(
|
|
op.f("ix_ministry_members_id"), "ministry_members", ["id"], unique=False
|
|
)
|
|
|
|
# Create ministry_activities table
|
|
op.create_table(
|
|
"ministry_activities",
|
|
sa.Column("id", sa.Integer(), nullable=False),
|
|
sa.Column("ministry_id", sa.Integer(), nullable=False),
|
|
sa.Column("title", sa.String(), nullable=False),
|
|
sa.Column("description", sa.Text(), nullable=True),
|
|
sa.Column("activity_date", sa.DateTime(), nullable=False),
|
|
sa.Column("location", sa.String(), nullable=True),
|
|
sa.Column("created_by", sa.Integer(), nullable=False),
|
|
sa.Column("created_at", sa.DateTime(), nullable=False),
|
|
sa.ForeignKeyConstraint(
|
|
["created_by"],
|
|
["users.id"],
|
|
),
|
|
sa.ForeignKeyConstraint(
|
|
["ministry_id"],
|
|
["ministries.id"],
|
|
),
|
|
sa.PrimaryKeyConstraint("id"),
|
|
)
|
|
op.create_index(
|
|
op.f("ix_ministry_activities_id"), "ministry_activities", ["id"], unique=False
|
|
)
|
|
|
|
# Create donations table
|
|
op.create_table(
|
|
"donations",
|
|
sa.Column("id", sa.Integer(), nullable=False),
|
|
sa.Column("donor_id", sa.Integer(), nullable=False),
|
|
sa.Column("amount", sa.Numeric(precision=10, scale=2), nullable=False),
|
|
sa.Column("currency", sa.String(), nullable=True),
|
|
sa.Column(
|
|
"donation_type",
|
|
sa.Enum(
|
|
"TITHE",
|
|
"OFFERING",
|
|
"SPECIAL_OFFERING",
|
|
"BUILDING_FUND",
|
|
"MISSIONS",
|
|
"CHARITY",
|
|
"OTHER",
|
|
name="donationtype",
|
|
),
|
|
nullable=False,
|
|
),
|
|
sa.Column(
|
|
"payment_method",
|
|
sa.Enum(
|
|
"CASH",
|
|
"CHECK",
|
|
"CARD",
|
|
"BANK_TRANSFER",
|
|
"MOBILE_MONEY",
|
|
"ONLINE",
|
|
name="paymentmethod",
|
|
),
|
|
nullable=False,
|
|
),
|
|
sa.Column("reference_number", sa.String(), nullable=True),
|
|
sa.Column("notes", sa.Text(), nullable=True),
|
|
sa.Column("is_anonymous", sa.Boolean(), nullable=True),
|
|
sa.Column("is_recurring", sa.Boolean(), nullable=True),
|
|
sa.Column("recurring_frequency", sa.String(), nullable=True),
|
|
sa.Column("next_due_date", sa.DateTime(), nullable=True),
|
|
sa.Column("donation_date", sa.DateTime(), nullable=False),
|
|
sa.Column("created_at", sa.DateTime(), nullable=False),
|
|
sa.ForeignKeyConstraint(
|
|
["donor_id"],
|
|
["users.id"],
|
|
),
|
|
sa.PrimaryKeyConstraint("id"),
|
|
)
|
|
op.create_index(op.f("ix_donations_id"), "donations", ["id"], unique=False)
|
|
|
|
# Create conversations table
|
|
op.create_table(
|
|
"conversations",
|
|
sa.Column("id", sa.Integer(), nullable=False),
|
|
sa.Column("participant_1_id", sa.Integer(), nullable=False),
|
|
sa.Column("participant_2_id", sa.Integer(), nullable=False),
|
|
sa.Column("created_at", sa.DateTime(), nullable=False),
|
|
sa.Column("updated_at", sa.DateTime(), nullable=False),
|
|
sa.ForeignKeyConstraint(
|
|
["participant_1_id"],
|
|
["users.id"],
|
|
),
|
|
sa.ForeignKeyConstraint(
|
|
["participant_2_id"],
|
|
["users.id"],
|
|
),
|
|
sa.PrimaryKeyConstraint("id"),
|
|
)
|
|
op.create_index(op.f("ix_conversations_id"), "conversations", ["id"], unique=False)
|
|
|
|
# Create messages table
|
|
op.create_table(
|
|
"messages",
|
|
sa.Column("id", sa.Integer(), nullable=False),
|
|
sa.Column("conversation_id", sa.Integer(), nullable=False),
|
|
sa.Column("sender_id", sa.Integer(), nullable=False),
|
|
sa.Column("receiver_id", sa.Integer(), nullable=False),
|
|
sa.Column(
|
|
"message_type",
|
|
sa.Enum("TEXT", "IMAGE", "FILE", name="messagetype"),
|
|
nullable=True,
|
|
),
|
|
sa.Column("content", sa.Text(), nullable=False),
|
|
sa.Column("file_url", sa.String(), nullable=True),
|
|
sa.Column("is_read", sa.Boolean(), nullable=True),
|
|
sa.Column("read_at", sa.DateTime(), nullable=True),
|
|
sa.Column("created_at", sa.DateTime(), nullable=False),
|
|
sa.ForeignKeyConstraint(
|
|
["conversation_id"],
|
|
["conversations.id"],
|
|
),
|
|
sa.ForeignKeyConstraint(
|
|
["receiver_id"],
|
|
["users.id"],
|
|
),
|
|
sa.ForeignKeyConstraint(
|
|
["sender_id"],
|
|
["users.id"],
|
|
),
|
|
sa.PrimaryKeyConstraint("id"),
|
|
)
|
|
op.create_index(op.f("ix_messages_id"), "messages", ["id"], unique=False)
|
|
|
|
# Create prayer_requests table
|
|
op.create_table(
|
|
"prayer_requests",
|
|
sa.Column("id", sa.Integer(), nullable=False),
|
|
sa.Column("requester_id", sa.Integer(), nullable=False),
|
|
sa.Column("title", sa.String(), nullable=False),
|
|
sa.Column("description", sa.Text(), nullable=False),
|
|
sa.Column(
|
|
"category",
|
|
sa.Enum(
|
|
"HEALTH",
|
|
"FAMILY",
|
|
"FINANCES",
|
|
"RELATIONSHIPS",
|
|
"WORK",
|
|
"SPIRITUAL",
|
|
"CHURCH",
|
|
"WORLD",
|
|
"OTHER",
|
|
name="prayercategory",
|
|
),
|
|
nullable=True,
|
|
),
|
|
sa.Column(
|
|
"privacy_level",
|
|
sa.Enum(
|
|
"PUBLIC",
|
|
"CONNECTIONS_ONLY",
|
|
"MINISTRY_ONLY",
|
|
"PRIVATE",
|
|
name="prayerprivacylevel",
|
|
),
|
|
nullable=True,
|
|
),
|
|
sa.Column(
|
|
"status",
|
|
sa.Enum("ACTIVE", "ANSWERED", "CLOSED", name="prayerstatus"),
|
|
nullable=True,
|
|
),
|
|
sa.Column("ministry_id", sa.Integer(), nullable=True),
|
|
sa.Column("is_anonymous", sa.Boolean(), nullable=True),
|
|
sa.Column("answer_description", sa.Text(), nullable=True),
|
|
sa.Column("answered_at", sa.DateTime(), nullable=True),
|
|
sa.Column("created_at", sa.DateTime(), nullable=False),
|
|
sa.Column("updated_at", sa.DateTime(), nullable=False),
|
|
sa.ForeignKeyConstraint(
|
|
["ministry_id"],
|
|
["ministries.id"],
|
|
),
|
|
sa.ForeignKeyConstraint(
|
|
["requester_id"],
|
|
["users.id"],
|
|
),
|
|
sa.PrimaryKeyConstraint("id"),
|
|
)
|
|
op.create_index(
|
|
op.f("ix_prayer_requests_id"), "prayer_requests", ["id"], unique=False
|
|
)
|
|
|
|
# Create prayers table
|
|
op.create_table(
|
|
"prayers",
|
|
sa.Column("id", sa.Integer(), nullable=False),
|
|
sa.Column("prayer_request_id", sa.Integer(), nullable=False),
|
|
sa.Column("prayer_warrior_id", sa.Integer(), nullable=False),
|
|
sa.Column("message", sa.Text(), nullable=True),
|
|
sa.Column("prayed_at", sa.DateTime(), nullable=False),
|
|
sa.ForeignKeyConstraint(
|
|
["prayer_request_id"],
|
|
["prayer_requests.id"],
|
|
),
|
|
sa.ForeignKeyConstraint(
|
|
["prayer_warrior_id"],
|
|
["users.id"],
|
|
),
|
|
sa.PrimaryKeyConstraint("id"),
|
|
)
|
|
op.create_index(op.f("ix_prayers_id"), "prayers", ["id"], unique=False)
|
|
|
|
# Create services table
|
|
op.create_table(
|
|
"services",
|
|
sa.Column("id", sa.Integer(), nullable=False),
|
|
sa.Column("title", sa.String(), nullable=False),
|
|
sa.Column("description", sa.Text(), nullable=True),
|
|
sa.Column(
|
|
"service_type",
|
|
sa.Enum(
|
|
"SUNDAY_SERVICE",
|
|
"BIBLE_STUDY",
|
|
"PRAYER_MEETING",
|
|
"YOUTH_SERVICE",
|
|
"WOMEN_MEETING",
|
|
"MEN_MEETING",
|
|
"SPECIAL_SERVICE",
|
|
"OTHER",
|
|
name="servicetype",
|
|
),
|
|
nullable=False,
|
|
),
|
|
sa.Column("service_date", sa.Date(), nullable=False),
|
|
sa.Column("start_time", sa.DateTime(), nullable=False),
|
|
sa.Column("end_time", sa.DateTime(), nullable=True),
|
|
sa.Column("location", sa.String(), nullable=True),
|
|
sa.Column("minister_id", sa.Integer(), nullable=True),
|
|
sa.Column("is_active", sa.Boolean(), nullable=True),
|
|
sa.Column("created_by", sa.Integer(), nullable=False),
|
|
sa.Column("created_at", sa.DateTime(), nullable=False),
|
|
sa.ForeignKeyConstraint(
|
|
["created_by"],
|
|
["users.id"],
|
|
),
|
|
sa.ForeignKeyConstraint(
|
|
["minister_id"],
|
|
["users.id"],
|
|
),
|
|
sa.PrimaryKeyConstraint("id"),
|
|
)
|
|
op.create_index(op.f("ix_services_id"), "services", ["id"], unique=False)
|
|
|
|
# Create attendance_records table
|
|
op.create_table(
|
|
"attendance_records",
|
|
sa.Column("id", sa.Integer(), nullable=False),
|
|
sa.Column("service_id", sa.Integer(), nullable=False),
|
|
sa.Column("user_id", sa.Integer(), nullable=False),
|
|
sa.Column(
|
|
"status",
|
|
sa.Enum("PRESENT", "ABSENT", "LATE", "EXCUSED", name="attendancestatus"),
|
|
nullable=True,
|
|
),
|
|
sa.Column("check_in_time", sa.DateTime(), nullable=True),
|
|
sa.Column("check_out_time", sa.DateTime(), nullable=True),
|
|
sa.Column("notes", sa.Text(), nullable=True),
|
|
sa.Column("recorded_by", sa.Integer(), nullable=False),
|
|
sa.Column("recorded_at", sa.DateTime(), nullable=False),
|
|
sa.ForeignKeyConstraint(
|
|
["recorded_by"],
|
|
["users.id"],
|
|
),
|
|
sa.ForeignKeyConstraint(
|
|
["service_id"],
|
|
["services.id"],
|
|
),
|
|
sa.ForeignKeyConstraint(
|
|
["user_id"],
|
|
["users.id"],
|
|
),
|
|
sa.PrimaryKeyConstraint("id"),
|
|
)
|
|
op.create_index(
|
|
op.f("ix_attendance_records_id"), "attendance_records", ["id"], unique=False
|
|
)
|
|
|
|
|
|
def downgrade() -> None:
|
|
op.drop_index(op.f("ix_attendance_records_id"), table_name="attendance_records")
|
|
op.drop_table("attendance_records")
|
|
op.drop_index(op.f("ix_services_id"), table_name="services")
|
|
op.drop_table("services")
|
|
op.drop_index(op.f("ix_prayers_id"), table_name="prayers")
|
|
op.drop_table("prayers")
|
|
op.drop_index(op.f("ix_prayer_requests_id"), table_name="prayer_requests")
|
|
op.drop_table("prayer_requests")
|
|
op.drop_index(op.f("ix_messages_id"), table_name="messages")
|
|
op.drop_table("messages")
|
|
op.drop_index(op.f("ix_conversations_id"), table_name="conversations")
|
|
op.drop_table("conversations")
|
|
op.drop_index(op.f("ix_donations_id"), table_name="donations")
|
|
op.drop_table("donations")
|
|
op.drop_index(op.f("ix_ministry_activities_id"), table_name="ministry_activities")
|
|
op.drop_table("ministry_activities")
|
|
op.drop_index(op.f("ix_ministry_members_id"), table_name="ministry_members")
|
|
op.drop_table("ministry_members")
|
|
op.drop_index(op.f("ix_ministries_id"), table_name="ministries")
|
|
op.drop_table("ministries")
|
|
op.drop_index(
|
|
op.f("ix_notification_settings_id"), table_name="notification_settings"
|
|
)
|
|
op.drop_table("notification_settings")
|
|
op.drop_index(op.f("ix_notifications_id"), table_name="notifications")
|
|
op.drop_table("notifications")
|