- Profile Picture\
Donation Tracking\ Validation Rejection\ Subscription Data Export\ Admin Dashboard Logo\ Admin Navbar Reorganization
This commit is contained in:
50
models.py
50
models.py
@@ -16,6 +16,7 @@ class UserStatus(enum.Enum):
|
||||
canceled = "canceled" # User or admin canceled membership
|
||||
expired = "expired" # Subscription ended without renewal
|
||||
abandoned = "abandoned" # Incomplete registration (no verification/event/payment)
|
||||
rejected = "rejected" # Application rejected by admin
|
||||
|
||||
class UserRole(enum.Enum):
|
||||
guest = "guest"
|
||||
@@ -34,6 +35,15 @@ class SubscriptionStatus(enum.Enum):
|
||||
expired = "expired"
|
||||
cancelled = "cancelled"
|
||||
|
||||
class DonationType(enum.Enum):
|
||||
member = "member"
|
||||
public = "public"
|
||||
|
||||
class DonationStatus(enum.Enum):
|
||||
pending = "pending"
|
||||
completed = "completed"
|
||||
failed = "failed"
|
||||
|
||||
class User(Base):
|
||||
__tablename__ = "users"
|
||||
|
||||
@@ -115,6 +125,11 @@ class User(Base):
|
||||
renewal_reminders_sent = Column(Integer, default=0, nullable=False, comment="Count of renewal reminders sent")
|
||||
last_renewal_reminder_at = Column(DateTime, nullable=True, comment="Timestamp of last renewal reminder")
|
||||
|
||||
# Rejection Tracking
|
||||
rejection_reason = Column(Text, nullable=True, comment="Reason provided when application was rejected")
|
||||
rejected_at = Column(DateTime(timezone=True), nullable=True, comment="Timestamp when application was rejected")
|
||||
rejected_by = Column(UUID(as_uuid=True), ForeignKey('users.id'), nullable=True, comment="Admin who rejected the application")
|
||||
|
||||
created_at = Column(DateTime, default=lambda: datetime.now(timezone.utc))
|
||||
updated_at = Column(DateTime, default=lambda: datetime.now(timezone.utc), onupdate=lambda: datetime.now(timezone.utc))
|
||||
|
||||
@@ -225,6 +240,41 @@ class Subscription(Base):
|
||||
user = relationship("User", back_populates="subscriptions", foreign_keys=[user_id])
|
||||
plan = relationship("SubscriptionPlan", back_populates="subscriptions")
|
||||
|
||||
class Donation(Base):
|
||||
__tablename__ = "donations"
|
||||
|
||||
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
|
||||
|
||||
# Donation details
|
||||
amount_cents = Column(Integer, nullable=False)
|
||||
donation_type = Column(SQLEnum(DonationType), nullable=False, default=DonationType.public)
|
||||
status = Column(SQLEnum(DonationStatus), nullable=False, default=DonationStatus.pending)
|
||||
|
||||
# Donor information
|
||||
user_id = Column(UUID(as_uuid=True), ForeignKey('users.id'), nullable=True) # NULL for public donations
|
||||
donor_email = Column(String, nullable=True) # For non-members
|
||||
donor_name = Column(String, nullable=True) # For non-members
|
||||
|
||||
# Payment details
|
||||
stripe_checkout_session_id = Column(String, nullable=True)
|
||||
stripe_payment_intent_id = Column(String, nullable=True)
|
||||
payment_method = Column(String, nullable=True) # card, bank_transfer, etc.
|
||||
|
||||
# Metadata
|
||||
notes = Column(Text, nullable=True)
|
||||
created_at = Column(DateTime(timezone=True), default=lambda: datetime.now(timezone.utc))
|
||||
updated_at = Column(DateTime(timezone=True), onupdate=lambda: datetime.now(timezone.utc))
|
||||
|
||||
# Relationship
|
||||
user = relationship("User", backref="donations", foreign_keys=[user_id])
|
||||
|
||||
__table_args__ = (
|
||||
Index('idx_donation_user', 'user_id'),
|
||||
Index('idx_donation_type', 'donation_type'),
|
||||
Index('idx_donation_status', 'status'),
|
||||
Index('idx_donation_created', 'created_at'),
|
||||
)
|
||||
|
||||
class EventGallery(Base):
|
||||
__tablename__ = "event_galleries"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user