[Flask] Simple ERP for a farm.
db now in models; modules.
Changed files
app/__init__.py
@@ -4,8 +4,7 @@
4
4
from flask_sqlalchemy import SQLAlchemy
5
5
from flask_login import LoginManager
6
6
7
Removed:
8
Removed:
db = SQLAlchemy()
7
Added:
from .models import db
9
8
10
9
11
10
def create_app():
app/models.py
@@ -7,8 +7,8 @@
7
7
8
8
from datetime import datetime
9
9
from flask_login import UserMixin
10
Removed:
from . import db
11
10
11
Added:
db = SQLAlchemy()
12
12
# Base = declarative_base()
13
13
14
14
@@ -196,7 +196,7 @@
196
196
self.amount_tax = amount_tax
197
197
198
198
def __repr__(self):
199
Removed:
return f"<Invoice for {self.customer.name} at {self.updated}>"
199
Added:
return f"<Invoice for {self.customer.name} billed {self.date_billed}>"
200
200
201
201
202
202
class Order(db.Model): # TODO
@@ -212,36 +212,30 @@
212
212
date_time_updated = db.Column(
213
213
"DateTimeUpdated", db.String, server_onupdate=date_time_now()
214
214
)
215
Removed:
product_id = db.Column(
216
Removed:
"ProductId",
217
Removed:
db.Integer,
218
Removed:
db.ForeignKey("Product.ProductId"),
219
Removed:
nullable=False,
220
Removed:
)
221
215
customer_id = db.Column(
222
216
"CustomerId",
223
217
db.Integer,
224
218
db.ForeignKey("Customer.CustomerId"),
225
219
nullable=False,
226
220
)
221
Added:
product_id = db.Column(
222
Added:
"ProductId",
223
Added:
db.Integer,
224
Added:
db.ForeignKey("Product.ProductId"),
225
Added:
nullable=False,
226
Added:
)
227
227
invoice_id = db.Column(
228
228
"InvoiceId",
229
229
db.Integer,
230
230
db.ForeignKey("Invoice.InvoiceId"),
231
231
nullable=True,
232
232
)
233
Removed:
customer = db.relationship(
234
Removed:
"Customer", back_populates="orders"
235
Removed:
)
236
Removed:
product = db.relationship(
237
Removed:
"Product", back_populates="orders"
238
Removed:
)
239
Removed:
invoice = db.relationship(
240
Removed:
"Invoice", back_populates="orders"
241
Removed:
)
233
Added:
customer = db.relationship("Customer", back_populates="orders")
234
Added:
product = db.relationship("Product", back_populates="orders")
235
Added:
invoice = db.relationship("Invoice", back_populates="orders")
242
236
243
237
def __repr__(self):
244
Removed:
return f"<Order {self.name} at {self.updated}>"
238
Added:
return f"<Order {self.name} at {self.date_time_created}>"
245
239
246
240
247
241
class Product(db.Model):
@@ -283,7 +277,7 @@
283
277
284
278
285
279
class FertiLog(db.Model):
286
Removed:
__tablename__ = "Fertilog"
280
Added:
__tablename__ = "FertiLog"
287
281
primary_key = db.Column("FertiLogId", db.Integer, primary_key=True)
288
282
nno3 = db.Column("NNO3", db.Float, default=0)
289
283
p = db.Column("P", db.Float, default=0)
@@ -307,7 +301,9 @@
307
301
date_time_updated = db.Column(
308
302
"DateTimeUpdated", db.String, server_onupdate=date_time_now()
309
303
)
304
Added:
targets = db.relationship("FertiTarget", back_populates="ferti_log")
310
305
306
Added:
311
307
def __init__(self, nno3, p, k, ca, mg, s, na, cl, fe, zn, b, mn, cu, mo, si, nnh4):
312
308
self.nno3 = nno3
313
309
self.p = p
@@ -325,18 +321,21 @@
325
321
self.mo = mo
326
322
self.si = si
327
323
self.nnh4 = nnh4
328
Removed:
self.date_time_created = date_time_now
329
324
330
325
def __repr__(self):
331
326
return f"<Log ID {self.primary_key}>"
332
327
333
328
334
329
class FertiTarget(FertiLog):
335
Removed:
__tablename__ = "Fertitarget"
330
Added:
__tablename__ = "FertiTarget"
336
331
primary_key = db.Column("FertiTargetId", db.Integer, primary_key=True)
337
Removed:
targeted_log = db.Column(
338
Removed:
"FertiLogId", db.Integer, db.ForeignKey("Fertilog.FertiLogId")
332
Added:
ferti_log_id = db.Column(
333
Added:
"FertiLogId", db.Integer, db.ForeignKey("FertiLog.FertiLogId")
339
334
)
335
Added:
ferti_log = db.relationship("FertiLog", back_populates="targets")
336
Added:
337
Added:
# def __init__(self):
338
Added:
# super(*args).__init__()
340
339
341
340
def __repr__(self):
342
341
return f"<Target ID {self.primary_key}>"
app/modules/common.py
@@ -25,8 +25,8 @@
25
25
if form.validate_on_submit():
26
26
model = getattr(models, table)
27
27
table_fields = inspect.signature(model).parameters
28
Removed:
form_values = {key: request.form[key] for key in table_fields}
29
Removed:
print(f"Ready to insert {form_values}")
28
Added:
form_values = {key: request.form.get(key) for key in table_fields}
29
Added:
print(f"Ready to insert in {table} from {module} {form_values}")
30
30
record = model(**form_values)
31
31
db.session.add(record)
32
32
db.session.commit()
app/modules/ferti/forms.py
@@ -12,13 +12,10 @@
12
12
)
13
13
from wtforms.validators import InputRequired, Length, NumberRange
14
14
15
Added:
from ...models import FertiLog
15
16
17
Added:
16
18
class AddFertiLog(FlaskForm):
17
Removed:
target = SelectField(
18
Removed:
"Type",
19
Removed:
choices=[("False", "Log"), ("True", "Target")],
20
Removed:
validators=[InputRequired()],
21
Removed:
)
22
19
nno3 = FloatField("NNO3", default=0)
23
20
p = FloatField("P", default=0)
24
21
k = FloatField("K", default=0)
@@ -39,9 +36,15 @@
39
36
40
37
41
38
class AddFertiTarget(AddFertiLog):
42
Removed:
targeted_log = SelectField(
43
Removed:
"Log to target",
44
Removed:
choices=[("value1", "Last"), ("value2", "Named")],
39
Added:
target_id = SelectField(
40
Added:
"Target log",
41
Added:
choices=[],
45
42
validators=[InputRequired()],
46
43
)
47
Removed:
submit = SubmitField("Add/Update Log")
44
Added:
submit = SubmitField("Add target")
45
Added:
46
Added:
def __init__(self, **kwargs):
47
Added:
super().__init__()
48
Added:
self.target_id.choices = [
49
Added:
(target.primary_key, target.date_time_created) for target in FertiLog.query.all()
50
Added:
]
app/modules/ferti/routes.py
@@ -21,7 +21,7 @@
21
21
22
22
23
23
24
Removed:
from ... import db
24
Added:
# from ... import db
25
25
from ...models import *
26
26
from .forms import *
27
27
@@ -34,11 +34,10 @@
34
34
@login_required
35
35
def view():
36
36
modules = Module.query.all()
37
Removed:
logs = Fertilog.query.order_by(Fertilog.primary_key.desc()).all()
38
Removed:
targets = Fertitarget.query.all()
37
Added:
logs = FertiLog.query.order_by(FertiLog.primary_key.desc()).all()
38
Added:
targets = FertiTarget.query.all()
39
39
module = "ferti"
40
40
flash(f"Latest target is {targets}.", "info")
41
Removed:
flash(f"Still fighting against styling in {module}.", "error")
42
41
return render_template(
43
42
f"modules/{module}.html",
44
43
modules=modules,
app/modules/forms.py
@@ -9,3 +9,22 @@
9
9
from .ferti.forms import AddFertiLog, AddFertiTarget
10
10
from .invoices.forms import AddInvoice
11
11
from .products.forms import AddProduct
12
Added:
13
Added:
14
Added:
# class AddUser(FlaskForm):
15
Added:
# customer_id = SelectField("Customer", choices=[])
16
Added:
# invoice_id_alt = StringField("Alternative invoice ID")
17
Added:
# customer_reference = StringField("Customer reference")
18
Added:
# date_billed = DateField('Date billed', format='%Y-%m-%d')
19
Added:
# date_due = DateField('Date due', format='%Y-%m-%d')
20
Added:
# amount_net = FloatField("Amount without tax", default=0)
21
Added:
# amount_gross = FloatField("Amount with tax", default=0)
22
Added:
# amount_tax = FloatField("Amount of tax", default=0)
23
Added:
# submit = SubmitField("Add Invoice")
24
Added:
25
Added:
# def __init__(self, **kwargs):
26
Added:
# super().__init__()
27
Added:
# self.customer_id.choices = [
28
Added:
# (cus.primary_key, cus.name) for cus in Customer.query.all()
29
Added:
# ]
30
Added:
app/modules/invoices/forms.py
@@ -8,7 +8,7 @@
8
8
IntegerField,
9
9
FloatField,
10
10
BooleanField,
11
Removed:
DateTimeField,
11
Added:
DateField,
12
12
)
13
13
from wtforms.validators import InputRequired, Length, NumberRange
14
14
@@ -19,14 +19,14 @@
19
19
customer_id = SelectField("Customer", choices=[])
20
20
invoice_id_alt = StringField("Alternative invoice ID")
21
21
customer_reference = StringField("Customer reference")
22
Removed:
date_billed = StringField("Date billed")
23
Removed:
date_due = StringField("Date due")
22
Added:
date_billed = DateField('Date billed', format='%Y-%m-%d')
23
Added:
date_due = DateField('Date due', format='%Y-%m-%d')
24
24
amount_net = FloatField("Amount without tax", default=0)
25
25
amount_gross = FloatField("Amount with tax", default=0)
26
26
amount_tax = FloatField("Amount of tax", default=0)
27
Removed:
submit = SubmitField("Add new Invoice")
27
Added:
submit = SubmitField("Add Invoice")
28
28
29
Removed:
def __init__(self):
29
Added:
def __init__(self, **kwargs):
30
30
super().__init__()
31
31
self.customer_id.choices = [
32
32
(cus.primary_key, cus.name) for cus in Customer.query.all()
app/modules/invoices/routes.py
@@ -15,7 +15,7 @@
15
15
from flask_login import login_required, current_user
16
16
17
17
18
Removed:
from ... import db
18
Added:
# from ... import db
19
19
from ...models import *
20
20
from .forms import *
21
21
@@ -31,8 +31,6 @@
31
31
page = request.args.get('page', 1, type=int)
32
32
invoices = Invoice.query.order_by(Invoice.primary_key.desc()).paginate(page=page, per_page=5)
33
33
module = "invoices"
34
Removed:
flash(f"Successfully accessed module {module}.", "info")
35
Removed:
flash(f"Still fighting against styling in {module}.", "error")
36
34
return render_template(
37
35
f"modules/{module}.html",
38
36
modules=modules,
app/modules/orders/routes.py
@@ -15,13 +15,9 @@
15
15
from flask_login import login_required, current_user
16
16
17
17
18
Removed:
# from datetime import datetime
19
Removed:
import inspect
20
18
21
19
22
Removed:
23
Removed:
from ... import db
24
Removed:
from ...models import Module, Order
20
Added:
from ...models import db, Module, Order, Invoice
25
21
from .forms import *
26
22
27
23
@@ -34,6 +30,7 @@
34
30
modules = Module.query.all()
35
31
page = request.args.get('page', 1, type=int)
36
32
orders = Order.query.order_by(Order.primary_key.desc()).paginate(page=page, per_page=5)
33
Added:
invoices = Invoice.query.order_by(Invoice.primary_key.desc()).paginate(page=page, per_page=5)
37
34
module = "orders"
38
35
flash(f"Successfully accessed module {module}.", "info")
39
36
flash(f"Still fighting against styling in {module}.", "error")