View raw

1 # -*- mode: python; -*- 2 3 4 from flask_sqlalchemy import SQLAlchemy 5 6 # from sqlalchemy.orm import declarative_base 7 8 from datetime import datetime 9 from flask_login import UserMixin 10 11 db = SQLAlchemy() 12 # Base = declarative_base() 13 14 15 def date_time_now(): 16 return datetime.now().strftime("%Y-%m-%d %H:%M:%S") 17 18 19 # module_user = db.Table( 20 # "ModuleUser", 21 # Base.metadata, 22 # db.Column("ModuleId", db.String, db.ForeignKey("Module.Name"), primary_key=True), 23 # db.Column("UserId", db.Integer, db.ForeignKey("User.UserId"), primary_key=True), 24 # ) 25 26 # association_table = db.Table('association', Base.metadata, 27 # db.Column('left_id', db.ForeignKey('left.id'), primary_key=True), 28 # db.Column('right_id', db.ForeignKey('right.id'), primary_key=True), 29 # ) 30 31 # class Parent(Base): 32 # __tablename__ = 'left' 33 # id = db.Column(db.Integer, primary_key=True) 34 # children = db.relationship( 35 # "Child", 36 # secondary=association_table, 37 # back_populates="parents") 38 39 # class Child(Base): 40 # __tablename__ = 'right' 41 # id = db.Column(db.Integer, primary_key=True) 42 # parents = db.relationship( 43 # "Parent", 44 # secondary=association_table, 45 # back_populates="children") 46 47 48 class Module(db.Model): 49 __tablename__ = "Module" 50 name = db.Column("Name", db.String(20), nullable=False, primary_key=True) 51 description = db.Column("Description", db.String(50), nullable=False) 52 # users = db.relationship("User", secondary=module_user, backref="modules") 53 54 def __repr__(self): 55 return f"<Module {self.name}>" 56 57 58 class User(UserMixin, db.Model): 59 """UserMixin inheritance required for features described here: 60 61 https://stackoverflow.com/questions/63231163/what-is-the-usermixin-in-flask""" 62 63 __tablename__ = "User" 64 65 def get_id(self): 66 return self.primary_key 67 68 primary_key = db.Column("UserId", db.Integer, primary_key=True) 69 username = db.Column("Username", db.String(20), nullable=False) 70 hashed_password = db.Column("HashedPassword", db.String(100), nullable=False) 71 name_first = db.Column("NameFirst", db.String(20), nullable=False) 72 name_last = db.Column("NameLast", db.String(20), nullable=False) 73 email = db.Column("Email", db.String(20), nullable=False) 74 phone_mobile = db.Column("PhoneMobile", db.Integer) 75 phone_alternative = db.Column("PhoneAlternative", db.Integer) 76 date_time_created = db.Column( 77 "DateTimeCreated", db.String, server_default=date_time_now() 78 ) 79 date_time_updated = db.Column( 80 "DateTimeUpdated", db.String, server_onupdate=date_time_now() 81 ) 82 # modules = db.relationship("Module", secondary=module_user, backref="users") 83 84 def __repr__(self): 85 return f"<User {self.name_first} {self.name_last}>" 86 87 88 class Customer(db.Model): 89 """One customer has many invoices and orders associated.""" 90 91 __tablename__ = "Customer" 92 primary_key = db.Column("CustomerId", db.Integer, nullable=False, primary_key=True) 93 name = db.Column("Name", db.String(20), nullable=False) 94 name_alternative = db.Column("NameAlternative", db.String(20)) 95 code_customer = db.Column("CodeCustomer", db.String(20), unique=True) 96 code_accounting = db.Column("CodeAccounting", db.String(20), unique=True) 97 address = db.Column("Address", db.String(20)) 98 postal_code = db.Column("PostalCode", db.Integer) 99 city = db.Column("City", db.String(20)) 100 country = db.Column("Country", db.String(20)) 101 phone = db.Column("Phone", db.String(20)) 102 website = db.Column("Website", db.String(20)) 103 email = db.Column("Email", db.String(20)) 104 professional_id_1 = db.Column("ProfessionalId1", db.String(20), unique=True) 105 professional_id_2 = db.Column("ProfessionalId2", db.String(20), unique=True) 106 tax_id = db.Column("TaxId", db.String(20), unique=True) 107 payment_terms = db.Column("PaymentTerms", db.String(20)) 108 date_time_created = db.Column( 109 "DateTimeCreated", db.String, server_default=date_time_now() 110 ) 111 date_time_updated = db.Column( 112 "DateTimeUpdated", db.String, server_onupdate=date_time_now() 113 ) 114 invoices = db.relationship("Invoice", back_populates="customer") 115 orders = db.relationship("Order", back_populates="customer") 116 117 def __init__( 118 self, 119 name, 120 name_alternative, 121 code_customer, 122 code_accounting, 123 address, 124 postal_code, 125 city, 126 country, 127 phone, 128 website, 129 email, 130 professional_id_1, 131 professional_id_2, 132 tax_id, 133 payment_terms, 134 ): 135 self.name = name 136 self.name_alternative = name_alternative 137 self.code_customer = code_customer 138 self.code_accounting = code_accounting 139 self.address = address 140 self.postal_code = postal_code 141 self.city = city 142 self.country = country 143 self.phone = phone 144 self.website = website 145 self.email = email 146 self.professional_id_1 = professional_id_1 147 self.professional_id_2 = professional_id_2 148 self.tax_id = tax_id 149 self.payment_terms = payment_terms 150 151 def __repr__(self): 152 return f"<Customer {self.name}>" 153 154 155 class Invoice(db.Model): 156 """One invoice has many orders, one customer associated.""" 157 158 __tablename__ = "Invoice" 159 primary_key = db.Column("InvoiceId", db.Integer, primary_key=True) 160 invoice_id_alt = db.Column("InvoiceIdAlt", db.String) 161 customer_reference = db.Column("CustomerReference", db.String) 162 date_billed = db.Column("DateBilled", db.String) 163 date_due = db.Column("DateDue", db.String) 164 amount_net = db.Column("AmountNet", db.String) 165 amount_gross = db.Column("AmountGross", db.String) 166 amount_tax = db.Column("AmountTax", db.String) 167 date_time_created = db.Column( 168 "DateTimeCreated", db.String, server_default=date_time_now() 169 ) 170 customer_id = db.Column( 171 "CustomerId", db.Integer, db.ForeignKey("Customer.CustomerId") 172 ) 173 customer = db.relationship( 174 "Customer", back_populates="invoices", foreign_keys=[customer_id] 175 ) 176 orders = db.relationship("Order", back_populates="invoice") 177 178 def __init__( 179 self, 180 invoice_id_alt, 181 customer_id, 182 customer_reference, 183 date_billed, 184 date_due, 185 amount_net, 186 amount_gross, 187 amount_tax, 188 ): 189 self.invoice_id_alt = invoice_id_alt 190 self.customer_id = customer_id 191 self.customer_reference = customer_reference 192 self.date_billed = date_billed 193 self.date_due = date_due 194 self.amount_net = amount_net 195 self.amount_gross = amount_gross 196 self.amount_tax = amount_tax 197 198 def __repr__(self): 199 return f"<Invoice for {self.customer.name} billed {self.date_billed}>" 200 201 202 class Order(db.Model): # TODO 203 """One order per line item in invoice.""" 204 205 __tablename__ = "Order" 206 primary_key = db.Column("OrderId", db.Integer, primary_key=True) 207 order_id_alt = db.Column("OrderIdAlt", db.String) 208 delivery_date = db.Column("DateDelivery", db.String(20), nullable=False) 209 date_time_created = db.Column( 210 "DateTimeCreated", db.String, server_default=date_time_now() 211 ) 212 date_time_updated = db.Column( 213 "DateTimeUpdated", db.String, server_onupdate=date_time_now() 214 ) 215 customer_id = db.Column( 216 "CustomerId", 217 db.Integer, 218 db.ForeignKey("Customer.CustomerId"), 219 nullable=False, 220 ) 221 product_id = db.Column( 222 "ProductId", 223 db.Integer, 224 db.ForeignKey("Product.ProductId"), 225 nullable=False, 226 ) 227 invoice_id = db.Column( 228 "InvoiceId", 229 db.Integer, 230 db.ForeignKey("Invoice.InvoiceId"), 231 nullable=True, 232 ) 233 customer = db.relationship("Customer", back_populates="orders") 234 product = db.relationship("Product", back_populates="orders") 235 invoice = db.relationship("Invoice", back_populates="orders") 236 237 def __repr__(self): 238 return f"<Order {self.name} at {self.date_time_created}>" 239 240 241 class Product(db.Model): 242 __tablename__ = "Product" 243 primary_key = db.Column("ProductId", db.Integer, primary_key=True) 244 name = db.Column("Name", db.String(20), nullable=False, unique=True) 245 code_accounting = db.Column("CodeAccounting", db.String(20)) 246 unit_weight = db.Column("UnitWeight", db.Float) 247 price_net = db.Column("PriceNet", db.Float) 248 price_gross = db.Column("PriceGross", db.Float) 249 tax_rate = db.Column("TaxRate", db.Float) 250 date_time_created = db.Column( 251 "DateTimeCreated", db.String, server_default=date_time_now() 252 ) 253 date_time_updated = db.Column( 254 "DateTimeUpdated", db.String, server_onupdate=date_time_now() 255 ) 256 # order_id = db.Column("ProductId", db.Integer, db.ForeignKey("Product.ProductId")) 257 orders = db.relationship("Order", back_populates="product") 258 259 def __init__( 260 self, 261 name, 262 code_accounting, 263 unit_weight, 264 price_net, 265 price_gross, 266 tax_rate, 267 ): 268 self.name = name 269 self.code_accounting = code_accounting 270 self.unit_weight = unit_weight 271 self.price_net = price_net 272 self.price_gross = price_gross 273 self.tax_rate = tax_rate 274 275 def __repr__(self): 276 return f"<Product {self.name}>" 277 278 279 class FertiLog(db.Model): 280 __tablename__ = "FertiLog" 281 primary_key = db.Column("FertiLogId", db.Integer, primary_key=True) 282 nno3 = db.Column("NNO3", db.Float, default=0) 283 p = db.Column("P", db.Float, default=0) 284 k = db.Column("K", db.Float, default=0) 285 ca = db.Column("Ca", db.Float, default=0) 286 mg = db.Column("Mg", db.Float, default=0) 287 s = db.Column("S", db.Float, default=0) 288 na = db.Column("Na", db.Float, default=0) 289 cl = db.Column("Cl", db.Float, default=0) 290 fe = db.Column("Fe", db.Float, default=0) 291 zn = db.Column("Zn", db.Float, default=0) 292 b = db.Column("B", db.Float, default=0) 293 mn = db.Column("Mn", db.Float, default=0) 294 cu = db.Column("Cu", db.Float, default=0) 295 mo = db.Column("Mo", db.Float, default=0) 296 si = db.Column("Si", db.Float, default=0) 297 nnh4 = db.Column("NNH4", db.Float, default=0) 298 date_time_created = db.Column( 299 "DateTimeCreated", db.String, server_default=date_time_now() 300 ) 301 date_time_updated = db.Column( 302 "DateTimeUpdated", db.String, server_onupdate=date_time_now() 303 ) 304 targets = db.relationship("FertiTarget", back_populates="ferti_log") 305 306 def __init__(self, nno3, p, k, ca, mg, s, na, cl, fe, zn, b, mn, cu, mo, si, nnh4): 307 self.nno3 = nno3 308 self.p = p 309 self.k = k 310 self.ca = ca 311 self.mg = mg 312 self.s = s 313 self.na = na 314 self.cl = cl 315 self.fe = fe 316 self.zn = zn 317 self.b = b 318 self.mn = mn 319 self.cu = cu 320 self.mo = mo 321 self.si = si 322 self.nnh4 = nnh4 323 324 def __repr__(self): 325 return f"<Log ID {self.primary_key}>" 326 327 328 class FertiTarget(FertiLog): 329 __tablename__ = "FertiTarget" 330 primary_key = db.Column("FertiTargetId", db.Integer, primary_key=True) 331 ferti_log_id = db.Column( 332 "FertiLogId", db.Integer, db.ForeignKey("FertiLog.FertiLogId") 333 ) 334 ferti_log = db.relationship("FertiLog", back_populates="targets") 335 336 # def __init__(self): 337 # super(*args).__init__() 338 339 def __repr__(self): 340 return f"<Target ID {self.primary_key}>" 341