1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154
|
import sqlalchemy as sa
from wtforms.fields import FormField
from tests import FormRelationsTestCase, MultiDict
from wtforms_alchemy import ModelFieldList, ModelForm, ModelFormField
class TestDeepFormRelationsOneToManyToOne(FormRelationsTestCase):
def create_models(self):
class Event(self.base):
__tablename__ = "event"
id = sa.Column(sa.Integer, primary_key=True)
name = sa.Column(sa.Unicode(255), nullable=False)
class Address(self.base):
__tablename__ = "address"
id = sa.Column(sa.Integer, autoincrement=True, primary_key=True)
street = sa.Column(sa.Unicode(255), nullable=True)
class Location(self.base):
__tablename__ = "location"
id = sa.Column(sa.Integer, autoincrement=True, primary_key=True)
name = sa.Column(sa.Unicode(255), nullable=True)
address_id = sa.Column(sa.Integer, sa.ForeignKey(Address.id))
address = sa.orm.relationship(Address)
event_id = sa.Column(sa.Integer, sa.ForeignKey(Event.id))
event = sa.orm.relationship(Event, backref="locations")
self.Event = Event
self.Location = Location
self.Address = Address
def create_forms(self):
class AddressForm(ModelForm):
class Meta:
model = self.Address
class LocationForm(ModelForm):
class Meta:
model = self.Location
address = ModelFormField(AddressForm)
class EventForm(ModelForm):
class Meta:
model = self.Event
locations = ModelFieldList(FormField(LocationForm))
self.LocationForm = LocationForm
self.EventForm = EventForm
self.AddressForm = AddressForm
def save(self):
data = {
"name": "Some event",
"locations-0-name": "Some location",
"locations-0-address-street": "Some address",
}
event = self.Event()
self.session.add(event)
form = self.EventForm(MultiDict(data))
form.validate()
form.populate_obj(event)
self.session.commit()
def test_assigment_and_deletion(self):
self.save()
event = self.session.query(self.Event).first()
assert event.locations[0].name == "Some location"
assert event.locations[0].address.street == "Some address"
data = {"name": "Some event"}
form = self.EventForm(MultiDict(data))
form.validate()
form.populate_obj(event)
self.session.commit()
event = self.session.query(self.Event).first()
assert event.locations == []
class TestDeepFormRelationsOneToOneToMany(FormRelationsTestCase):
def create_models(self):
class Location(self.base):
__tablename__ = "location"
id = sa.Column(sa.Integer, autoincrement=True, primary_key=True)
name = sa.Column(sa.Unicode(255), nullable=True)
class Address(self.base):
__tablename__ = "address"
id = sa.Column(sa.Integer, autoincrement=True, primary_key=True)
street = sa.Column(sa.Unicode(255), nullable=True)
location_id = sa.Column(sa.Integer, sa.ForeignKey(Location.id))
location = sa.orm.relationship(Location, backref="addresses")
class Event(self.base):
__tablename__ = "event"
id = sa.Column(sa.Integer, primary_key=True)
name = sa.Column(sa.Unicode(255), nullable=False)
location_id = sa.Column(sa.Integer, sa.ForeignKey(Location.id))
location = sa.orm.relationship(Location)
self.Event = Event
self.Location = Location
self.Address = Address
def create_forms(self):
class AddressForm(ModelForm):
class Meta:
model = self.Address
class LocationForm(ModelForm):
class Meta:
model = self.Location
addresses = ModelFieldList(FormField(AddressForm))
class EventForm(ModelForm):
class Meta:
model = self.Event
location = ModelFormField(LocationForm)
self.LocationForm = LocationForm
self.EventForm = EventForm
self.AddressForm = AddressForm
def save(self):
data = {
"name": "Some event",
"location-name": "Some location",
"location-addresses-0-street": "Some address",
}
event = self.Event()
self.session.add(event)
form = self.EventForm(MultiDict(data))
form.validate()
form.populate_obj(event)
self.session.commit()
def test_assigment_and_deletion(self):
self.save()
event = self.session.query(self.Event).first()
assert event.location.name == "Some location"
assert event.location.addresses[0].street == "Some address"
data = {"name": "Some event"}
form = self.EventForm(MultiDict(data))
form.validate()
form.populate_obj(event)
self.session.commit()
event = self.session.query(self.Event).first()
assert event.location.addresses == []
|