· 6 years ago · Sep 04, 2019, 07:42 AM
1from flask import Flask, render_template, Response, redirect, url_for, request, session, abort, jsonify
2from flask_login import LoginManager, UserMixin, login_required, login_user, logout_user
3from firebase_admin import firestore
4import firebase_admin
5from firebase_admin import db as dbs
6from firebase_admin import credentials
7import random
8import datetime
9
10cred = credentials.Certificate("/home/yeshwanth/productlabs/audio-transcription-b2285-firebase-adminsdk-ufc84-a21d095c4a.json")
11app=firebase_admin.initialize_app(cred, {'databaseURL': 'https://audio-transcription-b2285.firebaseio.com/'})
12db = firestore.client()
13app = Flask(__name__)
14
15# config
16app.config.update(
17 DEBUG = True,
18 SECRET_KEY = 'secret_xyz'
19)
20
21# flask-login
22login_manager = LoginManager()
23login_manager.init_app(app)
24login_manager.login_view = "login"
25
26# Simple user model
27class User(UserMixin):
28 def __init__(self, id):
29 self.id = id
30 self.name = "user" + str(id)
31 self.password = self.name + "_secret"
32
33 def __repr__(self):
34 return "%d/%s/%s" % (self.id, self.name, self.password)
35
36# create some users
37users = [User('admin')]
38
39# somewhere to login
40@app.route('/login', methods=["GET", "POST"])
41def login():
42 if request.method == 'POST':
43 username = request.form['username']
44 password = request.form['password']
45 if password == username + "_secret":
46 user = User(username)
47 login_user(user)
48 return redirect(request.args.get("next"))
49 else:
50 return abort(401)
51 else:
52 return render_template('login.html')
53 # return Response('''
54 # <form action="" method="post">
55 # <p><input type=text name=username>
56 # <p><input type=password name=password>
57 # <p><input type=submit value=Login>
58 # </form>
59 # ''')
60
61@app.route('/')
62@login_required
63def index():
64 return redirect('/speech')
65
66@app.route('/speech')
67@login_required
68def speech():
69 # fragments_ref = db.collection(u'fragments')
70 # first_query = fragments_ref.limit(100)
71
72 # # Get the last document from the results
73 # docs = first_query.stream()
74 # last_doc = list(docs)[-1]
75
76 # # Construct a new query starting at this document
77 # # Note: this will not have the desired effect if
78 # # multiple cities have the exact same population value
79 # last_pop = last_doc.to_dict()[u'population']
80
81 # next_query = (
82 # fragments_ref
83 # .start_after(last_doc)
84 # .limit(100)
85 # )
86 # # Use the query for pagination
87 # # ...
88
89 # Without cursor
90 # fragments_ref = db.collection(u'fragments').limit(50)
91 # docs = fragments_ref.stream()
92
93 #all_urls_1d = []
94 # all_urls = []
95 fragment_total_counts={'total_calls':0,'total_calls_duration':0,'total_fragments':0,'total_effective_duration':0}
96 temptotal=0
97 total_effective_duration=[]
98
99 call_duration_info_ref = db.collection(u'Call_Duration_Info')
100 call_duration_info_ref_docs = call_duration_info_ref.stream()
101
102 total_fragments_ref = db.collection(u'fragments')
103 total_fragments_ref_docs = total_fragments_ref.stream()
104
105
106 for cdirefdoc in call_duration_info_ref_docs:
107 doc=cdirefdoc.to_dict()
108 temptotal=temptotal+doc['call duration']
109
110
111 for doc in total_fragments_ref_docs:
112 fragment = doc.to_dict()
113 if 'metadata' in fragment:
114 if 'spduration' in fragment['metadata']:
115 total_effective_duration.append(int(fragment['metadata']['spduration']))
116
117
118 temp=sum(total_effective_duration)/(1000*60*60)
119
120
121 fragment_total_counts['total_calls_duration']=round(((temptotal/60)/60),2)
122 fragment_total_counts['total_calls']=len(list(call_duration_info_ref.get()))
123 fragment_total_counts['total_fragments']=len(list(total_fragments_ref.get()))
124 fragment_total_counts['total_effective_duration']=round(temp,2)
125
126
127
128 # for doc in docs:
129 # fragment = doc.to_dict()
130 # #print(fragment)
131 # #url = fragment['url']
132 # #all_urls_1d.append(url)
133 # all_urls.append(fragment)
134
135 return render_template('speech_backup.html', all_urls=[],fragment_total_counts=fragment_total_counts, enumerate=enumerate)
136
137''' idx = 0
138 while idx < len(all_urls_1d):
139 num = random.randint(2, 10)
140 urls = []
141 for i in range(idx, idx+num):
142 if i >= len(all_urls_1d):
143 break
144 urls.append(all_urls_1d[i])
145 all_urls.append(urls)
146 idx += num
147'''
148
149@app.route('/validatefragment', methods=["GET", "POST"])
150def validatefrgmnt():
151 if request.method == 'POST':
152 print (request.is_json)
153 mkbid = request.json['mkbid']
154 review= request.json['review']
155 print("from validate fragment")
156 print(mkbid)
157 frag_ref = db.collection(u'fragments').document(mkbid)
158 frag_ref.set({u'review': review}, merge=True)
159 return "Success"
160 else:
161 return render_template('login.html')
162
163
164@app.route('/getfragmentslist', methods=["GET", "POST"])
165def getfragmentslist():
166 if request.method == 'POST':
167 print (request.is_json)
168 pageno = request.json['pageno']
169 perpage= request.json['perpage']
170 lastmkbid=request.json['lastmkbid']
171 if pageno==1:
172 total_fragments_ref = db.collection(u'fragments').order_by(u'mkbid').limit(perpage)
173 else:
174 total_fragments_ref = db.collection(u'fragments').order_by(u'mkbid').start_after({u'mkbid':lastmkbid}).limit(perpage)
175
176 total_fragments_ref_docs = total_fragments_ref.stream()
177 fragments=[];
178 for doc in total_fragments_ref_docs:
179 fragment = doc.to_dict()
180 fragments.append(fragment)
181
182 # print(fragments)
183 return jsonify(fragments=fragments)
184 else:
185 return render_template('login.html')
186
187
188@app.route('/transcripts')
189def transcripts():
190 # a = datetime.datetime.now()
191 # jobs_ref= dbs.reference('jobs')
192 # docs=jobs_ref.get()
193 # b = datetime.datetime.now()
194 # c=b-a
195 # print(c)
196 # print(docs)
197 # jobs_ref = db.collection(u'jobs').limit(20)
198
199 transcripts_total_counts={'total_transcribed_transcriptions':0,'total_approved_transcrptions':0}
200
201 total_tsb_jobs_ref = db.collection(u'jobs').where(u'status',u'==',u'done')
202 # print(len(list(total_tsb_jobs_ref.get())))
203
204 total_approved_transcrptions_ref = db.collection(u'jobs').where(u'status',u'==',u'done').where(u'review',u'==',u'Approved')
205 # print(len(list(total_approved_transcrptions_ref.get())))
206 transcripts_total_counts['total_transcribed_transcriptions']=len(list(total_tsb_jobs_ref.get()))
207 transcripts_total_counts['total_approved_transcrptions']=len(list(total_approved_transcrptions_ref.get()))
208
209
210 # docs = jobs_ref.get()
211 # all_urls_1d = []
212 # all_urls = []
213 # all_text = []
214 # for doc in docs:
215 # job = doc.to_dict()
216 # fragment_id = job['fragment']
217 # text = job['deliverable']
218 # all_text.append(text)
219 # frg2=db.document(fragment_id[1:])
220 # fragment_id = fragment_id[fragment_id.rfind('/')+1:]
221 # fragment = db.collection(u'fragments').document(fragment_id).get().to_dict()
222 # url = fragment['url']
223 # all_urls.append(url)
224
225 return render_template('transcripts.html',urls=[],text=[],transcripts_total_counts=transcripts_total_counts)
226
227
228
229
230@app.route('/gettranscriptslist', methods=["GET", "POST"])
231def gettranscriptslist():
232 # where condition to be applied at else block
233 if request.method == 'POST':
234 print (request.is_json)
235
236 pageno = request.json['pageno']
237 perpage= request.json['perpage']
238 lastdocid=request.json['docid']
239 transcripts=[]
240
241 if pageno==1:
242 jobs_ref = db.collection(u'jobs').where(u'status',u'==',u'done').limit(perpage)
243 else:
244 jobs_ref = db.collection(u'jobs').order_by(u'docid').start_after({u'docid':lastdocid}).limit(perpage)
245
246 docs = jobs_ref.get()
247 for doc in docs:
248 transcript = doc.to_dict()
249 #transcript['jobid']=doc.id
250 transcript['fragment_details']=db.document(transcript['fragment'][1:]).get().to_dict()
251 transcripts.append(transcript)
252 # print(transcripts)
253 return jsonify(transcripts=transcripts)
254 else:
255 return render_template('login.html')
256
257@app.route('/validatetranscript', methods=["GET", "POST"])
258def validatetranscript():
259 if request.method == 'POST':
260 print (request.is_json)
261 jobid = request.json['jobid']
262 review= request.json['review']
263 print("from validate fragment")
264 print(jobid)
265 transcript_ref = db.collection(u'jobs').document(jobid)
266 transcript_ref.set({u'review': review}, merge=True)
267 return "Success"
268 else:
269 return render_template('login.html')
270
271
272@app.route('/payments')
273@login_required
274def payments():
275
276
277
278 sample_counts={'total_samples':0,'total_calls_duration':0}
279
280 samples_ref = db.collection(u'Call_User_Reg')
281 ss_docs = samples_ref.stream()
282 sample_counts['total_samples']=len(list(ss_docs))
283 samples_ref=None
284 ss_docs=None
285
286
287 call_duration_ref = db.collection(u'Call_Duration_Info')
288 cd_docs = call_duration_ref.stream()
289 temptotal=0
290 for cdirefdoc in cd_docs:
291 doc=cdirefdoc.to_dict()
292 temptotal=temptotal+doc['call duration']
293
294 sample_counts['total_calls_duration']=round(((temptotal/60)/60),2)
295 call_duration_ref=None
296 cd_docs=None
297
298 print(sample_counts)
299
300 return render_template('payments.html', sample_counts=sample_counts)
301
302
303
304
305@app.route('/payments/savepayments', methods=["POST"])
306def savePayment():
307 if request.method == 'POST':
308 print (request.is_json)
309 payments = request.json['payments']
310 print(payments)
311 paymentstosave=[]
312 batch = db.batch()
313
314 payments_collection_ref = db.collection(u'payments')
315 for payment in payments:
316 user_payments_history = payments_collection_ref.where(u'userid',u'==',payment['userid']).get()
317 total_amt_paid=0
318 for userpayment in user_payments_history:
319 userpayment=userpayment.to_dict()
320 total_amt_paid+=float(userpayment['amt_paid'])
321 print("total_amt_paid",total_amt_paid)
322 payment['amt_pending']=round(float(payment['total_amount_to_pay']) - ( float(total_amt_paid)+float(payment['amt_paid'])),2)
323 paymentobj={'amt_paid':float(payment['amt_paid']),'amt_pending':payment['amt_pending'],'userid':payment['userid'],'date':datetime.datetime.now(),'total_amt': float(payment['total_amount_to_pay']),'transit_amount':0}
324 print(paymentobj)
325 paymentstosave.append(paymentobj)
326 tempdoc=payments_collection_ref.document()
327 paymentobj['paymentid']=tempdoc.id
328 batch.set(tempdoc,paymentobj)
329
330 batch.commit()
331
332 #savedrefs=payment_col_ref.add(paymentstosave)
333 #print(savedrefs)
334
335 return jsonify(status=True,message="Payments Saved Successfully...!")
336 else:
337 return jsonify(status=True,message="Error while Saving Payments...!")
338
339
340@app.route('/payments/paymentshistory', methods=["POST"])
341def paymentshistory():
342 if request.method == 'POST':
343 print (request.is_json)
344 userid = request.json['userid']
345 print(userid)
346 user_payments_history=[]
347
348 payments_collection_ref = db.collection(u'payments')
349 user_payments_history_docs = payments_collection_ref.where(u'userid',u'==',userid).get()
350 pring(user_payments_history_docs )
351 for userpayment in user_payments_history_docs:
352 user_payments_history.append(userpayment.to_dict())
353
354 return jsonify(status=True,user_payments_history=user_payments_history)
355 else:
356 return jsonify(status=False,user_payments_history=user_payments_history,message="Error while Getting Payments History...!")
357
358
359@app.route('/getspeakerslist', methods=["GET", "POST"])
360def getspeakerslist():
361 if request.method == 'POST':
362 print (request.is_json)
363 pageno = request.json['pageno']
364 perpage= request.json['perpage']
365 lastuserid=request.json['lastuserid']
366
367 if pageno==1:
368 total_speakers_ref = db.collection(u'Call_User_Reg').order_by(u'userid').limit(perpage)
369 else:
370 total_speakers_ref = db.collection(u'Call_User_Reg').order_by(u'userid').start_after({u'userid':lastuserid}).limit(perpage)
371
372 total_speakers_ref_docs = total_speakers_ref.stream()
373
374 speakerslist=[];
375
376 for doc in total_speakers_ref_docs:
377 speaker = doc.to_dict()
378 speaker['total_calls_duration']=0
379 speaker['total_number_of_calls']=0
380 total_effective_duration=0
381
382 total_speakers_calls_docs = db.collection('Call_Duration_Info').where(u'cid',u'==',speaker['userid']).get()
383
384 callsbyspeaker=db.collection('Call_Duration_Info').where(u'cid',u'==',speaker['userid']).get()
385
386 tmplength=len(list(callsbyspeaker))
387
388 speaker['total_number_of_calls']=tmplength
389
390 for doctmp in total_speakers_calls_docs:
391 speaker['total_calls_duration']+=int(doctmp.to_dict()['call duration'])
392
393 speaker['total_calls_duration']=round((speaker['total_calls_duration']/60),2)
394
395 total_fragments_ref= db.collection(u'fragments').where(u'metadata.cid',u'==',speaker['userid']).get()
396
397 for frgdoc in total_fragments_ref:
398 total_effective_duration=total_effective_duration+int(frgdoc.to_dict()['metadata']['spduration'])
399
400 speaker['total_effective_duration']= round (((total_effective_duration/1000)/60),2)
401
402 #total Amount Calculation 500 to be made dynamic
403 speaker['total_amount_to_pay']=round( ( (speaker['total_effective_duration'] / 60 ) *500) ,2)
404
405
406 user_payments_history = db.collection(u'payments').where(u'userid',u'==',speaker['userid']).get()
407 total_amt_paid=0
408 for userpayment in user_payments_history:
409 userpayment=userpayment.to_dict()
410 total_amt_paid+=float(userpayment['amt_paid'])
411 #print("total_amt_paid",total_amt_paid)
412 speaker['total_amt_pending']=round(float(speaker['total_amount_to_pay']) - ( float(total_amt_paid)),2)
413 speaker['total_amt_paid']=round(total_amt_paid,2)
414
415
416
417
418 speakerslist.append(speaker)
419
420 return jsonify(speakerslist=speakerslist)
421 else:
422 return jsonify(speakerslist=speakerslist)
423
424
425
426
427@app.route('/gettranscriberslist', methods=["GET", "POST"])
428def gettranscriberslist():
429 if request.method == 'POST':
430 print (request.is_json)
431 pageno = 1 #request.json['pageno']
432 # perpage= requecidcidst.json['perpage']
433 # lastuserid=request.json['lastuserid']
434
435 if pageno==1:
436 total_transcribers_ref = db.collection(u'users').order_by(u'email')
437 else:
438 print("h")
439 # total_transcribers_ref = db.collection(u'users').order_by(u'email').start_after({u'email':lastuserid}).limit(perpage)
440
441 total_transcribers_ref_docs = total_transcribers_ref.stream()
442
443 transcriberslist=[];
444
445 for doc in total_transcribers_ref_docs:
446 transcriber = doc.to_dict()
447 transcriber['total_calls_duration']=0
448 transcriber['total_number_of_calls']=0
449 total_effective_duration=0
450 total_jobs_docs = db.collection('jobs').stream()
451 for doctmp in total_jobs_docs:
452 if doctmp.to_dict()['user'].find(doc.id)!=-1:
453 # print("ppk", doctmp.to_dict())
454 transcriber['total_number_of_calls']+=1
455 print(transcriber)
456
457
458 # speaker['total_calls_duration']+=int(doctmp.to_dict()['call duration'])
459
460
461
462 # callsbyspeaker=db.collection('Call_Duration_Info').where(u'cid',u'==',speaker['userid']).get()
463
464 # tmplength=len(list(callsbyspeaker))
465
466 # speaker['total_number_of_calls']=tmplength
467
468 # for doctmp in total_jobs_docs:
469 # speaker['total_calls_duration']+=int(doctmp.to_dict()['call duration'])
470
471 # speaker['total_calls_duration']=round((speaker['total_calls_duration']/60),2)
472
473 # total_fragments_ref= db.collection(u'fragments').where(u'metadata.cid',u'==',speaker['userid']).get()
474
475 # for frgdoc in total_fragments_ref:
476 # total_effective_duration=total_effective_duration+int(frgdoc.to_dict()['metadata']['spduration'])
477
478 # speaker['total_effective_duration']= round (((total_effective_duration/1000)/60),2)
479
480 # #total Amount Calculation 500 to be made dynamic
481 # speaker['total_amount_to_pay']=round( ( (speaker['total_effective_duration'] / 60 ) *500) ,2)
482
483 # speakerslist.append(speaker)
484
485 return jsonify(transcriberslist=transcriberslist)
486 else:
487 return jsonify(speakerslist=speakerslist)
488
489
490
491
492
493
494
495
496@app.route('/metrics')
497def metrics():
498 return render_template('metrics.html')
499# somewhere to logout
500@app.route("/logout")
501@login_required
502def logout():
503 logout_user()
504 return Response('<p>Logged out</p>')
505
506# handle login failed
507@app.errorhandler(401)
508def page_not_found(e):
509 return Response('<p>Login failed</p>')
510
511# callback to reload the user object
512@login_manager.user_loader
513def load_user(userid):
514 return User(userid)
515
516if __name__ == '__main__':
517 app.run(debug = True)