Skip to content

Commit

Permalink
Redid refunds models to add link to transaction table, added serializ…
Browse files Browse the repository at this point in the history
…ers, added view folders, other small updates
  • Loading branch information
jkachel committed Jan 31, 2025
1 parent d790325 commit 350a810
Show file tree
Hide file tree
Showing 14 changed files with 526 additions and 0 deletions.
6 changes: 6 additions & 0 deletions payments/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -717,6 +717,12 @@ def save(self, *args, **kwargs):
self.reference_number = self._generate_reference_number()
super().save(*args, **kwargs)

@cached_property
def system(self):
"""Return the system associated with the order."""

return self.lines.first().product_version.system

# Flag to determine if the order is in review status - if it is, then
# we need to not step on the basket that may or may not exist when it is
# accepted
Expand Down
Empty file added refunds/__init__.py
Empty file.
33 changes: 33 additions & 0 deletions refunds/admin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
"""Admin for the refunds app."""

from django.contrib import admin

from refunds.models import Request, RequestRecipient


class RequestRecipientAdmin(admin.ModelAdmin):
"""Admin for RequestRecipient."""

list_display = ("email", "system")
search_fields = ("email", "system")
list_filter = ("system",)


class RequestAdmin(admin.ModelAdmin):
"""Admin for Request."""

list_display = ("requester_email", "order", "processed_date", "processed_by_email")

@admin.display(description="Requester")
def requester_email(self, obj):
"""Return the requester's email."""
return obj.requester.email

@admin.display(description="Processed by")
def processed_by_email(self, obj):
"""Return the processed by user's email."""
return obj.processed_by.email


admin.site.register(RequestRecipient, RequestRecipientAdmin)
admin.site.register(Request, RequestAdmin)
1 change: 1 addition & 0 deletions refunds/api.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
"""API functions for refunds."""
8 changes: 8 additions & 0 deletions refunds/apps.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
"""App config for refunds."""

from django.apps import AppConfig


class RefundsConfig(AppConfig):
default_auto_field = "django.db.models.BigAutoField"
name = "refunds"
256 changes: 256 additions & 0 deletions refunds/migrations/0001_add_initial_refunds_models.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,256 @@
# Generated by Django 4.2.17 on 2025-01-31 20:14

import uuid
from decimal import Decimal

import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models


class Migration(migrations.Migration):
initial = True

dependencies = [
("system_meta", "0009_product_details_url"),
("payments", "0014_alter_discount_payment_type"),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]

operations = [
migrations.CreateModel(
name="Request",
fields=[
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("created_on", models.DateTimeField(auto_now_add=True)),
("updated_on", models.DateTimeField(auto_now=True)),
("processed_date", models.DateTimeField(blank=True, null=True)),
(
"total_refunded",
models.DecimalField(
blank=True,
decimal_places=5,
default=Decimal("0"),
max_digits=20,
null=True,
),
),
(
"status",
models.CharField(
blank=True,
choices=[
("pending", "pending"),
("created", "created"),
("denied", "denied"),
("approved", "approved"),
("failed", "failed"),
],
default="created",
max_length=20,
),
),
(
"zendesk_ticket",
models.CharField(blank=True, default="", max_length=255),
),
(
"order",
models.ForeignKey(
on_delete=django.db.models.deletion.PROTECT,
related_name="refund_requests",
to="payments.order",
),
),
(
"processed_by",
models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.PROTECT,
related_name="processed_refund_requests",
to=settings.AUTH_USER_MODEL,
),
),
(
"requester",
models.ForeignKey(
on_delete=django.db.models.deletion.PROTECT,
related_name="refund_requests",
to=settings.AUTH_USER_MODEL,
),
),
],
options={
"abstract": False,
},
),
migrations.CreateModel(
name="RequestRecipient",
fields=[
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("created_on", models.DateTimeField(auto_now_add=True)),
("updated_on", models.DateTimeField(auto_now=True)),
(
"email",
models.EmailField(
help_text="The email address to send refund requests to.",
max_length=254,
unique=True,
),
),
(
"system",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
to="system_meta.integratedsystem",
),
),
],
options={
"abstract": False,
},
),
migrations.CreateModel(
name="RequestProcessingCode",
fields=[
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("created_on", models.DateTimeField(auto_now_add=True)),
("updated_on", models.DateTimeField(auto_now=True)),
(
"email",
models.EmailField(
help_text="The email address the code was sent to.",
max_length=254,
),
),
(
"code_batch",
models.UUIDField(
blank=True,
help_text="Batch ID, generated when the codes are generated.",
null=True,
),
),
("approve_code", models.UUIDField(default=uuid.uuid4, editable=False)),
("deny_code", models.UUIDField(default=uuid.uuid4, editable=False)),
("code_active", models.BooleanField(default=True)),
(
"code_used",
models.CharField(
blank=True,
choices=[("approve", "approve"), ("deny", "deny")],
default="",
max_length=20,
),
),
("code_used_on", models.DateTimeField(blank=True, null=True)),
(
"refund_request",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="process_code",
to="refunds.request",
),
),
],
options={
"abstract": False,
},
),
migrations.CreateModel(
name="RequestLine",
fields=[
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("created_on", models.DateTimeField(auto_now_add=True)),
("updated_on", models.DateTimeField(auto_now=True)),
(
"status",
models.CharField(
blank=True,
choices=[
("pending", "pending"),
("created", "created"),
("denied", "denied"),
("approved", "approved"),
("failed", "failed"),
],
default="created",
help_text="The status of this line item.",
max_length=20,
),
),
(
"refunded_amount",
models.DecimalField(
blank=True,
decimal_places=5,
default=Decimal("0"),
help_text="The amount refunded for this line item (may not be the full amount charged).",
max_digits=20,
null=True,
),
),
(
"line",
models.ForeignKey(
help_text="The individual line item to refund.",
on_delete=django.db.models.deletion.PROTECT,
related_name="+",
to="payments.line",
),
),
(
"refund_request",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="lines",
to="refunds.request",
),
),
(
"transactions",
models.ManyToManyField(
blank=True,
related_name="refund_request_lines",
to="payments.transaction",
),
),
],
options={
"abstract": False,
},
),
]
Empty file added refunds/migrations/__init__.py
Empty file.
Loading

0 comments on commit 350a810

Please sign in to comment.