diff --git a/deploy/db_setup.py b/deploy/db_setup.py
index 04f424ad8..717d62eef 100644
--- a/deploy/db_setup.py
+++ b/deploy/db_setup.py
@@ -42,9 +42,10 @@ def try_mongodb_opts(host="localhost", database_name='INGInious'):
database = try_mongodb_opts('db')
database.users.insert_one({"username": username,
- "realname": realname,
- "email": email,
- "password": UserManager.hash_password(password),
- "bindings": {},
- "language": "en"})
+ "realname": realname,
+ "email": email,
+ "password": UserManager.hash_password(password),
+ "bindings": {},
+ "language": "en",
+ "code_indentation": "4"})
print('Superadmin user added!')
diff --git a/inginious/frontend/app.py b/inginious/frontend/app.py
index 7418f6f2f..433363125 100644
--- a/inginious/frontend/app.py
+++ b/inginious/frontend/app.py
@@ -176,6 +176,14 @@ def get_app(config):
available_languages = {"en": "English"}
available_languages.update(available_translations)
+ # available indentation types
+ available_indentation_types = {
+ "2": {"text": "2 spaces", "indent": 2, "indentWithTabs": False},
+ "3": {"text": "3 spaces", "indent": 3, "indentWithTabs": False},
+ "4": {"text": "4 spaces", "indent": 4, "indentWithTabs": False},
+ "tabs": {"text": "tabs", "indent": 4, "indentWithTabs": True},
+ }
+
l10n_manager = L10nManager()
l10n_manager.translations["en"] = gettext.NullTranslations() # English does not need translation ;-)
@@ -242,6 +250,7 @@ def get_app(config):
template_helper.add_to_template_globals("_", _)
template_helper.add_to_template_globals("str", str)
template_helper.add_to_template_globals("available_languages", available_languages)
+ template_helper.add_to_template_globals("available_indentation_types", available_indentation_types)
template_helper.add_to_template_globals("get_homepath", get_homepath)
template_helper.add_to_template_globals("pkg_version", __version__)
template_helper.add_to_template_globals("allow_registration", config.get("allow_registration", True))
@@ -302,6 +311,7 @@ def flask_internalerror(e):
flask_app.allow_registration = config.get("allow_registration", True)
flask_app.allow_deletion = config.get("allow_deletion", True)
flask_app.available_languages = available_languages
+ flask_app.available_indentation_types = available_indentation_types
flask_app.welcome_page = config.get("welcome_page", None)
flask_app.terms_page = config.get("terms_page", None)
flask_app.privacy_page = config.get("privacy_page", None)
diff --git a/inginious/frontend/installer.py b/inginious/frontend/installer.py
index e08bad756..98a9a0074 100644
--- a/inginious/frontend/installer.py
+++ b/inginious/frontend/installer.py
@@ -568,6 +568,7 @@ def configure_authentication(self, database):
"email": email,
"password": UserManager.hash_password(password),
"bindings": {},
+ "code_indentation": "4",
"language": "en"})
options["superadmins"].append(username)
diff --git a/inginious/frontend/pages/admin/admin.py b/inginious/frontend/pages/admin/admin.py
index 10a0bd025..b9537f5fa 100644
--- a/inginious/frontend/pages/admin/admin.py
+++ b/inginious/frontend/pages/admin/admin.py
@@ -64,7 +64,8 @@ def POST_AUTH(self, *args, **kwargs):
"email": email,
"password": password,
"bindings": {},
- "language": "en"})
+ "language": "en",
+ "code_indentation": "4"})
else:
feedback = _("Unknown action.")
if feedback:
diff --git a/inginious/frontend/pages/lti.py b/inginious/frontend/pages/lti.py
index 02d953ab6..332919dce 100644
--- a/inginious/frontend/pages/lti.py
+++ b/inginious/frontend/pages/lti.py
@@ -146,8 +146,7 @@ def GET(self):
user_profile = self.database.users.find_one({"ltibindings." + data["task"][0] + "." + data["consumer_key"]: data["username"]})
if user_profile:
- self.user_manager.connect_user(user_profile["username"], user_profile["realname"], user_profile["email"],
- user_profile["language"], user_profile.get("tos_accepted", False))
+ self.user_manager.connect_user(user_profile)
if self.user_manager.session_logged_in():
return redirect(self.app.get_homepath() + "/lti/task")
diff --git a/inginious/frontend/pages/preferences/profile.py b/inginious/frontend/pages/preferences/profile.py
index 316c53ae0..1f4cb1317 100644
--- a/inginious/frontend/pages/preferences/profile.py
+++ b/inginious/frontend/pages/preferences/profile.py
@@ -43,8 +43,9 @@ def save_profile(self, userdata, data):
msg = _("Incorrect email.")
return result, msg, error
else:
- self.user_manager.connect_user(result["username"], result["realname"], result["email"],
- result["language"], result.get("tos_accepted", False))
+ self.user_manager.set_session_username(data["username"])
+
+ profile_data_to_be_updated = {}
# Check if updating the password.
if self.app.allow_registration and len(data["passwd"]) in range(1, 6):
@@ -68,38 +69,44 @@ def save_profile(self, userdata, data):
return result, msg, error
else:
passwd_hash = UserManager.hash_password(data["passwd"])
- result = self.database.users.find_one_and_update({"username": self.user_manager.session_username()},
- {"$set": {"password": passwd_hash}},
- return_document=ReturnDocument.AFTER)
+ profile_data_to_be_updated["password"] = passwd_hash
# Check if updating language
- if data["language"] != userdata["language"]:
+ if data["language"] != userdata.get("language", "en"):
language = data["language"] if data["language"] in self.app.available_languages else "en"
- result = self.database.users.find_one_and_update({"username": self.user_manager.session_username()},
- {"$set": {"language": language}},
- return_document=ReturnDocument.AFTER)
- if not result:
+ profile_data_to_be_updated["language"] = language
+
+ # check if updating code indentation
+ if data["code_indentation"] != userdata.get("code_indentation", "4"):
+ code_indentation = data["code_indentation"] if data["code_indentation"] in self.app.available_indentation_types.keys() else "4"
+ profile_data_to_be_updated["code_indentation"] = code_indentation
+
+ # Checks if updating name
+ if data["realname"] != userdata.get("realname", ""):
+ if len(data["realname"]) > 0:
+ profile_data_to_be_updated["realname"] = data["realname"]
+ else:
error = True
- msg = _("Incorrect username.")
+ msg = _("Name is too short.")
return result, msg, error
- else:
- self.user_manager.set_session_language(language)
- # Checks if updating name
- if len(data["realname"]) > 0:
- result = self.database.users.find_one_and_update({"username": self.user_manager.session_username()},
- {"$set": {"realname": data["realname"]}},
- return_document=ReturnDocument.AFTER)
+ # updating profile in DB
+ if profile_data_to_be_updated:
+ self.database.users.find_one_and_update({"username": self.user_manager.session_username()},
+ {"$set": profile_data_to_be_updated},
+ return_document=ReturnDocument.AFTER)
if not result:
error = True
msg = _("Incorrect username.")
return result, msg, error
else:
- self.user_manager.set_session_realname(data["realname"])
- else:
- error = True
- msg = _("Name is too short.")
- return result, msg, error
+ # updating session
+ if "language" in profile_data_to_be_updated:
+ self.user_manager.set_session_language(profile_data_to_be_updated["language"])
+ if "code_indentation" in profile_data_to_be_updated:
+ self.user_manager.set_session_code_indentation(profile_data_to_be_updated["code_indentation"])
+ if "realname" in profile_data_to_be_updated:
+ self.user_manager.set_session_realname(profile_data_to_be_updated["realname"])
msg = _("Profile updated.")
diff --git a/inginious/frontend/pages/register.py b/inginious/frontend/pages/register.py
index e1189764b..7e2f751af 100644
--- a/inginious/frontend/pages/register.py
+++ b/inginious/frontend/pages/register.py
@@ -100,6 +100,7 @@ def register_user(self, data):
"activate": activate_hash,
"bindings": {},
"language": self.user_manager._session.get("language", "en"),
+ "code_indentation": "4",
"tos_accepted": True
})
try:
diff --git a/inginious/frontend/static/js/codemirror/mode/cobol/index.html b/inginious/frontend/static/js/codemirror/mode/cobol/index.html
index 4352419a0..5db06fbff 100644
--- a/inginious/frontend/static/js/codemirror/mode/cobol/index.html
+++ b/inginious/frontend/static/js/codemirror/mode/cobol/index.html
@@ -29,7 +29,6 @@
-