Beispiel #1
0
  def put(self, provider):
    """ Create auth details for a provider """
    backend = self.get_backend(provider)

    parser = reqparse.RequestParser()
    for f in backend.setupFields:
      parser.add_argument(f[0], type=f[1])

    args = parser.parse_args()

    try:
      key, details = backend().setup(**args)
    except AuthSetupMissingInfo:
      abort(400, message="Missing data for auth provider")

    ua = UserAuthentication()
    ua.user = g.user
    ua.provider = backend.provider
    ua.key = key
    ua.provider_details = details

    try:
      crud.add(ua)
    except IntegrityError:
      abort(400, message="Authentication provider and details already exist")

    return '', 201
Beispiel #2
0
  def post(self):
    """ Create new user """
    parser = reqparse.RequestParser()
    parser.add_argument('email', type=str)
    parser.add_argument('display_name', type=str)
    args = parser.parse_args()

    if args.email is None or not args.email:
      abort(400, message="An e-mail address must be provided")

    if args.display_name is None or not args.display_name:
      abort(400, message="An display name must be provided")

    user = User_model()
    user.email = args.email
    user.display_name = args.display_name

    try:
      crud.add(user)
    except IntegrityError:
      abort(400, message="User %s already exists" % args.email)

    data = dict()
    data['user'] = user
    data['token'] = generate_user_token(user)
    ret_fields = {
      'token': fields.String,
      'user': fields.Nested({
        'id': fields.Integer,
        'email': fields.String,
        'display_name': fields.String
      })
    }
    return marshal(data, ret_fields), 201
Beispiel #3
0
  def setUp(self):
    super(AuthTest, self).setUp()

    self.u = User()
    self.u.email = "*****@*****.**"
    self.u.display_name = "AuthTest"

    crud.add(self.u)
Beispiel #4
0
  def post(self, auction_id):
    """ Post a bid to an auction """
    auction = get_auction_by_id_or_abort(auction_id)

    if auction.creator == g.user:
      abort(400, message='Auction owners cannot bid on their own auctions')

    if auction.has_ended:
      abort(400, message='Auction has not started')

    if not auction.has_started:
      abort(404, message='Auction not found')

    parser = reqparse.RequestParser()
    parser.add_argument('price', type=Decimal, help="Bid must be of decimal type")
    args = parser.parse_args()

    if args.price is None or args.price <= 0:
      abort(400, message='Bid price must be positive')

    bid = Bid_model()
    bid.price = args.price
    bid.user = g.user
    bid.auction = auction

    fixed_bid, msg = auction.create_bid(bid)

    if fixed_bid is None:
      abort(400, message=msg)

    crud.add(fixed_bid)

    ret_fields = {
      'id': fields.Integer,
      'auction': fields.Nested({
        'id': fields.Integer,
        'tite': fields.String
      }),
      'bid_time': fields.DateTime,
      'price': fields.Fixed(decimals=2)
    }

    return marshal(fixed_bid, ret_fields), 200
Beispiel #5
0
  def test_pwd_auth(self):
    from penelophant.auth.backends.PasswordAuth import PasswordAuth
    p = PasswordAuth()
    password = '******'
    self.assertEqual(p.provider, 'password')
    ua = UserAuthentication()
    ua.user = self.u
    ua.provider = p.provider

    key, details = p.setup(password)
    self.assertIsNotNone(key)
    self.assertIsNotNone(details)

    ua.key = key
    ua.provider_details = details

    crud.add(ua)

    self.assertEqual(p.getUser(self.u.email, password), self.u)
