Advertisement
Guest User

Untitled

a guest
May 1st, 2009
457
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.30 KB | None | 0 0
  1. # -*- coding: utf-8 -*-
  2. from google.appengine.ext import db, webapp
  3. from google.appengine.api import users
  4. from google.appengine.ext.webapp.util import run_wsgi_app
  5. import logging
  6.  
  7. STATE_START = 0
  8. STATE_HALF = 1
  9. STATE_FINISHED = 2
  10.  
  11. class User(db.Model):
  12.   name = db.StringProperty(required=True)
  13.   sum = db.IntegerProperty(required=True,default=1000)
  14.   def start_trans(self, trans):
  15.     def txn():
  16.       self.sum = self.sum - trans.amount
  17.       self.put()
  18.       log = TransactionLog(parent=self, transaction=trans, amount=trans.amount)
  19.       log.put()
  20.     log = TransactionLog.all().filter('transaction =', trans
  21.                                       ).ancestor(self).get()
  22.     if log is None:
  23.       db.run_in_transaction(txn)
  24.     trans.state = STATE_HALF
  25.     trans.put()
  26.  
  27.   def accept_trans(self, trans):
  28.     def txn():
  29.       self.sum = self.sum + trans.amount
  30.       self.put()
  31.       log = TransactionLog(parent=self, transaction=trans, amount=trans.amount*-1)
  32.       log.put()
  33.     log = TransactionLog.all().filter('transaction =', trans
  34.                                       ).ancestor(self).get()
  35.     if log is None:
  36.       db.run_in_transaction(txn)
  37.     trans.state = STATE_FINISHED
  38.     trans.put()
  39.  
  40.   def delete_log(self, trans):
  41.     log = TransactionLog.all().filter('transaction =', trans
  42.                                       ).ancestor(self).get()
  43.     log.delete()
  44.  
  45. class Transaction(db.Model):
  46.   t_from = db.ReferenceProperty(User,collection_name="from_set")
  47.   t_to = db.ReferenceProperty(User,collection_name="to_set")
  48.   amount = db.IntegerProperty(required=True)
  49.   state = db.IntegerProperty(required=True,default=STATE_START)
  50.  
  51.   def do_job(self):
  52.     if self.state == STATE_START:
  53.       logging.debug('start_trans called.')
  54.       self.t_from.start_trans(self)
  55.       return self.do_job()
  56.     elif self.state == STATE_HALF:
  57.       logging.debug('accept_trans called.')
  58.       self.t_to.accept_trans(self)
  59.       return self.do_job()
  60.     elif self.state == STATE_FINISHED:
  61.       log = TransactionLog.all().filter(
  62.         'transaction =', self).ancestor(self.t_from).get()
  63.       if log is not None:
  64.         self.t_from.delete_log(self)
  65.         return self.do_job()
  66.       log = TransactionLog.all().filter(
  67.         'transaction =', self).ancestor(self.t_to).get()
  68.       if log is not None:
  69.         self.t_to.delete_log(self)
  70.         return self.do_job()
  71.       self.delete()
  72.       return True
  73.     else:
  74.       raise RuntimeError('It should never occur.')
  75.  
  76. class TransactionLog(db.Model):
  77.   transaction = db.ReferenceProperty(Transaction)
  78.   amount = db.IntegerProperty(required=True)
  79.  
  80.  
  81. def init_data():
  82.   users = User.all().fetch(100)
  83.   db.delete(users)
  84.   trans = Transaction.all().fetch(100)
  85.   db.delete(trans)
  86.   logs = TransactionLog.all().fetch(100)
  87.   db.delete(logs)
  88.   usera = User(name="A", sum=2000)
  89.   userb = User(name="B", sum=3000)
  90.   usera.put()
  91.   userb.put()
  92.  
  93. class MainHandler(webapp.RequestHandler):
  94.  
  95.   def get(self):
  96.     if self.request.get("init"):
  97.       init_data()
  98.  
  99.     self.response.headers['Content-Type'] = 'text/html; charset=utf-8'
  100.     self.response.out.write("<html><body>")
  101.     self.response.out.write("<a href='/?init=1'>Initialize data</a><br/>")
  102.     self.response.out.write("<table border='1'><tr>\n")
  103.     self.response.out.write("<th>Name</th><th>Sum</th>")
  104.     self.response.out.write("</tr>\n")
  105.  
  106.     query = User.all()
  107.     users = query.fetch(4)
  108.     for user in users:
  109.       self.response.out.write("<tr><td>%s</td>" % user.name)
  110.       self.response.out.write("<td>%s</td>" % user.sum)
  111.       self.response.out.write("</tr>")
  112.     self.response.out.write("</table>")
  113.  
  114.     self.response.out.write("<form method='POST'>")
  115.     self.response.out.write("<input type='submit' value='send 100 from A to B.'></form>")
  116.     self.response.out.write("</body></html>")
  117.  
  118.   def post(self):
  119.     user_a = User.all().filter('name =', 'A').get()
  120.     user_b = User.all().filter('name =', 'B').get()
  121.     txn = Transaction(t_from=user_a, t_to=user_b, amount=100)
  122.     txn.put()
  123.     txn.do_job()
  124.     self.redirect("/")
  125.      
  126. application = webapp.WSGIApplication([('/', MainHandler)],
  127.                                        debug=True)
  128.  
  129. def main():
  130.   logging.getLogger().setLevel(logging.DEBUG)
  131.   run_wsgi_app(application)
  132.  
  133. if __name__ == "__main__":
  134.   main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement