Exemplo n.º 1
0
 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 ""))
Exemplo n.º 2
0
    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)
Exemplo n.º 3
0
    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))
Exemplo n.º 5
0
    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
Exemplo n.º 6
0
 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
Exemplo n.º 7
0
    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()
Exemplo n.º 8
0
    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
Exemplo n.º 9
0
    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
Exemplo n.º 10
0
    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
Exemplo n.º 11
0
 def link_with_moodle(self, moodle_id):
     ch = components.get("CourseHandler")
     ch.link_course_with_moodle(self, moodle_id)
Exemplo n.º 12
0
 def setUp(self):
     initialize_components()
     self.ch = components.get("CourseHandler")
     self.setUpPyfakefs()
Exemplo n.º 13
0
 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)
Exemplo n.º 14
0
 def moodle_filename(self):
     return components.get("Config")["directories"]["moodle_config_file"].format(course_name=self.name)
Exemplo n.º 15
0
 def course_urls_filename(self):
     return components.get("Config")["directories"]["course_urls_file"]
Exemplo n.º 16
0
 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
Exemplo n.º 17
0
 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())))
Exemplo n.º 18
0
    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)