dwipper commited on
Commit
047277b
1 Parent(s): f9a8849

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +682 -0
app.py ADDED
@@ -0,0 +1,682 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import io
3
+ import openai
4
+ import datetime
5
+ import time
6
+ import gradio as gr
7
+ import json
8
+ from jinja2 import Template
9
+ import requests
10
+ import fitz
11
+ from xhtml2pdf import pisa
12
+ from io import BytesIO
13
+ #from dotenv import load_dotenv
14
+ from datetime import datetime
15
+
16
+ #load_dotenv()
17
+
18
+ # Initialize OpenAI
19
+ openai.api_key = os.environ.get('OPENAI_API_KEY')
20
+
21
+ # Configuration variables
22
+ airtable_api_key = os.environ.get('AIRTABLE_API_KEY')
23
+
24
+ # Airtable table names
25
+ prompts_table_name = 'tblYIZEB8m6JkGDEP'
26
+ users_table_name = 'tblLNe5ZL47SvrAEk'
27
+ user_log_table_name = 'tblrlTsRrkl6BqMAJ'
28
+ compliancelog_table_name = 'tblQMXWKGlOonkIw2'
29
+ policies_table_name = 'tbla6PC65qZfqdJhE'
30
+ compliance_history_table_name = 'tbltA3vCb2upKVeFT'
31
+
32
+
33
+ # Define the style and content for the response field
34
+ label_text = "Contract Redline"
35
+ color = "#6562F4"
36
+ background_color = "white"
37
+ border_radius = "10px"
38
+ # response_label = f'<h3 style="color: {color}; background-color: {background_color}; border-radius: {border_radius}; padding: 10px;display: inline-block;">{label_text}</h3>'
39
+ response_label = f'<span style="display: inline-block; position: relative; z-index: var(--layer-4); border: solid var(--block-title-border-width) var(--block-title-border-color); border-radius: var(--block-title-radius); background: var(--block-title-background-fill); padding: var(--block-title-padding); color: var(--block-title-text-color); font-weight: var(--block-title-text-weight); font-size: var(--block-title-text-size); line-height: var(--line-sm); margin-bottom: var(--spacing-lg);">{label_text}</span>'
40
+ base_id = 'appcUK3hUWC7GM2Kb'
41
+
42
+ # App name for user login logging
43
+ app = "Compliance"
44
+
45
+ headers = {
46
+ "Authorization": f"Bearer {airtable_api_key}",
47
+ "Content-Type": "application/json",
48
+ "Accept": "application/json",
49
+ }
50
+
51
+
52
+ def prompt_trim(prompt: str) -> str:
53
+ lines = prompt.split('\n')
54
+ trimmed = '\n'.join([l.strip() for l in lines])
55
+ return trimmed
56
+
57
+ def get_policy_text(school):
58
+
59
+ airtable_endpoint = f'https://api.airtable.com/v0/{base_id}/{policies_table_name}'
60
+
61
+ # Parameters for the API request to select only the 'school' field
62
+ params = {
63
+ 'filterByFormula': f'school="{school}"',
64
+ 'fields[]': 'policy_text'
65
+ }
66
+
67
+ global policy_text
68
+ policy_text = ''
69
+
70
+ try:
71
+ # Send a GET request to the Airtable API
72
+ response = requests.get(airtable_endpoint, headers=headers, params=params)
73
+
74
+ # Check if the request was successful (status code 200)
75
+ if response.status_code == 200:
76
+ # Parse the JSON response
77
+ data = response.json()
78
+
79
+ # Check if there are records in the response
80
+ if data.get('records'):
81
+ # Extract the 'school' values from each record
82
+ policy_text = [record['fields']['policy_text'] for record in data['records']]
83
+
84
+ else:
85
+ print("No records found in the 'policies' table.")
86
+ else:
87
+ print(f"Failed to retrieve data. Status code: {response.status_code}")
88
+ except Exception as e:
89
+ print(f"An error occurred: {str(e)}")
90
+
91
+ #print(policy_text)
92
+
93
+ return policy_text
94
+
95
+ def get_schools():
96
+
97
+ airtable_endpoint = f'https://api.airtable.com/v0/{base_id}/{policies_table_name}'
98
+
99
+ # Parameters for the API request to select only the 'school' field
100
+ params = {
101
+ 'fields[]': 'school', # Replace with the name of your field
102
+ 'sort[0][field]': 'school', # Sort by the 'school' field
103
+ 'sort[0][direction]': 'asc', # Sort in ascending order
104
+ }
105
+
106
+ schools = ''
107
+
108
+ try:
109
+ # Send a GET request to the Airtable API
110
+ response = requests.get(airtable_endpoint, headers=headers, params=params)
111
+
112
+ # Check if the request was successful (status code 200)
113
+ if response.status_code == 200:
114
+ # Parse the JSON response
115
+ data = response.json()
116
+
117
+ # Check if there are records in the response
118
+ if data.get('records'):
119
+ # Extract the 'school' values from each record
120
+ schools = [record['fields']['school'] for record in data['records']]
121
+
122
+ else:
123
+ print("No records found in the 'policies' table.")
124
+ else:
125
+ print(f"Failed to retrieve data. Status code: {response.status_code}")
126
+ except Exception as e:
127
+ print(f"An error occurred: {str(e)}")
128
+
129
+ return schools
130
+
131
+ def get_prompt(header, template_content):
132
+ airtable_endpoint = f'https://api.airtable.com/v0/{base_id}/{prompts_table_name}'
133
+
134
+ params = {
135
+ 'filterByFormula': "prompt_name='Compliance_v1'",
136
+ }
137
+
138
+ response = requests.get(airtable_endpoint, headers=headers, params=params)
139
+
140
+ # Check for errors
141
+ response.raise_for_status()
142
+
143
+ data = response.json()
144
+
145
+ # Check if there is at least one record matching the condition
146
+ if data.get('records'):
147
+ # Get the first record (there should be only one)
148
+ record = data['records'][0]['fields']
149
+
150
+ # Assign system_prompt and user_prompt to variables
151
+ header = record.get('system_prompt', '')
152
+ template_content = record.get('user_prompt', '')
153
+
154
+ return header, template_content
155
+
156
+
157
+ def append_to_at_compliancelog(policy_name_dd,contract_text,gpt_response, response_time, question_cost, prompt_tokens, completion_tokens):
158
+ airtable_endpoint = f'https://api.airtable.com/v0/{base_id}/{compliancelog_table_name}'
159
+
160
+ # Organize data for Airtable
161
+ new_fields = {
162
+ 'policy_name': str(policy_name_dd),
163
+ 'contract_text': str(contract_text),
164
+ 'gpt_response': str(gpt_response),
165
+ 'response_time': str(response_time),
166
+ 'question_cost': question_cost,
167
+ 'user_name': str(logged_in_user),
168
+ 'prompt_tokens': prompt_tokens,
169
+ 'completion_tokens': completion_tokens
170
+ }
171
+
172
+ data = {
173
+ 'fields': new_fields
174
+ }
175
+ try:
176
+
177
+ # Post data to Airtable
178
+ response = requests.post(airtable_endpoint, headers=headers, json=data)
179
+
180
+ # print(response.json())
181
+
182
+ # Check for errors
183
+ response.raise_for_status()
184
+
185
+ except requests.exceptions.HTTPError as http_error:
186
+ # Handle the HTTP error (e.g., log it or display an error message)
187
+ print(f"HTTP error occurred: {http_error}")
188
+
189
+ except Exception as e:
190
+ # Handle exceptions, log errors, or raise them as needed
191
+ print(f"An error occurred: {str(e)}")
192
+
193
+ def format_date(date_str):
194
+ # Convert YYYY-MM-DD or YYYY-MM-DDTHH:MM:SS.000Z to MM/DD/YYYY HH:MM:SS format
195
+ try:
196
+ date_obj = datetime.strptime(date_str, "%Y-%m-%d")
197
+ return date_obj.strftime("%m/%d/%Y")
198
+ except ValueError:
199
+ try:
200
+ date_obj = datetime.strptime(date_str, "%Y-%m-%dT%H:%M:%S.%fZ")
201
+ return date_obj.strftime("%m/%d/%Y %H:%M")
202
+ except ValueError:
203
+ return date_str
204
+
205
+ def get_compliance_history():
206
+ airtable_endpoint = f'https://api.airtable.com/v0/{base_id}/{compliance_history_table_name}'
207
+ params = {
208
+ #'filterByFormula': f'school="{policy_name_dd}"',
209
+ 'fields[]': ['sponsor', 'contract_value', 'student_name', 'student_email', 'start_date', 'end_date', 'status', 'Created'],
210
+ 'sort[0][field]': 'Created',
211
+ 'sort[0][direction]': 'desc',
212
+ }
213
+
214
+ compliance_fields = [
215
+ 'sponsor', 'contract_value', 'student_name', 'student_email', 'start_date', 'end_date', 'status', 'Created'
216
+ ]
217
+ compliance_records = []
218
+
219
+ try:
220
+ # Send a GET request to the Airtable API
221
+ response = requests.get(airtable_endpoint, headers=headers, params=params)
222
+
223
+ # Check if the request was successful (status code 200)
224
+ if response.status_code == 200:
225
+ # Parse the JSON response
226
+ data = response.json()
227
+
228
+ # Check if there are records in the response
229
+ if data.get('records'):
230
+ for record in data['records']:
231
+ # Use list comprehension to create the record in the correct field order
232
+ record_data = [
233
+ format_date(record['fields'][field]) if field in ['start_date', 'end_date', 'Created'] else
234
+ record['fields'][field]
235
+ for field in compliance_fields
236
+ ]
237
+ compliance_records.append(record_data)
238
+
239
+ else:
240
+ print("No records found in the 'compliance history' table.")
241
+ else:
242
+ print(f"Failed to retrieve data. Status code: {response.status_code}")
243
+ except Exception as e:
244
+ print(f"An error occurred: {str(e)}")
245
+
246
+ #print(compliance_records)
247
+
248
+ return compliance_records
249
+
250
+ def append_to_at_compliance_history(policy_name_dd,contract_redline_html,compliance_comments_tbox,sponsor_tbox,compensation_num,status_ddss,name_tbox,email_tbox,start_date_tbox,end_date_tbox):
251
+ airtable_endpoint = f'https://api.airtable.com/v0/{base_id}/{compliance_history_table_name}'
252
+
253
+ # Organize data for Airtable
254
+ new_fields = {
255
+ 'school': str(policy_name_dd),
256
+ 'sponsor': str(sponsor_tbox),
257
+ 'contract_redline': str(contract_redline_html),
258
+ 'compliance_comments': str(compliance_comments_tbox),
259
+ 'contract_value': compensation_num,
260
+ 'status': str(status_ddss),
261
+ 'student_name': str(name_tbox),
262
+ 'student_email': str(email_tbox),
263
+ 'start_date': str(start_date_tbox),
264
+ 'end_date': str(end_date_tbox)
265
+ }
266
+
267
+ data = {
268
+ 'fields': new_fields
269
+ }
270
+ if (
271
+ not policy_name_dd or
272
+ not contract_redline_html or
273
+ not compliance_comments_tbox or
274
+ not sponsor_tbox or
275
+ not compensation_num or
276
+ not status_ddss or
277
+ not name_tbox or
278
+ not email_tbox or
279
+ not start_date_tbox or
280
+ not end_date_tbox
281
+ ):
282
+ gr.Warning("One or more fields are blank. Contract cannot be saved")
283
+ return
284
+
285
+ try:
286
+
287
+ # Post data to Airtable
288
+ response = requests.post(airtable_endpoint, headers=headers, json=data)
289
+
290
+ #print(response.json())
291
+
292
+ # Check for errors
293
+ response.raise_for_status()
294
+
295
+ gr.Info("Contract Saved")
296
+
297
+ compliance_history = get_compliance_history()
298
+
299
+
300
+ return {compliance_history_df: compliance_history }
301
+
302
+ except requests.exceptions.HTTPError as http_error:
303
+ # Handle the HTTP error (e.g., log it or display an error message)
304
+ print(f"HTTP error occurred: {http_error}")
305
+
306
+ except Exception as e:
307
+ # Handle exceptions, log errors, or raise them as needed
308
+ print(f"An error occurred: {str(e)}")
309
+
310
+ # Chatbot Function
311
+ def chatbot(policy_name_dd,contract_text,progress=gr.Progress()):
312
+
313
+ start_time = datetime.now()
314
+
315
+ progress(progress=None)
316
+
317
+ """
318
+ time.sleep(10)
319
+ for i in progress.tqdm(range(100)):
320
+ time.sleep(1)
321
+ """
322
+
323
+ #print(policy_name)
324
+
325
+ #students = get_students(school_selection)
326
+ get_policy_text(policy_name_dd)
327
+
328
+ #print(policy_text)
329
+ #print(contract_text)
330
+
331
+ template_content = ''
332
+ header = ''
333
+
334
+ header, template_content = get_prompt(header, template_content)
335
+
336
+ # print(header)
337
+ # print(template_content)
338
+
339
+ # Create a Jinja2 template from the content
340
+ template = Template(template_content)
341
+
342
+ # Render the template with the inputs
343
+ analysis_input = template.render(contract_text=contract_text,policy_text=policy_text)
344
+
345
+ trimmed_input = prompt_trim(analysis_input)
346
+
347
+ with open('analysis_input.txt', 'w', encoding='utf-8') as out_file:
348
+ out_file.write(trimmed_input)
349
+
350
+ gpt_model = "gpt-4-1106-preview"
351
+ response = openai.ChatCompletion.create(
352
+ model=gpt_model,
353
+ temperature=0,
354
+ messages=[
355
+ {
356
+ "role": "system",
357
+ "content": header
358
+ },
359
+ {
360
+ "role": "user",
361
+ "content": analysis_input
362
+ }
363
+ ]
364
+ )
365
+
366
+ gpt_response = response.choices[0].message["content"]
367
+
368
+ tokens_used = response.usage
369
+ if gpt_model == "gpt-4":
370
+ question_cost = (tokens_used.get('total_tokens', 0) / 1000) * .03
371
+ prompt_tokens = tokens_used.get('prompt_tokens', )
372
+ completion_tokens = tokens_used.get('completion_tokens', 0)
373
+
374
+ else:
375
+ prompt_tokens = tokens_used.get('prompt_tokens', )
376
+ completion_tokens = tokens_used.get('completion_tokens', 0)
377
+ question_cost = ((prompt_tokens / 1000) * .01) + ((completion_tokens / 1000) * .03)
378
+
379
+
380
+ with open('response.txt', 'w', encoding='utf-8') as out_file:
381
+ out_file.write(gpt_response)
382
+
383
+ end_time = datetime.now()
384
+
385
+ response_time = end_time - start_time
386
+
387
+ data = json.loads(gpt_response.replace("```json", "").replace("```", "").strip())
388
+
389
+ global student_name, student_email, sponsor_name, start_date, end_date
390
+ student_name = data['header']['Student Name']
391
+ student_email = data['header']['Student Email']
392
+ sponsor_name = data['header']['Sponsor Name']
393
+ start_date = data['header']['Start Date']
394
+ end_date = data['header']['End Date']
395
+
396
+ # Extracting data from the 'body' node
397
+ html_content = data['body']
398
+
399
+ append_to_at_compliancelog(policy_name_dd,contract_text,html_content, response_time, question_cost, prompt_tokens, completion_tokens)
400
+
401
+ return {contract_redline_html: html_content, download_row: gr.Row(visible=True)}
402
+
403
+ def log_login(username):
404
+ airtable_endpoint = f'https://api.airtable.com/v0/{base_id}/{user_log_table_name}'
405
+
406
+ # Organize data for Airtable
407
+ new_fields = {
408
+ 'user_name': str(username),
409
+ 'app': str(app)
410
+ }
411
+
412
+ data = {
413
+ 'fields': new_fields
414
+ }
415
+ try:
416
+
417
+ # Post data to Airtable
418
+ response = requests.post(airtable_endpoint, headers=headers, json=data)
419
+
420
+ # Check for errors
421
+ response.raise_for_status()
422
+
423
+ except requests.exceptions.HTTPError as http_error:
424
+ # Handle the HTTP error (e.g., log it or display an error message)
425
+ print(f"HTTP error occurred: {http_error}")
426
+
427
+ except Exception as e:
428
+ # Handle exceptions, log errors, or raise them as needed
429
+ print(f"An error occurred: {str(e)}")
430
+
431
+
432
+ def login_auth(username, password):
433
+ airtable_endpoint = f'https://api.airtable.com/v0/{base_id}/{users_table_name}'
434
+
435
+ # Query the 'users' table to check for a match with the provided username and password
436
+ params = {
437
+ 'filterByFormula': f'AND(user_name = "{username}", password = "{password}")'
438
+ }
439
+
440
+ response = requests.get(airtable_endpoint, headers=headers, params=params)
441
+
442
+ if response.status_code == 200:
443
+ data = response.json()
444
+ if data.get('records'):
445
+ log_login(username)
446
+ global logged_in_user
447
+ logged_in_user = username
448
+
449
+ #gr.Info("Login Success")
450
+
451
+ return {login_row: gr.Row(visible=False), app_row: gr.Row(visible=True)}
452
+
453
+ #gr.Info("Login Failed")
454
+ print(f"Invalid user/password combination")
455
+
456
+ return {login_row: gr.Row(visible=True), app_row: gr.Row(visible=False)}
457
+
458
+
459
+ def extract_text_with_spacing(pdf_path):
460
+ document = fitz.open(pdf_path)
461
+ all_text = []
462
+
463
+ for page in document:
464
+ # Extract text in a dict structure
465
+ blocks = page.get_text("dict")["blocks"]
466
+
467
+ for b in blocks:
468
+ if "lines" in b: # Check if the block contains lines of text
469
+ for line in b["lines"]:
470
+ span_texts = [span["text"] for span in line["spans"]]
471
+ all_text.append(" ".join(span_texts))
472
+ all_text.append("\n") # Presume a new block is a new paragraph
473
+
474
+ document.close()
475
+ return "\n".join(all_text)
476
+
477
+
478
+ def pdf_to_text(contract_file_cmpt, contract_text_tbox, file_name_tbox):
479
+
480
+ file_text = extract_text_with_spacing(contract_file_cmpt.name)
481
+
482
+ #file_text = extract_text(contract_file_cmpt.name)
483
+ original_file_name = contract_file_cmpt.name.split("/")[-1]
484
+ redline_file_name = original_file_name.split(".")[0]+" Redline.pdf"
485
+
486
+ return file_text, redline_file_name, None, None, None
487
+
488
+ def convert_html_to_pdf(source_html, output_filename):
489
+ # Result file stream
490
+ result_file = open(output_filename, "w+b")
491
+
492
+ # Convert HTML to PDF
493
+ pisa_status = pisa.CreatePDF(
494
+ BytesIO(source_html.encode("UTF-8")), # HTML content
495
+ dest=result_file) # File handle to receive the result
496
+
497
+ # Close the result file
498
+ result_file.close()
499
+
500
+ # Return True on success and False on errors
501
+ return pisa_status.err
502
+
503
+ def download_pdf(compliance_comments,contract_redline_html,file_name_tbox):
504
+ #config = pdfkit.configuration(wkhtmltopdf="/usr/local/bin/wkhtmltopdf")
505
+
506
+ contract_redline_comments = "<h2><u>Contract Redline:</u></h2><br>"+contract_redline_html + "<br><h2><u>Compliance Comments:</u></h2><br>"+compliance_comments
507
+
508
+ #global pdf_download
509
+ #pdf_download = pdfkit.from_string(contract_redline_comments,file_name_tbox,configuration=config)
510
+
511
+ convert_html_to_pdf(contract_redline_comments, file_name_tbox)
512
+
513
+ return {pdf_download_file: file_name_tbox}
514
+
515
+ def change_tab(contract_text):
516
+
517
+ if (
518
+ not contract_text
519
+ ):
520
+ gr.Warning("Contract Text is blank.")
521
+ return False
522
+
523
+ return gr.Tabs(selected=1)
524
+
525
+ def update_tboxes():
526
+ return {sponsor_tbox: sponsor_name, name_tbox: student_name, email_tbox: student_email, start_date_tbox: start_date, end_date_tbox: end_date}
527
+
528
+ def policy_name_change(policy_name_dd):
529
+
530
+ gr.Info(f'Policy Name Changed to {policy_name_dd}')
531
+
532
+ # Gradio UI
533
+ CIMStheme = gr.themes.Soft().set(
534
+ button_primary_background_fill='#6562F4',
535
+ )
536
+
537
+ schools = get_schools()
538
+
539
+ #compliance_history = get_compliance_history(["Wake Forest University"])
540
+ #compliance_history = get_compliance_history()
541
+ #policy_text = get_policy_text("LSU") #for testing the function call
542
+
543
+ #contract_redline = "<p><strong>Campaign:</strong></p><p><strong>Engagement Name:</strong> Applebee's Fall Burger Promo</p><p><strong>Engagement Id:</strong> 7015j000001DvCAAA0</p><p><strong>Sponsor:</strong> Applebee's</p><p><strong>Start Date:</strong> 2023-10-28</p><p><strong>End Date:</strong> 2023-11-11</p><p><strong>Engagement Description</strong></p><p>The goal of the engagement is to Increase Sales by having the Student-Athlete Social Media Post. For the Social Media Post, the sponsor is requesting the student athlete take a photo in front of the <span style='text-decoration: line-through;'>football stadium</span> in eating a Applebee's burger <span style='text-decoration: line-through;'>in your team jersey</span>. The Media rights for the content will be 90 Days.</p><p><strong>Engagement Compensation.</strong></p><p>For successful completion of the engagement the student-athlete will receive payment in the form of Cash.</p><p>Part or all of the payment will be in cash, paid via PayPal.</p><p>The total value of compensation will be 250.</p>"
544
+ #pdf_download = pdfkit.from_string(contract_redline, False)
545
+
546
+ #print(pdf_download)
547
+
548
+ logged_in_user = 'admin'
549
+ file_text = ''
550
+ contract_text = ''
551
+ policy_text = ''
552
+ compliance_comments = ''
553
+ file_name = 'redline.pdf'
554
+ pdf_download = ''
555
+
556
+ with gr.Blocks(CIMStheme) as iface:
557
+ with gr.Row(visible=False) as app_row:
558
+ with gr.Column():
559
+ with gr.Row():
560
+ with gr.Column(scale=2):
561
+ gr.Image(label="Logo", value="Nili_v2_Character.png", width=100, height=100, show_download_button=False,
562
+ interactive=False, show_label=False, elem_id="logo", container=False)
563
+ with gr.Column(scale=2):
564
+ gr.Markdown(value="<H2 style='text-align: center;'>NILI Compliance Desktop</h2>")
565
+ with gr.Column(scale=2):
566
+ gr.Markdown("")
567
+ with gr.Tabs() as tabs:
568
+ with gr.Tab(label="Contract Upload", id=0) as upload_tab:
569
+ with gr.Row():
570
+ with gr.Column(variant='panel',scale=1):
571
+ contract_file_cmpt = gr.File(label="Select Contract File",file_count="single",file_types=[".pdf"],height=150)
572
+ with gr.Column(variant='panel',scale=4):
573
+ with gr.Row():
574
+ with gr.Column(variant='panel'):
575
+ contract_text_tbox = gr.Textbox(label="Contract Text",interactive=True,info="Upload .pdf or paste in text. Shift-Enter to add a line")
576
+ with gr.Row():
577
+ with gr.Column(scale=1):
578
+ upload_btn = gr.components.Button(value="Upload Contract", size='sm', variant="primary")
579
+ with gr.Column(scale=2):
580
+ gr.Markdown("")
581
+ with gr.Column(scale=1):
582
+ redline_btn = gr.components.Button(value="Redline Contract", size='sm', variant="primary")
583
+ with gr.Column(scale=2):
584
+ gr.Markdown("")
585
+ with gr.Tab(label="Contract Redline", id=1) as redline_tab:
586
+ with gr.Row(variant='panel'):
587
+ with gr.Column():
588
+ sponsor_tbox = gr.Textbox(label="Sponsor:", interactive=True)
589
+ compensation_num = gr.Number(label="Contract Value",value=0)
590
+ status_ddss = gr.Dropdown(["Pending","Approved","Rejected"],multiselect=False,label="Status", value="Pending")
591
+ with gr.Column():
592
+ name_tbox = gr.Textbox(label="Name:", interactive=True)
593
+ email_tbox = gr.Textbox(label="Email:", interactive=True, type='email',placeholder='xxxxxxx@xxxxxx.xxx')
594
+ with gr.Column():
595
+ start_date_tbox = gr.Textbox(label="Start Date:", interactive=True, placeholder='MM/DD/YYYY')
596
+ end_date_tbox = gr.Textbox(label="End Date:", interactive=True, placeholder='MM/DD/YYYY')
597
+ with gr.Row():
598
+ with gr.Column(variant='panel'):
599
+ gr.components.Markdown(response_label)
600
+ contract_redline_html = gr.HTML(label="Contract Redline")
601
+ compliance_comments_tbox = gr.Textbox(interactive=True,label='Compliance Comments')
602
+ with gr.Row():
603
+ with gr.Column():
604
+ save_btn = gr.Button(value="Save Contract", size='sm', variant="primary")
605
+ with gr.Column():
606
+ gr.Markdown("")
607
+ with gr.Column():
608
+ gr.Markdown("")
609
+ with gr.Column():
610
+ gr.Markdown("")
611
+ with gr.Column():
612
+ gr.Markdown("")
613
+ with gr.Row(visible=False) as download_row:
614
+ with gr.Column(variant='panel'):
615
+ file_name_tbox = gr.Textbox(interactive=False,label='File Name',visible=False)
616
+ pdf_download_file = gr.File()
617
+ download_btn = gr.Button(value="Create Redline PDF", size='sm', variant="primary")
618
+ upload_btn.click(pdf_to_text,inputs=[contract_file_cmpt,contract_text_tbox,file_name_tbox],outputs=[contract_text_tbox,file_name_tbox,contract_redline_html,compliance_comments_tbox,pdf_download_file])
619
+ download_btn.click(download_pdf,inputs=[compliance_comments_tbox,contract_redline_html,file_name_tbox],outputs=pdf_download_file)
620
+ with gr.Column():
621
+ gr.Markdown("")
622
+ with gr.Column():
623
+ gr.Markdown("")
624
+ with gr.Column():
625
+ gr.Markdown("")
626
+ with gr.Column():
627
+ gr.Markdown("")
628
+ with gr.Tab(label="History", id=3) as history_tab:
629
+ with gr.Row():
630
+ with gr.Column(variant='panel'):
631
+ compliance_history_df = gr.Dataframe(get_compliance_history,
632
+ headers=["Sponsor", "Contract Value", "Student Name", "Student Email", "Start Date", "End Date", "Status","Created"],
633
+ datatype=["str", "number", "str", "str", "date", "date", "str","date"],
634
+ label="Contract History",
635
+ interactive=False
636
+ )
637
+ with gr.Tab(label="Settings", id=4) as settings_tab:
638
+ with gr.Row():
639
+ with gr.Column(variant='panel',scale=1):
640
+ policy_name_dd = gr.Dropdown(schools, multiselect=False,label="NIL Policy Selection", value="Wake Forest University")
641
+ policy_name_dd.change(policy_name_change,inputs=policy_name_dd,outputs=None)
642
+ redline_btn.click(change_tab, inputs=contract_text_tbox, outputs=tabs).success(chatbot,inputs=[policy_name_dd,contract_text_tbox],
643
+ outputs=[contract_redline_html,download_row]).then(update_tboxes,inputs=None,
644
+ outputs=[sponsor_tbox,name_tbox,email_tbox,start_date_tbox,end_date_tbox])
645
+ save_btn.click(append_to_at_compliance_history,inputs=[policy_name_dd,contract_redline_html,compliance_comments_tbox,sponsor_tbox,compensation_num,status_ddss,name_tbox,email_tbox,start_date_tbox,end_date_tbox],outputs=compliance_history_df)
646
+ with gr.Column():
647
+ gr.Markdown("")
648
+ with gr.Column():
649
+ gr.Markdown("")
650
+ with gr.Column():
651
+ gr.Markdown("")
652
+ with gr.Row(visible=True) as login_row:
653
+ with gr.Column():
654
+ with gr.Row():
655
+ with gr.Column(scale=2):
656
+ gr.Markdown("")
657
+ with gr.Column(scale=1):
658
+ with gr.Row():
659
+ gr.Image(label="Logo", value="Nili_v2_Character.png", width=100, height=100,
660
+ show_download_button=False,
661
+ interactive=False, show_label=False, elem_id="logo", container=False)
662
+ with gr.Row():
663
+ gr.Markdown(value="<H2 style='text-align: center;'>NILI Login</h2>")
664
+ with gr.Column(scale=2):
665
+ gr.Markdown("")
666
+ with gr.Row():
667
+ with gr.Column(scale=2):
668
+ gr.Markdown("")
669
+ with gr.Column(scale=1, variant='panel'):
670
+ username_tbox = gr.Textbox(label="User Name", interactive=True)
671
+ password_tbox = gr.Textbox(label="Password", interactive=True, type='password')
672
+ submit_btn = gr.Button(value='Submit', variant='primary', size='sm')
673
+ submit_btn.click(login_auth, inputs=[username_tbox, password_tbox], outputs=[login_row,app_row])
674
+ with gr.Column(scale=2):
675
+ gr.Markdown("")
676
+ with gr.Row():
677
+ with gr.Column(scale=4):
678
+ gr.HTML('<center><i>© 2023 Collegiate Influencer Marketing Systems, Inc.</i><br>CIMS.AI, CIMS.AI logo, NILI, NILI logo, and EzNIL are trademarks of Collegiate Influencer Marketing Systems, Inc.</center>')
679
+
680
+ iface.queue()
681
+ #iface.queue(concurrency_count=20).launch(auth=login_auth, auth_message= "Enter your username and password that you received from CIMS.AI. To request a login, please email 'info@cims.ai'")
682
+ iface.launch()