client-barcode: Allow buying sole deposit of an item
This commit is contained in:
parent
92efe05fed
commit
f697486296
|
@ -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())
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue