rosedu/wouso

View on GitHub
wouso/utils/user_util.py

Summary

Maintainability
F
4 days
Test Coverage
#!/usr/bin/env/python

# To test, run from parent folder using commands such as:
# PYTHONPATH=../:. python utils/user_util.py --list-users
# PYTHONPATH=../:. python utils/user_util.py --list-races
# PYTHONPATH=../:. python utils/user_util.py --show-user cristian.palianos
# PYTHONPATH=../:. python utils/user_util.py --show-race cn-unirea

import argparse
import sys
import os
import codecs

# Setup Django environment.
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "wouso.settings")

from django.contrib.auth.models import User
from wouso.core.user.models import Race
from wouso.core.user.models import Player

UTF8Writer = codecs.getwriter('utf8')
sys.stdout = UTF8Writer(sys.stdout)

def _print_user(user):
    """Print information about an user.
    """
    print "%s,%s,%s,%s,%s,%s,%s" %(user.username, user.first_name, \
            user.last_name, user.email, user.is_active, user.is_staff, \
            user.is_superuser)

def _print_player(player):
    """Print information about a player. Same as user but add race name.
    """
    user = player.user
    race_name = player.race.name if player.race else "None"
    race_title = player.race.title if player.race else "None"
    print "%s,%s,%s,%s,%s,%s,%s,%s,%s" %(user.username, user.first_name, \
            user.last_name, user.email, user.is_active, user.is_staff, \
            user.is_superuser, race_name, race_title)

def _print_race(race):
    """Print information about a race.
    """
    print "%s,%s,%s" %(race.name, race.title, race.can_play)

def list_users(race=None):
    """List users belonging to a particular race. In case race is missing,
    list all users."""
    players = Player.objects.all()
    if race:
        users = []
        for p in players:
            if p.race == None:
                continue
            if p.race.name == race:
                users.append(p.user)
    else:
        users = [p.user for p in players]
    for u in users:
        _print_user(u)

def list_players(race=None):
    """List players belonging to a particular race. In case race is missing,
    list all players. Add printing of race name."""
    _players = Player.objects.all()
    if race:
        players = []
        for p in _players:
            if p.race == None:
                continue
            if p.race.name == race:
                players.append(p)
    else:
        players = _players
    for p in players:
        _print_player(p)

def list_races(race=None):
    """List all races.
    """
    for r in Race.objects.all():
        _print_race(r)

def show_user(username):
    """Show information of user.
    """
    p = Player.objects.get(user__username=username)
    if not p:
        return
    _print_user(p.user)
    print "race: %s, %s" %(p.race.name, p.race.title)

def show_race(race_name):
    """Show information about race.
    """
    r = Race.objects.get(name=race_name)
    if not r:
        return
    _print_race(r)

def add_user(username, first_name, last_name, email, password, is_active=False, is_staff=False, is_superuser=False):
    """Add user and return user object. In case user with given username
    already exists, return None.
    """
    user, new = User.objects.get_or_create(username=username)
    if not new:
        return None

    user.first_name = first_name
    user.last_name = last_name
    user.email = email
    user.set_password(password)
    user.is_active = is_active
    user.is_staff = is_staff
    user.is_superuser = is_superuser
    user.save()
    return user

def remove_user(username):
    """Remove user by username. Return True if successful. Return False if user
    does not exist.
    """
    user = User.objects.get(username=username)
    if not user:
        return False

    user.delete()
    return True

def update_user(username, first_name=None, last_name=None, email=None, password=None, is_active=None, is_staff=None, is_superuser=None):
    """Update user by username. Return True if successful. Return False if user
    does not exist.
    """
    user = User.objects.get(username=username)
    if not user:
        return False

    if first_name != None:
        user.first_name = first_name
    if last_name != None:
        user.last_name = last_name
    if email != None:
        user.email = email
    if password != None:
        user.set_password(password)
    if is_active != None:
        user.is_active = is_active
    if is_staff != None:
        user.is_staff = is_staff
    if is_superuser != None:
        user.is_superuser = is_superuser
    user.save()
    return True

def change_password(username, password):
    """Change user password. Return True on success. Return False if user does
    not exist.
    """
    return update_user(username, password=password)

def add_race(name, title, can_play=False):
    """Add race and return race object. In case race already exists, return
    None.
    """
    race, new = Race.objects.get_or_create(name=name)
    if not new:
        return None

    race.title = title
    race.can_play = can_play
    race.save()
    return race

def remove_race(name):
    """Remove race by name. Return True if successful. Return False if race
    does not exist.
    """
    race = Race.objects.get(name=name)
    if not race:
        return False

    race.delete()
    return True

def update_race(name, title=None, can_play=None):
    """Update user by username. Return True if successful. Return False if user
    does not exist.
    """
    race = Race.objects.get(name=name)
    if not race:
        return False

    if title != None:
        race.title = title
    if can_play != None:
        race.can_play = can_play
    race.save()
    return True

