Advertisement
Guest User

Untitled

a guest
Dec 3rd, 2016
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 34.77 KB | None | 0 0
  1. import os
  2. from flask import Flask, abort, request, jsonify, g, url_for, render_template, send_from_directory, redirect
  3. from flask.ext.sqlalchemy import SQLAlchemy
  4. from flask.ext.httpauth import HTTPBasicAuth
  5. from passlib.apps import custom_app_context as pwd_context
  6. from itsdangerous import (TimedJSONWebSignatureSerializer
  7. as Serializer, BadSignature, SignatureExpired)
  8.  
  9. from models import*
  10. from flask_restful import reqparse, abort, Api, Resource, fields, marshal_with
  11. from sqlalchemy import exc
  12. from werkzeug import secure_filename
  13. import boto3
  14. import magic
  15. import requests
  16. from bs4 import BeautifulSoup
  17. import hashlib
  18. import binascii
  19. from flask.ext.cors import CORS, cross_origin
  20. import datetime
  21. import random
  22. headers = {
  23. 'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.98 Safari/537.36',
  24. 'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'
  25.  
  26. }
  27. auth = HTTPBasicAuth()
  28. s3 = boto3.resource('s3')
  29. app.secret_key = 'some_secret'
  30. bucket = 'ben-uguru'
  31. filename = 'db.sqlite'
  32. s3 = boto3.resource('s3')
  33.  
  34. cors = CORS(app, resources={r"/api/channels.json": {"origins": "localhost"}})
  35.  
  36.  
  37. cardsVal = 0
  38. @auth.verify_password
  39. def verify_password(email_or_token, password):
  40. user = User.verify_auth_token(email_or_token)
  41. if not user:
  42. user = User.query.filter_by(email=email_or_token).first()
  43. if not user or not user.verify_password(password):
  44. return False
  45. g.user = user
  46. return True
  47.  
  48.  
  49. user_fields = {
  50. 'email':fields.String,
  51. 'token':fields.String
  52. }
  53.  
  54. RegisterUserFields = {
  55. 'id': fields.Integer,
  56. 'email': fields.String,
  57. }
  58. putRequestFields = {
  59. 'token':fields.String,
  60. 'Message':fields.String(default='Successfully uploaded!')
  61. }
  62. class RegisterUser(Resource):
  63. @marshal_with(RegisterUserFields)
  64. def post(self):
  65. jsonData = request.get_json(force=True)
  66. bucket = jsonData['bucket']
  67. email = jsonData['email']
  68. password = jsonData['password']
  69. if email is None or password is None:
  70. abort(400)
  71. if User.query.filter_by(email=email).first() is not None:
  72. abort(400)
  73. user = User(email=email)
  74. # file = jsonData['filename']
  75. # if file:
  76. # generate_static_token = user.generate_auth_token(700)
  77. # renameFile = file.replace(file,str(generate_static_token))
  78. # s3.meta.client.upload_file(renameFile, str(bucket),renameFile)
  79. # user.static_uri_token = generate_static_token
  80. # else:
  81. # user.static_uri_token = None
  82. user.hash_password(password)
  83. db.session.add(user)
  84. db.session.commit()
  85. return user
  86.  
  87. @auth.login_required
  88. @marshal_with(putRequestFields)
  89. def put(self):
  90. token = g.user.generate_auth_token(700)
  91. user.token = token
  92. db.session.commit()
  93. return user
  94.  
  95.  
  96. class UploadMultipleFiles(Resource):
  97. def post(self):
  98. jsonData = request.get_json(force=True)
  99. token = jsonData['token']
  100. user = User.query.filter_by(token=token).first()
  101. if not user:
  102. abort(400)
  103. filename = jsonData['filename']
  104. filetype = jsonData['filetype']
  105. bucket = jsonData['bucket']
  106. project_id = jsonData['project_id']
  107. viewIDData = jsonData['view_id']
  108. getFileType = magic.from_file(filename)
  109. if filetype not in getFileType:
  110. abort(422)
  111. user = User.query.filter_by(token=token).first()
  112. getProjects = UserProjects.query.filter_by(id=project_id).first()
  113. getViews = getProjects.projectAttr.filter_by(id=viewIDData).first()
  114. queryViews = Views.query.filter_by(id=viewIDData).first()
  115. bucketFile = s3.meta.client.upload_file(filename, str(bucket),filename)
  116. fileSizeSummary = s3.ObjectSummary(str(bucket), filename)
  117. objectS = fileSizeSummary.get()
  118. contentLength = objectS.get('ContentLength')
  119. components = component(comp=queryViews, filetype=getFileType, filename=filename,file_url='https://ben-uguru.s3.amazonaws.com/'+filename, filesize=contentLength)
  120. db.session.add(components)
  121. objectSummary = s3.ObjectSummary(bucket,filename)
  122. sumViewSize = Views.query.get(viewIDData)
  123. getComponentForView = sumViewSize.component.all()
  124. totalSumArr = []
  125. for sizesinfo in getComponentForView:
  126. totalSumArr.append(int(sizesinfo.filesize))
  127. sumViewSize.filesize = sum(totalSumArr)
  128. user.total_size = sumViewSize.filesize
  129. db.session.commit()
  130. object = objectSummary.get()
  131. getComponents = component.query.filter_by(filename=filename).first()
  132. getLastUploadedFileVersion = object.get('VersionId')
  133. object_version = s3.ObjectVersion(str(bucket),filename,getLastUploadedFileVersion)
  134. object1 = object_version.get()
  135. ETag = object1.get('ETag')
  136. queryversions = versions.query.filter_by(eTag=ETag).first()
  137. limit = 10
  138. getTotalItemsForAFile = versions.query.filter_by(filename=filename).all()
  139. if len(getTotalItemsForAFile) == limit:
  140. return jsonify({"Error":"Reached maximum limit for same file versions!"})
  141. abort(400)
  142. if queryversions:
  143. return jsonify({"Error":"Can't upload if the file has no changes been made!"})
  144. abort(400)
  145. versionsAdd = versions(version_url='https://ben-uguru.s3.amazonaws.com/db.sqlite?versionID='+str(getLastUploadedFileVersion),filename=filename, version=getComponents, eTag=ETag)
  146. db.session.add(versionsAdd)
  147. db.session.commit()
  148. return jsonify({'Msg':'file uploaded to a bucket!'})
  149.  
  150.  
  151.  
  152.  
  153. class NewObject(Resource):
  154. def put(self):
  155. jsonData = request.get_json(force=True)
  156. comp_id = jsonData['comp_id']
  157.  
  158. class APIUser(Resource):
  159. @auth.login_required
  160. @marshal_with(user_fields)
  161. def get(self):
  162. try:
  163. token = g.user.generate_auth_token(700)
  164. user = User.query.filter_by(email=g.user.email).first()
  165. user.token = token
  166. db.session.commit()
  167. return user
  168. except AttributeError:
  169. abort(400)
  170.  
  171. @auth.login_required
  172. def put(self,id):
  173. newpassword = request.json.get('password')
  174. user = User.query.get(id)
  175. if not user:
  176. abort(400)
  177. else:
  178. user.hash_password(newpassword)
  179. db.session.commit()
  180. return jsonify({'Msg:':'Updated Password!'})
  181.  
  182. @auth.login_required
  183. def delete(self,id):
  184. token = g.user.generate_auth_token(700)
  185. user = User.query.filter_by(email=g.user.email).first()
  186. user.token = token
  187. db.session.commit()
  188. return jsonify({'Msg':'Logged out!'})
  189.  
  190.  
  191. class AccessUser(Resource):
  192. def get(self,auth_token,id):
  193. user = User.verify_auth_token(auth_token)
  194. try:
  195. if user is None:
  196. return jsonify({'Error':'invalid token/expired token'})
  197. else:
  198. queryUserBasedOnToken = User.query.filter_by(token=auth_token).first()
  199. return jsonify({'data':'Welcome %s' % queryUserBasedOnToken.email})
  200. except AttributeError:
  201. return jsonify({'Error':'invalid token/expired token'})
  202.  
  203.  
  204. courses = {
  205. 'userCourses': fields.String,
  206. 'userID': fields.Integer
  207. }
  208.  
  209.  
  210.  
  211. ViewsAttrs = {
  212. 'viewsNickName':fields.String,
  213. 'projectID':fields.Integer
  214. }
  215.  
  216. # class AddProjectViews(Resource):
  217. # @marshal_with(ViewsAttrs)
  218. # def post(self):
  219. # ## Adds extra attributes to each views for instance project nickname etc.
  220. # ## This adds a new view to specified project_id
  221. # ## Parameters for this requests are:
  222. # ### -- Nickname
  223. # ### -- Token
  224. # ### -- project ID You want to create a VIEW FOR.
  225. # token = request.get_json(force=True)
  226. # tokenData = token['token']
  227. # viewID = request.get_json(force=True)
  228. # viewidData = viewID['project_id']
  229. # getViewID = UserProjects.query.filter_by(id=viewidData).first()
  230. # user = User.query.filter_by(token=tokenData).first()
  231. # if not user:
  232. # abort(400)
  233. # projectNickName = request.get_json(force=True)
  234. # projectNickNameData = projectNickName['nickname']
  235. # addProjectAttr = Views(viewsNickName=projectNickNameData,views=getViewID)
  236. # db.session.add(addProjectAttr)
  237. # db.session.commit()
  238. # return addProjectAttr
  239.  
  240.  
  241. projectData = {
  242. 'projectName':fields.String,
  243. }
  244. class CreateProject(Resource):
  245. @marshal_with(projectData)
  246. def post(self):
  247. ####---- Parameters needed to make this requests:
  248. # *ProjectName
  249. # *Token
  250. token = request.get_json(force=True)
  251. tokenData = token['token']
  252. user = User.query.filter_by(token=tokenData).first()
  253. if not user:
  254. abort(400)
  255. jsonData = request.get_json(force=True)
  256. filename = jsonData['filename']
  257. file_url='https://ben-uguru.s3.amazonaws.com/'+filename
  258. s3.meta.client.upload_file(str(filename), 'ben-uguru',str(filename))
  259. m = hashlib.md5()
  260. m.update(file_url)
  261. hexnumber = m.hexdigest()[:5]
  262. #hasher = abs(hash(file_url)) % (10 ** 5)
  263. projectnamedata = UserProjects(projectName=filename, project=user, fileURL = file_url, static_uri_token = hexnumber)
  264. db.session.add(projectnamedata)
  265. db.session.commit()
  266. return projectnamedata
  267.  
  268.  
  269.  
  270. projectsList = {
  271. 'projectName': fields.String,
  272. 'id':fields.Integer
  273. }
  274.  
  275. class ViewProjects(Resource):
  276. @marshal_with(projectsList)
  277. def get(self,token):
  278. #id = User.query.get(id)
  279. user = User.query.filter_by(token=token).first()
  280. userID = str(user.id)
  281. if not user:
  282. abort(400)
  283. projects = user.projects.all()
  284. return projects
  285.  
  286.  
  287. eachProjects = {
  288. 'projectName': fields.String,
  289. 'userID': fields.Integer,
  290. 'id': fields.Integer,
  291. }
  292.  
  293. class ViewProjectID(Resource):
  294. @marshal_with(eachProjects)
  295. def get(self, auth_token,project_id):
  296. user = User.query.filter_by(token=auth_token).first()
  297. getProjects = user.projects.filter_by(id=project_id).first()
  298. return getProjects
  299.  
  300.  
  301. viewsList = {
  302. 'viewsNickName': fields.String,
  303. 'projectID': fields.Integer, # Project ID - > ALL VIEWS Shown!
  304. 'id': fields.Integer
  305. }
  306. class ListofViews(Resource):
  307. @marshal_with(viewsList)
  308. def get(self,auth_token,project_id):
  309. user = User.query.filter_by(token=auth_token).first()
  310. getProjects = UserProjects.query.filter_by(id=project_id).first()
  311. getViews = getProjects.projectAttr.all()
  312. return getViews
  313.  
  314.  
  315.  
  316. componentDict = {
  317. 'id':fields.Integer,
  318. 'viewID':fields.Integer,
  319. 'file_url':fields.String,
  320. 'filename':fields.String,
  321. 'permission':fields.String,
  322. 'filetype':fields.String,
  323. 'hidden':fields.Boolean,
  324. 'filesize':fields.Integer
  325. }
  326. eachViews = {
  327. 'view.filename': fields.String(default='shoes.json'),
  328. 'view.projectID':fields.Integer,
  329. 'view.id': fields.Integer,
  330. 'view.filesize':fields.String,
  331. 'components':fields.List(fields.Nested(componentDict))
  332. }
  333. class EachViews(Resource):
  334. @marshal_with(eachViews)
  335. def get(self, auth_token, project_id, view_id):
  336. user = User.query.filter_by(token=auth_token).first()
  337. getProjects = UserProjects.query.filter_by(id=project_id).first()
  338. getViews = getProjects.projectAttr.filter_by(id=view_id).first()
  339. view = Views.query.get(view_id)
  340. component = view.component.all()
  341. outputDict = {
  342. 'components':component,
  343. 'view':getViews
  344. }
  345. return outputDict
  346. ### -> user/userID/projects/views/view_id/containers
  347.  
  348. outputhasher = {
  349. 'id':fields.Integer,
  350. 'fileURL':fields.String
  351. }
  352. @app.route('/views/<hasher>', methods=['GET'])
  353. def EacViewsWithHash(hasher):
  354. views = Views.query.filter_by(static_uri_token=hasher).first()
  355. return render_template('test.html', views=views)
  356.  
  357. # class EachViewsWithHash(Resource):
  358. # #@marshal_with(outputhasher)
  359. # def get(self,token, hasher):
  360. # user = User.query.filter_by(token=token).first()
  361. # if not user:
  362. # abort(400)
  363. # views = Views.query.filter_by(static_uri_token=hasher).first()
  364. # return render_template('eachviews.html', views=views)
  365.  
  366. # api.add_resource(EachViewsWithHash,'/api/<token>/<hasher>')
  367.  
  368. containers = {
  369. 'id': fields.Integer,
  370. 'viewID': fields.Integer
  371. }
  372. class Containers(Resource):
  373. @marshal_with(containers)
  374. def get(self, auth_token, project_id, view_id):
  375. user = User.query.filter_by(token=auth_token).first()
  376. getProjects = UserProjects.query.filter_by(id=project_id).first()
  377. getViews = getProjects.projectAttr.filter_by(id=view_id).first()
  378. containers = getViews.containers.all()
  379. return containers
  380.  
  381. cards = {
  382. 'id': fields.Integer,
  383. 'viewID': fields.Integer
  384. }
  385. class Cards(Resource):
  386. @marshal_with(cards)
  387. def get(self, auth_token, project_id, view_id):
  388. user = User.query.filter_by(token=auth_token).first()
  389. getProjects = UserProjects.query.filter_by(id=project_id).first()
  390. getViews = getProjects.projectAttr.filter_by(id=view_id).first()
  391. cards = getViews.containers.all()
  392. return cards
  393.  
  394. class AddProjectViews(Resource):
  395. @marshal_with(ViewsAttrs)
  396. def post(self):
  397. ## Adds extra attributes to each views for instance project nickname etc.
  398. ## This adds a new view to specified project_id
  399. ## Parameters for this requests are:
  400. ### -- Nickname
  401. ### -- Token
  402. ### -- project ID You want to create a VIEW FOR.
  403. token = request.get_json(force=True)
  404. tokenData = token['token']
  405. viewID = request.get_json(force=True)
  406. viewidData = viewID['project_id']
  407. getViewID = UserProjects.query.filter_by(id=viewidData).first()
  408. filename = token['filename']
  409. bucketFile = s3.meta.client.upload_file(str(filename), 'ben-uguru',str(filename))
  410. file_url='https://ben-uguru.s3.amazonaws.com/'+filename
  411. user = User.query.filter_by(token=tokenData).first()
  412. if not user:
  413. abort(400)
  414. #AddViewsDynamic = User.views.query.filter_by('21')
  415. #getViewsTotalSum = Views.component.query.all()
  416. #for sizes in getViewsTotalSum:
  417. # sizes = sizes.filesize
  418. #user.hash_password(file_url)
  419. #hasher = abs(hash(file_url)) % (10 ** 5)
  420. m = hashlib.md5()
  421. m.update(file_url)
  422. hexnumber = m.hexdigest()[:5]
  423. addViews = Views(projectID=getViewID.id,static_uri_token=hexnumber, fileURL=file_url)
  424. db.session.add(addViews)
  425. db.session.commit()
  426. # user = User.query.get(2)
  427. # view = Views.query.get('21')
  428. # user.views.append(view)
  429. # db.session.commit()
  430. # addProjectAttr = Views(viewsNickName=projectNickNameData,views=getViewID)
  431. # db.session.add(addProjectAttr)
  432. # db.session.commit()
  433. # return addProjectAttr
  434.  
  435.  
  436.  
  437. addedContainer = {
  438. 'id': fields.Integer,
  439. 'viewID': fields.Integer
  440. }
  441.  
  442. class AddContainer(Resource):
  443. @marshal_with(addedContainer)
  444. def post(self):
  445. token = request.get_json(force=True)
  446. tokenData = token['token']
  447. projectID = request.get_json(force=True)
  448. projectIDData = projectID['project_id']
  449. viewID = request.get_json(force=True)
  450. viewIDData = viewID['view_id']
  451. queryViews = Views.query.filter_by(id=viewIDData).first()
  452. user = User.query.filter_by(token=tokenData).first()
  453. if not user:
  454. abort(400)
  455. addContainerDb = ContainersDB(containers=queryViews)
  456. db.session.add(addContainerDb)
  457. db.session.commit()
  458. return addContainerDb
  459.  
  460.  
  461. addedCards = {
  462. 'id':fields.Integer,
  463. 'viewID': fields.Integer
  464. }
  465.  
  466. class AddCards(Resource):
  467. @marshal_with(addedCards)
  468. def post(self):
  469. token = request.get_json(force=True)
  470. tokenData = token['token']
  471. projectID = request.get_json(force=True)
  472. projectIDData = projectID['project_id']
  473. viewID = request.get_json(force=True)
  474. viewIDData = viewID['view_id']
  475. queryViews = Views.query.filter_by(id=viewIDData).first()
  476. user = User.query.filter_by(token=tokenData).first()
  477. if not user:
  478. abort(400)
  479. addContainerDb = CardsDB(cards=queryViews)
  480. db.session.add(addContainerDb)
  481. db.session.commit()
  482. return addContainerDb
  483.  
  484. containerDict = {
  485. 'viewID':fields.String(attribute='viewID'),
  486. 'id':fields.String(attribute='id')
  487. }
  488.  
  489. cardsDict = {
  490. 'viewID':fields.String(attribute='viewID',default='None'),
  491. 'id':fields.String(attribute='id', default='None')
  492. }
  493.  
  494.  
  495. cards_marshaller = {
  496. 'viewsNickName': fields.String,
  497. 'containers':fields.List(fields.Nested(containerDict)),
  498. 'cards':fields.List(fields.String)
  499. }
  500.  
  501.  
  502.  
  503. tableExists = db.engine.dialect.has_table(db.engine, "Cards")
  504. if tableExists == True:
  505. cards_marshaller = {
  506. 'viewsNickName': fields.String,
  507. 'containers':fields.List(fields.Nested(containerDict)),
  508. 'cards':fields.List(fields.Nested(cardsDict))
  509. }
  510. else:
  511. cards_marshaller = {
  512. 'viewsNickName': fields.String,
  513. 'containers':fields.List(fields.Nested(containerDict)),
  514. }
  515.  
  516.  
  517. parameter_marshaller = {
  518. 'projectID':fields.String(attribute='projectID'),
  519. 'views':fields.List(fields.Nested(cards_marshaller)),
  520. 'projectName':fields.String(attribute='projectName')
  521. }
  522.  
  523. # set_marshaller = {
  524. # 'user.email':fields.String,
  525. # 'user.id':fields.Integer,
  526. # 'projects':fields.Nested(parameter_marshaller)
  527. # }
  528.  
  529. imgDict = {
  530. 'imgURL':fields.String,
  531. 'width':fields.Integer,
  532. 'height':fields.Integer
  533. }
  534.  
  535. # @app.route('/api/bing/img/<query>', methods=['GET'])
  536. # def ImgQuery(self, query):
  537. # response = requests.get('https://c.bingapis.com/api/custom/opal/image/search?form=OPSBTI&rnoreward=1&count=5&q='+str(query)+'&offset=0&version=5').text
  538. # loadAsJson = json.loads(response)
  539. # value = loadAsJson['value']
  540. # arr =[]
  541. # for items in value:
  542. # if "png" in items['encodingFormat']
  543. # if 200 < items['width']:
  544. # dictionary = {}
  545. # dictionary['imgURL'] = items['contentUrl']
  546. # dictionary['width'] = items['width']
  547. # dictionary['height'] = items['height']
  548. # arr.append(dictionary)
  549. # return render_template('imglist.html', arr=arr)
  550.  
  551. @app.route('/api/img/<query>', methods=['GET'])
  552. def WikiQuery(query):
  553. response = requests.get('https://commons.wikimedia.org/w/index.php?search='+str(query)+'&title=Special:Search&go=Go&uselang=en').text
  554. soup = BeautifulSoup(response)
  555. searchResults = soup.find('ul',attrs={'class':'mw-search-results'}).findAll('li')[:5]
  556. arr = []
  557. for items in searchResults:
  558. dictionary = {}
  559. #dictionary['png'] = items.find('img')['src']
  560. dictionary['svg'] = items.find('img')['src'].replace('thumb/','').split('svg/')[0]+'svg'
  561. arr.append(dictionary)
  562. return render_template('imglist.html', arr=arr )
  563. @app.route('/user/<hasher>', methods=['GET'])
  564. @auth.login_required
  565. def UserObject(token, hasher):
  566. allCards = []
  567. id = g.user.id
  568. user = User.query.filter_by(id=id).first() ## all the users
  569. projects = user.projects.all()
  570. for eachView in projects:
  571. id = eachView.id
  572. dictionary = {}
  573. dictionary['projectID'] = id
  574. dictionary['projectName'] = eachView.projectName
  575. views = eachView.projectAttr.filter_by(static_uri_token=hasher).all()
  576. viewArr = []
  577. for eachItems in views:
  578. viewDict = {}
  579. viewDict['fileURL'] = eachItems.fileURL
  580. viewDict['id'] = eachItems.id
  581. viewDict['static_uri_token'] = eachItems.static_uri_token
  582. viewArr.append(viewDict)
  583. dictionary['views'] = viewArr
  584.  
  585. allCards.append(dictionary)
  586.  
  587.  
  588. dictionary = {
  589. 'user':user,
  590. 'projects': allCards
  591. }
  592. return render_template('userobj.html', arr = dictionary)
  593.  
  594.  
  595. class UserObjects(Resource):
  596. #@marshal_with(set_marshaller)
  597. def get(self, token):
  598. allCards = []
  599. user = User.query.filter_by(id=id).first() ## all the users
  600. projects = user.projects.all()
  601.  
  602. for eachView in projects:
  603. id = eachView.id
  604. dictionary = {}
  605. dictionary['projectID'] = id
  606. dictionary['projectName'] = eachView.projectName
  607. views = eachView.projectAttr.filter_by(projectID=id).all()
  608. dictionary['views'] = views
  609. allCards.append(dictionary)
  610.  
  611.  
  612. dictionary = {
  613. 'user':user,
  614. 'projects': allCards
  615. }
  616. return render_template('userobj.html', arr = dictionary)
  617. #return dictionary
  618.  
  619.  
  620. class CreateTable(Resource):
  621. def get(self):
  622. try:
  623. print "TEST"
  624. CardsDB.__table__.create(db.engine)
  625. cardsVal =+ 1
  626. query = DatabaseTables.query.first()
  627. db.session.commit()
  628. return jsonify({'Msg':'Created!'})
  629. except exc.SQLAlchemyError:
  630. return jsonify({'Error':'Couldnt create the table as it exists! :('})
  631.  
  632.  
  633. class DeleteTable(Resource):
  634. def get(self):
  635. try:
  636. versions.__table__.drop(db.engine)
  637. db.session.commit()
  638. return jsonify({'Msg':'Deleted!'})
  639. except exc.SQLAlchemyError:
  640. return jsonify({'Error':'Couldnt delete the table :('})
  641.  
  642.  
  643.  
  644. BucketObj = {
  645. 'filename':fields.String,
  646. 'file_url':fields.String
  647. }
  648.  
  649. ##Componenets are bucket files in this case.
  650. class GetAllBucketFiles(Resource):
  651. @marshal_with(BucketObj)
  652. def get(self,token,bucket):
  653. user = User.query.filter_by(token=token).first()
  654. if not user:
  655. abort(400)
  656. buckets = s3.Bucket(str(bucket))
  657. allObj = buckets.objects.all()
  658. arr = []
  659. for items in allObj:
  660. dictionary = {}
  661. dictionary['filename'] = items.key
  662. dictionary['file_url'] = 'https://ben-uguru.s3.amazonaws.com/'+str(items.key)
  663. arr.append(dictionary)
  664. return arr
  665.  
  666.  
  667. class SetFilePerms(Resource):
  668. def put(self):
  669. try:
  670. jsonData = request.get_json(force=True)
  671. token = jsonData['token']
  672. fileperm = jsonData['permission']
  673. filename = jsonData['filename']
  674. user = User.query.filter_by(token=token).first
  675. if not user:
  676. abort(400)
  677. object = s3.Bucket('ben-uguru').Object(filename)
  678. object.Acl().put(ACL=fileperm)
  679. return jsonify({'Msg':'Updated file perm to'+ ' '+fileperm+ ' for file'+ ' '+ filename})
  680. except:
  681. abort(400)
  682.  
  683.  
  684. component_marshaller = {
  685. 'id': fields.Integer,
  686. 'viewID': fields.Integer
  687. }
  688.  
  689. @app.route('/component/<hasher>')
  690. def getComponentForHasher(hasher):
  691. queryC = component.query.fitler_by(static_uri_token=hasher).first()
  692. if not queryC:
  693. abort(400)
  694. return render_template('eachcomponent.html', arr=queryC)
  695. class Component(Resource):
  696. @marshal_with(component_marshaller)
  697. def put(self):
  698. jsonData = request.get_json(force=True)
  699. token = jsonData['token']
  700. project_id = jsonData['project_id']
  701. viewIDData = jsonData['view_id']
  702. filename = jsonData['filename']
  703. bucketFile = s3.meta.client.upload_file(str(filename), 'ben-uguru',str(filename))
  704. user = User.query.filter_by(token=token).first()
  705. file_url = 'https://ben-uguru.s3.amazonaws.com/'+str(filename)
  706. m = hashlib.md5()
  707. m.update(file_url)
  708. hexnumber = m.hexdigest()[:5]
  709. #hasher = abs(hash(file_url)) % (10 ** 5)
  710.  
  711. getProjects = UserProjects.query.filter_by(id=project_id).first()
  712. getViews = getProjects.projectAttr.filter_by(id=viewIDData).first()
  713. queryViews = Views.query.filter_by(id=viewIDData).first()
  714. addContainerDb = component(comp=queryViews,file_url=file_url,static_uri_token=hexnumber)
  715. db.session.add(addContainerDb)
  716. db.session.commit()
  717. return addContainerDb
  718.  
  719. def delete(self):
  720. jsonData = request.get_json(force=True)
  721. token = jsonData['token']
  722. project_id = jsonData['project_id']
  723. viewIDData = jsonData['view_id']
  724. comp_id = jsonData['comp_id']
  725. user = User.query.filter_by(token=token).first()
  726. getProjects = UserProjects.query.filter_by(id=project_id).first()
  727. getViews = getProjects.projectAttr.filter_by(id=viewIDData).first()
  728. queryViews = Views.query.filter_by(id=viewIDData).first()
  729. compQuery = component.query.filter_by(id=comp_id).first()
  730. db.session.delete(compQuery)
  731. db.session.commit()
  732. return jsonify({'Msg':'Deleted!'})
  733. if not comp_id:
  734. abort(400)
  735.  
  736.  
  737.  
  738.  
  739.  
  740.  
  741.  
  742. popularreleases = {
  743. 'shoe_name':fields.String,
  744. 'release_date':fields.String
  745. }
  746. class Shoes(Resource):
  747. @marshal_with(popularreleases)
  748. def get(self):
  749. response = requests.get('http://sneakernews.com/release-dates/',headers=headers).text
  750. soup = BeautifulSoup(response)
  751. popularReleases = soup.find('div',attrs={'class':'popular-releases-block'}).findAll('li')
  752. arr = []
  753. for eachShoes in popularReleases:
  754. dictionary={}
  755. dictionary['shoe_name'] = eachShoes.find('a').text
  756. dictionary['release_date'] = eachShoes.find('em').text
  757. arr.append(dictionary)
  758. return arr
  759.  
  760.  
  761.  
  762.  
  763. api.add_resource(Shoes,'/api/release')
  764. #api.add_resource(Shoes,'/api/releases/<date>')
  765.  
  766. class removeComponentFromViews(Resource):
  767. def post(self):
  768. jsonData = request.get_json(force=True)
  769. token = jsonData['token']
  770. project_id = jsonData['project_id']
  771. viewIDData = jsonData['view_id']
  772. comp_id = jsonData['comp_id']
  773. user = User.query.filter_by(token=token).first()
  774. getProjects = UserProjects.query.filter_by(id=project_id).first()
  775. getViews = getProjects.projectAttr.filter_by(id=viewIDData).first()
  776. queryViews = Views.query.filter_by(id=viewIDData).first()
  777. compQuery = component.query.filter_by(id=comp_id).first()
  778. compQuery.hidden = True
  779. db.session.commit()
  780. return jsonify({'Message':'Component Hidden!'})
  781.  
  782. versionsz = {
  783. 'versions.version_url':fields.String
  784. }
  785.  
  786. viewMarshaller = {
  787. 'viewID':fields.Integer,
  788. 'id':fields.Integer,
  789. 'filename':fields.String,
  790. 'permission':fields.String,
  791. 'file_url':fields.String,
  792. 'filetype':fields.String,
  793. 'component.versions':fields.String,
  794. }
  795. listComp = {
  796. # 'viewID':fields.Integer,
  797. # 'id':fields.Integer,
  798. # 'filename':fields.String,
  799. # 'permission':fields.String,
  800. # 'file_url':fields.String,
  801. # 'filetype':fields.String,
  802. 'views':fields.Nested(viewMarshaller),
  803. #'versions':fields.Nested(versionsz)
  804. }
  805.  
  806.  
  807.  
  808. class BartAPI(Resource):
  809. def get(self):
  810. arrBart = []
  811. response = requests.get('http://api.bart.gov/api/etd.aspx?cmd=etd&orig=MONT&key=MW9S-E7SL-26DU-VV8V').text
  812. soup = BeautifulSoup(response)
  813. outputDictionary = {}
  814. outputDictionary['date'] = soup.find('date').text.encode('ascii','ignore')
  815. outputDictionary['time'] = soup.find('time').text.encode('ascii','ignore')
  816. station = soup.find('station')
  817. station_name = station.find('name').text.encode('ascii','ignore')
  818. outputDictionary['station'] = station_name
  819. stationETD = soup.find('station').findAll('etd')
  820. outputArr = []
  821. for stationETDText in stationETD:
  822. etdDict = {}
  823. etdDict['desitnation'] = stationETDText.find('destination').text.encode('ascii','ignore')
  824. etdDict['abbreviation'] = stationETDText.find('abbreviation').text.encode('ascii','ignore')
  825. etdDict['limited'] = stationETDText.find('limited').text.encode('ascii','ignore')
  826. estimatedTimeArrival = stationETDText.findAll('estimate')
  827. estArr = []
  828. for estimatedTime in estimatedTimeArrival:
  829. estimationDict = {}
  830. estimationDict['minutes'] = estimatedTime.find('minutes').text.encode('ascii','ignore')
  831. estimationDict['platform'] = estimatedTime.find('platform').text.encode('ascii','ignore')
  832. estimationDict['direction'] = estimatedTime.find('direction').text.encode('ascii','ignore')
  833. estimationDict['length'] = estimatedTime.find('length').text.encode('ascii','ignore')
  834. estimationDict['color'] = estimatedTime.find('color').text.encode('ascii','ignore')
  835. estimationDict['hexcolor'] = estimatedTime.find('hexcolor').text.encode('ascii','ignore')
  836. estimationDict['bikeflag'] = estimatedTime.find('bikeflag').text.encode('ascii','ignore')
  837. estArr.append(estimationDict)
  838. etdDict['estimation'] = estArr
  839. outputArr.append(etdDict)
  840. outputDictionary['station'] = outputArr
  841. arrBart.append(outputDictionary)
  842. return jsonify(results=arrBart)
  843. # with open('static/bart.json','wb') as outfile:
  844. # json.dump(arrBart,outfile,indent=4)
  845. # return app.send_static_file('bart.json')
  846. #return send_from_directory('/static','bart.json')
  847. #return jsonify(results=arrBart)
  848. api.add_resource(BartAPI,'/api/bart.json')
  849.  
  850.  
  851. class ChannelListings(Resource):
  852. def get(self):
  853. response = requests.get('http://mobilelistings.tvguide.com/Listingsweb/ws/rest/schedules/80004.null/start/1480636800/duration/120?ChannelFields=Name%2CFullName%2CNumber%2CSourceId&ScheduleFields=ProgramId%2CEndTime%2CStartTime%2CTitle%2CAiringAttrib%2CCatId&formattype=json&disableChannels=music%2Cppv%2C24hr').text
  854. LoadAsJson = json.loads(response)
  855. with open('channelListings.json','wb') as outfile:
  856. json.dump(LoadAsJson,outfile,indent=4)
  857. with open('channelListings.json','r+') as jsonFile:
  858. data = json.load(jsonFile)
  859. for items in data:
  860. tmp = items['ProgramSchedules']
  861. for startTime in tmp:
  862. itemEr = startTime['StartTime']
  863. parser = datetime.datetime.fromtimestamp(int(itemEr)).strftime('%Y-%m-%d %H:%M')
  864. ConvertToStr = str(parser).split('-')
  865. newDict = {}
  866. newDict['year'] = str(ConvertToStr[0])
  867. newDict['month'] = str(ConvertToStr[1])
  868. newDict['day'] = str(ConvertToStr[-1]).split(' ')[0]
  869. splitDay = str(newDict['day'])
  870. newDict['time'] = str(ConvertToStr[-1]).split(' ')[-1]
  871. startTime['StartTime'] = newDict
  872.  
  873. endEr = startTime['EndTime']
  874. endTimeParser = datetime.datetime.fromtimestamp(int(endEr)).strftime('%Y-%m-%d %H:%M')
  875. ConvertEndTimeToStr = str(endTimeParser).split('-')
  876. secondDict = {}
  877. secondDict['year'] = str(ConvertEndTimeToStr[0])
  878. secondDict['month'] = str(ConvertEndTimeToStr[1])
  879. secondDict['day'] = str(ConvertEndTimeToStr[-1]).split(' ')[0]
  880. splitDayz = str(secondDict['day'])
  881. secondDict['time'] = str(ConvertEndTimeToStr[-1]).split(' ')[-1]
  882. startTime['EndTime'] = secondDict
  883. firstNumberHour = secondDict['time'].split(':')[0]
  884. secondNumberHour = newDict['time'].split(':')[0]
  885. HourLess = int(firstNumberHour) + int(secondNumberHour)
  886. firstNumberMinutes = secondDict['time'].split(':')[-1]
  887. secondNumberMinutes = secondDict['time'].split(':')[-1]
  888. secondsLess = int(secondNumberMinutes) - int(firstNumberHour)
  889. divideby60 = secondsLess/60
  890. print HourLess
  891. print divideby60
  892. total = HourLess + divideby60
  893. startTime['TotalAmount'] = total
  894. jsonFile.seek(0)
  895. jsonFile.write(json.dumps(data))
  896. jsonFile.truncate()
  897. with open('static/channelListingsChanges.json','wb') as outfile:
  898. json.dump(data,outfile,indent=4)
  899. # with open('static/channelListings.json','wb') as outfile:
  900. # json.dump(LoadAsJson,outfile,indent=4)
  901. return app.send_static_file('channelListingsChanges.json')
  902.  
  903. api.add_resource(ChannelListings,'/api/channels.json')
  904.  
  905.  
  906.  
  907. class getComponent(Resource):
  908. @marshal_with(listComp)
  909. def get(self, token, project_id, view_id):
  910. fullArr = []
  911. user = User.query.filter_by(token=token).first()
  912. getProjects = UserProjects.query.filter_by(id=project_id).first()
  913. getViews = getProjects.projectAttr.filter_by(id=view_id).first()
  914. getComponent = getViews.component.filter_by(hidden=0).all()
  915. for component in getComponent:
  916. dictionary = {}
  917. versions = component.versions.all()
  918. dictionary['versions'] = versions
  919. fullArr.append(dictionary)
  920.  
  921. dictionary = {
  922. 'views':getComponent,
  923. 'versions':fullArr
  924. }
  925. return dictionary
  926.  
  927.  
  928. class unSplash(Resource):
  929. def get(self):
  930. response = requests.get('https://unsplash.it/list').text
  931. unsplashJson = json.loads(response)
  932. return jsonify(results=unsplashJson)
  933.  
  934.  
  935. ##/api/unsplash --> Gives them the FAT list.
  936. #/api/unsplash/q=random --> Gets a random picture from the FAT LIST
  937. #/api/unsplash/random/q=green -> Gets one random queried image
  938. #/api/unsplash/q=green -> Gets image information for all the query
  939.  
  940.  
  941.  
  942. @app.route('/api/unsplash', methods=['GET'])
  943. def unSplash():
  944. response = requests.get('https://unsplash.it/list').text
  945. unsplashJson = json.loads(response)
  946. return jsonify(results=unsplashJson)
  947.  
  948.  
  949. @app.route('/api/unsplash/random/html', methods=['GET'])
  950. def getOneRandom():
  951. response = requests.get('https://unsplash.it/list').text
  952. unsplashJson = json.loads(response)
  953. getRandomURL = random.choice(unsplashJson)
  954. parseRandomURL = getRandomURL['post_url']
  955. makeAnotherGet = requests.get(parseRandomURL).text
  956. soup = BeautifulSoup(makeAnotherGet)
  957. getimgSrc = soup.find('img')['src']
  958. getImageSize = getimgSrc.replace('https','http')
  959. return render_template('unsplash.html', arr=getImageSize)
  960.  
  961.  
  962. @app.route('/api/unsplash/random/<query>/html', methods=['GET'])
  963. def queryRandom(query):
  964. header = {
  965. 'authorization':"Client-ID d69927c7ea5c770fa2ce9a2f1e3589bd896454f7068f689d8e41a25b54fa6042"
  966. }
  967. response = requests.get('https://unsphlash.com/napi/search/photos?query='+str(query)+'&page=1',headers=header).text
  968. jsonFile = json.loads(response)
  969. randomizer = jsonFile['results']
  970. getRandomURL = random.choice(randomizer)
  971. getOneURLToRender = getRandomURL['urls']['regular']
  972. return render_template('unsplash.html', arr=getOneURLToRender)
  973.  
  974.  
  975.  
  976. @app.route('/api/unsplash/<query>', methods=['GET'])
  977. @marshal_with(outputList)
  978. def queryunsplash(query):
  979. header = {
  980. 'authorization':"Client-ID d69927c7ea5c770fa2ce9a2f1e3589bd896454f7068f689d8e41a25b54fa6042"
  981. }
  982. response = requests.get('https://unsplash.com/napi/search/photos?query='+str(query)+'&page=1',headers=header).text
  983. jsonFile = json.loads(response)['results']
  984. outputArray = []
  985. for imagesURLs in jsonFile:
  986. dictionary = {}
  987. dictionary['img_url'] = imagesURLs['urls']['regular']
  988. outputArray.append(dictionary)
  989. return jsonify(results=outputArray)
  990.  
  991. #SHOULD WORK
  992. @app.route('/api/unsplash/random/json', methods=['GET'])
  993. def jsonFormat():
  994. response = requests.get('https://unsplash.it/list').text
  995. unsplashJson = json.loads(response)
  996. getRandomURL = random.choice(unsplashJson)
  997. parseRandomURL = getRandomURL['post_url']
  998. makeAnotherGet = requests.get(parseRandomURL).text
  999. soup = BeautifulSoup(makeAnotherGet)
  1000. getimgSrc = soup.find('img')['src']
  1001. getImageSize = getimgSrc.replace('https','http')
  1002. return jsonify({'img_url':getImageSize})
  1003. #return render_template('unsplash.html', arr=getImageSize)
  1004.  
  1005. @app.route('/api/unsplash/random/<query>/json', methods=['GET'])
  1006. def queryRandomJson(query):
  1007. header = {
  1008. 'authorization':"Client-ID d69927c7ea5c770fa2ce9a2f1e3589bd896454f7068f689d8e41a25b54fa6042"
  1009. }
  1010. response = requests.get('https://unsplash.com/napi/search/photos?query='+str(query)+'&page=1',headers=header).text
  1011. jsonFile = json.loads(response)
  1012. randomizer = jsonFile['results']
  1013. getRandomURL = random.choice(randomizer)
  1014. getOneURLToRender = getRandomURL['urls']['regular']
  1015. return jsonify({'img_url':getOneURLToRender})
  1016.  
  1017.  
  1018.  
  1019.  
  1020.  
  1021.  
  1022.  
  1023. #api.add_resource(unSplash,'/api/unsplash')
  1024. api.add_resource(SetFilePerms, '/user/updateperm')
  1025. api.add_resource(GetAllBucketFiles,'/user/<token>/<bucket>/files')
  1026. api.add_resource(UploadMultipleFiles,'/user/upload')
  1027. api.add_resource(CreateTable,'/user/create/table')
  1028. api.add_resource(DeleteTable,'/user/delete/table')
  1029. #api.add_resource(UserObjects,'/user/<token>')
  1030. api.add_resource(Containers,'/user/<auth_token>/projects/<project_id>/<view_id>/containers')
  1031. api.add_resource(Cards,'/user/<auth_token>/projects/<project_id>/<view_id>/cards')
  1032. api.add_resource(getComponent,'/user/<token>/projects/<project_id>/<view_id>/component')
  1033. api.add_resource(EachViews, '/user/<auth_token>/projects/<project_id>/<view_id>')
  1034. api.add_resource(ListofViews, '/user/<auth_token>/projects/<project_id>/views')
  1035. api.add_resource(ViewProjectID, '/user/<auth_token>/projects/<project_id>')
  1036. api.add_resource(ViewProjects,'/user/<token>/projects')
  1037.  
  1038. ## ----> user -> projects -> views - > views has many cards and containers
  1039.  
  1040. #### ------ Below are extra routes to add stuff in the databaase ------ ####
  1041. api.add_resource(removeComponentFromViews,'/user/updatecomponent')
  1042. api.add_resource(Component, '/api/users/component')
  1043. api.add_resource(AddCards, '/api/users/cards')
  1044. api.add_resource(AddContainer,'/api/users/ac')
  1045. api.add_resource(AddProjectViews,'/api/users/views') ## ---> Adds a new views to a project.
  1046. api.add_resource(CreateProject,'/api/users/createproject') ## --> Creates a new project in the database
  1047. api.add_resource(APIUser, '/api/token') ## --> Needs authentication then gives user a set of token
  1048. api.add_resource(RegisterUser,'/api/register') ## -> Creates a new user in the database
  1049.  
  1050. if __name__ == "__main__":
  1051. app.run(host='192.168.20.165')
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement