Guest User

Untitled

a guest
Jul 14th, 2018
286
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 18.33 KB | None | 0 0
  1. from django.db import models
  2. from django.contrib.auth.models import User
  3. import datetime
  4. from decimal import Decimal
  5. import pytz
  6.  
  7. DAYOFWEEK = ['M','T','W','R','F','S','U']
  8.  
  9. class UserProfile(models.Model):
  10. user = models.ForeignKey(User, unique=True,related_name='user_profiles')
  11. phone_number = models.CharField(max_length=50)
  12. PHONE_TYPE_CHOICES = ( ('Mobile','Mobile'), ('Landline','Landline'), )
  13. phone_type = models.CharField(max_length=15,choices = PHONE_TYPE_CHOICES)
  14. phone_verified = models.BooleanField(default=False)
  15. zip_postal = models.CharField(max_length=10)
  16. address = models.CharField(max_length=50)
  17. address2 = models.CharField(max_length=50)
  18. city = models.CharField(max_length=50)
  19. state_province = models.CharField(max_length=50)
  20. country = models.CharField(max_length=75)
  21. reg_ip = models.IPAddressField(editable=False, blank=True,null=True)
  22. menu_update_notify = models.BooleanField()
  23. allow_email_marketing = models.BooleanField()
  24. sms_ordering_enabled = models.BooleanField(default=False)
  25.  
  26. CREDIT_CARD_CHOICES = ( ('Visa','Visa'), ('Mastercard','Mastercard'), ('American Express','American Express'), )
  27. cc_type = models.CharField(max_length=30,choices=CREDIT_CARD_CHOICES)
  28. cc_number = models.DecimalField(max_digits=16, decimal_places=0)
  29. cc_expiration = models.DateField()
  30. cc_customer_name = models.CharField(max_length=50)
  31. cc_code = models.CharField(max_length=6)
  32.  
  33. class Admin:
  34. pass
  35. def __str__(self):
  36. return self.user.username
  37.  
  38. class AdminSettings(models.Model):
  39.  
  40. COMMON_TIMEZONE_CHOICES = tuple(zip(pytz.common_timezones, pytz.common_timezones))
  41. timezone = models.CharField(max_length=50, choices=COMMON_TIMEZONE_CHOICES)
  42. NOTIFY_CHOICES = ( ('Email','Email'), ('SMS','SMS'), ('Fax','Fax') )
  43. notify1 = models.CharField(max_length=5, choices=NOTIFY_CHOICES)
  44. notify2 = models.CharField(max_length=5, choices=NOTIFY_CHOICES)
  45. notify3 = models.CharField(max_length=5, choices=NOTIFY_CHOICES)
  46. fax_number = models.CharField(max_length=25)
  47. notify_email_address = models.EmailField()
  48. sms_gateway_email_address = models.EmailField()
  49.  
  50. email_smtp_server = models.CharField(max_length=100)
  51. email_smtp_port = models.PositiveSmallIntegerField()
  52. email_auth_username = models.CharField(max_length=50)
  53. email_auth_password = models.CharField(max_length=50)
  54.  
  55. PAYMENT_CHOICES = ( ('Cash','1'), ('Cash/Credit/Debit','3'), ('Credit/Debit','2') )
  56. payment_types = models.CharField(max_length=2, choices=PAYMENT_CHOICES)
  57. tax_rate = models.DecimalField(max_digits=4, decimal_places=2)
  58. suggest_tip_amount = models.BooleanField()
  59. suggested_tip_percent = models.DecimalField(max_digits=4, decimal_places=2)
  60.  
  61. UNITS_CHOICES = ( ('Miles','MI'), ('Kilometers','KM'), )
  62. distance_units = models.CharField(max_length=2, choices=UNITS_CHOICES)
  63. delivery_rate_per_distance = models.DecimalField(max_digits=4, decimal_places=2)
  64. delivery_base_rate = models.DecimalField(max_digits=5, decimal_places=2)
  65. max_delivery_radius = models.PositiveIntegerField()
  66. max_deliveries_per_hour = models.PositiveSmallIntegerField()
  67.  
  68. delivery_available = models.BooleanField(default=True)
  69. delivery_minimum_order = models.DecimalField(max_digits=5, decimal_places=2)
  70. mins_to_fill_order = models.PositiveSmallIntegerField()
  71.  
  72. MON_delivery_start = models.TimeField()
  73. MON_delivery_end = models.TimeField()
  74. TUE_delivery_start = models.TimeField()
  75. TUE_delivery_end = models.TimeField()
  76. WED_delivery_start = models.TimeField()
  77. WED_delivery_end = models.TimeField()
  78. THU_delivery_start = models.TimeField()
  79. THU_delivery_end = models.TimeField()
  80. FRI_delivery_start = models.TimeField()
  81. FRI_delivery_end = models.TimeField()
  82. SAT_delivery_start = models.TimeField()
  83. SAT_delivery_end = models.TimeField()
  84. SUN_delivery_start = models.TimeField()
  85. SUN_delivery_end = models.TimeField()
  86.  
  87. MON_operation_start = models.TimeField()
  88. MON_operation_end = models.TimeField()
  89. TUE_operation_start = models.TimeField()
  90. TUE_operation_end = models.TimeField()
  91. WED_operation_start = models.TimeField()
  92. WED_operation_end = models.TimeField()
  93. THU_operation_start = models.TimeField()
  94. THU_operation_end = models.TimeField()
  95. FRI_operation_start = models.TimeField()
  96. FRI_operation_end = models.TimeField()
  97. SAT_operation_start = models.TimeField()
  98. SAT_operation_end = models.TimeField()
  99. SUN_operation_start = models.TimeField()
  100. SUN_operation_end = models.TimeField()
  101.  
  102. google_analytics_script_txt = models.TextField()
  103.  
  104. class Admin:
  105. pass
  106. def __str__(self):
  107. return self.parameter
  108.  
  109. class Deliverer(models.Model):
  110. first_name = models.CharField(max_length=50)
  111. last_name = models.CharField(max_length=50)
  112. is_active = models.BooleanField(default=True)
  113. phone_number = models.CharField(max_length=50)
  114. email_address = models.EmailField()
  115. start_date = models.DateField(auto_now_add=True)
  116. total_deliveries = models.PositiveSmallIntegerField()
  117. last_delivery = models.DateTimeField()
  118. on_call = models.BooleanField(default=False)
  119.  
  120. def __str__(self):
  121. return self.first_name
  122.  
  123. class Admin:
  124. pass
  125.  
  126. class DeliveryAddress(models.Model):
  127. user = models.ForeignKey(UserProfile,related_name='delivery_addresses')
  128. is_default = models.BooleanField()
  129. is_verified = models.BooleanField(default=False)
  130. location_name = models.CharField(max_length=50)
  131. ADDRESS_TYPE_CHOICES = ( ('Home','Home'), ('Business','Business'), ('Apartment','Apartment'), ('Other','Other'), )
  132. address_type = models.CharField(max_length=20,choices=ADDRESS_TYPE_CHOICES)
  133. address = models.CharField(max_length=50)
  134. ADDRESS_UNIT_TYPE_CHOICES = ( ('Apt','Apt'), ('Suite','Suite'), ('Floor','Floor'), ('None','None'), )
  135. address_unit_type = models.CharField(max_length=20,choices=ADDRESS_UNIT_TYPE_CHOICES)
  136. address2 = models.CharField(max_length=50)
  137. zip_postal = models.CharField(max_length=10)
  138. state_province = models.CharField(max_length=50)
  139. country = models.CharField(max_length=50, default='US')
  140. est_latitude = models.CharField(max_length=20)
  141. est_longitude = models.CharField(max_length=20)
  142. miles_from_store = models.FloatField()
  143.  
  144. def __str__(self):
  145. return self.address
  146.  
  147. class Admin:
  148. pass
  149.  
  150. class MenuCategory(models.Model):
  151. name = models.CharField(max_length=50)
  152. is_active = models.BooleanField(default=True)
  153. css_class = models.CharField(max_length=50)
  154. picture = models.ImageField(upload_to='item_photos/menu/')
  155. hrs_available_start = models.TimeField(default=datetime.time(0,0,0,0) )
  156. hrs_available_end = models.TimeField(default=datetime.time(23,59,59,0))
  157. days_available = models.ManyToManyField('DayOfWeek',related_name='menu_sections')
  158. tooltip = models.CharField(max_length=200)
  159. position_index = models.PositiveSmallIntegerField()
  160.  
  161. class Meta:
  162. ordering = ['position_index']
  163. def __str__(self):
  164. return self.name
  165.  
  166. class Admin:
  167. pass
  168.  
  169.  
  170. class MenuSection(models.Model):
  171. name = models.CharField(max_length=50)
  172. is_active = models.BooleanField(default=True)
  173. css_class = models.CharField(max_length=50)
  174. picture = models.ImageField(upload_to='item_photos/menu/')
  175. hrs_available_start = models.TimeField(default=datetime.time(0,0,0,0) )
  176. hrs_available_end = models.TimeField(default=datetime.time(23,59,59,0))
  177. days_available = models.ManyToManyField('DayOfWeek',related_name='menu_sections')
  178. tooltip = models.CharField(max_length=200)
  179. position_index = models.PositiveSmallIntegerField()
  180. menu_category = models.ForeignKey('MenuCategory',related_name='menu_sections')
  181.  
  182. class Meta:
  183. ordering = ['position_index']
  184. def __str__(self):
  185. return self.name
  186.  
  187. class Admin:
  188. pass
  189.  
  190.  
  191. class MenuItem(models.Model):
  192. name = models.CharField(max_length=50)
  193. is_active = models.BooleanField(default=True)
  194. css_class = models.CharField(max_length=50)
  195. description = models.CharField(max_length=500)
  196. code = models.CharField(max_length=10)
  197. display_code = models.BooleanField(default=True)
  198. picture = models.ImageField(upload_to='item_photos/')
  199. hrs_available_start = models.TimeField(default=datetime.time(0,0,0,0) )
  200. hrs_available_end = models.TimeField(default=datetime.time(23,59,59,0))
  201. days_available = models.ManyToManyField('DayOfWeek',related_name='menu_items')
  202. menu_section = models.ForeignKey('MenuSection',related_name='menu_items')
  203. tooltip = models.CharField(max_length=200)
  204. position_index = models.PositiveSmallIntegerField()
  205. is_taxable = models.BooleanField(default=True)
  206.  
  207. nutritional_facts_text = models.TextField()
  208. nutritional_facts_icon = models.ImageField(upload_to='item_photos/')
  209. HEALTH_TYPE_CHOICES = ( ('None','None'), ('Low Carb','Carb'), ('Heart','Heart'), ('Low Salt','Salt'), ('Vegetarian','Vegetarian'), ('Sugar Free','Sugar'), ('Vegan','Vegan'))
  210. health_guide_type = models.CharField(max_length=10,choices=PAYMENT_TYPE_CHOICES)
  211.  
  212. base_price = models.DecimalField(max_digits=6, decimal_places=2)
  213. sale_price = models.DecimalField(max_digits=6, decimal_places=2)
  214. on_sale = models.BooleanField(default=False)
  215. show_price_beside_item = models.BooleanField(default=True)
  216.  
  217. def valid(target_datetime): #target_datetime is in the reference timezone and is a datetime.datetime object
  218. is_valid = True
  219. if self.is_active:
  220. is_valid = False
  221. if DAYOFWEEK[target_datetime.weekday()] not in self.days_available.objects.all(): # TBD fix ...?
  222. is_valid = False
  223. if target_datetime.time() < self.hrs_available_start or target_datetime.time() > self.hrs_available_end:
  224. is_valid = False
  225. return is_valid
  226.  
  227. def __str__(self):
  228. return self.name
  229. class Meta:
  230. ordering = ['position_index','name']
  231.  
  232. class Admin:
  233. pass
  234.  
  235. class MenuItemOptionGroup(models.Model):
  236. ##product = models.ManytoManyField(Product,related_name='product_attributes')
  237. menu_item = models.ForeignKey(MenuItem,related_name='menu_item_option_groups')
  238. group_text = models.CharField(max_length=50)
  239. tooltip = models.CharField(max_length=200)
  240. position_index = models.PositiveSmallIntegerField()
  241. is_active = models.BooleanField(default=True)
  242.  
  243. show_price_beside_options = models.BooleanField(default=True)
  244. GROUP_TYPE_CHOICES = ( ('Dropdown','Dropdown'), ('Radio','Radio'), ('Checkbox','Checkbox'), ('Multi Dropdown','Multi Dropdown'))
  245. group_type = CharField(max_length=20,choices=GROUP_TYPE_CHOICES)
  246. max_selections = models.PositiveSmallIntegerField()
  247.  
  248. def __str__(self):
  249. return self.group_text
  250. class Admin:
  251. pass
  252.  
  253.  
  254. class MenuItemOptionValue(models.Model):
  255. ##product = models.ManytoManyField(Product,related_name='product_attributes')
  256. name = models.CharField(max_length=50)
  257. is_default = models.BooleanField(default=False)
  258. is_active = models.BooleanField(default=True)
  259. tooltip = models.CharField(max_length=200)
  260. menu_item_option_group = models.ForeignKey(MenuItemOptionGroup,related_name='menu_item_option_values')
  261. extra_price = models.DecimalField(max_digits=6, decimal_places=2)
  262. is_taxable = models.BooleanField(default=True)
  263.  
  264. class Admin:
  265. pass
  266. def __str__(self):
  267. return self.name
  268.  
  269.  
  270.  
  271. class Order(models.Model):
  272. user = models.ForeignKey(User,related_name='orders')
  273. deliverer = models.ForeignKey(Deliverer,related_name='orders')
  274. RETRIEVAL_CHOICES = ( ('Pick Up','Pick Up'), ('Delivery','Delivery'), )
  275. retrieval_method = models.CharField(max_length=25,choices=RETRIEVAL_CHOICES)
  276. order_ip = models.IPAddressField()
  277. conf_code = models.CharField(max_length=15)
  278. name = models.CharField(max_length=50)
  279. PLACEMENT_CHOICES = ( ('SMS','SMS'), ('Website','Website'), ('Other','Other') )
  280. placement_method = models.CharField(max_length=20,choices=PLACEMENT_CHOICES)
  281. placement_info = models.CharField(max_length=50)
  282. STATUS_CHOICES = ( ('$CREATE','$CREATE') , ('SUBMITTED','SUBMITTED'), ('IN WORK','IN WORK'), ('BEING DELIVERED','BEING DELIVERED'), ('WAITING FOR PICKUP','WAITING FOR PICKUP'), ('REJECTED','REJECTED'), ('COMPLETED','COMPLETED'), )
  283. status = models.CharField(max_length=25,choices=STATUS_CHOICES)
  284. PAYMENT_TYPE_CHOICES = ( ('Credit','Credit'), ('Cash','Cash'), ('Debit','Debit') )
  285. payment_type = models.CharField(max_length=10,choices=PAYMENT_TYPE_CHOICES)
  286.  
  287. sub_total = models.DecimalField(max_digits=6, decimal_places=2)
  288. delivery_charge = models.DecimalField(max_digits=6, decimal_places=2)
  289. tax = models.DecimalField(max_digits=6, decimal_places=2)
  290. tip = models.DecimalField(max_digits=6, decimal_places=2)
  291. total_amount = models.DecimalField(max_digits=6, decimal_places=2)
  292. payment_received = models.BooleanField(default=False)
  293.  
  294. special_delivery_instructions = models.CharField(max_length=150)
  295. special_order_instructions = models.CharField(max_length=150)
  296.  
  297. invoice_sent = models.BooleanField(default=False)
  298. invoice_letter_txt = models.TextField(editable=False)
  299.  
  300. order_place_time = models.DateTimeField()
  301. order_request_time = models.DateTimeField()
  302. ready_time = models.DateTimeField()
  303. delivered_time = models.DateTimeField()
  304.  
  305. coupons = models.ManyToManyField('Coupon',related_name='orders')
  306. delivery_address = models.ForeignKey(DeliveryAddress,related_name='orders')
  307.  
  308. def __str__(self):
  309. return self.name
  310.  
  311. class Admin:
  312. pass
  313.  
  314.  
  315. class OrderItem(models.Model):
  316. menu_item = models.ForeignKey('MenuItem',related_name='order_items')
  317. item_attribute = models.ForeignKey('ItemAttribute',related_name='order_items')
  318. item_extra = models.ManyToManyField('ItemExtra',related_name='order_items')
  319. quantity = models.PositiveSmallIntegerField()
  320. order = models.ForeignKey(Order,related_name='order_items')
  321. code = models.CharField(max_length=15)
  322.  
  323. def __str__(self):
  324. return self.code
  325. class Admin:
  326. pass
  327.  
  328.  
  329. class OrderItemOptionValue(models.Model):
  330. order_item = models.ForeignKey('OrderItem',related_name='order_item_option_values')
  331. value = models.CharField(max_length=150)
  332. code = models.CharField(max_length=15)
  333.  
  334. #TBD ? use foreign key or just char field???
  335. menu_item_option_group = models.ForeignKey(MenuItemOptionGroup,related_name='menu_item_option_values')
  336.  
  337.  
  338. def __str__(self):
  339. return self.code
  340. class Admin:
  341. pass
  342.  
  343.  
  344. class DayOfWeek(models.Model):
  345. DAY_CHOICES = ( ('M','M'), ('T','T'), ('W','W'), ('R','R'), ('F','F'), ('S','S'), ('U','U'),)
  346. name = models.CharField(max_length=1, choices=DAY_CHOICES, unique=True)
  347.  
  348. class Admin:
  349. pass
  350. def __str__(self):
  351. return self.name
  352.  
  353.  
  354. class Coupon(models.Model):
  355. code = models.CharField(max_length=30)
  356. is_active = models.BooleanField(default=True)
  357. description = models.CharField(max_length=75)
  358. expiration_date = models.DateTimeField()
  359. min_valued_req = models.DecimalField(max_digits=8, decimal_places=2)
  360. hrs_available_start = models.TimeField(default=datetime.time(0,0,0,0) )
  361. hrs_available_end = models.TimeField(default=datetime.time(23,59,59,9999))
  362. days_available = models.ManyToManyField(DayOfWeek,related_name='coupons')
  363. can_combine = models.BooleanField(default=True)
  364. item = models.ManyToManyField(MenuItem,related_name='coupons')
  365. num_orders_before_expiration = models.PositiveSmallIntegerField(default=0)
  366. usage_count = models.PositiveIntegerField(editable=False)
  367.  
  368. def valid(target_datetime): #target_datetime is in the reference timezone and is a datetime.datetime object
  369. is_valid = True
  370. if self.num_orders_before_expiration > 0 and len(self.usage_count) >= self.num_orders_before_expiration:
  371. is_valid = False
  372. if self.is_active:
  373. is_valid = False
  374. if self.expiration_date > target_datetime:
  375. is_valid = False
  376. if DAYOFWEEK[target_datetime.weekday()] not in self.days_available.objects.all(): # TBD fix ...?
  377. is_valid = False
  378. if target_datetime.time() < self.hrs_available_start or target_datetime.time() > self.hrs_available_end:
  379. is_valid = False
  380. return is_valid
  381.  
  382. class Admin:
  383. pass
  384. def __str__(self):
  385. return self.code
  386.  
  387.  
  388. class Reservation(models.Model):
  389. user = models.ForeignKey(UserProfile,related_name='reservations')
  390. special_requests = models.CharField(max_length=150)
  391. number_seats = models.PositiveSmallIntegerField()
  392. when = models.DateTimeField()
  393. placed_on = models.DateTimeField(auto_now_add=True)
  394. STATUS_CHOICES = ( ('SUBMITTED','SUBMITTED'), ('APPROVED','APPROVED'), ('REJECTED','REJECTED'), ('COMPLETED','COMPLETED'), ('AGED','AGED'), )
  395. status = models.CharField(max_length=25,choices=STATUS_CHOICES)
  396. reservation_code = models.CharField(max_length=10)
  397. PLACEMENT_CHOICES = ( ('SMS','SMS'), ('Website','Website'), ('Other','Other') )
  398. placement_method = models.CharField(max_length=20,choices=PLACEMENT_CHOICES)
  399.  
  400. class Admin:
  401. pass
  402. def __str__(self):
  403. return self.reservation_code
  404.  
  405. class CommunicationLogging(models.Model):
  406. DIRECTION_CHOICES = ( ('IN','IN'),('OUT','OUT'), )
  407. direction = models.CharField(max_length=3, choices=DIRECTION_CHOICES, editable=False)
  408. comm_type = models.CharField(max_length=10, editable=False)
  409. user = models.ForeignKey(UserProfile,related_name='communication_logging')
  410. description = models.CharField(max_length=150, editable=False)
  411. cost = models.DecimalField(max_digits=8, decimal_places=3,default=Decimal('0.00'))
  412. msg_txt = models.TextField(editable=False)
  413.  
  414. class Admin:
  415. pass
  416. def __str__(self):
  417. return self.msg_txt
  418.  
  419.  
  420. class Promotion(models.Model):
  421. name = models.CharField(max_length=100)
  422. user_profile = models.ManyToManyField(UserProfile,related_name='promotions')
  423. date_sent = models.DateTimeField()
  424. promotion_text = models.TextField(editable=False)
  425.  
  426. def __str__(self):
  427. return self.name
  428.  
  429. class Admin:
  430. pass
Add Comment
Please, Sign In to add comment