models.py 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. from emus.settings import RETROPIE_WEBRETRO_SYSTEM_MAP
  2. from enum import Enum
  3. from django.conf import settings
  4. from django.core.validators import MaxValueValidator, MinValueValidator
  5. from django.db import models
  6. from django.urls import reverse
  7. from django_extensions.db.models import TimeStampedModel
  8. from django_extensions.db.fields import AutoSlugField
  9. from emus.utils import ChoiceEnum
  10. def get_screenshot_upload_path(instance, filename):
  11. return f"{instance.game_system.retropie_slug}/screenshots/{filename}"
  12. def get_marquee_upload_path(instance, filename):
  13. return f"{instance.game_system.retropie_slug}/marquee/{filename}"
  14. def get_video_upload_path(instance, filename):
  15. return f"{instance.game_system.retropie_slug}/videos/{filename}"
  16. def get_rom_upload_path(instance, filename):
  17. return f"{instance.game_system.retropie_slug}/{filename}"
  18. class Region(Enum):
  19. USA = "US"
  20. EUROPE = "EU"
  21. JAPAN = "JP"
  22. class BaseModel(TimeStampedModel):
  23. """A base model for providing name and slugged fields for organizational models"""
  24. name = models.CharField(max_length=255)
  25. slug = AutoSlugField(populate_from="name")
  26. class Meta:
  27. abstract = True
  28. def slugify_function(self, content):
  29. for element in settings.REMOVE_FROM_SLUGS:
  30. content = content.replace(element, "-")
  31. return content.lower()
  32. def __str__(self):
  33. return self.name
  34. class Genre(BaseModel):
  35. def get_absolute_url(self):
  36. return reverse("games:genre_detail", args=[self.slug])
  37. class Publisher(BaseModel):
  38. def get_absolute_url(self):
  39. return reverse("games:publisher_detail", args=[self.slug])
  40. class Developer(BaseModel):
  41. def get_absolute_url(self):
  42. return reverse("games:developer_detail", args=[self.slug])
  43. class GameSystem(BaseModel):
  44. retropie_slug = models.CharField(
  45. blank=True,
  46. null=True,
  47. max_length=50,
  48. )
  49. @property
  50. def webretro_core(self):
  51. return settings.RETROPIE_WEBRETRO_SYSTEM_MAP.get(self.retropie_slug, None)
  52. def get_absolute_url(self):
  53. return reverse("games:game_system_detail", args=[self.slug])
  54. class Game(BaseModel):
  55. class Region(ChoiceEnum):
  56. US = "USA"
  57. EU = "Europe"
  58. JP = "Japan"
  59. X = "Unknown"
  60. game_system = models.ForeignKey(
  61. GameSystem,
  62. on_delete=models.SET_NULL,
  63. null=True,
  64. )
  65. release_date = models.DateField(
  66. blank=True,
  67. null=True,
  68. )
  69. developer = models.ForeignKey(
  70. Developer,
  71. on_delete=models.SET_NULL,
  72. blank=True,
  73. null=True,
  74. )
  75. publisher = models.ForeignKey(
  76. Publisher,
  77. on_delete=models.SET_NULL,
  78. blank=True,
  79. null=True,
  80. )
  81. genre = models.ManyToManyField(
  82. Genre,
  83. )
  84. players = models.SmallIntegerField(
  85. default=1,
  86. )
  87. kid_game = models.BooleanField(
  88. default=False,
  89. )
  90. description = models.TextField(
  91. blank=True,
  92. null=True,
  93. )
  94. rating = models.FloatField(
  95. blank=True,
  96. null=True,
  97. validators=[MaxValueValidator(1), MinValueValidator(0)],
  98. )
  99. video = models.FileField(
  100. blank=True,
  101. null=True,
  102. max_length=300,
  103. upload_to=get_video_upload_path,
  104. )
  105. marquee = models.ImageField(
  106. blank=True,
  107. null=True,
  108. max_length=300,
  109. upload_to=get_marquee_upload_path,
  110. )
  111. screenshot = models.ImageField(
  112. blank=True,
  113. null=True,
  114. max_length=300,
  115. upload_to=get_screenshot_upload_path,
  116. )
  117. rom_file = models.FileField(
  118. blank=True,
  119. null=True,
  120. max_length=300,
  121. upload_to=get_rom_upload_path,
  122. )
  123. hack = models.BooleanField(
  124. default=False,
  125. )
  126. hack_version = models.CharField(
  127. max_length=255,
  128. blank=True,
  129. null=True,
  130. )
  131. english_patched = models.BooleanField(
  132. default=False,
  133. )
  134. english_patched_version = models.CharField(
  135. max_length=50,
  136. blank=True,
  137. null=True,
  138. )
  139. undub = models.BooleanField(
  140. default=False,
  141. )
  142. featured = models.BooleanField(
  143. default=False,
  144. )
  145. region = models.CharField(
  146. max_length=10,
  147. choices=Region.choices(),
  148. blank=True,
  149. null=True,
  150. )
  151. def __str__(self):
  152. return f"{self.name} for {self.game_system}"
  153. def get_absolute_url(self):
  154. return reverse("games:game_detail", args=[self.slug])
  155. def get_play_url(self):
  156. if self.game_system.retropie_slug in RETROPIE_WEBRETRO_SYSTEM_MAP.keys():
  157. return reverse("games:game_play_detail", args=[self.slug])