diff --git a/BUGS.md b/BUGS.md index 6223124..6d08bb4 100644 --- a/BUGS.md +++ b/BUGS.md @@ -1,11 +1,9 @@ # BUGS -- goals se forem do tipo chapter deve importar todas as dependencias do chapter (e não mostrar chapters?). - nao esta a seguir o max_tries definido no ficheiro de dependencias. - devia mostrar timeout para o aluno saber a razao. - permitir configuracao para escolher entre static files locais ou remotos -- templates question-*.html tem input hidden question_ref que não é usado. remover? - shift-enter não está a funcionar - default prefix should be obtained from each course (yaml conf)? @@ -32,6 +30,8 @@ # FIXED +- templates question-*.html tem input hidden question_ref que não é usado. remover? +- goals se forem do tipo chapter deve importar todas as dependencias do chapter. - initdb da integrity error se no mesmo comando existirem alunos repetidos (p.ex em ficheiros csv diferentes ou entre csv e opcao -a) - dependencias que não são goals de um curso, só devem aparecer se ainda não tiverem sido feitas. - ir para inicio da pagina quando le nova pergunta. diff --git a/aprendizations/learnapp.py b/aprendizations/learnapp.py index edc7e4b..bef1f10 100644 --- a/aprendizations/learnapp.py +++ b/aprendizations/learnapp.py @@ -108,6 +108,9 @@ class LearnApp(object): msg = f'Goal "{goal}" from course "{c}" does not exist' logger.error(msg) raise LearnException(msg) + elif self.deps.nodes[goal]['type'] == 'chapter': + d['goals'] += [g for g in self.deps.predecessors(goal) + if g not in d['goals']] # --- factory is a dict with question generators for all topics self.factory: Dict[str, QFactory] = self.make_factory() @@ -318,7 +321,7 @@ class LearnApp(object): async def start_topic(self, uid: str, topic: str) -> None: student = self.online[uid]['state'] if uid == '0': - logger.warning(f'Reloading "{topic}"') + logger.warning(f'Reloading "{topic}"') # FIXME should be an option self.factory.update(self.factory_for(topic)) try: @@ -406,6 +409,7 @@ class LearnApp(object): t['path'] = path.join(g.graph['prefix'], tref) # prefix/topic + # ======================================================================== # methods that do not change state (pure functions) # ======================================================================== diff --git a/aprendizations/serve.py b/aprendizations/serve.py index 57bcbdd..181beb1 100644 --- a/aprendizations/serve.py +++ b/aprendizations/serve.py @@ -201,12 +201,14 @@ class CoursesHandler(BaseHandler): # ---------------------------------------------------------------------------- # /course/... -# Start a given course +# Start a given course and show list of topics # ---------------------------------------------------------------------------- class CourseHandler(BaseHandler): @tornado.web.authenticated def get(self, course_id): uid = self.current_user + if course_id == '': + course_id = self.learn.get_current_course_id(uid) try: self.learn.start_course(uid, course_id) diff --git a/aprendizations/student.py b/aprendizations/student.py index 87298eb..e5e99fd 100644 --- a/aprendizations/student.py +++ b/aprendizations/student.py @@ -59,12 +59,15 @@ class StudentState(object): self.current_course: Optional[str] = None self.topic_sequence: List[str] = [] self.current_topic: Optional[str] = None - # self.previous_topic: Optional[str] = None else: - logger.debug(f'starting course {course}') + try: + topics = self.courses[course]['goals'] + except KeyError: + logger.debug(f'course "{course}" does not exist') + raise + logger.debug(f'starting course "{course}"') self.current_course = course - topics = self.courses[course]['goals'] - self.topic_sequence = self.recommend_topic_sequence(topics) + self.topic_sequence = self.recommend_sequence(topics) # ------------------------------------------------------------------------ # Start a new topic. @@ -178,7 +181,7 @@ class StudentState(object): # The current topic is unchanged. # ------------------------------------------------------------------------ def finish_topic(self) -> None: - logger.debug(f'finished "{self.current_topic}"') + logger.debug(f'finished {self.current_topic} in {self.current_course}') self.state[self.current_topic] = { 'date': datetime.now(), @@ -232,7 +235,7 @@ class StudentState(object): # ------------------------------------------------------------------------ # compute recommended sequence of topics ['a', 'b', ...] # ------------------------------------------------------------------------ - def recommend_topic_sequence(self, goals: List[str] = []) -> List[str]: + def recommend_sequence(self, goals: List[str] = []) -> List[str]: G = self.deps ts = set(goals) for t in goals: @@ -245,6 +248,8 @@ class StudentState(object): if t in goals or level < min_level: todo.append(t) + logger.debug(f' {len(ts)} total topics, {len(todo)} listed ') + # FIXME topological sort is a poor way to sort topics tl = list(nx.topological_sort(G.subgraph(todo))) -- libgit2 0.21.2