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

View File

@ -5,6 +5,7 @@
# Licensed under GPL v3 or later # Licensed under GPL v3 or later
import freitagslib.network as net import freitagslib.network as net
from freitagslib.network import ITEM_ONLY, DEPOSIT_ONLY
class Command(object): class Command(object):
@ -23,17 +24,25 @@ class DepositCommand(Command):
return '%.2f Euro einzahlen' % self._difference return '%.2f Euro einzahlen' % self._difference
class BuyCommand(Command): class _ItemBasedCommand(Command):
def __init__(self, item): 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._difference = -item.price
self._to_go = False ## TODO session state, instead? self._to_go = False ## TODO session state, instead?
def run(self, user_name): 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): def label(self):
return self.item.name return self._item.name
def is_to_go(self): def is_to_go(self):
return self._to_go return self._to_go
@ -42,16 +51,16 @@ class BuyCommand(Command):
self._to_go = to_go self._to_go = to_go
def deposit(self): def deposit(self):
return self.item.deposit return self._item.deposit
class ToGoCommand(Command): class ToGoCommand(_ItemBasedCommand):
def __init__(self, buy_command): def __init__(self, item):
self.buy_command = buy_command super(ToGoCommand, self).__init__(item)
self._difference = -buy_command.item.deposit self._difference = -item.deposit
def run(self, *args, **kvargs): def run(self, user_name):
pass net.buy_item(self._item.id, what_about_it=DEPOSIT_ONLY, user_name=user_name)
def label(self): 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() _auth = base64.encodestring('%s:%s' % (os.environ['BARCODE_PLUGIN_USER'], os.environ['BARCODE_PLUGIN_PASS'])).rstrip()
_headers = {'Authorization':'Basic %s' % _auth} _headers = {'Authorization':'Basic %s' % _auth}
ITEM_ONLY, DEPOSIT_ONLY, ITEM_AND_DEPOSIT = range(3)
def _request(api_rel_url, para_map, method): def _request(api_rel_url, para_map, method):
url = _BASE_URL + api_rel_url url = _BASE_URL + api_rel_url
@ -51,12 +53,12 @@ def get_user_name_from_auth_blob(authblob):
return d['username'] 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) 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)), 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': if content != 'Created':
raise ValueError('Server says "%s"' % content) raise ValueError('Server says "%s"' % content)