client-barcode: Allow buying sole deposit of an item

This commit is contained in:
Sebastian Pipping 2011-10-10 21:58:35 +02:00
parent 92efe05fed
commit f697486296
3 changed files with 75 additions and 18 deletions

View File

@ -35,6 +35,7 @@ def clear():
os.system('clear')
TO_GO_ONLY = 2
TO_GO_ALL = 1
TO_GO_NONE = 0
TO_GO_PREV = -1
@ -46,6 +47,7 @@ CODES = {
'TO GO ALL':('to_go', TO_GO_ALL),
'TO GO NONE':('to_go', TO_GO_NONE),
'TO GO PREV':('to_go', TO_GO_PREV),
'TO GO ONLY':('to_go', TO_GO_ONLY),
'DEPOSIT 0.01':('deposit', Decimal('0.01')),
'DEPOSIT 0.05':('deposit', Decimal('0.05')),
@ -212,6 +214,9 @@ class Status:
return
if scope == TO_GO_ALL:
"""
Adds a ToGoCommands for each BuyCommands with deposit > 0 lacking a pair
"""
after = list()
dummy, initial_balance = self.transfers[0]
balance_before = initial_balance
@ -219,8 +224,10 @@ class Status:
def body(prev, command, balance_before):
if isinstance(prev, BuyCommand) \
and prev.deposit() > 0 \
and not isinstance(command, ToGoCommand):
to_go = ToGoCommand(prev)
and (not isinstance(command, ToGoCommand) \
or (isinstance(command, ToGoCommand) \
and prev.item() != command.item())):
to_go = ToGoCommand(prev.item())
prev.set_to_go(True)
after.append((to_go, balance_before))
balance_before += to_go.difference()
@ -238,6 +245,9 @@ class Status:
self.balance = balance_before
self.transfers = after
elif scope == TO_GO_NONE:
"""
Deletes all ToGoCommands
"""
after = list()
first_command, initial_balance = self.transfers[0]
balance_before = initial_balance
@ -254,14 +264,50 @@ class Status:
self.balance = balance_before
self.transfers = after
elif scope == TO_GO_PREV:
"""
Adds a ToGoCommand after previous BuyCommand
"""
prev, balance_backup = self.transfers[-1]
if not isinstance(prev, BuyCommand):
error_page(_PRODUCT_FIRST)
return
to_go = ToGoCommand(prev)
to_go = ToGoCommand(prev.item())
prev.set_to_go(True)
self.transfers.append((to_go, self.balance))
self.balance += to_go.difference()
elif scope == TO_GO_ONLY:
"""
Replace all BuyCommands with deposit > 0 by
a ToGoCommand. Resolve ToGoCommand duplicates.
"""
after = list()
first_command, initial_balance = self.transfers[0]
balance_before = initial_balance
for command, dummy in list(self.transfers):
if isinstance(command, ToGoCommand) \
and prev_item is not None \
and command.item() == prev_item:
"""
Skip this very duplicate
"""
prev_item = None
continue
elif isinstance(command, BuyCommand) \
and command.deposit() > 0:
"""
Replace by ToGoCommand
"""
item = command.item()
command = ToGoCommand(item)
prev_item = item
else:
prev_item = None
after.append((command, balance_before))
balance_before += command.difference()
self.balance = balance_before
self.transfers = after
def undo(self):
assert(self.logged_in())

View File

@ -5,6 +5,7 @@
# Licensed under GPL v3 or later
import freitagslib.network as net
from freitagslib.network import ITEM_ONLY, DEPOSIT_ONLY
class Command(object):
@ -23,17 +24,25 @@ class DepositCommand(Command):
return '%.2f Euro einzahlen' % self._difference
class BuyCommand(Command):
class _ItemBasedCommand(Command):
def __init__(self, item):
self.item = item
self._item = item
def item(self):
return self._item
class BuyCommand(_ItemBasedCommand):
def __init__(self, item):
super(BuyCommand, self).__init__(item)
self._difference = -item.price
self._to_go = False ## TODO session state, instead?
def run(self, user_name):
net.buy_item(self.item.id, self._to_go, user_name)
net.buy_item(self._item.id, what_about_it=ITEM_ONLY, user_name=user_name)
def label(self):
return self.item.name
return self._item.name
def is_to_go(self):
return self._to_go
@ -42,16 +51,16 @@ class BuyCommand(Command):
self._to_go = to_go
def deposit(self):
return self.item.deposit
return self._item.deposit
class ToGoCommand(Command):
def __init__(self, buy_command):
self.buy_command = buy_command
self._difference = -buy_command.item.deposit
class ToGoCommand(_ItemBasedCommand):
def __init__(self, item):
super(ToGoCommand, self).__init__(item)
self._difference = -item.deposit
def run(self, *args, **kvargs):
pass
def run(self, user_name):
net.buy_item(self._item.id, what_about_it=DEPOSIT_ONLY, user_name=user_name)
def label(self):
return '%s - Pfand' % self.buy_command.label()
return '%s - Pfand' % self._item.name

View File

@ -28,6 +28,8 @@ _BASE_URL = 'http://devcat.someserver.de:13805/api2/'
_auth = base64.encodestring('%s:%s' % (os.environ['BARCODE_PLUGIN_USER'], os.environ['BARCODE_PLUGIN_PASS'])).rstrip()
_headers = {'Authorization':'Basic %s' % _auth}
ITEM_ONLY, DEPOSIT_ONLY, ITEM_AND_DEPOSIT = range(3)
def _request(api_rel_url, para_map, method):
url = _BASE_URL + api_rel_url
@ -51,12 +53,12 @@ def get_user_name_from_auth_blob(authblob):
return d['username']
def buy_item(item_id, with_deposit, user_name):
def buy_item(item_id, what_about_it, user_name):
require_type(int, item_id)
assert(what_about_it in (ITEM_ONLY, DEPOSIT_ONLY, ITEM_AND_DEPOSIT))
deposit = 1 if with_deposit else 0
content = _request('buyable/item/' + urllib.quote(str(item_id)),
{'user':user_name, 'deposit':deposit, 'amount':1}, method='POST')
{'user':user_name, 'deposit':what_about_it, 'amount':1}, method='POST')
if content != 'Created':
raise ValueError('Server says "%s"' % content)