· 9 years ago · Dec 03, 2016, 09:20 PM
1import os
2from flask import Flask, abort, request, jsonify, g, url_for, render_template, send_from_directory, redirect
3from flask.ext.sqlalchemy import SQLAlchemy
4from flask.ext.httpauth import HTTPBasicAuth
5from passlib.apps import custom_app_context as pwd_context
6from itsdangerous import (TimedJSONWebSignatureSerializer
7 as Serializer, BadSignature, SignatureExpired)
8
9from models import*
10from flask_restful import reqparse, abort, Api, Resource, fields, marshal_with
11from sqlalchemy import exc
12from werkzeug import secure_filename
13import boto3
14import magic
15import requests
16from bs4 import BeautifulSoup
17import hashlib
18import binascii
19from flask.ext.cors import CORS, cross_origin
20import datetime
21import random
22headers = {
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}
27auth = HTTPBasicAuth()
28s3 = boto3.resource('s3')
29app.secret_key = 'some_secret'
30bucket = 'ben-uguru'
31filename = 'db.sqlite'
32s3 = boto3.resource('s3')
33
34cors = CORS(app, resources={r"/api/channels.json": {"origins": "localhost"}})
35
36
37cardsVal = 0
38@auth.verify_password
39def 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
49user_fields = {
50 'email':fields.String,
51 'token':fields.String
52}
53
54RegisterUserFields = {
55 'id': fields.Integer,
56 'email': fields.String,
57}
58putRequestFields = {
59 'token':fields.String,
60 'Message':fields.String(default='Successfully uploaded!')
61}
62class 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
96class 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
153class NewObject(Resource):
154 def put(self):
155 jsonData = request.get_json(force=True)
156 comp_id = jsonData['comp_id']
157
158class 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
191class 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
204courses = {
205 'userCourses': fields.String,
206 'userID': fields.Integer
207}
208
209
210
211ViewsAttrs = {
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
241projectData = {
242 'projectName':fields.String,
243}
244class 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
270projectsList = {
271 'projectName': fields.String,
272 'id':fields.Integer
273}
274
275class 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
287eachProjects = {
288 'projectName': fields.String,
289 'userID': fields.Integer,
290 'id': fields.Integer,
291}
292
293class 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
301viewsList = {
302 'viewsNickName': fields.String,
303 'projectID': fields.Integer, # Project ID - > ALL VIEWS Shown!
304 'id': fields.Integer
305}
306class 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
316componentDict = {
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}
326eachViews = {
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}
333class 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
348outputhasher = {
349 'id':fields.Integer,
350 'fileURL':fields.String
351}
352@app.route('/views/<hasher>', methods=['GET'])
353def 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
368containers = {
369 'id': fields.Integer,
370 'viewID': fields.Integer
371}
372class 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
381cards = {
382 'id': fields.Integer,
383 'viewID': fields.Integer
384}
385class 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
394class 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
437addedContainer = {
438 'id': fields.Integer,
439 'viewID': fields.Integer
440}
441
442class 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
461addedCards = {
462 'id':fields.Integer,
463 'viewID': fields.Integer
464}
465
466class 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
484containerDict = {
485 'viewID':fields.String(attribute='viewID'),
486 'id':fields.String(attribute='id')
487}
488
489cardsDict = {
490 'viewID':fields.String(attribute='viewID',default='None'),
491 'id':fields.String(attribute='id', default='None')
492}
493
494
495cards_marshaller = {
496 'viewsNickName': fields.String,
497 'containers':fields.List(fields.Nested(containerDict)),
498 'cards':fields.List(fields.String)
499 }
500
501
502
503tableExists = db.engine.dialect.has_table(db.engine, "Cards")
504if tableExists == True:
505 cards_marshaller = {
506 'viewsNickName': fields.String,
507 'containers':fields.List(fields.Nested(containerDict)),
508 'cards':fields.List(fields.Nested(cardsDict))
509 }
510else:
511 cards_marshaller = {
512 'viewsNickName': fields.String,
513 'containers':fields.List(fields.Nested(containerDict)),
514 }
515
516
517parameter_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
529imgDict = {
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'])
552def 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
565def 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
595class 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
620class 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
633class 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
644BucketObj = {
645 'filename':fields.String,
646 'file_url':fields.String
647}
648
649##Componenets are bucket files in this case.
650class 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
667class 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
684component_marshaller = {
685 'id': fields.Integer,
686 'viewID': fields.Integer
687}
688
689@app.route('/component/<hasher>')
690def 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)
695class 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
742popularreleases = {
743 'shoe_name':fields.String,
744 'release_date':fields.String
745}
746class 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
763api.add_resource(Shoes,'/api/release')
764#api.add_resource(Shoes,'/api/releases/<date>')
765
766class 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
782versionsz = {
783 'versions.version_url':fields.String
784}
785
786viewMarshaller = {
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}
795listComp = {
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
808class 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)
848api.add_resource(BartAPI,'/api/bart.json')
849
850
851class 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
903api.add_resource(ChannelListings,'/api/channels.json')
904
905
906
907class 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
928class 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'])
943def 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'])
950def 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'])
963def 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)
978def 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'])
993def 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'])
1006def 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')
1024api.add_resource(SetFilePerms, '/user/updateperm')
1025api.add_resource(GetAllBucketFiles,'/user/<token>/<bucket>/files')
1026api.add_resource(UploadMultipleFiles,'/user/upload')
1027api.add_resource(CreateTable,'/user/create/table')
1028api.add_resource(DeleteTable,'/user/delete/table')
1029#api.add_resource(UserObjects,'/user/<token>')
1030api.add_resource(Containers,'/user/<auth_token>/projects/<project_id>/<view_id>/containers')
1031api.add_resource(Cards,'/user/<auth_token>/projects/<project_id>/<view_id>/cards')
1032api.add_resource(getComponent,'/user/<token>/projects/<project_id>/<view_id>/component')
1033api.add_resource(EachViews, '/user/<auth_token>/projects/<project_id>/<view_id>')
1034api.add_resource(ListofViews, '/user/<auth_token>/projects/<project_id>/views')
1035api.add_resource(ViewProjectID, '/user/<auth_token>/projects/<project_id>')
1036api.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 ------ ####
1041api.add_resource(removeComponentFromViews,'/user/updatecomponent')
1042api.add_resource(Component, '/api/users/component')
1043api.add_resource(AddCards, '/api/users/cards')
1044api.add_resource(AddContainer,'/api/users/ac')
1045api.add_resource(AddProjectViews,'/api/users/views') ## ---> Adds a new views to a project.
1046api.add_resource(CreateProject,'/api/users/createproject') ## --> Creates a new project in the database
1047api.add_resource(APIUser, '/api/token') ## --> Needs authentication then gives user a set of token
1048api.add_resource(RegisterUser,'/api/register') ## -> Creates a new user in the database
1049
1050if __name__ == "__main__":
1051 app.run(host='192.168.20.165')