diff --git a/src/pretix/api/views/organizer.py b/src/pretix/api/views/organizer.py index f1d41959f2..fadee11b27 100644 --- a/src/pretix/api/views/organizer.py +++ b/src/pretix/api/views/organizer.py @@ -168,16 +168,19 @@ class GiftCardViewSet(viewsets.ModelViewSet): value = serializers.DecimalField(max_digits=10, decimal_places=2).to_internal_value( request.data.get('value') ) + text = serializers.CharField(allow_blank=True, allow_null=True).to_internal_value( + request.data.get('text', '') + ) if gc.value + value < Decimal('0.00'): return Response({ 'value': ['The gift card does not have sufficient credit for this operation.'] }, status=status.HTTP_409_CONFLICT) - gc.transactions.create(value=value) + gc.transactions.create(value=value, text=text) gc.log_action( 'pretix.giftcards.transaction.manual', user=self.request.user, auth=self.request.auth, - data={'value': value} + data={'value': value, 'text': text} ) return Response(GiftCardSerializer(gc).data, status=status.HTTP_200_OK) diff --git a/src/pretix/base/migrations/0146_giftcardtransaction_text.py b/src/pretix/base/migrations/0146_giftcardtransaction_text.py new file mode 100644 index 0000000000..04c92c7ce1 --- /dev/null +++ b/src/pretix/base/migrations/0146_giftcardtransaction_text.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.4 on 2020-03-02 11:28 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('pretixbase', '0145_auto_20200210_1038'), + ] + + operations = [ + migrations.AddField( + model_name='giftcardtransaction', + name='text', + field=models.TextField(null=True), + ), + ] diff --git a/src/pretix/base/models/giftcards.py b/src/pretix/base/models/giftcards.py index f92173f0ab..67181fa470 100644 --- a/src/pretix/base/models/giftcards.py +++ b/src/pretix/base/models/giftcards.py @@ -119,6 +119,7 @@ class GiftCardTransaction(models.Model): blank=True, on_delete=models.PROTECT ) + text = models.TextField(blank=True, null=True) class Meta: ordering = ("datetime",) diff --git a/src/pretix/control/templates/pretixcontrol/organizers/giftcard.html b/src/pretix/control/templates/pretixcontrol/organizers/giftcard.html index 89b7e561c6..b6b05d74f7 100644 --- a/src/pretix/control/templates/pretixcontrol/organizers/giftcard.html +++ b/src/pretix/control/templates/pretixcontrol/organizers/giftcard.html @@ -45,50 +45,53 @@ {% trans "Transactions" %} - - - - - - - - - - {% for t in card.transactions.all %} + + {% csrf_token %} +
{% trans "Date" %}{% trans "Order" %}{% trans "Value" %}
+ - - - + + + - {% endfor %} - - - - - - + {% for t in card.transactions.all %} + + + + + + {% endfor %} + + + + + + + - - -
{{ t.datetime|date:"SHORT_DATETIME_FORMAT" }} - {% if t.order %} - - {{ t.order.full_code }} - - {% else %} - {% trans "Manual transaction" %} - {% endif %} - - {{ t.value|money:card.currency }} - {% trans "Date" %}{% trans "Order" %}{% trans "Value" %}
- - {% csrf_token %} + +
{{ t.datetime|date:"SHORT_DATETIME_FORMAT" }} + {% if t.order %} + + {{ t.order.full_code }} + + {% else %} + {% trans "Manual transaction" %}{% if t.text %}: {{ t.text }}{% endif %} + {% endif %} + + {{ t.value|money:card.currency }} +
+ + - -
+ + + +
diff --git a/src/pretix/control/views/organizer.py b/src/pretix/control/views/organizer.py index 5667ad03a8..340eb63ecf 100644 --- a/src/pretix/control/views/organizer.py +++ b/src/pretix/control/views/organizer.py @@ -1010,12 +1010,14 @@ class GiftCardDetailView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMi messages.error(request, _('Gift cards are not allowed to have negative values.')) else: self.object.transactions.create( - value=value + value=value, + text=request.POST.get('text') or None, ) self.object.log_action( 'pretix.giftcards.transaction.manual', data={ - 'value': value + 'value': value, + 'text': request.POST.get('text') }, user=self.request.user, ) diff --git a/src/tests/api/test_giftcards.py b/src/tests/api/test_giftcards.py index acda447b9d..020c6ca476 100644 --- a/src/tests/api/test_giftcards.py +++ b/src/tests/api/test_giftcards.py @@ -149,6 +149,18 @@ def test_giftcard_transact(token_client, organizer, event, giftcard): assert resp.status_code == 200 giftcard.refresh_from_db() assert giftcard.value == Decimal('33.00') + resp = token_client.post( + '/api/v1/organizers/{}/giftcards/{}/transact/'.format(organizer.slug, giftcard.pk), + { + 'value': '10.00', + 'text': 'bla' + }, + format='json' + ) + assert resp.status_code == 200 + giftcard.refresh_from_db() + assert giftcard.value == Decimal('43.00') + assert giftcard.transactions.last().text == 'bla' @pytest.mark.django_db