models.py 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. from flask_sqlalchemy import SQLAlchemy
  2. from flask_login import UserMixin
  3. from datetime import datetime
  4. import json
  5. from extensions import db
  6. class User(UserMixin, db.Model):
  7. __tablename__ = 'users'
  8. id = db.Column(db.Integer, primary_key=True)
  9. discord_id = db.Column(db.String(50), unique=True, nullable=False)
  10. username = db.Column(db.String(100), nullable=False)
  11. minecraft_uuid = db.Column(db.String(36), unique=True, nullable=True)
  12. minecraft_username = db.Column(db.String(16), nullable=True)
  13. is_admin = db.Column(db.Boolean, default=False)
  14. created_at = db.Column(db.DateTime, default=datetime.utcnow)
  15. class Event(db.Model):
  16. __tablename__ = 'events'
  17. id = db.Column(db.Integer, primary_key=True)
  18. event_type = db.Column(db.String(50), nullable=False) # CHAT, JOIN, QUIT, DEATH, TELEPORT
  19. player_uuid = db.Column(db.String(36), nullable=True)
  20. player_name = db.Column(db.String(16), nullable=True)
  21. content = db.Column(db.Text, nullable=True) # Chat message, death message, etc.
  22. location = db.Column(db.String(100), nullable=True) # Serialized location
  23. timestamp = db.Column(db.DateTime, default=datetime.utcnow)
  24. def to_dict(self):
  25. return {
  26. 'type': self.event_type,
  27. 'player': self.player_name,
  28. 'uuid': self.player_uuid,
  29. 'content': self.content,
  30. 'location': self.location,
  31. 'timestamp': self.timestamp.isoformat() if self.timestamp else None,
  32. 'inventory': json.loads(self.inventory.items) if self.inventory else None
  33. }
  34. class Inventory(db.Model):
  35. __tablename__ = 'inventories'
  36. id = db.Column(db.Integer, primary_key=True)
  37. event_id = db.Column(db.Integer, db.ForeignKey('events.id'), nullable=False)
  38. player_uuid = db.Column(db.String(36), nullable=False)
  39. items = db.Column(db.Text, nullable=False) # JSON serialized inventory
  40. timestamp = db.Column(db.DateTime, default=datetime.utcnow)
  41. event = db.relationship('Event', backref=db.backref('inventory', uselist=False))
  42. class Ticket(db.Model):
  43. __tablename__ = 'tickets'
  44. id = db.Column(db.Integer, primary_key=True)
  45. user_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False) # Creator
  46. title = db.Column(db.String(200), nullable=False)
  47. description = db.Column(db.Text, nullable=False)
  48. status = db.Column(db.String(20), default='OPEN') # OPEN, CLOSED, IN_PROGRESS
  49. closing_reason = db.Column(db.Text, nullable=True)
  50. closed_by_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=True)
  51. created_at = db.Column(db.DateTime, default=datetime.utcnow)
  52. creator = db.relationship('User', backref='created_tickets', foreign_keys=[user_id])
  53. closed_by = db.relationship('User', foreign_keys=[closed_by_id])
  54. assignments = db.relationship('TicketAssignment', backref='ticket', cascade="all, delete-orphan")
  55. comments = db.relationship('TicketComment', backref='ticket', cascade="all, delete-orphan", order_by='TicketComment.created_at')
  56. class TicketAssignment(db.Model):
  57. __tablename__ = 'ticket_assignments'
  58. user_id = db.Column(db.Integer, db.ForeignKey('users.id'), primary_key=True)
  59. ticket_id = db.Column(db.Integer, db.ForeignKey('tickets.id'), primary_key=True)
  60. assigned_at = db.Column(db.DateTime, default=datetime.utcnow)
  61. user = db.relationship('User', backref='assignments')
  62. class TicketComment(db.Model):
  63. __tablename__ = 'ticket_comments'
  64. id = db.Column(db.Integer, primary_key=True)
  65. ticket_id = db.Column(db.Integer, db.ForeignKey('tickets.id'), nullable=False)
  66. user_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False)
  67. content = db.Column(db.Text, nullable=False)
  68. is_hidden = db.Column(db.Boolean, default=False)
  69. created_at = db.Column(db.DateTime, default=datetime.utcnow)
  70. user = db.relationship('User', backref='comments')
  71. class LinkCode(db.Model):
  72. __tablename__ = 'link_codes'
  73. id = db.Column(db.Integer, primary_key=True)
  74. user_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False)
  75. code = db.Column(db.String(10), unique=True, nullable=False)
  76. created_at = db.Column(db.DateTime, default=datetime.utcnow)
  77. expires_at = db.Column(db.DateTime, nullable=False)
  78. user = db.relationship('User', backref=db.backref('link_code', uselist=False, cascade="all, delete-orphan"))
  79. class Application(db.Model):
  80. __tablename__ = 'applications'
  81. id = db.Column(db.Integer, primary_key=True)
  82. user_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False)
  83. position = db.Column(db.String(50), nullable=False) # MODERATOR, DEVELOPER
  84. content = db.Column(db.Text, nullable=False)
  85. status = db.Column(db.String(20), default='PENDING') # PENDING, ACCEPTED, REJECTED
  86. created_at = db.Column(db.DateTime, default=datetime.utcnow)
  87. user = db.relationship('User', backref='applications')