292 |
292 |
return response
|
293 |
293 |
|
294 |
294 |
|
295 |
|
class PayView(View):
|
|
295 |
class PayMixin(object):
|
296 |
296 |
@atomic
|
297 |
|
def post(self, request, *args, **kwargs):
|
298 |
|
regie_id = request.POST.get('regie')
|
299 |
|
next_url = request.POST.get('next_url') or '/'
|
300 |
|
|
301 |
|
user = request.user if request.user.is_authenticated() else None
|
302 |
|
|
303 |
|
remote_items = []
|
304 |
|
items = []
|
305 |
|
if regie_id and Regie.objects.get(pk=regie_id).is_remote():
|
306 |
|
regie = Regie.objects.get(pk=regie_id)
|
307 |
|
# get all items data from regie webservice
|
308 |
|
for item_id in request.POST.getlist('item'):
|
309 |
|
remote_items.append(regie.get_invoice(user, item_id))
|
|
297 |
def handle_payment(self, request, regie, items, remote_items, next_url='/', email=''):
|
|
298 |
if remote_items:
|
|
299 |
total_amount = sum([x.amount for x in remote_items])
|
310 |
300 |
else:
|
311 |
|
if user is None:
|
312 |
|
messages.error(request, _(u'Payment requires to be logged in.'))
|
313 |
|
return HttpResponseRedirect(next_url)
|
314 |
|
|
315 |
|
if not regie_id:
|
316 |
|
# take all items but check they're from the same regie
|
317 |
|
items = BasketItem.get_items_to_be_paid(user=user)
|
318 |
|
regie_id = items[0].regie_id
|
319 |
|
for item in items:
|
320 |
|
if item.regie_id != regie_id:
|
321 |
|
messages.error(request, _(u'Invalid grouping for basket items.'))
|
322 |
|
return HttpResponseRedirect(next_url)
|
323 |
|
|
324 |
|
regie = Regie.objects.get(id=regie_id)
|
|
301 |
total_amount = sum([x.amount for x in items])
|
325 |
302 |
|
326 |
|
regie.compute_extra_fees(user=user)
|
327 |
|
items = BasketItem.get_items_to_be_paid(user=user).filter(regie=regie)
|
|
303 |
if total_amount < regie.payment_min_amount:
|
|
304 |
messages.warning(request, _(u'Minimal payment amount is %s €.') % regie.payment_min_amount)
|
|
305 |
return HttpResponseRedirect(next_url)
|
328 |
306 |
|
|
307 |
for item in items:
|
|
308 |
if item.regie != regie:
|
|
309 |
messages.error(request, _(u'Invalid grouping for basket items.'))
|
|
310 |
return HttpResponseRedirect(next_url)
|
|
311 |
user = request.user if request.user.is_authenticated() else None
|
329 |
312 |
transaction = Transaction()
|
330 |
313 |
if user:
|
331 |
314 |
transaction.user = user
|
... | ... | |
334 |
317 |
lastname = user.last_name
|
335 |
318 |
else:
|
336 |
319 |
transaction.user = None
|
337 |
|
if not request.POST.get('email'):
|
338 |
|
messages.warning(request, _(u'You must give an email address.'))
|
339 |
|
return HttpResponseRedirect(request.POST.get('item_url'))
|
340 |
|
email = request.POST.get('email')
|
341 |
320 |
firstname = ''
|
342 |
321 |
lastname = ''
|
343 |
322 |
|
... | ... | |
346 |
325 |
transaction.items = items
|
347 |
326 |
transaction.remote_items = ','.join([x.id for x in remote_items])
|
348 |
327 |
transaction.status = 0
|
349 |
|
|
350 |
|
if remote_items:
|
351 |
|
total_amount = sum([x.amount for x in remote_items])
|
352 |
|
else:
|
353 |
|
total_amount = sum([x.amount for x in items])
|
354 |
328 |
transaction.amount = total_amount
|
355 |
|
transaction.save()
|
356 |
|
|
357 |
|
if total_amount < regie.payment_min_amount:
|
358 |
|
messages.warning(request, _(u'Minimal payment amount is %s €.') % regie.payment_min_amount)
|
359 |
|
return HttpResponseRedirect(next_url)
|
360 |
329 |
|
361 |
330 |
payment = get_eopayment_object(request, regie)
|
362 |
331 |
|
... | ... | |
368 |
337 |
'eopayment_order_id': smart_text(order_id), 'eopayment_data': repr(data)})
|
369 |
338 |
transaction.order_id = order_id
|
370 |
339 |
transaction.save()
|
371 |
|
if next_url:
|
372 |
|
# store the next url in session in order to be able to redirect to
|
373 |
|
# it if payment is canceled
|
374 |
|
request.session.setdefault('lingo_next_url',
|
375 |
|
{})[transaction.order_id] = request.build_absolute_uri(next_url)
|
376 |
|
request.session.modified = True
|
377 |
340 |
|
378 |
|
# XXX: mark basket items as being processed (?)
|
|
341 |
# store the next url in session in order to be able to redirect to
|
|
342 |
# it if payment is canceled
|
|
343 |
request.session.setdefault('lingo_next_url',
|
|
344 |
{})[order_id] = request.build_absolute_uri(next_url)
|
|
345 |
request.session.modified = True
|
379 |
346 |
|
380 |
347 |
if kind == eopayment.URL:
|
381 |
348 |
return HttpResponseRedirect(data)
|
... | ... | |
385 |
352 |
raise NotImplementedError()
|
386 |
353 |
|
387 |
354 |
|
|
355 |
class PayView(PayMixin, View):
|
|
356 |
def post(self, request, *args, **kwargs):
|
|
357 |
regie_id = request.POST.get('regie')
|
|
358 |
next_url = request.POST.get('next_url') or '/'
|
|
359 |
user = request.user if request.user.is_authenticated() else None
|
|
360 |
remote_items = []
|
|
361 |
items = []
|
|
362 |
if regie_id and Regie.objects.get(pk=regie_id).is_remote():
|
|
363 |
regie = Regie.objects.get(pk=regie_id)
|
|
364 |
# get all items data from regie webservice
|
|
365 |
for item_id in request.POST.getlist('item'):
|
|
366 |
remote_items.append(regie.get_invoice(user, item_id))
|
|
367 |
else:
|
|
368 |
if user is None:
|
|
369 |
messages.error(request, _(u'Payment requires to be logged in.'))
|
|
370 |
return HttpResponseRedirect(next_url)
|
|
371 |
|
|
372 |
if not regie_id:
|
|
373 |
# take all items but check they're from the same regie
|
|
374 |
items = BasketItem.get_items_to_be_paid(user=user)
|
|
375 |
regie_id = items[0].regie_id
|
|
376 |
for item in items:
|
|
377 |
if item.regie_id != regie_id:
|
|
378 |
messages.error(request, _(u'Invalid grouping for basket items.'))
|
|
379 |
return HttpResponseRedirect(next_url)
|
|
380 |
|
|
381 |
regie = Regie.objects.get(id=regie_id)
|
|
382 |
regie.compute_extra_fees(user=user)
|
|
383 |
items = BasketItem.get_items_to_be_paid(user=user).filter(regie=regie)
|
|
384 |
|
|
385 |
if not user and not request.POST.get('email'):
|
|
386 |
messages.warning(request, _(u'You must give an email address.'))
|
|
387 |
return HttpResponseRedirect(request.POST.get('item_url'))
|
|
388 |
email = request.POST.get('email')
|
|
389 |
|
|
390 |
# XXX: mark basket items as being processed (?)
|
|
391 |
return self.handle_payment(request, regie, items, remote_items, next_url, email)
|
|
392 |
|
|
393 |
|
388 |
394 |
class PaymentException(Exception):
|
389 |
395 |
pass
|
390 |
396 |
|
391 |
|
-
|