models.py 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  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(primary_key=True, 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. class Meta:
  73. abstract = True
  74. x = models.IntegerField()
  75. y = models.IntegerField()
  76. class Colony(LocalisedBaseModel):
  77. class Meta:
  78. verbose_name = "colony"
  79. verbose_name_plural = "colonies"
  80. player = models.ForeignKey(Player, on_delete=models.PROTECT, verbose_name="Player")
  81. name = models.CharField(max_length=100)
  82. def __str__(self):
  83. return f"<Colony {self.name} ({self.id})>"
  84. class ColonyBuilding(BaseModel):
  85. class Meta:
  86. verbose_name = "colony_building"
  87. verbose_name_plural = "colony_buildings"
  88. name = models.CharField(max_length=100)
  89. def __str__(self):
  90. return f"<ColonyBuilding {self.name} ({self.id})>"
  91. class ColonyBuildingInstance(LocalisedBaseModel):
  92. class Meta:
  93. verbose_name = "colony_building_instance"
  94. verbose_name_plural = "colony_building_instances"
  95. colony = models.ForeignKey(Colony, on_delete=models.PROTECT, verbose_name="Colony")
  96. colony_building = models.ForeignKey(ColonyBuilding, on_delete=models.PROTECT, verbose_name="ColonyBuilding")
  97. def __str__(self):
  98. return f"<ColonyBuilding {self.colony_building.name}@{self.colony.name} ({self.id})>"
  99. class Transport(BaseModel):
  100. class Meta:
  101. verbose_name = "transport"
  102. verbose_name_plural = "transports"
  103. name = models.CharField(max_length=100)
  104. max_distance = models.IntegerField()
  105. required_building = models.IntegerField(null=True)
  106. def __str__(self):
  107. return f"<Transport {self.name} ({self.id})>"
  108. class Route(BaseModel):
  109. class Meta:
  110. verbose_name = "route"
  111. verbose_name_plural = "routes"
  112. origin = models.ForeignKey(Colony, on_delete=models.PROTECT, verbose_name="OriginColony", related_name="origin_for")
  113. target = models.ForeignKey(Colony, on_delete=models.PROTECT, verbose_name="TargetColony", related_name="target_of")
  114. transport = models.ForeignKey(Transport, on_delete=models.PROTECT, verbose_name="Transport")
  115. def __str__(self):
  116. return f"<Route {self.origin.name}>{self.target.name} ({self.id})>"