saveの改造
次に編集時の変更をインデックスに反映させる。
phone.py
@restrict('POST') @validate(schema = NewPhoneForm(), form = 'edit') def save(self, id = None): if id is None: abort(404) ser = self.mc.get(id.encode('ascii')) if ser is None: abort(404) u = jsonpickle.Unpickler() phone = u.restore(ser) if not isinstance(phone, model.Phone): abort(404) query = meta.Session.query(model.Name) index = query.filter_by(phone_id = id).first() if index is None: abort(404) for k, v in self.form_result.items(): if getattr(phone, k) != v: setattr(phone, k, v) p = jsonpickle.Pickler() self.mc.set(phone.id, p.flatten(phone)) index.name = self.form_result['name'] meta.Session.commit() response.status_int = 302 response.headers['location'] = h.url_for(controller = 'phone', action = 'view', id = id) return "Moved temporarily"
test_phone.py
def setUp(self): import datetime phone = model.Phone('408-444-4444', 'Hogeyama Hogeo', '1400 Fashion Island', '650-666-6666', datetime.datetime(1960,1,1)) from jsonpickle import Pickler p = Pickler() ser = p.flatten(phone) mc = memcache.Client([config['app_conf']['memcachedb.servers']], debug = 0) mc.set(phone.id, ser) self._id = phone.id name = model.Name() name.phone_id = phone.id name.name = phone.name meta.Session.add(name) meta.Session.commit() def test_save(self): """Tests that valid data is saved to the database, that the response redirects to the view() action that a flash message is set in the session""" response = self.app.post( url = url_for(controller = 'phone', action = 'save', id = self._id), params = {'mobile_number': u'Updated', 'name': u'Updated', 'address': u'Updated', 'home_number': u'Updated', 'dob': u'2000/01/01'}, ) mc = memcache.Client([config['app_conf']['memcachedb.servers']], debug = 0) ser = mc.get(self._id) u = Unpickler() c = u.restore(ser) assert c.__class__.__name__ == 'Phone' assert c.mobile_number == u'Updated' assert c.name == u'Updated' assert c.address == u'Updated' assert c.home_number == u'Updated' assert c.dob == u'2000/01/01' assert urlparse(response.response.location).path == url_for( controller = 'phone', action = 'view', id = self._id) assert response.status_int == 302 query = meta.Session.query(Name) result = query.filter_by(phone_id = self._id).first() assert result.name == u'Updated'
→gitコミット先: http://github.com/masayang/pylons-mdb/commit/9428e65bc09034a7c24aea6de1d44a038b98f850