Advertisement
Guest User

Untitled

a guest
Feb 14th, 2017
160
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.73 KB | None | 0 0
  1. import psycopg2
  2.  
  3. from peewee import *
  4. from playhouse.shortcuts import model_to_dict
  5. from datetime import datetime
  6.  
  7.  
  8. def set_storage(app, db_config):
  9. basename = db_config.get('basename')
  10. username = db_config.get('login')
  11. pwd = db_config.get('password')
  12.  
  13. db = PostgresqlDatabase(basename, user=username)
  14.  
  15. class Operator(Model):
  16. class Meta:
  17. database = db
  18. constraints = [SQL('foreign key(restaurant_id) references restaurant')]
  19.  
  20. id = PrimaryKeyField()
  21. restaurant_id = IntegerField()
  22. last_name = CharField()
  23. first_name = CharField()
  24. father_name = CharField()
  25. login = CharField()
  26. password = CharField()
  27. last_login = DateTimeField()
  28.  
  29. class Role(Model):
  30. class Meta:
  31. database = db
  32. constraints = [SQL('foreign key(operator_id) references Operator')]
  33.  
  34. id = PrimaryKeyField()
  35. operator_id = IntegerField()
  36. can_order = BooleanField()
  37. can_admin = BooleanField()
  38.  
  39.  
  40. class Category(Model):
  41. class Meta:
  42. database = db
  43. constraints = [SQL('foreign key(parent_cat_id) references Category')]
  44.  
  45. id = PrimaryKeyField()
  46. parent_cat_id = IntegerField(null = True)
  47. title = CharField()
  48.  
  49. class Menu_Item(Model):
  50. class Meta:
  51. database = db
  52. constraints = [SQL('foreign key(cat_id) references Category')]
  53.  
  54. id = PrimaryKeyField()
  55. cat_id = IntegerField(null = True)
  56. title = CharField()
  57. price = FloatField()
  58.  
  59. class Restaurant(Model):
  60. class Meta:
  61. database = db
  62.  
  63. id = PrimaryKeyField()
  64. address = CharField()
  65.  
  66. class Order_Plate(Model):
  67. class Meta:
  68. database = db,
  69. constraints = [
  70. SQL('foreign key(order_id) references Restaurant_Order'),
  71. SQL('foreign key(menu_item_id) references Menu_Item')
  72. ]
  73.  
  74. id = PrimaryKeyField()
  75. order_id = IntegerField()
  76. menu_item_id = IntegerField()
  77. price = FloatField()
  78.  
  79. class Restaurant_Order(Model):
  80. class Meta:
  81. database = db,
  82. constraints = [
  83. SQL('foreign key(restaurant_id) references Restaurant'),
  84. SQL('foreign key(operator_id) references Operator')
  85. ]
  86.  
  87. id = PrimaryKeyField()
  88. restaurant_id = IntegerField()
  89. operator_id = IntegerField()
  90. order_time = DateTimeField(default=datetime.now)
  91.  
  92. class Storage:
  93. def __init__(self, app, db, db_config):
  94. self.app = app
  95. self.cfg = db_config
  96. self.db = db
  97.  
  98. db.connect()
  99.  
  100.  
  101. def operator(self, login):
  102. try:
  103. op = Operator.get(Operator.login == login)
  104. except DoesNotExist as e:
  105. return None
  106. return model_to_dict(op)
  107.  
  108. def restaurant(self, op):
  109. try:
  110. restaurant = Restaurant.get(Restaurant.id == op['restaurant_id'])
  111. except:
  112. return None
  113. return model_to_dict(restaurant)
  114.  
  115. def find_admin(self, login, password):
  116. admin = Operator \
  117. .select().join(Role, on=(Role.operator_id == Operator.id)) \
  118. .where(
  119. Operator.login == login,
  120. Operator.password == password,
  121. Role.can_admin == 't')
  122. if len(admin) == 0:
  123. return False
  124. return model_to_dict(admin.get())
  125.  
  126.  
  127. def menu(self):
  128. items = [model_to_dict(item) for item in Menu_Item.select()]
  129. categories = [model_to_dict(cat) for cat in Category.select()]
  130.  
  131. root_cats = [cat for cat in categories if cat['parent_cat_id'] is None]
  132. root_items = [item for item in items if item['cat_id'] is None]
  133. stack = [cat['id'] for cat in root_cats]
  134. while stack:
  135. cat_id = stack.pop()
  136. cur_cat = next(cat for cat in categories if cat['id'] == cat_id)
  137.  
  138. child_cats = [cat for cat in categories if cat['parent_cat_id'] == cat_id]
  139. stack.extend([cat['id'] for cat in child_cats])
  140. cur_cat['child_cats'] = child_cats
  141. cur_cat['child_items'] = [item for item in items if item['cat_id'] == cur_cat['id']]
  142.  
  143. return {
  144. 'child_cats': root_cats,
  145. 'child_items': root_items
  146. }
  147.  
  148.  
  149. for cat in categories:
  150. cat_items = [item for item in items if item['cat_id'] == cat['id']]
  151. cat['items'] = cat_items
  152.  
  153. return categories
  154.  
  155. def flat_items_cats(self, menu_list):
  156. items = menu_list['child_items']
  157. categories = []
  158. cats = menu_list['child_cats']
  159. while cats:
  160. cat = cats.pop()
  161. categories.append({
  162. 'id': cat['id'],
  163. 'title': cat['title']
  164. })
  165. cats.extend(cat['child_cats'])
  166. items.extend(cat['child_items'])
  167.  
  168. app.logger.debug(items)
  169. app.logger.debug(categories)
  170. return items, categories
  171.  
  172. def menu_update(self, menu_list):
  173. items, cats = self.flat_items_cats(menu_list)
  174. for item in items:
  175. app.logger.info('menu item(id: {}), title -> {}' \
  176. .format(item['id'], item['title']))
  177. Menu_Item \
  178. .update(title = item['title'], price = item['price']) \
  179. .where(Menu_Item.id == item['id']) \
  180. .execute()
  181.  
  182. for cat in cats:
  183. app.logger.info('category(id: {}), title -> {}' \
  184. .format(cat['id'], cat['title']))
  185. Category \
  186. .update(title = cat['title']) \
  187. .where(Category.id == cat['id']) \
  188. .execute()
  189.  
  190. return True
  191.  
  192. #TODO: consider this as redundant code
  193. def id_or_none(self, parent_cat_id):
  194. if not parent_cat_id:
  195. return None
  196. if parent_cat_id in ['null', 'undefined']:
  197. return None
  198. try:
  199. i = int(parent_cat_id)
  200. except:
  201. i = None
  202. return i
  203.  
  204. def create_menu_item(self, parent_cat_id=None):
  205. parent_cat_id = self.id_or_none(parent_cat_id)
  206. item = Menu_Item.create(
  207. title='New Menu Item',
  208. cat_id=parent_cat_id,
  209. price=0
  210. )
  211. return model_to_dict(item)
  212.  
  213. def remove_menu_item(self, item_id):
  214. item = Menu_Item.get(Menu_Item.id == item_id)
  215. deleted = item.delete_instance()
  216. return bool(deleted)
  217.  
  218.  
  219. def create_menu_category(self, parent_cat_id=None):
  220. parent_cat_id = self.id_or_none(parent_cat_id)
  221. cat = Category.create(
  222. title='New Menu Category',
  223. parent_cat_id=parent_cat_id
  224. )
  225. return model_to_dict(cat)
  226.  
  227. def remove_menu_category(self, cat_id):
  228. cat = Category.get(Category.id == cat_id)
  229. deleted = cat.delete_instance(recursive=True)
  230. return bool(deleted)
  231.  
  232. def create_order(self, r_id, op_id, plates, created_at):
  233. self.db.begin()
  234. app.logger.debug('rid: {}'.format(r_id))
  235. app.logger.debug('op: {}'.format(op_id))
  236. order = Restaurant_Order.create(
  237. operator_id=op_id,
  238. restaurant_id=r_id,
  239. order_time=created_at
  240. )
  241. if not order:
  242. self.db.rollback()
  243. return False
  244.  
  245. for plate in plates:
  246. try:
  247. plate = Menu_Item.get(Menu_Item.id == plate)
  248. except DoesNotExist as e:
  249. continue
  250. price = plate.get('price')
  251. plate_id = plate.get('id')
  252. order_plate = Order_Plate.create(
  253. order_id=order.id,
  254. menu_item_id=plate_id,
  255. price=price
  256. )
  257. if not order_plate:
  258. self.db.rollback()
  259. return False
  260.  
  261. self.db.commit()
  262. return model_to_dict(order)
  263.  
  264. return Storage(app, db, db_config)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement