def listing(args): console = components.get("Console") adjustement = 20 console.print("All courses for this semester: ") console.print("%s %s" % ("Course:".ljust(adjustement), "Linked with Moodle:")) for c in args.semester.courses(): console.print("- %s %s" % (c.name.ljust(adjustement), "[x]" if c.is_linked_with_moodle else ""))
def authentication_process(self): loginUrl = self._main_url + "/login/" authUrl = self._main_url + "/auth/tequila" teqUrl = "https://tequila.epfl.ch/cgi-bin/tequila/login?requestkey=%s" login = self._session.request("get", loginUrl) console = components.get("Console") gaspar = console.input("Gaspar user: "******"username": gaspar, "password": password}) loginData = loginData.encode("utf-8") reqkey = parse.parse_qs(parse.urlparse(login.url).query).get("requestkey")[0] teq = self._session.request("post", teqUrl % reqkey, data=loginData) del gaspar del password del loginData if not "You are connected as" in teq.text: console.error("Authentication failed") auth = self._session.request("get", authUrl) self._cookies = self._session.cookies # As the authentication is successful, we save the cookies collected self.save_cookies(self._cookies)
def _init(self): """ Read Config and empty caches """ config = components.get("Config") self._semester_directories = config.getlist("directories", "semester_directories") parent, name = Path.split_parent(config["directories"]["main_dir"]) self._main_dir = Directory(parent)(name) # Cache self._semesters = {} # map from semester to (map from names to courses) self._courses = {} # map from name to courses
def test_create_directory_if_not_exists_does_not_create_dir_if_user_doesnt_want_to(self): root = self.create_basic_filesystem() dirname = "NewDir" with components.get("Console") as c: c.confirm = lambda question, default=None: False self.assertFalse(os.path.exists(dirname)) self.assertFalse(root.create_directory_if_not_exists(dirname)) self.assertFalse(os.path.exists(dirname))
def connect(self): console = components.get("Console") cookies = self._cookies if cookies is not None: cookies.clear_expired_cookies() if cookies is None or not self._important_cookies.issubset(set(cookies.get_dict().keys())): logger.info("Outdated or no cookies, need to reauthenticate") console.info("Outdated or no cookies, need to reauthenticate") self.authentication_process() else: logger.info("Good cookies, no need to reauthenticate") self._session.cookies = cookies
def link(args): console = components.get("Console") course_name = args.course s = args.semester try: course = console.choose_from( s.filter_courses(lambda c: fuzzy_match(course_name, c.name) and not c.is_linked_with_moodle), msg="What course do you want?", display_func=lambda s: s.name) moodle_id = console.input("What is the moodle id of %s ? " % course.name) course.link_with_moodle(moodle_id) console.info("Course linked!") except NoChoiceException: pass except UserQuitException: pass
def __init__(self): config = components.get("Config") self._cookies = None # we don't directly use the session.cookies to load/save cookies self._cookie_file = config["moodle"]["cookie_file"] self._main_url = config["moodle"]["main_url"] self._course_url = config["moodle"]["course_url"] self._session = requests.session() self._important_cookies = {'MoodleSession', 'TequilaPHP', 'tequila_key', 'tequila_user'} # Used as caches self._courses = None self._resources = defaultdict(list) self.load_cookies()
def create_directory_if_not_exists(self, path, directory_creation_confirm=True): """ Create a directory if it doesn't exist Returns a boolean indicating if, in the end, the directory exists Raise OSError if there is a problem while creating the directory """ if os.path.exists(path): logger.info("%s exists and is %s directory." % (path, "a" if os.path.isdir(path) else "not a")) return os.path.isdir(path) console = components.get("Console") if directory_creation_confirm and not console.confirm("Create directory %s" % path): logger.warn("Directory %s was not created." % path) return False logger.info("Creating directory %s" % path) os.mkdir(path) return True
def add_course(self, course_name, semester=None, ask_confirmation=False): # Possible ways to add a course: # - Inexisting directory # - Existing directory but not in the right place # - Choose format ? (camel, ...) if semester is None: semester = self.latest_semester() semester_dir = semester.fullpath() course_directory = os.path.join(semester_dir, course_name) console = components.get("Console") if not semester.create_directory_if_not_exists(course_directory, ask_confirmation): console.warn("Directory %s was not created. Aborting." % course_directory) return False # Directory was created return True
def go_to_url(args): s = args.semester course_name = args.course console = components.get("Console") try: course = console.choose_from( s.filter_courses(lambda c: fuzzy_match(course_name, c.name)), msg="What course do you want?", display_func=lambda s: s.name) url, site = console.choose_from(course.course_urls(), msg="URLs for %s" % course.name, display_func=lambda x: "%s (%s)" % (x[1].ljust(12),x[0])) sys_open(url) except NoChoiceException: console.warn("The %s file in %s is empty." % (urls_file, course_name)) except UserQuitException: pass
def link_with_moodle(self, moodle_id): ch = components.get("CourseHandler") ch.link_course_with_moodle(self, moodle_id)
def setUp(self): initialize_components() self.ch = components.get("CourseHandler") self.setUpPyfakefs()
def show(args): schedule_file = components.get("Config")["directories"]["schedule_file"] path = os.path.join(args.semester.fullpath(), schedule_file) if os.path.exists(path): display_img(path)
def moodle_filename(self): return components.get("Config")["directories"]["moodle_config_file"].format(course_name=self.name)
def course_urls_filename(self): return components.get("Config")["directories"]["course_urls_file"]
def is_linked_with_moodle(self): ch = components.get("CourseHandler") try: return ch.moodle_id_for_course(self) is not None except CourseNotLinkedWithMoodle: return False
def courses(self): course_handler = components.get("CourseHandler") return list(map(lambda c: c.as_class(CourseDir) , filter(course_handler.can_be_course_dir, self.dirs())))
def add(args): ch = components.get("CourseHandler") console = components.get("Console") course_name = console.input("Name of the course: ") ch.add_course(course_name, semester=args.semester)