Commit af9900456df1eafc14995eef385c5bd33fcd05f9
1 parent
427fa9a9
Exists in
master
and in
1 other branch
- added support for nodes of type 'chapter', that usually only have dependencies…
… and an information "question". - fixed information and success "questions".
Showing
6 changed files
with
32 additions
and
12 deletions
Show diff stats
knowledge.py
| @@ -45,7 +45,7 @@ class StudentKnowledge(object): | @@ -45,7 +45,7 @@ class StudentKnowledge(object): | ||
| 45 | now = datetime.now() | 45 | now = datetime.now() |
| 46 | for s in self.state.values(): | 46 | for s in self.state.values(): |
| 47 | dt = now - s['date'] | 47 | dt = now - s['date'] |
| 48 | - s['level'] *= 0.8 ** dt.days # forgetting factor 0.95 | 48 | + s['level'] *= 0.95 ** dt.days # forgetting factor 0.95 |
| 49 | 49 | ||
| 50 | 50 | ||
| 51 | # ------------------------------------------------------------------------ | 51 | # ------------------------------------------------------------------------ |
| @@ -178,6 +178,7 @@ class StudentKnowledge(object): | @@ -178,6 +178,7 @@ class StudentKnowledge(object): | ||
| 178 | def get_knowledge_state(self): | 178 | def get_knowledge_state(self): |
| 179 | return [{ | 179 | return [{ |
| 180 | 'ref': ref, | 180 | 'ref': ref, |
| 181 | + 'type': self.deps.nodes[ref]['type'], | ||
| 181 | 'name': self.deps.nodes[ref]['name'], | 182 | 'name': self.deps.nodes[ref]['name'], |
| 182 | 'level': self.state[ref]['level'] if ref in self.state else None | 183 | 'level': self.state[ref]['level'] if ref in self.state else None |
| 183 | } for ref in self.topic_sequence ] | 184 | } for ref in self.topic_sequence ] |
learnapp.py
| @@ -246,6 +246,10 @@ class LearnApp(object): | @@ -246,6 +246,10 @@ class LearnApp(object): | ||
| 246 | def get_topic_name(self, ref): | 246 | def get_topic_name(self, ref): |
| 247 | return self.deps.node[ref]['name'] | 247 | return self.deps.node[ref]['name'] |
| 248 | 248 | ||
| 249 | + # # ------------------------------------------------------------------------ | ||
| 250 | + # def get_topic_type(self, ref): | ||
| 251 | + # return self.deps.node[ref]['type'] | ||
| 252 | + | ||
| 249 | # ------------------------------------------------------------------------ | 253 | # ------------------------------------------------------------------------ |
| 250 | def get_current_public_dir(self, uid): | 254 | def get_current_public_dir(self, uid): |
| 251 | topic = self.online[uid]['state'].get_current_topic() | 255 | topic = self.online[uid]['state'].get_current_topic() |
| @@ -287,6 +291,7 @@ def build_dependency_graph(config={}): | @@ -287,6 +291,7 @@ def build_dependency_graph(config={}): | ||
| 287 | tnode = g.node[ref] # current node (topic) | 291 | tnode = g.node[ref] # current node (topic) |
| 288 | 292 | ||
| 289 | if isinstance(attr, dict): | 293 | if isinstance(attr, dict): |
| 294 | + tnode['type'] = attr.get('type', 'topic') | ||
| 290 | tnode['name'] = attr.get('name', ref) | 295 | tnode['name'] = attr.get('name', ref) |
| 291 | tnode['questions'] = attr.get('questions', []) | 296 | tnode['questions'] = attr.get('questions', []) |
| 292 | g.add_edges_from((d,ref) for d in attr.get('deps', [])) | 297 | g.add_edges_from((d,ref) for d in attr.get('deps', [])) |
serve.py
| @@ -117,7 +117,8 @@ class RootHandler(BaseHandler): | @@ -117,7 +117,8 @@ class RootHandler(BaseHandler): | ||
| 117 | uid=uid, | 117 | uid=uid, |
| 118 | name=self.learn.get_student_name(uid), | 118 | name=self.learn.get_student_name(uid), |
| 119 | state=self.learn.get_student_state(uid), | 119 | state=self.learn.get_student_state(uid), |
| 120 | - title=self.learn.get_title() | 120 | + title=self.learn.get_title(), |
| 121 | + # get_topic_type=self.learn.get_topic_type, # function | ||
| 121 | ) | 122 | ) |
| 122 | 123 | ||
| 123 | # ---------------------------------------------------------------------------- | 124 | # ---------------------------------------------------------------------------- |
templates/maintopics.html
| @@ -62,7 +62,7 @@ | @@ -62,7 +62,7 @@ | ||
| 62 | 62 | ||
| 63 | <h4>{{ title }}</h4> | 63 | <h4>{{ title }}</h4> |
| 64 | 64 | ||
| 65 | - <div class="list-group my-3"> | 65 | + <div class="list-group"> |
| 66 | {% for t in state %} | 66 | {% for t in state %} |
| 67 | {% if t['level'] is None %} | 67 | {% if t['level'] is None %} |
| 68 | <a class="list-group-item list-group-item-action bg-light disabled"> | 68 | <a class="list-group-item list-group-item-action bg-light disabled"> |
| @@ -83,12 +83,15 @@ | @@ -83,12 +83,15 @@ | ||
| 83 | </div> | 83 | </div> |
| 84 | <div class="ml-auto p-2"> | 84 | <div class="ml-auto p-2"> |
| 85 | {% if t['level'] < 0.01 %} | 85 | {% if t['level'] < 0.01 %} |
| 86 | - | ||
| 87 | <i class="fas fa-lock-open text-success"></i> | 86 | <i class="fas fa-lock-open text-success"></i> |
| 88 | {% else %} | 87 | {% else %} |
| 88 | + {% if t['type']=='chapter' %} | ||
| 89 | + <i class="fas fa-trophy fa-lg text-warning"></i> | ||
| 90 | + {% else %} | ||
| 89 | <span class="text-nowrap"> | 91 | <span class="text-nowrap"> |
| 90 | - {{ round(t['level']*5)*'<i class="fas fa-star text-warning"></i>' + round(5-t['level']*5)*'<i class="far fa-star text-muted"></i>' }} | 92 | + {{ round(t['level']*5)*'<i class="fas fa-star text-warning"></i>' + round(5-t['level']*5)*'<i class="far fa-star text-warning"></i>' }} |
| 91 | </span> | 93 | </span> |
| 94 | + {% end %} | ||
| 92 | {% end %} | 95 | {% end %} |
| 93 | </div> | 96 | </div> |
| 94 | </div> | 97 | </div> |
templates/question-information.html
| 1 | -{% extends "question.html" %} | 1 | +{% autoescape %} |
| 2 | + | ||
| 3 | +<div class="card border-primary mb-3"> | ||
| 4 | + <div class="card-body text-primary"> | ||
| 5 | + <h3 class="card-title">{{ question['title'] }}</h3> | ||
| 6 | + <p class="card-text"> | ||
| 7 | + {{ md(question['text']) }} | ||
| 8 | + </p> | ||
| 9 | + </div> | ||
| 10 | +</div> | ||
| 2 | 11 | ||
| 3 | -{% block answer %} | ||
| 4 | <input type="hidden" name="question_ref" value="{{ question['ref'] }}"> | 12 | <input type="hidden" name="question_ref" value="{{ question['ref'] }}"> |
| 5 | -{% end %} |
templates/question-success.html
| 1 | {% autoescape %} | 1 | {% autoescape %} |
| 2 | 2 | ||
| 3 | -<h1 class="page-header">{{ question['title'] }}</h1> | ||
| 4 | - | ||
| 5 | -<div id="text" class="alert alert-success" role="alert"> | ||
| 6 | - {{ md(question['text']) }} | 3 | +<div class="card border-success mb-3"> |
| 4 | + <div class="card-body text-success"> | ||
| 5 | + <h3 class="card-title">{{ question['title'] }}</h3> | ||
| 6 | + <p class="card-text"> | ||
| 7 | + {{ md(question['text']) }} | ||
| 8 | + </p> | ||
| 9 | + </div> | ||
| 7 | </div> | 10 | </div> |
| 8 | 11 | ||
| 9 | <input type="hidden" name="question_ref" value="{{ question['ref'] }}"> | 12 | <input type="hidden" name="question_ref" value="{{ question['ref'] }}"> |