def import_page(request): """Thực hiện nhập các chức năng từ file csv Hàm nhập từ file csv các trường stt, functionName vào model functions """ if checkInUrl(request, 'function') is False: listFunction = request.user.list_function() return HttpResponseRedirect(reverse(listFunction[0])) template = 'adminuet/functionimport.html' if request.method == 'GET': return TemplateResponse(request, template) try: csv_file = request.FILES['document'] except (Exception) as error: messages.error(request,'Lỗi: Chưa chọn tệp dữ liệu.') return TemplateResponse(request, template) if not csv_file.name.endswith('.csv'): messages.error(request,'Lỗi: Sai định dạng tệp. Vui lòng chọn lại tệp') return TemplateResponse(request, template) try: df = pd.read_csv(csv_file) create_from_DF(df=df, model=Functions, searching_cols=['functionName']) except (Exception) as error: print(error) messages.error(request,'Lỗi: Dữ liệu không đúng định dạng.') return TemplateResponse(request, template) return redirect('/adminuet/function/')
def import_page(request): """ Đọc file csv để nhập vào DB Hàm nhập từ file csv các trường stt, unitName, unitDescription vào model Units """ if checkInUrl(request, 'unit') is False: listFunction = request.user.list_function() return HttpResponseRedirect(reverse(listFunction[0])) template = 'adminuet/unitimport.html' if request.method == 'GET': return TemplateResponse(request, template) try: csv_file = request.FILES['document'] except (Exception) as error: messages.error(request,'Lỗi: Chưa chọn tệp dữ liệu.') return TemplateResponse(request, template) if not csv_file.name.endswith('.csv'): messages.error(request,'Lỗi: Sai định dạng tệp. Vui lòng chọn lại tệp') return TemplateResponse(request, template) try: df = pd.read_csv(csv_file).set_index("stt") create_from_DF(df=df, model=Units, searching_cols=['unitName']) # Ghi log message = str(len(df)) + ' bản ghi' createLog(request, 'IMPORT - Trường', message) except (Exception) as error: messages.error(request,'Lỗi: Dữ liệu không đúng định dạng.') return TemplateResponse(request, template) return redirect('/adminuet/unit/')
def import_page(request): """ Hàm nhập từ file csv các trường stt, semester, year, beginDay, endDay vào model Semesters """ if checkInUrl(request, 'semester') is False: listFunction = request.user.list_function() return HttpResponseRedirect(reverse(listFunction[0])) template = 'adminuet/semesterimport.html' if request.method == 'GET': return TemplateResponse(request, template) try: csv_file = request.FILES['document'] except (Exception) as error: messages.error(request, 'Lỗi: Chưa chọn tệp dữ liệu.') return TemplateResponse(request, template) if not csv_file.name.endswith('.csv'): messages.error(request, 'Lỗi: Sai định dạng tệp. Vui lòng chọn lại tệp') return TemplateResponse(request, template) try: df = pd.read_csv(csv_file).set_index("stt") years = Years.objects.all() dict_year = {} for year in years: dict_year[year.yearName.lower()] = year.yearID for i, row in df.iterrows(): if row['year_id'].lower() in dict_year: row['year_id'] = dict_year[row['year_id'].lower()] else: messages.error( request, 'Lỗi: Trong hệ thống không tồn tại ' + row['year'] + '.') return TemplateResponse(request, template) if checkCompareBeginDayAndEndDay(row['beginDay'], row['endDay']) is False: messages.error( request, 'Lỗi: Begin day lớn hơn end day ở hàng ' + str(row['stt']) + '.') return TemplateResponse(request, template) print(row['year_id']) create_from_DF( df=df, model=Semesters, searching_cols=['semesterName', 'year_id', 'beginDay', 'endDay']) except (Exception) as error: print(error) messages.error(request, 'Lỗi: Dữ liệu không đúng định dạng.', error) return TemplateResponse(request, template) return redirect('/adminuet/semester/')
def import_page(request): """ Thực hiện đọc file csv để nhập vào DB (không sử dụng) Thuộc tính của file csv roleName, roleDescription """ if checkInUrl(request, 'role') is False: listFunction = request.user.list_function() return HttpResponseRedirect(reverse(listFunction[0])) template = 'adminuet/roleimport.html' if request.method == 'GET': return TemplateResponse(request, template) try: csv_file = request.FILES['document'] except (Exception) as error: messages.error(request, 'Lỗi: Chưa chọn tệp dữ liệu.') return TemplateResponse(request, template) if not csv_file.name.endswith('.csv'): messages.error(request, 'Lỗi: Sai định dạng tệp. Vui lòng chọn lại tệp') return TemplateResponse(request, template) try: df = pd.read_csv(csv_file) functions = Functions.objects.all() # List các roleName để so sanh sự tồn tại list_function = [] for function in functions: list_function.append(function.functionName) for i, row in df.iterrows(): roleDes = row['roleDescription'] # Phân tách các chuỗi string bời dấu , vào list_function listToStringRole = roleDes.split(",") for itemFunction in listToStringRole: # Nếu itemFunction không có trong list_function thì báo lỗi luôn if not itemFunction in list_function: messages.error( request, 'Lỗi: Trong hệ thống không tồn tại chức năng ' + itemFunction + '.') return TemplateResponse(request, template) # Thực hiện ghi dữ liệu create_from_DF(df=df, model=Roles, searching_cols=['roleName', 'roleDescription']) except (Exception) as error: print(error) messages.error(request, 'Lỗi: Dữ liệu không đúng định dạng.') return TemplateResponse(request, template) return redirect('/adminuet/role/')
def import_page(request): """ Thực hiện đọc file csv để nhập vào DB Hàm xuất từ danh sách năm học ra file csv Các trường stt, yearName, active """ if checkInUrl(request, 'year') is False: listFunction = request.user.list_function() return HttpResponseRedirect(reverse(listFunction[0])) template = 'adminuet/yearimport.html' if request.method == 'GET': return TemplateResponse(request, template) try: csv_file = request.FILES['document'] except (Exception) as error: print(error) messages.error(request, 'Lỗi: Chưa chọn tệp dữ liệu.') return TemplateResponse(request, template) if not csv_file.name.endswith('.csv'): messages.error(request, 'Lỗi: Sai định dạng tệp. Vui lòng chọn lại tệp') return TemplateResponse(request, template) try: df = pd.read_csv(csv_file).set_index("stt") for i, row in df.iterrows(): df.loc[i, 'openingDay'] = datetime.strptime(row['openingDay'], "%Y-%m-%d").date() if str(row['active']).lower() == "kích hoạt": df.loc[i, 'active'] = True elif str(row['active']).lower() == "không kích hoạt": df.loc[i, 'active'] = False else: df.drop(i) year_list = create_from_DF(df=df, model=Years, searching_cols=['yearName']) for year in year_list: auto_generate_semesters(year) except Exception as error: print(error) messages.error(request, 'Lỗi: Dữ liệu không đúng định dạng.') return TemplateResponse(request, template) return redirect('/adminuet/year/')
def extract_transcript_file(request): """ Extract file điểm csv """ if checkInUrl(request, 'learningoutcome') is False: listFunction = request.user.list_function() return HttpResponseRedirect(reverse(listFunction[0])) file_id = request.POST['file_id'] transcript_file = DBModel.TranscriptFiles.objects.get(pk=file_id) extraction = DataExtraction() try: extraction.loadData(settings.MEDIA_ROOT + '/' + transcript_file.transcript.name) except Exception as e: print("error: learningoutcome.py line 40: ", e) return False # format student info DataFrame studentInfo = extraction.getStudentInfo() studentInfo['birth'] = pd.to_datetime(studentInfo['birth']) # studentInfo = studentInfo.loc[:, ['gender', 'birth']].reset_index() # studentInfo['group'] = stg # studentInfo.columns = ['MSSV', 'gender', 'birthday', 'group'] # DBModel.create_from_DF(studentInfo, DBModel.Profiles, searching_cols=['MSSV', 'group']) # format course info DataFrame courseInfo = extraction.getCourse() courseInfo.columns = ['courseCode', 'courseName', 'credit'] courseInfo['unit_id'] = transcript_file.group.generation.unit_id # check and create course try: course_obj_list = DBModel.create_from_DF( courseInfo, DBModel.Courses, searching_cols=['courseCode', 'unit_id']) recommend_semester = DBModel.semester_rank( group_id=transcript_file.group_id, current_semester_id=transcript_file.semester_id) + 1 for cou in course_obj_list: DBModel.Major_Course.objects.get_or_create( course_id=cou.pk, major_id=transcript_file.major_id, defaults={"semesterRecommended": recommend_semester}) del recommend_semester except Exception as e: print(e) return False course_dict = {cou.courseCode: cou.pk for cou in course_obj_list} stu_grade = extraction.getTranscript() try: for i, row in stu_grade.iterrows(): # check and create student name_arr = studentInfo.loc[i, 'name'].strip().split(' ') first_name = name_arr[-1] last_name = ' '.join(name_arr[:-1]) stu, created = DBModel.Profiles.objects.get_or_create( MSSV=i, group_id=transcript_file.group_id, defaults={ 'gender': studentInfo.loc[i, 'gender'], 'firstName': first_name, 'lastName': last_name, 'birthday': studentInfo.loc[i, 'birth'], 'major_id': transcript_file.major_id }) del name_arr, first_name, last_name # check and create grade in transcript for course_code, grade in row.items(): if ~np.isnan(grade): # print("not nan", grade) DBModel.Transcript.objects.update_or_create( course_id=course_dict[course_code], student=stu, semester_id=transcript_file.semester_id, defaults={'grade': round(grade, 2)}) # update gpa calculate_student_gpa(stu, 'update') except Exception as e: print("ERROR ", e.__dir__(), "\n", e) return False transcript_file.extracted = True transcript_file.save() return True