diff --git a/preferences/migrations/0030_merge_20180319_0149.py b/preferences/migrations/0030_merge_20180319_0149.py new file mode 100644 index 00000000..7330e73a --- /dev/null +++ b/preferences/migrations/0030_merge_20180319_0149.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.7 on 2018-03-19 00:49 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('preferences', '0029_auto_20180318_1005'), + ('preferences', '0029_auto_20180318_0213'), + ] + + operations = [ + ] diff --git a/preferences/models.py b/preferences/models.py index 8678289f..80c3271e 100644 --- a/preferences/models.py +++ b/preferences/models.py @@ -375,7 +375,7 @@ class GeneralOption(PreferencesModel): pagination_large_number = models.IntegerField(default=8) req_expire_hrs = models.IntegerField(default=48) site_name = models.CharField(max_length=32, default="Re2o") - email_from = models.EmailField(default="www-data@serveur.net") + email_from = models.EmailField(default="www-data@example.com") GTU_sum_up = models.TextField( default="", blank=True, diff --git a/users/management/commands/chsh.py b/users/management/commands/chsh.py new file mode 100755 index 00000000..bcfec3a8 --- /dev/null +++ b/users/management/commands/chsh.py @@ -0,0 +1,77 @@ +# ⁻*- mode: python; coding: utf-8 -*- +# Re2o est un logiciel d'administration développé initiallement au rezometz. Il +# se veut agnostique au réseau considéré, de manière à être installable en +# quelques clics. +# +# Copyright © 2018 Jean-Baptiste Daval +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +import os, sys, pwd + +from django.core.management.base import BaseCommand, CommandError +from django.db import transaction +from reversion import revisions as reversion + +from users.models import User, ListShell + +class Command(BaseCommand): + help = 'Change the default shell of a user' + + def add_arguments(self, parser): + parser.add_argument('target_username', nargs='?') + + def handle(self, *args, **options): + + def get_user(user_pseudo): + """Return the user queried by pseudo, and exit the script if not found.""" + user = User.objects.filter(pseudo=user_pseudo) + if not user: + raise CommandError("Utilisateur invalide") + return user[0] + + current_username = pwd.getpwuid(int(os.getenv("SUDO_UID") or os.getuid())).pw_name + current_user = get_user(current_username) + + target_username = options["target_username"] or current_username + target_user = get_user(target_username) + + #L'utilisateur n'a pas le droit de changer le shell + ok, msg = target_user.can_change_shell(current_user) + if not ok: + raise CommandError(msg) + + shells = ListShell.objects.all() + self.stdout.write("Choisissez un shell pour l'utilisateur %s :" % target_user.pseudo) + for shell in shells: + self.stdout.write("%d - %s (%s)" % (shell.id, shell.get_pretty_name(), shell.shell)) + shell_id = input("Entrez un nombre : ") + + try: + shell_id = int(shell_id) + except: + raise CommandError("Choix invalide") + + shell = ListShell.objects.filter(id=shell_id) + if not shell: + raise CommandError("Choix invalide") + + target_user.shell = shell.first() + with transaction.atomic(), reversion.create_revision(): + target_user.save() + reversion.set_user(current_user) + reversion.set_comment("Shell modifié") + + self.stdout.write(self.style.SUCCESS("Shell modifié. La modification peut prendre quelques minutes pour s'appliquer.")) diff --git a/users/models.py b/users/models.py index da6adcfb..ed62edbb 100644 --- a/users/models.py +++ b/users/models.py @@ -1248,6 +1248,10 @@ class ListShell(models.Model): shell = models.CharField(max_length=255, unique=True) + def get_pretty_name(self): + """Return the canonical name of the shell""" + return self.shell.split("/")[-1] + def __str__(self): return self.shell diff --git a/users/templates/users/profil.html b/users/templates/users/profil.html index 9856e319..731ba560 100644 --- a/users/templates/users/profil.html +++ b/users/templates/users/profil.html @@ -168,16 +168,16 @@ non adhérent{% endif %} et votre connexion est {% if users.has_access %}