Advertisement
Guest User

Untitled

a guest
May 23rd, 2019
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.26 KB | None | 0 0
  1. import flask
  2. import json
  3. import argparse
  4. from tools import correct_mood, correct_age, correct_company, correct_genre, correct_people, all_genres, genres_valuates
  5. from films import smart_function, cfilm, companies_valuate
  6. from drinks import drink_smart_function
  7. from mini_script import just
  8.  
  9. import psycopg2
  10.  
  11. app = flask.Flask("Film_recomendation")
  12.  
  13. params = dict(dbname="postgres", user="postgres", password="8246", host="localhost")
  14.  
  15.  
  16. def create_data_base(dbname_="postgres", user_="postgres", password_="8246", host_="localhost"):
  17. params = dict(dbname=dbname_, user=user_, password=password_, host=host_)
  18. with psycopg2.connect(**params) as conn:
  19. cur = conn.cursor()
  20. cur.execute('''
  21. CREATE TABLE bd_films (
  22. name VARCHAR(255) PRIMARY KEY,
  23. genre VARCHAR(255),
  24. mood integer,
  25. company VARCHAR(255),
  26. age integer,
  27. age_rating integer
  28. )
  29. ''')
  30. cur.execute('''
  31. CREATE TABLE login (
  32. nick VARCHAR(255) PRIMARY KEY,
  33. password VARCHAR(255)
  34. )
  35. ''')
  36. cur.execute('''
  37. CREATE TABLE user_session(
  38. nick VARCHAR(255) PRIMARY KEY,
  39. mood integer,
  40. company VARCHAR(255),
  41. people integer,
  42. age integer,
  43. genres VARCHAR(255),
  44. FOREIGN KEY(nick) REFERENCES login(nick)
  45. )
  46. ''')
  47.  
  48. cur.execute('''
  49. CREATE TABLE genres_valuates(
  50. first_genre VARCHAR(255),
  51. second_genre VARCHAR(255),
  52. value double precision,
  53. PRIMARY KEY(first_genre, second_genre)
  54. )
  55. ''')
  56.  
  57. cur.execute('''
  58. CREATE TABLE companies_valuates(
  59. first_company VARCHAR(255),
  60. second_company VARCHAR(255),
  61. value DOUBLE PRECISION,
  62. PRIMARY KEY (first_company, second_company)
  63. )
  64. ''')
  65.  
  66. with psycopg2.connect(**params) as conn:
  67. film_info = just()
  68. add_cur = conn.cursor()
  69. for cur_film in film_info:
  70. add_film_info(add_cur, cur_film['film'], cur_film['genre'], cur_film['mood'], cur_film['company'],
  71. cur_film['age'], cur_film['age_rating'])
  72.  
  73. for ((f_genre, s_genre), g_value) in genres_valuates.items():
  74. add_genres_valuate(add_cur, f_genre, s_genre, g_value)
  75.  
  76. for((f_c, s_c), c_v) in companies_valuate.items():
  77. add_companies_valuate(add_cur, f_c, s_c, c_v)
  78.  
  79. conn.commit()
  80.  
  81. return params
  82.  
  83.  
  84. def add_user_login(cur_cursor, cur_nick, cur_password):
  85. cur_cursor.execute("INSERT INTO login (nick, password) VALUES (%s, %s)", (cur_nick, cur_password, ))
  86.  
  87.  
  88. def add_user_session_mood(cur_cursor, cur_nick, cur_mood):
  89. cur_cursor.execute("UPDATE user_session SET mood = %s WHERE nick = %s", (cur_mood, cur_nick, ))
  90.  
  91.  
  92. def add_user_session_company(cur_cursor, cur_nick, cur_company, cur_people):
  93. cur_cursor.execute("UPDATE user_session SET company = %s, people = %s WHERE nick = %s",
  94. (cur_company, cur_people, cur_nick, ))
  95.  
  96.  
  97. def add_user_session_age(cur_cursor, cur_nick, cur_age):
  98. cur_cursor.execute("UPDATE user_session SET age = %s WHERE nick = %s", (cur_age, cur_nick, ))
  99.  
  100.  
  101. def add_user_session_genres(cur_cursor, cur_nick, cur_genres):
  102. cur_cursor.execute("UPDATE user_session SET genres = %s WHERE nick = %s", (cur_genres, cur_nick, ))
  103.  
  104.  
  105. def add_film_info(cur_cursor, cur_film_name, cur_genre, cur_mood, cur_company, cur_age, cur_age_rating):
  106. cur_cursor.execute("INSERT INTO bd_films (name, genre, mood, company, age, age_rating)"
  107. " VALUES (%s, %s, %s, %s, %s, %s)"
  108. , (cur_film_name, cur_genre, cur_mood, cur_company, cur_age, cur_age_rating, ))
  109.  
  110.  
  111. def add_genres_valuate(cur_cursor, first_genre, second_genre, genres_value):
  112. cur_cursor.execute("INSERT INTO genres_valuates (first_genre, second_genre, value)"
  113. " VALUES (%s, %s, %s)", (first_genre, second_genre, genres_value, ))
  114.  
  115.  
  116. def add_companies_valuate(cur_cursor, first_company, second_company, company_value):
  117. cur_cursor.execute("INSERT INTO companies_valuates (first_company, second_company, value)"
  118. " VALUES (%s, %s, %s)", (first_company, second_company, company_value, ))
  119.  
  120.  
  121. def check_nick(cur_cursor, cur_nick):
  122. cur_cursor.execute("SELECT * FROM login WHERE nick = %s", (cur_nick, ))
  123. for row in cur_cursor: # i dont know how can i check null query, is None doesnt work
  124. return True
  125. return False
  126.  
  127.  
  128. def check_all_param(cur_cursor, cur_nick):
  129. cur_cursor.execute("SELECT mood, company, people, age, genres FROM user_session WHERE nick = %s", (cur_nick, ))
  130. row = cur_cursor.fetchone()
  131. dct_param = {'mood': row[0], 'company': row[1], 'people': row[2], 'age': row[3]}
  132. if row[4] is not None:
  133. dct_param['genres'] = row[4].split(' ')
  134. return dct_param
  135.  
  136.  
  137. def check_main_param_user(client_dct):
  138. if client_dct['age'] is None or client_dct['company'] is None or client_dct['mood'] is None:
  139. return False
  140. return True
  141.  
  142.  
  143. def choose_film(cur_intrests):
  144. if 'genres' not in cur_intrests:
  145. cur_intrests['genres'] = all_genres
  146. name_film = None
  147. value = -100
  148. with psycopg2.connect(**params) as conn:
  149. cur_cursor = conn.cursor()
  150. q = "SELECT name, genre, mood, company, age, age_rating FROM bd_films"
  151. cur_cursor.execute(q)
  152. for f in cur_cursor:
  153. name, genre, mood, company, age, age_rating = f
  154. cur_dct = {'name': name, 'mood': mood, 'company': company, 'age': age, 'age_rating': age_rating, 'genre': genre}
  155. cur_film = cfilm(cur_dct)
  156. if smart_function(cur_film, cur_intrests) > value:
  157. value = smart_function(cur_film, cur_intrests)
  158. name_film = cur_film.name
  159. return name_film
  160.  
  161.  
  162. def choose_film2(cur_intrests):
  163. if 'genres' not in cur_intrests:
  164. cur_intrests['genres'] = all_genres
  165.  
  166. with psycopg2.connect(**params) as conn:
  167. cur = conn.cursor()
  168. cur.execute("WITH main_films AS ( "
  169. "SELECT name, company, MAX(t1.value) as max_genre,"
  170. " 1 - CAST(ABS(%s - mood) AS NUMERIC(6,1))/10 as mood_value,"
  171. " 1 - (CAST(ABS(age_rating - %s) AS NUMERIC(6,2)))/100 as age_value"
  172. " from (bd_films INNER JOIN genres_valuates on"
  173. " bd_films.genre = genres_valuates.first_genre) t1"
  174. " WHERE t1.second_genre = ANY(%s)"
  175. " GROUP BY name )"
  176. " SELECT name, max_genre + mood_value + age_value + MAX(t1.value)"
  177. " as final_value from"
  178. " (main_films join companies_valuates on main_films.company = companies_valuates.first_company) t1"
  179. " WHERE t1.second_company = %s"
  180. " GROUP BY name, max_genre, mood_value, age_value"
  181. " ORDER BY final_value DESC LIMIT 10"
  182. "", (cur_intrests['mood'], cur_intrests['age'], cur_intrests['genres'], cur_intrests['company'],))
  183. vec = []
  184. for row in cur:
  185. vec.append(row[0])
  186. return vec
  187.  
  188.  
  189. @app.route('/register', methods=['POST'])
  190. def register():
  191. with psycopg2.connect(**params) as conn:
  192. cur_cursor = conn.cursor()
  193. if check_nick(cur_cursor, flask.request.json['nick']):
  194. flask.abort(400)
  195. else:
  196. add_user_login(cur_cursor, flask.request.json['nick'], flask.request.json['password'])
  197. conn.commit()
  198. return 'ok'
  199.  
  200.  
  201. @app.route('/check_log', methods=['POST'])
  202. def check_login():
  203. cur_nick = flask.request.json['login']
  204. cur_password = flask.request.json['password']
  205. with psycopg2.connect(**params) as conn:
  206. cur = conn.cursor()
  207. cur.execute("SELECT nick, password FROM login WHERE nick = %s and password = %s", (cur_nick, cur_password,)) # here
  208. for row in cur:
  209. return 'ok'
  210. return flask.abort(400)
  211.  
  212.  
  213. @app.route('/add_session_of_user', methods=['POST'])
  214. def add_session_of_user():
  215. with psycopg2.connect(**params) as conn:
  216. cur = conn.cursor()
  217. cur.execute("INSERT INTO user_session (nick) VALUES (%s)", (flask.request.json['nick'], ))
  218. conn.commit()
  219. return 'ok'
  220.  
  221.  
  222. @app.route('/prev_param', methods=['POST'])
  223. def prev_param():
  224. with psycopg2.connect(**params) as conn:
  225. cur = conn.cursor()
  226. cur.execute("SELECT mood, age, company, people FROM user_session WHERE nick = %s", (flask.request.json['nick'], )) # here
  227. row = cur.fetchone()
  228. return json.dumps({'age': row[1], 'mood': row[0], 'company': row[2], 'people': row[3]}) # and here
  229.  
  230.  
  231. @app.route('/add_mood', methods=['POST'])
  232. def add_mood():
  233. if not correct_mood(flask.request.json['mood']):
  234. flask.abort(400)
  235. else:
  236. with psycopg2.connect(**params) as conn:
  237. cur = conn.cursor()
  238. add_user_session_mood(cur, flask.request.json['nick'], flask.request.json['mood'])
  239. conn.commit()
  240. return 'ok'
  241.  
  242.  
  243. @app.route('/add_genres', methods=['POST'])
  244. def add_genres():
  245. if not correct_genre(flask.request.json['genres']):
  246. return flask.abort(400)
  247. else:
  248. with psycopg2.connect(**params) as conn:
  249. cur = conn.cursor()
  250. add_user_session_genres(cur, flask.request.json['nick'], flask.request.json['genres'])
  251. conn.commit()
  252. return 'ok'
  253.  
  254.  
  255. @app.route('/end_session', methods=['POST'])
  256. def end_session():
  257. with psycopg2.connect(**params) as conn:
  258. cur = conn.cursor()
  259. cur.execute("DELETE FROM user_session WHERE nick = %s", (flask.request.json['nick'], ))
  260. conn.commit()
  261. return 'ok'
  262.  
  263.  
  264. @app.route('/add_age', methods=['POST'])
  265. def add_age():
  266. if not correct_age(flask.request.json['age']):
  267. flask.abort(400)
  268. else:
  269. with psycopg2.connect(**params) as conn:
  270. cur = conn.cursor()
  271. add_user_session_age(cur, flask.request.json['nick'], flask.request.json['age'])
  272. conn.commit()
  273. return 'ok'
  274.  
  275.  
  276. @app.route('/add_company', methods=['POST'])
  277. def add_company():
  278. if not correct_company(flask.request.json['company']) or not correct_people(flask.request.json['people']):
  279. flask.abort(400)
  280. else:
  281. with psycopg2.connect(**params) as conn:
  282. cur = conn.cursor()
  283. add_user_session_company(cur, flask.request.json['nick'], flask.request.json['company'],
  284. flask.request.json['people'])
  285. conn.commit()
  286. return 'ok'
  287.  
  288.  
  289. @app.route('/get_film', methods=['GET'])
  290. def get_film():
  291. with psycopg2.connect(**params) as conn:
  292. cur_cursor = conn.cursor()
  293. param_user = check_all_param(cur_cursor, flask.request.json['nick'])
  294. if check_main_param_user(param_user):
  295. return json.dumps(choose_film2(param_user))
  296. else:
  297. flask.abort(400)
  298.  
  299.  
  300. @app.route('/get_drink', methods=['GET'])
  301. def get_drink():
  302. with psycopg2.connect(**params) as conn:
  303. cur_cursor = conn.cursor()
  304. param_user = check_all_param(cur_cursor, flask.request.json['nick'])
  305. if check_main_param_user(param_user):
  306. return json.dumps(drink_smart_function(param_user))
  307. else:
  308. flask.abort(400)
  309.  
  310.  
  311. if __name__ == '__main__':
  312. parser = argparse.ArgumentParser()
  313. subs = parser.add_subparsers()
  314.  
  315. create_parser = subs.add_parser('create_data')
  316. create_parser.set_defaults(method='create_data')
  317.  
  318. main_parser = subs.add_parser('main')
  319. main_parser.set_defaults(method='main')
  320.  
  321. main_parser.add_argument('--host', default='localhost')
  322. main_parser.add_argument('--dbname')
  323. main_parser.add_argument('--user')
  324. main_parser.add_argument('--password')
  325.  
  326. args = parser.parse_args()
  327. if args.method == 'create_data':
  328. create_data_base()
  329. else:
  330. app.run(args.host, args.port, debug=True, threaded=True)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement