from utils.database import pack_params class User: def __init__(self, id_=None, name=None, phone=None, email=None, wallet_address=None, payment_method=None): self.id = id_ self.name = name self.phone = phone self.email = email self.wallet_address = wallet_address self.payment_method = payment_method def insert_sql(self, params_format="list"): params_sql, params = pack_params(params_format=params_format, param_sql="{param}", join_str=",", name=self.name, phone=self.phone, email=self.email, wallet_address=self.wallet_address, payment_method=self.payment_method) return f"INSERT INTO users ({params_sql}) VALUES ({','.join('%s' for _ in params)})", params def select_sql(self, query_columns=None, condition="AND", params_format="list"): if query_columns is None: query_columns = ["id", "name", "phone", "email", "wallet_address", "payment_method"] params_sql, params = pack_params(params_format=params_format, param_sql="{param}=%s", join_str=f" {condition} ", name=self.name, phone=self.phone, email=self.email, wallet_address=self.wallet_address, payment_method=self.payment_method) return f'SELECT {",".join(query_columns)} FROM users WHERE {params_sql}', params def exists_sql(self, condition="AND", params_format="list"): params_sql, params = pack_params(params_format=params_format, param_sql="{param}=%s", join_str=f" {condition} ", name=self.name, phone=self.phone, email=self.email, wallet_address=self.wallet_address, payment_method=self.payment_method) return f"SELECT id FROM users WHERE {params_sql} LIMIT 1", params def params(self, format="dict"): if format == "list": params = [] elif format == "dict": params = {} else: raise ValueError("format must be list or dict") if self.name: if format == "list": params.append(self.name) elif format == "dict": params["name"] = self.name if self.phone: if format == "list": params.append(self.phone) elif format == "dict": params["phone"] = self.phone if self.email: if format == "list": params.append(self.email) elif format == "dict": params["email"] = self.email if self.wallet_address: if format == "list": params.append(self.wallet_address) elif format == "dict": params["wallet_address"] = self.wallet_address if self.payment_method: if format == "list": params.append(self.payment_method) elif format == "dict": params["payment_method"] = self.payment_method return params def get_difference(self, other_user): different_attrs = {} if self.name != other_user.name: different_attrs["name"] = (self.name, other_user.name) if self.phone != other_user.phone: different_attrs["phone"] = (self.phone, other_user.phone) if self.email != other_user.email: different_attrs["email"] = (self.email, other_user.email) if self.wallet_address != other_user.wallet_address: different_attrs["wallet_address"] = (self.wallet_address, other_user.wallet_address) if self.payment_method != other_user.payment_method: different_attrs["payment_method"] = (self.payment_method, other_user.payment_method) return different_attrs def __eq__(self, other): if isinstance(other, User): return ((self.name, self.phone, self.email, self.wallet_address, self.payment_method) == (other.name, other.phone, other.email, other.wallet_address, other.payment_method)) return False def __hash__(self): return hash((self.name, self.phone, self.email, self.wallet_address, self.payment_method)) class Order: def __init__(self, id_=None, order_id=None, name=None, phone=None, email=None, quant=None, payment_method=None, from_address=None, to_address=None, create_timestamp=None, update_timestamp=None, status=None): self.id = id_ self.order_id = order_id self.name = name self.phone = phone self.email = email self.quant = quant self.payment_method = payment_method self.from_address = from_address self.to_address = to_address self.create_timestamp = create_timestamp self.update_timestamp = update_timestamp self.status = status def insert_sql(self, params_format="list"): params_sql, params = pack_params(params_format=params_format, param_sql="{param}", join_str=",", order_id=self.order_id, name=self.name, phone=self.phone, email=self.email, quant=self.quant, payment_method=self.payment_method, from_address=self.from_address, to_address=self.to_address, create_timestamp=self.create_timestamp, update_timestamp=self.update_timestamp, status=self.status) return f"INSERT INTO orders ({params_sql}) VALUES ({','.join('%s' for _ in params)})", params def select_sql(self, query_columns=None, condition="AND", params_format="list"): if query_columns is None: query_columns = ['order_id', 'name', 'phone', 'email', 'quant', 'payment_method', 'from_address'] params_sql, params = pack_params(params_format=params_format, param_sql="{param}=%s", join_str=f" {condition} ", order_id=self.order_id, name=self.name, phone=self.phone, email=self.email, quant=self.quant, payment_method=self.payment_method, from_address=self.from_address, to_address=self.to_address, create_timestamp=self.create_timestamp, update_timestamp=self.update_timestamp, status=self.status) return f'SELECT {",".join(query_columns)} FROM orders WHERE {params_sql}', params def exists_sql(self, condition="AND", params_format="list"): params_sql, params = pack_params(params_format=params_format, param_sql="{param}=%s", join_str=f" {condition} ", order_id=self.order_id, name=self.name, phone=self.phone, email=self.email, quant=self.quant, payment_method=self.payment_method, from_address=self.from_address, to_address=self.to_address, create_timestamp=self.create_timestamp, update_timestamp=self.update_timestamp, status=self.status) return f"SELECT id FROM orders WHERE {params_sql} LIMIT 1", params