Spaces:
Runtime error
Runtime error
File size: 2,599 Bytes
4ac256d | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | from sqlalchemy import Column, Integer, String, Boolean, DateTime, ForeignKey
from sqlalchemy.orm import relationship
from datetime import datetime, timedelta
from config.database import Base
class AccessCode(Base):
__tablename__ = 'access_codes'
id = Column(Integer, primary_key=True)
code = Column(String(50), unique=True, nullable=False, index=True)
# Code metadata
created_at = Column(DateTime, default=datetime.utcnow, nullable=False)
expires_at = Column(DateTime, nullable=False) # Code itself expires (1 week default)
# Usage tracking
is_used = Column(Boolean, default=False, nullable=False)
used_at = Column(DateTime, nullable=True)
used_by_email = Column(String(255), nullable=True)
used_by_user_id = Column(Integer, ForeignKey('users.id'), nullable=True)
# Access grant info
access_duration_days = Column(Integer, default=30, nullable=False) # 1 month for beta testers
# Code type and promo info
code_type = Column(String(20), default='beta', nullable=False) # 'beta' or 'promo'
discount_percentage = Column(Integer, nullable=True) # For promo codes (e.g., 50 for 50% off)
promo_target = Column(String(20), nullable=True) # 'all' or 'first_time_only'
description = Column(String(500), nullable=True) # Custom description (e.g., "50% off for first-time users")
# Optional note
note = Column(String(255), nullable=True) # e.g., "Beta tester - Conference 2025"
# Relationships
user = relationship("User", foreign_keys=[used_by_user_id], backref="access_code_used")
def __repr__(self):
return f"<AccessCode {self.code} - Used: {self.is_used}>"
def is_valid(self):
"""Check if code is still valid (not used and not expired)"""
return not self.is_used and datetime.utcnow() < self.expires_at
def to_dict(self):
return {
'id': self.id,
'code': self.code,
'created_at': self.created_at.isoformat() if self.created_at else None,
'expires_at': self.expires_at.isoformat() if self.expires_at else None,
'is_used': self.is_used,
'used_at': self.used_at.isoformat() if self.used_at else None,
'used_by_email': self.used_by_email,
'access_duration_days': self.access_duration_days,
'code_type': self.code_type,
'discount_percentage': self.discount_percentage,
'promo_target': self.promo_target,
'description': self.description,
'note': self.note,
'is_valid': self.is_valid()
}
|