Ejemplo n.º 1
0
def options_input(string, options, default=False):
    string = paint(string)
    answer = ""
    print(" ")
    print(paint('Available options:'))
    lower_options = []
    for option in options:
        print(paint(option, 'yellow'))
        lower_options.append(option.lower())
    print(" ")

    def cap_option(value):
        i = lower_options.index(value)
        return options[i]

    lower_default = default.lower() if default != False else False
    # If input is optional
    if lower_default in lower_options:
        answer = input(paint(f'{string} (default: {default}): ')).lower()
        if answer in lower_options:
            return cap_option(answer)
        else:
            return default

    # If input is required
    while answer not in lower_options:
        answer = input(string + ': ').lower()
    return cap_option(answer)
Ejemplo n.º 2
0
def string_input(string, default=""):
    answer = ""

    # If input is optional
    if default != "":
        question = paint(string + ' (default: ' + default + '): ')
        answer = input(question)
        if answer == "":
            return default
        else:
            return str(answer)

    # If input is required
    while answer == "" or answer == False:
        answer = input(paint(string + ": "))

    return str(answer)
Ejemplo n.º 3
0
 def ask_optional():
     answer = input(paint(string + " (y/n default " + default +
                          "): ")).lower()
     if answer == 'y':
         return True
     elif answer == 'n':
         return False
     elif answer == '':
         return default == 'y'
     else:
         ask_optional()
Ejemplo n.º 4
0
def scaffold_config():
    cfg = get_cfg()
    cfg['current_scaffold'] = {}
    model = {
        "title": 'UserProfile',
        "fields": [
            {
                "title": "name",
                "type": "CharField",
                "options": [
                    "max_length = 255",
                    "unique = True"
                ],
                "string": "name = models.CharField(max_length=255, unique=True)\n    "
            },
            {
                "title": "email",
                "type": "EmailField",
                "options": [
                    "max_length = 255",
                    "unique = True"
                ],
                "string": "email = models.EmailField(max_length=255, unique=True)\n    "
            }
        ]
    }
    cfg['current_scaffold']['model'] = model
    cfg['current_scaffold']['need_owner'] = 'True'
    set_cfg(cfg)

    print(' ')
    print(' ')
    print(paint(return_model(), 'green'))
    print(' ')
    print(' ')
    if boolean_input('Add some fields to the user model?'):
        get_model_field()

    user_permission()

    # Push current_scaffold to models
    cfg = get_cfg()
    cfg['models'].append(cfg['current_scaffold']['model'])
    set_cfg(cfg)
Ejemplo n.º 5
0
def boolean_input(string, default = False):
	answer = False

	# If input is optional
	if default in ['y','n']:
		def ask_optional():
			answer = input(
				paint(string + " (y/n default " + default + "): ")).lower()
			if answer == 'y':
				return True
			elif answer == 'n':
				return False
			elif answer == '':
				return default == 'y'
			else:
				ask_optional()
		return ask_optional()

	# If input is required
	while answer not in ['y','n']:
		answer = input(paint(string + " (y/n): ")).lower()
	return answer == 'y'
Ejemplo n.º 6
0
def float_input(string, default=False):
    string = paint(string)
    return float(string_input(string, default))
Ejemplo n.º 7
0
def int_input(string, default=False, data={}):
    string = paint(string)
    return int(string_input(string, default))
