From 933f9358c275fcc0f608aa226fcbec38e719f67f Mon Sep 17 00:00:00 2001 From: jszymanski Date: Thu, 11 Oct 2018 18:51:06 +0200 Subject: [PATCH 01/22] yml with descriptions --- naucse/data/stats.yml | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 naucse/data/stats.yml diff --git a/naucse/data/stats.yml b/naucse/data/stats.yml new file mode 100644 index 0000000000..69e319c59f --- /dev/null +++ b/naucse/data/stats.yml @@ -0,0 +1,41 @@ +entries: + + - label: active_runs + text: + - '%d právě probíhající kurz' + - '%d právě probíhající kurzy' + - '%d právě probíhajících kurzů' + + - label: all_runs + text: + - '%d kurz celkem' + - '%d kurzy celkem' + - '%d kurzů celkem' + + - label: sessions_delivered + text: + - '%d lekci odučeno' + - '%d lekce odučeno' + - '%d lekcí odučeno' + + - label: sessions_available + text: + - 'materiály pro %d lekci' + - 'materiály pro %d různé lekce' + - 'materiály pro %d různých lekcí' + + - label: cheatsheets + text: + - '%d tahák' + - '%d taháky' + - '%d taháků' + + - label: contributors + text: + - '%d autor' + - '%d autoři' + - '%d autorů' + + - label: price + text: + - Kč From bfed96e35f177d622acde2940e517256b119f067 Mon Sep 17 00:00:00 2001 From: jszymanski Date: Sun, 14 Oct 2018 18:26:08 +0200 Subject: [PATCH 02/22] shamelessly copy czech plurals from pyvec :-) --- naucse/utils/views.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/naucse/utils/views.py b/naucse/utils/views.py index 146aa49456..ac0169b015 100644 --- a/naucse/utils/views.py +++ b/naucse/utils/views.py @@ -232,3 +232,27 @@ def get_edit_info(edit_path): "page_name": get_edit_page_name(), "url": edit_link(edit_path) } + +def czech_plural(text, n): + """ + Chooses the Czech plural form based on n. + This either gets and immediately returns a string, + or it gets a list of 3 strings: + * for 1 item + * for 2-4 items + * for the rest + Picks the right one and returns it. + Uses the more modern option where e.g. 21 is NOT pluralized as 1 + http://prirucka.ujc.cas.cz/?id=792 + """ + if isinstance(text, str): + return text + + # we don't expect negative numbers here, but just to be sure + n = abs(n) + + if n == 1: + return text[0] + if 1 < n < 5: + return text[1] + return text[2] From f8e24da2cb48fb3ea955e4ae42d08b9c781a8600 Mon Sep 17 00:00:00 2001 From: jszymanski Date: Sun, 14 Oct 2018 18:47:42 +0200 Subject: [PATCH 03/22] stupid yml mistake --- naucse/data/stats.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/naucse/data/stats.yml b/naucse/data/stats.yml index 69e319c59f..4b6c4c330d 100644 --- a/naucse/data/stats.yml +++ b/naucse/data/stats.yml @@ -37,5 +37,4 @@ entries: - '%d autorů' - label: price - text: - - Kč + text: '%d Kč' From cbbb517df12e79c0bb78a6dd362bc58da705d0a1 Mon Sep 17 00:00:00 2001 From: jszymanski Date: Sun, 14 Oct 2018 18:59:06 +0200 Subject: [PATCH 04/22] basic list skel, no styles or data --- naucse/templates/index.html | 8 ++++++++ naucse/views.py | 27 +++++++++++++++++++++++++-- 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/naucse/templates/index.html b/naucse/templates/index.html index b39691135f..90a6455e36 100644 --- a/naucse/templates/index.html +++ b/naucse/templates/index.html @@ -49,6 +49,14 @@

Nauč se Python!

+
+
    + {% for stat_label in stat_labels.entries %} +
  • {{ stat_label|fill_label }}
  • + {% endfor %} +
