Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

💻 Proposal for navigating through subdomains, and communities #5814

Closed
wants to merge 7 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
71 changes: 58 additions & 13 deletions app.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
import base64
import binascii
import collections
from glob import glob
import logging
import datetime
import os
Expand Down Expand Up @@ -83,6 +84,26 @@
# Most files should be loaded through the CDN which has its own caching period and invalidation.
# Use 5 minutes as a reasonable default for all files we load elsewise.
app.config['SEND_FILE_MAX_AGE_DEFAULT'] = datetime.timedelta(minutes=5)
app.config["SERVER_NAME"] = "localhost:8080"

for rule in app.url_map.iter_rules('static'):
app.url_map._rules.remove(rule)
app.url_map._rules_by_endpoint['static'] = []
app.view_functions["static"] = None
app.static_folder = 'static'
app.add_url_rule('/<path:filename>',
endpoint='static',
subdomain="<language>",
view_func=app.send_static_file)

# optional. If not set, the above view_func will be passed <tenant> as a parameter.


@app.url_value_preprocessor
def before_route(endpoint, values):
if values is not None and endpoint == 'static':
values.pop('language', None)
setup_language(language=values.get('language', None))


def get_locale():
Expand Down Expand Up @@ -396,13 +417,20 @@ def before_request_https():


@app.before_request
def setup_language():
def setup_language(language=None):
# Determine the user's requested language code.
#
# If not in the request parameters, use the browser's accept-languages
# header to do language negotiation. Can be changed in the session by
# POSTing to `/change_language`, and be overwritten by remember_current_user().
if lang_from_request := request.args.get('language', None):
print(language)
if language:
session['lang'] = language
elif (lang_from_subdomain := request.url_rule.subdomain) and lang_from_subdomain != '<language>':
if lang_from_subdomain == 'zh_hans':
lang_from_subdomain = 'zh_Hans'
session['lang'] = lang_from_subdomain
elif lang_from_request := request.args.get('language', None):
session['lang'] = lang_from_request
if 'lang' not in session:
session['lang'] = request.accept_languages.best_match(
Expand Down Expand Up @@ -1326,13 +1354,13 @@ def hour_of_code(level, program_id=None):
# routing to index.html


@app.route('/ontrack', methods=['GET'], defaults={'level': '1', 'program_id': None})
@app.route('/onlinemasters', methods=['GET'], defaults={'level': '1', 'program_id': None})
@app.route('/onlinemasters/<int:level>', methods=['GET'], defaults={'program_id': None})
@app.route('/hedy', methods=['GET'], defaults={'program_id': None, 'level': '1'})
@app.route('/hedy/<int:level>', methods=['GET'], defaults={'program_id': None})
@app.route('/hedy/<int:level>/<program_id>', methods=['GET'])
def index(level, program_id):
@app.route('/ontrack', methods=['GET'], defaults={'level': '1', 'program_id': None}, subdomain="<language>")
@app.route('/onlinemasters', methods=['GET'], defaults={'level': '1', 'program_id': None}, subdomain="<language>")
@app.route('/onlinemasters/<int:level>', methods=['GET'], defaults={'program_id': None}, subdomain="<language>")
@app.route('/hedy', methods=['GET'], defaults={'program_id': None, 'level': '1'}, subdomain="<language>")
@app.route('/hedy/<int:level>', methods=['GET'], defaults={'program_id': None}, subdomain="<language>")
@app.route('/hedy/<int:level>/<program_id>', methods=['GET'], subdomain="<language>")
def index(level, program_id, language='en'):
try:
level = int(level)
if level < 1 or level > hedy.HEDY_MAX_LEVEL:
Expand Down Expand Up @@ -1554,8 +1582,8 @@ def index(level, program_id):
))


@app.route('/hedy', methods=['GET'])
def index_level():
@app.route('/hedy', subdomain="<language>", methods=['GET'])
def index_level(language):
if current_user()['username']:
highest_quiz = get_highest_quiz_level(current_user()['username'])
# This function returns the character '-' in case there are no finished quizes
Expand All @@ -1565,9 +1593,14 @@ def index_level():
level_rendered = hedy.HEDY_MAX_LEVEL
else:
level_rendered = highest_quiz + 1
return index(level_rendered, None)
return index(level_rendered, None, language)
else:
return index(1, None)
return index(1, None, language)


@app.route('/hedy', methods=['GET'])
def index_test():
return index_level('en')


