Skip to content

Commit 4d66377

Browse files
authored
Merge pull request #423 from Center-for-AI-Innovation/canvas-fixes
Canvas fixes
2 parents 4e6eb36 + 44bbb55 commit 4d66377

File tree

5 files changed

+238
-154
lines changed

5 files changed

+238
-154
lines changed

ai_ta_backend/beam/canvas_ingest.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -313,7 +313,6 @@ def ingest_course_content(self,
313313
4. Delete extracted files from local directory
314314
"""
315315

316-
print("In ingest_course_content")
317316
try:
318317
# a dictionary of all contents we want to ingest - files, pages, modules, syllabus, assignments, discussions.
319318
if content_ingest_dict is None:

ai_ta_backend/database/aws.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@ def __init__(self):
1111
# S3
1212
self.s3_client = boto3.client(
1313
's3',
14-
# endpoint_url=os.environ.get('MINIO_API_URL'), # for Self hosted MinIO bucket
14+
# aws_access_key_id=os.getenv('AWS_ACCESS_KEY_ID'),
15+
# aws_secret_access_key=os.getenv('AWS_SECRET_ACCESS_KEY'),
16+
# endpoint_url=os.environ.get('MINIO_URL'), # for Self hosted MinIO bucket
1517
)
1618

1719
def upload_file(self, file_path: str, bucket_name: str, object_name: str):

ai_ta_backend/main.py

Lines changed: 46 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -228,8 +228,8 @@ def delete(service: RetrievalService, flaskExecutor: ExecutorInterface):
228228
start_time = time.monotonic()
229229
# background execution of tasks!!
230230
flaskExecutor.submit(service.delete_data, course_name, s3_path, source_url)
231-
print(f"From {course_name}, deleted file: {s3_path}")
232-
print(f"⏰ Runtime of FULL delete func: {(time.monotonic() - start_time):.2f} seconds")
231+
logging.info(f"From {course_name}, deleted file: {s3_path}")
232+
logging.debug(f"⏰ Runtime of FULL delete func: {(time.monotonic() - start_time):.2f} seconds")
233233
# we need instant return. Delets are "best effort" assume always successful... sigh :(
234234
response = jsonify({"outcome": 'success'})
235235
response.headers.add('Access-Control-Allow-Origin', '*')
@@ -744,28 +744,31 @@ def ingest() -> Response:
744744

745745
# TODO: Authentication?
746746

747-
result = active_queue.addJobToIngestQueue(data)
748-
logging.info("Result from addJobToIngestQueue: %s", result)
747+
job_id = active_queue.addJobToIngestQueue(data)
748+
logging.info("Result from addJobToIngestQueue: %s", job_id)
749749

750750
response = jsonify(
751751
{
752752
"outcome": f'Queued Ingest task',
753-
"task_id": result
753+
"task_id": job_id
754754
}
755755
)
756756
response.headers.add('Access-Control-Allow-Origin', '*')
757757
return response
758758

759759
@app.route('/canvas_ingest', methods=['POST'])
760-
def canvas_ingest(request) -> Response:
761-
course_name: request.data.get('course_name', '')
762-
canvas_url: request.data.get('canvas_url', None)
763-
files: bool = request.data.get('files', True)
764-
pages: bool = request.data.get('pages', True)
765-
modules: bool = request.data.get('modules', True)
766-
syllabus: bool = request.data.get('syllabus', True)
767-
assignments: bool = request.data.get('assignments', True)
768-
discussions: bool = request.data.get('discussions', True)
760+
def canvas_ingest() -> Response:
761+
data = request.get_json()
762+
logging.info("Canvas ingest data: %s", data)
763+
764+
course_name: str = data.get('course_name', '')
765+
canvas_url: str = data.get('canvas_url', None)
766+
files: bool = data.get('files', True)
767+
pages: bool = data.get('pages', True)
768+
modules: bool = data.get('modules', True)
769+
syllabus: bool = data.get('syllabus', True)
770+
assignments: bool = data.get('assignments', True)
771+
discussions: bool = data.get('discussions', True)
769772
options = {
770773
'files': str(files).lower() == 'true',
771774
'pages': str(pages).lower() == 'true',
@@ -779,34 +782,37 @@ def canvas_ingest(request) -> Response:
779782
print("Canvas URL: ", canvas_url)
780783
print("Download Options: ", options)
781784

782-
try:
783-
# canvas.illinois.edu/courses/COURSE_CODE
784-
match = re.search(r'canvas\.illinois\.edu/courses/([^/]+)', canvas_url)
785-
canvas_course_id = match.group(1) if match else None
786-
787-
ingester = IngestCanvas()
788-
ingester.ingest_course_content(canvas_course_id=canvas_course_id,
789-
course_name=course_name,
790-
content_ingest_dict=options)
791-
except:
792-
print("Error ingesting course content from Canvas.")
793-
abort(500, description="Error ingesting course content from Canvas.")
794-
795-
active_queue = Queue()
796-
data = request.get_json()
797-
logging.info("Canvas ingest data: %s", data)
785+
# canvas.illinois.edu/courses/COURSE_CODE
786+
match = re.search(r'canvas\.illinois\.edu/courses/([^/]+)', canvas_url)
787+
canvas_course_id = match.group(1) if match else None
798788

799-
result = active_queue.addJobToIngestQueue(data, queue_name='uiuc-chat-canvas')
800-
logging.info("Result from addJobToIngestQueue: %s", result)
789+
canvas_id = os.getenv("CANVAS_ACCESS_TOKEN", default="")
790+
if len(canvas_id) == 0:
791+
response = jsonify(message=f"CANVAS_ACCESS_TOKEN is not configured.")
792+
response.status_code = 500
793+
response.headers.add('Access-Control-Allow-Origin', '*')
794+
return response
801795

802-
response = jsonify(
803-
{
804-
"outcome": f'Queued Canvas Ingest task',
805-
"ingest_task_id": result
806-
}
807-
)
808-
response.headers.add('Access-Control-Allow-Origin', '*')
809-
return response
796+
try:
797+
ingester = IngestCanvas()
798+
accept_status = ingester.auto_accept_enrollments(canvas_course_id)
799+
job_ids = ingester.ingest_course_content(canvas_course_id=canvas_course_id,
800+
course_name=course_name,
801+
content_ingest_dict=options)
802+
803+
response = jsonify(
804+
{
805+
"outcome": f'Queued Canvas Ingest task',
806+
"ingest_task_ids": job_ids
807+
}
808+
)
809+
response.headers.add('Access-Control-Allow-Origin', '*')
810+
return response
811+
except Exception as e:
812+
response = jsonify(error=str(e), message=f"Internal Server Error {e}")
813+
response.status_code = 500
814+
response.headers.add('Access-Control-Allow-Origin', '*')
815+
return response
810816

811817
@app.route('/createProject', methods=['POST'])
812818
def createProject(service: ProjectService, flaskExecutor: ExecutorInterface) -> Response:

0 commit comments

Comments
 (0)