MarkUa

Untitled

May 4th, 2020
743
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 18.44 KB | None | 0 0
  1. from django.db import models
  2.  
  3. from django.db import models
  4. from django.contrib.contenttypes.fields import GenericForeignKey
  5. from django.contrib.contenttypes.models import ContentType
  6.  
  7.  
  8. # Create your models here.
  9.  
  10. # користувачі платформи   +
  11. class Users(models.Model):
  12.     name = models.CharField(max_length=100, null=True, blank=True, unique=True)
  13.     password_hash = models.CharField(max_length=64, default="")
  14.     email = models.CharField(max_length=100, null=True, blank=True, unique=True)
  15.     self_description = models.TextField(default="")
  16.     current_location_lat = models.FloatField(default=None)
  17.     current_location_long = models.FloatField(default=None)
  18.     last_time_visited = models.DateTimeField(auto_now_add=True)
  19.     role = models.CharField(max_length=6, default="simple")  # admin vip
  20.     show_profile_for_all = models.BooleanField(default=True)
  21.     is_blocked_by_admin = models.BooleanField(default=False)
  22.  
  23.     class Meta:
  24.         ordering = ["name"]
  25.  
  26.  
  27. # /users     /users/profiles/<:user_id>
  28.  
  29.  
  30. # теги оголошень, що використовуються для їх опису
  31. class ProposalsTags(models.Model):
  32.     title = models.CharField(max_length=256,  null=True, blank=True, unique=True)
  33.  
  34.     class Meta:
  35.         ordering = ["title"]
  36.  
  37.  
  38. # фото для опису містять хешкоди щоб уникати дублікатів
  39. class Images(models.Model):
  40.     path = models.FileField(upload_to='documents/%Y/%m/%d',default=None)
  41.     uploader_user_id = models.ForeignKey(Users, on_delete=models.CASCADE)
  42.     time_uploaded = models.DateTimeField(auto_now_add=True)
  43.     image_hash = models.CharField(max_length=77, default="")
  44.  
  45.     class Meta:
  46.         ordering = ["uploader_user_id", "time_uploaded"]
  47.         unique_together = ["uploader_user_id", "image_hash"]
  48.  
  49.  
  50. # редагування, видалення оглошення програмно можливе коли немає затверджених запитів купівлі, оренди, обміну
  51. # редагування, видалення програмно неможливе, якщо є назадоволений запит клієнта (непогоджений),
  52. # його можна зробити невидимим для при пошуку
  53. # чи є погодженні запити купівлі, оренди, обміну
  54. # якщо оголошення погодженно можна створити нове оголошення на основі цього яке б ви хотіли редагувати
  55. # і вже його редагувати
  56. # оголошення
  57.  
  58.  
  59. class Proposals(models.Model):
  60.     title = models.CharField(max_length=150, default="")
  61.     description = models.TextField(default="")
  62.     images = models.ManyToManyField('Images', blank=True, related_name='proposals_images')
  63.     search_tags = models.ManyToManyField('ProposalsTags', blank=True, related_name='proposals_tags')
  64.     creation_time = models.DateTimeField(auto_now_add=True)
  65.     creator_id = models.ForeignKey(Users, on_delete=models.CASCADE)
  66.  
  67.     proposal_type = models.CharField(max_length=8, default="sell")  # "SELL"   "RENT" "EXCHANGE"
  68.     proposal_item_type = models.CharField(max_length=8, default="goods")  # "SERVICES"  "GOODS"
  69.     proposal_item_state = models.CharField(max_length=4, default="new")  # "NEW" "USED"
  70.  
  71.     proposal_location_latitude = models.FloatField(default=None)
  72.     proposal_location_longitude = models.FloatField(default=None)
  73.  
  74.     available_items = models.IntegerField(default=1)
  75.     total_items = models.IntegerField(default=1)
  76.     set_email_notification = models.BooleanField(default=True)
  77.     set_visible_for_all = models.BooleanField(default=True)
  78.     is_blocked_by_admin = models.BooleanField(default=False)
  79.     ad_item_description_content_hashcode = models.CharField(max_length=77,
  80.                                                             default="")  # хешкод головних даних оголошення для уникнення несанкціонованої зміни інформації оголошення
  81.  
  82.     class Meta:
  83.         ordering = ["creator_id", "title"]
  84.         unique_together = ["title", "creator_id", "set_visible_for_all"]
  85.  
  86.  
  87. # /advertisements  /advertisements/<:ad_id> /advertisements/users/<:user_id>  /advertisements/goods/<:ad_type>
  88. # /advertisements/goods/<:state>  /advertisements/services/<:ad_type>
  89. # опис бажаних умов продажу для SELL/AUCTION
  90.  
  91.  
  92. # опис бажаних умов відданя товару чи послуги
  93. class ProposalsItemsGetConditions(models.Model):
  94.     proposal_id = models.OneToOneField(Proposals, on_delete=models.CASCADE, default=None)
  95.     description = models.TextField(default="")
  96.     rent_time_unit_measure = models.CharField(max_length=6,
  97.                                               default="minute")  # "MINUTE","HOUR","DAY","MONTH","YEAR" ЯКЩО ОРЕНДА
  98.     item_price_value = models.FloatField(default=1)
  99.     item_price_currency = models.CharField(max_length=3, default="uah")  # USD EUR
  100.     wished_items = models.ManyToManyField('DesiredItemsQueries', blank=True, related_name='desired_items')
  101.     #
  102.  
  103.  
  104. # дистанції між  користувачем і місця оголощень якщо їхні локації встановлені
  105. class UsersProposalsLocationsDistances(models.Model):
  106.     proposal_id = models.ForeignKey(Proposals, on_delete=models.CASCADE)
  107.     user_id = models.ForeignKey(Users, on_delete=models.CASCADE)
  108.     distance_in_km = models.FloatField(default=0.0)
  109.  
  110.     class Meta:
  111.         unique_together = ("proposal_id", "user_id")
  112.         ordering = ["user_id"]
  113.  
  114.  
  115. #  /advertisements/user/distances/<:user_id>
  116. #  /users/advertisement/distances/<:ad_id>
  117.  
  118.  
  119. # збережені оголошення
  120. class FavoriteProposals(models.Model):
  121.     favorite_proposal_id = models.ForeignKey(Proposals, on_delete=models.CASCADE)
  122.     user_id = models.ForeignKey(Users, on_delete=models.CASCADE)
  123.     added_to_favorite_time = models.DateTimeField(auto_now_add=True)
  124.     description = models.TextField(default="")
  125.     visible_for_others = models.BooleanField(default=False)  # щоб інші могли запоропонувати це тобі бачачи що ти б це хотів
  126.  
  127.     class Meta:
  128.         unique_together = ("favorite_proposal_id", "user_id")
  129.         ordering = ["user_id"]
  130.  
  131.  
  132. # /favorite/users/advertisements/  #/favorite/user/advertisements/<:user_id>
  133.  
  134.  
  135. # запит на бажане оголошення що моніторитиметься
  136. class DesiredItemsQueries(models.Model):
  137.     query_creator_id = models.ForeignKey(Users, on_delete=models.CASCADE)
  138.     query_description_text = models.TextField(default="")
  139.     query_description_tags = models.ManyToManyField('DesiredItemsDescriptionTags', blank=True,
  140.                                                     related_name='desire_item_description_tags')
  141.     proposal_type = models.CharField(max_length=10,
  142.                                      default="sell")  # ("SE", "SELL"), ("RE", "RENT"), ("EX", "EXCHANGE"),("NM", "NO MATTER")
  143.     proposal_item_type = models.CharField(max_length=10,
  144.                                           default="goods")  # ("GO", "GOODS"),("SE", "SERVICE"),("NM", "NO MATTER")
  145.     proposal_item_state = models.CharField(max_length=10,
  146.                                            default="new")  # ("N", "NEW"),("U", "USED"),("NM", "NO_MATTER")
  147.     notify_on_email = models.BooleanField(default=True)
  148.     query_creation_time = models.DateTimeField(auto_now_add=True)
  149.     visible_for_others = models.BooleanField(
  150.         default=False)  # щоб інші могли запоропонувати це тобі бачачи що ти б це хотів видно якщо віп
  151.  
  152.  
  153. # users/desired/advertisements  users/desired/advertisements/<:user_id>
  154. # users/desired/sell/advertisements users/desired/sell/advertisements/<:category_type>
  155. # users/desired/sell/advertisements/<:category_type>
  156.  
  157.  
  158. # теги для опису бажаного товару чи послуги
  159. class DesiredItemsDescriptionTags(models.Model):
  160.     title = models.CharField(max_length=256, unique=True, null=True, blank=True)
  161.  
  162.     class Meta:
  163.         ordering = ["title"]
  164.  
  165.  
  166. # повідомлення від системи про наявність бажаного обєкта за критерыями описаного в оголошенні
  167. class DesiredItemExistenceNotifications(models.Model):
  168.     query_id = models.ForeignKey(DesiredItemsQueries, on_delete=models.CASCADE,default=None)
  169.     proposal_id = models.ForeignKey(Proposals, on_delete=models.CASCADE,default=None)
  170.     notification_time = models.DateTimeField(auto_now_add=True)
  171.  
  172.     class Meta:
  173.         ordering = ["query_id"]
  174.  
  175.  
  176. #   users/desired/advertisements/notifications/<:user_id>
  177.  
  178. class ProposalsItemsRequests(models.Model):
  179.     request_user_id = models.ForeignKey(Users, on_delete=models.CASCADE)
  180.     request_type = models.CharField(max_length=10, default="sell")  # Sell Exchange Rent
  181.     request_message = models.TextField(default="")
  182.     requested_items = models.ManyToManyField('PossibleItems',
  183.                                              related_name='requested_items')  # робити перевірку чи дані
  184.     suggested_items = models.ManyToManyField('PossibleItems', blank=True,
  185.                                              related_name='suggested_items')  # елементи вже не використані
  186.     request_time = models.DateTimeField(auto_now_add=True)
  187.     request_watched = models.DateTimeField(default=None)
  188.     request_deadline_for_answer = models.DateTimeField(default=None)
  189.     request_subject_done = models.DateTimeField(default=None)  # чи виконане за реквастом
  190.     notify_on_email = models.BooleanField(default=True)
  191.     confirm_requested_subject_get_action = models.DateTimeField(default=None)
  192.     request_info_hashcode = models.CharField(max_length=77, default="")  # ad_item_description_content_hashcode + count
  193.  
  194.     class Meta:
  195.         ordering = ["request_user_id"]
  196.  
  197.  
  198. class PossibleItems(models.Model):
  199.     rent_time_unit_measure = models.CharField(max_length=6,
  200.                                               default="day")  # ("MINUTE"),("HOUR"),("DAY"),("MONTH"),("YEAR") якщо потрібно
  201.     rent_time_unit_count = models.IntegerField(default=0)
  202.     proposal_item_count = models.IntegerField(default=1)
  203.     proposal_item_id = models.ForeignKey(Proposals, on_delete=models.CASCADE)
  204.     confirmed_by_another_time = models.DateTimeField(default=None)
  205.     info_hashcode = models.CharField(max_length=77)
  206.  
  207.     class Meta:
  208.         unique_together = ("proposal_item_id", "proposal_item_count", "rent_time_unit_count", "rent_time_unit_measure")
  209.  
  210.  
  211. #gen
  212. # запропоновані гроші для оренди
  213. class AdditionalRequestsOffers(models.Model):
  214.     exchange_type = models.CharField(max_length=15, default="exchange")  # ( "SIMPLE EXCHANGE"),("CHAIN EXCHANGE") ("Rent")
  215.     description = models.TextField(default="")
  216.     request_content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE,default=None)
  217.     object_id = models.PositiveIntegerField(default=None)
  218.     content_object = GenericForeignKey('request_content_type', 'object_id')
  219.     suggested_price = models.FloatField(default=1)
  220.     suggested_currency = models.CharField(max_length=3, default="uah")
  221.     offer_type = models.CharField(max_length=15, default="want give")  # "WANT GIVE" "WANT RECEIVE"
  222.     offer_time = models.DateTimeField(auto_now_add=True)
  223.  
  224.  
  225. # відповідь можливому покупцю на запит купівлі
  226. class ProposalItemsRequestsAnswers(models.Model):
  227.     request_id = models.ForeignKey(ProposalsItemsRequests, on_delete=models.CASCADE)
  228.     accept_request = models.BooleanField(default=True)
  229.     answer_message = models.TextField(default="")
  230.     answer_time = models.DateTimeField(auto_now_add=True)
  231.     answer_watched = models.DateTimeField(default=None)
  232.     approve_deadline_for_requested_user = models.DateTimeField(default=None)
  233.     approve_accepted_time_for_requested_user = models.DateTimeField(
  234.         default=None)  # той хто швидше погодить якщо морочить голову робиться запит до адміна щоб обмежив його дії
  235.     confirm_requested_subject_give_action = models.DateTimeField(default=None)
  236.  
  237.  
  238. #   users/requests/buy/answers/<:buy_request_id> users/requests/buy/answers/
  239.  
  240.  
  241. #   згенерований можливий ланцюговий обмін  ДУМАЙ
  242. class PossibleChainExchangeProposals(models.Model):
  243.     chain_exchange_id = models.IntegerField()
  244.     user_id = models.ForeignKey(Users, on_delete=models.CASCADE)
  245.     chain_exchange_proposal_items = models.ManyToManyField('PossibleItems', blank=True,
  246.                                                            related_name="items_for_chain_exchange")  # елементи які пропонуються для обміну
  247.     creation_time = models.DateTimeField(auto_now_add=True)
  248.     previous_block_info_hashcode = models.CharField(max_length=77, default="")  # sha3
  249.     exchange_approve = models.DateTimeField(default=None)
  250.  
  251.  
  252. class ChainExchangeProposalsAnswers(models.Model):
  253.     chain_exchange_block_id = models.ForeignKey(PossibleChainExchangeProposals, on_delete=models.CASCADE)
  254.     accept_exchange_conditions = models.BooleanField(default=True)
  255.     answer_message = models.TextField(default="")  # відповідь на запропоновані речі для обміну
  256.     answer_time = models.DateTimeField(auto_now_add=True)
  257.     answer_next_chain_exchanger_watched = models.DateTimeField(default=None)
  258.     answer_deadline_for_next_chain_exchanger = models.DateTimeField(default=None)
  259.  
  260.  
  261. #gen
  262. class ExchangeWishes(models.Model): #ProposalItemsRequestsAnswers
  263.     exchange_type = models.CharField(max_length=15, default="exchange") # chain exchange
  264.     exchange_content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE, default=None)
  265.     object_id = models.PositiveIntegerField(default=None)
  266.     content_object = GenericForeignKey('exchange_content_type', 'object_id')
  267.  
  268.     wanted_items_for_chain_exchange = models.ManyToManyField('PossibleItems', blank=True,
  269.                                                              related_name='wanted_items_for_chain_exchange')
  270.     answer_message = models.TextField(default="")
  271.     answer_time = models.DateTimeField(auto_now_add=True)
  272.     answer_watched = models.DateTimeField(default=None)
  273.     approve_deadline_for_previous = models.DateTimeField(default=None)
  274.     approve_accepted = models.DateTimeField(default=None)
  275.  
  276.  
  277. #gen
  278. class FinishingRankings(models.Model):
  279.     ranking_subject_type = models.CharField(max_length=15, default="sell") #exchange "chain exchange" "rent" "sell"
  280.     request_ranking_content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE,default=None)  #
  281.     object_id = models.PositiveIntegerField(default=None)
  282.     content_object = GenericForeignKey('request_ranking_content_type', 'object_id')
  283.  
  284.     reviewer_id = models.ForeignKey(Users, on_delete=models.CASCADE)
  285.     review_text = models.TextField(default="")
  286.     review_ranking = models.FloatField(default=0.0)
  287.     review_time = models.DateTimeField(auto_now_add=True)
  288.     review_description_images = models.ManyToManyField('Images', blank=True, related_name='review_images')
  289.  
  290.  
  291. ##gen
  292. # request = GenericForeignKey("request_answer_id")
  293. class UserMessages(models.Model):
  294.     message_text = models.TextField(default="")
  295.     message_sender_id = models.ForeignKey(Users, on_delete=models.CASCADE)
  296.     time_send = models.DateTimeField(auto_now_add=True)
  297.     topic_type = models.CharField(max_length=25, default="Complain")  # ("Complain"),("SELL"),
  298.     # ("RE", "RENT"),("BA", "BARTER"),("CE", "CHAIN_EXCHANGE") ("Two Users Self Messages")
  299.     topic_id = models.ForeignKey(ContentType, on_delete=models.CASCADE)
  300.     description_images = models.ManyToManyField('Images', blank=True, related_name='description_images')
  301.  
  302.     class Meta:
  303.         ordering = ["topic_type", "topic_id", "time_send"]
  304.  
  305.  
  306. # request = GenericForeignKey("topic_id")
  307.  
  308.  
  309. #gen
  310. class Complains(models.Model):
  311.     topic_type = models.CharField(max_length=15,
  312.                                   default="bad content")  # "BAD CONTENT","SELL","RENT","EXCHANGE","CHAIN_EXCHANGE"
  313.     topic_content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE, default=None)
  314.     object_id = models.PositiveIntegerField(default=None)
  315.     content_object = GenericForeignKey('topic_content_type', 'object_id')
  316.  
  317.     complain_description_text = models.TextField(default="")
  318.     images = models.ManyToManyField('Images', blank=True, related_name='complain_description_images')
  319.     initiator_user = models.ForeignKey(Users, related_name='complain_initiator_user', on_delete=models.CASCADE)
  320.     subject_user = models.ForeignKey(Users, related_name="complain_subject_user", on_delete=models.CASCADE)
  321.     created_time = models.DateTimeField(auto_now_add=True)
  322.     resolved = models.BooleanField(default=False)
  323.  
  324.     class Meta:
  325.         ordering = ["topic_type"]
  326.  
  327.  
  328. class ComplainAnswers(models.Model):
  329.     complain_id = models.ForeignKey(Complains, on_delete=models.CASCADE)
  330.     arbiter_to_resolve = models.ForeignKey(Users, on_delete=models.CASCADE)
  331.     arbiter_verdict = models.TextField(default="")
  332.     sanction = models.CharField(max_length=30, default="no sanctions")  # "BLOCK ACCOUNT", "BLOCK SPECIFIED CONTENT",
  333.     # "BLOCK ACCOUNT AND BLOCK SPECIFIED CONTENT", "NO SANCTIONS","BAD COMPLAIN")
  334.     approve_complain = models.BooleanField(default=False)
  335.     sanction_time_available = models.DateTimeField(default=None)
  336.     answer_time = models.DateTimeField(auto_now_add=True)
  337.  
  338.  
  339. #   описати платежі
  340. class Donations(models.Model):
  341.     user_id = models.ForeignKey(Users, on_delete=models.CASCADE)
  342.     donation_time = models.DateTimeField(auto_now_add=True)
  343.     donation_message = models.TextField(default="")
  344.     donation_value = models.FloatField(default=1)
  345.     donation_currency = models.CharField(max_length=3, default="UAH")
  346.  
  347.  
  348. # class SanctionsByAdmins(models.Model): # санкції за неправомірну поведінку адміном
  349. # зробити узгодження виставлення оцінок
  350.  
  351.  
  352. from django.db import models
  353.  
  354.  
  355. # Create your models here.
  356.  
  357. class Document(models.Model):
  358.     docfile = models.FileField(upload_to='documents/%Y/%m/%d')
Add Comment
Please, Sign In to add comment