def add_user_to_race(username, race_name):
    """Add user to race. Return True if successful. Return False if user or
    race does not exist."""
    player = Player.objects.get(user__username=username)
    if not player:
        return False
    race = Race.objects.get(name=race_name)
    if not race:
        return False

    player.race = race
    player.save()
    return True

def remove_user_from_race(username, race_name):
    """Remove user from race. Return True if successful. Return False if user
    or race does not exist. Race is actually non important. It will simply be
    set to None."""
    player = Player.objects.get(user__username=username)
    if not player:
        return False
    race = Race.objects.get(name=race_name)
    if not race:
        return False

    player.race = None
    player.save()
    return True


def main():
    """In main, parse command line arguments and call corresponding functions.
    """

    parser = argparse.ArgumentParser()
    parser.add_argument("--list-users", help="list users (in race)", const='###', nargs='?', metavar="RACE")
    parser.add_argument("--list-players", help="list players (in race)", const='###', nargs='?', metavar="RACE")
    parser.add_argument("--list-races", help="list races", action="store_true")
    parser.add_argument("--show-user", help="show summary info about user", metavar="USERNAME")
    parser.add_argument("--show-race", help="show summary info about race", metavar="RACE_NAME")
    parser.add_argument("--add-user", help="add user", nargs=8, metavar=("USERNAME", "FIRST_NAME", "LAST_NAME", "EMAIL", "PASSWORD", "IS_ACTIVE", "IS_STAFF", "IS_SUPERUSER"))
    parser.add_argument("--add-race", help="add race", nargs=3, metavar=("RACE_NAME", "RACE_TITLE", "CAN_PLAY"))
    parser.add_argument("--update-user", help="update user", nargs=7, metavar=("USERNAME", "FIRST_NAME", "LAST_NAME", "EMAIL", "IS_ACTIVE", "IS_STAFF", "IS_SUPERUSER"))
    parser.add_argument("--update-race", help="update race", nargs=3, metavar=("RACE_NAME", "RACE_TITLE", "CAN_PLAY"))
    parser.add_argument("--remove-user", help="remove user", metavar="USERNAME")
    parser.add_argument("--remove-race", help="remove race", metavar="RACE_NAME")
    parser.add_argument("--change-password", help="change user password", nargs=2, metavar=("USERNAME", "PASSWORD"))
    parser.add_argument("--add-user-to-race", help="add user to race", nargs=2, metavar=("USERNAME", "RACE_NAME"))
    parser.add_argument("--remove-user-from-race", help="remove user from race", nargs=2, metavar=("USERNAME", "RACE_NAME"))
    args = parser.parse_args()

    if args.list_users:
        race = args.list_users
        if args.list_users == '###':
            race = None
        list_users(race)

    if args.list_players:
        race = args.list_players
        if args.list_players == '###':
            race = None
        list_players(race)

    if args.list_races:
        list_races()

    if args.show_user:
        show_user(args.show_user)

    if args.show_race:
        show_race(args.show_race)

    if args.add_user:
        username = args.add_user[0]
        first_name = args.add_user[1]
        last_name = args.add_user[2]
        email = args.add_user[3]
        password = args.add_user[4]
        is_active = (True if args.add_user[5] == '1' else False)
        is_staff = (True if args.add_user[6] == '1' else False)
        is_superuser = (True if args.add_user[7] == '1' else False)
        add_user(username, first_name, last_name, email, password, is_active, is_staff, is_superuser)

    if args.add_race:
        name = args.add_race[0]
        title = args.add_race[1]
        can_play = (True if args.add_race[2] == '1' else False)
        add_race(name, title, can_play)

    if args.update_user:
        username = args.update_user[0]
        first_name = args.update_user[1]
        last_name = args.update_user[2]
        email = args.update_user[3]
        is_active = (True if args.update_user[4] == '1' else False)
        is_staff = (True if args.update_user[5] == '1' else False)
        is_superuser = (True if args.update_user[6] == '1' else False)
        update_user(username, first_name, last_name, email, None, is_active, is_staff, is_superuser)

    if args.update_race:
        name = args.update_race[0]
        title = args.update_race[1]
        can_play = (True if args.update_race[2] == '1' else False)
        update_race(name, title, can_play)

    if args.remove_user:
        remove_user(args.remove_user)

    if args.remove_race:
        remove_race(args.remove_race)

    if args.change_password:
        username = args.change_password[0]
        password = args.change_password[1]
        change_password(username, password)

    if args.add_user_to_race:
        username = args.add_user_to_race[0]
        race_name = args.add_user_to_race[1]
        add_user_to_race(username, race_name)

    if args.remove_user_from_race:
        username = args.remove_user_from_race[0]
        race_name = args.remove_user_from_race[1]
        remove_user_from_race(username, race_name)


if __name__ == "__main__":
    sys.exit(main())