+
+ diff --git a/naucse/views.py b/naucse/views.py index bace195e2b..afd643af87 100644 --- a/naucse/views.py +++ b/naucse/views.py @@ -28,8 +28,11 @@ from naucse.utils.views import does_course_return_info from naucse.utils.views import raise_errors_from_forks from naucse.utils.views import page_content_cache_key, get_edit_info +from naucse.utils.views import czech_plural from naucse.validation import DisallowedStyle, DisallowedElement, InvalidHTML +import yaml + # so it can be mocked import naucse.utils.views @@ -44,7 +47,6 @@ _cached_model = None - @LocalProxy def model(): """Return the root of the naucse model @@ -97,10 +99,19 @@ def session_url(course, session, coverpage='front'): coverpage=coverpage) +def load_stat_labels(): + datafile = os.path.join(os.path.dirname(__file__), 'data/stats.yml') + with open(datafile) as fstr: + stat_labels = yaml.load(fstr) + + return stat_labels + + @app.route('/') def index(): return render_template("index.html", - edit_info=get_edit_info(Path("."))) + edit_info=get_edit_info(Path(".")), + stat_labels=load_stat_labels()) @app.route('/runs/') @@ -920,3 +931,15 @@ def course_calendar_ics(course): abort(404) return Response(str(calendar), mimetype="text/calendar") + +def basic_stat(name): + return 0 + +@app.template_filter('fill_label') +def fill_label(label): + print(label) + stat_number = basic_stat(label['label']) + + formatstr = czech_plural(label['text'], stat_number) + + return formatstr % stat_number From 29d4fe948c54ef538dfe9bbd6c6497ab7b4897b6 Mon Sep 17 00:00:00 2001 From: jszymanski Date: Sun, 14 Oct 2018 19:10:06 +0200 Subject: [PATCH 05/22] add active runs --- naucse/views.py | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/naucse/views.py b/naucse/views.py index afd643af87..0841af97f1 100644 --- a/naucse/views.py +++ b/naucse/views.py @@ -932,8 +932,23 @@ def course_calendar_ics(course): return Response(str(calendar), mimetype="text/calendar") +def active_runs(): + today = datetime.date.today() + + runs = (model.runs_from_year(today.year) + + model.runs_from_year(today.year - 1) + + model.runs_from_year(today.year - 2)) + ongoing = [run for run in runs if + run.start_date <= today and run.end_date >= today] + + return len(ongoing) + + def basic_stat(name): - return 0 + if name == 'active_runs': + return active_runs() + else: + return 0 @app.template_filter('fill_label') def fill_label(label): From 97d9ca8a4668a385d0cab9a43b13270c7a4aa038 Mon Sep 17 00:00:00 2001 From: jszymanski Date: Sun, 14 Oct 2018 19:10:28 +0200 Subject: [PATCH 06/22] remove unnecessary print --- naucse/views.py | 1 - 1 file changed, 1 deletion(-) diff --git a/naucse/views.py b/naucse/views.py index 0841af97f1..67a7932fff 100644 --- a/naucse/views.py +++ b/naucse/views.py @@ -952,7 +952,6 @@ def basic_stat(name): @app.template_filter('fill_label') def fill_label(label): - print(label) stat_number = basic_stat(label['label']) formatstr = czech_plural(label['text'], stat_number) From 991c8c274d89e6aa1b31732200b3e8947e153c16 Mon Sep 17 00:00:00 2001 From: jszymanski Date: Sun, 14 Oct 2018 19:32:33 +0200 Subject: [PATCH 07/22] add all_runs, sessions_delivered --- naucse/views.py | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/naucse/views.py b/naucse/views.py index 67a7932fff..988a557b20 100644 --- a/naucse/views.py +++ b/naucse/views.py @@ -943,10 +943,33 @@ def active_runs(): return len(ongoing) +def all_runs(): + all_years = list(model.safe_run_years.keys()) + + return sum([len(model.runs_from_year(year)) for year in all_years]) + +def sessions_delivered(): + today = datetime.date.today() + all_years = list(model.safe_run_years.keys()) + + all_runs = [] + for year in all_years: + all_runs.extend(model.runs_from_year(year)) + + all_sessions = [] + for run in all_runs: + all_sessions.extend(list(run.sessions.values())) + + return len([session for session in all_sessions if session.date < today]) + def basic_stat(name): if name == 'active_runs': return active_runs() + elif name == 'all_runs': + return all_runs() + elif name == 'sessions_delivered': + return sessions_delivered() else: return 0 From c265049aa69d1a2367a47a9673b371f0a559997e Mon Sep 17 00:00:00 2001 From: jszymanski Date: Sun, 14 Oct 2018 19:36:00 +0200 Subject: [PATCH 08/22] safe_courses now a function --- naucse/views.py | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/naucse/views.py b/naucse/views.py index 988a557b20..4e4bf1209e 100644 --- a/naucse/views.py +++ b/naucse/views.py @@ -183,23 +183,28 @@ def runs(year=None, all=None): edit_info=get_edit_info(model.runs_edit_path)) +def safe_courses(): + courses = [] + + for course in model.courses.values(): + if not course.is_link(): + if not course.is_meta: + courses.append(course) + elif naucse.utils.views.forks_enabled() and does_course_return_info(course): + courses.append(course) + + return courses + @app.route('/courses/') def courses(): # since even the basic info about the forked courses can be broken, # we need to make sure the required info is provided. # If ``RAISE_FORK_ERRORS`` is set, exceptions are raised here, # otherwise the course is ignored completely. - safe_courses = [] - - for course in model.courses.values(): - if not course.is_link(): - if not course.is_meta: - safe_courses.append(course) - elif naucse.utils.views.forks_enabled() and does_course_return_info(course): - safe_courses.append(course) + courses = safe_courses() return render_template("course_list.html", - courses=safe_courses, + courses=courses, title="Seznam online kurzů Pythonu", edit_info=get_edit_info(model.courses_edit_path)) From 773b93b50298f6c43f33192d8330ba83ba6ade6b Mon Sep 17 00:00:00 2001 From: jszymanski Date: Sun, 14 Oct 2018 19:40:40 +0200 Subject: [PATCH 09/22] add sessions_available --- naucse/views.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/naucse/views.py b/naucse/views.py index 4e4bf1209e..1f2a3aa4a4 100644 --- a/naucse/views.py +++ b/naucse/views.py @@ -967,6 +967,15 @@ def sessions_delivered(): return len([session for session in all_sessions if session.date < today]) +def sessions_available(): + uniq_sessions = {} + for course in safe_courses(): + for session in course.sessions.values(): + uniq_sessions[session.slug] = session + + return len(uniq_sessions) + + def basic_stat(name): if name == 'active_runs': @@ -975,6 +984,8 @@ def basic_stat(name): return all_runs() elif name == 'sessions_delivered': return sessions_delivered() + elif name == 'sessions_available': + return sessions_available() else: return 0 From 799b18c20d5af9b37e672acf3151f6c5f7a556a3 Mon Sep 17 00:00:00 2001 From: jszymanski Date: Sun, 14 Oct 2018 20:02:54 +0200 Subject: [PATCH 10/22] cheatsheets --- naucse/views.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/naucse/views.py b/naucse/views.py index 1f2a3aa4a4..682b9c51ee 100644 --- a/naucse/views.py +++ b/naucse/views.py @@ -975,8 +975,18 @@ def sessions_available(): return len(uniq_sessions) +def cheatsheets(): + sheets = 0 + for course in safe_courses(): + for session in course.sessions.values(): + for material in session.materials: + if (material.url_type == 'cheatsheet'): + sheets += 1 + return sheets + +# This could use some caching, but for now it's the simplest way def basic_stat(name): if name == 'active_runs': return active_runs() @@ -986,7 +996,9 @@ def basic_stat(name): return sessions_delivered() elif name == 'sessions_available': return sessions_available() - else: + elif name == 'cheatsheets': + return cheatsheets() + else: # contributors, price return 0 @app.template_filter('fill_label') From 58c999d8d6e621590121aab63336966af9797c89 Mon Sep 17 00:00:00 2001 From: jszymanski Date: Sun, 14 Oct 2018 20:26:07 +0200 Subject: [PATCH 11/22] make it look a little better --- naucse/static/css/index.css | 11 +++++++++++ naucse/templates/index.html | 6 +++--- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/naucse/static/css/index.css b/naucse/static/css/index.css index 74106282e3..afd798d8a3 100644 --- a/naucse/static/css/index.css +++ b/naucse/static/css/index.css @@ -46,3 +46,14 @@ nav.header * { background-color: #296e62; outline-color: #3fb0ac; } + +.statlabels { + text-align: center; +} + +.statlabel { + font-size: 1.5rem; + margin: 0.3rem; + color: #FFF; + background-color: #3b4f5a; +} diff --git a/naucse/templates/index.html b/naucse/templates/index.html index 90a6455e36..82ee368661 100644 --- a/naucse/templates/index.html +++ b/naucse/templates/index.html @@ -50,11 +50,11 @@

