models.py 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287
  1. from django.db import models
  2. from metaservicesynced.models.client import Client
  3. from metaservicesynced.models.orders import Orders
  4. MALE = 'M'
  5. FEMALE = 'F'
  6. GENDERS = [
  7. (MALE, 'Мужчина'),
  8. (FEMALE, 'Женщина'),
  9. ]
  10. class Sportsman(models.Model):
  11. """
  12. Определяет дополнительные поля для сервиса "Друг-спортсмен".
  13. Дополнительные данные, связанные с функционалом пользователя.
  14. """
  15. client = models.ForeignKey(Client, on_delete=models.DO_NOTHING, help_text="клиент, которому соответствует роль спортсмена")
  16. bio = models.CharField(blank=True, max_length=512, help_text="")
  17. level = models.FloatField(default=0, help_text="")
  18. birthdate = models.DateField(null=True, blank=True, help_text="")
  19. active_status = models.CharField(max_length=64, default="Active", help_text="")
  20. time_updated = models.DateTimeField(blank=True, null=True, help_text="")
  21. preferred_time = models.CharField(max_length=128, blank=True, help_text="список дней и времени")
  22. reliance_rating = models.FloatField(default=0)
  23. # blocked_sportsman = models.ManyToManyField("self", db_table="sportsman_blocked")
  24. blocked_sportsman = models.ManyToManyField("self",
  25. through="BlockedSportsman",
  26. through_fields=("sportsman", "sportsman_blocked"))
  27. browse_sportsman = models.ManyToManyField("self",
  28. through="BrowseSportsman",
  29. through_fields=("sportsman", "sportsman_browsed"))
  30. saved_sportsman = models.ManyToManyField("self",
  31. through="SavedSportsman",
  32. through_fields=("sportsman", "sportsman_saved"))
  33. sport_preferrence = models.ManyToManyField("Sport",
  34. through="SportPreferrence",
  35. through_fields=("sportsman", "sport"))
  36. achievement = models.ManyToManyField("Achievements",
  37. through="Achievement",
  38. through_fields=("sportsman", "achievement"))
  39. saved_event = models.ManyToManyField("Event",
  40. through="SavedEvent",
  41. through_fields=("sportsman", "event_savedevent"))
  42. participant = models.ManyToManyField("Event",
  43. through="Participant",
  44. through_fields=("sportsman", "event_participant"),
  45. related_name="sportsman_participant")
  46. browse_event = models.ManyToManyField("Event",
  47. through="BrowseEvent",
  48. through_fields=("sportsman", "event_browseevent"),
  49. related_name="sportsman_browseevent")
  50. gender = models.CharField(max_length=1, choices=GENDERS, default=None, null=True, blank=True)
  51. class Meta:
  52. db_table = "sportsman"
  53. verbose_name = "Спортсмена"
  54. verbose_name_plural = "Спортсмены"
  55. class Event(models.Model):
  56. '''
  57. Дополнительные данные для сервиса. Таблица основана на таблице orders
  58. '''
  59. orders = models.ForeignKey(Orders, on_delete=models.DO_NOTHING)
  60. sport = models.ForeignKey("Sport", on_delete=models.DO_NOTHING)
  61. host = models.ForeignKey("Sportsman", on_delete=models.DO_NOTHING)
  62. required_gender = models.CharField(max_length=1, choices=GENDERS, default=None, null=True, blank=True)
  63. #payment_transaction = models.ForeignKey("Payment_transaction", on_delete=models.DO_NOTHING)
  64. description = models.CharField(max_length=512, blank=True)
  65. # Event updated time
  66. time_updated = models.DateTimeField(auto_now=True, null=True, blank=True)
  67. # Time until which signing up is available
  68. time_close = models.DateTimeField(null=True, blank=True)
  69. max_participants = models.IntegerField(help_text="максимальное количесво участников")
  70. min_participants = models.IntegerField(help_text="минимальное количесво участников")
  71. max_age = models.IntegerField(help_text="максимальный возраст для участия")
  72. min_age = models.IntegerField(help_text="минимальный возраст для участия")
  73. required_level = models.IntegerField(null=True, blank=True, help_text="необходимое минимальное значение в поле level у пользователя для участия")
  74. location = models.CharField(max_length=100)
  75. event_place_start = models.CharField(max_length=128)
  76. event_place_finish_prediction = models.CharField(null=True, blank=True, max_length=128)
  77. event_place_finish_real = models.CharField(null=True, blank=True, max_length=128)
  78. is_public = models.BooleanField(default=True)
  79. #price = models.FloatField()
  80. class Meta:
  81. db_table = "event"
  82. verbose_name = "мероприятие"
  83. verbose_name_plural = "мероприятия"
  84. class Sport(models.Model):
  85. """
  86. Таблица с видами спорта в сервисе
  87. """
  88. title = models.CharField(max_length=128)
  89. image = models.ImageField(upload_to ='sports/sport/', help_text="иконка вида спорта")
  90. class Meta:
  91. db_table = "sport"
  92. verbose_name = "вид спорта"
  93. verbose_name_plural = "виды спорта"
  94. class SportPreferrence(models.Model):
  95. """
  96. Соединяющая таблица с пользователями и видами спорта, которые пользователь добавил как предпочитаемые
  97. """
  98. sportsman = models.ForeignKey(Sportsman, on_delete=models.DO_NOTHING, related_name="sportsman_sportpreferrence")
  99. sport = models.ForeignKey(Sport, on_delete=models.DO_NOTHING, related_name="sport")
  100. class Meta:
  101. db_table = "sport_preferrence"
  102. verbose_name = "предпочитаемый вид спорта"
  103. verbose_name_plural = "предпочитаемые виды спорта"
  104. constraints = [
  105. models.UniqueConstraint(fields=['sportsman', 'sport'], name='unique_sportpreferrence')
  106. ]
  107. class EventGallery(models.Model):
  108. """
  109. Соединяющая таблица между мероприятием и картинкой для хранения картинок для конкретного мероприятия
  110. """
  111. event = models.ForeignKey(Event, on_delete=models.DO_NOTHING)
  112. image = models.ImageField(upload_to ='sports/event/')
  113. class Meta:
  114. db_table = "event_gallery"
  115. verbose_name = "фото мероприятия"
  116. verbose_name_plural = "фото мероприятия"
  117. class SportsmanGallery(models.Model):
  118. """
  119. Соединяющая таблица между пользователем и картинкой для хранения картинок для конкретного пользователя
  120. """
  121. sportsman = models.ForeignKey(Sportsman, on_delete=models.DO_NOTHING)
  122. image = models.ImageField(upload_to ='sports/sportsman/%Y/%m/%d/')
  123. class Meta:
  124. db_table = "sportsman_gallery"
  125. verbose_name = "фото пользователя"
  126. verbose_name_plural = "фото пользователя"
  127. class Achievements(models.Model):
  128. """
  129. Achievments (not to confuse with 'Achievement') table contains a list of achievements.
  130. Таблицы со всеми достижениями в сервисе
  131. """
  132. title = models.CharField(max_length=128, help_text="Название достижения")
  133. description = models.CharField(max_length=255, help_text="Описание достижения, за что получается")
  134. image = models.ImageField(upload_to="sports/achievements/", help_text="статичная картинка достижения")
  135. image_animated = models.ImageField(null=True, blank=True, upload_to="sports/achievements/", help_text="анимированная картинка достижения. Если отсутствует, то используется статичная картинка")
  136. value = models.FloatField(default=0, help_text="Очки за выполение")
  137. class Meta:
  138. db_table = "achievements"
  139. verbose_name = "достижения"
  140. verbose_name_plural = "достижения"
  141. class Achievement(models.Model):
  142. """
  143. Achievement (not to confuse with 'Achievements') stores information about achievement history of users.
  144. Соединяющая таблица пользователя и достижения для истории полученных достижений у конкретного пользователя.
  145. """
  146. sportsman = models.ForeignKey(Sportsman, on_delete=models.DO_NOTHING, related_name="sportsman_achievement")
  147. achievement = models.ForeignKey(Achievements, on_delete=models.DO_NOTHING, related_name="achievement")
  148. time_received = models.DateTimeField(auto_now_add=True)
  149. class Meta:
  150. db_table = "achievement"
  151. verbose_name = "достижение пользователя"
  152. verbose_name_plural = "достижения пользователя"
  153. constraints = [
  154. models.UniqueConstraint(fields=['sportsman', 'achievement'], name='unique_achievement')
  155. ]
  156. class SavedEvent(models.Model):
  157. """
  158. Соединяющая таблица пользователя и мероприятия для реализации функционала сохранения мероприятия в список сохранённых у конкретного пользователя
  159. """
  160. sportsman = models.ForeignKey(Sportsman, on_delete=models.DO_NOTHING, related_name="sportsman_savedevent")
  161. event_savedevent = models.ForeignKey(Event, on_delete=models.DO_NOTHING, related_name="event_savedevent")
  162. class Meta:
  163. db_table = "saved_event"
  164. verbose_name = "сохранённое мероприятие"
  165. verbose_name_plural = "сохранённые мероприятия"
  166. constraints = [
  167. models.UniqueConstraint(fields=['sportsman', 'event_savedevent'], name='unique_saved_event')
  168. ]
  169. class SavedSportsman(models.Model):
  170. """
  171. Соединяющая таблица двух пользователей для реализации функционала сохранения пользователя в список сохранённых
  172. """
  173. sportsman = models.ForeignKey(Sportsman, on_delete=models.DO_NOTHING, related_name="sportsman_savedsportsman")
  174. sportsman_saved = models.ForeignKey(Sportsman, on_delete=models.DO_NOTHING, related_name="sportsman_saved")
  175. class Meta:
  176. db_table = "saved_sportsman"
  177. verbose_name = "сохранённый ползователь"
  178. verbose_name_plural = "сохранённые пользователи"
  179. constraints = [
  180. models.UniqueConstraint(fields=['sportsman', 'sportsman_saved'], name='unique_saved_sportsman')
  181. ]
  182. class BlockedSportsman(models.Model):
  183. """
  184. Соединяющая таблица двух пользователей для реализации функционала сохранения мероприятия в список заблокированных
  185. """
  186. sportsman = models.ForeignKey(Sportsman,
  187. on_delete=models.DO_NOTHING,
  188. related_name="sportsman_blockedsportsman")
  189. sportsman_blocked = models.ForeignKey(Sportsman,
  190. on_delete=models.DO_NOTHING,
  191. related_name="sportsman_blocked")
  192. class Meta:
  193. db_table = "blocked_sportsman"
  194. verbose_name = "заблокированный ползователь"
  195. verbose_name_plural = "заблокированные пользователи"
  196. constraints = [
  197. models.UniqueConstraint(fields=['sportsman', 'sportsman_blocked'], name='unique_blocked_sportsman')
  198. ]
  199. class Participant(models.Model):
  200. """
  201. Соединяющая таблица пользователя и мероприятия для регистрации участия
  202. """
  203. sportsman = models.ForeignKey(Sportsman, on_delete=models.DO_NOTHING, related_name="sportsman_participant")
  204. event_participant = models.ForeignKey(Event, on_delete=models.DO_NOTHING, related_name="event_participant")
  205. is_finished = models.BooleanField(default=False) # лучше такое поле или смотреть на дату окончания непосредственно в event?
  206. class Meta:
  207. db_table = "participant"
  208. verbose_name = "участник"
  209. verbose_name_plural = "участники"
  210. constraints = [
  211. models.UniqueConstraint(fields=['sportsman', 'event_participant'], name='unique_participant')
  212. ]
  213. class BrowseEvent(models.Model):
  214. """
  215. Соединяющая таблица пользователя и мероприятия для сохранения истории просмотра страниц мероприятий
  216. """
  217. sportsman = models.ForeignKey(Sportsman, on_delete=models.DO_NOTHING, related_name="sportsman_browseevent")
  218. event_browseevent = models.ForeignKey(Event, on_delete=models.DO_NOTHING, related_name="event_browseevent")
  219. time_browsed = models.DateTimeField(auto_now_add=True, help_text="Для сортировки объектов после соединения browseEvent и browseUser")
  220. class Meta:
  221. db_table = "browse_event"
  222. verbose_name = "просмотренное мероприятие"
  223. verbose_name_plural = "просмотренные мероприятия"
  224. constraints = [
  225. models.UniqueConstraint(fields=['sportsman', 'event_browseevent'], name='unique_browse_event')
  226. ]
  227. class BrowseSportsman(models.Model):
  228. """
  229. Соединяющая таблица двух пользователей для сохранения истории просмотра страниц спортсменов конкретным кользователем
  230. """
  231. sportsman = models.ForeignKey(Sportsman, on_delete=models.DO_NOTHING, related_name="sportsman_browsesportsman")
  232. sportsman_browsed = models.ForeignKey(Sportsman, on_delete=models.DO_NOTHING, related_name="sportsman_browsed")
  233. # Для сортировки объектов после соединения browseEvent и browseUser
  234. time_browsed = models.DateTimeField(auto_now_add=True, help_text="Для сортировки объектов после соединения browseEvent и browseUser")
  235. class Meta:
  236. db_table = "browse_sportsman"
  237. verbose_name = "просмотренный пользователь"
  238. verbose_name_plural = "просмотренные пользователи"
  239. constraints = [
  240. models.UniqueConstraint(fields=['sportsman', 'sportsman_browsed'], name='unique_browse_sportsman')
  241. ]
  242. # created events ищутся через event.host