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)
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)
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()
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)
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'
def float_input(string, default=False): string = paint(string) return float(string_input(string, default))
def int_input(string, default=False, data={}): string = paint(string) return int(string_input(string, default))
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)