Nauč se Python!

-
    +
    {% for stat_label in stat_labels.entries %} -
  • {{ stat_label|fill_label }}
  • + {{ stat_label|fill_label }} {% endfor %} -
+
From b517b6720b9b92124e0037d4d89b43d1f5b54528 Mon Sep 17 00:00:00 2001 From: jszymanski Date: Thu, 11 Oct 2018 18:51:06 +0200 Subject: [PATCH 12/22] yml with descriptions --- naucse/data/stats.yml | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 naucse/data/stats.yml diff --git a/naucse/data/stats.yml b/naucse/data/stats.yml new file mode 100644 index 0000000000..69e319c59f --- /dev/null +++ b/naucse/data/stats.yml @@ -0,0 +1,41 @@ +entries: + + - label: active_runs + text: + - '%d právě probíhající kurz' + - '%d právě probíhající kurzy' + - '%d právě probíhajících kurzů' + + - label: all_runs + text: + - '%d kurz celkem' + - '%d kurzy celkem' + - '%d kurzů celkem' + + - label: sessions_delivered + text: + - '%d lekci odučeno' + - '%d lekce odučeno' + - '%d lekcí odučeno' + + - label: sessions_available + text: + - 'materiály pro %d lekci' + - 'materiály pro %d různé lekce' + - 'materiály pro %d různých lekcí' + + - label: cheatsheets + text: + - '%d tahák' + - '%d taháky' + - '%d taháků' + + - label: contributors + text: + - '%d autor' + - '%d autoři' + - '%d autorů' + + - label: price + text: + - Kč From a72077b536c1b6789bbeb544bc41be8f8432b47d Mon Sep 17 00:00:00 2001 From: jszymanski Date: Sun, 14 Oct 2018 18:26:08 +0200 Subject: [PATCH 13/22] shamelessly copy czech plurals from pyvec :-) --- naucse/utils/views.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/naucse/utils/views.py b/naucse/utils/views.py index 146aa49456..ac0169b015 100644 --- a/naucse/utils/views.py +++ b/naucse/utils/views.py @@ -232,3 +232,27 @@ def get_edit_info(edit_path): "page_name": get_edit_page_name(), "url": edit_link(edit_path) } + +def czech_plural(text, n): + """ + Chooses the Czech plural form based on n. + This either gets and immediately returns a string, + or it gets a list of 3 strings: + * for 1 item + * for 2-4 items + * for the rest + Picks the right one and returns it. + Uses the more modern option where e.g. 21 is NOT pluralized as 1 + http://prirucka.ujc.cas.cz/?id=792 + """ + if isinstance(text, str): + return text + + # we don't expect negative numbers here, but just to be sure + n = abs(n) + + if n == 1: + return text[0] + if 1 < n < 5: + return text[1] + return text[2] From 24ba12e68d5878b85f87da7186a2c87ea499197c Mon Sep 17 00:00:00 2001 From: jszymanski Date: Sun, 14 Oct 2018 18:47:42 +0200 Subject: [PATCH 14/22] stupid yml mistake --- naucse/data/stats.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/naucse/data/stats.yml b/naucse/data/stats.yml index 69e319c59f..4b6c4c330d 100644 --- a/naucse/data/stats.yml +++ b/naucse/data/stats.yml @@ -37,5 +37,4 @@ entries: - '%d autorů' - label: price - text: - - Kč + text: '%d Kč' From 4d95b9b95c39845b7137b7c919ab5a71fd0c35ce Mon Sep 17 00:00:00 2001 From: jszymanski Date: Sun, 14 Oct 2018 18:59:06 +0200 Subject: [PATCH 15/22] basic list skel, no styles or data --- naucse/templates/index.html | 8 ++++++++ naucse/views.py | 27 +++++++++++++++++++++++++-- 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/naucse/templates/index.html b/naucse/templates/index.html index b39691135f..90a6455e36 100644 --- a/naucse/templates/index.html +++ b/naucse/templates/index.html @@ -49,6 +49,14 @@