Beispiel #6
0
def auction_completion():
  """ Check if auction is complete

  If it is, generate an invoice.
  """

  session = db.session
  # get all completed auctions
  auctions = session.query(Auction_model)\
   .filter(Auction_model.end_time < datetime.utcnow())

  for auction in auctions:
    inv = Invoice_model()
    inv.bid, inv.amount = auction.find_winner()
    inv.payer = inv.bid.user
    inv.payee = auction.creator

    # add the invoice if it does not exist
    if session.query(Invoice_model).filter(Invoice_model.bid_id == inv.bid_id).count() == 0:
      crud.add(inv)

  return
  def setUp(self):
    super(InvoiceTest, self).setUp()

    self.u = User()
    self.u.email = "*****@*****.**"
    self.u.display_name = "InvoiceTest"

    crud.add(self.u)

    user2 = User()
    user2.email = "*****@*****.**"
    user2.display_name = "InvoiceTest2"

    crud.add(user2)

    self.auction = Auction()
    self.auction.title = "InvoiceTest"
    self.auction.type = "doubleblind"
    self.auction.creator = user2

    crud.add(self.auction)

    self.bid = Bid()
    self.bid.price = 50
    self.bid.user = self.u
    self.bid.auction = self.auction

    crud.add(self.bid)

    self.invoice = Invoice()
    self.invoice.bid = self.bid
    self.invoice.payer = self.u
    self.invoice.payee = user2
    self.invoice.amount = self.bid.price

    crud.add(self.invoice)
Beispiel #8
0
  def run(self):
    """ Execute command """
    from faker import Factory
    from penelophant.fakers.products import Provider as ProductProvider

    self.f = Factory.create('en_US')
    self.f.add_provider(ProductProvider)

    n = 20 # number of users/auctions

    users = [] # list of users
    auctions = [] # list of auctions
    bids = [] # list of bids

    for i in range(n):
      user = User()
      profile = self.f.simple_profile()
      user.email = profile['mail']
      user.display_name = profile['username']
      crud.add(user)
      users.append(user)

    for i in range(n):
      start_price = randint(0, 150)
      auction = Auction()
      auction.title = self.f.product()
      auction.creator = users[randint(1, len(users))-1]
      auction.end_time = datetime.utcnow() + timedelta(minutes=randint(20, 14400))
      auction.start_price = start_price
      auction.reserve = start_price+randint(0, 50)
      auction.type = 'doubleblind'
      crud.add(auction)
      auctions.append(auction)

    for i in range(len(auctions)):
      last_price = auctions[i].start_price
      last_user = None
      for dummy in range(randint(0, 5)):
        user = users[randint(1, len(users))-1]
        while user == auctions[i] and user != last_user:
          user = users[randint(1, len(users))-1]

        last_user = user
        bid = Bid()
        bid.user = user
        bid.auction = auctions[i]
        bid.price = last_price+randint(1, 50)
        crud.add(bid)
        bids.append(bid)
Beispiel #9
0
  def post(self):
    """ Handle auction creation """
    parser = reqparse.RequestParser()
    parser.add_argument('title', type=str, required=True)
    parser.add_argument('description', type=str)
    parser.add_argument('type', type=str, required=True)
    parser.add_argument('start_time', type=int) # Must be a UNIX timestamp
    parser.add_argument('end_time', type=int, required=True) # Must be a UNIX timestamp
    parser.add_argument('reserve', type=Decimal)
    parser.add_argument('start_price', type=Decimal)

    args = parser.parse_args()

    print(args.title)

    start_time = datetime.utcnow()
    if args.start_time:
      start_time = datetime.utcfromtimestamp(args.start_time)
    end_time = datetime.utcfromtimestamp(args.end_time)

    if args.title is None:
      abort(400, message="You need a title for this auction!")

    if args.type is None:
      abort(400, message="You need a type for this auction!")

    if not end_time > start_time:
      abort(400, message="End time cannot before the start time")

    if not start_time >= datetime.utcnow()-timedelta(minutes=5):
      abort(400, message="Start time cannot be in the past")
    else:
      if start_time < datetime.utcnow():
        start_time = datetime.utcnow()

    if args.start_price is None:
      args.start_price = 0

    if args.reserve is None:
      args.reserve = 0

    if args.reserve < 0:
      abort(400, message="Reserve price must be positive")

    if args.start_price < 0:
      abort(400, message="Start price must be positive")

    if args.start_price > args.reserve:
      args.reserve = 0

    auction = find_auction_type(args.type)()
    auction.title = args.title
    auction.description = args.description
    auction.start_time = start_time
    auction.end_time = end_time
    auction.reserve = args.reserve
    auction.start_price = args.start_price
    auction.creator = g.user

    crud.add(auction)

    return marshal(auction, auction_fields), 201