Skip to content
This repository was archived by the owner on Dec 19, 2021. It is now read-only.

Commit d3c94d9

Browse files
authored
Switch to has_one relationship for tenant/lease (#395)
1 parent 409a146 commit d3c94d9

File tree

7 files changed

+12
-43
lines changed

7 files changed

+12
-43
lines changed

models/lease.py

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
from sqlalchemy.sql.functions import now
21
from db import db
32
from models.base_model import BaseModel
43
from utils.time import Time
@@ -10,7 +9,9 @@ class LeaseModel(BaseModel):
109

1110
id = db.Column(db.Integer, primary_key=True)
1211
propertyID = db.Column(db.Integer, db.ForeignKey("properties.id"), nullable=False)
13-
tenantID = db.Column(db.Integer, db.ForeignKey("tenants.id"), nullable=False)
12+
tenantID = db.Column(
13+
db.Integer, db.ForeignKey("tenants.id"), unique=True, nullable=False
14+
)
1415
occupants = db.Column(db.Integer)
1516
dateTimeStart = db.Column(db.DateTime, nullable=False)
1617
dateTimeEnd = db.Column(db.DateTime, nullable=False)
@@ -30,8 +31,3 @@ def json(self):
3031
def is_active(self):
3132
now = datetime.now()
3233
return now > self.dateTimeStart and now < self.dateTimeEnd
33-
34-
@classmethod
35-
def active(cls):
36-
time = now()
37-
return (time > cls.dateTimeStart) & (time < cls.dateTimeEnd)

models/tenant.py

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,28 +22,25 @@ class TenantModel(BaseModel):
2222
collection_class=NobiruList,
2323
)
2424

25-
leases = db.relationship(
26-
"LeaseModel",
25+
lease = db.relationship(
26+
LeaseModel,
2727
backref="tenant",
28-
lazy="dynamic",
2928
cascade="all, delete-orphan",
30-
collection_class=NobiruList,
29+
uselist=False,
3130
)
3231

3332
tickets = db.relationship(
3433
TicketModel, backref="tenant", lazy=True, collection_class=NobiruList
3534
)
3635

3736
def json(self):
38-
first_active_lease = self.leases.filter(LeaseModel.active()).first()
39-
active_lease_json = first_active_lease.json() if first_active_lease else ""
4037
return {
4138
"id": self.id,
4239
"firstName": self.firstName,
4340
"lastName": self.lastName,
4441
"fullName": "{} {}".format(self.firstName, self.lastName),
4542
"phone": self.phone,
46-
"lease": active_lease_json,
43+
"lease": self.lease.json() if self.lease else None,
4744
"staff": self.staff.json(),
4845
"created_at": Time.format_date(self.created_at),
4946
"updated_at": Time.format_date(self.updated_at),

resources/tenants.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,9 @@ def _build_payload(self):
4040
params[param] = request.json.get(param)
4141

4242
if set(valid_lease_params) & set(list(request.json)):
43-
params["leases"] = [{}]
43+
params["lease"] = {}
4444
for param in valid_lease_params:
4545
if request.json.get(param):
46-
params["leases"][0][param] = request.json.get(param)
46+
params["lease"][param] = request.json.get(param)
4747

4848
return params

schemas/tenant.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ class Meta:
1414
updated_at = fields.DateTime(time_format)
1515

1616
staffIDs = fields.List(fields.Integer(), required=False)
17-
leases = fields.List(fields.Nested("BuildLeaseSchema"))
17+
lease = fields.Nested("BuildLeaseSchema")
1818

1919
firstName = fields.Str(
2020
required=True,

tests/integration/test_tenants.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ def test_create(
6868
)
6969

7070
mock_create.assert_called_once_with(
71-
schema=TenantSchema, payload={**tenant_attrs, "leases": [{**lease_attrs}]}
71+
schema=TenantSchema, payload={**tenant_attrs, "lease": {**lease_attrs}}
7272
)
7373

7474
assert response.json == tenant.json()

tests/serializers/tenant/test_tenant_serializer.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ def test_serializer(self, create_tenant):
1313
"id": tenant.id,
1414
"lastName": tenant.lastName,
1515
"phone": tenant.phone,
16-
"leases": [],
16+
"lease": None,
1717
"created_at": Time.format_date(tenant.created_at),
1818
"updated_at": Time.format_date(tenant.updated_at),
1919
"archived": tenant.archived,

tests/unit/test_tenant.py

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
import pytest
22
from tests.unit.base_interface_test import BaseInterfaceTest
3-
from models.property import PropertyModel
43
from models.tenant import TenantModel
54
from schemas.tenant import TenantSchema
65
from utils.time import Time
7-
import datetime
86

97

108
class TestBaseTenantModel(BaseInterfaceTest):
@@ -16,28 +14,6 @@ def setup(self):
1614

1715
@pytest.mark.usefixtures("empty_test_db")
1816
class TestTenantModel:
19-
def test_only_active_lease_returned(self, faker, create_lease, create_tenant):
20-
tenant = create_tenant()
21-
22-
# Create an expired lease for the tenant
23-
lease_expired_end = faker.date_time_this_decade(
24-
before_now=True, after_now=False
25-
)
26-
lease_expired_start = lease_expired_end - datetime.timedelta(days=365)
27-
lease_expired = create_lease(
28-
tenant=tenant,
29-
dateTimeStart=lease_expired_start,
30-
dateTimeEnd=lease_expired_end,
31-
)
32-
33-
# Create an active lease for the tenant
34-
lease_active = create_lease(
35-
tenant=tenant, property=PropertyModel.find(lease_expired.propertyID)
36-
)
37-
38-
# Active lease should be the only one that shows up
39-
assert tenant.json()["lease"] == lease_active.json()
40-
4117
def test_json(self, create_tenant, create_lease):
4218
tenant = create_tenant()
4319
lease = create_lease(tenant=tenant)

0 commit comments

Comments
 (0)