""" Author: Michel Peltriaux Organization: Struktur- und Genehmigungsdirektion Nord, Rhineland-Palatinate, Germany Contact: michel.peltriaux@sgdnord.rlp.de Created on: 15.12.20 """ from getpass import getpass from django.contrib.auth.models import User from django.core.management import BaseCommand from django.db import transaction from konova.management.commands.setup_test_data import TEST_ORGANISATION_DATA, TEST_ROLE_GROUPS_DATA from konova.models import RoleType, RoleGroup from organisation.enums import RoleTypeEnum from organisation.models import Organisation CREATED_TEMPLATE = "{} created" class Command(BaseCommand): help = "Initializes database with basic data" def handle(self, *args, **options): try: with transaction.atomic(): self.__init_superuser() self.__init_test_organisation() self.__init_role_types() self.__init_role_groups() except KeyboardInterrupt: self.__break_line() exit(-1) def __init_superuser(self): """ Create a superuser by user prompt input Returns: """ self.stdout.write( self.style.WARNING( "--- Superuser ---", ) ) username = input("Superuser name: ") if User.objects.filter(username=username).exists(): self.stdout.write( self.style.ERROR( "Name already taken!" ) ) exit(-1) pw = getpass("Password: ") pw_confirm = getpass("Confirm password : ") if pw != pw_confirm: self.stdout.write( self.style.ERROR( "Passwords did not match!" ) ) exit(-1) # Create superuser superuser = User() superuser.username = username superuser.is_superuser = True superuser.is_staff = True superuser.set_password(pw) superuser.save() self.stdout.write( self.style.SUCCESS( "Superuser {} created".format(username) ) ) self.__break_line() def __init_role_types(self): """ Initializes available role types according to RoleTypeEnum Returns: """ self.stdout.write( self.style.WARNING( "--- Role types ---" ) ) for role_type_enum in RoleTypeEnum: role_type = RoleType.objects.get_or_create( type=role_type_enum.value )[0] self.stdout.write( self.style.SUCCESS( CREATED_TEMPLATE.format(role_type.type) ) ) self.__break_line() def __init_test_organisation(self): """ Creates test organisations from predefined data Returns: """ self.stdout.write( self.style.WARNING( "--- Organisations ---" ) ) for org in TEST_ORGANISATION_DATA: db_org = Organisation.objects.get_or_create( **org )[0] self.stdout.write( self.style.SUCCESS( CREATED_TEMPLATE.format(db_org.name) ) ) self.__break_line() def __init_role_groups(self): """ Creates test role groups from predefined data Returns: """ self.stdout.write( self.style.WARNING( "--- Role Groups ---" ) ) for group_data in TEST_ROLE_GROUPS_DATA: group_data["organisation"] = Organisation.objects.get(name=group_data["organisation"]) group_data["role"] = RoleType.objects.get(type=group_data["role"]) group = RoleGroup.objects.get_or_create( **group_data )[0] self.stdout.write( self.style.SUCCESS( CREATED_TEMPLATE.format(group.name) ) ) self.__break_line() def __break_line(self): """ Simply prints a line break Returns: """ self.stdout.write("\n")