def all(self, cls=None): """ get dictionary of all objects """ if cls is None: all_list = [] for x in BaseModel.__subclasses__(): all_list.extend(self.__session.query(x).all()) return {"{}.{}".format(type(obj).__name__, obj.id): obj for obj in all_list} if type(cls) is str: cls = eval(cls) return {"{}.{}".format(type(obj).__name__, obj.id): obj for obj in self.__session.query(cls).all()}
#!/usr/bin/python3 from models.engine.file_storage import FileStorage from models.base_model import BaseModel from models.city import City from models.state import State from models.review import Review from models.amenity import Amenity from models.place import Place from models.user import User class_list = ["BaseModel"] for x in BaseModel.__subclasses__(): class_list.append(x.__name__) __all__ = class_list storage = FileStorage() storage.reload()
qq_no = CharField(null=True, max_length=16, verbose_name="qq号") wechat = CharField(null=True, max_length=32, verbose_name="微信号") email = CharField(null=True, max_length=32, verbose_name="电子邮箱") class Meta: verbose_name = "demo用户表" table_name = "demo_user" indexes = ((("uid", "status"), True), ) def generate_subclass(sub_model: list, list_model: list) -> list: for item in sub_model: if item.__subclasses__(): generate_subclass(item.__subclasses__(), list_model) if item.__name__ not in list_model and len(item.__subclasses__()) == 0: list_model.append(item) return list_model if __name__ == '__main__': sub_model = BaseModel.__subclasses__() list_model = generate_subclass(sub_model, []) list_model = [ item for item in list_model if not item.table_exists() and "verbose_name" in item._meta.__dict__ ] logging.debug("Start create models: " + ",".join([item.__name__ for item in list_model])) database_proxy.create_tables(list_model)
class HBNBCommand(cmd.Cmd): """ Class which control the console, and user interface """ prompt = '(hbtn) ' __BaseModel_subclass = [cls.__name__ for cls in BaseModel.__subclasses__()] __buff_class = ['BaseModel', *__BaseModel_subclass] # general commands def do_quit(self, line): """ Exist of the console by cmd """ return True def do_EOF(self, line): """ Exist of the console by signal """ return True def emptyline(self): """ Disable any action on BlankLine """ pass # handle data comands def do_create(self, items): """ create a new BaseModel instance """ if self.check_input(items): className = items.split()[0] obj = storage.create_obj(className) obj.save() print(obj.id) def do_show(self, items): """ Show info of a BaseModel instance """ if self.check_input(items, 1): items = items.split() print(storage.all()[".".join(items[:2])]) def do_destroy(self, items): """ Delete an instance """ if self.check_input(items, 1): items = items.split() storage.delete(*items[:2]) storage.save() def do_all(self, items): """ show all elements stored, compatible with given class """ items = items.split() if not items: print([str(v) for v in storage.all().values()]) elif items[0] not in HBNBCommand.__buff_class: print("** class doesn't exist **") else: print([str(v) for k, v in storage.all().items() if k.split(".")[0] == items[0]]) def do_update(self, items): """ Update the propertie of a instance """ if self.check_input(items, 2): import re items = items.split() if '"' not in items[3]: value = items[3] else: value = " ".join(items[3:]) value = re.findall(r'"([^"]*)"', value)[0] obj = storage.all()[".".join(items[:2])] value = storage.auto_caster(value) setattr(obj, items[2], value) obj.save() # Check functions @staticmethod def check_input(items, step=0): """ Check a given input and alert on incorrect format according to step. """ items = items.split() outValue = False # check class input if not items: print("** class name missing **") elif items[0] not in HBNBCommand.__buff_class: print("** class doesn't exist **") else: outValue = True if not outValue or step <= 0: return outValue outValue = False # check id input if len(items) < 2: print("** instance id missing **") elif not any(".".join(items[:2]) == x for x in storage.all()): print("** no instance found **") else: outValue = True if not outValue or step <= 1: return outValue outValue = False # check atribute and value inputs if len(items) < 3: print("** attribute name missing **") elif len(items) < 4: print("** value missing **") elif items[2] in storage.constants(): print("** can't modify that property **") else: return True return False