diff --git a/README.md b/README.md index 12d2bbca8..b1117729b 100644 --- a/README.md +++ b/README.md @@ -148,9 +148,15 @@ Mémo pour développeurs: séquence re-création d'une base: flask import-scodoc7-users flask import-scodoc7-dept STID SCOSTID +Si la base utilisée pour les dev n'est plus en phase avec les scripts de +migration, utiliser les commandes `flask db history`et `flask db stamp`pour se +positionner à la bonne étape. + # Paquet debian 11 -Les scripts associés au paquet Debian (.deb) sont dans `tools/debian`. +Les scripts associés au paquet Debian (.deb) sont dans `tools/debian`. Le plus +important est `postinst`qui se charge de configurer le système (install ou +upgrade de scodoc9). La préparation d'une release se fait à l'aide du script `tools/build_release.sh`. diff --git a/app/__init__.py b/app/__init__.py index a913f57ec..33fbd23a5 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -32,7 +32,7 @@ db = SQLAlchemy() migrate = Migrate(compare_type=True) login = LoginManager() login.login_view = "auth.login" -login.login_message = "Please log in to access this page." +login.login_message = "Identifiez-vous pour accéder à cette page." mail = Mail() bootstrap = Bootstrap() moment = Moment() @@ -353,4 +353,4 @@ from app.scodoc import sco_cache # click.echo( # "Warning: user database not initialized !\n (use: flask user-db-init)" # ) -# admin = None \ No newline at end of file +# admin = None diff --git a/app/auth/forms.py b/app/auth/forms.py index e37478177..143f65546 100644 --- a/app/auth/forms.py +++ b/app/auth/forms.py @@ -16,20 +16,20 @@ _l = _ class LoginForm(FlaskForm): - user_name = StringField(_l("Username"), validators=[DataRequired()]) - password = PasswordField(_l("Password"), validators=[DataRequired()]) - remember_me = BooleanField(_l("Remember Me")) - submit = SubmitField(_l("Sign In")) + user_name = StringField(_l("Nom d'utilisateur"), validators=[DataRequired()]) + password = PasswordField(_l("Mot de passe"), validators=[DataRequired()]) + remember_me = BooleanField(_l("mémoriser la connexion")) + submit = SubmitField(_l("Suivant")) class UserCreationForm(FlaskForm): - user_name = StringField(_l("Username"), validators=[DataRequired()]) + user_name = StringField(_l("Nom d'utilisateur"), validators=[DataRequired()]) email = StringField(_l("Email"), validators=[DataRequired(), Email()]) - password = PasswordField(_l("Password"), validators=[DataRequired()]) + password = PasswordField(_l("Mot de passe"), validators=[DataRequired()]) password2 = PasswordField( - _l("Repeat Password"), validators=[DataRequired(), EqualTo("password")] + _l("Répéter"), validators=[DataRequired(), EqualTo("password")] ) - submit = SubmitField(_l("Register")) + submit = SubmitField(_l("Inscrire")) def validate_user_name(self, user_name): user = User.query.filter_by(user_name=user_name.data).first() @@ -48,9 +48,9 @@ class ResetPasswordRequestForm(FlaskForm): class ResetPasswordForm(FlaskForm): - password = PasswordField(_l("Password"), validators=[DataRequired()]) + password = PasswordField(_l("Mot de passe"), validators=[DataRequired()]) password2 = PasswordField( - _l("Repeat Password"), validators=[DataRequired(), EqualTo("password")] + _l("Répéter"), validators=[DataRequired(), EqualTo("password")] ) submit = SubmitField(_l("Request Password Reset")) diff --git a/app/auth/routes.py b/app/auth/routes.py index 7b1712f00..b4d107c2a 100644 --- a/app/auth/routes.py +++ b/app/auth/routes.py @@ -38,7 +38,7 @@ def login(): user = User.query.filter_by(user_name=form.user_name.data).first() if user is None or not user.check_password(form.password.data): current_app.logger.info("login: invalid (%s)", form.user_name.data) - flash(_("Invalid user name or password")) + flash(_("Nom ou mot de passe invalide")) return redirect(url_for("auth.login")) login_user(user, remember=form.remember_me.data) current_app.logger.info("login: success (%s)", form.user_name.data) @@ -95,7 +95,7 @@ def reset_password_request(): current_app.logger.info( "reset_password_request: for unkown user '{}'".format(form.email.data) ) - flash(_("Check your email for the instructions to reset your password")) + flash(_("Voir les instructions enoyez par mail")) return redirect(url_for("auth.login")) return render_template( "auth/reset_password_request.html", title=_("Reset Password"), form=form diff --git a/app/scodoc/html_sidebar.py b/app/scodoc/html_sidebar.py index 5ec2ae26b..dc0b12959 100644 --- a/app/scodoc/html_sidebar.py +++ b/app/scodoc/html_sidebar.py @@ -152,10 +152,10 @@ def sidebar(): # Logo H.append( f"""
- -
diff --git a/app/scodoc/sco_users.py b/app/scodoc/sco_users.py index f7eee6731..53437cbe7 100644 --- a/app/scodoc/sco_users.py +++ b/app/scodoc/sco_users.py @@ -258,6 +258,7 @@ def user_info(user_name_or_id=None, user=None): info = u.to_dict() else: info = None + user_name = "inconnu" else: info = user.to_dict() user_name = user.user_name diff --git a/app/static/css/scodoc.css b/app/static/css/scodoc.css index 47019d941..ef9df0da5 100644 --- a/app/static/css/scodoc.css +++ b/app/static/css/scodoc.css @@ -2614,7 +2614,8 @@ div.maindiv { margin: 1em; } ul.main { - list-style-type: square; + list-style-type: square; + margin-top: 1em; } ul.main li { diff --git a/app/templates/about.html b/app/templates/about.html new file mode 100644 index 000000000..2dc506915 --- /dev/null +++ b/app/templates/about.html @@ -0,0 +1,25 @@ +{% extends 'base.html' %} +{% import 'bootstrap/wtf.html' as wtf %} + +{% block app_content %} + +

Système de gestion scolarité

+ +

© Emmanuel Viennet 2021

+ +

Version {{ version }}

+ +

ScoDoc est un logiciel libre écrit en +Python. +Information et documentation sur scodoc.org. +

+ +

Dernières évolutions

+ +{{ news|safe }} + + + +{% endblock %} \ No newline at end of file diff --git a/app/templates/auth/login.html b/app/templates/auth/login.html index 6b775b738..2685383db 100644 --- a/app/templates/auth/login.html +++ b/app/templates/auth/login.html @@ -2,14 +2,19 @@ {% import 'bootstrap/wtf.html' as wtf %} {% block app_content %} -

Sign In

+

Connexion

{{ wtf.quick_form(form) }}

-Forgot Your Password? -Click to Reset It +En cas d'oubli de votre mot de passe +cliquez ici pour le réinitialiser.

+ + +

L'accès à ScoDoc est strictement réservé aux personnels de + l'établissement. Les étudiants n'y ont pas accès. Pour toute information, + contactez la personne responsable de votre établissement.

{% endblock %} \ No newline at end of file diff --git a/app/templates/scodoc.html b/app/templates/scodoc.html index f48ad0f46..c0e1eddda 100644 --- a/app/templates/scodoc.html +++ b/app/templates/scodoc.html @@ -2,7 +2,7 @@ {% import 'bootstrap/wtf.html' as wtf %} {% block app_content %} -

ScoDoc: gestion scolarité (version béta)

+

ScoDoc 9 - suivi scolarité

{% if not current_user.is_anonymous %}

Bonjour {{current_user.get_nomcomplet()}} @@ -24,10 +24,6 @@ {% endfor %} -

- Ceci est une version de test, - ne pas utiliser en production ! -

{% if current_user.is_authenticated %}
@@ -43,4 +39,9 @@

Charger la version mobile (expérimentale)

--> +
+ Service réservé aux personnels et enseignants, basé sur le logiciel libre + ScoDoc. +
+ {% endblock %} \ No newline at end of file diff --git a/app/views/scodoc.py b/app/views/scodoc.py index 88aa7a1e7..1a7e8537f 100644 --- a/app/views/scodoc.py +++ b/app/views/scodoc.py @@ -131,6 +131,18 @@ def get_etud_dept(): return Departement.query.get(last_etud.dept_id).acronym +@bp.route("/ScoDoc/about") +@bp.route("/ScoDoc/Scolarite//about") +def about(scodoc_dept=None): + "version info" + return render_template( + "about.html", + version=scu.get_scodoc_version(), + news=sco_version.SCONEWS, + logo=scu.icontag("borgne_img"), + ) + + # ---- CONFIGURATION diff --git a/app/views/scolar.py b/app/views/scolar.py index f05b77482..6b7d6a4f7 100644 --- a/app/views/scolar.py +++ b/app/views/scolar.py @@ -131,34 +131,6 @@ def sco_publish(route, function, permission, methods=["GET"]): # -------------------------------------------------------------------- -@bp.route("/about") -@scodoc -@permission_required(Permission.ScoView) -@scodoc7func -def about(): - "version info" - H = [ - """

Système de gestion scolarité

-

© Emmanuel Viennet 1997-2021

-

Version %s

- """ - % (scu.get_scodoc_version()) - ] - H.append( - '

Logiciel libre écrit en Python.

' - ) - H.append("

Dernières évolutions

" + sco_version.SCONEWS) - H.append( - '" - ) - d = "" - return ( - html_sco_header.sco_header() + "\n".join(H) + d + html_sco_header.sco_footer() - ) - - # -------------------------------------------------------------------- # # PREFERENCES @@ -311,15 +283,6 @@ def showEtudLog(etudid, format="html", REQUEST=None): # ---------- PAGE ACCUEIL (listes) -------------- -# @bp.route("/") -@bp.route("/kimo") -@scodoc -@permission_required(Permission.ScoView) -@scodoc7func -def kimo(REQUEST=None, showcodes=0, showsemtable=0): - import time - - return f"{time.time()} := {g.scodoc_dept}" @bp.route("/") diff --git a/sco_version.py b/sco_version.py index 412da12c0..23f90d601 100644 --- a/sco_version.py +++ b/sco_version.py @@ -1,14 +1,14 @@ # -*- mode: python -*- # -*- coding: utf-8 -*- -SCOVERSION = "9.0.13" +SCOVERSION = "9.0.14" SCONAME = "ScoDoc" SCONEWS = """

Année 2021

    -
  • ScoDoc 9: nouvelle architecture logicielle
  • +
  • ScoDoc 9: nouvelle architecture logicielle (Flask/Python3/Debian 11)
  • Version mobile (en test)
  • Évaluations de type "deuxième session"
  • Gestion du genre neutre (pas d'affichage de la civilité)
  • diff --git a/tools/import_scodoc7_dept.py b/tools/import_scodoc7_dept.py index a2fe08ae1..2178e2852 100644 --- a/tools/import_scodoc7_dept.py +++ b/tools/import_scodoc7_dept.py @@ -380,6 +380,7 @@ def convert_object( "absences", "absences_notifications", "itemsuivi", # etudid n'était pas une clé + "adresse", # etudid n'était pas une clé }: # tables avec "fausses" clés # (l'object référencé a pu disparaitre)