Nauč se Python!

+
+
    + {% for stat_label in stat_labels.entries %} +
  • {{ stat_label|fill_label }}
  • + {% endfor %} +
+
+ diff --git a/naucse/views.py b/naucse/views.py index bace195e2b..afd643af87 100644 --- a/naucse/views.py +++ b/naucse/views.py @@ -28,8 +28,11 @@ from naucse.utils.views import does_course_return_info from naucse.utils.views import raise_errors_from_forks from naucse.utils.views import page_content_cache_key, get_edit_info +from naucse.utils.views import czech_plural from naucse.validation import DisallowedStyle, DisallowedElement, InvalidHTML +import yaml + # so it can be mocked import naucse.utils.views @@ -44,7 +47,6 @@ _cached_model = None - @LocalProxy def model(): """Return the root of the naucse model @@ -97,10 +99,19 @@ def session_url(course, session, coverpage='front'): coverpage=coverpage) +def load_stat_labels(): + datafile = os.path.join(os.path.dirname(__file__), 'data/stats.yml') + with open(datafile) as fstr: + stat_labels = yaml.load(fstr) + + return stat_labels + + @app.route('/') def index(): return render_template("index.html", - edit_info=get_edit_info(Path("."))) + edit_info=get_edit_info(Path(".")), + stat_labels=load_stat_labels()) @app.route('/runs/') @@ -920,3 +931,15 @@ def course_calendar_ics(course): abort(404) return Response(str(calendar), mimetype="text/calendar") + +def basic_stat(name): + return 0 + +@app.template_filter('fill_label') +def fill_label(label): + print(label) + stat_number = basic_stat(label['label']) + + formatstr = czech_plural(label['text'], stat_number) + + return formatstr % stat_number From 6e0440b8bc3ca38703de5c5e3703c7207f5d2692 Mon Sep 17 00:00:00 2001 From: jszymanski Date: Sun, 14 Oct 2018 19:10:06 +0200 Subject: [PATCH 16/22] add active runs --- naucse/views.py | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/naucse/views.py b/naucse/views.py index afd643af87..0841af97f1 100644 --- a/naucse/views.py +++ b/naucse/views.py @@ -932,8 +932,23 @@ def course_calendar_ics(course): return Response(str(calendar), mimetype="text/calendar") +def active_runs(): + today = datetime.date.today() + + runs = (model.runs_from_year(today.year) + + model.runs_from_year(today.year - 1) + + model.runs_from_year(today.year - 2)) + ongoing = [run for run in runs if + run.start_date <= today and run.end_date >= today] + + return len(ongoing) + + def basic_stat(name): - return 0 + if name == 'active_runs': + return active_runs() + else: + return 0 @app.template_filter('fill_label') def fill_label(label): From a32a4fd58417879861bd89dc1b440c27738457f4 Mon Sep 17 00:00:00 2001 From: jszymanski Date: Sun, 14 Oct 2018 19:10:28 +0200 Subject: [PATCH 17/22] remove unnecessary print --- naucse/views.py | 1 - 1 file changed, 1 deletion(-) diff --git a/naucse/views.py b/naucse/views.py index 0841af97f1..67a7932fff 100644 --- a/naucse/views.py +++ b/naucse/views.py @@ -952,7 +952,6 @@ def basic_stat(name): @app.template_filter('fill_label') def fill_label(label): - print(label) stat_number = basic_stat(label['label']) formatstr = czech_plural(label['text'], stat_number) From e8037e769f5c180afa5eede3a474e87296859293 Mon Sep 17 00:00:00 2001 From: jszymanski Date: Sun, 14 Oct 2018 19:32:33 +0200 Subject: [PATCH 18/22] add all_runs, sessions_delivered --- naucse/views.py | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/naucse/views.py b/naucse/views.py index 67a7932fff..988a557b20 100644 --- a/naucse/views.py +++ b/naucse/views.py @@ -943,10 +943,33 @@ def active_runs(): return len(ongoing) +def all_runs(): + all_years = list(model.safe_run_years.keys()) + + return sum([len(model.runs_from_year(year)) for year in all_years]) + +def sessions_delivered(): + today = datetime.date.today() + all_years = list(model.safe_run_years.keys()) + + all_runs = [] + for year in all_years: + all_runs.extend(model.runs_from_year(year)) + + all_sessions = [] + for run in all_runs: + all_sessions.extend(list(run.sessions.values())) + + return len([session for session in all_sessions if session.date < today]) + def basic_stat(name): if name == 'active_runs': return active_runs() + elif name == 'all_runs': + return all_runs() + elif name == 'sessions_delivered': + return sessions_delivered() else: return 0 From 9a62b824263755b8b7f8de17958e028dab86ac6c Mon Sep 17 00:00:00 2001 From: jszymanski Date: Sun, 14 Oct 2018 19:36:00 +0200 Subject: [PATCH 19/22] safe_courses now a function --- naucse/views.py | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/naucse/views.py b/naucse/views.py index 988a557b20..4e4bf1209e 100644 --- a/naucse/views.py +++ b/naucse/views.py @@ -183,23 +183,28 @@ def runs(year=None, all=None): edit_info=get_edit_info(model.runs_edit_path)) +def safe_courses(): + courses = [] + + for course in model.courses.values(): + if not course.is_link(): + if not course.is_meta: + courses.append(course) + elif naucse.utils.views.forks_enabled() and does_course_return_info(course): + courses.append(course) + + return courses + @app.route('/courses/') def courses(): # since even the basic info about the forked courses can be broken, # we need to make sure the required info is provided. # If ``RAISE_FORK_ERRORS`` is set, exceptions are raised here, # otherwise the course is ignored completely. - safe_courses = [] - - for course in model.courses.values(): - if not course.is_link(): - if not course.is_meta: - safe_courses.append(course) - elif naucse.utils.views.forks_enabled() and does_course_return_info(course): - safe_courses.append(course) + courses = safe_courses() return render_template("course_list.html", - courses=safe_courses, + courses=courses, title="Seznam online kurzů Pythonu", edit_info=get_edit_info(model.courses_edit_path)) From 43bfee9ba605710cb717d61c4e21a6efa68e02d4 Mon Sep 17 00:00:00 2001 From: jszymanski Date: Sun, 14 Oct 2018 19:40:40 +0200 Subject: [PATCH 20/22] add sessions_available --- naucse/views.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/naucse/views.py b/naucse/views.py index 4e4bf1209e..1f2a3aa4a4 100644 --- a/naucse/views.py +++ b/naucse/views.py @@ -967,6 +967,15 @@ def sessions_delivered(): return len([session for session in all_sessions if session.date < today]) +def sessions_available(): + uniq_sessions = {} + for course in safe_courses(): + for session in course.sessions.values(): + uniq_sessions[session.slug] = session + + return len(uniq_sessions) + + def basic_stat(name): if name == 'active_runs': @@ -975,6 +984,8 @@ def basic_stat(name): return all_runs() elif name == 'sessions_delivered': return sessions_delivered() + elif name == 'sessions_available': + return sessions_available() else: return 0 From 9a8a9c7a3202c9c884b8c71c080ad2f93dc1000d Mon Sep 17 00:00:00 2001 From: jszymanski Date: Sun, 14 Oct 2018 20:02:54 +0200 Subject: [PATCH 21/22] cheatsheets --- naucse/views.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/naucse/views.py b/naucse/views.py index 1f2a3aa4a4..682b9c51ee 100644 --- a/naucse/views.py +++ b/naucse/views.py @@ -975,8 +975,18 @@ def sessions_available(): return len(uniq_sessions) +def cheatsheets(): + sheets = 0 + for course in safe_courses(): + for session in course.sessions.values(): + for material in session.materials: + if (material.url_type == 'cheatsheet'): + sheets += 1 + return sheets + +# This could use some caching, but for now it's the simplest way def basic_stat(name): if name == 'active_runs': return active_runs() @@ -986,7 +996,9 @@ def basic_stat(name): return sessions_delivered() elif name == 'sessions_available': return sessions_available() - else: + elif name == 'cheatsheets': + return cheatsheets() + else: # contributors, price return 0 @app.template_filter('fill_label') From 4a8ce40d90b51737f533297ea3e730ab2a6a0651 Mon Sep 17 00:00:00 2001 From: jszymanski Date: Sun, 14 Oct 2018 20:26:07 +0200 Subject: [PATCH 22/22] make it look a little better --- naucse/static/css/index.css | 11 +++++++++++ naucse/templates/index.html | 6 +++--- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/naucse/static/css/index.css b/naucse/static/css/index.css index 74106282e3..afd798d8a3 100644 --- a/naucse/static/css/index.css +++ b/naucse/static/css/index.css @@ -46,3 +46,14 @@ nav.header * { background-color: #296e62; outline-color: #3fb0ac; } + +.statlabels { + text-align: center; +} + +.statlabel { + font-size: 1.5rem; + margin: 0.3rem; + color: #FFF; + background-color: #3b4f5a; +} diff --git a/naucse/templates/index.html b/naucse/templates/index.html index 90a6455e36..82ee368661 100644 --- a/naucse/templates/index.html +++ b/naucse/templates/index.html @@ -50,11 +50,11 @@

Nauč se Python!

-
    +
    {% for stat_label in stat_labels.entries %} -
  • {{ stat_label|fill_label }}
  • + {{ stat_label|fill_label }} {% endfor %} -
+