def fetch_state(self) -> [Course]: """ Gets the current status of the configured Moodle account and compares it with the last known status for changes. It does not change the known state, nor does it download the files. @return: List with detected changes """ logging.debug('Fetching current Moodle State...') token = self.config_helper.get_token() privatetoken = self.config_helper.get_privatetoken() moodle_domain = self.config_helper.get_moodle_domain() moodle_path = self.config_helper.get_moodle_path() use_http = self.config_helper.get_use_http() request_helper = RequestHelper( moodle_domain, moodle_path, token, self.skip_cert_verify, self.log_responses_to, use_http, ) first_contact_handler = FirstContactHandler(request_helper) results_handler = ResultsHandler(request_helper, moodle_domain, moodle_path) download_course_ids = self.config_helper.get_download_course_ids() download_public_course_ids = self.config_helper.get_download_public_course_ids() dont_download_course_ids = self.config_helper.get_dont_download_course_ids() download_submissions = self.config_helper.get_download_submissions() download_databases = self.config_helper.get_download_databases() download_forums = self.config_helper.get_download_forums() download_quizzes = self.config_helper.get_download_quizzes() download_lessons = self.config_helper.get_download_lessons() download_workshops = self.config_helper.get_download_workshops() download_also_with_cookie = self.config_helper.get_download_also_with_cookie() courses = [] filtered_courses = [] cookie_handler = None print('\rDownloading account information\033[K', end='') userid, version = self.config_helper.get_userid_and_version() if userid is None or version is None: userid, version = first_contact_handler.fetch_userid_and_version() else: first_contact_handler.version = version assignments_handler = AssignmentsHandler(request_helper, version) databases_handler = DatabasesHandler(request_helper, version) forums_handler = ForumsHandler(request_helper, version) quizzes_handler = QuizzesHandler(request_helper, version) lessons_handler = LessonsHandler(request_helper, version) workshops_handler = WorkshopsHandler(request_helper, version) pages_handler = PagesHandler(request_helper, version) folders_handler = FoldersHandler(request_helper, version) results_handler.setVersion(version) if download_also_with_cookie: # generate a new cookie if necessary cookie_handler = CookieHandler(request_helper, version, self.storage_path) cookie_handler.check_and_fetch_cookies(privatetoken, userid) courses_list = first_contact_handler.fetch_courses(userid) courses = [] # Filter unselected courses for course in courses_list: if ResultsHandler.should_download_course(course.id, download_course_ids, dont_download_course_ids): courses.append(course) public_courses_list = first_contact_handler.fetch_courses_info(download_public_course_ids) for course in public_courses_list: courses.append(course) assignments = assignments_handler.fetch_assignments(courses) if download_submissions: assignments = assignments_handler.fetch_submissions(userid, assignments) databases = databases_handler.fetch_databases(courses) if download_databases: databases = databases_handler.fetch_database_files(databases) forums = forums_handler.fetch_forums(courses) if download_forums: last_timestamps_per_forum = self.recorder.get_last_timestamps_per_forum() forums = forums_handler.fetch_forums_posts(forums, last_timestamps_per_forum) quizzes = quizzes_handler.fetch_quizzes(courses) if download_quizzes: quizzes = quizzes_handler.fetch_quizzes_files(userid, quizzes) lessons = lessons_handler.fetch_lessons(courses) if download_lessons: lessons = lessons_handler.fetch_lessons_files(userid, lessons) workshops = workshops_handler.fetch_workshops(courses) if download_workshops: workshops = workshops_handler.fetch_workshops_files(userid, workshops) pages = pages_handler.fetch_pages(courses) folders = folders_handler.fetch_folders(courses) courses = self.add_options_to_courses(courses) index = 0 for course in courses: index += 1 # to limit the output to one line limits = shutil.get_terminal_size() shorted_course_name = course.fullname if len(course.fullname) > 17: shorted_course_name = course.fullname[:15] + '..' into = '\rDownloading course information' status_message = into + ' %3d/%3d [%-17s|%6s]' % (index, len(courses), shorted_course_name, course.id) if len(status_message) > limits.columns: status_message = status_message[0 : limits.columns] print(status_message + '\033[K', end='') course_fetch_addons = { 'assign': assignments.get(course.id, {}), 'data': databases.get(course.id, {}), 'forum': forums.get(course.id, {}), 'quiz': quizzes.get(course.id, {}), 'lesson': lessons.get(course.id, {}), 'workshop': workshops.get(course.id, {}), 'page': pages.get(course.id, {}), 'folder': folders.get(course.id, {}), } results_handler.set_fetch_addons(course_fetch_addons) course.files = results_handler.fetch_files(course) filtered_courses.append(course) print('') logging.debug('Checking for changes...') changes = self.recorder.changes_of_new_version(filtered_courses) # Filter changes changes = self.add_options_to_courses(changes) changes = self.filter_courses(changes, self.config_helper, cookie_handler, courses_list + public_courses_list) return changes
def fetch_state(self) -> [Course]: """ Gets the current status of the configured Moodle account and compares it with the last known status for changes. It does not change the known state, nor does it download the files. @return: List with detected changes """ logging.debug('Fetching current Moodle State...') token = self.config_helper.get_token() privatetoken = self.config_helper.get_privatetoken() moodle_domain = self.config_helper.get_moodle_domain() moodle_path = self.config_helper.get_moodle_path() request_helper = RequestHelper(moodle_domain, moodle_path, token, self.skip_cert_verify, self.log_responses_to) first_contact_handler = FirstContactHandler(request_helper) results_handler = ResultsHandler(request_helper, moodle_domain, moodle_path) download_course_ids = self.config_helper.get_download_course_ids() dont_download_course_ids = self.config_helper.get_dont_download_course_ids( ) download_submissions = self.config_helper.get_download_submissions() download_databases = self.config_helper.get_download_databases() download_forums = self.config_helper.get_download_forums() download_also_with_cookie = self.config_helper.get_download_also_with_cookie( ) courses = [] filtered_courses = [] cookie_handler = None try: print('\rDownloading account information\033[K', end='') userid, version = first_contact_handler.fetch_userid_and_version() assignments_handler = AssignmentsHandler(request_helper, version) databases_handler = DatabasesHandler(request_helper, version) forums_handler = ForumsHandler(request_helper, version) results_handler.setVersion(version) if download_also_with_cookie: # generate a new cookie if necessary cookie_handler = CookieHandler(request_helper, version, self.storage_path) cookie_handler.check_and_fetch_cookies(privatetoken, userid) courses_list = first_contact_handler.fetch_courses(userid) courses = [] # Filter unselected courses for course in courses_list: if ResultsHandler.should_download_course( course.id, download_course_ids, dont_download_course_ids): courses.append(course) assignments = assignments_handler.fetch_assignments(courses) if download_submissions: assignments = assignments_handler.fetch_submissions( userid, assignments) databases = databases_handler.fetch_databases(courses) if download_databases: databases = databases_handler.fetch_database_files(databases) forums = forums_handler.fetch_forums(courses) if download_forums: last_timestamps_per_forum = self.recorder.get_last_timestamps_per_forum( ) forums = forums_handler.fetch_forums_posts( forums, last_timestamps_per_forum) index = 0 for course in courses: index += 1 # to limit the output to one line limits = shutil.get_terminal_size() shorted_course_name = course.fullname if len(course.fullname) > 17: shorted_course_name = course.fullname[:15] + '..' into = '\rDownloading course information' status_message = into + ' %3d/%3d [%-17s|%6s]' % ( index, len(courses), shorted_course_name, course.id) if len(status_message) > limits.columns: status_message = status_message[0:limits.columns] print(status_message + '\033[K', end='') course_assignments = assignments.get(course.id, {}) course_databases = databases.get(course.id, {}) course_forums = forums.get(course.id, {}) results_handler.set_fetch_addons(course_assignments, course_databases, course_forums) course.files = results_handler.fetch_files(course.id) filtered_courses.append(course) print('') except (RequestRejectedError, ValueError, RuntimeError) as error: raise RuntimeError( 'Error while communicating with the Moodle System! (%s)' % (error)) logging.debug('Checking for changes...') changes = self.recorder.changes_of_new_version(filtered_courses) # Filter changes changes = self.filter_courses(changes, self.config_helper, cookie_handler) changes = self.add_options_to_courses(changes) return changes