Browse Source

Add user management commands

sh4nks 8 years ago
parent
commit
43c861931d
3 changed files with 80 additions and 9 deletions
  1. 38 6
      flaskbb/cli/commands.py
  2. 8 0
      flaskbb/user/models.py
  3. 34 3
      flaskbb/utils/populate.py

+ 38 - 6
flaskbb/cli/commands.py

@@ -35,9 +35,11 @@ from flask_themes2 import get_themes_list, get_theme
 from flaskbb import create_app
 from flaskbb._compat import iteritems
 from flaskbb.extensions import db, whooshee, plugin_manager
+from flaskbb.user.models import User
 from flaskbb.utils.settings import flaskbb_config
 from flaskbb.utils.populate import (create_test_data, create_welcome_forum,
-                                    create_user, create_default_groups,
+                                    create_user, update_user,
+                                    create_default_groups,
                                     create_default_settings, insert_bulk_data,
                                     update_settings_from_fixture)
 from flaskbb.utils.translations import (add_translations, compile_translations,
@@ -490,15 +492,45 @@ def new_user(username, email, password, group):
 
 
 @users.command("update")
-def update_user():
-    """Updates an user."""
-    pass
+@click.option("--username", prompt=True,
+              help="The username of the user.")
+@click.option("--email", prompt=True, type=EmailType(),
+              help="The new email address of the user.")
+@click.option("--password", prompt=True, hide_input=True,
+              confirmation_prompt=True,
+              help="The new password of the user.")
+@click.option("--group", prompt=True, default="member",
+              help="The new primary group of the user",
+              type=click.Choice(["admin", "super_mod", "mod", "member"]))
+def change_user(username, password, email, group):
+    """Updates an user. Omit any options to use the interactive mode."""
+
+    user = update_user(username, password, email, group)
+    if user is None:
+        raise FlaskBBCLIError("The user with username {} does not exist."
+                              .format(username), fg="red")
+
+    click.secho("[+] User {} updated.".format(user.username), fg="cyan")
 
 
 @users.command("delete")
-def delete_user():
+@click.option("--username", prompt=True,
+              help="The username of the user.")
+@click.option("--force", "-f", default=False, is_flag=True,
+              help="Removes the user without asking for confirmation.")
+def delete_user(username, force):
     """Deletes an user."""
-    pass
+    user = User.query.filter_by(username=username).first()
+    if user is None:
+        raise FlaskBBCLIError("The user with username {} does not exist."
+                              .format(username), fg="red")
+
+    if not force and not \
+            click.confirm(click.style("Are you sure?", fg="magenta")):
+        sys.exit(0)
+
+    user.delete()
+    click.secho("[+] User {} deleted.".format(user.username), fg="cyan")
 
 
 @main.command()

+ 8 - 0
flaskbb/user/models.py

@@ -71,6 +71,14 @@ class Group(db.Model, CRUDMixin):
     def get_guest_group(cls):
         return cls.query.filter(cls.guest == True).first()
 
+    @classmethod
+    def get_member_group(cls):
+        """Returns the first member group."""
+        # This feels ugly..
+        return cls.query.filter(cls.admin == False, cls.super_mod == False,
+                                cls.mod == False, cls.guest == False,
+                                cls.banned == False).first()
+
 
 class User(db.Model, UserMixin, CRUDMixin):
     __tablename__ = "users"

+ 34 - 3
flaskbb/utils/populate.py

@@ -157,19 +157,50 @@ def create_default_groups():
 
 
 def create_user(username, password, email, groupname):
-    """Creates the administrator user.
-    Returns the created admin user.
+    """Creates a user.
+    Returns the created user.
 
     :param username: The username of the user.
     :param password: The password of the user.
     :param email: The email address of the user.
+    :param groupname: The name of the group to which the user
+                      should belong to.
     """
-    group = Group.query.filter(getattr(Group, groupname) == True).first()
+    if groupname == "member":
+        group = Group.get_member_group()
+    else:
+        group = Group.query.filter(getattr(Group, groupname) == True).first()
+
     user = User.create(username=username, password=password, email=email,
                        primary_group_id=group.id, activated=True)
     return user
 
 
+def update_user(username, password, email, groupname):
+    """Update an existing user.
+    Returns the updated user.
+
+    :param username: The username of the user.
+    :param password: The password of the user.
+    :param email: The email address of the user.
+    :param groupname: The name of the group to which the user
+                      should belong to.
+    """
+    user = User.query.filter_by(username=username).first()
+    if user is None:
+        return None
+
+    if groupname == "member":
+        group = Group.get_member_group()
+    else:
+        group = Group.query.filter(getattr(Group, groupname) == True).first()
+
+    user.password = password
+    user.email = email
+    user.primary_group_id = group.id
+    return user.save()
+
+
 def create_welcome_forum():
     """This will create the `welcome forum` with a welcome topic.
     Returns True if it's created successfully.