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


目次に戻る