Ejemplo n.º 8
0
def get_model_field():
    cfg = get_cfg()
    field_title = string_input('Name this field')
    field_type = options_input('Which fieldtype would you like to use? ', types)

    # Get correct option, regardless of caps
    field_type = types[lower_types.index(field_type.lower())]
    field_object = {
        'title': field_title,
        'type': field_type,
        'options': [],
    }

    if field_type in ['CharField', 'CommaSeparatedIntegerField', 'EmailField']:
        ml = str(string_input('max_length', '255'))
        field_object['options'].append('max_length = ' + ml)

    # Datefield specific arguments
    if field_type in ['DateField', 'DateTimeField', 'TimeField']:
        # auto_now_add and auto_now cannot be used together.
        auto_now_add = str(boolean_input('Use DateField auto_now_add? '))
        if auto_now_add != 'True':
            auto_now = str(boolean_input('Use DateField auto_now? '))

        # Set the option
        if auto_now_add == 'True':
            field_object['options'].append('auto_now_add = True')
        elif auto_now == 'True':
            field_object['options'].append('auto_now = True')

    # Decimalfield specific arguments
    if field_type == 'DecimalField':
        decimal_places = string_input('decimal_places')
        max_digits = string_input('max_digits')
        field_object['options'].append('decimal_places = ' + decimal_places)
        field_object['options'].append('max_digits = ' + max_digits)

    # Filefield specific arguments
    if field_type == 'FileField':
        upload_to = string_input('upload_to', None)
        if upload_to != None:
            field_object['options'].append('upload_to = ' + quote(upload_to))

        storage = string_input('storage', None)
        if storage != None:
            field_object['options'].append('storage = ' + quote(storage))

        max_length = string_input('max_length', None)
        if max_length != None:
            field_object['options'].append('max_length = ' + max_length)

    # FilePathField specific arguments
    if field_type in ['FilePathField']:
        path = string_input('path = ')
        field_object['options'].append('path = ' + quote(path))

        match = string_input("match. For example r'$^'", None)
        if match != None:
            field_object['options'].append('match = ' + match)

        max_length = string_input('max_length', None)
        if max_length != None:
            field_object['options'].append('max_length = ' + max_length)

        recursive = str(boolean_input('recursive', 'n'))
        field_object['options'].append('recursive = ' + recursive)

        allow_files = str(boolean_input('allow_files', 'y'))
        field_object['options'].append('allow_files = ' + allow_files)

        allow_folders = str(boolean_input('allow_folders', 'n'))
        field_object['options'].append('allow_folders = ' + allow_folders)

    if field_type == 'ImageField':
        height_field = string_input('height_field', None)
        if height_field != None:
            field_object['options'].append('height_field = ' + height_field)

        width_field = string_input('width_field', None)
        if width_field != None:
            field_object['options'].append('width_field = ' + width_field)

    if field_type == 'SlugField':
        max_length = string_input('max_length', '50')
        field_object['options'].append('max_length = ' + max_length)

    if field_type == 'URLField':
        max_length = string_input('max_length', '200')
        field_object['options'].append('max_length = ' + max_length)

    foreign = False
    if field_type in ['ForeignKey', 'OneToOneField', 'ManyToManyField']:
        models = [model['title'] for model in cfg['models']]
        models.append('self')
        other_model = options_input('Choose a foreign model', models)
        field_object['options'].append(quote(other_model))

        if boolean_input('Add a related_name option?', 'n'):
            related_name = string_input(
                'related_name =',
                cfg['current_scaffold']['model']['title'].lower()
            )
            field_object['options'].append('related_name = ' + quote(related_name))

    if field_type in ['ForeignKey', 'OneToOneField']:
        choices = [
            'CASCADE', 'PROTECT', 'SET_NULL',
            'SET_DEFAULT','SET()','DO_NOTHING'
        ]
        on_delete = options_input('on_delete ', choices, 'CASCADE')
        field_object['options'].append('on_delete = models.' + on_delete)

    # If we missed anything, let the user add it now.
    def more_options():
        if boolean_input(
            'Add another option to' + field_object['title'] + '?',
            'n'):
            new_option = string_input("enter it now. (e.g. foo='bar')")
            field_object['options'].append(new_option)
            more_options()

    # Build the string
    ftitle = field_object['title']
    ftype = field_object['type']
    foptions = ''
    for i, o in enumerate(field_object['options']):
        if i > 0:
            foptions += f', {o}'
        else:
            foptions = o
    cfg['current_scaffold']['model']['fields'].append({
        'title': ftitle,
        'type': ftype,
        'options': field_object['options'],
        'string': f'{ftitle} = models.{ftype}({foptions})\n    '
    })

    set_cfg(cfg)
    print('========================')
    print('Your model so far:')
    print(' ')
    print(paint(return_model(), 'green'))
    print('========================')

    another_field = boolean_input('Make another field? ')
    if another_field:
        get_model_field()

    # All done making fields.
    # Add the __str__ method
    else :
        user = cfg['current_scaffold']['model']['title'] == 'UserProfile'
        if not user:
            current_fields = cfg['current_scaffold']['model']['fields']
            titles = [field['title'] for field in current_fields]
            default_title = titles[0]
            if cfg['current_scaffold']['need_owner'] == 'True':
                default_title = titles[1]

            str_field = options_input(
                'Which field should be used for the __str__ method?',
                titles,
                default_title
            )

            cfg['current_scaffold']['model']['__str__'] = str_field
            set_cfg(cfg)