models.py 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. import uuid
  2. from django.contrib.contenttypes.models import ContentType
  3. from django.core import serializers
  4. from django.db import models
  5. class BaseModel(models.Model):
  6. id = models.UUIDField(default=uuid.uuid4, editable=False)
  7. created = models.DateTimeField(auto_now_add=True)
  8. updated = models.DateTimeField(auto_now=True)
  9. objects = models.Manager()
  10. class Meta:
  11. abstract = True
  12. def get_content_type(self):
  13. return ContentType.objects.get_for_model(self)
  14. def model_name(self):
  15. try:
  16. return self._meta.verbose_name
  17. except AttributeError:
  18. return ""
  19. def to_json(self):
  20. return serializers.serialize('json', [self, ])
  21. class Account(BaseModel):
  22. class Meta:
  23. verbose_name = "account"
  24. verbose_name_plural = "accounts"
  25. username = models.CharField(max_length=100)
  26. password = models.CharField(max_length=100)
  27. email = models.CharField(max_length=100)
  28. last_login = models.DateTimeField()
  29. def __str__(self):
  30. return f"<Account {self.username} ({self.id})>"
  31. class Planet(BaseModel):
  32. class Meta:
  33. verbose_name = "planet"
  34. verbose_name_plural = "planets"
  35. name = models.CharField(max_length=100)
  36. def __str__(self):
  37. return f"<Planet {self.name} ({self.id})>"
  38. class Player(BaseModel):
  39. class Meta:
  40. verbose_name = "player"
  41. verbose_name_plural = "players"
  42. account = models.ForeignKey(Account, on_delete=models.PROTECT, verbose_name="Account")
  43. planet = models.ForeignKey(Planet, on_delete=models.PROTECT, verbose_name="Planet")
  44. def __str__(self):
  45. return f"<Player {self.account.username}@{self.planet.name} ({self.id})>"
  46. class Dome(BaseModel):
  47. class Meta:
  48. verbose_name = "dome"
  49. verbose_name_plural = "domes"
  50. name = models.CharField(max_length=100)
  51. player = models.ForeignKey(Player, on_delete=models.PROTECT, verbose_name="Player")
  52. population = models.IntegerField(default=0)
  53. def __str__(self):
  54. return f"<Dome {self.name} ({self.id})>"
  55. class DomeBuilding(BaseModel):
  56. class Meta:
  57. verbose_name = "dome_building"
  58. verbose_name_plural = "dome_buildings"
  59. name = models.CharField(max_length=255)
  60. def __str__(self):
  61. return f"<DomeBuilding {self.name} ({self.id})>"
  62. class DomeBuildingInstance(BaseModel):
  63. class Meta:
  64. verbose_name = "dome_building_instance"
  65. verbose_name_plural = "dome_building_instances"
  66. dome = models.ForeignKey(Dome, on_delete=models.PROTECT, verbose_name="Dome")
  67. dome_building = models.ForeignKey(DomeBuilding, on_delete=models.PROTECT, verbose_name="DomeBuilding")
  68. level = models.IntegerField(default=1)
  69. def __str__(self):
  70. return f"<DomeBuildingInstance {self.dome_building.name}@{self.dome.name} ({self.id})>"
  71. class LocalisedBaseModel(BaseModel):
  72. x = models.IntegerField()
  73. y = models.IntegerField()
  74. class Colony(LocalisedBaseModel):
  75. class Meta:
  76. verbose_name = "colony"
  77. verbose_name_plural = "colonies"
  78. player = models.ForeignKey(Player, on_delete=models.PROTECT, verbose_name="Player")
  79. name = models.CharField(max_length=100)
  80. def __str__(self):
  81. return f"<Colony {self.name} ({self.id})>"
  82. class ColonyBuilding(BaseModel):
  83. class Meta:
  84. verbose_name = "colony_building"
  85. verbose_name_plural = "colony_buildings"
  86. name = models.CharField(max_length=100)
  87. def __str__(self):
  88. return f"<ColonyBuilding {self.name} ({self.id})>"
  89. class ColonyBuildingInstance(LocalisedBaseModel):
  90. class Meta:
  91. verbose_name = "colony_building_instance"
  92. verbose_name_plural = "colony_building_instances"
  93. colony = models.ForeignKey(Colony, on_delete=models.PROTECT, verbose_name="Colony")
  94. colony_building = models.ForeignKey(ColonyBuilding, on_delete=models.PROTECT, verbose_name="ColonyBuilding")
  95. def __str__(self):
  96. return f"<ColonyBuilding {self.colony_building.name}@{self.colony.name} ({self.id})>"
  97. class Transport(BaseModel):
  98. class Meta:
  99. verbose_name = "transport"
  100. verbose_name_plural = "transports"
  101. name = models.CharField(max_length=100)
  102. max_distance = models.IntegerField()
  103. required_building = models.IntegerField(null=True)
  104. def __str__(self):
  105. return f"<Transport {self.name} ({self.id})>"
  106. class Route(BaseModel):
  107. class Meta:
  108. verbose_name = "route"
  109. verbose_name_plural = "routes"
  110. origin = models.ForeignKey(Colony, on_delete=models.PROTECT, verbose_name="OriginColony")
  111. target = models.ForeignKey(Colony, on_delete=models.PROTECT, verbose_name="TargetColony")
  112. transport = models.ForeignKey(Transport, on_delete=models.PROTECT, verbose_name="Transport")
  113. def __str__(self):
  114. return f"<Route {self.origin.name}>{self.target.name} ({self.id})>"