@app.route('/hedy/<id>/view', methods=['GET'])
Expand Down Expand Up @@ -2558,6 +2591,18 @@ def public_user_page(username):
return utils.error_page(error=404, ui_message=gettext('user_not_private'))


@app.route('/community', subdomain="zh_hans", methods=['GET'])
@app.route('/community/<section>', subdomain="zh_hans", methods=['GET'])
def chinese_community(section='index'):
files = glob('templates/communities/zh_hans/*.html')
article_names = [os.path.basename(file).replace('.html', '') for file in files]
return render_template(
f'communities/zh_hans/{section}.html',
article_names=article_names,
section=section
)


def valid_invite_code(code):
if not code:
return False
Expand Down
17 changes: 17 additions & 0 deletions templates/communities/community-template.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{% extends "auth.html" %}
{% block regular_content %}
<div class="flex flex-row gap-8 min-w-screen min-h-screen">
{# This is where the index will be #}
<div class="flex flex-col p-6 bg-gray-200 w-1/3">
{% for name in article_names %}
<div class="flex flex-row">
<div class="w-4">
{% if name == section %}<i class="fa-solid fa-caret-right text-blue-800"></i>{% endif %}
</div>
<a class="no-underline text-blue-800" href="/community/{{ name }}">{% if name == 'index' %} {{_('nav_start')}} {% else %} {{ name }} {% endif %}</a>
</div>
{% endfor %}
</div>
{% block community_content %}{% endblock %}
</div>
{% endblock %}
75 changes: 75 additions & 0 deletions templates/communities/zh_hans/article1.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
{% extends "communities/community-template.html" %}
{% block community_content %}
<article>
<h3>前宣-对家长-推文三</h3>
<p>我: 30岁,职场女性,孩子正在上五年级...
前两天我接五年级的儿子放学回家,一路上被青少年教育类产品的各种销售围追堵截。这些青少年教育类产品五花八门,有拉丁舞、书法、英语新概念、奥数、口才,我已经对这些兴趣班或者辅导班司空见惯,但”机器人实践营“、”编程语言学习课“这些编程类课程令我耳目一新,我意识到——我现在正处在一个人工智能快速发展的时代,也处在一个人人学编程的时代。</p>
<p>我的脑子里浮现出两个问题:
孩子是否有必要学习编程?
以及应该如何学习编程?</p>
<p>我认为十分有必要去找到这两个问题的正确答案,因为第一个问题关系到孩子的未来发展,第二个问题关系到他的学习体验和效果。
于是,我停下脚步,耐心听销售讲解,同时也自主展开对这两个问题的探索。
青少年是否有必要学习编程?</p>
<ul>
<li>为升学做准备;
编程陆续被各省分纳入中高考自主招生政策,成为中高考升学加分的途径之一。
浙江省已在高考中加入以Pyhon为考察对象的信息技术考试,成为高考科目之一,与化学与生物同等占有100分的比例,分别在今年和去年开展了考试。浙江率先将编程纳入高考范围,北京、山东、广东等省份也将紧随其后。</li>
</ul>
<p>除此之外,孩子可以通过学习编程打竞赛在小升初、初升高两个阶段走科技特长生的路径,走综合评价生、强基计划、保送政策这三种路径在高升大时获取升学机会。</p>
<ul>
<li>作为一种兴趣爱好,培养编程思维;
编程其实就是将自己的想法,变成一个逻辑条理清晰、可以照此执行的代码的过程。换一种方式说,它是个“解决问题-找出路径-得出结果的过程,这中间包含了拆分问题、关键聚焦、归纳规律的环节。
而少儿编程类产品用游戏的方式应用于生活,让孩子更容易理解和适应,可以提高他们解决问题的能力,增强逻辑思维、创造力和意志力,同时助力理解科技产品原理,。</li>
<li>辅助未来就业;
随着科技的发展,编程技能在职场中的需求日益增加,它不仅是IT行业的专属技能,已经成为许多行业的基础能力,如金融、医疗、教育等。掌握编程,孩子将来就业的选择会更加广泛。</li>
</ul>
<p>应该如何学习编程?
我了解到现在市场上的青少年编程,分为三种:</p>
<ol>
<li>Scratch。
[图片]
适用于学龄前-小学低年级;
它是一种图形化编程语言和开发环境,它使用图块组成代码,让孩子们通过拖拽和拼接图块的方式创建程序。
它培养了学生的逻辑思维和动手能力,但对于掌握真正的编程语言帮助有限,那些学习了Scratch的学生在学习真正的编程语言时,仍然不知所措,需要从基础开始学习;</li>
<li>Python。
[图片]
适用于小学低年级-初中;
是一种通用、易于学会的文本编程语言,受到广泛使用。
如果以培养编程思维、掌握编程基础,那么比较适合学习Python。
Python是目前高考改革中的唯一官方编程语言,Python语言课程化将成为孩子们学习的一种趋势。</li>
<li>C++。
[图片]
适用于小学高年级-高中;
是一种通用的文本编程语言,相比Python,学习难度较高,更加抽象,适合有一定编程基础的孩子。
C++是信息技术奥林匹克竞赛的官方语言,掌握C++可参加信奥赛,助力升学加分。</li>
</ol>
<p>有一些学习编程语言(比如Python和C++)的机构研制的课程,但这些课程质量良莠不齐,有一些通病:</p>
<ul>
<li>对于青少年来说,编程语言抽象,入门困难,初学者需要合适的指引,但一些机构追求效果的呈现,至于孩子是否真正学懂并不可知;</li>
<li>只是对编程知识进行切分,把大的知识点切割成细小的知识点,但孩子并不能适应语言系统;
······</li>
</ul>
<p>儿子已经上小学五年级,即将面临升学的压力,课程繁重,并且兴趣班已经比较多,占据了大部分的课余时间,我不希望他在学习编程方面花费过多的时间和精力,因此我需要一个能够让他轻松高效学习的产品。
Scratch比较适合低龄的小学生,内容简单并且效果有限,不适合儿子入门编程。因为儿子没有编程基础,所以他作为初学者比较适合首先学习Python,但Python作为一门高级编程语言对于儿子来说入门比较困难。除此之外,我也挑选不到合适的课程。
我发现,想要让上小学五年级的儿子轻松有效掌握编程,放眼市场众多青少年教育类产品,却找不到合适的一款。</p>
<p>幸而,我偶然了解到Hedy(官网链接:Hedy.org),它是一个专注于青少年编程教育的平台,已经在欧洲多个国家广泛应用并收获一致好评。在中国,Hedy在上海的一所国际学校进行了为期一学期的试点项目,它能够满足不同学习者的需求,其课程内容和教学方法通过了实践的检验。
[图片]
进入官网,即可看到首页第一句话——一种渐进式的编程语言。这是Hedy的一个显著特点。</p>
<p>Hedy先引入基础概念和最简语法,逐步深入到复杂内容,通过18个level层层递进,让学习者在掌握编程技能的同时减轻学习负担。
它像游戏闯关一样玩编程,让孩子在玩中渐进入门Python。每个level都设有一些相关的游戏挑战,这些游戏挑战涵盖了从基础的命令操作到复杂的项目制作等多个方面。孩子可以根据自己的学习进度选择适合游戏挑战,如果出错,hedy会一步步的引导直至完全掌握。
[图片]
真正触动我的是,对于青少年学习者来说,它是Python与Scratch之间的桥梁。它充分融合了图形化编程(Scratch)和文本编程(Python)的优势,为青少年编程学习者提供了更加灵活和全面的学习平台。它简化了从图形化编程到文本编程的过渡过程,能够有效激发学习者的编程兴趣和创造力。</p>
<p>其次,Hedy为教学而生。Hedy现在base在华东师范大学信息工程学院下,已经与成都电子科大、上海国际学校建立了合作关系,共同开发课程内容,提供师资培训,以及举办编程竞赛和活动。</p>
<p>它是多语言的。这意味着,孩子可以用自己熟悉的语言进行编程,可以在语言栏里选择中文(简体)。Python入门难,因为它只有英文版本,并且要求学习者立即学习复杂的编程概念和语法。
[图片]
Hedy 可以免费使用,并且有免费的飞书社区。Hedy的社区正在不断壮大,其鼓励学习者、教育者和开发者在平台上分享经验、交流想法,共同推动编程教育的发展。
Hedy 是入门文本编程语言的最佳选择!
[图片]
现在儿子已经学习了一个月,完成了hedy前3个level的学习,已经初步掌握编程的基础知识,如变量、列表等,并且能够简单的设计一些小游戏,如石头剪刀布等。而且每次学习都很积极主动,学习过程中也能看得出他很享受,体验感很强。
相信可能很多家长和我有相似的困扰,故将hedy分享给你们,我认为这是一个好的产品。</p>
<p>Hedy的社区运营者创建了七天学习营,旨在引导和帮助初学者熟悉Hedy,正确使用Hedy进行学习。这是一场免费的学习辅导,如果想要了解Hedy,入门编程,掌握编程思维,欢迎联系!
(此处放海报
(联系方式:微信二维码</p>

</article>
{% endblock %}
40 changes: 40 additions & 0 deletions templates/communities/zh_hans/article2.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
{% extends "communities/community-template.html" %}
{% block community_content %}
<article>
<h3>前宣-对家长-推文四</h3>
<p>Hedy
大多数家长可能都有这样的经历:在接送孩子上下学,一路上被青少年教育类产品的各种销售围追堵截。</p>
<p>这些产品五花八门,有拉丁舞、书法、英语新概念、奥数、口才,家长们对这些兴趣班或者辅导班司空见惯。</p>
<p>如果有留意到”机器人实践营“、”编程语言学习课“这些编程类课程,可能会令人耳目一新,但其实少儿编程这个话题变得越来越火热了,大部分人都意识到了这是一个大趋势。
从小就要学编程没错,但作为家长,很多人还对少儿编程没有一个正确的认识,它是区别于成人编程,更注重在学习中培养孩子解决问题的思维。</p>
<p>再加上市面上的编程课越来越多,有些家长就变得更迷茫了。</p>
<p>不仅如此,很多家长都会有这些疑惑:</p>
<p>为什么现在都说要学编程呢?一定要现在学吗?</p>
<p>更让家长担心的是:不少人都在说少儿编程是智商税?
确实,市面上涌现了非常多编程机构,家长们为了孩子花好几万却一直不见成果,孩子还是一直在玩积木,但是少儿编程真是如此吗?
01「我们学习少儿编程的目的是什么?」
少儿编程一定是未来发展大趋。
人工智能时代下,未来的要求一定是利用AI,掌握AI,小阶段做编程启蒙,进阶走科特赛道、参加信奥赛,能让孩子在未来学业、工作中有更多的选择。
我国教育方针也是大力支持,编程陆续被各省分纳入中高考自主招生政策,成为中高考升学加分的途径之一。</p>
<p>浙江省已在高考中加入以Pyhon为考察对象的信息技术考试,成为高考科目之一,与化学与生物同等占有100分的比例,分别在今年和去年开展了考试。</p>
<p>浙江率先将编程纳入高考范围,北京、山东、广东等省份也将紧随其后。</p>
<p>除此之外,孩子可以通过学习编程打竞赛在小升初、初升高两个阶段走科技特长生的路径,走综合评价生、强基计划、保送政策这三种路径在高升大时获取升学机会。
也就是说这是和孩子升学相挂钩的
02「要怎么学编程呢?」
好在,Hedy,这一渐进式开发语言学习平台出现了。
它是一个专注于青少年编程教育的平台,已经在欧洲多个国家广泛应用并收获一致好评。
在中国,Hedy在上海的一所国际学校进行了为期一学期的试点项目,它能够满足不同学习者的需求,其课程内容和教学方法通过了实践的检验。
03「Hedy是什么?」
简单来说,让孩子像玩游戏闯关一样,Hedy分为18个level,层层递进,每个level都设有一些对应的小挑战,可以根据自己的学习进度选择适合的,让孩子在掌握编程技能的同时减轻学习负担。
我们考虑到孩子现阶段的特点,用有趣的图画配有轻松易读的文字,照顾孩子们的情绪,让整个学习过程变得轻松有趣,还可以激发他们与生俱来的好奇心,培养创造力。</p>
<p>Hedy从简单的概念开始,逐渐过渡到更复杂的内容,让孩子逐步建立编程知识体系。</p>
<p>从多个维度逐步引导孩子学习编程,不仅让孩子像玩游戏一样快乐学习,可以使用自己熟悉的语言轻松学习,更重要的是知识吸收上循序渐进。
Hedy还提供了多种语言,可以用熟悉的汉语,如果孩子正在学习英语,也可以很方便地切换为英文学习。
Hedy现在base在华东师范大学信息工程学院下,已经与成都电子科大、上海国际学校建立了合作关系,共同开发课程内容,提供师资培训,以及举办编程竞赛和活动。
我们正在创建七天学习营,旨在引导和帮助初学者熟悉Hedy,正确使用Hedy进行学习。这是一场免费的学习辅导,如果想要了解Hedy,入门编程,掌握编程思维,欢迎联系!
(联系方式:微信二维码
球分享
球点赞
球在看</p>
</article>
{% endblock %}
Loading
Loading